diff --git a/cfg/CNFGGLOB.h b/cfg/CNFGGLOB.h index 6dc3cc4..29694b1 100644 --- a/cfg/CNFGGLOB.h +++ b/cfg/CNFGGLOB.h @@ -34,7 +34,7 @@ #define EnableMouseMotion 0 -#define IncludeHostTextClipExchange 1 +#define IncludeHostTextClipExchange 0 #define EmLocalTalk 0 #define AutoLocation 1 #define AutoTimeZone 1 diff --git a/cfg/EMCONFIG.h b/cfg/EMCONFIG.h index 744ccdc..0a85218 100644 --- a/cfg/EMCONFIG.h +++ b/cfg/EMCONFIG.h @@ -43,7 +43,8 @@ #define MaxATTListN 32 #define IncludeExtnPbufs 1 -#define IncludeExtnHostTextClipExchange 1 +// temporary +#define IncludeExtnHostTextClipExchange 0 #define Sony_SupportDC42 1 #define Sony_SupportTags 0 diff --git a/meson.build b/meson.build index c5f5d37..afca2e3 100644 --- a/meson.build +++ b/meson.build @@ -120,6 +120,8 @@ MAC_SRC = { 'Plus': MAC_SRC_COMMON + HW_SRC['SCREEN'] + + HW_SRC['SCC'] + + HW_SRC['SCSI'] + HW_SRC['MOUSE'] + HW_SRC['KBRD'], 'II': @@ -144,7 +146,17 @@ UI_SRC = { 'SDL2': [ 'src/UI/COMOSGLU.c', 'src/UI/CONTROLM.c', - 'src/UI/SDL2/OSGLUSD2.c' + 'src/UI/SDL2/OSGLUSD2.c', + #'src/UI/SDL2/CLIPBRD.c', + 'src/UI/SDL2/DBGLOG.c', + 'src/UI/SDL2/DRIVES.c', + 'src/UI/SDL2/INTL.c', + 'src/UI/SDL2/KEYBOARD.c', + 'src/UI/SDL2/MOUSE.c', + 'src/UI/SDL2/ROM.c', + 'src/UI/SDL2/SOUND.c', + 'src/UI/SDL2/TIMEDATE.c', + 'src/UI/SDL2/VIDEO.c', ] } @@ -153,31 +165,12 @@ EMU_SRC = [ 'src/GLOBGLUE.c', 'src/PATCHES/ROMEMDEV.c', 'src/UTIL/DATE2SEC.c', - 'src/incbin/incbin.c', + 'src/LANG/INTLCHAR.c', ] EMU_INC = include_directories([ 'cfg/', 'src/', - 'src/HW/ADB', - 'src/HW/DISK', - 'src/HW/KBRD', - 'src/HW/M68K', - 'src/HW/MOUSE', - 'src/HW/POWERMAN', - 'src/HW/RTC', - 'src/HW/SCC', - 'src/HW/SCREEN', - 'src/HW/SCSI', - 'src/HW/SOUND', - 'src/HW/VIA', - 'src/HW/VIDCARD', - 'src/LANG', - 'src/UI', - 'src/UI/SDL2', -# 'src/UI/WIN32', - 'src/UTIL', - 'src/incbin', ]) ## Final compiled program definition diff --git a/src/LANG/INTLCHAR.c b/src/LANG/INTLCHAR.c new file mode 100644 index 0000000..ac513d4 --- /dev/null +++ b/src/LANG/INTLCHAR.c @@ -0,0 +1,1881 @@ +/* + LANG/INTLCHAR.h + + Copyright (C) 2010 Paul C. Pratt + + You can redistribute this file and/or modify it under the terms + of version 2 of the GNU General Public License as published by + the Free Software Foundation. You should have received a copy + of the license along with this file; see the file COPYING. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + license for more details. +*/ + +/* + InterNaTionAL CHARacters +*/ + +/* TODO: Move this to a PCF, BDF, or FON bitmap font format */ + +/* master copy of private font data */ +/* + Data in commments: + Mini vMac Cell name + Mac Roman (Octal) + windows-1252 code page + Unicode + plain ascii + ClStrAppendSubstCStr encoding + HTML character entity +*/ +#include "UI/COMOSGLU.h" +#include "UI/MYOSGLUE.h" +#include "UI/CONTROLM.h" +#include "LANG/INTLCHAR.h" +#include "STRCONST.h" + +const uint8_t CellData[] = { + /* kCellUpA 101 0x41 0x0041 'A' 'A' A */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpB 102 0x42 0x0042 'B' 'B' B */ + 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpC 103 0x43 0x0043 'C' 'C' C */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpD 104 0x44 0x0044 'D' 'D' D */ + 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpE 105 0x45 0x0045 'E' 'E' E */ + 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpF 106 0x46 0x0046 'F' 'F' F */ + 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + /* kCellUpG 107 0x47 0x0047 'G' 'G' G */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x4E, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpH 110 0x48 0x0048 'H' 'H' H */ + 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x7E, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpI 111 0x49 0x0049 'I' 'I' I */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellUpJ 112 0x4A 0x004A 'J' 'J' J */ + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpK 113 0x4B 0x004B 'K' 'K' K */ + 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, 0x60, + 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpL 114 0x4C 0x004C 'L' 'L' L */ + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpM 115 0x4D 0x004D 'M' 'M' M */ + 0x00, 0x00, 0x00, 0x82, 0xC6, 0xAA, 0x92, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00, + /* kCellUpN 116 0x4E 0x004E 'N' 'N' N */ + 0x00, 0x00, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4A, + 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpO 117 0x4F 0x004F 'O' 'O' O */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpP 120 0x50 0x0050 'P' 'P' P */ + 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + /* kCellUpQ 121 0x51 0x0051 'Q' 'Q' Q */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x10, 0x0C, 0x00, 0x00, + /* kCellUpR 122 0x52 0x0052 'R' 'R' R */ + 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpS 123 0x53 0x0053 'S' 'S' S */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x3C, + 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpT 124 0x54 0x0054 'T' 'T' T */ + 0x00, 0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellUpU 125 0x55 0x0055 'U' 'U' U */ + 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpV 126 0x56 0x0056 'V' 'V' V */ + 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x44, + 0x48, 0x50, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, + /* kCellUpW 127 0x57 0x0057 'W' 'W' W */ + 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x5A, 0x66, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpX 130 0x58 0x0058 'X' 'X' X */ + 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x18, + 0x24, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpY 131 0x59 0x0059 'Y' 'Y' Y */ + 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellUpZ 132 0x5A 0x005A 'Z' 'Z' Z */ + 0x00, 0x00, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellLoA 141 0x61 0x0061 'a' 'a' a */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoB 142 0x62 0x0062 'b' 'b' b */ + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoC 143 0x63 0x0063 'c' 'c' c */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, + 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoD 144 0x64 0x0064 'd' 'd' d */ + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x3E, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00, + /* kCellLoE 145 0x65 0x0065 'e' 'e' e */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoF 146 0x66 0x0066 'f' 'f' f */ + 0x00, 0x00, 0x00, 0x0E, 0x10, 0x10, 0x3C, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellLoG 147 0x67 0x0067 'g' 'g' g */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, + /* kCellLoH 150 0x68 0x0068 'h' 'h' h */ + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellLoI 151 0x69 0x0069 'i' 'i' i */ + 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellLoJ 152 0x6A 0x006A 'j' 'j' j */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, + /* kCellLoK 153 0x6B 0x006B 'k' 'k' k */ + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x44, 0x48, + 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellLoL 154 0x6C 0x006C 'l' 'l' l */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellLoM 155 0x6D 0x006D 'm' 'm' m */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, + /* kCellLoN 156 0x6E 0x006E 'n' 'n' n */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellLoO 157 0x6F 0x006F 'o' 'o' o */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoP 160 0x70 0x0070 'p' 'p' p */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x00, 0x00, + /* kCellLoQ 161 0x71 0x0071 'q' 'q' q */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x00, 0x00, + /* kCellLoR 162 0x72 0x0072 'r' 'r' r */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x62, + 0x42, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + /* kCellLoS 163 0x73 0x0073 's' 's' s */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, + 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoT 164 0x74 0x0074 't' 't' t */ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x78, 0x20, + 0x20, 0x20, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoU 165 0x75 0x0075 'u' 'u' u */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoV 166 0x76 0x0076 'v' 'v' v */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, + 0x48, 0x50, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, + /* kCellLoW 167 0x77 0x0077 'w' 'w' w */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoX 170 0x78 0x0078 'x' 'x' x */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x24, + 0x18, 0x18, 0x24, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellLoY 171 0x79 0x0079 'y' 'y' y */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, + /* kCellLoZ 172 0x7A 0x007A 'z' 'z' z */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x04, + 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit0 060 0x30 0x0030 '0' '0' 0 */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit1 061 0x31 0x0031 '1' '1' 1 */ + 0x00, 0x00, 0x00, 0x08, 0x18, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit2 062 0x32 0x0032 '2' '2' 2 */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit3 063 0x33 0x0033 '3' '3' 3 */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x0C, 0x02, + 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit4 064 0x34 0x0034 '4' '4' 4 */ + 0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x7E, + 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit5 065 0x35 0x0035 '5' '5' 5 */ + 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x7C, 0x02, + 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit6 066 0x36 0x0036 '6' '6' 6 */ + 0x00, 0x00, 0x00, 0x1C, 0x20, 0x40, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit7 067 0x37 0x0037 '7' '7' 7 */ + 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit8 070 0x38 0x0038 '8' '8' 8 */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellDigit9 071 0x39 0x0039 '9' '9' 9 */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x3E, 0x02, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, + /* kCellExclamation 041 0x21 0x0021 '!' '!' ! */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellAmpersand 046 0x26 0x0026 '&' '&' amp */ + 0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x50, 0x20, + 0x50, 0x4A, 0x44, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellApostrophe 047 0x27 0x0027 '\047' ';la' #39 (apos) */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellLeftParen 050 0x28 0x0028 '(' '(' ( */ + 0x00, 0x00, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, + /* kCellRightParen 051 0x29 0x0029 ')' ')' ) */ + 0x00, 0x00, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, + /* kCellComma 054 0x2C 0x002C ',' ',' , */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x08, 0x10, 0x00, 0x00, + /* kCellHyphen 055 0x2D 0x002D '-' '-' - */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellPeriod 056 0x2E 0x002E '.' '.' . */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellSlash 057 0x2F 0x002F '/' '/' / */ + 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x10, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, + /* kCellColon 072 0x3A 0x003A ':' ':' : */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellSemicolon 073 0x3B 0x003B ';' ';ls' #59 (semi) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x00, 0x00, 0x08, 0x08, 0x08, 0x10, 0x00, 0x00, + /* kCellQuestion 077 0x3F 0x003F '?' '?' ? */ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x04, 0x08, 0x10, + 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellEllipsis 311 0x85 0x2026 '_' ';ll' #8230 (mldr) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, + /* kCellUnderscore 137 0x5F 0x005F '_' '_' _ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + /* kCellLeftDQuote 322 0x93 0x201C '"' ';[' ldquo */ + 0x00, 0x00, 0x00, 0x24, 0x48, 0x6C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellRightDQuote 323 0x94 0x201D '"' ';{' rdquo */ + 0x00, 0x00, 0x00, 0x36, 0x12, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellLeftSQuote 324 0x91 0x2018 '\047' ';]' lsquo */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellRightSQuote 325 0x92 0x2019 '\047' ';}' rsquo */ + 0x00, 0x00, 0x00, 0x18, 0x08, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellCopyright 251 0xA9 0x00A9 'c' ';g' copy */ + 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x9A, 0xA2, + 0xA2, 0x9A, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, + /* kCellSpace 040 0x20 0x0020 '\040' '' #32 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + +#if NeedIntlChars + /* kCellUpADiaeresis 200 0xC4 0x00C4 'A' ';uA' Auml */ + 0x00, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpARing 201 0xC5 0x00C5 'A' ';A' Aring */ + 0x3C, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x42, 0x7E, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpCCedilla 202 0xC7 0x00C7 'C' ';C' Ccedil */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x40, 0x42, 0x3C, 0x08, 0x08, 0x10, 0x00, + /* kCellUpEAcute 203 0xC9 0x00C9 'E' ';eE' Eacute */ + 0x08, 0x10, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpNTilde 204 0xD1 0x00D1 'N' ';nN' Ntilde */ + 0x32, 0x4C, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4A, + 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpODiaeresis 205 0xD6 0x00D6 'O' ';uO' Ouml */ + 0x00, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpUDiaeresis 206 0xDC 0x00DC 'U' ';uU' Uuml */ + 0x00, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoAAcute 207 0xE1 0x00E1 'a' ';ea' aacute */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoAGrave 210 0xE0 0x00E0 'a' ';`a' agrave */ + 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoACircumflex 211 0xE2 0x00E2 'a' ';ia' acirc */ + 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoADiaeresis 212 0xE4 0x00E4 'a' ';ua' auml */ + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoATilde 213 0xE3 0x00E3 'a' ';na' atilde */ + 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoARing 214 0xE5 0x00E5 'a' ';a' aring */ + 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoCCedilla 215 0xE7 0x00E7 'c' ';c' ccedil */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, + 0x40, 0x40, 0x42, 0x3C, 0x08, 0x08, 0x10, 0x00, + /* kCellLoEAcute 216 0xE9 0x00E9 'e' ';ee' eacute */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoEGrave 217 0xE8 0x00E8 'e' ';`e' egrave */ + 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoECircumflex 220 0xEA 0x00EA 'e' ';ie' ecirc */ + 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoEDiaeresis 221 0xEB 0x00EB 'e' ';ue' euml */ + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoIAcute 222 0xED 0x00ED 'i' ';ei' iacute */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellLoIGrave 223 0xEC 0x00EC 'i' ';`i' igrave */ + 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellLoICircumflex 224 0xEE 0x00EE 'i' ';ii' icirc */ + 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellLoIDiaeresis 225 0xEF 0x00EF 'i' ';ui' iuml */ + 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + /* kCellLoNTilde 226 0xF1 0x00F1 'n' ';nn' ntilde */ + 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellLoOAcute 227 0xF3 0x00F3 'o' ';eo' oacute */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoOGrave 230 0xF2 0x00F2 'o' ';`o' ograve */ + 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoOCircumflex 231 0xF4 0x00F4 'o' ';io' ocirc */ + 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoODiaeresis 232 0xF6 0x00F6 'o' ';uo' ouml */ + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoOTilde 233 0xF5 0x00F5 'o' ';no' otilde */ + 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x3C, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoUAcute 234 0xFA 0x00FA 'u' ';eu' uacute */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoUGrave 235 0xF9 0x00F9 'u' ';`u' ugrave */ + 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoUCircumflex 236 0xFB 0x00FB 'u' ';iu' ucirc */ + 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoUDiaeresis 237 0xFC 0x00FC 'u' ';uu' uuml */ + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + + /* kCellUpAE 256 0xC6 0x00C6 '?' ';lE' AElig */ + 0x00, 0x00, 0x00, 0x3E, 0x48, 0x48, 0x48, 0x7C, + 0x48, 0x48, 0x48, 0x4E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpOStroke 257 0xD8 0x00D8 'O' ';O' Oslash */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x46, 0x5A, + 0x62, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + + /* kCellLoAE 276 0xE6 0x00E6 '?' ';le' aelig */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x52, + 0x5E, 0x50, 0x52, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoOStroke 277 0xF8 0x00F8 'o' ';o' oslash */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x46, + 0x5A, 0x62, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellInvQuestion 300 0xBF 0x00BF '?' ';?' iquest */ + 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, + 0x20, 0x40, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, + /* kCellInvExclam 301 0xA1 0x00A1 '!' ';1' iexcl */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + + /* kCellUpAGrave 313 0xC0 0x00C0 'A' ';`A' Agrave */ + 0x10, 0x08, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpATilde 314 0xC3 0x00C3 'A' ';nA' Atilde */ + 0x32, 0x4C, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpOTilde 315 0xD5 0x00D5 'O' ';nO' Otilde */ + 0x32, 0x4C, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpLigatureOE 316 0x8C 0x0152 '?' ';Q' OElig */ + 0x00, 0x00, 0x00, 0x3E, 0x48, 0x48, 0x48, 0x4E, + 0x48, 0x48, 0x48, 0x3E, 0x00, 0x00, 0x00, 0x00, + /* kCellLoLigatureOE 317 0x9C 0x0153 '?' ';q' oelig */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x52, + 0x5E, 0x50, 0x52, 0x2C, 0x00, 0x00, 0x00, 0x00, + + /* kCellLoYDiaeresis 330 0xFF 0x00FF 'y' ';uy' yuml */ + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, + /* kCellUpYDiaeresis 331 0x9F 0x0178 'Y' ';uY' Yuml */ + 0x00, 0x14, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + + /* kCellUpACircumflex 345 0xC2 0x00C2 'A' ';iA' Acirc */ + 0x18, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpECircumflex 346 0xCA 0x00CA 'E' ';iE' Ecirc */ + 0x18, 0x24, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpAAcute 347 0xC1 0x00C1 'A' ';eA' Aacute */ + 0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpEDiaeresis 350 0xCB 0x00CB 'E' ';uE' Euml */ + 0x00, 0x24, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpEGrave 351 0xC8 0x00C8 'E' ';`E' Egrave */ + 0x10, 0x08, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpIAcute 352 0xCD 0x00CD 'A' ';eI' Iacute */ + 0x04, 0x08, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpICircumflex 353 0xCE 0x00CE 'I' ';iI' Icirc */ + 0x08, 0x14, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpIDiaeresis 354 0xCF 0x00CF 'I' ';uI' Iuml */ + 0x00, 0x14, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpIGrave 355 0xCC 0x00CC 'I' ';`I' Igrave */ + 0x10, 0x08, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpOAcute 356 0xD3 0x00D3 'O' ';eO' Oacute */ + 0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpOCircumflex 357 0xD4 0x00D4 'O' ';iO' Ocirc */ + 0x18, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + + /* kCellUpOGrave 361 0xD2 0x00D2 'O' ';`O' Ograve */ + 0x10, 0x08, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpUAcute 362 0xDA 0x00DA 'U' ';eU' Uacute */ + 0x08, 0x10, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpUCircumflex 363 0xDB 0x00DB 'U' ';iU' Ucirc */ + 0x18, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpUGrave 364 0xD9 0x00D9 'U' ';`U' Ugrave */ + 0x10, 0x08, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellSharpS 247 0xDF 0x00DF 'B' ';s' szlig */ + 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x44, 0x44, + 0x42, 0x42, 0x42, 0x5C, 0x40, 0x00, 0x00, 0x00, + + /* kCellUpACedille 260 ? 0x0104 'A' ';dA' #260 (Aogon) */ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, + 0x42, 0x42, 0x42, 0x42, 0x04, 0x04, 0x02, 0x00, + /* kCellLoACedille 261 ? 0x0105 'a' ';da' #261 (aogon) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x04, 0x04, 0x02, 0x00, + /* kCellUpCAcute 262 ? 0x0106 'C' ';eC' #262 (Cacute) */ + 0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoCAcute 263 ? 0x0107 'c' ';ec' #263 (cacute) */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, + 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpECedille 264 ? 0x0118 'E' ';dE' #280 (Eogon) */ + 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, + 0x40, 0x40, 0x40, 0x7E, 0x04, 0x04, 0x02, 0x00, + /* kCellLoECedille 265 ? 0x0119 'e' ';de' #281 (eogon) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x08, 0x08, 0x04, 0x00, + /* kCellUpLBar 266 ? 0x0141 'L' ';dL' #321 (Lstrok) */ + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x60, 0x40, + 0xC0, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellLoLBar 267 ? 0x0142 'l' ';dl' #322 (lstrok) */ + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x0C, 0x08, + 0x18, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellUpNAcute 270 ? 0x0143 'N' ';eN' #323 (Nacute) */ + 0x08, 0x10, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4A, + 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellLoNAcute 271 ? 0x0144 'n' ';en' #324 (nacute) */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7C, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + /* kCellUpSAcute 272 ? 0x015A 'S' ';eS' #346 (Sacute) */ + 0x08, 0x10, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x3C, + 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoSAcute 273 ? 0x015B 's' ';es' #347 (sacute) */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, + 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellUpZAcute 274 ? 0x0179 'Z' ';eZ' #377 (Zacute) */ + 0x08, 0x10, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellLoZAcute 275 ? 0x017A 'z' ';ez' #378 (zacute) */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x04, + 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpZDot 276 ? 0x017B 'Z' ';dZ' #379 (Zdot) */ + 0x10, 0x00, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellLoZDot 277 ? 0x017C 'z' ';dz' #380 (zdot) */ + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x04, + 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellMidDot 341 0xB7 0x00B7 '.' ';l.' middot */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellUpCCaron 077 ? 0x010C 'C' ';vC' #268 (Ccaron) */ + 0x14, 0x08, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, + 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoCCaron 077 ? 0x010D 'c' ';vc' #269 (ccaron) */ + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x3C, 0x42, + 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoECaron 077 ? 0x011B 'e' ';ve' #283 (ecaron) */ + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x3C, 0x42, + 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoRCaron 077 ? 0x0159 'r' ';vr' #345 (rcaron) */ + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x5C, 0x62, + 0x42, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + /* kCellLoSCaron 077 0x9A 0x0161 's' ';vs' #353 (scaron) */ + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x3C, 0x42, + 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoTCaron 077 ? 0x0165 't' ';vt' #357 (tcaron) */ + 0x00, 0x14, 0x08, 0x00, 0x20, 0x20, 0x78, 0x20, + 0x20, 0x20, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoZCaron 077 0x9E 0x017E 'z' ';vz' #382 (zcaron) */ + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x7E, 0x04, + 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, + /* kCellUpYAcute 077 0xDD 0x00DD 'Y' ';eY' Yacute */ + 0x08, 0x10, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + /* kCellLoYAcute 077 0xFD 0x00FD 'y' ';ey' yacute */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, + /* kCellLoUDblac 077 ? 0x0171 'u' ';Eu' #369 (udblac) */ + 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellLoURing 077 ? 0x016F 'u' ';ru' #367 (uring) */ + 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x42, 0x42, + 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, + /* kCellUpDStroke 077 ? 0x0110 'D' ';dD' #272 (Dstrok) */ + 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0xF2, + 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, + /* kCellLoDStroke 077 ? 0x0111 'd' ';dd' #273 (dstrok) */ + 0x00, 0x00, 0x00, 0x02, 0x0F, 0x02, 0x3E, 0x42, + 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00, +#endif + + /* kCellUpperLeft */ + 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + /* kCellUpperMiddle */ + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellMiddleLeft */ + 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + /* kCellMiddleLeft */ + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + /* kCellMiddleRight */ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + /* kCellLowerLeft */ + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, + /* kCellLowerMiddle */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + /* kCellLowerRight */ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, + /* kCellGraySep */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellIcon00 */ + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, + /* kCellIcon01 */ + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x18, 0x18, + /* kCellIcon02 */ + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x18, 0x30, + /* kCellIcon03 */ + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xE0, 0x10, 0x10, 0x10, 0x90, 0x90, 0x90, + /* kCellIcon10 */ + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + /* kCellIcon11 */ + 0x18, 0x18, 0x19, 0x1B, 0x1E, 0x1C, 0x18, 0x10, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellIcon12 */ + 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + /* kCellIcon13 */ + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + /* kCellIcon20 */ + 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x04, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellIcon21 */ + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellIcon22 */ + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* kCellIcon23 */ + 0x10, 0x10, 0x10, 0xE0, 0x20, 0x20, 0x20, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 /* just so last above line can end in ',' */ +}; + +/* Mac Roman character set */ +const char Cell2MacAsciiMap[] = { + '\101', /* kCellUpA */ + '\102', /* kCellUpB */ + '\103', /* kCellUpC */ + '\104', /* kCellUpD */ + '\105', /* kCellUpE */ + '\106', /* kCellUpF */ + '\107', /* kCellUpG */ + '\110', /* kCellUpH */ + '\111', /* kCellUpI */ + '\112', /* kCellUpJ */ + '\113', /* kCellUpK */ + '\114', /* kCellUpL */ + '\115', /* kCellUpM */ + '\116', /* kCellUpN */ + '\117', /* kCellUpO */ + '\120', /* kCellUpP */ + '\121', /* kCellUpQ */ + '\122', /* kCellUpR */ + '\123', /* kCellUpS */ + '\124', /* kCellUpT */ + '\125', /* kCellUpU */ + '\126', /* kCellUpV */ + '\127', /* kCellUpW */ + '\130', /* kCellUpX */ + '\131', /* kCellUpY */ + '\132', /* kCellUpZ */ + '\141', /* kCellLoA */ + '\142', /* kCellLoB */ + '\143', /* kCellLoC */ + '\144', /* kCellLoD */ + '\145', /* kCellLoE */ + '\146', /* kCellLoF */ + '\147', /* kCellLoG */ + '\150', /* kCellLoH */ + '\151', /* kCellLoI */ + '\152', /* kCellLoJ */ + '\153', /* kCellLoK */ + '\154', /* kCellLoL */ + '\155', /* kCellLoM */ + '\156', /* kCellLoN */ + '\157', /* kCellLoO */ + '\160', /* kCellLoP */ + '\161', /* kCellLoQ */ + '\162', /* kCellLoR */ + '\163', /* kCellLoS */ + '\164', /* kCellLoT */ + '\165', /* kCellLoU */ + '\166', /* kCellLoV */ + '\167', /* kCellLoW */ + '\170', /* kCellLoX */ + '\171', /* kCellLoY */ + '\172', /* kCellLoZ */ + '\060', /* kCellDigit0 */ + '\061', /* kCellDigit1 */ + '\062', /* kCellDigit2 */ + '\063', /* kCellDigit3 */ + '\064', /* kCellDigit4 */ + '\065', /* kCellDigit5 */ + '\066', /* kCellDigit6 */ + '\067', /* kCellDigit7 */ + '\070', /* kCellDigit8 */ + '\071', /* kCellDigit9 */ + '\041', /* kCellExclamation */ + '\046', /* kCellAmpersand */ + '\047', /* kCellApostrophe */ + '\050', /* kCellLeftParen */ + '\051', /* kCellRightParen */ + '\054', /* kCellComma */ + '\055', /* kCellHyphen */ + '\056', /* kCellPeriod */ + '\057', /* kCellSlash */ + '\072', /* kCellColon */ + '\073', /* kCellSemicolon */ + '\077', /* kCellQuestion */ + '\311', /* kCellEllipsis */ + '\137', /* kCellUnderscore */ + '\322', /* kCellLeftDQuote */ + '\323', /* kCellRightDQuote */ + '\324', /* kCellLeftSQuote */ + '\325', /* kCellRightSQuote */ + '\251', /* kCellCopyright */ + '\040', /* kCellSpace */ + +#if NeedIntlChars + '\200', /* kCellUpADiaeresis */ + '\201', /* kCellUpARing */ + '\202', /* kCellUpCCedilla */ + '\203', /* kCellUpEAcute */ + '\204', /* kCellUpNTilde */ + '\205', /* kCellUpODiaeresis */ + '\206', /* kCellUpUDiaeresis */ + '\207', /* kCellLoAAcute */ + '\210', /* kCellLoAGrave */ + '\211', /* kCellLoACircumflex */ + '\212', /* kCellLoADiaeresis */ + '\213', /* kCellLoATilde */ + '\214', /* kCellLoARing */ + '\215', /* kCellLoCCedilla */ + '\216', /* kCellLoEAcute */ + '\217', /* kCellLoEGrave */ + '\220', /* kCellLoECircumflex */ + '\221', /* kCellLoEDiaeresis */ + '\222', /* kCellLoIAcute */ + '\223', /* kCellLoIGrave */ + '\224', /* kCellLoICircumflex */ + '\225', /* kCellLoIDiaeresis */ + '\226', /* kCellLoNTilde */ + '\227', /* kCellLoOAcute */ + '\230', /* kCellLoOGrave */ + '\231', /* kCellLoOCircumflex */ + '\232', /* kCellLoODiaeresis */ + '\233', /* kCellLoOTilde */ + '\234', /* kCellLoUAcute */ + '\235', /* kCellLoUGrave */ + '\236', /* kCellLoUCircumflex */ + '\237', /* kCellLoUDiaeresis */ + + '\256', /* kCellUpAE */ + '\257', /* kCellUpOStroke */ + + '\276', /* kCellLoAE */ + '\277', /* kCellLoOStroke */ + '\300', /* kCellInvQuestion */ + '\301', /* kCellInvExclam */ + + '\313', /* kCellUpAGrave */ + '\314', /* kCellUpATilde */ + '\315', /* kCellUpOTilde */ + '\316', /* kCellUpLigatureOE */ + '\317', /* kCellLoLigatureOE */ + + '\330', /* kCellLoYDiaeresis */ + '\331', /* kCellUpYDiaeresis */ + + '\345', /* kCellUpACircumflex */ + '\346', /* kCellUpECircumflex */ + '\347', /* kCellUpAAcute */ + '\350', /* kCellUpEDiaeresis */ + '\351', /* kCellUpEGrave */ + '\352', /* kCellUpIAcute */ + '\353', /* kCellUpICircumflex */ + '\354', /* kCellUpIDiaeresis */ + '\355', /* kCellUpIGrave */ + '\356', /* kCellUpOAcute */ + '\357', /* kCellUpOCircumflex */ + + '\361', /* kCellUpOGrave */ + '\362', /* kCellUpUAcute */ + '\363', /* kCellUpUCircumflex */ + '\364', /* kCellUpUGrave */ + '\247', /* kCellSharpS */ + + '\260', /* kCellUpACedille */ + '\261', /* kCellLoACedille */ + '\262', /* kCellUpCAcute */ + '\263', /* kCellLoCAcute */ + '\264', /* kCellUpECedille */ + '\265', /* kCellLoECedille */ + '\266', /* kCellUpLBar */ + '\267', /* kCellLoLBar */ + '\270', /* kCellUpNAcute */ + '\271', /* kCellLoNAcute */ + '\272', /* kCellUpSAcute */ + '\273', /* kCellLoSAcute */ + '\274', /* kCellUpZAcute */ + '\275', /* kCellLoZAcute */ + '\276', /* kCellUpZDot */ + '\277', /* kCellLoZDot */ + '\341', /* kCellMidDot */ + '\103', /* kCellUpCCaron */ + '\143', /* kCellLoCCaron */ + '\145', /* kCellLoECaron */ + '\162', /* kCellLoRCaron */ + '\163', /* kCellLoSCaron */ + '\164', /* kCellLoTCaron */ + '\172', /* kCellLoZCaron */ + '\131', /* kCellUpYAcute */ + '\171', /* kCellLoYAcute */ + '\165', /* kCellLoUDblac */ + '\165', /* kCellLoURing */ + '\104', /* kCellUpDStroke */ + '\144', /* kCellLoDStroke */ +#endif + + '\0' /* just so last above line can end in ',' */ +}; + +/* Windows character set (windows-1252 code page) */ +const uint8_t Cell2WinAsciiMap[] = { + 0x41, /* kCellUpA */ + 0x42, /* kCellUpB */ + 0x43, /* kCellUpC */ + 0x44, /* kCellUpD */ + 0x45, /* kCellUpE */ + 0x46, /* kCellUpF */ + 0x47, /* kCellUpG */ + 0x48, /* kCellUpH */ + 0x49, /* kCellUpI */ + 0x4A, /* kCellUpJ */ + 0x4B, /* kCellUpK */ + 0x4C, /* kCellUpL */ + 0x4D, /* kCellUpM */ + 0x4E, /* kCellUpN */ + 0x4F, /* kCellUpO */ + 0x50, /* kCellUpP */ + 0x51, /* kCellUpQ */ + 0x52, /* kCellUpR */ + 0x53, /* kCellUpS */ + 0x54, /* kCellUpT */ + 0x55, /* kCellUpU */ + 0x56, /* kCellUpV */ + 0x57, /* kCellUpW */ + 0x58, /* kCellUpX */ + 0x59, /* kCellUpY */ + 0x5A, /* kCellUpZ */ + 0x61, /* kCellLoA */ + 0x62, /* kCellLoB */ + 0x63, /* kCellLoC */ + 0x64, /* kCellLoD */ + 0x65, /* kCellLoE */ + 0x66, /* kCellLoF */ + 0x67, /* kCellLoG */ + 0x68, /* kCellLoH */ + 0x69, /* kCellLoI */ + 0x6A, /* kCellLoJ */ + 0x6B, /* kCellLoK */ + 0x6C, /* kCellLoL */ + 0x6D, /* kCellLoM */ + 0x6E, /* kCellLoN */ + 0x6F, /* kCellLoO */ + 0x70, /* kCellLoP */ + 0x71, /* kCellLoQ */ + 0x72, /* kCellLoR */ + 0x73, /* kCellLoS */ + 0x74, /* kCellLoT */ + 0x75, /* kCellLoU */ + 0x76, /* kCellLoV */ + 0x77, /* kCellLoW */ + 0x78, /* kCellLoX */ + 0x79, /* kCellLoY */ + 0x7A, /* kCellLoZ */ + 0x30, /* kCellDigit0 */ + 0x31, /* kCellDigit1 */ + 0x32, /* kCellDigit2 */ + 0x33, /* kCellDigit3 */ + 0x34, /* kCellDigit4 */ + 0x35, /* kCellDigit5 */ + 0x36, /* kCellDigit6 */ + 0x37, /* kCellDigit7 */ + 0x38, /* kCellDigit8 */ + 0x39, /* kCellDigit9 */ + 0x21, /* kCellExclamation */ + 0x26, /* kCellAmpersand */ + 0x27, /* kCellApostrophe */ + 0x28, /* kCellLeftParen */ + 0x29, /* kCellRightParen */ + 0x2C, /* kCellComma */ + 0x2D, /* kCellHyphen */ + 0x2E, /* kCellPeriod */ + 0x2F, /* kCellSlash */ + 0x3A, /* kCellColon */ + 0x3B, /* kCellSemicolon */ + 0x3F, /* kCellQuestion */ + 0x85, /* kCellEllipsis */ + 0x5F, /* kCellUnderscore */ + 0x93, /* kCellLeftDQuote */ + 0x94, /* kCellRightDQuote */ + 0x91, /* kCellLeftSQuote */ + 0x92, /* kCellRightSQuote */ + 0xA9, /* kCellCopyright */ + 0x20, /* kCellSpace */ + +#if NeedIntlChars + 0xC4, /* kCellUpADiaeresis */ + 0xC5, /* kCellUpARing */ + 0xC7, /* kCellUpCCedilla */ + 0xC9, /* kCellUpEAcute */ + 0xD1, /* kCellUpNTilde */ + 0xD6, /* kCellUpODiaeresis */ + 0xDC, /* kCellUpUDiaeresis */ + 0xE1, /* kCellLoAAcute */ + 0xE0, /* kCellLoAGrave */ + 0xE2, /* kCellLoACircumflex */ + 0xE4, /* kCellLoADiaeresis */ + 0xE3, /* kCellLoATilde */ + 0xE5, /* kCellLoARing */ + 0xE7, /* kCellLoCCedilla */ + 0xE9, /* kCellLoEAcute */ + 0xE8, /* kCellLoEGrave */ + 0xEA, /* kCellLoECircumflex */ + 0xEB, /* kCellLoEDiaeresis */ + 0xED, /* kCellLoIAcute */ + 0xEC, /* kCellLoIGrave */ + 0xEE, /* kCellLoICircumflex */ + 0xEF, /* kCellLoIDiaeresis */ + 0xF1, /* kCellLoNTilde */ + 0xF3, /* kCellLoOAcute */ + 0xF2, /* kCellLoOGrave */ + 0xF4, /* kCellLoOCircumflex */ + 0xF6, /* kCellLoODiaeresis */ + 0xF5, /* kCellLoOTilde */ + 0xFA, /* kCellLoUAcute */ + 0xF9, /* kCellLoUGrave */ + 0xFB, /* kCellLoUCircumflex */ + 0xFC, /* kCellLoUDiaeresis */ + + 0xC6, /* kCellUpAE */ + 0xD8, /* kCellUpOStroke */ + + 0xE6, /* kCellLoAE */ + 0xF8, /* kCellLoOStroke */ + 0xBF, /* kCellInvQuestion */ + 0xA1, /* kCellInvExclam */ + + 0xC0, /* kCellUpAGrave */ + 0xC3, /* kCellUpATilde */ + 0xD5, /* kCellUpOTilde */ + 0x8C, /* kCellUpLigatureOE */ + 0x9C, /* kCellLoLigatureOE */ + + 0xFF, /* kCellLoYDiaeresis */ + 0x9F, /* kCellUpYDiaeresis */ + + 0xC2, /* kCellUpACircumflex */ + 0xCA, /* kCellUpECircumflex */ + 0xC1, /* kCellUpAAcute */ + 0xCB, /* kCellUpEDiaeresis */ + 0xC8, /* kCellUpEGrave */ + 0xCD, /* kCellUpIAcute */ + 0xCE, /* kCellUpICircumflex */ + 0xCF, /* kCellUpIDiaeresis */ + 0xCC, /* kCellUpIGrave */ + 0xD3, /* kCellUpOAcute */ + 0xD4, /* kCellUpOCircumflex */ + + 0xD2, /* kCellUpOGrave */ + 0xDA, /* kCellUpUAcute */ + 0xDB, /* kCellUpUCircumflex */ + 0xD9, /* kCellUpUGrave */ + 0xDF, /* kCellSharpS */ + + 0x41, /* kCellUpACedille */ + 0x61, /* kCellLoACedille */ + 0x43, /* kCellUpCAcute */ + 0x63, /* kCellLoCAcute */ + 0x45, /* kCellUpECedille */ + 0x65, /* kCellLoECedille */ + 0x4C, /* kCellUpLBar */ + 0x6C, /* kCellLoLBar */ + 0x4E, /* kCellUpNAcute */ + 0x6E, /* kCellLoNAcute */ + 0x53, /* kCellUpSAcute */ + 0x73, /* kCellLoSAcute */ + 0x5A, /* kCellUpZAcute */ + 0x7A, /* kCellLoZAcute */ + 0x5A, /* kCellUpZDot */ + 0x7A, /* kCellLoZDot */ + 0xB7, /* kCellMidDot */ + 0x43, /* kCellUpCCaron */ + 0x63, /* kCellLoCCaron */ + 0x65, /* kCellLoECaron */ + 0x61, /* kCellLoRCaron */ + 0x9A, /* kCellLoSCaron */ + 0x74, /* kCellLoTCaron */ + 0x9E, /* kCellLoZCaron */ + 0xDD, /* kCellUpYAcute */ + 0xFD, /* kCellLoYAcute */ + 0x75, /* kCellLoUDblac */ + 0x75, /* kCellLoURing */ + 0x44, /* kCellUpDStroke */ + 0x64, /* kCellLoDStroke */ +#endif + + '\0' /* just so last above line can end in ',' */ +}; + +/* Plain ascii - remove accents when possible */ +const char Cell2PlainAsciiMap[] = { + 'A', /* kCellUpA */ + 'B', /* kCellUpB */ + 'C', /* kCellUpC */ + 'D', /* kCellUpD */ + 'E', /* kCellUpE */ + 'F', /* kCellUpF */ + 'G', /* kCellUpG */ + 'H', /* kCellUpH */ + 'I', /* kCellUpI */ + 'J', /* kCellUpJ */ + 'K', /* kCellUpK */ + 'L', /* kCellUpL */ + 'M', /* kCellUpM */ + 'N', /* kCellUpN */ + 'O', /* kCellUpO */ + 'P', /* kCellUpP */ + 'Q', /* kCellUpQ */ + 'R', /* kCellUpR */ + 'S', /* kCellUpS */ + 'T', /* kCellUpT */ + 'U', /* kCellUpU */ + 'V', /* kCellUpV */ + 'W', /* kCellUpW */ + 'X', /* kCellUpX */ + 'Y', /* kCellUpY */ + 'Z', /* kCellUpZ */ + 'a', /* kCellLoA */ + 'b', /* kCellLoB */ + 'c', /* kCellLoC */ + 'd', /* kCellLoD */ + 'e', /* kCellLoE */ + 'f', /* kCellLoF */ + 'g', /* kCellLoG */ + 'h', /* kCellLoH */ + 'i', /* kCellLoI */ + 'j', /* kCellLoJ */ + 'k', /* kCellLoK */ + 'l', /* kCellLoL */ + 'm', /* kCellLoM */ + 'n', /* kCellLoN */ + 'o', /* kCellLoO */ + 'p', /* kCellLoP */ + 'q', /* kCellLoQ */ + 'r', /* kCellLoR */ + 's', /* kCellLoS */ + 't', /* kCellLoT */ + 'u', /* kCellLoU */ + 'v', /* kCellLoV */ + 'w', /* kCellLoW */ + 'x', /* kCellLoX */ + 'y', /* kCellLoY */ + 'z', /* kCellLoZ */ + '0', /* kCellDigit0 */ + '1', /* kCellDigit1 */ + '2', /* kCellDigit2 */ + '3', /* kCellDigit3 */ + '4', /* kCellDigit4 */ + '5', /* kCellDigit5 */ + '6', /* kCellDigit6 */ + '7', /* kCellDigit7 */ + '8', /* kCellDigit8 */ + '9', /* kCellDigit9 */ + '!', /* kCellExclamation */ + '&', /* kCellAmpersand */ + '\047', /* kCellApostrophe */ + '(', /* kCellLeftParen */ + ')', /* kCellRightParen */ + ',', /* kCellComma */ + '-', /* kCellHyphen */ + '.', /* kCellPeriod */ + '/', /* kCellSlash */ + ':', /* kCellColon */ + ';', /* kCellSemicolon */ + '?', /* kCellQuestion */ + '_', /* kCellEllipsis */ + '_', /* kCellUnderscore */ + '"', /* kCellLeftDQuote */ + '"', /* kCellRightDQuote */ + '\047', /* kCellLeftSQuote */ + '\047', /* kCellRightSQuote */ + 'c', /* kCellCopyright */ + ' ', /* kCellSpace */ + +#if NeedIntlChars + 'A', /* kCellUpADiaeresis */ + 'A', /* kCellUpARing */ + 'C', /* kCellUpCCedilla */ + 'E', /* kCellUpEAcute */ + 'N', /* kCellUpNTilde */ + 'O', /* kCellUpODiaeresis */ + 'U', /* kCellUpUDiaeresis */ + 'a', /* kCellLoAAcute */ + 'a', /* kCellLoAGrave */ + 'a', /* kCellLoACircumflex */ + 'a', /* kCellLoADiaeresis */ + 'a', /* kCellLoATilde */ + 'a', /* kCellLoARing */ + 'c', /* kCellLoCCedilla */ + 'e', /* kCellLoEAcute */ + 'e', /* kCellLoEGrave */ + 'e', /* kCellLoECircumflex */ + 'e', /* kCellLoEDiaeresis */ + 'i', /* kCellLoIAcute */ + 'i', /* kCellLoIGrave */ + 'i', /* kCellLoICircumflex */ + 'i', /* kCellLoIDiaeresis */ + 'n', /* kCellLoNTilde */ + 'o', /* kCellLoOAcute */ + 'o', /* kCellLoOGrave */ + 'o', /* kCellLoOCircumflex */ + 'o', /* kCellLoODiaeresis */ + 'o', /* kCellLoOTilde */ + 'u', /* kCellLoUAcute */ + 'u', /* kCellLoUGrave */ + 'u', /* kCellLoUCircumflex */ + 'u', /* kCellLoUDiaeresis */ + + '?', /* kCellUpAE */ + 'O', /* kCellUpOStroke */ + + '?', /* kCellLoAE */ + 'o', /* kCellLoOStroke */ + '?', /* kCellInvQuestion */ + '!', /* kCellInvExclam */ + + 'A', /* kCellUpAGrave */ + 'A', /* kCellUpATilde */ + 'O', /* kCellUpOTilde */ + '?', /* kCellUpLigatureOE */ + '?', /* kCellLoLigatureOE */ + + 'y', /* kCellLoYDiaeresis */ + 'Y', /* kCellUpYDiaeresis */ + + 'A', /* kCellUpACircumflex */ + 'E', /* kCellUpECircumflex */ + 'A', /* kCellUpAAcute */ + 'E', /* kCellUpEDiaeresis */ + 'E', /* kCellUpEGrave */ + 'A', /* kCellUpIAcute */ + 'I', /* kCellUpICircumflex */ + 'I', /* kCellUpIDiaeresis */ + 'I', /* kCellUpIGrave */ + 'O', /* kCellUpOAcute */ + 'O', /* kCellUpOCircumflex */ + + 'O', /* kCellUpOGrave */ + 'U', /* kCellUpUAcute */ + 'U', /* kCellUpUCircumflex */ + 'U', /* kCellUpUGrave */ + 'B', /* kCellSharpS */ + + 'A', /* kCellUpACedille */ + 'a', /* kCellLoACedille */ + 'C', /* kCellUpCAcute */ + 'c', /* kCellLoCAcute */ + 'E', /* kCellUpECedille */ + 'e', /* kCellLoECedille */ + 'L', /* kCellUpLBar */ + 'l', /* kCellLoLBar */ + 'N', /* kCellUpNAcute */ + 'n', /* kCellLoNAcute */ + 'S', /* kCellUpSAcute */ + 's', /* kCellLoSAcute */ + 'Z', /* kCellUpZAcute */ + 'z', /* kCellLoZAcute */ + 'Z', /* kCellUpZDot */ + 'z', /* kCellLoZDot */ + '.', /* kCellMidDot */ + 'C', /* kCellUpCCaron */ + 'c', /* kCellLoCCaron */ + 'e', /* kCellLoECaron */ + 'r', /* kCellLoRCaron */ + 's', /* kCellLoSCaron */ + 't', /* kCellLoTCaron */ + 'z', /* kCellLoZCaron */ + 'Y', /* kCellUpYAcute */ + 'y', /* kCellLoYAcute */ + 'u', /* kCellLoUDblac */ + 'u', /* kCellLoURing */ + 'D', /* kCellUpDStroke */ + 'd', /* kCellLoDStroke */ +#endif + + '\0' /* just so last above line can end in ',' */ +}; + +/* Unicode character set */ +const uint16_t Cell2UnicodeMap[] = { + 0x0041, /* kCellUpA */ + 0x0042, /* kCellUpB */ + 0x0043, /* kCellUpC */ + 0x0044, /* kCellUpD */ + 0x0045, /* kCellUpE */ + 0x0046, /* kCellUpF */ + 0x0047, /* kCellUpG */ + 0x0048, /* kCellUpH */ + 0x0049, /* kCellUpI */ + 0x004A, /* kCellUpJ */ + 0x004B, /* kCellUpK */ + 0x004C, /* kCellUpL */ + 0x004D, /* kCellUpM */ + 0x004E, /* kCellUpN */ + 0x004F, /* kCellUpO */ + 0x0050, /* kCellUpP */ + 0x0051, /* kCellUpQ */ + 0x0052, /* kCellUpR */ + 0x0053, /* kCellUpS */ + 0x0054, /* kCellUpT */ + 0x0055, /* kCellUpU */ + 0x0056, /* kCellUpV */ + 0x0057, /* kCellUpW */ + 0x0058, /* kCellUpX */ + 0x0059, /* kCellUpY */ + 0x005A, /* kCellUpZ */ + 0x0061, /* kCellLoA */ + 0x0062, /* kCellLoB */ + 0x0063, /* kCellLoC */ + 0x0064, /* kCellLoD */ + 0x0065, /* kCellLoE */ + 0x0066, /* kCellLoF */ + 0x0067, /* kCellLoG */ + 0x0068, /* kCellLoH */ + 0x0069, /* kCellLoI */ + 0x006A, /* kCellLoJ */ + 0x006B, /* kCellLoK */ + 0x006C, /* kCellLoL */ + 0x006D, /* kCellLoM */ + 0x006E, /* kCellLoN */ + 0x006F, /* kCellLoO */ + 0x0070, /* kCellLoP */ + 0x0071, /* kCellLoQ */ + 0x0072, /* kCellLoR */ + 0x0073, /* kCellLoS */ + 0x0074, /* kCellLoT */ + 0x0075, /* kCellLoU */ + 0x0076, /* kCellLoV */ + 0x0077, /* kCellLoW */ + 0x0078, /* kCellLoX */ + 0x0079, /* kCellLoY */ + 0x007A, /* kCellLoZ */ + 0x0030, /* kCellDigit0 */ + 0x0031, /* kCellDigit1 */ + 0x0032, /* kCellDigit2 */ + 0x0033, /* kCellDigit3 */ + 0x0034, /* kCellDigit4 */ + 0x0035, /* kCellDigit5 */ + 0x0036, /* kCellDigit6 */ + 0x0037, /* kCellDigit7 */ + 0x0038, /* kCellDigit8 */ + 0x0039, /* kCellDigit9 */ + 0x0021, /* kCellExclamation */ + 0x0026, /* kCellAmpersand */ + 0x0027, /* kCellApostrophe */ + 0x0028, /* kCellLeftParen */ + 0x0029, /* kCellRightParen */ + 0x002C, /* kCellComma */ + 0x002D, /* kCellHyphen */ + 0x002E, /* kCellPeriod */ + 0x002F, /* kCellSlash */ + 0x003A, /* kCellColon */ + 0x003B, /* kCellSemicolon */ + 0x003F, /* kCellQuestion */ + 0x2026, /* kCellEllipsis */ + 0x005F, /* kCellUnderscore */ + 0x201C, /* kCellLeftDQuote */ + 0x201D, /* kCellRightDQuote */ + 0x2018, /* kCellLeftSQuote */ + 0x2019, /* kCellRightSQuote */ + 0x00A9, /* kCellCopyright */ + 0x0020, /* kCellSpace */ + +#if NeedIntlChars + 0x00C4, /* kCellUpADiaeresis */ + 0x00C5, /* kCellUpARing */ + 0x00C7, /* kCellUpCCedilla */ + 0x00C9, /* kCellUpEAcute */ + 0x00D1, /* kCellUpNTilde */ + 0x00D6, /* kCellUpODiaeresis */ + 0x00DC, /* kCellUpUDiaeresis */ + 0x00E1, /* kCellLoAAcute */ + 0x00E0, /* kCellLoAGrave */ + 0x00E2, /* kCellLoACircumflex */ + 0x00E4, /* kCellLoADiaeresis */ + 0x00E3, /* kCellLoATilde */ + 0x00E5, /* kCellLoARing */ + 0x00E7, /* kCellLoCCedilla */ + 0x00E9, /* kCellLoEAcute */ + 0x00E8, /* kCellLoEGrave */ + 0x00EA, /* kCellLoECircumflex */ + 0x00EB, /* kCellLoEDiaeresis */ + 0x00ED, /* kCellLoIAcute */ + 0x00EC, /* kCellLoIGrave */ + 0x00EE, /* kCellLoICircumflex */ + 0x00EF, /* kCellLoIDiaeresis */ + 0x00F1, /* kCellLoNTilde */ + 0x00F3, /* kCellLoOAcute */ + 0x00F2, /* kCellLoOGrave */ + 0x00F4, /* kCellLoOCircumflex */ + 0x00F6, /* kCellLoODiaeresis */ + 0x00F5, /* kCellLoOTilde */ + 0x00FA, /* kCellLoUAcute */ + 0x00F9, /* kCellLoUGrave */ + 0x00FB, /* kCellLoUCircumflex */ + 0x00FC, /* kCellLoUDiaeresis */ + + 0x00C6, /* kCellUpAE */ + 0x00D8, /* kCellUpOStroke */ + + 0x00E6, /* kCellLoAE */ + 0x00F8, /* kCellLoOStroke */ + 0x00BF, /* kCellInvQuestion */ + 0x00A1, /* kCellInvExclam */ + + 0x00C0, /* kCellUpAGrave */ + 0x00C3, /* kCellUpATilde */ + 0x00D5, /* kCellUpOTilde */ + 0x0152, /* kCellUpLigatureOE */ + 0x0153, /* kCellLoLigatureOE */ + + 0x00FF, /* kCellLoYDiaeresis */ + 0x0178, /* kCellUpYDiaeresis */ + + 0x00C2, /* kCellUpACircumflex */ + 0x00CA, /* kCellUpECircumflex */ + 0x00C1, /* kCellUpAAcute */ + 0x00CB, /* kCellUpEDiaeresis */ + 0x00C8, /* kCellUpEGrave */ + 0x00CD, /* kCellUpIAcute */ + 0x00CE, /* kCellUpICircumflex */ + 0x00CF, /* kCellUpIDiaeresis */ + 0x00CC, /* kCellUpIGrave */ + 0x00D3, /* kCellUpOAcute */ + 0x00D4, /* kCellUpOCircumflex */ + + 0x00D2, /* kCellUpOGrave */ + 0x00DA, /* kCellUpUAcute */ + 0x00DB, /* kCellUpUCircumflex */ + 0x00D9, /* kCellUpUGrave */ + 0x00DF, /* kCellSharpS */ + + 0x0104, /* kCellUpACedille */ + 0x0105, /* kCellLoACedille */ + 0x0106, /* kCellUpCAcute */ + 0x0107, /* kCellLoCAcute */ + 0x0118, /* kCellUpECedille */ + 0x0119, /* kCellLoECedille */ + 0x0141, /* kCellUpLBar */ + 0x0142, /* kCellLoLBar */ + 0x0143, /* kCellUpNAcute */ + 0x0144, /* kCellLoNAcute */ + 0x015A, /* kCellUpSAcute */ + 0x015B, /* kCellLoSAcute */ + 0x0179, /* kCellUpZAcute */ + 0x017A, /* kCellLoZAcute */ + 0x017B, /* kCellUpZDot */ + 0x017C, /* kCellLoZDot */ + 0x00B7, /* kCellMidDot */ + 0x010C, /* kCellUpCCaron */ + 0x010D, /* kCellLoCCaron */ + 0x011B, /* kCellLoECaron */ + 0x0159, /* kCellLoRCaron */ + 0x0161, /* kCellLoSCaron */ + 0x0165, /* kCellLoTCaron */ + 0x017E, /* kCellLoZCaron */ + 0x00DD, /* kCellUpYAcute */ + 0x00FD, /* kCellLoYAcute */ + 0x0171, /* kCellLoUDblac */ + 0x016F, /* kCellLoURing */ + 0x0110, /* kCellUpDStroke */ + 0x0111, /* kCellLoDStroke */ +#endif + + '\0' /* just so last above line can end in ',' */ +}; + +char * GetSubstitutionStr(char x) +{ + char *s; + + switch (x) { + case 'w': + s = kStrHomePage; + break; + case 'y': + s = kStrCopyrightYear; + break; + case 'p': + s = kStrAppName; + break; + case 'v': + s = kAppVariationStr; + break; + case 'r': + s = RomFileName; + break; + case 'c': + s = kControlModeKey; + break; + case 'm': + s = kUnMappedKey; + break; +#if UseControlKeys + case 'k': + if (ControlKeyPressed) { + s = kStrPressed; + } else { + s = kStrReleased; + } + break; +#endif + case 'g': + if (WantMagnify) { + s = kStrOn; + } else { + s = kStrOff; + } + break; +#if 1 + case 'f': + if (WantFullScreen) { + s = kStrOn; + } else { + s = kStrOff; + } + break; +#endif + case 'b': + if (RunInBackground) { + s = kStrOn; + } else { + s = kStrOff; + } + break; + case 'h': + if (SpeedStopped) { + s = kStrStoppedOn; + } else { + s = kStrStoppedOff; + } + break; + case 's': + switch (SpeedValue) { + case 0: + s = "1x"; + break; + case 1: + s = "2x"; + break; + case 2: + s = "4x"; + break; + case 3: + s = "8x"; + break; + case 4: + s = "16x"; + break; + case 5: + s = "32x"; + break; + default: + s = kStrSpeedValueAllOut; + break; + } + break; + default: + s = "???"; + break; + } + return s; +} + +int ClStrSizeSubstCStr(char *s) +{ + /* must match ClStrAppendSubstCStr ! */ + + char *p = s; + char c; + int L = 0; + + while (0 != (c = *p++)) { + if ('^' == c) { + if (0 == (c = *p++)) { + goto l_exit; /* oops, unexpected end of string, abort */ + } else if ('^' == c) { + ++L; + } else { + L += ClStrSizeSubstCStr(GetSubstitutionStr(c)); + } + } else if (';' == c) { + if (0 == (c = *p++)) { + goto l_exit; /* oops, unexpected end of string, abort */ + } + + switch (c) { + case 'l': +#if NeedIntlChars + case '`': + case 'd': + case 'e': + case 'i': + case 'n': + case 'u': + case 'v': + case 'E': + case 'r': +#endif + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + goto l_exit; + } + break; + default: + break; + } + ++L; + } else { + ++L; + } + } + +l_exit: + return L; +} + +void ClStrAppendChar(int *L0, uint8_t *r, uint8_t c) +{ + int L = *L0; + + r[L] = c; + L++; + *L0 = L; +} + +void ClStrAppendSubstCStr(int *L, uint8_t *r, char *s) +{ + /* must match ClStrSizeSubstCStr ! */ + + char *p = s; + char c; + uint8_t x; + + while (0 != (c = *p++)) { + if ('^' == c) { + if (0 == (c = *p++)) { + return; /* oops, unexpected end of string, abort */ + } else if ('^' == c) { + ClStrAppendChar(L, r, c); + } else { + ClStrAppendSubstCStr(L, r, GetSubstitutionStr(c)); + } + } else if (';' == c) { + if (0 == (c = *p++)) { + return; /* oops, unexpected end of string, abort */ + } + + switch (c) { + case 'g': x = kCellCopyright; break; + case 'l': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'a': x = kCellApostrophe; break; + case 'l': x = kCellEllipsis; break; + case 's': x = kCellSemicolon; break; +#if NeedIntlChars + case 'E': x = kCellUpAE; break; + case 'e': x = kCellLoAE; break; + case '.': x = kCellMidDot; break; +#endif + default: x = kCellQuestion; break; + } + break; + case '[': x = kCellLeftDQuote; break; + case '{': x = kCellRightDQuote; break; + case ']': x = kCellLeftSQuote; break; + case '}': x = kCellRightSQuote; break; +#if NeedIntlChars + case '?': x = kCellInvQuestion; break; + case 'A': x = kCellUpARing; break; + case 'C': x = kCellUpCCedilla; break; + case 'O': x = kCellUpOStroke; break; + case 'Q': x = kCellUpLigatureOE; break; + case '`': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'A': x = kCellUpAGrave; break; + case 'E': x = kCellUpEGrave; break; + case 'I': x = kCellUpIGrave; break; + case 'O': x = kCellUpOGrave; break; + case 'U': x = kCellUpUGrave; break; + case 'a': x = kCellLoAGrave; break; + case 'e': x = kCellLoEGrave; break; + case 'i': x = kCellLoIGrave; break; + case 'o': x = kCellLoOGrave; break; + case 'u': x = kCellLoUGrave; break; + default: x = kCellQuestion; break; + } + break; + case 'a': x = kCellLoARing; break; + case 'c': x = kCellLoCCedilla; break; + case 'd': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'A': x = kCellUpACedille; break; + case 'a': x = kCellLoACedille; break; + case 'D': x = kCellUpDStroke; break; + case 'd': x = kCellLoDStroke; break; + case 'E': x = kCellUpECedille; break; + case 'e': x = kCellLoECedille; break; + case 'L': x = kCellUpLBar; break; + case 'l': x = kCellLoLBar; break; + case 'Z': x = kCellUpZDot; break; + case 'z': x = kCellLoZDot; break; + default: x = kCellQuestion; break; + } + break; + case 'e': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'A': x = kCellUpAAcute; break; + case 'E': x = kCellUpEAcute; break; + case 'I': x = kCellUpIAcute; break; + case 'O': x = kCellUpOAcute; break; + case 'U': x = kCellUpUAcute; break; + case 'a': x = kCellLoAAcute; break; + case 'e': x = kCellLoEAcute; break; + case 'i': x = kCellLoIAcute; break; + case 'o': x = kCellLoOAcute; break; + case 'u': x = kCellLoUAcute; break; + + case 'C': x = kCellUpCAcute; break; + case 'c': x = kCellLoCAcute; break; + case 'N': x = kCellUpNAcute; break; + case 'n': x = kCellLoNAcute; break; + case 'S': x = kCellUpSAcute; break; + case 's': x = kCellLoSAcute; break; + case 'Z': x = kCellUpZAcute; break; + case 'z': x = kCellLoZAcute; break; + case 'Y': x = kCellUpYAcute; break; + case 'y': x = kCellLoYAcute; break; + + default: x = kCellQuestion; break; + } + break; + case 'i': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'A': x = kCellUpACircumflex; break; + case 'E': x = kCellUpECircumflex; break; + case 'I': x = kCellUpICircumflex; break; + case 'O': x = kCellUpOCircumflex; break; + case 'U': x = kCellUpUCircumflex; break; + case 'a': x = kCellLoACircumflex; break; + case 'e': x = kCellLoECircumflex; break; + case 'i': x = kCellLoICircumflex; break; + case 'o': x = kCellLoOCircumflex; break; + case 'u': x = kCellLoUCircumflex; break; + default: x = kCellQuestion; break; + } + break; + case 'n': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'A': x = kCellUpATilde; break; + case 'N': x = kCellUpNTilde; break; + case 'O': x = kCellUpOTilde; break; + case 'a': x = kCellLoATilde; break; + case 'n': x = kCellLoNTilde; break; + case 'o': x = kCellLoOTilde; break; + default: x = kCellQuestion; break; + } + break; + case 'o': x = kCellLoOStroke; break; + case 'q': x = kCellLoLigatureOE; break; + case 's': x = kCellSharpS; break; + case 'u': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'A': x = kCellUpADiaeresis; break; + case 'E': x = kCellUpEDiaeresis; break; + case 'I': x = kCellUpIDiaeresis; break; + case 'O': x = kCellUpODiaeresis; break; + case 'U': x = kCellUpUDiaeresis; break; + case 'Y': x = kCellUpYDiaeresis; break; + case 'a': x = kCellLoADiaeresis; break; + case 'e': x = kCellLoEDiaeresis; break; + case 'i': x = kCellLoIDiaeresis; break; + case 'o': x = kCellLoODiaeresis; break; + case 'u': x = kCellLoUDiaeresis; break; + case 'y': x = kCellLoYDiaeresis; break; + default: x = kCellQuestion; break; + } + break; + case 'v': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'C': x = kCellUpCCaron; break; + case 'c': x = kCellLoCCaron; break; + case 'e': x = kCellLoECaron; break; + case 'r': x = kCellLoRCaron; break; + case 's': x = kCellLoSCaron; break; + case 't': x = kCellLoTCaron; break; + case 'z': x = kCellLoZCaron; break; + default: x = kCellQuestion; break; + } + break; + case 'E': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'u': x = kCellLoUDblac; break; + default: x = kCellQuestion; break; + } + break; + case 'r': + if (0 == (c = *p++)) { + /* oops, unexpected end of string, abort */ + return; + } + + switch (c) { + case 'u': x = kCellLoURing; break; + default: x = kCellQuestion; break; + } + break; +#endif + default: x = kCellQuestion; break; + } + ClStrAppendChar(L, r, x); + } else { + switch (c) { + case 'A': x = kCellUpA; break; + case 'B': x = kCellUpB; break; + case 'C': x = kCellUpC; break; + case 'D': x = kCellUpD; break; + case 'E': x = kCellUpE; break; + case 'F': x = kCellUpF; break; + case 'G': x = kCellUpG; break; + case 'H': x = kCellUpH; break; + case 'I': x = kCellUpI; break; + case 'J': x = kCellUpJ; break; + case 'K': x = kCellUpK; break; + case 'L': x = kCellUpL; break; + case 'M': x = kCellUpM; break; + case 'N': x = kCellUpN; break; + case 'O': x = kCellUpO; break; + case 'P': x = kCellUpP; break; + case 'Q': x = kCellUpQ; break; + case 'R': x = kCellUpR; break; + case 'S': x = kCellUpS; break; + case 'T': x = kCellUpT; break; + case 'U': x = kCellUpU; break; + case 'V': x = kCellUpV; break; + case 'W': x = kCellUpW; break; + case 'X': x = kCellUpX; break; + case 'Y': x = kCellUpY; break; + case 'Z': x = kCellUpZ; break; + case 'a': x = kCellLoA; break; + case 'b': x = kCellLoB; break; + case 'c': x = kCellLoC; break; + case 'd': x = kCellLoD; break; + case 'e': x = kCellLoE; break; + case 'f': x = kCellLoF; break; + case 'g': x = kCellLoG; break; + case 'h': x = kCellLoH; break; + case 'i': x = kCellLoI; break; + case 'j': x = kCellLoJ; break; + case 'k': x = kCellLoK; break; + case 'l': x = kCellLoL; break; + case 'm': x = kCellLoM; break; + case 'n': x = kCellLoN; break; + case 'o': x = kCellLoO; break; + case 'p': x = kCellLoP; break; + case 'q': x = kCellLoQ; break; + case 'r': x = kCellLoR; break; + case 's': x = kCellLoS; break; + case 't': x = kCellLoT; break; + case 'u': x = kCellLoU; break; + case 'v': x = kCellLoV; break; + case 'w': x = kCellLoW; break; + case 'x': x = kCellLoX; break; + case 'y': x = kCellLoY; break; + case 'z': x = kCellLoZ; break; + case '0': x = kCellDigit0; break; + case '1': x = kCellDigit1; break; + case '2': x = kCellDigit2; break; + case '3': x = kCellDigit3; break; + case '4': x = kCellDigit4; break; + case '5': x = kCellDigit5; break; + case '6': x = kCellDigit6; break; + case '7': x = kCellDigit7; break; + case '8': x = kCellDigit8; break; + case '9': x = kCellDigit9; break; + case '!': x = kCellExclamation; break; + case '&': x = kCellAmpersand; break; + case '(': x = kCellLeftParen; break; + case ')': x = kCellRightParen; break; + case ',': x = kCellComma; break; + case '-': x = kCellHyphen; break; + case '.': x = kCellPeriod; break; + case '/': x = kCellSlash; break; + case ':': x = kCellColon; break; + case ';': x = kCellSemicolon; break; + case '?': x = kCellQuestion; break; + case '_': x = kCellUnderscore; break; + case ' ': x = kCellSpace; break; + case '\047': x = kCellApostrophe; break; + + default: x = kCellQuestion; break; + } + ClStrAppendChar(L, r, x); + } + } +} + +void ClStrFromSubstCStr(int *L, uint8_t *r, char *s) +{ + int n = ClStrSizeSubstCStr(s); + + *L = 0; + if (n <= ClStrMaxLength) { + ClStrAppendSubstCStr(L, r, s); + + if (n != *L) { + /* try to ensure mismatch is noticed */ + *L = 0; + } + } +} diff --git a/src/LANG/INTLCHAR.h b/src/LANG/INTLCHAR.h index 421e459..13a4c3f 100644 --- a/src/LANG/INTLCHAR.h +++ b/src/LANG/INTLCHAR.h @@ -31,608 +31,17 @@ ClStrAppendSubstCStr encoding HTML character entity */ +#pragma once + #ifndef INTLCHAR_H #define INTLCHAR_H #include "UI/COMOSGLU.h" #include "UI/MYOSGLUE.h" -LOCALVAR const uint8_t CellData[] = { - /* kCellUpA 101 0x41 0x0041 'A' 'A' A */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpB 102 0x42 0x0042 'B' 'B' B */ - 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpC 103 0x43 0x0043 'C' 'C' C */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, - 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpD 104 0x44 0x0044 'D' 'D' D */ - 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpE 105 0x45 0x0045 'E' 'E' E */ - 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpF 106 0x46 0x0046 'F' 'F' F */ - 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, - /* kCellUpG 107 0x47 0x0047 'G' 'G' G */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x4E, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpH 110 0x48 0x0048 'H' 'H' H */ - 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x7E, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpI 111 0x49 0x0049 'I' 'I' I */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellUpJ 112 0x4A 0x004A 'J' 'J' J */ - 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpK 113 0x4B 0x004B 'K' 'K' K */ - 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, 0x60, - 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpL 114 0x4C 0x004C 'L' 'L' L */ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpM 115 0x4D 0x004D 'M' 'M' M */ - 0x00, 0x00, 0x00, 0x82, 0xC6, 0xAA, 0x92, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00, - /* kCellUpN 116 0x4E 0x004E 'N' 'N' N */ - 0x00, 0x00, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4A, - 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpO 117 0x4F 0x004F 'O' 'O' O */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpP 120 0x50 0x0050 'P' 'P' P */ - 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, - 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, - /* kCellUpQ 121 0x51 0x0051 'Q' 'Q' Q */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x10, 0x0C, 0x00, 0x00, - /* kCellUpR 122 0x52 0x0052 'R' 'R' R */ - 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpS 123 0x53 0x0053 'S' 'S' S */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x3C, - 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpT 124 0x54 0x0054 'T' 'T' T */ - 0x00, 0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellUpU 125 0x55 0x0055 'U' 'U' U */ - 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpV 126 0x56 0x0056 'V' 'V' V */ - 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x44, - 0x48, 0x50, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, - /* kCellUpW 127 0x57 0x0057 'W' 'W' W */ - 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x5A, 0x66, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpX 130 0x58 0x0058 'X' 'X' X */ - 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x18, - 0x24, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpY 131 0x59 0x0059 'Y' 'Y' Y */ - 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellUpZ 132 0x5A 0x005A 'Z' 'Z' Z */ - 0x00, 0x00, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellLoA 141 0x61 0x0061 'a' 'a' a */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoB 142 0x62 0x0062 'b' 'b' b */ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoC 143 0x63 0x0063 'c' 'c' c */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoD 144 0x64 0x0064 'd' 'd' d */ - 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x3E, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00, - /* kCellLoE 145 0x65 0x0065 'e' 'e' e */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoF 146 0x66 0x0066 'f' 'f' f */ - 0x00, 0x00, 0x00, 0x0E, 0x10, 0x10, 0x3C, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellLoG 147 0x67 0x0067 'g' 'g' g */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, - /* kCellLoH 150 0x68 0x0068 'h' 'h' h */ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellLoI 151 0x69 0x0069 'i' 'i' i */ - 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellLoJ 152 0x6A 0x006A 'j' 'j' j */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, - /* kCellLoK 153 0x6B 0x006B 'k' 'k' k */ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x44, 0x48, - 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellLoL 154 0x6C 0x006C 'l' 'l' l */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellLoM 155 0x6D 0x006D 'm' 'm' m */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x92, - 0x92, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, - /* kCellLoN 156 0x6E 0x006E 'n' 'n' n */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellLoO 157 0x6F 0x006F 'o' 'o' o */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoP 160 0x70 0x0070 'p' 'p' p */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x00, 0x00, - /* kCellLoQ 161 0x71 0x0071 'q' 'q' q */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x00, 0x00, - /* kCellLoR 162 0x72 0x0072 'r' 'r' r */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x62, - 0x42, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, - /* kCellLoS 163 0x73 0x0073 's' 's' s */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoT 164 0x74 0x0074 't' 't' t */ - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x78, 0x20, - 0x20, 0x20, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoU 165 0x75 0x0075 'u' 'u' u */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoV 166 0x76 0x0076 'v' 'v' v */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, - 0x48, 0x50, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, - /* kCellLoW 167 0x77 0x0077 'w' 'w' w */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x92, - 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoX 170 0x78 0x0078 'x' 'x' x */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x24, - 0x18, 0x18, 0x24, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellLoY 171 0x79 0x0079 'y' 'y' y */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, - /* kCellLoZ 172 0x7A 0x007A 'z' 'z' z */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x04, - 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit0 060 0x30 0x0030 '0' '0' 0 */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit1 061 0x31 0x0031 '1' '1' 1 */ - 0x00, 0x00, 0x00, 0x08, 0x18, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit2 062 0x32 0x0032 '2' '2' 2 */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x02, 0x04, - 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit3 063 0x33 0x0033 '3' '3' 3 */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x02, 0x0C, 0x02, - 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit4 064 0x34 0x0034 '4' '4' 4 */ - 0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x7E, - 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit5 065 0x35 0x0035 '5' '5' 5 */ - 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x7C, 0x02, - 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit6 066 0x36 0x0036 '6' '6' 6 */ - 0x00, 0x00, 0x00, 0x1C, 0x20, 0x40, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit7 067 0x37 0x0037 '7' '7' 7 */ - 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit8 070 0x38 0x0038 '8' '8' 8 */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellDigit9 071 0x39 0x0039 '9' '9' 9 */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x3E, 0x02, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, - /* kCellExclamation 041 0x21 0x0021 '!' '!' ! */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellAmpersand 046 0x26 0x0026 '&' '&' amp */ - 0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x50, 0x20, - 0x50, 0x4A, 0x44, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellApostrophe 047 0x27 0x0027 '\047' ';la' #39 (apos) */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellLeftParen 050 0x28 0x0028 '(' '(' ( */ - 0x00, 0x00, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, - /* kCellRightParen 051 0x29 0x0029 ')' ')' ) */ - 0x00, 0x00, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, - /* kCellComma 054 0x2C 0x002C ',' ',' , */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x08, 0x08, 0x10, 0x00, 0x00, - /* kCellHyphen 055 0x2D 0x002D '-' '-' - */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellPeriod 056 0x2E 0x002E '.' '.' . */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellSlash 057 0x2F 0x002F '/' '/' / */ - 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x08, 0x08, - 0x10, 0x10, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, - /* kCellColon 072 0x3A 0x003A ':' ':' : */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, - 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellSemicolon 073 0x3B 0x003B ';' ';ls' #59 (semi) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, - 0x00, 0x00, 0x08, 0x08, 0x08, 0x10, 0x00, 0x00, - /* kCellQuestion 077 0x3F 0x003F '?' '?' ? */ - 0x00, 0x00, 0x00, 0x38, 0x44, 0x04, 0x08, 0x10, - 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellEllipsis 311 0x85 0x2026 '_' ';ll' #8230 (mldr) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, - /* kCellUnderscore 137 0x5F 0x005F '_' '_' _ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, - /* kCellLeftDQuote 322 0x93 0x201C '"' ';[' ldquo */ - 0x00, 0x00, 0x00, 0x24, 0x48, 0x6C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellRightDQuote 323 0x94 0x201D '"' ';{' rdquo */ - 0x00, 0x00, 0x00, 0x36, 0x12, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellLeftSQuote 324 0x91 0x2018 '\047' ';]' lsquo */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellRightSQuote 325 0x92 0x2019 '\047' ';}' rsquo */ - 0x00, 0x00, 0x00, 0x18, 0x08, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellCopyright 251 0xA9 0x00A9 'c' ';g' copy */ - 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x9A, 0xA2, - 0xA2, 0x9A, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, - /* kCellSpace 040 0x20 0x0020 '\040' '' #32 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +#define ClStrMaxLength 512 -#if NeedIntlChars - /* kCellUpADiaeresis 200 0xC4 0x00C4 'A' ';uA' Auml */ - 0x00, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpARing 201 0xC5 0x00C5 'A' ';A' Aring */ - 0x3C, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x42, 0x7E, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpCCedilla 202 0xC7 0x00C7 'C' ';C' Ccedil */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, - 0x40, 0x40, 0x42, 0x3C, 0x08, 0x08, 0x10, 0x00, - /* kCellUpEAcute 203 0xC9 0x00C9 'E' ';eE' Eacute */ - 0x08, 0x10, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpNTilde 204 0xD1 0x00D1 'N' ';nN' Ntilde */ - 0x32, 0x4C, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4A, - 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpODiaeresis 205 0xD6 0x00D6 'O' ';uO' Ouml */ - 0x00, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpUDiaeresis 206 0xDC 0x00DC 'U' ';uU' Uuml */ - 0x00, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoAAcute 207 0xE1 0x00E1 'a' ';ea' aacute */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoAGrave 210 0xE0 0x00E0 'a' ';`a' agrave */ - 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoACircumflex 211 0xE2 0x00E2 'a' ';ia' acirc */ - 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoADiaeresis 212 0xE4 0x00E4 'a' ';ua' auml */ - 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoATilde 213 0xE3 0x00E3 'a' ';na' atilde */ - 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoARing 214 0xE5 0x00E5 'a' ';a' aring */ - 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoCCedilla 215 0xE7 0x00E7 'c' ';c' ccedil */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x40, 0x40, 0x42, 0x3C, 0x08, 0x08, 0x10, 0x00, - /* kCellLoEAcute 216 0xE9 0x00E9 'e' ';ee' eacute */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoEGrave 217 0xE8 0x00E8 'e' ';`e' egrave */ - 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoECircumflex 220 0xEA 0x00EA 'e' ';ie' ecirc */ - 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoEDiaeresis 221 0xEB 0x00EB 'e' ';ue' euml */ - 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoIAcute 222 0xED 0x00ED 'i' ';ei' iacute */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellLoIGrave 223 0xEC 0x00EC 'i' ';`i' igrave */ - 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellLoICircumflex 224 0xEE 0x00EE 'i' ';ii' icirc */ - 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellLoIDiaeresis 225 0xEF 0x00EF 'i' ';ui' iuml */ - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - /* kCellLoNTilde 226 0xF1 0x00F1 'n' ';nn' ntilde */ - 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellLoOAcute 227 0xF3 0x00F3 'o' ';eo' oacute */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoOGrave 230 0xF2 0x00F2 'o' ';`o' ograve */ - 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoOCircumflex 231 0xF4 0x00F4 'o' ';io' ocirc */ - 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoODiaeresis 232 0xF6 0x00F6 'o' ';uo' ouml */ - 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoOTilde 233 0xF5 0x00F5 'o' ';no' otilde */ - 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x3C, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoUAcute 234 0xFA 0x00FA 'u' ';eu' uacute */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoUGrave 235 0xF9 0x00F9 'u' ';`u' ugrave */ - 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoUCircumflex 236 0xFB 0x00FB 'u' ';iu' ucirc */ - 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoUDiaeresis 237 0xFC 0x00FC 'u' ';uu' uuml */ - 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - - /* kCellUpAE 256 0xC6 0x00C6 '?' ';lE' AElig */ - 0x00, 0x00, 0x00, 0x3E, 0x48, 0x48, 0x48, 0x7C, - 0x48, 0x48, 0x48, 0x4E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpOStroke 257 0xD8 0x00D8 'O' ';O' Oslash */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x46, 0x5A, - 0x62, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - - /* kCellLoAE 276 0xE6 0x00E6 '?' ';le' aelig */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x52, - 0x5E, 0x50, 0x52, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoOStroke 277 0xF8 0x00F8 'o' ';o' oslash */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x46, - 0x5A, 0x62, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellInvQuestion 300 0xBF 0x00BF '?' ';?' iquest */ - 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, - 0x20, 0x40, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, - /* kCellInvExclam 301 0xA1 0x00A1 '!' ';1' iexcl */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - - /* kCellUpAGrave 313 0xC0 0x00C0 'A' ';`A' Agrave */ - 0x10, 0x08, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpATilde 314 0xC3 0x00C3 'A' ';nA' Atilde */ - 0x32, 0x4C, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpOTilde 315 0xD5 0x00D5 'O' ';nO' Otilde */ - 0x32, 0x4C, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpLigatureOE 316 0x8C 0x0152 '?' ';Q' OElig */ - 0x00, 0x00, 0x00, 0x3E, 0x48, 0x48, 0x48, 0x4E, - 0x48, 0x48, 0x48, 0x3E, 0x00, 0x00, 0x00, 0x00, - /* kCellLoLigatureOE 317 0x9C 0x0153 '?' ';q' oelig */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x52, - 0x5E, 0x50, 0x52, 0x2C, 0x00, 0x00, 0x00, 0x00, - - /* kCellLoYDiaeresis 330 0xFF 0x00FF 'y' ';uy' yuml */ - 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, - /* kCellUpYDiaeresis 331 0x9F 0x0178 'Y' ';uY' Yuml */ - 0x00, 0x14, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - - /* kCellUpACircumflex 345 0xC2 0x00C2 'A' ';iA' Acirc */ - 0x18, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpECircumflex 346 0xCA 0x00CA 'E' ';iE' Ecirc */ - 0x18, 0x24, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpAAcute 347 0xC1 0x00C1 'A' ';eA' Aacute */ - 0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpEDiaeresis 350 0xCB 0x00CB 'E' ';uE' Euml */ - 0x00, 0x24, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpEGrave 351 0xC8 0x00C8 'E' ';`E' Egrave */ - 0x10, 0x08, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpIAcute 352 0xCD 0x00CD 'A' ';eI' Iacute */ - 0x04, 0x08, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpICircumflex 353 0xCE 0x00CE 'I' ';iI' Icirc */ - 0x08, 0x14, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpIDiaeresis 354 0xCF 0x00CF 'I' ';uI' Iuml */ - 0x00, 0x14, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpIGrave 355 0xCC 0x00CC 'I' ';`I' Igrave */ - 0x10, 0x08, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpOAcute 356 0xD3 0x00D3 'O' ';eO' Oacute */ - 0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpOCircumflex 357 0xD4 0x00D4 'O' ';iO' Ocirc */ - 0x18, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - - /* kCellUpOGrave 361 0xD2 0x00D2 'O' ';`O' Ograve */ - 0x10, 0x08, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpUAcute 362 0xDA 0x00DA 'U' ';eU' Uacute */ - 0x08, 0x10, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpUCircumflex 363 0xDB 0x00DB 'U' ';iU' Ucirc */ - 0x18, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpUGrave 364 0xD9 0x00D9 'U' ';`U' Ugrave */ - 0x10, 0x08, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellSharpS 247 0xDF 0x00DF 'B' ';s' szlig */ - 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x44, 0x44, - 0x42, 0x42, 0x42, 0x5C, 0x40, 0x00, 0x00, 0x00, - - /* kCellUpACedille 260 ? 0x0104 'A' ';dA' #260 (Aogon) */ - 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x7E, - 0x42, 0x42, 0x42, 0x42, 0x04, 0x04, 0x02, 0x00, - /* kCellLoACedille 261 ? 0x0105 'a' ';da' #261 (aogon) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x04, 0x04, 0x02, 0x00, - /* kCellUpCAcute 262 ? 0x0106 'C' ';eC' #262 (Cacute) */ - 0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, - 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoCAcute 263 ? 0x0107 'c' ';ec' #263 (cacute) */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, - 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpECedille 264 ? 0x0118 'E' ';dE' #280 (Eogon) */ - 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, - 0x40, 0x40, 0x40, 0x7E, 0x04, 0x04, 0x02, 0x00, - /* kCellLoECedille 265 ? 0x0119 'e' ';de' #281 (eogon) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x08, 0x08, 0x04, 0x00, - /* kCellUpLBar 266 ? 0x0141 'L' ';dL' #321 (Lstrok) */ - 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x60, 0x40, - 0xC0, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellLoLBar 267 ? 0x0142 'l' ';dl' #322 (lstrok) */ - 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x0C, 0x08, - 0x18, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellUpNAcute 270 ? 0x0143 'N' ';eN' #323 (Nacute) */ - 0x08, 0x10, 0x00, 0x42, 0x42, 0x62, 0x52, 0x4A, - 0x46, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellLoNAcute 271 ? 0x0144 'n' ';en' #324 (nacute) */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7C, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, - /* kCellUpSAcute 272 ? 0x015A 'S' ';eS' #346 (Sacute) */ - 0x08, 0x10, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x3C, - 0x02, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoSAcute 273 ? 0x015B 's' ';es' #347 (sacute) */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3C, 0x42, - 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellUpZAcute 274 ? 0x0179 'Z' ';eZ' #377 (Zacute) */ - 0x08, 0x10, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellLoZAcute 275 ? 0x017A 'z' ';ez' #378 (zacute) */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x04, - 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpZDot 276 ? 0x017B 'Z' ';dZ' #379 (Zdot) */ - 0x10, 0x00, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellLoZDot 277 ? 0x017C 'z' ';dz' #380 (zdot) */ - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x04, - 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellMidDot 341 0xB7 0x00B7 '.' ';l.' middot */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellUpCCaron 077 ? 0x010C 'C' ';vC' #268 (Ccaron) */ - 0x14, 0x08, 0x00, 0x3C, 0x42, 0x42, 0x40, 0x40, - 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoCCaron 077 ? 0x010D 'c' ';vc' #269 (ccaron) */ - 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x3C, 0x42, - 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoECaron 077 ? 0x011B 'e' ';ve' #283 (ecaron) */ - 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x3C, 0x42, - 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoRCaron 077 ? 0x0159 'r' ';vr' #345 (rcaron) */ - 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x5C, 0x62, - 0x42, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, - /* kCellLoSCaron 077 0x9A 0x0161 's' ';vs' #353 (scaron) */ - 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x3C, 0x42, - 0x3C, 0x02, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoTCaron 077 ? 0x0165 't' ';vt' #357 (tcaron) */ - 0x00, 0x14, 0x08, 0x00, 0x20, 0x20, 0x78, 0x20, - 0x20, 0x20, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoZCaron 077 0x9E 0x017E 'z' ';vz' #382 (zcaron) */ - 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x7E, 0x04, - 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, - /* kCellUpYAcute 077 0xDD 0x00DD 'Y' ';eY' Yacute */ - 0x08, 0x10, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - /* kCellLoYAcute 077 0xFD 0x00FD 'y' ';ey' yacute */ - 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x02, 0x42, 0x3C, 0x00, - /* kCellLoUDblac 077 ? 0x0171 'u' ';Eu' #369 (udblac) */ - 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellLoURing 077 ? 0x016F 'u' ';ru' #367 (uring) */ - 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x42, 0x42, - 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, 0x00, - /* kCellUpDStroke 077 ? 0x0110 'D' ';dD' #272 (Dstrok) */ - 0x00, 0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0xF2, - 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, 0x00, - /* kCellLoDStroke 077 ? 0x0111 'd' ';dd' #273 (dstrok) */ - 0x00, 0x00, 0x00, 0x02, 0x0F, 0x02, 0x3E, 0x42, - 0x42, 0x42, 0x42, 0x3E, 0x00, 0x00, 0x00, 0x00, -#endif - - /* kCellUpperLeft */ - 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - /* kCellUpperMiddle */ - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellMiddleLeft */ - 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - /* kCellMiddleLeft */ - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - /* kCellMiddleRight */ - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - /* kCellLowerLeft */ - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, - /* kCellLowerMiddle */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - /* kCellLowerRight */ - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, - /* kCellGraySep */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellIcon00 */ - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, - /* kCellIcon01 */ - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x18, 0x18, - /* kCellIcon02 */ - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x18, 0x30, - /* kCellIcon03 */ - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xE0, 0x10, 0x10, 0x10, 0x90, 0x90, 0x90, - /* kCellIcon10 */ - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - /* kCellIcon11 */ - 0x18, 0x18, 0x19, 0x1B, 0x1E, 0x1C, 0x18, 0x10, - 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellIcon12 */ - 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, - /* kCellIcon13 */ - 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, - 0x90, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - /* kCellIcon20 */ - 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x04, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellIcon21 */ - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellIcon22 */ - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* kCellIcon23 */ - 0x10, 0x10, 0x10, 0xE0, 0x20, 0x20, 0x20, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00 /* just so last above line can end in ',' */ -}; +extern const uint8_t CellData[]; enum { kCellUpA, @@ -844,1317 +253,32 @@ enum { }; #ifndef NeedCell2MacAsciiMap -#if 1 /* UseActvCode || EnableDemoMsg */ #define NeedCell2MacAsciiMap 1 -#else -#define NeedCell2MacAsciiMap 0 -#endif #endif -#if NeedCell2MacAsciiMap /* Mac Roman character set */ -LOCALVAR const char Cell2MacAsciiMap[] = { - '\101', /* kCellUpA */ - '\102', /* kCellUpB */ - '\103', /* kCellUpC */ - '\104', /* kCellUpD */ - '\105', /* kCellUpE */ - '\106', /* kCellUpF */ - '\107', /* kCellUpG */ - '\110', /* kCellUpH */ - '\111', /* kCellUpI */ - '\112', /* kCellUpJ */ - '\113', /* kCellUpK */ - '\114', /* kCellUpL */ - '\115', /* kCellUpM */ - '\116', /* kCellUpN */ - '\117', /* kCellUpO */ - '\120', /* kCellUpP */ - '\121', /* kCellUpQ */ - '\122', /* kCellUpR */ - '\123', /* kCellUpS */ - '\124', /* kCellUpT */ - '\125', /* kCellUpU */ - '\126', /* kCellUpV */ - '\127', /* kCellUpW */ - '\130', /* kCellUpX */ - '\131', /* kCellUpY */ - '\132', /* kCellUpZ */ - '\141', /* kCellLoA */ - '\142', /* kCellLoB */ - '\143', /* kCellLoC */ - '\144', /* kCellLoD */ - '\145', /* kCellLoE */ - '\146', /* kCellLoF */ - '\147', /* kCellLoG */ - '\150', /* kCellLoH */ - '\151', /* kCellLoI */ - '\152', /* kCellLoJ */ - '\153', /* kCellLoK */ - '\154', /* kCellLoL */ - '\155', /* kCellLoM */ - '\156', /* kCellLoN */ - '\157', /* kCellLoO */ - '\160', /* kCellLoP */ - '\161', /* kCellLoQ */ - '\162', /* kCellLoR */ - '\163', /* kCellLoS */ - '\164', /* kCellLoT */ - '\165', /* kCellLoU */ - '\166', /* kCellLoV */ - '\167', /* kCellLoW */ - '\170', /* kCellLoX */ - '\171', /* kCellLoY */ - '\172', /* kCellLoZ */ - '\060', /* kCellDigit0 */ - '\061', /* kCellDigit1 */ - '\062', /* kCellDigit2 */ - '\063', /* kCellDigit3 */ - '\064', /* kCellDigit4 */ - '\065', /* kCellDigit5 */ - '\066', /* kCellDigit6 */ - '\067', /* kCellDigit7 */ - '\070', /* kCellDigit8 */ - '\071', /* kCellDigit9 */ - '\041', /* kCellExclamation */ - '\046', /* kCellAmpersand */ - '\047', /* kCellApostrophe */ - '\050', /* kCellLeftParen */ - '\051', /* kCellRightParen */ - '\054', /* kCellComma */ - '\055', /* kCellHyphen */ - '\056', /* kCellPeriod */ - '\057', /* kCellSlash */ - '\072', /* kCellColon */ - '\073', /* kCellSemicolon */ - '\077', /* kCellQuestion */ - '\311', /* kCellEllipsis */ - '\137', /* kCellUnderscore */ - '\322', /* kCellLeftDQuote */ - '\323', /* kCellRightDQuote */ - '\324', /* kCellLeftSQuote */ - '\325', /* kCellRightSQuote */ - '\251', /* kCellCopyright */ - '\040', /* kCellSpace */ - -#if NeedIntlChars - '\200', /* kCellUpADiaeresis */ - '\201', /* kCellUpARing */ - '\202', /* kCellUpCCedilla */ - '\203', /* kCellUpEAcute */ - '\204', /* kCellUpNTilde */ - '\205', /* kCellUpODiaeresis */ - '\206', /* kCellUpUDiaeresis */ - '\207', /* kCellLoAAcute */ - '\210', /* kCellLoAGrave */ - '\211', /* kCellLoACircumflex */ - '\212', /* kCellLoADiaeresis */ - '\213', /* kCellLoATilde */ - '\214', /* kCellLoARing */ - '\215', /* kCellLoCCedilla */ - '\216', /* kCellLoEAcute */ - '\217', /* kCellLoEGrave */ - '\220', /* kCellLoECircumflex */ - '\221', /* kCellLoEDiaeresis */ - '\222', /* kCellLoIAcute */ - '\223', /* kCellLoIGrave */ - '\224', /* kCellLoICircumflex */ - '\225', /* kCellLoIDiaeresis */ - '\226', /* kCellLoNTilde */ - '\227', /* kCellLoOAcute */ - '\230', /* kCellLoOGrave */ - '\231', /* kCellLoOCircumflex */ - '\232', /* kCellLoODiaeresis */ - '\233', /* kCellLoOTilde */ - '\234', /* kCellLoUAcute */ - '\235', /* kCellLoUGrave */ - '\236', /* kCellLoUCircumflex */ - '\237', /* kCellLoUDiaeresis */ - - '\256', /* kCellUpAE */ - '\257', /* kCellUpOStroke */ - - '\276', /* kCellLoAE */ - '\277', /* kCellLoOStroke */ - '\300', /* kCellInvQuestion */ - '\301', /* kCellInvExclam */ - - '\313', /* kCellUpAGrave */ - '\314', /* kCellUpATilde */ - '\315', /* kCellUpOTilde */ - '\316', /* kCellUpLigatureOE */ - '\317', /* kCellLoLigatureOE */ - - '\330', /* kCellLoYDiaeresis */ - '\331', /* kCellUpYDiaeresis */ - - '\345', /* kCellUpACircumflex */ - '\346', /* kCellUpECircumflex */ - '\347', /* kCellUpAAcute */ - '\350', /* kCellUpEDiaeresis */ - '\351', /* kCellUpEGrave */ - '\352', /* kCellUpIAcute */ - '\353', /* kCellUpICircumflex */ - '\354', /* kCellUpIDiaeresis */ - '\355', /* kCellUpIGrave */ - '\356', /* kCellUpOAcute */ - '\357', /* kCellUpOCircumflex */ - - '\361', /* kCellUpOGrave */ - '\362', /* kCellUpUAcute */ - '\363', /* kCellUpUCircumflex */ - '\364', /* kCellUpUGrave */ - '\247', /* kCellSharpS */ - - '\260', /* kCellUpACedille */ - '\261', /* kCellLoACedille */ - '\262', /* kCellUpCAcute */ - '\263', /* kCellLoCAcute */ - '\264', /* kCellUpECedille */ - '\265', /* kCellLoECedille */ - '\266', /* kCellUpLBar */ - '\267', /* kCellLoLBar */ - '\270', /* kCellUpNAcute */ - '\271', /* kCellLoNAcute */ - '\272', /* kCellUpSAcute */ - '\273', /* kCellLoSAcute */ - '\274', /* kCellUpZAcute */ - '\275', /* kCellLoZAcute */ - '\276', /* kCellUpZDot */ - '\277', /* kCellLoZDot */ - '\341', /* kCellMidDot */ - '\103', /* kCellUpCCaron */ - '\143', /* kCellLoCCaron */ - '\145', /* kCellLoECaron */ - '\162', /* kCellLoRCaron */ - '\163', /* kCellLoSCaron */ - '\164', /* kCellLoTCaron */ - '\172', /* kCellLoZCaron */ - '\131', /* kCellUpYAcute */ - '\171', /* kCellLoYAcute */ - '\165', /* kCellLoUDblac */ - '\165', /* kCellLoURing */ - '\104', /* kCellUpDStroke */ - '\144', /* kCellLoDStroke */ -#endif - - '\0' /* just so last above line can end in ',' */ -}; -#endif - -#ifndef NeedCell2WinAsciiMap -#define NeedCell2WinAsciiMap 0 -#endif - -#if NeedCell2WinAsciiMap +extern const char Cell2MacAsciiMap[]; /* Windows character set (windows-1252 code page) */ -LOCALVAR const uint8_t Cell2WinAsciiMap[] = { - 0x41, /* kCellUpA */ - 0x42, /* kCellUpB */ - 0x43, /* kCellUpC */ - 0x44, /* kCellUpD */ - 0x45, /* kCellUpE */ - 0x46, /* kCellUpF */ - 0x47, /* kCellUpG */ - 0x48, /* kCellUpH */ - 0x49, /* kCellUpI */ - 0x4A, /* kCellUpJ */ - 0x4B, /* kCellUpK */ - 0x4C, /* kCellUpL */ - 0x4D, /* kCellUpM */ - 0x4E, /* kCellUpN */ - 0x4F, /* kCellUpO */ - 0x50, /* kCellUpP */ - 0x51, /* kCellUpQ */ - 0x52, /* kCellUpR */ - 0x53, /* kCellUpS */ - 0x54, /* kCellUpT */ - 0x55, /* kCellUpU */ - 0x56, /* kCellUpV */ - 0x57, /* kCellUpW */ - 0x58, /* kCellUpX */ - 0x59, /* kCellUpY */ - 0x5A, /* kCellUpZ */ - 0x61, /* kCellLoA */ - 0x62, /* kCellLoB */ - 0x63, /* kCellLoC */ - 0x64, /* kCellLoD */ - 0x65, /* kCellLoE */ - 0x66, /* kCellLoF */ - 0x67, /* kCellLoG */ - 0x68, /* kCellLoH */ - 0x69, /* kCellLoI */ - 0x6A, /* kCellLoJ */ - 0x6B, /* kCellLoK */ - 0x6C, /* kCellLoL */ - 0x6D, /* kCellLoM */ - 0x6E, /* kCellLoN */ - 0x6F, /* kCellLoO */ - 0x70, /* kCellLoP */ - 0x71, /* kCellLoQ */ - 0x72, /* kCellLoR */ - 0x73, /* kCellLoS */ - 0x74, /* kCellLoT */ - 0x75, /* kCellLoU */ - 0x76, /* kCellLoV */ - 0x77, /* kCellLoW */ - 0x78, /* kCellLoX */ - 0x79, /* kCellLoY */ - 0x7A, /* kCellLoZ */ - 0x30, /* kCellDigit0 */ - 0x31, /* kCellDigit1 */ - 0x32, /* kCellDigit2 */ - 0x33, /* kCellDigit3 */ - 0x34, /* kCellDigit4 */ - 0x35, /* kCellDigit5 */ - 0x36, /* kCellDigit6 */ - 0x37, /* kCellDigit7 */ - 0x38, /* kCellDigit8 */ - 0x39, /* kCellDigit9 */ - 0x21, /* kCellExclamation */ - 0x26, /* kCellAmpersand */ - 0x27, /* kCellApostrophe */ - 0x28, /* kCellLeftParen */ - 0x29, /* kCellRightParen */ - 0x2C, /* kCellComma */ - 0x2D, /* kCellHyphen */ - 0x2E, /* kCellPeriod */ - 0x2F, /* kCellSlash */ - 0x3A, /* kCellColon */ - 0x3B, /* kCellSemicolon */ - 0x3F, /* kCellQuestion */ - 0x85, /* kCellEllipsis */ - 0x5F, /* kCellUnderscore */ - 0x93, /* kCellLeftDQuote */ - 0x94, /* kCellRightDQuote */ - 0x91, /* kCellLeftSQuote */ - 0x92, /* kCellRightSQuote */ - 0xA9, /* kCellCopyright */ - 0x20, /* kCellSpace */ - -#if NeedIntlChars - 0xC4, /* kCellUpADiaeresis */ - 0xC5, /* kCellUpARing */ - 0xC7, /* kCellUpCCedilla */ - 0xC9, /* kCellUpEAcute */ - 0xD1, /* kCellUpNTilde */ - 0xD6, /* kCellUpODiaeresis */ - 0xDC, /* kCellUpUDiaeresis */ - 0xE1, /* kCellLoAAcute */ - 0xE0, /* kCellLoAGrave */ - 0xE2, /* kCellLoACircumflex */ - 0xE4, /* kCellLoADiaeresis */ - 0xE3, /* kCellLoATilde */ - 0xE5, /* kCellLoARing */ - 0xE7, /* kCellLoCCedilla */ - 0xE9, /* kCellLoEAcute */ - 0xE8, /* kCellLoEGrave */ - 0xEA, /* kCellLoECircumflex */ - 0xEB, /* kCellLoEDiaeresis */ - 0xED, /* kCellLoIAcute */ - 0xEC, /* kCellLoIGrave */ - 0xEE, /* kCellLoICircumflex */ - 0xEF, /* kCellLoIDiaeresis */ - 0xF1, /* kCellLoNTilde */ - 0xF3, /* kCellLoOAcute */ - 0xF2, /* kCellLoOGrave */ - 0xF4, /* kCellLoOCircumflex */ - 0xF6, /* kCellLoODiaeresis */ - 0xF5, /* kCellLoOTilde */ - 0xFA, /* kCellLoUAcute */ - 0xF9, /* kCellLoUGrave */ - 0xFB, /* kCellLoUCircumflex */ - 0xFC, /* kCellLoUDiaeresis */ - - 0xC6, /* kCellUpAE */ - 0xD8, /* kCellUpOStroke */ - - 0xE6, /* kCellLoAE */ - 0xF8, /* kCellLoOStroke */ - 0xBF, /* kCellInvQuestion */ - 0xA1, /* kCellInvExclam */ - - 0xC0, /* kCellUpAGrave */ - 0xC3, /* kCellUpATilde */ - 0xD5, /* kCellUpOTilde */ - 0x8C, /* kCellUpLigatureOE */ - 0x9C, /* kCellLoLigatureOE */ - - 0xFF, /* kCellLoYDiaeresis */ - 0x9F, /* kCellUpYDiaeresis */ - - 0xC2, /* kCellUpACircumflex */ - 0xCA, /* kCellUpECircumflex */ - 0xC1, /* kCellUpAAcute */ - 0xCB, /* kCellUpEDiaeresis */ - 0xC8, /* kCellUpEGrave */ - 0xCD, /* kCellUpIAcute */ - 0xCE, /* kCellUpICircumflex */ - 0xCF, /* kCellUpIDiaeresis */ - 0xCC, /* kCellUpIGrave */ - 0xD3, /* kCellUpOAcute */ - 0xD4, /* kCellUpOCircumflex */ - - 0xD2, /* kCellUpOGrave */ - 0xDA, /* kCellUpUAcute */ - 0xDB, /* kCellUpUCircumflex */ - 0xD9, /* kCellUpUGrave */ - 0xDF, /* kCellSharpS */ - - 0x41, /* kCellUpACedille */ - 0x61, /* kCellLoACedille */ - 0x43, /* kCellUpCAcute */ - 0x63, /* kCellLoCAcute */ - 0x45, /* kCellUpECedille */ - 0x65, /* kCellLoECedille */ - 0x4C, /* kCellUpLBar */ - 0x6C, /* kCellLoLBar */ - 0x4E, /* kCellUpNAcute */ - 0x6E, /* kCellLoNAcute */ - 0x53, /* kCellUpSAcute */ - 0x73, /* kCellLoSAcute */ - 0x5A, /* kCellUpZAcute */ - 0x7A, /* kCellLoZAcute */ - 0x5A, /* kCellUpZDot */ - 0x7A, /* kCellLoZDot */ - 0xB7, /* kCellMidDot */ - 0x43, /* kCellUpCCaron */ - 0x63, /* kCellLoCCaron */ - 0x65, /* kCellLoECaron */ - 0x61, /* kCellLoRCaron */ - 0x9A, /* kCellLoSCaron */ - 0x74, /* kCellLoTCaron */ - 0x9E, /* kCellLoZCaron */ - 0xDD, /* kCellUpYAcute */ - 0xFD, /* kCellLoYAcute */ - 0x75, /* kCellLoUDblac */ - 0x75, /* kCellLoURing */ - 0x44, /* kCellUpDStroke */ - 0x64, /* kCellLoDStroke */ -#endif - - '\0' /* just so last above line can end in ',' */ -}; -#endif - -#ifndef NeedCell2PlainAsciiMap -#define NeedCell2PlainAsciiMap 0 -#endif - -#if NeedCell2PlainAsciiMap +extern const uint8_t Cell2WinAsciiMap[]; /* Plain ascii - remove accents when possible */ -LOCALVAR const char Cell2PlainAsciiMap[] = { - 'A', /* kCellUpA */ - 'B', /* kCellUpB */ - 'C', /* kCellUpC */ - 'D', /* kCellUpD */ - 'E', /* kCellUpE */ - 'F', /* kCellUpF */ - 'G', /* kCellUpG */ - 'H', /* kCellUpH */ - 'I', /* kCellUpI */ - 'J', /* kCellUpJ */ - 'K', /* kCellUpK */ - 'L', /* kCellUpL */ - 'M', /* kCellUpM */ - 'N', /* kCellUpN */ - 'O', /* kCellUpO */ - 'P', /* kCellUpP */ - 'Q', /* kCellUpQ */ - 'R', /* kCellUpR */ - 'S', /* kCellUpS */ - 'T', /* kCellUpT */ - 'U', /* kCellUpU */ - 'V', /* kCellUpV */ - 'W', /* kCellUpW */ - 'X', /* kCellUpX */ - 'Y', /* kCellUpY */ - 'Z', /* kCellUpZ */ - 'a', /* kCellLoA */ - 'b', /* kCellLoB */ - 'c', /* kCellLoC */ - 'd', /* kCellLoD */ - 'e', /* kCellLoE */ - 'f', /* kCellLoF */ - 'g', /* kCellLoG */ - 'h', /* kCellLoH */ - 'i', /* kCellLoI */ - 'j', /* kCellLoJ */ - 'k', /* kCellLoK */ - 'l', /* kCellLoL */ - 'm', /* kCellLoM */ - 'n', /* kCellLoN */ - 'o', /* kCellLoO */ - 'p', /* kCellLoP */ - 'q', /* kCellLoQ */ - 'r', /* kCellLoR */ - 's', /* kCellLoS */ - 't', /* kCellLoT */ - 'u', /* kCellLoU */ - 'v', /* kCellLoV */ - 'w', /* kCellLoW */ - 'x', /* kCellLoX */ - 'y', /* kCellLoY */ - 'z', /* kCellLoZ */ - '0', /* kCellDigit0 */ - '1', /* kCellDigit1 */ - '2', /* kCellDigit2 */ - '3', /* kCellDigit3 */ - '4', /* kCellDigit4 */ - '5', /* kCellDigit5 */ - '6', /* kCellDigit6 */ - '7', /* kCellDigit7 */ - '8', /* kCellDigit8 */ - '9', /* kCellDigit9 */ - '!', /* kCellExclamation */ - '&', /* kCellAmpersand */ - '\047', /* kCellApostrophe */ - '(', /* kCellLeftParen */ - ')', /* kCellRightParen */ - ',', /* kCellComma */ - '-', /* kCellHyphen */ - '.', /* kCellPeriod */ - '/', /* kCellSlash */ - ':', /* kCellColon */ - ';', /* kCellSemicolon */ - '?', /* kCellQuestion */ - '_', /* kCellEllipsis */ - '_', /* kCellUnderscore */ - '"', /* kCellLeftDQuote */ - '"', /* kCellRightDQuote */ - '\047', /* kCellLeftSQuote */ - '\047', /* kCellRightSQuote */ - 'c', /* kCellCopyright */ - ' ', /* kCellSpace */ - -#if NeedIntlChars - 'A', /* kCellUpADiaeresis */ - 'A', /* kCellUpARing */ - 'C', /* kCellUpCCedilla */ - 'E', /* kCellUpEAcute */ - 'N', /* kCellUpNTilde */ - 'O', /* kCellUpODiaeresis */ - 'U', /* kCellUpUDiaeresis */ - 'a', /* kCellLoAAcute */ - 'a', /* kCellLoAGrave */ - 'a', /* kCellLoACircumflex */ - 'a', /* kCellLoADiaeresis */ - 'a', /* kCellLoATilde */ - 'a', /* kCellLoARing */ - 'c', /* kCellLoCCedilla */ - 'e', /* kCellLoEAcute */ - 'e', /* kCellLoEGrave */ - 'e', /* kCellLoECircumflex */ - 'e', /* kCellLoEDiaeresis */ - 'i', /* kCellLoIAcute */ - 'i', /* kCellLoIGrave */ - 'i', /* kCellLoICircumflex */ - 'i', /* kCellLoIDiaeresis */ - 'n', /* kCellLoNTilde */ - 'o', /* kCellLoOAcute */ - 'o', /* kCellLoOGrave */ - 'o', /* kCellLoOCircumflex */ - 'o', /* kCellLoODiaeresis */ - 'o', /* kCellLoOTilde */ - 'u', /* kCellLoUAcute */ - 'u', /* kCellLoUGrave */ - 'u', /* kCellLoUCircumflex */ - 'u', /* kCellLoUDiaeresis */ - - '?', /* kCellUpAE */ - 'O', /* kCellUpOStroke */ - - '?', /* kCellLoAE */ - 'o', /* kCellLoOStroke */ - '?', /* kCellInvQuestion */ - '!', /* kCellInvExclam */ - - 'A', /* kCellUpAGrave */ - 'A', /* kCellUpATilde */ - 'O', /* kCellUpOTilde */ - '?', /* kCellUpLigatureOE */ - '?', /* kCellLoLigatureOE */ - - 'y', /* kCellLoYDiaeresis */ - 'Y', /* kCellUpYDiaeresis */ - - 'A', /* kCellUpACircumflex */ - 'E', /* kCellUpECircumflex */ - 'A', /* kCellUpAAcute */ - 'E', /* kCellUpEDiaeresis */ - 'E', /* kCellUpEGrave */ - 'A', /* kCellUpIAcute */ - 'I', /* kCellUpICircumflex */ - 'I', /* kCellUpIDiaeresis */ - 'I', /* kCellUpIGrave */ - 'O', /* kCellUpOAcute */ - 'O', /* kCellUpOCircumflex */ - - 'O', /* kCellUpOGrave */ - 'U', /* kCellUpUAcute */ - 'U', /* kCellUpUCircumflex */ - 'U', /* kCellUpUGrave */ - 'B', /* kCellSharpS */ - - 'A', /* kCellUpACedille */ - 'a', /* kCellLoACedille */ - 'C', /* kCellUpCAcute */ - 'c', /* kCellLoCAcute */ - 'E', /* kCellUpECedille */ - 'e', /* kCellLoECedille */ - 'L', /* kCellUpLBar */ - 'l', /* kCellLoLBar */ - 'N', /* kCellUpNAcute */ - 'n', /* kCellLoNAcute */ - 'S', /* kCellUpSAcute */ - 's', /* kCellLoSAcute */ - 'Z', /* kCellUpZAcute */ - 'z', /* kCellLoZAcute */ - 'Z', /* kCellUpZDot */ - 'z', /* kCellLoZDot */ - '.', /* kCellMidDot */ - 'C', /* kCellUpCCaron */ - 'c', /* kCellLoCCaron */ - 'e', /* kCellLoECaron */ - 'r', /* kCellLoRCaron */ - 's', /* kCellLoSCaron */ - 't', /* kCellLoTCaron */ - 'z', /* kCellLoZCaron */ - 'Y', /* kCellUpYAcute */ - 'y', /* kCellLoYAcute */ - 'u', /* kCellLoUDblac */ - 'u', /* kCellLoURing */ - 'D', /* kCellUpDStroke */ - 'd', /* kCellLoDStroke */ -#endif - - '\0' /* just so last above line can end in ',' */ -}; -#endif - -#ifndef NeedCell2UnicodeMap -#define NeedCell2UnicodeMap 0 -#endif - -#if NeedCell2UnicodeMap -/* Unicode character set */ -LOCALVAR const uint16_t Cell2UnicodeMap[] = { - 0x0041, /* kCellUpA */ - 0x0042, /* kCellUpB */ - 0x0043, /* kCellUpC */ - 0x0044, /* kCellUpD */ - 0x0045, /* kCellUpE */ - 0x0046, /* kCellUpF */ - 0x0047, /* kCellUpG */ - 0x0048, /* kCellUpH */ - 0x0049, /* kCellUpI */ - 0x004A, /* kCellUpJ */ - 0x004B, /* kCellUpK */ - 0x004C, /* kCellUpL */ - 0x004D, /* kCellUpM */ - 0x004E, /* kCellUpN */ - 0x004F, /* kCellUpO */ - 0x0050, /* kCellUpP */ - 0x0051, /* kCellUpQ */ - 0x0052, /* kCellUpR */ - 0x0053, /* kCellUpS */ - 0x0054, /* kCellUpT */ - 0x0055, /* kCellUpU */ - 0x0056, /* kCellUpV */ - 0x0057, /* kCellUpW */ - 0x0058, /* kCellUpX */ - 0x0059, /* kCellUpY */ - 0x005A, /* kCellUpZ */ - 0x0061, /* kCellLoA */ - 0x0062, /* kCellLoB */ - 0x0063, /* kCellLoC */ - 0x0064, /* kCellLoD */ - 0x0065, /* kCellLoE */ - 0x0066, /* kCellLoF */ - 0x0067, /* kCellLoG */ - 0x0068, /* kCellLoH */ - 0x0069, /* kCellLoI */ - 0x006A, /* kCellLoJ */ - 0x006B, /* kCellLoK */ - 0x006C, /* kCellLoL */ - 0x006D, /* kCellLoM */ - 0x006E, /* kCellLoN */ - 0x006F, /* kCellLoO */ - 0x0070, /* kCellLoP */ - 0x0071, /* kCellLoQ */ - 0x0072, /* kCellLoR */ - 0x0073, /* kCellLoS */ - 0x0074, /* kCellLoT */ - 0x0075, /* kCellLoU */ - 0x0076, /* kCellLoV */ - 0x0077, /* kCellLoW */ - 0x0078, /* kCellLoX */ - 0x0079, /* kCellLoY */ - 0x007A, /* kCellLoZ */ - 0x0030, /* kCellDigit0 */ - 0x0031, /* kCellDigit1 */ - 0x0032, /* kCellDigit2 */ - 0x0033, /* kCellDigit3 */ - 0x0034, /* kCellDigit4 */ - 0x0035, /* kCellDigit5 */ - 0x0036, /* kCellDigit6 */ - 0x0037, /* kCellDigit7 */ - 0x0038, /* kCellDigit8 */ - 0x0039, /* kCellDigit9 */ - 0x0021, /* kCellExclamation */ - 0x0026, /* kCellAmpersand */ - 0x0027, /* kCellApostrophe */ - 0x0028, /* kCellLeftParen */ - 0x0029, /* kCellRightParen */ - 0x002C, /* kCellComma */ - 0x002D, /* kCellHyphen */ - 0x002E, /* kCellPeriod */ - 0x002F, /* kCellSlash */ - 0x003A, /* kCellColon */ - 0x003B, /* kCellSemicolon */ - 0x003F, /* kCellQuestion */ - 0x2026, /* kCellEllipsis */ - 0x005F, /* kCellUnderscore */ - 0x201C, /* kCellLeftDQuote */ - 0x201D, /* kCellRightDQuote */ - 0x2018, /* kCellLeftSQuote */ - 0x2019, /* kCellRightSQuote */ - 0x00A9, /* kCellCopyright */ - 0x0020, /* kCellSpace */ - -#if NeedIntlChars - 0x00C4, /* kCellUpADiaeresis */ - 0x00C5, /* kCellUpARing */ - 0x00C7, /* kCellUpCCedilla */ - 0x00C9, /* kCellUpEAcute */ - 0x00D1, /* kCellUpNTilde */ - 0x00D6, /* kCellUpODiaeresis */ - 0x00DC, /* kCellUpUDiaeresis */ - 0x00E1, /* kCellLoAAcute */ - 0x00E0, /* kCellLoAGrave */ - 0x00E2, /* kCellLoACircumflex */ - 0x00E4, /* kCellLoADiaeresis */ - 0x00E3, /* kCellLoATilde */ - 0x00E5, /* kCellLoARing */ - 0x00E7, /* kCellLoCCedilla */ - 0x00E9, /* kCellLoEAcute */ - 0x00E8, /* kCellLoEGrave */ - 0x00EA, /* kCellLoECircumflex */ - 0x00EB, /* kCellLoEDiaeresis */ - 0x00ED, /* kCellLoIAcute */ - 0x00EC, /* kCellLoIGrave */ - 0x00EE, /* kCellLoICircumflex */ - 0x00EF, /* kCellLoIDiaeresis */ - 0x00F1, /* kCellLoNTilde */ - 0x00F3, /* kCellLoOAcute */ - 0x00F2, /* kCellLoOGrave */ - 0x00F4, /* kCellLoOCircumflex */ - 0x00F6, /* kCellLoODiaeresis */ - 0x00F5, /* kCellLoOTilde */ - 0x00FA, /* kCellLoUAcute */ - 0x00F9, /* kCellLoUGrave */ - 0x00FB, /* kCellLoUCircumflex */ - 0x00FC, /* kCellLoUDiaeresis */ - - 0x00C6, /* kCellUpAE */ - 0x00D8, /* kCellUpOStroke */ - - 0x00E6, /* kCellLoAE */ - 0x00F8, /* kCellLoOStroke */ - 0x00BF, /* kCellInvQuestion */ - 0x00A1, /* kCellInvExclam */ - - 0x00C0, /* kCellUpAGrave */ - 0x00C3, /* kCellUpATilde */ - 0x00D5, /* kCellUpOTilde */ - 0x0152, /* kCellUpLigatureOE */ - 0x0153, /* kCellLoLigatureOE */ - - 0x00FF, /* kCellLoYDiaeresis */ - 0x0178, /* kCellUpYDiaeresis */ - - 0x00C2, /* kCellUpACircumflex */ - 0x00CA, /* kCellUpECircumflex */ - 0x00C1, /* kCellUpAAcute */ - 0x00CB, /* kCellUpEDiaeresis */ - 0x00C8, /* kCellUpEGrave */ - 0x00CD, /* kCellUpIAcute */ - 0x00CE, /* kCellUpICircumflex */ - 0x00CF, /* kCellUpIDiaeresis */ - 0x00CC, /* kCellUpIGrave */ - 0x00D3, /* kCellUpOAcute */ - 0x00D4, /* kCellUpOCircumflex */ - - 0x00D2, /* kCellUpOGrave */ - 0x00DA, /* kCellUpUAcute */ - 0x00DB, /* kCellUpUCircumflex */ - 0x00D9, /* kCellUpUGrave */ - 0x00DF, /* kCellSharpS */ - - 0x0104, /* kCellUpACedille */ - 0x0105, /* kCellLoACedille */ - 0x0106, /* kCellUpCAcute */ - 0x0107, /* kCellLoCAcute */ - 0x0118, /* kCellUpECedille */ - 0x0119, /* kCellLoECedille */ - 0x0141, /* kCellUpLBar */ - 0x0142, /* kCellLoLBar */ - 0x0143, /* kCellUpNAcute */ - 0x0144, /* kCellLoNAcute */ - 0x015A, /* kCellUpSAcute */ - 0x015B, /* kCellLoSAcute */ - 0x0179, /* kCellUpZAcute */ - 0x017A, /* kCellLoZAcute */ - 0x017B, /* kCellUpZDot */ - 0x017C, /* kCellLoZDot */ - 0x00B7, /* kCellMidDot */ - 0x010C, /* kCellUpCCaron */ - 0x010D, /* kCellLoCCaron */ - 0x011B, /* kCellLoECaron */ - 0x0159, /* kCellLoRCaron */ - 0x0161, /* kCellLoSCaron */ - 0x0165, /* kCellLoTCaron */ - 0x017E, /* kCellLoZCaron */ - 0x00DD, /* kCellUpYAcute */ - 0x00FD, /* kCellLoYAcute */ - 0x0171, /* kCellLoUDblac */ - 0x016F, /* kCellLoURing */ - 0x0110, /* kCellUpDStroke */ - 0x0111, /* kCellLoDStroke */ -#endif - - '\0' /* just so last above line can end in ',' */ -}; -#endif - -LOCALVAR bool SpeedStopped = false; - -LOCALVAR bool RunInBackground = (WantInitRunInBackground != 0); - -#if 1 -LOCALVAR bool WantFullScreen = (WantInitFullScreen != 0); -#endif - -LOCALVAR bool WantMagnify = (WantInitMagnify != 0); - -#if NeedRequestInsertDisk -LOCALVAR bool RequestInsertDisk = false; -#endif - -#ifndef NeedRequestIthDisk -#define NeedRequestIthDisk 0 -#endif - -#if NeedRequestIthDisk -LOCALVAR uint8_t RequestIthDisk = 0; -#endif - -#if UseControlKeys -LOCALVAR bool ControlKeyPressed = false; -#endif +extern const char Cell2PlainAsciiMap[]; +/* UTF-16 character set */ +extern const uint16_t Cell2UnicodeMap[]; #ifndef kStrCntrlKyName #define kStrCntrlKyName "control" #endif - #ifndef kControlModeKey #define kControlModeKey kStrCntrlKyName #endif - #ifndef kUnMappedKey #define kUnMappedKey kStrCntrlKyName #endif -LOCALFUNC char * GetSubstitutionStr(char x) -{ - char *s; - - switch (x) { - case 'w': - s = kStrHomePage; - break; - case 'y': - s = kStrCopyrightYear; - break; - case 'p': - s = kStrAppName; - break; - case 'v': - s = kAppVariationStr; - break; - case 'r': - s = RomFileName; - break; - case 'c': - s = kControlModeKey; - break; - case 'm': - s = kUnMappedKey; - break; -#if UseControlKeys - case 'k': - if (ControlKeyPressed) { - s = kStrPressed; - } else { - s = kStrReleased; - } - break; -#endif - case 'g': - if (WantMagnify) { - s = kStrOn; - } else { - s = kStrOff; - } - break; -#if 1 - case 'f': - if (WantFullScreen) { - s = kStrOn; - } else { - s = kStrOff; - } - break; -#endif - case 'b': - if (RunInBackground) { - s = kStrOn; - } else { - s = kStrOff; - } - break; - case 'h': - if (SpeedStopped) { - s = kStrStoppedOn; - } else { - s = kStrStoppedOff; - } - break; - case 's': - switch (SpeedValue) { - case 0: - s = "1x"; - break; - case 1: - s = "2x"; - break; - case 2: - s = "4x"; - break; - case 3: - s = "8x"; - break; - case 4: - s = "16x"; - break; - case 5: - s = "32x"; - break; - default: - s = kStrSpeedValueAllOut; - break; - } - break; - default: - s = "???"; - break; - } - return s; -} - -LOCALFUNC int ClStrSizeSubstCStr(char *s) -{ - /* must match ClStrAppendSubstCStr ! */ - - char *p = s; - char c; - int L = 0; - - while (0 != (c = *p++)) { - if ('^' == c) { - if (0 == (c = *p++)) { - goto l_exit; /* oops, unexpected end of string, abort */ - } else if ('^' == c) { - ++L; - } else { - L += ClStrSizeSubstCStr(GetSubstitutionStr(c)); - } - } else if (';' == c) { - if (0 == (c = *p++)) { - goto l_exit; /* oops, unexpected end of string, abort */ - } - - switch (c) { - case 'l': -#if NeedIntlChars - case '`': - case 'd': - case 'e': - case 'i': - case 'n': - case 'u': - case 'v': - case 'E': - case 'r': -#endif - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - goto l_exit; - } - break; - default: - break; - } - ++L; - } else { - ++L; - } - } - -l_exit: - return L; -} - -LOCALPROC ClStrAppendChar(int *L0, uint8_t *r, uint8_t c) -{ - int L = *L0; - - r[L] = c; - L++; - *L0 = L; -} - -LOCALPROC ClStrAppendSubstCStr(int *L, uint8_t *r, char *s) -{ - /* must match ClStrSizeSubstCStr ! */ - - char *p = s; - char c; - uint8_t x; - - while (0 != (c = *p++)) { - if ('^' == c) { - if (0 == (c = *p++)) { - return; /* oops, unexpected end of string, abort */ - } else if ('^' == c) { - ClStrAppendChar(L, r, c); - } else { - ClStrAppendSubstCStr(L, r, GetSubstitutionStr(c)); - } - } else if (';' == c) { - if (0 == (c = *p++)) { - return; /* oops, unexpected end of string, abort */ - } - - switch (c) { - case 'g': x = kCellCopyright; break; - case 'l': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'a': x = kCellApostrophe; break; - case 'l': x = kCellEllipsis; break; - case 's': x = kCellSemicolon; break; -#if NeedIntlChars - case 'E': x = kCellUpAE; break; - case 'e': x = kCellLoAE; break; - case '.': x = kCellMidDot; break; -#endif - default: x = kCellQuestion; break; - } - break; - case '[': x = kCellLeftDQuote; break; - case '{': x = kCellRightDQuote; break; - case ']': x = kCellLeftSQuote; break; - case '}': x = kCellRightSQuote; break; -#if NeedIntlChars - case '?': x = kCellInvQuestion; break; - case 'A': x = kCellUpARing; break; - case 'C': x = kCellUpCCedilla; break; - case 'O': x = kCellUpOStroke; break; - case 'Q': x = kCellUpLigatureOE; break; - case '`': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'A': x = kCellUpAGrave; break; - case 'E': x = kCellUpEGrave; break; - case 'I': x = kCellUpIGrave; break; - case 'O': x = kCellUpOGrave; break; - case 'U': x = kCellUpUGrave; break; - case 'a': x = kCellLoAGrave; break; - case 'e': x = kCellLoEGrave; break; - case 'i': x = kCellLoIGrave; break; - case 'o': x = kCellLoOGrave; break; - case 'u': x = kCellLoUGrave; break; - default: x = kCellQuestion; break; - } - break; - case 'a': x = kCellLoARing; break; - case 'c': x = kCellLoCCedilla; break; - case 'd': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'A': x = kCellUpACedille; break; - case 'a': x = kCellLoACedille; break; - case 'D': x = kCellUpDStroke; break; - case 'd': x = kCellLoDStroke; break; - case 'E': x = kCellUpECedille; break; - case 'e': x = kCellLoECedille; break; - case 'L': x = kCellUpLBar; break; - case 'l': x = kCellLoLBar; break; - case 'Z': x = kCellUpZDot; break; - case 'z': x = kCellLoZDot; break; - default: x = kCellQuestion; break; - } - break; - case 'e': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'A': x = kCellUpAAcute; break; - case 'E': x = kCellUpEAcute; break; - case 'I': x = kCellUpIAcute; break; - case 'O': x = kCellUpOAcute; break; - case 'U': x = kCellUpUAcute; break; - case 'a': x = kCellLoAAcute; break; - case 'e': x = kCellLoEAcute; break; - case 'i': x = kCellLoIAcute; break; - case 'o': x = kCellLoOAcute; break; - case 'u': x = kCellLoUAcute; break; - - case 'C': x = kCellUpCAcute; break; - case 'c': x = kCellLoCAcute; break; - case 'N': x = kCellUpNAcute; break; - case 'n': x = kCellLoNAcute; break; - case 'S': x = kCellUpSAcute; break; - case 's': x = kCellLoSAcute; break; - case 'Z': x = kCellUpZAcute; break; - case 'z': x = kCellLoZAcute; break; - case 'Y': x = kCellUpYAcute; break; - case 'y': x = kCellLoYAcute; break; - - default: x = kCellQuestion; break; - } - break; - case 'i': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'A': x = kCellUpACircumflex; break; - case 'E': x = kCellUpECircumflex; break; - case 'I': x = kCellUpICircumflex; break; - case 'O': x = kCellUpOCircumflex; break; - case 'U': x = kCellUpUCircumflex; break; - case 'a': x = kCellLoACircumflex; break; - case 'e': x = kCellLoECircumflex; break; - case 'i': x = kCellLoICircumflex; break; - case 'o': x = kCellLoOCircumflex; break; - case 'u': x = kCellLoUCircumflex; break; - default: x = kCellQuestion; break; - } - break; - case 'n': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'A': x = kCellUpATilde; break; - case 'N': x = kCellUpNTilde; break; - case 'O': x = kCellUpOTilde; break; - case 'a': x = kCellLoATilde; break; - case 'n': x = kCellLoNTilde; break; - case 'o': x = kCellLoOTilde; break; - default: x = kCellQuestion; break; - } - break; - case 'o': x = kCellLoOStroke; break; - case 'q': x = kCellLoLigatureOE; break; - case 's': x = kCellSharpS; break; - case 'u': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'A': x = kCellUpADiaeresis; break; - case 'E': x = kCellUpEDiaeresis; break; - case 'I': x = kCellUpIDiaeresis; break; - case 'O': x = kCellUpODiaeresis; break; - case 'U': x = kCellUpUDiaeresis; break; - case 'Y': x = kCellUpYDiaeresis; break; - case 'a': x = kCellLoADiaeresis; break; - case 'e': x = kCellLoEDiaeresis; break; - case 'i': x = kCellLoIDiaeresis; break; - case 'o': x = kCellLoODiaeresis; break; - case 'u': x = kCellLoUDiaeresis; break; - case 'y': x = kCellLoYDiaeresis; break; - default: x = kCellQuestion; break; - } - break; - case 'v': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'C': x = kCellUpCCaron; break; - case 'c': x = kCellLoCCaron; break; - case 'e': x = kCellLoECaron; break; - case 'r': x = kCellLoRCaron; break; - case 's': x = kCellLoSCaron; break; - case 't': x = kCellLoTCaron; break; - case 'z': x = kCellLoZCaron; break; - default: x = kCellQuestion; break; - } - break; - case 'E': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'u': x = kCellLoUDblac; break; - default: x = kCellQuestion; break; - } - break; - case 'r': - if (0 == (c = *p++)) { - /* oops, unexpected end of string, abort */ - return; - } - - switch (c) { - case 'u': x = kCellLoURing; break; - default: x = kCellQuestion; break; - } - break; -#endif - default: x = kCellQuestion; break; - } - ClStrAppendChar(L, r, x); - } else { - switch (c) { - case 'A': x = kCellUpA; break; - case 'B': x = kCellUpB; break; - case 'C': x = kCellUpC; break; - case 'D': x = kCellUpD; break; - case 'E': x = kCellUpE; break; - case 'F': x = kCellUpF; break; - case 'G': x = kCellUpG; break; - case 'H': x = kCellUpH; break; - case 'I': x = kCellUpI; break; - case 'J': x = kCellUpJ; break; - case 'K': x = kCellUpK; break; - case 'L': x = kCellUpL; break; - case 'M': x = kCellUpM; break; - case 'N': x = kCellUpN; break; - case 'O': x = kCellUpO; break; - case 'P': x = kCellUpP; break; - case 'Q': x = kCellUpQ; break; - case 'R': x = kCellUpR; break; - case 'S': x = kCellUpS; break; - case 'T': x = kCellUpT; break; - case 'U': x = kCellUpU; break; - case 'V': x = kCellUpV; break; - case 'W': x = kCellUpW; break; - case 'X': x = kCellUpX; break; - case 'Y': x = kCellUpY; break; - case 'Z': x = kCellUpZ; break; - case 'a': x = kCellLoA; break; - case 'b': x = kCellLoB; break; - case 'c': x = kCellLoC; break; - case 'd': x = kCellLoD; break; - case 'e': x = kCellLoE; break; - case 'f': x = kCellLoF; break; - case 'g': x = kCellLoG; break; - case 'h': x = kCellLoH; break; - case 'i': x = kCellLoI; break; - case 'j': x = kCellLoJ; break; - case 'k': x = kCellLoK; break; - case 'l': x = kCellLoL; break; - case 'm': x = kCellLoM; break; - case 'n': x = kCellLoN; break; - case 'o': x = kCellLoO; break; - case 'p': x = kCellLoP; break; - case 'q': x = kCellLoQ; break; - case 'r': x = kCellLoR; break; - case 's': x = kCellLoS; break; - case 't': x = kCellLoT; break; - case 'u': x = kCellLoU; break; - case 'v': x = kCellLoV; break; - case 'w': x = kCellLoW; break; - case 'x': x = kCellLoX; break; - case 'y': x = kCellLoY; break; - case 'z': x = kCellLoZ; break; - case '0': x = kCellDigit0; break; - case '1': x = kCellDigit1; break; - case '2': x = kCellDigit2; break; - case '3': x = kCellDigit3; break; - case '4': x = kCellDigit4; break; - case '5': x = kCellDigit5; break; - case '6': x = kCellDigit6; break; - case '7': x = kCellDigit7; break; - case '8': x = kCellDigit8; break; - case '9': x = kCellDigit9; break; - case '!': x = kCellExclamation; break; - case '&': x = kCellAmpersand; break; - case '(': x = kCellLeftParen; break; - case ')': x = kCellRightParen; break; - case ',': x = kCellComma; break; - case '-': x = kCellHyphen; break; - case '.': x = kCellPeriod; break; - case '/': x = kCellSlash; break; - case ':': x = kCellColon; break; - case ';': x = kCellSemicolon; break; - case '?': x = kCellQuestion; break; - case '_': x = kCellUnderscore; break; - case ' ': x = kCellSpace; break; - case '\047': x = kCellApostrophe; break; - - default: x = kCellQuestion; break; - } - ClStrAppendChar(L, r, x); - } - } -} - -#define ClStrMaxLength 512 - -LOCALPROC ClStrFromSubstCStr(int *L, uint8_t *r, char *s) -{ - int n = ClStrSizeSubstCStr(s); - - *L = 0; - if (n <= ClStrMaxLength) { - ClStrAppendSubstCStr(L, r, s); - - if (n != *L) { - /* try to ensure mismatch is noticed */ - *L = 0; - } - } -} +char * GetSubstitutionStr(char x); +int ClStrSizeSubstCStr(char *s); +void ClStrAppendChar(int *L0, uint8_t *r, uint8_t c); +void ClStrAppendSubstCStr(int *L, uint8_t *r, char *s); +void ClStrFromSubstCStr(int *L, uint8_t *r, char *s); #endif // INTLCHAR_H diff --git a/src/UI/COMOSGLU.c b/src/UI/COMOSGLU.c index 1f20d52..6921e31 100644 --- a/src/UI/COMOSGLU.c +++ b/src/UI/COMOSGLU.c @@ -18,6 +18,7 @@ COMmon code for Operating System GLUe */ +#include #include "SYSDEPNS.h" #include "GLOBGLUE.h" #include "MYOSGLUE.h" diff --git a/src/UI/CONTROLM.c b/src/UI/CONTROLM.c index fdaec13..21db3ce 100644 --- a/src/UI/CONTROLM.c +++ b/src/UI/CONTROLM.c @@ -49,6 +49,14 @@ typedef void (*SpclModeBody) (void); #define Keyboard_UpdateKeyMap1 Keyboard_UpdateKeyMap #define DisconnectKeyCodes1 DisconnectKeyCodes +bool SpeedStopped = false; +bool RunInBackground = (WantInitRunInBackground != 0); +bool WantFullScreen = (WantInitFullScreen != 0); +bool WantMagnify = (WantInitMagnify != 0); +bool RequestInsertDisk = false; +uint8_t RequestIthDisk = 0; +bool ControlKeyPressed = false; + /* Cell drawing */ LOCALPROC DrawCell(unsigned int h, unsigned int v, int x) diff --git a/src/UI/CONTROLM.h b/src/UI/CONTROLM.h index 362ab7e..3da7bb6 100644 --- a/src/UI/CONTROLM.h +++ b/src/UI/CONTROLM.h @@ -12,11 +12,21 @@ #define CheckRomCheckSum 1 #endif +#ifndef NeedRequestIthDisk +#define NeedRequestIthDisk 0 +#endif + /* Globals */ extern uimr SpecialModes; extern bool NeedWholeScreenDraw; extern uint8_t * CntrlDisplayBuff; +extern bool ControlKeyPressed; +extern bool RequestInsertDisk; +extern bool WantMagnify; +extern bool RunInBackground; +extern bool SpeedStopped; +extern bool WantFullScreen; /* Macros and such */ diff --git a/src/UI/SDL2/CLIPBRD.c b/src/UI/SDL2/CLIPBRD.c new file mode 100644 index 0000000..445326b --- /dev/null +++ b/src/UI/SDL2/CLIPBRD.c @@ -0,0 +1,1060 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "UI/COMOSGLU.h" +#include "STRCONST.h" + +/* --- clipboard --- */ + +#if IncludeHostTextClipExchange +LOCALFUNC uimr MacRoman2UniCodeSize(uint8_t *s, uimr L) +{ + uimr i; + uint8_t x; + uimr n; + uimr v = 0; + + for (i = 0; i < L; ++i) { + x = *s++; + if (x < 128) { + n = 1; + } else { + switch (x) { + case 0x80: n = 2; break; + /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + case 0x81: n = 2; break; + /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + case 0x82: n = 2; break; + /* LATIN CAPITAL LETTER C WITH CEDILLA */ + case 0x83: n = 2; break; + /* LATIN CAPITAL LETTER E WITH ACUTE */ + case 0x84: n = 2; break; + /* LATIN CAPITAL LETTER N WITH TILDE */ + case 0x85: n = 2; break; + /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + case 0x86: n = 2; break; + /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + case 0x87: n = 2; break; + /* LATIN SMALL LETTER A WITH ACUTE */ + case 0x88: n = 2; break; + /* LATIN SMALL LETTER A WITH GRAVE */ + case 0x89: n = 2; break; + /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + case 0x8A: n = 2; break; + /* LATIN SMALL LETTER A WITH DIAERESIS */ + case 0x8B: n = 2; break; + /* LATIN SMALL LETTER A WITH TILDE */ + case 0x8C: n = 2; break; + /* LATIN SMALL LETTER A WITH RING ABOVE */ + case 0x8D: n = 2; break; + /* LATIN SMALL LETTER C WITH CEDILLA */ + case 0x8E: n = 2; break; + /* LATIN SMALL LETTER E WITH ACUTE */ + case 0x8F: n = 2; break; + /* LATIN SMALL LETTER E WITH GRAVE */ + case 0x90: n = 2; break; + /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ + case 0x91: n = 2; break; + /* LATIN SMALL LETTER E WITH DIAERESIS */ + case 0x92: n = 2; break; + /* LATIN SMALL LETTER I WITH ACUTE */ + case 0x93: n = 2; break; + /* LATIN SMALL LETTER I WITH GRAVE */ + case 0x94: n = 2; break; + /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + case 0x95: n = 2; break; + /* LATIN SMALL LETTER I WITH DIAERESIS */ + case 0x96: n = 2; break; + /* LATIN SMALL LETTER N WITH TILDE */ + case 0x97: n = 2; break; + /* LATIN SMALL LETTER O WITH ACUTE */ + case 0x98: n = 2; break; + /* LATIN SMALL LETTER O WITH GRAVE */ + case 0x99: n = 2; break; + /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + case 0x9A: n = 2; break; + /* LATIN SMALL LETTER O WITH DIAERESIS */ + case 0x9B: n = 2; break; + /* LATIN SMALL LETTER O WITH TILDE */ + case 0x9C: n = 2; break; + /* LATIN SMALL LETTER U WITH ACUTE */ + case 0x9D: n = 2; break; + /* LATIN SMALL LETTER U WITH GRAVE */ + case 0x9E: n = 2; break; + /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + case 0x9F: n = 2; break; + /* LATIN SMALL LETTER U WITH DIAERESIS */ + case 0xA0: n = 3; break; + /* DAGGER */ + case 0xA1: n = 2; break; + /* DEGREE SIGN */ + case 0xA2: n = 2; break; + /* CENT SIGN */ + case 0xA3: n = 2; break; + /* POUND SIGN */ + case 0xA4: n = 2; break; + /* SECTION SIGN */ + case 0xA5: n = 3; break; + /* BULLET */ + case 0xA6: n = 2; break; + /* PILCROW SIGN */ + case 0xA7: n = 2; break; + /* LATIN SMALL LETTER SHARP S */ + case 0xA8: n = 2; break; + /* REGISTERED SIGN */ + case 0xA9: n = 2; break; + /* COPYRIGHT SIGN */ + case 0xAA: n = 3; break; + /* TRADE MARK SIGN */ + case 0xAB: n = 2; break; + /* ACUTE ACCENT */ + case 0xAC: n = 2; break; + /* DIAERESIS */ + case 0xAD: n = 3; break; + /* NOT EQUAL TO */ + case 0xAE: n = 2; break; + /* LATIN CAPITAL LETTER AE */ + case 0xAF: n = 2; break; + /* LATIN CAPITAL LETTER O WITH STROKE */ + case 0xB0: n = 3; break; + /* INFINITY */ + case 0xB1: n = 2; break; + /* PLUS-MINUS SIGN */ + case 0xB2: n = 3; break; + /* LESS-THAN OR EQUAL TO */ + case 0xB3: n = 3; break; + /* GREATER-THAN OR EQUAL TO */ + case 0xB4: n = 2; break; + /* YEN SIGN */ + case 0xB5: n = 2; break; + /* MICRO SIGN */ + case 0xB6: n = 3; break; + /* PARTIAL DIFFERENTIAL */ + case 0xB7: n = 3; break; + /* N-ARY SUMMATION */ + case 0xB8: n = 3; break; + /* N-ARY PRODUCT */ + case 0xB9: n = 2; break; + /* GREEK SMALL LETTER PI */ + case 0xBA: n = 3; break; + /* INTEGRAL */ + case 0xBB: n = 2; break; + /* FEMININE ORDINAL INDICATOR */ + case 0xBC: n = 2; break; + /* MASCULINE ORDINAL INDICATOR */ + case 0xBD: n = 2; break; + /* GREEK CAPITAL LETTER OMEGA */ + case 0xBE: n = 2; break; + /* LATIN SMALL LETTER AE */ + case 0xBF: n = 2; break; + /* LATIN SMALL LETTER O WITH STROKE */ + case 0xC0: n = 2; break; + /* INVERTED QUESTION MARK */ + case 0xC1: n = 2; break; + /* INVERTED EXCLAMATION MARK */ + case 0xC2: n = 2; break; + /* NOT SIGN */ + case 0xC3: n = 3; break; + /* SQUARE ROOT */ + case 0xC4: n = 2; break; + /* LATIN SMALL LETTER F WITH HOOK */ + case 0xC5: n = 3; break; + /* ALMOST EQUAL TO */ + case 0xC6: n = 3; break; + /* INCREMENT */ + case 0xC7: n = 2; break; + /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + case 0xC8: n = 2; break; + /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + case 0xC9: n = 3; break; + /* HORIZONTAL ELLIPSIS */ + case 0xCA: n = 2; break; + /* NO-BREAK SPACE */ + case 0xCB: n = 2; break; + /* LATIN CAPITAL LETTER A WITH GRAVE */ + case 0xCC: n = 2; break; + /* LATIN CAPITAL LETTER A WITH TILDE */ + case 0xCD: n = 2; break; + /* LATIN CAPITAL LETTER O WITH TILDE */ + case 0xCE: n = 2; break; + /* LATIN CAPITAL LIGATURE OE */ + case 0xCF: n = 2; break; + /* LATIN SMALL LIGATURE OE */ + case 0xD0: n = 3; break; + /* EN DASH */ + case 0xD1: n = 3; break; + /* EM DASH */ + case 0xD2: n = 3; break; + /* LEFT DOUBLE QUOTATION MARK */ + case 0xD3: n = 3; break; + /* RIGHT DOUBLE QUOTATION MARK */ + case 0xD4: n = 3; break; + /* LEFT SINGLE QUOTATION MARK */ + case 0xD5: n = 3; break; + /* RIGHT SINGLE QUOTATION MARK */ + case 0xD6: n = 2; break; + /* DIVISION SIGN */ + case 0xD7: n = 3; break; + /* LOZENGE */ + case 0xD8: n = 2; break; + /* LATIN SMALL LETTER Y WITH DIAERESIS */ + case 0xD9: n = 2; break; + /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ + case 0xDA: n = 3; break; + /* FRACTION SLASH */ + case 0xDB: n = 3; break; + /* EURO SIGN */ + case 0xDC: n = 3; break; + /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ + case 0xDD: n = 3; break; + /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ + case 0xDE: n = 3; break; + /* LATIN SMALL LIGATURE FI */ + case 0xDF: n = 3; break; + /* LATIN SMALL LIGATURE FL */ + case 0xE0: n = 3; break; + /* DOUBLE DAGGER */ + case 0xE1: n = 2; break; + /* MIDDLE DOT */ + case 0xE2: n = 3; break; + /* SINGLE LOW-9 QUOTATION MARK */ + case 0xE3: n = 3; break; + /* DOUBLE LOW-9 QUOTATION MARK */ + case 0xE4: n = 3; break; + /* PER MILLE SIGN */ + case 0xE5: n = 2; break; + /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + case 0xE6: n = 2; break; + /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ + case 0xE7: n = 2; break; + /* LATIN CAPITAL LETTER A WITH ACUTE */ + case 0xE8: n = 2; break; + /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + case 0xE9: n = 2; break; + /* LATIN CAPITAL LETTER E WITH GRAVE */ + case 0xEA: n = 2; break; + /* LATIN CAPITAL LETTER I WITH ACUTE */ + case 0xEB: n = 2; break; + /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + case 0xEC: n = 2; break; + /* LATIN CAPITAL LETTER I WITH DIAERESIS */ + case 0xED: n = 2; break; + /* LATIN CAPITAL LETTER I WITH GRAVE */ + case 0xEE: n = 2; break; + /* LATIN CAPITAL LETTER O WITH ACUTE */ + case 0xEF: n = 2; break; + /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + case 0xF0: n = 3; break; + /* Apple logo */ + case 0xF1: n = 2; break; + /* LATIN CAPITAL LETTER O WITH GRAVE */ + case 0xF2: n = 2; break; + /* LATIN CAPITAL LETTER U WITH ACUTE */ + case 0xF3: n = 2; break; + /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + case 0xF4: n = 2; break; + /* LATIN CAPITAL LETTER U WITH GRAVE */ + case 0xF5: n = 2; break; + /* LATIN SMALL LETTER DOTLESS I */ + case 0xF6: n = 2; break; + /* MODIFIER LETTER CIRCUMFLEX ACCENT */ + case 0xF7: n = 2; break; + /* SMALL TILDE */ + case 0xF8: n = 2; break; + /* MACRON */ + case 0xF9: n = 2; break; + /* BREVE */ + case 0xFA: n = 2; break; + /* DOT ABOVE */ + case 0xFB: n = 2; break; + /* RING ABOVE */ + case 0xFC: n = 2; break; + /* CEDILLA */ + case 0xFD: n = 2; break; + /* DOUBLE ACUTE ACCENT */ + case 0xFE: n = 2; break; + /* OGONEK */ + case 0xFF: n = 2; break; + /* CARON */ + default: n = 1; break; + /* shouldn't get here */ + } + } + v += n; + } + + return v; +} +#endif + +#if IncludeHostTextClipExchange +LOCALPROC MacRoman2UniCodeData(uint8_t *s, uimr L, char *t) +{ + uimr i; + uint8_t x; + + for (i = 0; i < L; ++i) { + x = *s++; + if (x < 128) { + *t++ = x; + } else { + switch (x) { + case 0x80: *t++ = 0xC3; *t++ = 0x84; break; + /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + case 0x81: *t++ = 0xC3; *t++ = 0x85; break; + /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + case 0x82: *t++ = 0xC3; *t++ = 0x87; break; + /* LATIN CAPITAL LETTER C WITH CEDILLA */ + case 0x83: *t++ = 0xC3; *t++ = 0x89; break; + /* LATIN CAPITAL LETTER E WITH ACUTE */ + case 0x84: *t++ = 0xC3; *t++ = 0x91; break; + /* LATIN CAPITAL LETTER N WITH TILDE */ + case 0x85: *t++ = 0xC3; *t++ = 0x96; break; + /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + case 0x86: *t++ = 0xC3; *t++ = 0x9C; break; + /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + case 0x87: *t++ = 0xC3; *t++ = 0xA1; break; + /* LATIN SMALL LETTER A WITH ACUTE */ + case 0x88: *t++ = 0xC3; *t++ = 0xA0; break; + /* LATIN SMALL LETTER A WITH GRAVE */ + case 0x89: *t++ = 0xC3; *t++ = 0xA2; break; + /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + case 0x8A: *t++ = 0xC3; *t++ = 0xA4; break; + /* LATIN SMALL LETTER A WITH DIAERESIS */ + case 0x8B: *t++ = 0xC3; *t++ = 0xA3; break; + /* LATIN SMALL LETTER A WITH TILDE */ + case 0x8C: *t++ = 0xC3; *t++ = 0xA5; break; + /* LATIN SMALL LETTER A WITH RING ABOVE */ + case 0x8D: *t++ = 0xC3; *t++ = 0xA7; break; + /* LATIN SMALL LETTER C WITH CEDILLA */ + case 0x8E: *t++ = 0xC3; *t++ = 0xA9; break; + /* LATIN SMALL LETTER E WITH ACUTE */ + case 0x8F: *t++ = 0xC3; *t++ = 0xA8; break; + /* LATIN SMALL LETTER E WITH GRAVE */ + case 0x90: *t++ = 0xC3; *t++ = 0xAA; break; + /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ + case 0x91: *t++ = 0xC3; *t++ = 0xAB; break; + /* LATIN SMALL LETTER E WITH DIAERESIS */ + case 0x92: *t++ = 0xC3; *t++ = 0xAD; break; + /* LATIN SMALL LETTER I WITH ACUTE */ + case 0x93: *t++ = 0xC3; *t++ = 0xAC; break; + /* LATIN SMALL LETTER I WITH GRAVE */ + case 0x94: *t++ = 0xC3; *t++ = 0xAE; break; + /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + case 0x95: *t++ = 0xC3; *t++ = 0xAF; break; + /* LATIN SMALL LETTER I WITH DIAERESIS */ + case 0x96: *t++ = 0xC3; *t++ = 0xB1; break; + /* LATIN SMALL LETTER N WITH TILDE */ + case 0x97: *t++ = 0xC3; *t++ = 0xB3; break; + /* LATIN SMALL LETTER O WITH ACUTE */ + case 0x98: *t++ = 0xC3; *t++ = 0xB2; break; + /* LATIN SMALL LETTER O WITH GRAVE */ + case 0x99: *t++ = 0xC3; *t++ = 0xB4; break; + /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + case 0x9A: *t++ = 0xC3; *t++ = 0xB6; break; + /* LATIN SMALL LETTER O WITH DIAERESIS */ + case 0x9B: *t++ = 0xC3; *t++ = 0xB5; break; + /* LATIN SMALL LETTER O WITH TILDE */ + case 0x9C: *t++ = 0xC3; *t++ = 0xBA; break; + /* LATIN SMALL LETTER U WITH ACUTE */ + case 0x9D: *t++ = 0xC3; *t++ = 0xB9; break; + /* LATIN SMALL LETTER U WITH GRAVE */ + case 0x9E: *t++ = 0xC3; *t++ = 0xBB; break; + /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + case 0x9F: *t++ = 0xC3; *t++ = 0xBC; break; + /* LATIN SMALL LETTER U WITH DIAERESIS */ + case 0xA0: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA0; break; + /* DAGGER */ + case 0xA1: *t++ = 0xC2; *t++ = 0xB0; break; + /* DEGREE SIGN */ + case 0xA2: *t++ = 0xC2; *t++ = 0xA2; break; + /* CENT SIGN */ + case 0xA3: *t++ = 0xC2; *t++ = 0xA3; break; + /* POUND SIGN */ + case 0xA4: *t++ = 0xC2; *t++ = 0xA7; break; + /* SECTION SIGN */ + case 0xA5: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA2; break; + /* BULLET */ + case 0xA6: *t++ = 0xC2; *t++ = 0xB6; break; + /* PILCROW SIGN */ + case 0xA7: *t++ = 0xC3; *t++ = 0x9F; break; + /* LATIN SMALL LETTER SHARP S */ + case 0xA8: *t++ = 0xC2; *t++ = 0xAE; break; + /* REGISTERED SIGN */ + case 0xA9: *t++ = 0xC2; *t++ = 0xA9; break; + /* COPYRIGHT SIGN */ + case 0xAA: *t++ = 0xE2; *t++ = 0x84; *t++ = 0xA2; break; + /* TRADE MARK SIGN */ + case 0xAB: *t++ = 0xC2; *t++ = 0xB4; break; + /* ACUTE ACCENT */ + case 0xAC: *t++ = 0xC2; *t++ = 0xA8; break; + /* DIAERESIS */ + case 0xAD: *t++ = 0xE2; *t++ = 0x89; *t++ = 0xA0; break; + /* NOT EQUAL TO */ + case 0xAE: *t++ = 0xC3; *t++ = 0x86; break; + /* LATIN CAPITAL LETTER AE */ + case 0xAF: *t++ = 0xC3; *t++ = 0x98; break; + /* LATIN CAPITAL LETTER O WITH STROKE */ + case 0xB0: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x9E; break; + /* INFINITY */ + case 0xB1: *t++ = 0xC2; *t++ = 0xB1; break; + /* PLUS-MINUS SIGN */ + case 0xB2: *t++ = 0xE2; *t++ = 0x89; *t++ = 0xA4; break; + /* LESS-THAN OR EQUAL TO */ + case 0xB3: *t++ = 0xE2; *t++ = 0x89; *t++ = 0xA5; break; + /* GREATER-THAN OR EQUAL TO */ + case 0xB4: *t++ = 0xC2; *t++ = 0xA5; break; + /* YEN SIGN */ + case 0xB5: *t++ = 0xC2; *t++ = 0xB5; break; + /* MICRO SIGN */ + case 0xB6: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x82; break; + /* PARTIAL DIFFERENTIAL */ + case 0xB7: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x91; break; + /* N-ARY SUMMATION */ + case 0xB8: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x8F; break; + /* N-ARY PRODUCT */ + case 0xB9: *t++ = 0xCF; *t++ = 0x80; break; + /* GREEK SMALL LETTER PI */ + case 0xBA: *t++ = 0xE2; *t++ = 0x88; *t++ = 0xAB; break; + /* INTEGRAL */ + case 0xBB: *t++ = 0xC2; *t++ = 0xAA; break; + /* FEMININE ORDINAL INDICATOR */ + case 0xBC: *t++ = 0xC2; *t++ = 0xBA; break; + /* MASCULINE ORDINAL INDICATOR */ + case 0xBD: *t++ = 0xCE; *t++ = 0xA9; break; + /* GREEK CAPITAL LETTER OMEGA */ + case 0xBE: *t++ = 0xC3; *t++ = 0xA6; break; + /* LATIN SMALL LETTER AE */ + case 0xBF: *t++ = 0xC3; *t++ = 0xB8; break; + /* LATIN SMALL LETTER O WITH STROKE */ + case 0xC0: *t++ = 0xC2; *t++ = 0xBF; break; + /* INVERTED QUESTION MARK */ + case 0xC1: *t++ = 0xC2; *t++ = 0xA1; break; + /* INVERTED EXCLAMATION MARK */ + case 0xC2: *t++ = 0xC2; *t++ = 0xAC; break; + /* NOT SIGN */ + case 0xC3: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x9A; break; + /* SQUARE ROOT */ + case 0xC4: *t++ = 0xC6; *t++ = 0x92; break; + /* LATIN SMALL LETTER F WITH HOOK */ + case 0xC5: *t++ = 0xE2; *t++ = 0x89; *t++ = 0x88; break; + /* ALMOST EQUAL TO */ + case 0xC6: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x86; break; + /* INCREMENT */ + case 0xC7: *t++ = 0xC2; *t++ = 0xAB; break; + /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + case 0xC8: *t++ = 0xC2; *t++ = 0xBB; break; + /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + case 0xC9: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA6; break; + /* HORIZONTAL ELLIPSIS */ + case 0xCA: *t++ = 0xC2; *t++ = 0xA0; break; + /* NO-BREAK SPACE */ + case 0xCB: *t++ = 0xC3; *t++ = 0x80; break; + /* LATIN CAPITAL LETTER A WITH GRAVE */ + case 0xCC: *t++ = 0xC3; *t++ = 0x83; break; + /* LATIN CAPITAL LETTER A WITH TILDE */ + case 0xCD: *t++ = 0xC3; *t++ = 0x95; break; + /* LATIN CAPITAL LETTER O WITH TILDE */ + case 0xCE: *t++ = 0xC5; *t++ = 0x92; break; + /* LATIN CAPITAL LIGATURE OE */ + case 0xCF: *t++ = 0xC5; *t++ = 0x93; break; + /* LATIN SMALL LIGATURE OE */ + case 0xD0: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x93; break; + /* EN DASH */ + case 0xD1: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x94; break; + /* EM DASH */ + case 0xD2: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9C; break; + /* LEFT DOUBLE QUOTATION MARK */ + case 0xD3: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9D; break; + /* RIGHT DOUBLE QUOTATION MARK */ + case 0xD4: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x98; break; + /* LEFT SINGLE QUOTATION MARK */ + case 0xD5: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x99; break; + /* RIGHT SINGLE QUOTATION MARK */ + case 0xD6: *t++ = 0xC3; *t++ = 0xB7; break; + /* DIVISION SIGN */ + case 0xD7: *t++ = 0xE2; *t++ = 0x97; *t++ = 0x8A; break; + /* LOZENGE */ + case 0xD8: *t++ = 0xC3; *t++ = 0xBF; break; + /* LATIN SMALL LETTER Y WITH DIAERESIS */ + case 0xD9: *t++ = 0xC5; *t++ = 0xB8; break; + /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ + case 0xDA: *t++ = 0xE2; *t++ = 0x81; *t++ = 0x84; break; + /* FRACTION SLASH */ + case 0xDB: *t++ = 0xE2; *t++ = 0x82; *t++ = 0xAC; break; + /* EURO SIGN */ + case 0xDC: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xB9; break; + /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ + case 0xDD: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xBA; break; + /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ + case 0xDE: *t++ = 0xEF; *t++ = 0xAC; *t++ = 0x81; break; + /* LATIN SMALL LIGATURE FI */ + case 0xDF: *t++ = 0xEF; *t++ = 0xAC; *t++ = 0x82; break; + /* LATIN SMALL LIGATURE FL */ + case 0xE0: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA1; break; + /* DOUBLE DAGGER */ + case 0xE1: *t++ = 0xC2; *t++ = 0xB7; break; + /* MIDDLE DOT */ + case 0xE2: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9A; break; + /* SINGLE LOW-9 QUOTATION MARK */ + case 0xE3: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9E; break; + /* DOUBLE LOW-9 QUOTATION MARK */ + case 0xE4: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xB0; break; + /* PER MILLE SIGN */ + case 0xE5: *t++ = 0xC3; *t++ = 0x82; break; + /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + case 0xE6: *t++ = 0xC3; *t++ = 0x8A; break; + /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ + case 0xE7: *t++ = 0xC3; *t++ = 0x81; break; + /* LATIN CAPITAL LETTER A WITH ACUTE */ + case 0xE8: *t++ = 0xC3; *t++ = 0x8B; break; + /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + case 0xE9: *t++ = 0xC3; *t++ = 0x88; break; + /* LATIN CAPITAL LETTER E WITH GRAVE */ + case 0xEA: *t++ = 0xC3; *t++ = 0x8D; break; + /* LATIN CAPITAL LETTER I WITH ACUTE */ + case 0xEB: *t++ = 0xC3; *t++ = 0x8E; break; + /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + case 0xEC: *t++ = 0xC3; *t++ = 0x8F; break; + /* LATIN CAPITAL LETTER I WITH DIAERESIS */ + case 0xED: *t++ = 0xC3; *t++ = 0x8C; break; + /* LATIN CAPITAL LETTER I WITH GRAVE */ + case 0xEE: *t++ = 0xC3; *t++ = 0x93; break; + /* LATIN CAPITAL LETTER O WITH ACUTE */ + case 0xEF: *t++ = 0xC3; *t++ = 0x94; break; + /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + case 0xF0: *t++ = 0xEF; *t++ = 0xA3; *t++ = 0xBF; break; + /* Apple logo */ + case 0xF1: *t++ = 0xC3; *t++ = 0x92; break; + /* LATIN CAPITAL LETTER O WITH GRAVE */ + case 0xF2: *t++ = 0xC3; *t++ = 0x9A; break; + /* LATIN CAPITAL LETTER U WITH ACUTE */ + case 0xF3: *t++ = 0xC3; *t++ = 0x9B; break; + /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + case 0xF4: *t++ = 0xC3; *t++ = 0x99; break; + /* LATIN CAPITAL LETTER U WITH GRAVE */ + case 0xF5: *t++ = 0xC4; *t++ = 0xB1; break; + /* LATIN SMALL LETTER DOTLESS I */ + case 0xF6: *t++ = 0xCB; *t++ = 0x86; break; + /* MODIFIER LETTER CIRCUMFLEX ACCENT */ + case 0xF7: *t++ = 0xCB; *t++ = 0x9C; break; + /* SMALL TILDE */ + case 0xF8: *t++ = 0xC2; *t++ = 0xAF; break; + /* MACRON */ + case 0xF9: *t++ = 0xCB; *t++ = 0x98; break; + /* BREVE */ + case 0xFA: *t++ = 0xCB; *t++ = 0x99; break; + /* DOT ABOVE */ + case 0xFB: *t++ = 0xCB; *t++ = 0x9A; break; + /* RING ABOVE */ + case 0xFC: *t++ = 0xC2; *t++ = 0xB8; break; + /* CEDILLA */ + case 0xFD: *t++ = 0xCB; *t++ = 0x9D; break; + /* DOUBLE ACUTE ACCENT */ + case 0xFE: *t++ = 0xCB; *t++ = 0x9B; break; + /* OGONEK */ + case 0xFF: *t++ = 0xCB; *t++ = 0x87; break; + /* CARON */ + default: *t++ = '?'; break; + /* shouldn't get here */ + } + } + } +} +#endif + +#if IncludeHostTextClipExchange +GLOBALOSGLUFUNC MacErr_t HTCEexport(tPbuf i) +{ + MacErr_t err; + char *p; + uint8_t * s = PbufDat[i]; + uimr L = PbufSize[i]; + uimr sz = MacRoman2UniCodeSize(s, L); + + if (NULL == (p = malloc(sz + 1))) { + err = mnvm_miscErr; + } else { + MacRoman2UniCodeData(s, L, p); + p[sz] = 0; + + if (0 != SDL_SetClipboardText(p)) { + err = mnvm_miscErr; + } else { + err = mnvm_noErr; + } + free(p); + } + + return err; +} +#endif + +#if IncludeHostTextClipExchange +LOCALFUNC MacErr_t UniCodeStrLength(char *s, uimr *r) +{ + MacErr_t err; + uint8_t t; + uint8_t t2; + char *p = s; + uimr L = 0; + +label_retry: + if (0 == (t = *p++)) { + err = mnvm_noErr; + /* done */ + } else + if (0 == (0x80 & t)) { + /* One-byte code */ + L += 1; + goto label_retry; + } else + if (0 == (0x40 & t)) { + /* continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (t2 = *p++)) { + err = mnvm_miscErr; + } else + if (0x80 != (0xC0 & t2)) { + /* not a continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (0x20 & t)) { + /* two bytes */ + L += 2; + goto label_retry; + } else + if (0 == (t2 = *p++)) { + err = mnvm_miscErr; + } else + if (0x80 != (0xC0 & t2)) { + /* not a continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (0x10 & t)) { + /* three bytes */ + L += 3; + goto label_retry; + } else + if (0 == (t2 = *p++)) { + err = mnvm_miscErr; + } else + if (0x80 != (0xC0 & t2)) { + /* not a continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (0x08 & t)) { + /* four bytes */ + L += 5; + goto label_retry; + } else + { + err = mnvm_miscErr; + /* longer code not supported yet */ + } + + *r = L; + return err; +} +#endif + +#if IncludeHostTextClipExchange +LOCALFUNC uint8_t UniCodePoint2MacRoman(uint32_t x) +{ +/* + adapted from + http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMAN.TXT +*/ + uint8_t y; + + if (x < 128) { + y = x; + } else { + switch (x) { + case 0x00C4: y = 0x80; break; + /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + case 0x00C5: y = 0x81; break; + /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + case 0x00C7: y = 0x82; break; + /* LATIN CAPITAL LETTER C WITH CEDILLA */ + case 0x00C9: y = 0x83; break; + /* LATIN CAPITAL LETTER E WITH ACUTE */ + case 0x00D1: y = 0x84; break; + /* LATIN CAPITAL LETTER N WITH TILDE */ + case 0x00D6: y = 0x85; break; + /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + case 0x00DC: y = 0x86; break; + /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + case 0x00E1: y = 0x87; break; + /* LATIN SMALL LETTER A WITH ACUTE */ + case 0x00E0: y = 0x88; break; + /* LATIN SMALL LETTER A WITH GRAVE */ + case 0x00E2: y = 0x89; break; + /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + case 0x00E4: y = 0x8A; break; + /* LATIN SMALL LETTER A WITH DIAERESIS */ + case 0x00E3: y = 0x8B; break; + /* LATIN SMALL LETTER A WITH TILDE */ + case 0x00E5: y = 0x8C; break; + /* LATIN SMALL LETTER A WITH RING ABOVE */ + case 0x00E7: y = 0x8D; break; + /* LATIN SMALL LETTER C WITH CEDILLA */ + case 0x00E9: y = 0x8E; break; + /* LATIN SMALL LETTER E WITH ACUTE */ + case 0x00E8: y = 0x8F; break; + /* LATIN SMALL LETTER E WITH GRAVE */ + case 0x00EA: y = 0x90; break; + /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ + case 0x00EB: y = 0x91; break; + /* LATIN SMALL LETTER E WITH DIAERESIS */ + case 0x00ED: y = 0x92; break; + /* LATIN SMALL LETTER I WITH ACUTE */ + case 0x00EC: y = 0x93; break; + /* LATIN SMALL LETTER I WITH GRAVE */ + case 0x00EE: y = 0x94; break; + /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + case 0x00EF: y = 0x95; break; + /* LATIN SMALL LETTER I WITH DIAERESIS */ + case 0x00F1: y = 0x96; break; + /* LATIN SMALL LETTER N WITH TILDE */ + case 0x00F3: y = 0x97; break; + /* LATIN SMALL LETTER O WITH ACUTE */ + case 0x00F2: y = 0x98; break; + /* LATIN SMALL LETTER O WITH GRAVE */ + case 0x00F4: y = 0x99; break; + /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + case 0x00F6: y = 0x9A; break; + /* LATIN SMALL LETTER O WITH DIAERESIS */ + case 0x00F5: y = 0x9B; break; + /* LATIN SMALL LETTER O WITH TILDE */ + case 0x00FA: y = 0x9C; break; + /* LATIN SMALL LETTER U WITH ACUTE */ + case 0x00F9: y = 0x9D; break; + /* LATIN SMALL LETTER U WITH GRAVE */ + case 0x00FB: y = 0x9E; break; + /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + case 0x00FC: y = 0x9F; break; + /* LATIN SMALL LETTER U WITH DIAERESIS */ + case 0x2020: y = 0xA0; break; + /* DAGGER */ + case 0x00B0: y = 0xA1; break; + /* DEGREE SIGN */ + case 0x00A2: y = 0xA2; break; + /* CENT SIGN */ + case 0x00A3: y = 0xA3; break; + /* POUND SIGN */ + case 0x00A7: y = 0xA4; break; + /* SECTION SIGN */ + case 0x2022: y = 0xA5; break; + /* BULLET */ + case 0x00B6: y = 0xA6; break; + /* PILCROW SIGN */ + case 0x00DF: y = 0xA7; break; + /* LATIN SMALL LETTER SHARP S */ + case 0x00AE: y = 0xA8; break; + /* REGISTERED SIGN */ + case 0x00A9: y = 0xA9; break; + /* COPYRIGHT SIGN */ + case 0x2122: y = 0xAA; break; + /* TRADE MARK SIGN */ + case 0x00B4: y = 0xAB; break; + /* ACUTE ACCENT */ + case 0x00A8: y = 0xAC; break; + /* DIAERESIS */ + case 0x2260: y = 0xAD; break; + /* NOT EQUAL TO */ + case 0x00C6: y = 0xAE; break; + /* LATIN CAPITAL LETTER AE */ + case 0x00D8: y = 0xAF; break; + /* LATIN CAPITAL LETTER O WITH STROKE */ + case 0x221E: y = 0xB0; break; + /* INFINITY */ + case 0x00B1: y = 0xB1; break; + /* PLUS-MINUS SIGN */ + case 0x2264: y = 0xB2; break; + /* LESS-THAN OR EQUAL TO */ + case 0x2265: y = 0xB3; break; + /* GREATER-THAN OR EQUAL TO */ + case 0x00A5: y = 0xB4; break; + /* YEN SIGN */ + case 0x00B5: y = 0xB5; break; + /* MICRO SIGN */ + case 0x2202: y = 0xB6; break; + /* PARTIAL DIFFERENTIAL */ + case 0x2211: y = 0xB7; break; + /* N-ARY SUMMATION */ + case 0x220F: y = 0xB8; break; + /* N-ARY PRODUCT */ + case 0x03C0: y = 0xB9; break; + /* GREEK SMALL LETTER PI */ + case 0x222B: y = 0xBA; break; + /* INTEGRAL */ + case 0x00AA: y = 0xBB; break; + /* FEMININE ORDINAL INDICATOR */ + case 0x00BA: y = 0xBC; break; + /* MASCULINE ORDINAL INDICATOR */ + case 0x03A9: y = 0xBD; break; + /* GREEK CAPITAL LETTER OMEGA */ + case 0x00E6: y = 0xBE; break; + /* LATIN SMALL LETTER AE */ + case 0x00F8: y = 0xBF; break; + /* LATIN SMALL LETTER O WITH STROKE */ + case 0x00BF: y = 0xC0; break; + /* INVERTED QUESTION MARK */ + case 0x00A1: y = 0xC1; break; + /* INVERTED EXCLAMATION MARK */ + case 0x00AC: y = 0xC2; break; + /* NOT SIGN */ + case 0x221A: y = 0xC3; break; + /* SQUARE ROOT */ + case 0x0192: y = 0xC4; break; + /* LATIN SMALL LETTER F WITH HOOK */ + case 0x2248: y = 0xC5; break; + /* ALMOST EQUAL TO */ + case 0x2206: y = 0xC6; break; + /* INCREMENT */ + case 0x00AB: y = 0xC7; break; + /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + case 0x00BB: y = 0xC8; break; + /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + case 0x2026: y = 0xC9; break; + /* HORIZONTAL ELLIPSIS */ + case 0x00A0: y = 0xCA; break; + /* NO-BREAK SPACE */ + case 0x00C0: y = 0xCB; break; + /* LATIN CAPITAL LETTER A WITH GRAVE */ + case 0x00C3: y = 0xCC; break; + /* LATIN CAPITAL LETTER A WITH TILDE */ + case 0x00D5: y = 0xCD; break; + /* LATIN CAPITAL LETTER O WITH TILDE */ + case 0x0152: y = 0xCE; break; + /* LATIN CAPITAL LIGATURE OE */ + case 0x0153: y = 0xCF; break; + /* LATIN SMALL LIGATURE OE */ + case 0x2013: y = 0xD0; break; + /* EN DASH */ + case 0x2014: y = 0xD1; break; + /* EM DASH */ + case 0x201C: y = 0xD2; break; + /* LEFT DOUBLE QUOTATION MARK */ + case 0x201D: y = 0xD3; break; + /* RIGHT DOUBLE QUOTATION MARK */ + case 0x2018: y = 0xD4; break; + /* LEFT SINGLE QUOTATION MARK */ + case 0x2019: y = 0xD5; break; + /* RIGHT SINGLE QUOTATION MARK */ + case 0x00F7: y = 0xD6; break; + /* DIVISION SIGN */ + case 0x25CA: y = 0xD7; break; + /* LOZENGE */ + case 0x00FF: y = 0xD8; break; + /* LATIN SMALL LETTER Y WITH DIAERESIS */ + case 0x0178: y = 0xD9; break; + /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ + case 0x2044: y = 0xDA; break; + /* FRACTION SLASH */ + case 0x20AC: y = 0xDB; break; + /* EURO SIGN */ + case 0x2039: y = 0xDC; break; + /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ + case 0x203A: y = 0xDD; break; + /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ + case 0xFB01: y = 0xDE; break; + /* LATIN SMALL LIGATURE FI */ + case 0xFB02: y = 0xDF; break; + /* LATIN SMALL LIGATURE FL */ + case 0x2021: y = 0xE0; break; + /* DOUBLE DAGGER */ + case 0x00B7: y = 0xE1; break; + /* MIDDLE DOT */ + case 0x201A: y = 0xE2; break; + /* SINGLE LOW-9 QUOTATION MARK */ + case 0x201E: y = 0xE3; break; + /* DOUBLE LOW-9 QUOTATION MARK */ + case 0x2030: y = 0xE4; break; + /* PER MILLE SIGN */ + case 0x00C2: y = 0xE5; break; + /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + case 0x00CA: y = 0xE6; break; + /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ + case 0x00C1: y = 0xE7; break; + /* LATIN CAPITAL LETTER A WITH ACUTE */ + case 0x00CB: y = 0xE8; break; + /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + case 0x00C8: y = 0xE9; break; + /* LATIN CAPITAL LETTER E WITH GRAVE */ + case 0x00CD: y = 0xEA; break; + /* LATIN CAPITAL LETTER I WITH ACUTE */ + case 0x00CE: y = 0xEB; break; + /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + case 0x00CF: y = 0xEC; break; + /* LATIN CAPITAL LETTER I WITH DIAERESIS */ + case 0x00CC: y = 0xED; break; + /* LATIN CAPITAL LETTER I WITH GRAVE */ + case 0x00D3: y = 0xEE; break; + /* LATIN CAPITAL LETTER O WITH ACUTE */ + case 0x00D4: y = 0xEF; break; + /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + case 0xF8FF: y = 0xF0; break; + /* Apple logo */ + case 0x00D2: y = 0xF1; break; + /* LATIN CAPITAL LETTER O WITH GRAVE */ + case 0x00DA: y = 0xF2; break; + /* LATIN CAPITAL LETTER U WITH ACUTE */ + case 0x00DB: y = 0xF3; break; + /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + case 0x00D9: y = 0xF4; break; + /* LATIN CAPITAL LETTER U WITH GRAVE */ + case 0x0131: y = 0xF5; break; + /* LATIN SMALL LETTER DOTLESS I */ + case 0x02C6: y = 0xF6; break; + /* MODIFIER LETTER CIRCUMFLEX ACCENT */ + case 0x02DC: y = 0xF7; break; + /* SMALL TILDE */ + case 0x00AF: y = 0xF8; break; + /* MACRON */ + case 0x02D8: y = 0xF9; break; + /* BREVE */ + case 0x02D9: y = 0xFA; break; + /* DOT ABOVE */ + case 0x02DA: y = 0xFB; break; + /* RING ABOVE */ + case 0x00B8: y = 0xFC; break; + /* CEDILLA */ + case 0x02DD: y = 0xFD; break; + /* DOUBLE ACUTE ACCENT */ + case 0x02DB: y = 0xFE; break; + /* OGONEK */ + case 0x02C7: y = 0xFF; break; + /* CARON */ + default: y = '?'; break; + /* unrecognized */ + } + } + + return y; +} +#endif + +#if IncludeHostTextClipExchange +LOCALPROC UniCodeStr2MacRoman(char *s, char *r) +{ + MacErr_t err; + uint8_t t; + uint8_t t2; + uint8_t t3; + uint8_t t4; + uint32_t v; + char *p = s; + char *q = r; + +label_retry: + if (0 == (t = *p++)) { + err = mnvm_noErr; + /* done */ + } else + if (0 == (0x80 & t)) { + *q++ = t; + goto label_retry; + } else + if (0 == (0x40 & t)) { + /* continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (t2 = *p++)) { + err = mnvm_miscErr; + } else + if (0x80 != (0xC0 & t2)) { + /* not a continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (0x20 & t)) { + /* two bytes */ + v = t & 0x1F; + v = (v << 6) | (t2 & 0x3F); + *q++ = UniCodePoint2MacRoman(v); + goto label_retry; + } else + if (0 == (t3 = *p++)) { + err = mnvm_miscErr; + } else + if (0x80 != (0xC0 & t3)) { + /* not a continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (0x10 & t)) { + /* three bytes */ + v = t & 0x0F; + v = (v << 6) | (t3 & 0x3F); + v = (v << 6) | (t2 & 0x3F); + *q++ = UniCodePoint2MacRoman(v); + goto label_retry; + } else + if (0 == (t4 = *p++)) { + err = mnvm_miscErr; + } else + if (0x80 != (0xC0 & t4)) { + /* not a continuation code, error */ + err = mnvm_miscErr; + } else + if (0 == (0x08 & t)) { + /* four bytes */ + v = t & 0x07; + v = (v << 6) | (t4 & 0x3F); + v = (v << 6) | (t3 & 0x3F); + v = (v << 6) | (t2 & 0x3F); + *q++ = UniCodePoint2MacRoman(v); + goto label_retry; + } else + { + err = mnvm_miscErr; + /* longer code not supported yet */ + } +} +#endif + +#if IncludeHostTextClipExchange +GLOBALOSGLUFUNC MacErr_t HTCEimport(tPbuf *r) +{ + MacErr_t err; + uimr L; + char *s = NULL; + tPbuf t = NotAPbuf; + + if (NULL == (s = SDL_GetClipboardText())) { + err = mnvm_miscErr; + } else + if (mnvm_noErr != (err = + UniCodeStrLength(s, &L))) + { + /* fail */ + } else + if (mnvm_noErr != (err = + PbufNew(L, &t))) + { + /* fail */ + } else + { + err = mnvm_noErr; + + UniCodeStr2MacRoman(s, PbufDat[t]); + *r = t; + t = NotAPbuf; + } + + if (NotAPbuf != t) { + PbufDispose(t); + } + if (NULL != s) { + SDL_free(s); + } + + return err; +} +#endif diff --git a/src/UI/SDL2/DBGLOG.c b/src/UI/SDL2/DBGLOG.c new file mode 100644 index 0000000..0f5c54b --- /dev/null +++ b/src/UI/SDL2/DBGLOG.c @@ -0,0 +1,73 @@ +/* --- sending debugging info to file --- */ + +#include +#include +#include +#include "SYSDEPNS.h" +#include "UI/MYOSGLUE.h" + +#if dbglog_HAVE + +#ifndef dbglog_ToStdErr +#define dbglog_ToStdErr 0 +#endif +#ifndef dbglog_ToSDL_Log +#define dbglog_ToSDL_Log 0 +#endif + +#if ! dbglog_ToStdErr +LOCALVAR FILE *dbglog_File = NULL; +#endif + +LOCALFUNC bool dbglog_open0(void) +{ +#if dbglog_ToStdErr || dbglog_ToSDL_Log + return true; +#else + if (NULL == app_parent) { + dbglog_File = fopen("dbglog.txt", "w"); + } else { + char *t; + + if (mnvm_noErr == ChildPath(app_parent, "dbglog.txt", &t)) { + dbglog_File = fopen(t, "w"); + free(t); + } + } + + return (NULL != dbglog_File); +#endif +} + +LOCALPROC dbglog_write0(char *s, uimr L) +{ +#if dbglog_ToStdErr + (void) fwrite(s, 1, L, stderr); +#elif dbglog_ToSDL_Log + char t[256 + 1]; + + if (L > 256) { + L = 256; + } + (void) memcpy(t, s, L); + t[L] = 1; + + SDL_Log("%s", t); +#else + if (dbglog_File != NULL) { + (void) fwrite(s, 1, L, dbglog_File); + } +#endif +} + +LOCALPROC dbglog_close0(void) +{ +#if ! dbglog_ToStdErr + if (dbglog_File != NULL) { + fclose(dbglog_File); + dbglog_File = NULL; + } +#endif +} + +#endif diff --git a/src/UI/SDL2/DRIVES.c b/src/UI/SDL2/DRIVES.c new file mode 100644 index 0000000..1515ae7 --- /dev/null +++ b/src/UI/SDL2/DRIVES.c @@ -0,0 +1,275 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "EMCONFIG.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "UI/COMOSGLU.h" +#include "STRCONST.h" + +/* --- drives --- */ + +#define NotAfileRef NULL + +#ifndef UseRWops +#define UseRWops 0 +#endif + +#if UseRWops +#define FilePtr SDL_RWops * +#define Seek SDL_RWseek +#define SeekSet RW_SEEK_SET +#define SeekCur RW_SEEK_CUR +#define SeekEnd RW_SEEK_END +#define FileRead(ptr, size, nmemb, stream) \ + SDL_RWread(stream, ptr, size, nmemb) +#define FileWrite(ptr, size, nmemb, stream) \ + SDL_RWwrite(stream, ptr, size, nmemb) +#define FileTell SDL_RWtell +#define FileClose SDL_RWclose +#define FileOpen SDL_RWFromFile +#else +#define FilePtr FILE * +#define Seek fseek +#define SeekSet SEEK_SET +#define SeekCur SEEK_CUR +#define SeekEnd SEEK_END +#define FileRead fread +#define FileWrite fwrite +#define FileTell ftell +#define FileClose fclose +#define FileOpen fopen +#define FileEof feof +#endif + +FilePtr Drives[NumDrives]; /* open disk image files */ + +void InitDrives(void) +{ + /* + This isn't really needed, Drives[i] and DriveNames[i] + need not have valid values when not vSonyIsInserted[i]. + */ + tDrive i; + + for (i = 0; i < NumDrives; ++i) { + Drives[i] = NotAfileRef; + } +} + +MacErr_t vSonyTransfer(bool IsWrite, uint8_t * Buffer, + tDrive Drive_No, uint32_t Sony_Start, uint32_t Sony_Count, + uint32_t *Sony_ActCount) +{ + MacErr_t err = mnvm_miscErr; + FilePtr refnum = Drives[Drive_No]; + uint32_t NewSony_Count = 0; + + if (Seek(refnum, Sony_Start, SeekSet) >= 0) { + if (IsWrite) { + NewSony_Count = FileWrite(Buffer, 1, Sony_Count, refnum); + } else { + NewSony_Count = FileRead(Buffer, 1, Sony_Count, refnum); + } + + if (NewSony_Count == Sony_Count) { + err = mnvm_noErr; + } + } + + if (nullpr != Sony_ActCount) { + *Sony_ActCount = NewSony_Count; + } + + return err; /*& figure out what really to return &*/ +} + +MacErr_t vSonyGetSize(tDrive Drive_No, uint32_t *Sony_Count) +{ + MacErr_t err = mnvm_miscErr; + FilePtr refnum = Drives[Drive_No]; + long v; + + if (Seek(refnum, 0, SeekEnd) >= 0) { + v = FileTell(refnum); + if (v >= 0) { + *Sony_Count = v; + err = mnvm_noErr; + } + } + + return err; /*& figure out what really to return &*/ +} + +MacErr_t vSonyEject0(tDrive Drive_No, bool deleteit) +{ + FilePtr refnum = Drives[Drive_No]; + + DiskEjectedNotify(Drive_No); + + FileClose(refnum); + Drives[Drive_No] = NotAfileRef; /* not really needed */ + + return mnvm_noErr; +} + +MacErr_t vSonyEject(tDrive Drive_No) +{ + return vSonyEject0(Drive_No, false); +} + +MacErr_t vSonyEjectDelete(tDrive Drive_No) +{ + return vSonyEject0(Drive_No, true); +} + +// TODO: complete the stub +MacErr_t vSonyGetName (uint16_t Drive_No, uint16_t* r) +{ + memcpy("TEST\0", r, 5); + return mnvm_noErr; +} + + +void UnInitDrives(void) +{ + tDrive i; + + for (i = 0; i < NumDrives; ++i) { + if (vSonyIsInserted(i)) { + (void) vSonyEject(i); + } + } +} + +bool Sony_Insert0(FilePtr refnum, bool locked, char *drivepath) +{ + tDrive Drive_No; + bool IsOk = false; + + if (! FirstFreeDisk(&Drive_No)) { + MacMsg(kStrTooManyImagesTitle, kStrTooManyImagesMessage, + false); + } else { + /* printf("Sony_Insert0 %d\n", (int)Drive_No); */ + + { + Drives[Drive_No] = refnum; + DiskInsertNotify(Drive_No, locked); + + IsOk = true; + } + } + + if (! IsOk) { + FileClose(refnum); + } + + return IsOk; +} + +bool Sony_Insert1(char *drivepath, bool silentfail) +{ + bool locked = false; + /* printf("Sony_Insert1 %s\n", drivepath); */ + FilePtr refnum = FileOpen(drivepath, "rb+"); + if (NULL == refnum) { + locked = true; + refnum = FileOpen(drivepath, "rb"); + } + if (NULL == refnum) { + if (! silentfail) { + MacMsg(kStrOpenFailTitle, kStrOpenFailMessage, false); + } + } else { + return Sony_Insert0(refnum, locked, drivepath); + } + return false; +} + +MacErr_t LoadMacRomFrom(char *path) +{ + MacErr_t err; + FilePtr ROM_File; + int File_Size; + + ROM_File = FileOpen(path, "rb"); + if (NULL == ROM_File) { + err = mnvm_fnfErr; + } else { + File_Size = FileRead(ROM, 1, kROM_Size, ROM_File); + if (File_Size != kROM_Size) { +#ifdef FileEof + if (FileEof(ROM_File)) +#else + if (File_Size > 0) +#endif + { + MacMsgOverride(kStrShortROMTitle, + kStrShortROMMessage); + err = mnvm_eofErr; + } else { + MacMsgOverride(kStrNoReadROMTitle, + kStrNoReadROMMessage); + err = mnvm_miscErr; + } + } else { + err = ROM_IsValid(); + } + FileClose(ROM_File); + } + + return err; +} + +bool Sony_Insert1a(char *drivepath, bool silentfail) +{ + bool v; + + if (! ROM_loaded) { + v = (mnvm_noErr == LoadMacRomFrom(drivepath)); + } else { + v = Sony_Insert1(drivepath, silentfail); + } + + return v; +} + +// TODO: implement stub function (or don't, lol) +bool Sony_Insert2(char *s) +{ + return false; +} + +bool Sony_InsertIth(int i) +{ + bool v; + + if ((i > 9) || ! FirstFreeDisk(nullpr)) { + v = false; + } else { + char s[] = "disk?.dsk"; + + s[4] = '0' + i; + + v = Sony_Insert2(s); + } + + return v; +} + +bool LoadInitialImages(void) +{ + if (! AnyDiskInserted()) { + int i; + + for (i = 1; Sony_InsertIth(i); ++i) { + /* stop on first error (including file not found) */ + } + } + + return true; +} diff --git a/src/UI/SDL2/INTL.c b/src/UI/SDL2/INTL.c new file mode 100644 index 0000000..993d799 --- /dev/null +++ b/src/UI/SDL2/INTL.c @@ -0,0 +1,85 @@ + +/* --- control mode and internationalization --- */ + +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "STRCONST.h" +#include "LANG/INTLCHAR.h" + +#ifndef CanGetAppPath +#define CanGetAppPath 1 +#endif + +LOCALVAR char *d_arg = NULL; +LOCALVAR char *n_arg = NULL; + +#if CanGetAppPath +LOCALVAR char *app_parent = NULL; +LOCALVAR char *pref_dir = NULL; +#endif + +#ifdef _WIN32 +#define PathSep '\\' +#else +#define PathSep '/' +#endif + +MacErr_t ChildPath(char *x, char *y, char **r) +{ + MacErr_t err = mnvm_miscErr; + int nx = strlen(x); + int ny = strlen(y); + { + if ((nx > 0) && (PathSep == x[nx - 1])) { + --nx; + } + { + int nr = nx + 1 + ny; + char *p = malloc(nr + 1); + if (p != NULL) { + char *p2 = p; + (void) memcpy(p2, x, nx); + p2 += nx; + *p2++ = PathSep; + (void) memcpy(p2, y, ny); + p2 += ny; + *p2 = 0; + *r = p; + err = mnvm_noErr; + } + } + } + + return err; +} + +void MayFree(char *p) +{ + if (NULL != p) { + free(p); + } +} + + +/* --- text translation --- */ + +void NativeStrFromCStr(char *r, char *s) +{ + uint8_t ps[ClStrMaxLength]; + int i; + int L; + + ClStrFromSubstCStr(&L, ps, s); + + for (i = 0; i < L; ++i) { + r[i] = Cell2PlainAsciiMap[ps[i]]; + } + + r[L] = 0; +} diff --git a/src/UI/SDL2/KEYBOARD.c b/src/UI/SDL2/KEYBOARD.c new file mode 100644 index 0000000..fabf634 --- /dev/null +++ b/src/UI/SDL2/KEYBOARD.c @@ -0,0 +1,186 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "EMCONFIG.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "STRCONST.h" + +/* --- keyboard input --- */ + +uint8_t SDLScan2MacKeyCode(SDL_Scancode i) +{ + uint8_t v = MKC_None; + + switch (i) { + case SDL_SCANCODE_BACKSPACE: v = MKC_BackSpace; break; + case SDL_SCANCODE_TAB: v = MKC_Tab; break; + case SDL_SCANCODE_CLEAR: v = MKC_Clear; break; + case SDL_SCANCODE_RETURN: v = MKC_Return; break; + case SDL_SCANCODE_PAUSE: v = MKC_Pause; break; + case SDL_SCANCODE_ESCAPE: v = MKC_formac_Escape; break; + case SDL_SCANCODE_SPACE: v = MKC_Space; break; + case SDL_SCANCODE_APOSTROPHE: v = MKC_SingleQuote; break; + case SDL_SCANCODE_COMMA: v = MKC_Comma; break; + case SDL_SCANCODE_MINUS: v = MKC_Minus; break; + case SDL_SCANCODE_PERIOD: v = MKC_Period; break; + case SDL_SCANCODE_SLASH: v = MKC_formac_Slash; break; + case SDL_SCANCODE_0: v = MKC_0; break; + case SDL_SCANCODE_1: v = MKC_1; break; + case SDL_SCANCODE_2: v = MKC_2; break; + case SDL_SCANCODE_3: v = MKC_3; break; + case SDL_SCANCODE_4: v = MKC_4; break; + case SDL_SCANCODE_5: v = MKC_5; break; + case SDL_SCANCODE_6: v = MKC_6; break; + case SDL_SCANCODE_7: v = MKC_7; break; + case SDL_SCANCODE_8: v = MKC_8; break; + case SDL_SCANCODE_9: v = MKC_9; break; + case SDL_SCANCODE_SEMICOLON: v = MKC_SemiColon; break; + case SDL_SCANCODE_EQUALS: v = MKC_Equal; break; + + case SDL_SCANCODE_LEFTBRACKET: v = MKC_LeftBracket; break; + case SDL_SCANCODE_BACKSLASH: v = MKC_formac_BackSlash; break; + case SDL_SCANCODE_RIGHTBRACKET: v = MKC_RightBracket; break; + case SDL_SCANCODE_GRAVE: v = MKC_formac_Grave; break; + + case SDL_SCANCODE_A: v = MKC_A; break; + case SDL_SCANCODE_B: v = MKC_B; break; + case SDL_SCANCODE_C: v = MKC_C; break; + case SDL_SCANCODE_D: v = MKC_D; break; + case SDL_SCANCODE_E: v = MKC_E; break; + case SDL_SCANCODE_F: v = MKC_F; break; + case SDL_SCANCODE_G: v = MKC_G; break; + case SDL_SCANCODE_H: v = MKC_H; break; + case SDL_SCANCODE_I: v = MKC_I; break; + case SDL_SCANCODE_J: v = MKC_J; break; + case SDL_SCANCODE_K: v = MKC_K; break; + case SDL_SCANCODE_L: v = MKC_L; break; + case SDL_SCANCODE_M: v = MKC_M; break; + case SDL_SCANCODE_N: v = MKC_N; break; + case SDL_SCANCODE_O: v = MKC_O; break; + case SDL_SCANCODE_P: v = MKC_P; break; + case SDL_SCANCODE_Q: v = MKC_Q; break; + case SDL_SCANCODE_R: v = MKC_R; break; + case SDL_SCANCODE_S: v = MKC_S; break; + case SDL_SCANCODE_T: v = MKC_T; break; + case SDL_SCANCODE_U: v = MKC_U; break; + case SDL_SCANCODE_V: v = MKC_V; break; + case SDL_SCANCODE_W: v = MKC_W; break; + case SDL_SCANCODE_X: v = MKC_X; break; + case SDL_SCANCODE_Y: v = MKC_Y; break; + case SDL_SCANCODE_Z: v = MKC_Z; break; + + case SDL_SCANCODE_KP_0: v = MKC_KP0; break; + case SDL_SCANCODE_KP_1: v = MKC_KP1; break; + case SDL_SCANCODE_KP_2: v = MKC_KP2; break; + case SDL_SCANCODE_KP_3: v = MKC_KP3; break; + case SDL_SCANCODE_KP_4: v = MKC_KP4; break; + case SDL_SCANCODE_KP_5: v = MKC_KP5; break; + case SDL_SCANCODE_KP_6: v = MKC_KP6; break; + case SDL_SCANCODE_KP_7: v = MKC_KP7; break; + case SDL_SCANCODE_KP_8: v = MKC_KP8; break; + case SDL_SCANCODE_KP_9: v = MKC_KP9; break; + + case SDL_SCANCODE_KP_PERIOD: v = MKC_Decimal; break; + case SDL_SCANCODE_KP_DIVIDE: v = MKC_KPDevide; break; + case SDL_SCANCODE_KP_MULTIPLY: v = MKC_KPMultiply; break; + case SDL_SCANCODE_KP_MINUS: v = MKC_KPSubtract; break; + case SDL_SCANCODE_KP_PLUS: v = MKC_KPAdd; break; + case SDL_SCANCODE_KP_ENTER: v = MKC_formac_Enter; break; + case SDL_SCANCODE_KP_EQUALS: v = MKC_KPEqual; break; + + case SDL_SCANCODE_UP: v = MKC_Up; break; + case SDL_SCANCODE_DOWN: v = MKC_Down; break; + case SDL_SCANCODE_RIGHT: v = MKC_Right; break; + case SDL_SCANCODE_LEFT: v = MKC_Left; break; + case SDL_SCANCODE_INSERT: v = MKC_formac_Help; break; + case SDL_SCANCODE_HOME: v = MKC_formac_Home; break; + case SDL_SCANCODE_END: v = MKC_formac_End; break; + case SDL_SCANCODE_PAGEUP: v = MKC_formac_PageUp; break; + case SDL_SCANCODE_PAGEDOWN: v = MKC_formac_PageDown; break; + + case SDL_SCANCODE_F1: v = MKC_formac_F1; break; + case SDL_SCANCODE_F2: v = MKC_formac_F2; break; + case SDL_SCANCODE_F3: v = MKC_formac_F3; break; + case SDL_SCANCODE_F4: v = MKC_formac_F4; break; + case SDL_SCANCODE_F5: v = MKC_formac_F5; break; + case SDL_SCANCODE_F6: v = MKC_F6; break; + case SDL_SCANCODE_F7: v = MKC_F7; break; + case SDL_SCANCODE_F8: v = MKC_F8; break; + case SDL_SCANCODE_F9: v = MKC_F9; break; + case SDL_SCANCODE_F10: v = MKC_F10; break; + case SDL_SCANCODE_F11: v = MKC_F11; break; + case SDL_SCANCODE_F12: v = MKC_F12; break; + + case SDL_SCANCODE_NUMLOCKCLEAR: + v = MKC_formac_ForwardDel; break; + case SDL_SCANCODE_CAPSLOCK: v = MKC_formac_CapsLock; break; + case SDL_SCANCODE_SCROLLLOCK: v = MKC_ScrollLock; break; + case SDL_SCANCODE_RSHIFT: v = MKC_formac_RShift; break; + case SDL_SCANCODE_LSHIFT: v = MKC_formac_Shift; break; + case SDL_SCANCODE_RCTRL: v = MKC_formac_RControl; break; + case SDL_SCANCODE_LCTRL: v = MKC_formac_Control; break; + case SDL_SCANCODE_RALT: v = MKC_formac_ROption; break; + case SDL_SCANCODE_LALT: v = MKC_formac_Option; break; + case SDL_SCANCODE_RGUI: v = MKC_formac_RCommand; break; + case SDL_SCANCODE_LGUI: v = MKC_formac_Command; break; + /* case SDLK_LSUPER: v = MKC_formac_Option; break; */ + /* case SDLK_RSUPER: v = MKC_formac_ROption; break; */ + + case SDL_SCANCODE_HELP: v = MKC_formac_Help; break; + case SDL_SCANCODE_PRINTSCREEN: v = MKC_Print; break; + + case SDL_SCANCODE_UNDO: v = MKC_formac_F1; break; + case SDL_SCANCODE_CUT: v = MKC_formac_F2; break; + case SDL_SCANCODE_COPY: v = MKC_formac_F3; break; + case SDL_SCANCODE_PASTE: v = MKC_formac_F4; break; + + case SDL_SCANCODE_AC_HOME: v = MKC_formac_Home; break; + + case SDL_SCANCODE_KP_A: v = MKC_A; break; + case SDL_SCANCODE_KP_B: v = MKC_B; break; + case SDL_SCANCODE_KP_C: v = MKC_C; break; + case SDL_SCANCODE_KP_D: v = MKC_D; break; + case SDL_SCANCODE_KP_E: v = MKC_E; break; + case SDL_SCANCODE_KP_F: v = MKC_F; break; + + case SDL_SCANCODE_KP_BACKSPACE: v = MKC_BackSpace; break; + case SDL_SCANCODE_KP_CLEAR: v = MKC_Clear; break; + case SDL_SCANCODE_KP_COMMA: v = MKC_Comma; break; + case SDL_SCANCODE_KP_DECIMAL: v = MKC_Decimal; break; + + default: + break; + } + + return v; +} + +void DoKeyCode(SDL_Keysym *r, bool down) +{ + uint8_t v = SDLScan2MacKeyCode(r->scancode); + if (MKC_None != v) { + Keyboard_UpdateKeyMap2(v, down); + } +} + +void DisableKeyRepeat(void) +{ +} + +void RestoreKeyRepeat(void) +{ +} + +void ReconnectKeyCodes3(void) +{ +} + +void DisconnectKeyCodes3(void) +{ + DisconnectKeyCodes2(); + MouseButtonSet(false); +} diff --git a/src/UI/SDL2/MOUSE.c b/src/UI/SDL2/MOUSE.c new file mode 100644 index 0000000..dcec4a9 --- /dev/null +++ b/src/UI/SDL2/MOUSE.c @@ -0,0 +1,181 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "UI/COMOSGLU.h" +#include "STRCONST.h" +#include "OSGLUSD2.h" + +/* --- mouse --- */ + +/* cursor hiding */ + +bool HaveCursorHidden = false; +bool WantCursorHidden = false; + +void ForceShowCursor(void) +{ + if (HaveCursorHidden) { + HaveCursorHidden = false; + (void) SDL_ShowCursor(SDL_ENABLE); + } +} + +/* cursor moving */ + +#ifndef HaveWorkingWarp +#define HaveWorkingWarp 1 +#endif + +#if EnableMoveMouse && HaveWorkingWarp +bool MoveMouse(int16_t h, int16_t v) +{ +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + h -= ViewHStart; + v -= ViewVStart; + } +#endif + +#if 1 + if (UseMagnify) { + h *= WindowScale; + v *= WindowScale; + } +#endif + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + h += hOffset; + v += vOffset; + } +#endif + + SDL_WarpMouseInWindow(main_wind, h, v); + + return true; +} +#endif + +/* cursor state */ + +void MousePositionNotify(int NewMousePosh, int NewMousePosv) +{ + bool ShouldHaveCursorHidden = true; + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + NewMousePosh -= hOffset; + NewMousePosv -= vOffset; + } +#endif + +#if 1 + if (UseMagnify) { + NewMousePosh /= WindowScale; + NewMousePosv /= WindowScale; + } +#endif + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + NewMousePosh += ViewHStart; + NewMousePosv += ViewVStart; + } +#endif + +#if EnableFSMouseMotion + if (HaveMouseMotion) { + MousePositionSetDelta(NewMousePosh - SavedMouseH, + NewMousePosv - SavedMouseV); + SavedMouseH = NewMousePosh; + SavedMouseV = NewMousePosv; + } else +#endif + { + if (NewMousePosh < 0) { + NewMousePosh = 0; + ShouldHaveCursorHidden = false; + } else if (NewMousePosh >= vMacScreenWidth) { + NewMousePosh = vMacScreenWidth - 1; + ShouldHaveCursorHidden = false; + } + if (NewMousePosv < 0) { + NewMousePosv = 0; + ShouldHaveCursorHidden = false; + } else if (NewMousePosv >= vMacScreenHeight) { + NewMousePosv = vMacScreenHeight - 1; + ShouldHaveCursorHidden = false; + } + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + ShouldHaveCursorHidden = true; + } +#endif + + /* if (ShouldHaveCursorHidden || CurMouseButton) */ + /* + for a game like arkanoid, would like mouse to still + move even when outside window in one direction + */ + MousePositionSet(NewMousePosh, NewMousePosv); + } + + WantCursorHidden = ShouldHaveCursorHidden; +} + +#if EnableFSMouseMotion && ! HaveWorkingWarp +void MousePositionNotifyRelative(int deltah, int deltav) +{ + bool ShouldHaveCursorHidden = true; + +#if 1 + if (UseMagnify) { + /* + This is not really right. If only move one pixel + each time, emulated mouse doesn't move at all. + */ + deltah /= WindowScale; + deltav /= WindowScale; + } +#endif + + MousePositionSetDelta(deltah, + deltav); + + WantCursorHidden = ShouldHaveCursorHidden; +} +#endif + +void CheckMouseState(void) +{ + /* + this doesn't work as desired, doesn't get mouse movements + when outside of our window. + */ + int x; + int y; + + (void) SDL_GetMouseState(&x, &y); + MousePositionNotify(x, y); +} diff --git a/src/UI/SDL2/OSGLUSD2.c b/src/UI/SDL2/OSGLUSD2.c index e364296..1dfb493 100644 --- a/src/UI/SDL2/OSGLUSD2.c +++ b/src/UI/SDL2/OSGLUSD2.c @@ -21,13 +21,17 @@ SDL Library should go here. */ +#include +#include +#include +#include #include "CNFGRAPI.h" #include "SYSDEPNS.h" #include "UTIL/ENDIANAC.h" - #include "UI/MYOSGLUE.h" - #include "STRCONST.h" +#include "OSGLUSD2.h" +#include "LANG/INTLCHAR.h" /* --- some simple utilities --- */ @@ -36,134 +40,6 @@ GLOBALOSGLUPROC MoveBytes(anyp srcPtr, anyp destPtr, int32_t byteCount) (void) memcpy((char *)destPtr, (char *)srcPtr, byteCount); } -/* --- control mode and internationalization --- */ - -#define NeedCell2PlainAsciiMap 1 - -#include "LANG/INTLCHAR.h" - -#ifndef CanGetAppPath -#define CanGetAppPath 1 -#endif - -LOCALVAR char *d_arg = NULL; -LOCALVAR char *n_arg = NULL; - -#if CanGetAppPath -LOCALVAR char *app_parent = NULL; -LOCALVAR char *pref_dir = NULL; -#endif - -#ifdef _WIN32 -#define PathSep '\\' -#else -#define PathSep '/' -#endif - -LOCALFUNC MacErr_t ChildPath(char *x, char *y, char **r) -{ - MacErr_t err = mnvm_miscErr; - int nx = strlen(x); - int ny = strlen(y); - { - if ((nx > 0) && (PathSep == x[nx - 1])) { - --nx; - } - { - int nr = nx + 1 + ny; - char *p = malloc(nr + 1); - if (p != NULL) { - char *p2 = p; - (void) memcpy(p2, x, nx); - p2 += nx; - *p2++ = PathSep; - (void) memcpy(p2, y, ny); - p2 += ny; - *p2 = 0; - *r = p; - err = mnvm_noErr; - } - } - } - - return err; -} - -LOCALPROC MayFree(char *p) -{ - if (NULL != p) { - free(p); - } -} - -/* --- sending debugging info to file --- */ - -#if dbglog_HAVE - -#ifndef dbglog_ToStdErr -#define dbglog_ToStdErr 0 -#endif -#ifndef dbglog_ToSDL_Log -#define dbglog_ToSDL_Log 0 -#endif - -#if ! dbglog_ToStdErr -LOCALVAR FILE *dbglog_File = NULL; -#endif - -LOCALFUNC bool dbglog_open0(void) -{ -#if dbglog_ToStdErr || dbglog_ToSDL_Log - return true; -#else - if (NULL == app_parent) { - dbglog_File = fopen("dbglog.txt", "w"); - } else { - char *t; - - if (mnvm_noErr == ChildPath(app_parent, "dbglog.txt", &t)) { - dbglog_File = fopen(t, "w"); - free(t); - } - } - - return (NULL != dbglog_File); -#endif -} - -LOCALPROC dbglog_write0(char *s, uimr L) -{ -#if dbglog_ToStdErr - (void) fwrite(s, 1, L, stderr); -#elif dbglog_ToSDL_Log - char t[256 + 1]; - - if (L > 256) { - L = 256; - } - (void) memcpy(t, s, L); - t[L] = 1; - - SDL_Log("%s", t); -#else - if (dbglog_File != NULL) { - (void) fwrite(s, 1, L, dbglog_File); - } -#endif -} - -LOCALPROC dbglog_close0(void) -{ -#if ! dbglog_ToStdErr - if (dbglog_File != NULL) { - fclose(dbglog_File); - dbglog_File = NULL; - } -#endif -} - -#endif - /* --- information about the environment --- */ #define WantColorTransValid 0 @@ -172,1847 +48,6 @@ LOCALPROC dbglog_close0(void) #include "UTIL/PBUFSTDC.h" #include "UI/CONTROLM.h" -/* --- text translation --- */ - -LOCALPROC NativeStrFromCStr(char *r, char *s) -{ - uint8_t ps[ClStrMaxLength]; - int i; - int L; - - ClStrFromSubstCStr(&L, ps, s); - - for (i = 0; i < L; ++i) { - r[i] = Cell2PlainAsciiMap[ps[i]]; - } - - r[L] = 0; -} - -/* --- drives --- */ - -#define NotAfileRef NULL - -#ifndef UseRWops -#define UseRWops 0 -#endif - -#if UseRWops -#define FilePtr SDL_RWops * -#define Seek SDL_RWseek -#define SeekSet RW_SEEK_SET -#define SeekCur RW_SEEK_CUR -#define SeekEnd RW_SEEK_END -#define FileRead(ptr, size, nmemb, stream) \ - SDL_RWread(stream, ptr, size, nmemb) -#define FileWrite(ptr, size, nmemb, stream) \ - SDL_RWwrite(stream, ptr, size, nmemb) -#define FileTell SDL_RWtell -#define FileClose SDL_RWclose -#define FileOpen SDL_RWFromFile -#else -#define FilePtr FILE * -#define Seek fseek -#define SeekSet SEEK_SET -#define SeekCur SEEK_CUR -#define SeekEnd SEEK_END -#define FileRead fread -#define FileWrite fwrite -#define FileTell ftell -#define FileClose fclose -#define FileOpen fopen -#define FileEof feof -#endif - -LOCALVAR FilePtr Drives[NumDrives]; /* open disk image files */ - -LOCALPROC InitDrives(void) -{ - /* - This isn't really needed, Drives[i] and DriveNames[i] - need not have valid values when not vSonyIsInserted[i]. - */ - tDrive i; - - for (i = 0; i < NumDrives; ++i) { - Drives[i] = NotAfileRef; - } -} - -GLOBALOSGLUFUNC MacErr_t vSonyTransfer(bool IsWrite, uint8_t * Buffer, - tDrive Drive_No, uint32_t Sony_Start, uint32_t Sony_Count, - uint32_t *Sony_ActCount) -{ - MacErr_t err = mnvm_miscErr; - FilePtr refnum = Drives[Drive_No]; - uint32_t NewSony_Count = 0; - - if (Seek(refnum, Sony_Start, SeekSet) >= 0) { - if (IsWrite) { - NewSony_Count = FileWrite(Buffer, 1, Sony_Count, refnum); - } else { - NewSony_Count = FileRead(Buffer, 1, Sony_Count, refnum); - } - - if (NewSony_Count == Sony_Count) { - err = mnvm_noErr; - } - } - - if (nullpr != Sony_ActCount) { - *Sony_ActCount = NewSony_Count; - } - - return err; /*& figure out what really to return &*/ -} - -GLOBALOSGLUFUNC MacErr_t vSonyGetSize(tDrive Drive_No, uint32_t *Sony_Count) -{ - MacErr_t err = mnvm_miscErr; - FilePtr refnum = Drives[Drive_No]; - long v; - - if (Seek(refnum, 0, SeekEnd) >= 0) { - v = FileTell(refnum); - if (v >= 0) { - *Sony_Count = v; - err = mnvm_noErr; - } - } - - return err; /*& figure out what really to return &*/ -} - -LOCALFUNC MacErr_t vSonyEject0(tDrive Drive_No, bool deleteit) -{ - FilePtr refnum = Drives[Drive_No]; - - DiskEjectedNotify(Drive_No); - - FileClose(refnum); - Drives[Drive_No] = NotAfileRef; /* not really needed */ - - return mnvm_noErr; -} - -GLOBALOSGLUFUNC MacErr_t vSonyEject(tDrive Drive_No) -{ - return vSonyEject0(Drive_No, false); -} - -LOCALPROC UnInitDrives(void) -{ - tDrive i; - - for (i = 0; i < NumDrives; ++i) { - if (vSonyIsInserted(i)) { - (void) vSonyEject(i); - } - } -} - -LOCALFUNC bool Sony_Insert0(FilePtr refnum, bool locked, - char *drivepath) -{ - tDrive Drive_No; - bool IsOk = false; - - if (! FirstFreeDisk(&Drive_No)) { - MacMsg(kStrTooManyImagesTitle, kStrTooManyImagesMessage, - false); - } else { - /* printf("Sony_Insert0 %d\n", (int)Drive_No); */ - - { - Drives[Drive_No] = refnum; - DiskInsertNotify(Drive_No, locked); - - IsOk = true; - } - } - - if (! IsOk) { - FileClose(refnum); - } - - return IsOk; -} - -LOCALFUNC bool Sony_Insert1(char *drivepath, bool silentfail) -{ - bool locked = false; - /* printf("Sony_Insert1 %s\n", drivepath); */ - FilePtr refnum = FileOpen(drivepath, "rb+"); - if (NULL == refnum) { - locked = true; - refnum = FileOpen(drivepath, "rb"); - } - if (NULL == refnum) { - if (! silentfail) { - MacMsg(kStrOpenFailTitle, kStrOpenFailMessage, false); - } - } else { - return Sony_Insert0(refnum, locked, drivepath); - } - return false; -} - -LOCALFUNC MacErr_t LoadMacRomFrom(char *path) -{ - MacErr_t err; - FilePtr ROM_File; - int File_Size; - - ROM_File = FileOpen(path, "rb"); - if (NULL == ROM_File) { - err = mnvm_fnfErr; - } else { - File_Size = FileRead(ROM, 1, kROM_Size, ROM_File); - if (File_Size != kROM_Size) { -#ifdef FileEof - if (FileEof(ROM_File)) -#else - if (File_Size > 0) -#endif - { - MacMsgOverride(kStrShortROMTitle, - kStrShortROMMessage); - err = mnvm_eofErr; - } else { - MacMsgOverride(kStrNoReadROMTitle, - kStrNoReadROMMessage); - err = mnvm_miscErr; - } - } else { - err = ROM_IsValid(); - } - FileClose(ROM_File); - } - - return err; -} - -LOCALFUNC bool Sony_Insert1a(char *drivepath, bool silentfail) -{ - bool v; - - if (! ROM_loaded) { - v = (mnvm_noErr == LoadMacRomFrom(drivepath)); - } else { - v = Sony_Insert1(drivepath, silentfail); - } - - return v; -} - -LOCALFUNC bool Sony_Insert2(char *s) -{ - char *d = -#if CanGetAppPath - (NULL == d_arg) ? app_parent : -#endif - d_arg; - bool IsOk = false; - - if (NULL == d) { - IsOk = Sony_Insert1(s, true); - } else { - char *t; - - if (mnvm_noErr == ChildPath(d, s, &t)) { - IsOk = Sony_Insert1(t, true); - free(t); - } - } - - return IsOk; -} - -LOCALFUNC bool Sony_InsertIth(int i) -{ - bool v; - - if ((i > 9) || ! FirstFreeDisk(nullpr)) { - v = false; - } else { - char s[] = "disk?.dsk"; - - s[4] = '0' + i; - - v = Sony_Insert2(s); - } - - return v; -} - -LOCALFUNC bool LoadInitialImages(void) -{ - if (! AnyDiskInserted()) { - int i; - - for (i = 1; Sony_InsertIth(i); ++i) { - /* stop on first error (including file not found) */ - } - } - - return true; -} - -/* --- ROM --- */ - -LOCALVAR char *rom_path = NULL; - -#if CanGetAppPath -LOCALFUNC MacErr_t LoadMacRomFromPrefDir(void) -{ - MacErr_t err; - char *t = NULL; - char *t2 = NULL; - - if (NULL == pref_dir) { - err = mnvm_fnfErr; - } else - if (mnvm_noErr != (err = - ChildPath(pref_dir, "mnvm_rom", &t))) - { - /* fail */ - } else - if (mnvm_noErr != (err = - ChildPath(t, RomFileName, &t2))) - { - /* fail */ - } else - { - err = LoadMacRomFrom(t2); - } - - MayFree(t2); - MayFree(t); - - return err; -} -#endif - -#if CanGetAppPath -LOCALFUNC MacErr_t LoadMacRomFromAppPar(void) -{ - MacErr_t err; - char *d = (NULL == d_arg) ? app_parent : d_arg; - char *t = NULL; - - if (NULL == d) { - err = mnvm_fnfErr; - } else - if (mnvm_noErr != (err = - ChildPath(d, RomFileName, &t))) - { - /* fail */ - } else - { - err = LoadMacRomFrom(t); - } - - MayFree(t); - - return err; -} -#endif - -LOCALFUNC bool LoadMacRom(void) -{ - MacErr_t err; - - if ((NULL == rom_path) - || (mnvm_fnfErr == (err = LoadMacRomFrom(rom_path)))) -#if CanGetAppPath - if (mnvm_fnfErr == (err = LoadMacRomFromAppPar())) - if (mnvm_fnfErr == (err = LoadMacRomFromPrefDir())) -#endif - if (mnvm_fnfErr == (err = LoadMacRomFrom(RomFileName))) - { - } - - return true; /* keep launching Mini vMac, regardless */ -} - -/* --- video out --- */ - -#if MayFullScreen -LOCALVAR int hOffset; -LOCALVAR int vOffset; -#endif - -#if 1 -LOCALVAR bool UseFullScreen = (WantInitFullScreen != 0); -#endif - -#if 1 -LOCALVAR bool UseMagnify = (WantInitMagnify != 0); -#endif - -#ifndef UseSDLscaling -#define UseSDLscaling 0 -#endif - -LOCALVAR bool gBackgroundFlag = false; -LOCALVAR bool gTrueBackgroundFlag = false; -LOCALVAR bool CurSpeedStopped = true; - -#if 1 && ! UseSDLscaling -#define MaxScale WindowScale -#else -#define MaxScale 1 -#endif - - -LOCALVAR SDL_Window *main_wind = NULL; -LOCALVAR SDL_Renderer *renderer = NULL; -LOCALVAR SDL_Texture *texture = NULL; -LOCALVAR SDL_PixelFormat *format = NULL; - -LOCALVAR uint8_t * ScalingBuff = nullpr; - -LOCALVAR uint8_t * CLUT_final; - -#define CLUT_finalsz (256 * 8 * 4 * MaxScale) - /* - 256 possible values of one byte - 8 pixels per byte maximum (when black and white) - 4 bytes per destination pixel maximum - multiplied by WindowScale if 1 - */ - -#define ScrnMapr_DoMap UpdateBWDepth3Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth4Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth5Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#if 1 && ! UseSDLscaling - -#define ScrnMapr_DoMap UpdateBWDepth3ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth4ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth5ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#endif /* 1 && ! UseSDLscaling */ - - -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - -#define ScrnMapr_DoMap UpdateColorDepth3Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth4Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth5Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#if 1 && ! UseSDLscaling - -#define ScrnMapr_DoMap UpdateColorDepth3ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth4ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth5ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#endif /* 1 && ! UseSDLscaling */ - -#endif - - -LOCALPROC HaveChangedScreenBuff(uint16_t top, uint16_t left, - uint16_t bottom, uint16_t right) -{ - int i; - int j; - uint8_t *p; - Uint32 pixel; -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - Uint32 CLUT_pixel[CLUT_size]; -#endif - Uint32 BWLUT_pixel[2]; - uint32_t top2; - uint32_t left2; - uint32_t bottom2; - uint32_t right2; - void *pixels; - int pitch; - SDL_Rect src_rect; - SDL_Rect dst_rect; - int XDest; - int YDest; - int DestWidth; - int DestHeight; - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - if (top < ViewVStart) { - top = ViewVStart; - } - if (left < ViewHStart) { - left = ViewHStart; - } - if (bottom > ViewVStart + ViewVSize) { - bottom = ViewVStart + ViewVSize; - } - if (right > ViewHStart + ViewHSize) { - right = ViewHStart + ViewHSize; - } - - if ((top >= bottom) || (left >= right)) { - goto label_exit; - } - } -#endif - - XDest = left; - YDest = top; - DestWidth = (right - left); - DestHeight = (bottom - top); - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - XDest -= ViewHStart; - YDest -= ViewVStart; - } -#endif - -#if 1 - if (UseMagnify) { - XDest *= WindowScale; - YDest *= WindowScale; - DestWidth *= WindowScale; - DestHeight *= WindowScale; - } -#endif - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - XDest += hOffset; - YDest += vOffset; - } -#endif - - top2 = top; - left2 = left; - bottom2 = bottom; - right2 = right; - -#if 1 && ! UseSDLscaling - if (UseMagnify) { - top2 *= WindowScale; - left2 *= WindowScale; - bottom2 *= WindowScale; - right2 *= WindowScale; - } -#endif - - if (0 != SDL_LockTexture(texture, NULL, &pixels, &pitch)) { - return; - } - - { - - int bpp = format->BytesPerPixel; - uint32_t ExpectedPitch = vMacScreenWidth * bpp; - -#if 1 && ! UseSDLscaling - if (UseMagnify) { - ExpectedPitch *= WindowScale; - } -#endif - -#if 0 != vMacScreenDepth - if (UseColorMode) { -#if vMacScreenDepth < 4 - for (i = 0; i < CLUT_size; ++i) { - CLUT_pixel[i] = SDL_MapRGB(format, - CLUT_reds[i] >> 8, - CLUT_greens[i] >> 8, - CLUT_blues[i] >> 8); - } -#endif - } else -#endif - { - BWLUT_pixel[1] = SDL_MapRGB(format, 0, 0, 0); - /* black */ - BWLUT_pixel[0] = SDL_MapRGB(format, 255, 255, 255); - /* white */ - } - - if ((0 == ((bpp - 1) & bpp)) /* a power of 2 */ - && (pitch == ExpectedPitch) -#if (vMacScreenDepth > 3) - && ! UseColorMode -#endif - ) - { - int k; - Uint32 v; -#if 1 && ! UseSDLscaling - int a; -#endif - int PixPerByte = -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - UseColorMode ? (1 << (3 - vMacScreenDepth)) : -#endif - 8; - Uint8 *p4 = (Uint8 *)CLUT_final; - - for (i = 0; i < 256; ++i) { - for (k = PixPerByte; --k >= 0; ) { - -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - if (UseColorMode) { - v = CLUT_pixel[ -#if 3 == vMacScreenDepth - i -#else - (i >> (k << vMacScreenDepth)) - & (CLUT_size - 1) -#endif - ]; - } else -#endif - { - v = BWLUT_pixel[(i >> k) & 1]; - } - -#if 1 && ! UseSDLscaling - for (a = UseMagnify ? WindowScale : 1; --a >= 0; ) -#endif - { - switch (bpp) { - case 1: /* Assuming 8-bpp */ - *p4++ = v; - break; - case 2: /* Probably 15-bpp or 16-bpp */ - *(Uint16 *)p4 = v; - p4 += 2; - break; - case 4: /* Probably 32-bpp */ - *(Uint32 *)p4 = v; - p4 += 4; - break; - } - } - } - } - - ScalingBuff = (uint8_t *)pixels; - -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - if (UseColorMode) { -#if 1 && ! UseSDLscaling - if (UseMagnify) { - switch (bpp) { - case 1: - UpdateColorDepth3ScaledCopy( - top, left, bottom, right); - break; - case 2: - UpdateColorDepth4ScaledCopy( - top, left, bottom, right); - break; - case 4: - UpdateColorDepth5ScaledCopy( - top, left, bottom, right); - break; - } - } else -#endif - { - switch (bpp) { - case 1: - UpdateColorDepth3Copy(top, left, bottom, right); - break; - case 2: - UpdateColorDepth4Copy(top, left, bottom, right); - break; - case 4: - UpdateColorDepth5Copy(top, left, bottom, right); - break; - } - } - } else -#endif - { -#if 1 && ! UseSDLscaling - if (UseMagnify) { - switch (bpp) { - case 1: - UpdateBWDepth3ScaledCopy( - top, left, bottom, right); - break; - case 2: - UpdateBWDepth4ScaledCopy( - top, left, bottom, right); - break; - case 4: - UpdateBWDepth5ScaledCopy( - top, left, bottom, right); - break; - } - } else -#endif - { - switch (bpp) { - case 1: - UpdateBWDepth3Copy(top, left, bottom, right); - break; - case 2: - UpdateBWDepth4Copy(top, left, bottom, right); - break; - case 4: - UpdateBWDepth5Copy(top, left, bottom, right); - break; - } - } - } - - } else { - uint8_t *the_data = (uint8_t *)GetCurDrawBuff(); - - /* adapted from putpixel in SDL documentation */ - - for (i = top2; i < bottom2; ++i) { - for (j = left2; j < right2; ++j) { - int i0 = i; - int j0 = j; - Uint8 *bufp = (Uint8 *)pixels - + i * pitch + j * bpp; - -#if 1 && ! UseSDLscaling - if (UseMagnify) { - i0 /= WindowScale; - j0 /= WindowScale; - } -#endif - -#if 0 != vMacScreenDepth - if (UseColorMode) { -#if vMacScreenDepth < 4 - p = the_data + ((i0 * vMacScreenWidth + j0) - >> (3 - vMacScreenDepth)); - { - uint8_t k = (*p >> (((~ j0) - & ((1 << (3 - vMacScreenDepth)) - 1)) - << vMacScreenDepth)) - & (CLUT_size - 1); - pixel = CLUT_pixel[k]; - } -#elif 4 == vMacScreenDepth - p = the_data + ((i0 * vMacScreenWidth + j0) << 1); - { - uint16_t t0 = do_get_mem_word(p); - pixel = SDL_MapRGB(format, - ((t0 & 0x7C00) >> 7) - | ((t0 & 0x7000) >> 12), - ((t0 & 0x03E0) >> 2) - | ((t0 & 0x0380) >> 7), - ((t0 & 0x001F) << 3) - | ((t0 & 0x001C) >> 2)); - } -#elif 5 == vMacScreenDepth - p = the_data + ((i0 * vMacScreenWidth + j0) << 2); - pixel = SDL_MapRGB(format, - p[1], - p[2], - p[3]); -#endif - } else -#endif - { - p = the_data + ((i0 * vMacScreenWidth + j0) / 8); - pixel = BWLUT_pixel[(*p >> ((~ j0) & 0x7)) & 1]; - } - - switch (bpp) { - case 1: /* Assuming 8-bpp */ - *bufp = pixel; - break; - case 2: /* Probably 15-bpp or 16-bpp */ - *(Uint16 *)bufp = pixel; - break; - case 3: - /* Slow 24-bpp mode, usually not used */ - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { - bufp[0] = (pixel >> 16) & 0xff; - bufp[1] = (pixel >> 8) & 0xff; - bufp[2] = pixel & 0xff; - } else { - bufp[0] = pixel & 0xff; - bufp[1] = (pixel >> 8) & 0xff; - bufp[2] = (pixel >> 16) & 0xff; - } - break; - case 4: /* Probably 32-bpp */ - *(Uint32 *)bufp = pixel; - break; - } - } - } - } - - } - - SDL_UnlockTexture(texture); - - src_rect.x = left2; - src_rect.y = top2; - src_rect.w = right2 - left2; - src_rect.h = bottom2 - top2; - - dst_rect.x = XDest; - dst_rect.y = YDest; - dst_rect.w = DestWidth; - dst_rect.h = DestHeight; - - /* SDL_RenderClear(renderer); */ - SDL_RenderCopy(renderer, texture, &src_rect, &dst_rect); - SDL_RenderPresent(renderer); - -#if MayFullScreen -label_exit: - ; -#endif -} - -LOCALPROC DrawChangesAndClear(void) -{ - if (ScreenChangedBottom > ScreenChangedTop) { - HaveChangedScreenBuff(ScreenChangedTop, ScreenChangedLeft, - ScreenChangedBottom, ScreenChangedRight); - ScreenClearChanges(); - } -} - -GLOBALOSGLUPROC DoneWithDrawingForTick(void) -{ -#if EnableFSMouseMotion - if (HaveMouseMotion) { - AutoScrollScreen(); - } -#endif - DrawChangesAndClear(); -} - -/* --- mouse --- */ - -/* cursor hiding */ - -LOCALVAR bool HaveCursorHidden = false; -LOCALVAR bool WantCursorHidden = false; - -LOCALPROC ForceShowCursor(void) -{ - if (HaveCursorHidden) { - HaveCursorHidden = false; - (void) SDL_ShowCursor(SDL_ENABLE); - } -} - -/* cursor moving */ - -#ifndef HaveWorkingWarp -#define HaveWorkingWarp 1 -#endif - -#if EnableMoveMouse && HaveWorkingWarp -LOCALFUNC bool MoveMouse(int16_t h, int16_t v) -{ -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - h -= ViewHStart; - v -= ViewVStart; - } -#endif - -#if 1 - if (UseMagnify) { - h *= WindowScale; - v *= WindowScale; - } -#endif - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - h += hOffset; - v += vOffset; - } -#endif - - SDL_WarpMouseInWindow(main_wind, h, v); - - return true; -} -#endif - -/* cursor state */ - -LOCALPROC MousePositionNotify(int NewMousePosh, int NewMousePosv) -{ - bool ShouldHaveCursorHidden = true; - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - NewMousePosh -= hOffset; - NewMousePosv -= vOffset; - } -#endif - -#if 1 - if (UseMagnify) { - NewMousePosh /= WindowScale; - NewMousePosv /= WindowScale; - } -#endif - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - NewMousePosh += ViewHStart; - NewMousePosv += ViewVStart; - } -#endif - -#if EnableFSMouseMotion - if (HaveMouseMotion) { - MousePositionSetDelta(NewMousePosh - SavedMouseH, - NewMousePosv - SavedMouseV); - SavedMouseH = NewMousePosh; - SavedMouseV = NewMousePosv; - } else -#endif - { - if (NewMousePosh < 0) { - NewMousePosh = 0; - ShouldHaveCursorHidden = false; - } else if (NewMousePosh >= vMacScreenWidth) { - NewMousePosh = vMacScreenWidth - 1; - ShouldHaveCursorHidden = false; - } - if (NewMousePosv < 0) { - NewMousePosv = 0; - ShouldHaveCursorHidden = false; - } else if (NewMousePosv >= vMacScreenHeight) { - NewMousePosv = vMacScreenHeight - 1; - ShouldHaveCursorHidden = false; - } - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - ShouldHaveCursorHidden = true; - } -#endif - - /* if (ShouldHaveCursorHidden || CurMouseButton) */ - /* - for a game like arkanoid, would like mouse to still - move even when outside window in one direction - */ - MousePositionSet(NewMousePosh, NewMousePosv); - } - - WantCursorHidden = ShouldHaveCursorHidden; -} - -#if EnableFSMouseMotion && ! HaveWorkingWarp -LOCALPROC MousePositionNotifyRelative(int deltah, int deltav) -{ - bool ShouldHaveCursorHidden = true; - -#if 1 - if (UseMagnify) { - /* - This is not really right. If only move one pixel - each time, emulated mouse doesn't move at all. - */ - deltah /= WindowScale; - deltav /= WindowScale; - } -#endif - - MousePositionSetDelta(deltah, - deltav); - - WantCursorHidden = ShouldHaveCursorHidden; -} -#endif - -LOCALPROC CheckMouseState(void) -{ - /* - this doesn't work as desired, doesn't get mouse movements - when outside of our window. - */ - int x; - int y; - - (void) SDL_GetMouseState(&x, &y); - MousePositionNotify(x, y); -} - -/* --- keyboard input --- */ - -LOCALFUNC uint8_t SDLScan2MacKeyCode(SDL_Scancode i) -{ - uint8_t v = MKC_None; - - switch (i) { - case SDL_SCANCODE_BACKSPACE: v = MKC_BackSpace; break; - case SDL_SCANCODE_TAB: v = MKC_Tab; break; - case SDL_SCANCODE_CLEAR: v = MKC_Clear; break; - case SDL_SCANCODE_RETURN: v = MKC_Return; break; - case SDL_SCANCODE_PAUSE: v = MKC_Pause; break; - case SDL_SCANCODE_ESCAPE: v = MKC_formac_Escape; break; - case SDL_SCANCODE_SPACE: v = MKC_Space; break; - case SDL_SCANCODE_APOSTROPHE: v = MKC_SingleQuote; break; - case SDL_SCANCODE_COMMA: v = MKC_Comma; break; - case SDL_SCANCODE_MINUS: v = MKC_Minus; break; - case SDL_SCANCODE_PERIOD: v = MKC_Period; break; - case SDL_SCANCODE_SLASH: v = MKC_formac_Slash; break; - case SDL_SCANCODE_0: v = MKC_0; break; - case SDL_SCANCODE_1: v = MKC_1; break; - case SDL_SCANCODE_2: v = MKC_2; break; - case SDL_SCANCODE_3: v = MKC_3; break; - case SDL_SCANCODE_4: v = MKC_4; break; - case SDL_SCANCODE_5: v = MKC_5; break; - case SDL_SCANCODE_6: v = MKC_6; break; - case SDL_SCANCODE_7: v = MKC_7; break; - case SDL_SCANCODE_8: v = MKC_8; break; - case SDL_SCANCODE_9: v = MKC_9; break; - case SDL_SCANCODE_SEMICOLON: v = MKC_SemiColon; break; - case SDL_SCANCODE_EQUALS: v = MKC_Equal; break; - - case SDL_SCANCODE_LEFTBRACKET: v = MKC_LeftBracket; break; - case SDL_SCANCODE_BACKSLASH: v = MKC_formac_BackSlash; break; - case SDL_SCANCODE_RIGHTBRACKET: v = MKC_RightBracket; break; - case SDL_SCANCODE_GRAVE: v = MKC_formac_Grave; break; - - case SDL_SCANCODE_A: v = MKC_A; break; - case SDL_SCANCODE_B: v = MKC_B; break; - case SDL_SCANCODE_C: v = MKC_C; break; - case SDL_SCANCODE_D: v = MKC_D; break; - case SDL_SCANCODE_E: v = MKC_E; break; - case SDL_SCANCODE_F: v = MKC_F; break; - case SDL_SCANCODE_G: v = MKC_G; break; - case SDL_SCANCODE_H: v = MKC_H; break; - case SDL_SCANCODE_I: v = MKC_I; break; - case SDL_SCANCODE_J: v = MKC_J; break; - case SDL_SCANCODE_K: v = MKC_K; break; - case SDL_SCANCODE_L: v = MKC_L; break; - case SDL_SCANCODE_M: v = MKC_M; break; - case SDL_SCANCODE_N: v = MKC_N; break; - case SDL_SCANCODE_O: v = MKC_O; break; - case SDL_SCANCODE_P: v = MKC_P; break; - case SDL_SCANCODE_Q: v = MKC_Q; break; - case SDL_SCANCODE_R: v = MKC_R; break; - case SDL_SCANCODE_S: v = MKC_S; break; - case SDL_SCANCODE_T: v = MKC_T; break; - case SDL_SCANCODE_U: v = MKC_U; break; - case SDL_SCANCODE_V: v = MKC_V; break; - case SDL_SCANCODE_W: v = MKC_W; break; - case SDL_SCANCODE_X: v = MKC_X; break; - case SDL_SCANCODE_Y: v = MKC_Y; break; - case SDL_SCANCODE_Z: v = MKC_Z; break; - - case SDL_SCANCODE_KP_0: v = MKC_KP0; break; - case SDL_SCANCODE_KP_1: v = MKC_KP1; break; - case SDL_SCANCODE_KP_2: v = MKC_KP2; break; - case SDL_SCANCODE_KP_3: v = MKC_KP3; break; - case SDL_SCANCODE_KP_4: v = MKC_KP4; break; - case SDL_SCANCODE_KP_5: v = MKC_KP5; break; - case SDL_SCANCODE_KP_6: v = MKC_KP6; break; - case SDL_SCANCODE_KP_7: v = MKC_KP7; break; - case SDL_SCANCODE_KP_8: v = MKC_KP8; break; - case SDL_SCANCODE_KP_9: v = MKC_KP9; break; - - case SDL_SCANCODE_KP_PERIOD: v = MKC_Decimal; break; - case SDL_SCANCODE_KP_DIVIDE: v = MKC_KPDevide; break; - case SDL_SCANCODE_KP_MULTIPLY: v = MKC_KPMultiply; break; - case SDL_SCANCODE_KP_MINUS: v = MKC_KPSubtract; break; - case SDL_SCANCODE_KP_PLUS: v = MKC_KPAdd; break; - case SDL_SCANCODE_KP_ENTER: v = MKC_formac_Enter; break; - case SDL_SCANCODE_KP_EQUALS: v = MKC_KPEqual; break; - - case SDL_SCANCODE_UP: v = MKC_Up; break; - case SDL_SCANCODE_DOWN: v = MKC_Down; break; - case SDL_SCANCODE_RIGHT: v = MKC_Right; break; - case SDL_SCANCODE_LEFT: v = MKC_Left; break; - case SDL_SCANCODE_INSERT: v = MKC_formac_Help; break; - case SDL_SCANCODE_HOME: v = MKC_formac_Home; break; - case SDL_SCANCODE_END: v = MKC_formac_End; break; - case SDL_SCANCODE_PAGEUP: v = MKC_formac_PageUp; break; - case SDL_SCANCODE_PAGEDOWN: v = MKC_formac_PageDown; break; - - case SDL_SCANCODE_F1: v = MKC_formac_F1; break; - case SDL_SCANCODE_F2: v = MKC_formac_F2; break; - case SDL_SCANCODE_F3: v = MKC_formac_F3; break; - case SDL_SCANCODE_F4: v = MKC_formac_F4; break; - case SDL_SCANCODE_F5: v = MKC_formac_F5; break; - case SDL_SCANCODE_F6: v = MKC_F6; break; - case SDL_SCANCODE_F7: v = MKC_F7; break; - case SDL_SCANCODE_F8: v = MKC_F8; break; - case SDL_SCANCODE_F9: v = MKC_F9; break; - case SDL_SCANCODE_F10: v = MKC_F10; break; - case SDL_SCANCODE_F11: v = MKC_F11; break; - case SDL_SCANCODE_F12: v = MKC_F12; break; - - case SDL_SCANCODE_NUMLOCKCLEAR: - v = MKC_formac_ForwardDel; break; - case SDL_SCANCODE_CAPSLOCK: v = MKC_formac_CapsLock; break; - case SDL_SCANCODE_SCROLLLOCK: v = MKC_ScrollLock; break; - case SDL_SCANCODE_RSHIFT: v = MKC_formac_RShift; break; - case SDL_SCANCODE_LSHIFT: v = MKC_formac_Shift; break; - case SDL_SCANCODE_RCTRL: v = MKC_formac_RControl; break; - case SDL_SCANCODE_LCTRL: v = MKC_formac_Control; break; - case SDL_SCANCODE_RALT: v = MKC_formac_ROption; break; - case SDL_SCANCODE_LALT: v = MKC_formac_Option; break; - case SDL_SCANCODE_RGUI: v = MKC_formac_RCommand; break; - case SDL_SCANCODE_LGUI: v = MKC_formac_Command; break; - /* case SDLK_LSUPER: v = MKC_formac_Option; break; */ - /* case SDLK_RSUPER: v = MKC_formac_ROption; break; */ - - case SDL_SCANCODE_HELP: v = MKC_formac_Help; break; - case SDL_SCANCODE_PRINTSCREEN: v = MKC_Print; break; - - case SDL_SCANCODE_UNDO: v = MKC_formac_F1; break; - case SDL_SCANCODE_CUT: v = MKC_formac_F2; break; - case SDL_SCANCODE_COPY: v = MKC_formac_F3; break; - case SDL_SCANCODE_PASTE: v = MKC_formac_F4; break; - - case SDL_SCANCODE_AC_HOME: v = MKC_formac_Home; break; - - case SDL_SCANCODE_KP_A: v = MKC_A; break; - case SDL_SCANCODE_KP_B: v = MKC_B; break; - case SDL_SCANCODE_KP_C: v = MKC_C; break; - case SDL_SCANCODE_KP_D: v = MKC_D; break; - case SDL_SCANCODE_KP_E: v = MKC_E; break; - case SDL_SCANCODE_KP_F: v = MKC_F; break; - - case SDL_SCANCODE_KP_BACKSPACE: v = MKC_BackSpace; break; - case SDL_SCANCODE_KP_CLEAR: v = MKC_Clear; break; - case SDL_SCANCODE_KP_COMMA: v = MKC_Comma; break; - case SDL_SCANCODE_KP_DECIMAL: v = MKC_Decimal; break; - - default: - break; - } - - return v; -} - -LOCALPROC DoKeyCode(SDL_Keysym *r, bool down) -{ - uint8_t v = SDLScan2MacKeyCode(r->scancode); - if (MKC_None != v) { - Keyboard_UpdateKeyMap2(v, down); - } -} - -LOCALPROC DisableKeyRepeat(void) -{ -} - -LOCALPROC RestoreKeyRepeat(void) -{ -} - -LOCALPROC ReconnectKeyCodes3(void) -{ -} - -LOCALPROC DisconnectKeyCodes3(void) -{ - DisconnectKeyCodes2(); - MouseButtonSet(false); -} - -/* --- time, date, location --- */ - -#define dbglog_TimeStuff (0 && dbglog_HAVE) - -LOCALVAR uint32_t TrueEmulatedTime = 0; - -#define InvTimeDivPow 16 -#define InvTimeDiv (1 << InvTimeDivPow) -#define InvTimeDivMask (InvTimeDiv - 1) -#define InvTimeStep 1089590 /* 1000 / 60.14742 * InvTimeDiv */ - -LOCALVAR Uint32 LastTime; - -LOCALVAR Uint32 NextIntTime; -LOCALVAR uint32_t NextFracTime; - -LOCALPROC IncrNextTime(void) -{ - NextFracTime += InvTimeStep; - NextIntTime += (NextFracTime >> InvTimeDivPow); - NextFracTime &= InvTimeDivMask; -} - -LOCALPROC InitNextTime(void) -{ - NextIntTime = LastTime; - NextFracTime = 0; - IncrNextTime(); -} - -LOCALVAR uint32_t NewMacDateInSeconds; - -LOCALFUNC bool UpdateTrueEmulatedTime(void) -{ - Uint32 LatestTime; - int32_t TimeDiff; - - LatestTime = SDL_GetTicks(); - if (LatestTime != LastTime) { - - NewMacDateInSeconds = LatestTime / 1000; - /* no date and time api in SDL */ - - LastTime = LatestTime; - TimeDiff = (LatestTime - NextIntTime); - /* this should work even when time wraps */ - if (TimeDiff >= 0) { - if (TimeDiff > 256) { - /* emulation interrupted, forget it */ - ++TrueEmulatedTime; - InitNextTime(); - -#if dbglog_TimeStuff - dbglog_writelnNum("emulation interrupted", - TrueEmulatedTime); -#endif - } else { - do { - ++TrueEmulatedTime; - IncrNextTime(); - TimeDiff = (LatestTime - NextIntTime); - } while (TimeDiff >= 0); - } - return true; - } else { - if (TimeDiff < -256) { -#if dbglog_TimeStuff - dbglog_writeln("clock set back"); -#endif - /* clock goofed if ever get here, reset */ - InitNextTime(); - } - } - } - return false; -} - - -LOCALFUNC bool CheckDateTime(void) -{ - if (CurMacDateInSeconds != NewMacDateInSeconds) { - CurMacDateInSeconds = NewMacDateInSeconds; - return true; - } else { - return false; - } -} - -LOCALPROC StartUpTimeAdjust(void) -{ - LastTime = SDL_GetTicks(); - InitNextTime(); -} - -LOCALFUNC bool InitLocationDat(void) -{ - LastTime = SDL_GetTicks(); - InitNextTime(); - NewMacDateInSeconds = LastTime / 1000; - CurMacDateInSeconds = NewMacDateInSeconds; - - return true; -} - -/* --- sound --- */ - -#if SoundEnabled - -#define kLn2SoundBuffers 4 /* kSoundBuffers must be a power of two */ -#define kSoundBuffers (1 << kLn2SoundBuffers) -#define kSoundBuffMask (kSoundBuffers - 1) - -#define DesiredMinFilledSoundBuffs 3 - /* - if too big then sound lags behind emulation. - if too small then sound will have pauses. - */ - -#define kLnOneBuffLen 9 -#define kLnAllBuffLen (kLn2SoundBuffers + kLnOneBuffLen) -#define kOneBuffLen (1UL << kLnOneBuffLen) -#define kAllBuffLen (1UL << kLnAllBuffLen) -#define kLnOneBuffSz (kLnOneBuffLen + kLn2SoundSampSz - 3) -#define kLnAllBuffSz (kLnAllBuffLen + kLn2SoundSampSz - 3) -#define kOneBuffSz (1UL << kLnOneBuffSz) -#define kAllBuffSz (1UL << kLnAllBuffSz) -#define kOneBuffMask (kOneBuffLen - 1) -#define kAllBuffMask (kAllBuffLen - 1) -#define dbhBufferSize (kAllBuffSz + kOneBuffSz) - -#define dbglog_SoundStuff (0 && dbglog_HAVE) -#define dbglog_SoundBuffStats (0 && dbglog_HAVE) - -LOCALVAR tpSoundSamp TheSoundBuffer = nullpr; -volatile static uint16_t ThePlayOffset; -volatile static uint16_t TheFillOffset; -volatile static uint16_t MinFilledSoundBuffs; -#if dbglog_SoundBuffStats -LOCALVAR uint16_t MaxFilledSoundBuffs; -#endif -LOCALVAR uint16_t TheWriteOffset; - -LOCALPROC Sound_Init0(void) -{ - ThePlayOffset = 0; - TheFillOffset = 0; - TheWriteOffset = 0; -} - -LOCALPROC Sound_Start0(void) -{ - /* Reset variables */ - MinFilledSoundBuffs = kSoundBuffers + 1; -#if dbglog_SoundBuffStats - MaxFilledSoundBuffs = 0; -#endif -} - -GLOBALOSGLUFUNC tpSoundSamp Sound_BeginWrite(uint16_t n, uint16_t *actL) -{ - uint16_t ToFillLen = kAllBuffLen - (TheWriteOffset - ThePlayOffset); - uint16_t WriteBuffContig = - kOneBuffLen - (TheWriteOffset & kOneBuffMask); - - if (WriteBuffContig < n) { - n = WriteBuffContig; - } - if (ToFillLen < n) { - /* overwrite previous buffer */ -#if dbglog_SoundStuff - dbglog_writeln("sound buffer over flow"); -#endif - TheWriteOffset -= kOneBuffLen; - } - - *actL = n; - return TheSoundBuffer + (TheWriteOffset & kAllBuffMask); -} - -#if 4 == kLn2SoundSampSz -LOCALPROC ConvertSoundBlockToNative(tpSoundSamp p) -{ - int i; - - for (i = kOneBuffLen; --i >= 0; ) { - *p++ -= 0x8000; - } -} -#else -#define ConvertSoundBlockToNative(p) -#endif - -LOCALPROC Sound_WroteABlock(void) -{ -#if (4 == kLn2SoundSampSz) - uint16_t PrevWriteOffset = TheWriteOffset - kOneBuffLen; - tpSoundSamp p = TheSoundBuffer + (PrevWriteOffset & kAllBuffMask); -#endif - -#if dbglog_SoundStuff - dbglog_writeln("enter Sound_WroteABlock"); -#endif - - ConvertSoundBlockToNative(p); - - TheFillOffset = TheWriteOffset; - -#if dbglog_SoundBuffStats - { - uint16_t ToPlayLen = TheFillOffset - - ThePlayOffset; - uint16_t ToPlayBuffs = ToPlayLen >> kLnOneBuffLen; - - if (ToPlayBuffs > MaxFilledSoundBuffs) { - MaxFilledSoundBuffs = ToPlayBuffs; - } - } -#endif -} - -LOCALFUNC bool Sound_EndWrite0(uint16_t actL) -{ - bool v; - - TheWriteOffset += actL; - - if (0 != (TheWriteOffset & kOneBuffMask)) { - v = false; - } else { - /* just finished a block */ - - Sound_WroteABlock(); - - v = true; - } - - return v; -} - -LOCALPROC Sound_SecondNotify0(void) -{ - if (MinFilledSoundBuffs <= kSoundBuffers) { - if (MinFilledSoundBuffs > DesiredMinFilledSoundBuffs) { -#if dbglog_SoundStuff - dbglog_writeln("MinFilledSoundBuffs too high"); -#endif - IncrNextTime(); - } else if (MinFilledSoundBuffs < DesiredMinFilledSoundBuffs) { -#if dbglog_SoundStuff - dbglog_writeln("MinFilledSoundBuffs too low"); -#endif - ++TrueEmulatedTime; - } -#if dbglog_SoundBuffStats - dbglog_writelnNum("MinFilledSoundBuffs", - MinFilledSoundBuffs); - dbglog_writelnNum("MaxFilledSoundBuffs", - MaxFilledSoundBuffs); - MaxFilledSoundBuffs = 0; -#endif - MinFilledSoundBuffs = kSoundBuffers + 1; - } -} - -typedef uint16_t trSoundTemp; - -#define kCenterTempSound 0x8000 - -#define AudioStepVal 0x0040 - -#if 3 == kLn2SoundSampSz -#define ConvertTempSoundSampleFromNative(v) ((v) << 8) -#elif 4 == kLn2SoundSampSz -#define ConvertTempSoundSampleFromNative(v) ((v) + kCenterSound) -#else -#error "unsupported kLn2SoundSampSz" -#endif - -#if 3 == kLn2SoundSampSz -#define ConvertTempSoundSampleToNative(v) ((v) >> 8) -#elif 4 == kLn2SoundSampSz -#define ConvertTempSoundSampleToNative(v) ((v) - kCenterSound) -#else -#error "unsupported kLn2SoundSampSz" -#endif - -LOCALPROC SoundRampTo(trSoundTemp *last_val, trSoundTemp dst_val, - tpSoundSamp *stream, int *len) -{ - trSoundTemp diff; - tpSoundSamp p = *stream; - int n = *len; - trSoundTemp v1 = *last_val; - - while ((v1 != dst_val) && (0 != n)) { - if (v1 > dst_val) { - diff = v1 - dst_val; - if (diff > AudioStepVal) { - v1 -= AudioStepVal; - } else { - v1 = dst_val; - } - } else { - diff = dst_val - v1; - if (diff > AudioStepVal) { - v1 += AudioStepVal; - } else { - v1 = dst_val; - } - } - - --n; - *p++ = ConvertTempSoundSampleToNative(v1); - } - - *stream = p; - *len = n; - *last_val = v1; -} - -struct SoundR { - tpSoundSamp fTheSoundBuffer; - volatile uint16_t (*fPlayOffset); - volatile uint16_t (*fFillOffset); - volatile uint16_t (*fMinFilledSoundBuffs); - - volatile trSoundTemp lastv; - - bool wantplaying; - bool HaveStartedPlaying; -}; -typedef struct SoundR SoundR; - -static void audio_callback(void *udata, Uint8 *stream, int len) -{ - uint16_t ToPlayLen; - uint16_t FilledSoundBuffs; - int i; - SoundR *datp = (SoundR *)udata; - tpSoundSamp CurSoundBuffer = datp->fTheSoundBuffer; - uint16_t CurPlayOffset = *datp->fPlayOffset; - trSoundTemp v0 = datp->lastv; - trSoundTemp v1 = v0; - tpSoundSamp dst = (tpSoundSamp)stream; - -#if kLn2SoundSampSz > 3 - len >>= (kLn2SoundSampSz - 3); -#endif - -#if dbglog_SoundStuff - dbglog_writeln("Enter audio_callback"); - dbglog_writelnNum("len", len); -#endif - -label_retry: - ToPlayLen = *datp->fFillOffset - CurPlayOffset; - FilledSoundBuffs = ToPlayLen >> kLnOneBuffLen; - - if (! datp->wantplaying) { -#if dbglog_SoundStuff - dbglog_writeln("playing end transistion"); -#endif - - SoundRampTo(&v1, kCenterTempSound, &dst, &len); - - ToPlayLen = 0; - } else if (! datp->HaveStartedPlaying) { -#if dbglog_SoundStuff - dbglog_writeln("playing start block"); -#endif - - if ((ToPlayLen >> kLnOneBuffLen) < 8) { - ToPlayLen = 0; - } else { - tpSoundSamp p = datp->fTheSoundBuffer - + (CurPlayOffset & kAllBuffMask); - trSoundTemp v2 = ConvertTempSoundSampleFromNative(*p); - -#if dbglog_SoundStuff - dbglog_writeln("have enough samples to start"); -#endif - - SoundRampTo(&v1, v2, &dst, &len); - - if (v1 == v2) { -#if dbglog_SoundStuff - dbglog_writeln("finished start transition"); -#endif - - datp->HaveStartedPlaying = true; - } - } - } - - if (0 == len) { - /* done */ - - if (FilledSoundBuffs < *datp->fMinFilledSoundBuffs) { - *datp->fMinFilledSoundBuffs = FilledSoundBuffs; - } - } else if (0 == ToPlayLen) { - -#if dbglog_SoundStuff - dbglog_writeln("under run"); -#endif - - for (i = 0; i < len; ++i) { - *dst++ = ConvertTempSoundSampleToNative(v1); - } - *datp->fMinFilledSoundBuffs = 0; - } else { - uint16_t PlayBuffContig = kAllBuffLen - - (CurPlayOffset & kAllBuffMask); - tpSoundSamp p = CurSoundBuffer - + (CurPlayOffset & kAllBuffMask); - - if (ToPlayLen > PlayBuffContig) { - ToPlayLen = PlayBuffContig; - } - if (ToPlayLen > len) { - ToPlayLen = len; - } - - for (i = 0; i < ToPlayLen; ++i) { - *dst++ = *p++; - } - v1 = ConvertTempSoundSampleFromNative(p[-1]); - - CurPlayOffset += ToPlayLen; - len -= ToPlayLen; - - *datp->fPlayOffset = CurPlayOffset; - - goto label_retry; - } - - datp->lastv = v1; -} - -LOCALVAR SoundR cur_audio; - -LOCALVAR bool HaveSoundOut = false; - -LOCALPROC Sound_Stop(void) -{ -#if dbglog_SoundStuff - dbglog_writeln("enter Sound_Stop"); -#endif - - if (cur_audio.wantplaying && HaveSoundOut) { - uint16_t retry_limit = 50; /* half of a second */ - - cur_audio.wantplaying = false; - -label_retry: - if (kCenterTempSound == cur_audio.lastv) { -#if dbglog_SoundStuff - dbglog_writeln("reached kCenterTempSound"); -#endif - - /* done */ - } else if (0 == --retry_limit) { -#if dbglog_SoundStuff - dbglog_writeln("retry limit reached"); -#endif - /* done */ - } else - { - /* - give time back, particularly important - if got here on a suspend event. - */ - -#if dbglog_SoundStuff - dbglog_writeln("busy, so sleep"); -#endif - - (void) SDL_Delay(10); - - goto label_retry; - } - - SDL_PauseAudio(1); - } - -#if dbglog_SoundStuff - dbglog_writeln("leave Sound_Stop"); -#endif -} - -LOCALPROC Sound_Start(void) -{ - if ((! cur_audio.wantplaying) && HaveSoundOut) { - Sound_Start0(); - cur_audio.lastv = kCenterTempSound; - cur_audio.HaveStartedPlaying = false; - cur_audio.wantplaying = true; - - SDL_PauseAudio(0); - } -} - -LOCALPROC Sound_UnInit(void) -{ - if (HaveSoundOut) { - SDL_CloseAudio(); - } -} - -#define SOUND_SAMPLERATE 22255 /* = round(7833600 * 2 / 704) */ - -LOCALFUNC bool Sound_Init(void) -{ - SDL_AudioSpec desired; - - Sound_Init0(); - - cur_audio.fTheSoundBuffer = TheSoundBuffer; - cur_audio.fPlayOffset = &ThePlayOffset; - cur_audio.fFillOffset = &TheFillOffset; - cur_audio.fMinFilledSoundBuffs = &MinFilledSoundBuffs; - cur_audio.wantplaying = false; - - desired.freq = SOUND_SAMPLERATE; - -#if 3 == kLn2SoundSampSz - desired.format = AUDIO_U8; -#elif 4 == kLn2SoundSampSz - desired.format = AUDIO_S16SYS; -#else -#error "unsupported audio format" -#endif - - desired.channels = 1; - desired.samples = 1024; - desired.callback = audio_callback; - desired.userdata = (void *)&cur_audio; - - /* Open the audio device */ - if (SDL_OpenAudio(&desired, NULL) < 0) { - fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); - } else { - HaveSoundOut = true; - - Sound_Start(); - /* - This should be taken care of by LeaveSpeedStopped, - but since takes a while to get going properly, - start early. - */ - } - - return true; /* keep going, even if no sound */ -} - -GLOBALOSGLUPROC Sound_EndWrite(uint16_t actL) -{ - if (Sound_EndWrite0(actL)) { - } -} - -LOCALPROC Sound_SecondNotify(void) -{ - if (HaveSoundOut) { - Sound_SecondNotify0(); - } -} - -#endif - /* --- basic dialogs --- */ LOCALPROC CheckSavedMacMsg(void) @@ -2041,1056 +76,6 @@ LOCALPROC CheckSavedMacMsg(void) } } -/* --- clipboard --- */ - -#if IncludeHostTextClipExchange -LOCALFUNC uimr MacRoman2UniCodeSize(uint8_t *s, uimr L) -{ - uimr i; - uint8_t x; - uimr n; - uimr v = 0; - - for (i = 0; i < L; ++i) { - x = *s++; - if (x < 128) { - n = 1; - } else { - switch (x) { - case 0x80: n = 2; break; - /* LATIN CAPITAL LETTER A WITH DIAERESIS */ - case 0x81: n = 2; break; - /* LATIN CAPITAL LETTER A WITH RING ABOVE */ - case 0x82: n = 2; break; - /* LATIN CAPITAL LETTER C WITH CEDILLA */ - case 0x83: n = 2; break; - /* LATIN CAPITAL LETTER E WITH ACUTE */ - case 0x84: n = 2; break; - /* LATIN CAPITAL LETTER N WITH TILDE */ - case 0x85: n = 2; break; - /* LATIN CAPITAL LETTER O WITH DIAERESIS */ - case 0x86: n = 2; break; - /* LATIN CAPITAL LETTER U WITH DIAERESIS */ - case 0x87: n = 2; break; - /* LATIN SMALL LETTER A WITH ACUTE */ - case 0x88: n = 2; break; - /* LATIN SMALL LETTER A WITH GRAVE */ - case 0x89: n = 2; break; - /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ - case 0x8A: n = 2; break; - /* LATIN SMALL LETTER A WITH DIAERESIS */ - case 0x8B: n = 2; break; - /* LATIN SMALL LETTER A WITH TILDE */ - case 0x8C: n = 2; break; - /* LATIN SMALL LETTER A WITH RING ABOVE */ - case 0x8D: n = 2; break; - /* LATIN SMALL LETTER C WITH CEDILLA */ - case 0x8E: n = 2; break; - /* LATIN SMALL LETTER E WITH ACUTE */ - case 0x8F: n = 2; break; - /* LATIN SMALL LETTER E WITH GRAVE */ - case 0x90: n = 2; break; - /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ - case 0x91: n = 2; break; - /* LATIN SMALL LETTER E WITH DIAERESIS */ - case 0x92: n = 2; break; - /* LATIN SMALL LETTER I WITH ACUTE */ - case 0x93: n = 2; break; - /* LATIN SMALL LETTER I WITH GRAVE */ - case 0x94: n = 2; break; - /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ - case 0x95: n = 2; break; - /* LATIN SMALL LETTER I WITH DIAERESIS */ - case 0x96: n = 2; break; - /* LATIN SMALL LETTER N WITH TILDE */ - case 0x97: n = 2; break; - /* LATIN SMALL LETTER O WITH ACUTE */ - case 0x98: n = 2; break; - /* LATIN SMALL LETTER O WITH GRAVE */ - case 0x99: n = 2; break; - /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ - case 0x9A: n = 2; break; - /* LATIN SMALL LETTER O WITH DIAERESIS */ - case 0x9B: n = 2; break; - /* LATIN SMALL LETTER O WITH TILDE */ - case 0x9C: n = 2; break; - /* LATIN SMALL LETTER U WITH ACUTE */ - case 0x9D: n = 2; break; - /* LATIN SMALL LETTER U WITH GRAVE */ - case 0x9E: n = 2; break; - /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ - case 0x9F: n = 2; break; - /* LATIN SMALL LETTER U WITH DIAERESIS */ - case 0xA0: n = 3; break; - /* DAGGER */ - case 0xA1: n = 2; break; - /* DEGREE SIGN */ - case 0xA2: n = 2; break; - /* CENT SIGN */ - case 0xA3: n = 2; break; - /* POUND SIGN */ - case 0xA4: n = 2; break; - /* SECTION SIGN */ - case 0xA5: n = 3; break; - /* BULLET */ - case 0xA6: n = 2; break; - /* PILCROW SIGN */ - case 0xA7: n = 2; break; - /* LATIN SMALL LETTER SHARP S */ - case 0xA8: n = 2; break; - /* REGISTERED SIGN */ - case 0xA9: n = 2; break; - /* COPYRIGHT SIGN */ - case 0xAA: n = 3; break; - /* TRADE MARK SIGN */ - case 0xAB: n = 2; break; - /* ACUTE ACCENT */ - case 0xAC: n = 2; break; - /* DIAERESIS */ - case 0xAD: n = 3; break; - /* NOT EQUAL TO */ - case 0xAE: n = 2; break; - /* LATIN CAPITAL LETTER AE */ - case 0xAF: n = 2; break; - /* LATIN CAPITAL LETTER O WITH STROKE */ - case 0xB0: n = 3; break; - /* INFINITY */ - case 0xB1: n = 2; break; - /* PLUS-MINUS SIGN */ - case 0xB2: n = 3; break; - /* LESS-THAN OR EQUAL TO */ - case 0xB3: n = 3; break; - /* GREATER-THAN OR EQUAL TO */ - case 0xB4: n = 2; break; - /* YEN SIGN */ - case 0xB5: n = 2; break; - /* MICRO SIGN */ - case 0xB6: n = 3; break; - /* PARTIAL DIFFERENTIAL */ - case 0xB7: n = 3; break; - /* N-ARY SUMMATION */ - case 0xB8: n = 3; break; - /* N-ARY PRODUCT */ - case 0xB9: n = 2; break; - /* GREEK SMALL LETTER PI */ - case 0xBA: n = 3; break; - /* INTEGRAL */ - case 0xBB: n = 2; break; - /* FEMININE ORDINAL INDICATOR */ - case 0xBC: n = 2; break; - /* MASCULINE ORDINAL INDICATOR */ - case 0xBD: n = 2; break; - /* GREEK CAPITAL LETTER OMEGA */ - case 0xBE: n = 2; break; - /* LATIN SMALL LETTER AE */ - case 0xBF: n = 2; break; - /* LATIN SMALL LETTER O WITH STROKE */ - case 0xC0: n = 2; break; - /* INVERTED QUESTION MARK */ - case 0xC1: n = 2; break; - /* INVERTED EXCLAMATION MARK */ - case 0xC2: n = 2; break; - /* NOT SIGN */ - case 0xC3: n = 3; break; - /* SQUARE ROOT */ - case 0xC4: n = 2; break; - /* LATIN SMALL LETTER F WITH HOOK */ - case 0xC5: n = 3; break; - /* ALMOST EQUAL TO */ - case 0xC6: n = 3; break; - /* INCREMENT */ - case 0xC7: n = 2; break; - /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ - case 0xC8: n = 2; break; - /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ - case 0xC9: n = 3; break; - /* HORIZONTAL ELLIPSIS */ - case 0xCA: n = 2; break; - /* NO-BREAK SPACE */ - case 0xCB: n = 2; break; - /* LATIN CAPITAL LETTER A WITH GRAVE */ - case 0xCC: n = 2; break; - /* LATIN CAPITAL LETTER A WITH TILDE */ - case 0xCD: n = 2; break; - /* LATIN CAPITAL LETTER O WITH TILDE */ - case 0xCE: n = 2; break; - /* LATIN CAPITAL LIGATURE OE */ - case 0xCF: n = 2; break; - /* LATIN SMALL LIGATURE OE */ - case 0xD0: n = 3; break; - /* EN DASH */ - case 0xD1: n = 3; break; - /* EM DASH */ - case 0xD2: n = 3; break; - /* LEFT DOUBLE QUOTATION MARK */ - case 0xD3: n = 3; break; - /* RIGHT DOUBLE QUOTATION MARK */ - case 0xD4: n = 3; break; - /* LEFT SINGLE QUOTATION MARK */ - case 0xD5: n = 3; break; - /* RIGHT SINGLE QUOTATION MARK */ - case 0xD6: n = 2; break; - /* DIVISION SIGN */ - case 0xD7: n = 3; break; - /* LOZENGE */ - case 0xD8: n = 2; break; - /* LATIN SMALL LETTER Y WITH DIAERESIS */ - case 0xD9: n = 2; break; - /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ - case 0xDA: n = 3; break; - /* FRACTION SLASH */ - case 0xDB: n = 3; break; - /* EURO SIGN */ - case 0xDC: n = 3; break; - /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ - case 0xDD: n = 3; break; - /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ - case 0xDE: n = 3; break; - /* LATIN SMALL LIGATURE FI */ - case 0xDF: n = 3; break; - /* LATIN SMALL LIGATURE FL */ - case 0xE0: n = 3; break; - /* DOUBLE DAGGER */ - case 0xE1: n = 2; break; - /* MIDDLE DOT */ - case 0xE2: n = 3; break; - /* SINGLE LOW-9 QUOTATION MARK */ - case 0xE3: n = 3; break; - /* DOUBLE LOW-9 QUOTATION MARK */ - case 0xE4: n = 3; break; - /* PER MILLE SIGN */ - case 0xE5: n = 2; break; - /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ - case 0xE6: n = 2; break; - /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ - case 0xE7: n = 2; break; - /* LATIN CAPITAL LETTER A WITH ACUTE */ - case 0xE8: n = 2; break; - /* LATIN CAPITAL LETTER E WITH DIAERESIS */ - case 0xE9: n = 2; break; - /* LATIN CAPITAL LETTER E WITH GRAVE */ - case 0xEA: n = 2; break; - /* LATIN CAPITAL LETTER I WITH ACUTE */ - case 0xEB: n = 2; break; - /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ - case 0xEC: n = 2; break; - /* LATIN CAPITAL LETTER I WITH DIAERESIS */ - case 0xED: n = 2; break; - /* LATIN CAPITAL LETTER I WITH GRAVE */ - case 0xEE: n = 2; break; - /* LATIN CAPITAL LETTER O WITH ACUTE */ - case 0xEF: n = 2; break; - /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ - case 0xF0: n = 3; break; - /* Apple logo */ - case 0xF1: n = 2; break; - /* LATIN CAPITAL LETTER O WITH GRAVE */ - case 0xF2: n = 2; break; - /* LATIN CAPITAL LETTER U WITH ACUTE */ - case 0xF3: n = 2; break; - /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ - case 0xF4: n = 2; break; - /* LATIN CAPITAL LETTER U WITH GRAVE */ - case 0xF5: n = 2; break; - /* LATIN SMALL LETTER DOTLESS I */ - case 0xF6: n = 2; break; - /* MODIFIER LETTER CIRCUMFLEX ACCENT */ - case 0xF7: n = 2; break; - /* SMALL TILDE */ - case 0xF8: n = 2; break; - /* MACRON */ - case 0xF9: n = 2; break; - /* BREVE */ - case 0xFA: n = 2; break; - /* DOT ABOVE */ - case 0xFB: n = 2; break; - /* RING ABOVE */ - case 0xFC: n = 2; break; - /* CEDILLA */ - case 0xFD: n = 2; break; - /* DOUBLE ACUTE ACCENT */ - case 0xFE: n = 2; break; - /* OGONEK */ - case 0xFF: n = 2; break; - /* CARON */ - default: n = 1; break; - /* shouldn't get here */ - } - } - v += n; - } - - return v; -} -#endif - -#if IncludeHostTextClipExchange -LOCALPROC MacRoman2UniCodeData(uint8_t *s, uimr L, char *t) -{ - uimr i; - uint8_t x; - - for (i = 0; i < L; ++i) { - x = *s++; - if (x < 128) { - *t++ = x; - } else { - switch (x) { - case 0x80: *t++ = 0xC3; *t++ = 0x84; break; - /* LATIN CAPITAL LETTER A WITH DIAERESIS */ - case 0x81: *t++ = 0xC3; *t++ = 0x85; break; - /* LATIN CAPITAL LETTER A WITH RING ABOVE */ - case 0x82: *t++ = 0xC3; *t++ = 0x87; break; - /* LATIN CAPITAL LETTER C WITH CEDILLA */ - case 0x83: *t++ = 0xC3; *t++ = 0x89; break; - /* LATIN CAPITAL LETTER E WITH ACUTE */ - case 0x84: *t++ = 0xC3; *t++ = 0x91; break; - /* LATIN CAPITAL LETTER N WITH TILDE */ - case 0x85: *t++ = 0xC3; *t++ = 0x96; break; - /* LATIN CAPITAL LETTER O WITH DIAERESIS */ - case 0x86: *t++ = 0xC3; *t++ = 0x9C; break; - /* LATIN CAPITAL LETTER U WITH DIAERESIS */ - case 0x87: *t++ = 0xC3; *t++ = 0xA1; break; - /* LATIN SMALL LETTER A WITH ACUTE */ - case 0x88: *t++ = 0xC3; *t++ = 0xA0; break; - /* LATIN SMALL LETTER A WITH GRAVE */ - case 0x89: *t++ = 0xC3; *t++ = 0xA2; break; - /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ - case 0x8A: *t++ = 0xC3; *t++ = 0xA4; break; - /* LATIN SMALL LETTER A WITH DIAERESIS */ - case 0x8B: *t++ = 0xC3; *t++ = 0xA3; break; - /* LATIN SMALL LETTER A WITH TILDE */ - case 0x8C: *t++ = 0xC3; *t++ = 0xA5; break; - /* LATIN SMALL LETTER A WITH RING ABOVE */ - case 0x8D: *t++ = 0xC3; *t++ = 0xA7; break; - /* LATIN SMALL LETTER C WITH CEDILLA */ - case 0x8E: *t++ = 0xC3; *t++ = 0xA9; break; - /* LATIN SMALL LETTER E WITH ACUTE */ - case 0x8F: *t++ = 0xC3; *t++ = 0xA8; break; - /* LATIN SMALL LETTER E WITH GRAVE */ - case 0x90: *t++ = 0xC3; *t++ = 0xAA; break; - /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ - case 0x91: *t++ = 0xC3; *t++ = 0xAB; break; - /* LATIN SMALL LETTER E WITH DIAERESIS */ - case 0x92: *t++ = 0xC3; *t++ = 0xAD; break; - /* LATIN SMALL LETTER I WITH ACUTE */ - case 0x93: *t++ = 0xC3; *t++ = 0xAC; break; - /* LATIN SMALL LETTER I WITH GRAVE */ - case 0x94: *t++ = 0xC3; *t++ = 0xAE; break; - /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ - case 0x95: *t++ = 0xC3; *t++ = 0xAF; break; - /* LATIN SMALL LETTER I WITH DIAERESIS */ - case 0x96: *t++ = 0xC3; *t++ = 0xB1; break; - /* LATIN SMALL LETTER N WITH TILDE */ - case 0x97: *t++ = 0xC3; *t++ = 0xB3; break; - /* LATIN SMALL LETTER O WITH ACUTE */ - case 0x98: *t++ = 0xC3; *t++ = 0xB2; break; - /* LATIN SMALL LETTER O WITH GRAVE */ - case 0x99: *t++ = 0xC3; *t++ = 0xB4; break; - /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ - case 0x9A: *t++ = 0xC3; *t++ = 0xB6; break; - /* LATIN SMALL LETTER O WITH DIAERESIS */ - case 0x9B: *t++ = 0xC3; *t++ = 0xB5; break; - /* LATIN SMALL LETTER O WITH TILDE */ - case 0x9C: *t++ = 0xC3; *t++ = 0xBA; break; - /* LATIN SMALL LETTER U WITH ACUTE */ - case 0x9D: *t++ = 0xC3; *t++ = 0xB9; break; - /* LATIN SMALL LETTER U WITH GRAVE */ - case 0x9E: *t++ = 0xC3; *t++ = 0xBB; break; - /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ - case 0x9F: *t++ = 0xC3; *t++ = 0xBC; break; - /* LATIN SMALL LETTER U WITH DIAERESIS */ - case 0xA0: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA0; break; - /* DAGGER */ - case 0xA1: *t++ = 0xC2; *t++ = 0xB0; break; - /* DEGREE SIGN */ - case 0xA2: *t++ = 0xC2; *t++ = 0xA2; break; - /* CENT SIGN */ - case 0xA3: *t++ = 0xC2; *t++ = 0xA3; break; - /* POUND SIGN */ - case 0xA4: *t++ = 0xC2; *t++ = 0xA7; break; - /* SECTION SIGN */ - case 0xA5: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA2; break; - /* BULLET */ - case 0xA6: *t++ = 0xC2; *t++ = 0xB6; break; - /* PILCROW SIGN */ - case 0xA7: *t++ = 0xC3; *t++ = 0x9F; break; - /* LATIN SMALL LETTER SHARP S */ - case 0xA8: *t++ = 0xC2; *t++ = 0xAE; break; - /* REGISTERED SIGN */ - case 0xA9: *t++ = 0xC2; *t++ = 0xA9; break; - /* COPYRIGHT SIGN */ - case 0xAA: *t++ = 0xE2; *t++ = 0x84; *t++ = 0xA2; break; - /* TRADE MARK SIGN */ - case 0xAB: *t++ = 0xC2; *t++ = 0xB4; break; - /* ACUTE ACCENT */ - case 0xAC: *t++ = 0xC2; *t++ = 0xA8; break; - /* DIAERESIS */ - case 0xAD: *t++ = 0xE2; *t++ = 0x89; *t++ = 0xA0; break; - /* NOT EQUAL TO */ - case 0xAE: *t++ = 0xC3; *t++ = 0x86; break; - /* LATIN CAPITAL LETTER AE */ - case 0xAF: *t++ = 0xC3; *t++ = 0x98; break; - /* LATIN CAPITAL LETTER O WITH STROKE */ - case 0xB0: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x9E; break; - /* INFINITY */ - case 0xB1: *t++ = 0xC2; *t++ = 0xB1; break; - /* PLUS-MINUS SIGN */ - case 0xB2: *t++ = 0xE2; *t++ = 0x89; *t++ = 0xA4; break; - /* LESS-THAN OR EQUAL TO */ - case 0xB3: *t++ = 0xE2; *t++ = 0x89; *t++ = 0xA5; break; - /* GREATER-THAN OR EQUAL TO */ - case 0xB4: *t++ = 0xC2; *t++ = 0xA5; break; - /* YEN SIGN */ - case 0xB5: *t++ = 0xC2; *t++ = 0xB5; break; - /* MICRO SIGN */ - case 0xB6: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x82; break; - /* PARTIAL DIFFERENTIAL */ - case 0xB7: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x91; break; - /* N-ARY SUMMATION */ - case 0xB8: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x8F; break; - /* N-ARY PRODUCT */ - case 0xB9: *t++ = 0xCF; *t++ = 0x80; break; - /* GREEK SMALL LETTER PI */ - case 0xBA: *t++ = 0xE2; *t++ = 0x88; *t++ = 0xAB; break; - /* INTEGRAL */ - case 0xBB: *t++ = 0xC2; *t++ = 0xAA; break; - /* FEMININE ORDINAL INDICATOR */ - case 0xBC: *t++ = 0xC2; *t++ = 0xBA; break; - /* MASCULINE ORDINAL INDICATOR */ - case 0xBD: *t++ = 0xCE; *t++ = 0xA9; break; - /* GREEK CAPITAL LETTER OMEGA */ - case 0xBE: *t++ = 0xC3; *t++ = 0xA6; break; - /* LATIN SMALL LETTER AE */ - case 0xBF: *t++ = 0xC3; *t++ = 0xB8; break; - /* LATIN SMALL LETTER O WITH STROKE */ - case 0xC0: *t++ = 0xC2; *t++ = 0xBF; break; - /* INVERTED QUESTION MARK */ - case 0xC1: *t++ = 0xC2; *t++ = 0xA1; break; - /* INVERTED EXCLAMATION MARK */ - case 0xC2: *t++ = 0xC2; *t++ = 0xAC; break; - /* NOT SIGN */ - case 0xC3: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x9A; break; - /* SQUARE ROOT */ - case 0xC4: *t++ = 0xC6; *t++ = 0x92; break; - /* LATIN SMALL LETTER F WITH HOOK */ - case 0xC5: *t++ = 0xE2; *t++ = 0x89; *t++ = 0x88; break; - /* ALMOST EQUAL TO */ - case 0xC6: *t++ = 0xE2; *t++ = 0x88; *t++ = 0x86; break; - /* INCREMENT */ - case 0xC7: *t++ = 0xC2; *t++ = 0xAB; break; - /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ - case 0xC8: *t++ = 0xC2; *t++ = 0xBB; break; - /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ - case 0xC9: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA6; break; - /* HORIZONTAL ELLIPSIS */ - case 0xCA: *t++ = 0xC2; *t++ = 0xA0; break; - /* NO-BREAK SPACE */ - case 0xCB: *t++ = 0xC3; *t++ = 0x80; break; - /* LATIN CAPITAL LETTER A WITH GRAVE */ - case 0xCC: *t++ = 0xC3; *t++ = 0x83; break; - /* LATIN CAPITAL LETTER A WITH TILDE */ - case 0xCD: *t++ = 0xC3; *t++ = 0x95; break; - /* LATIN CAPITAL LETTER O WITH TILDE */ - case 0xCE: *t++ = 0xC5; *t++ = 0x92; break; - /* LATIN CAPITAL LIGATURE OE */ - case 0xCF: *t++ = 0xC5; *t++ = 0x93; break; - /* LATIN SMALL LIGATURE OE */ - case 0xD0: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x93; break; - /* EN DASH */ - case 0xD1: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x94; break; - /* EM DASH */ - case 0xD2: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9C; break; - /* LEFT DOUBLE QUOTATION MARK */ - case 0xD3: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9D; break; - /* RIGHT DOUBLE QUOTATION MARK */ - case 0xD4: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x98; break; - /* LEFT SINGLE QUOTATION MARK */ - case 0xD5: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x99; break; - /* RIGHT SINGLE QUOTATION MARK */ - case 0xD6: *t++ = 0xC3; *t++ = 0xB7; break; - /* DIVISION SIGN */ - case 0xD7: *t++ = 0xE2; *t++ = 0x97; *t++ = 0x8A; break; - /* LOZENGE */ - case 0xD8: *t++ = 0xC3; *t++ = 0xBF; break; - /* LATIN SMALL LETTER Y WITH DIAERESIS */ - case 0xD9: *t++ = 0xC5; *t++ = 0xB8; break; - /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ - case 0xDA: *t++ = 0xE2; *t++ = 0x81; *t++ = 0x84; break; - /* FRACTION SLASH */ - case 0xDB: *t++ = 0xE2; *t++ = 0x82; *t++ = 0xAC; break; - /* EURO SIGN */ - case 0xDC: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xB9; break; - /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ - case 0xDD: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xBA; break; - /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ - case 0xDE: *t++ = 0xEF; *t++ = 0xAC; *t++ = 0x81; break; - /* LATIN SMALL LIGATURE FI */ - case 0xDF: *t++ = 0xEF; *t++ = 0xAC; *t++ = 0x82; break; - /* LATIN SMALL LIGATURE FL */ - case 0xE0: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xA1; break; - /* DOUBLE DAGGER */ - case 0xE1: *t++ = 0xC2; *t++ = 0xB7; break; - /* MIDDLE DOT */ - case 0xE2: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9A; break; - /* SINGLE LOW-9 QUOTATION MARK */ - case 0xE3: *t++ = 0xE2; *t++ = 0x80; *t++ = 0x9E; break; - /* DOUBLE LOW-9 QUOTATION MARK */ - case 0xE4: *t++ = 0xE2; *t++ = 0x80; *t++ = 0xB0; break; - /* PER MILLE SIGN */ - case 0xE5: *t++ = 0xC3; *t++ = 0x82; break; - /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ - case 0xE6: *t++ = 0xC3; *t++ = 0x8A; break; - /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ - case 0xE7: *t++ = 0xC3; *t++ = 0x81; break; - /* LATIN CAPITAL LETTER A WITH ACUTE */ - case 0xE8: *t++ = 0xC3; *t++ = 0x8B; break; - /* LATIN CAPITAL LETTER E WITH DIAERESIS */ - case 0xE9: *t++ = 0xC3; *t++ = 0x88; break; - /* LATIN CAPITAL LETTER E WITH GRAVE */ - case 0xEA: *t++ = 0xC3; *t++ = 0x8D; break; - /* LATIN CAPITAL LETTER I WITH ACUTE */ - case 0xEB: *t++ = 0xC3; *t++ = 0x8E; break; - /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ - case 0xEC: *t++ = 0xC3; *t++ = 0x8F; break; - /* LATIN CAPITAL LETTER I WITH DIAERESIS */ - case 0xED: *t++ = 0xC3; *t++ = 0x8C; break; - /* LATIN CAPITAL LETTER I WITH GRAVE */ - case 0xEE: *t++ = 0xC3; *t++ = 0x93; break; - /* LATIN CAPITAL LETTER O WITH ACUTE */ - case 0xEF: *t++ = 0xC3; *t++ = 0x94; break; - /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ - case 0xF0: *t++ = 0xEF; *t++ = 0xA3; *t++ = 0xBF; break; - /* Apple logo */ - case 0xF1: *t++ = 0xC3; *t++ = 0x92; break; - /* LATIN CAPITAL LETTER O WITH GRAVE */ - case 0xF2: *t++ = 0xC3; *t++ = 0x9A; break; - /* LATIN CAPITAL LETTER U WITH ACUTE */ - case 0xF3: *t++ = 0xC3; *t++ = 0x9B; break; - /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ - case 0xF4: *t++ = 0xC3; *t++ = 0x99; break; - /* LATIN CAPITAL LETTER U WITH GRAVE */ - case 0xF5: *t++ = 0xC4; *t++ = 0xB1; break; - /* LATIN SMALL LETTER DOTLESS I */ - case 0xF6: *t++ = 0xCB; *t++ = 0x86; break; - /* MODIFIER LETTER CIRCUMFLEX ACCENT */ - case 0xF7: *t++ = 0xCB; *t++ = 0x9C; break; - /* SMALL TILDE */ - case 0xF8: *t++ = 0xC2; *t++ = 0xAF; break; - /* MACRON */ - case 0xF9: *t++ = 0xCB; *t++ = 0x98; break; - /* BREVE */ - case 0xFA: *t++ = 0xCB; *t++ = 0x99; break; - /* DOT ABOVE */ - case 0xFB: *t++ = 0xCB; *t++ = 0x9A; break; - /* RING ABOVE */ - case 0xFC: *t++ = 0xC2; *t++ = 0xB8; break; - /* CEDILLA */ - case 0xFD: *t++ = 0xCB; *t++ = 0x9D; break; - /* DOUBLE ACUTE ACCENT */ - case 0xFE: *t++ = 0xCB; *t++ = 0x9B; break; - /* OGONEK */ - case 0xFF: *t++ = 0xCB; *t++ = 0x87; break; - /* CARON */ - default: *t++ = '?'; break; - /* shouldn't get here */ - } - } - } -} -#endif - -#if IncludeHostTextClipExchange -GLOBALOSGLUFUNC MacErr_t HTCEexport(tPbuf i) -{ - MacErr_t err; - char *p; - uint8_t * s = PbufDat[i]; - uimr L = PbufSize[i]; - uimr sz = MacRoman2UniCodeSize(s, L); - - if (NULL == (p = malloc(sz + 1))) { - err = mnvm_miscErr; - } else { - MacRoman2UniCodeData(s, L, p); - p[sz] = 0; - - if (0 != SDL_SetClipboardText(p)) { - err = mnvm_miscErr; - } else { - err = mnvm_noErr; - } - free(p); - } - - return err; -} -#endif - -#if IncludeHostTextClipExchange -LOCALFUNC MacErr_t UniCodeStrLength(char *s, uimr *r) -{ - MacErr_t err; - uint8_t t; - uint8_t t2; - char *p = s; - uimr L = 0; - -label_retry: - if (0 == (t = *p++)) { - err = mnvm_noErr; - /* done */ - } else - if (0 == (0x80 & t)) { - /* One-byte code */ - L += 1; - goto label_retry; - } else - if (0 == (0x40 & t)) { - /* continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (t2 = *p++)) { - err = mnvm_miscErr; - } else - if (0x80 != (0xC0 & t2)) { - /* not a continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (0x20 & t)) { - /* two bytes */ - L += 2; - goto label_retry; - } else - if (0 == (t2 = *p++)) { - err = mnvm_miscErr; - } else - if (0x80 != (0xC0 & t2)) { - /* not a continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (0x10 & t)) { - /* three bytes */ - L += 3; - goto label_retry; - } else - if (0 == (t2 = *p++)) { - err = mnvm_miscErr; - } else - if (0x80 != (0xC0 & t2)) { - /* not a continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (0x08 & t)) { - /* four bytes */ - L += 5; - goto label_retry; - } else - { - err = mnvm_miscErr; - /* longer code not supported yet */ - } - - *r = L; - return err; -} -#endif - -#if IncludeHostTextClipExchange -LOCALFUNC uint8_t UniCodePoint2MacRoman(uint32_t x) -{ -/* - adapted from - http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMAN.TXT -*/ - uint8_t y; - - if (x < 128) { - y = x; - } else { - switch (x) { - case 0x00C4: y = 0x80; break; - /* LATIN CAPITAL LETTER A WITH DIAERESIS */ - case 0x00C5: y = 0x81; break; - /* LATIN CAPITAL LETTER A WITH RING ABOVE */ - case 0x00C7: y = 0x82; break; - /* LATIN CAPITAL LETTER C WITH CEDILLA */ - case 0x00C9: y = 0x83; break; - /* LATIN CAPITAL LETTER E WITH ACUTE */ - case 0x00D1: y = 0x84; break; - /* LATIN CAPITAL LETTER N WITH TILDE */ - case 0x00D6: y = 0x85; break; - /* LATIN CAPITAL LETTER O WITH DIAERESIS */ - case 0x00DC: y = 0x86; break; - /* LATIN CAPITAL LETTER U WITH DIAERESIS */ - case 0x00E1: y = 0x87; break; - /* LATIN SMALL LETTER A WITH ACUTE */ - case 0x00E0: y = 0x88; break; - /* LATIN SMALL LETTER A WITH GRAVE */ - case 0x00E2: y = 0x89; break; - /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ - case 0x00E4: y = 0x8A; break; - /* LATIN SMALL LETTER A WITH DIAERESIS */ - case 0x00E3: y = 0x8B; break; - /* LATIN SMALL LETTER A WITH TILDE */ - case 0x00E5: y = 0x8C; break; - /* LATIN SMALL LETTER A WITH RING ABOVE */ - case 0x00E7: y = 0x8D; break; - /* LATIN SMALL LETTER C WITH CEDILLA */ - case 0x00E9: y = 0x8E; break; - /* LATIN SMALL LETTER E WITH ACUTE */ - case 0x00E8: y = 0x8F; break; - /* LATIN SMALL LETTER E WITH GRAVE */ - case 0x00EA: y = 0x90; break; - /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ - case 0x00EB: y = 0x91; break; - /* LATIN SMALL LETTER E WITH DIAERESIS */ - case 0x00ED: y = 0x92; break; - /* LATIN SMALL LETTER I WITH ACUTE */ - case 0x00EC: y = 0x93; break; - /* LATIN SMALL LETTER I WITH GRAVE */ - case 0x00EE: y = 0x94; break; - /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ - case 0x00EF: y = 0x95; break; - /* LATIN SMALL LETTER I WITH DIAERESIS */ - case 0x00F1: y = 0x96; break; - /* LATIN SMALL LETTER N WITH TILDE */ - case 0x00F3: y = 0x97; break; - /* LATIN SMALL LETTER O WITH ACUTE */ - case 0x00F2: y = 0x98; break; - /* LATIN SMALL LETTER O WITH GRAVE */ - case 0x00F4: y = 0x99; break; - /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ - case 0x00F6: y = 0x9A; break; - /* LATIN SMALL LETTER O WITH DIAERESIS */ - case 0x00F5: y = 0x9B; break; - /* LATIN SMALL LETTER O WITH TILDE */ - case 0x00FA: y = 0x9C; break; - /* LATIN SMALL LETTER U WITH ACUTE */ - case 0x00F9: y = 0x9D; break; - /* LATIN SMALL LETTER U WITH GRAVE */ - case 0x00FB: y = 0x9E; break; - /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ - case 0x00FC: y = 0x9F; break; - /* LATIN SMALL LETTER U WITH DIAERESIS */ - case 0x2020: y = 0xA0; break; - /* DAGGER */ - case 0x00B0: y = 0xA1; break; - /* DEGREE SIGN */ - case 0x00A2: y = 0xA2; break; - /* CENT SIGN */ - case 0x00A3: y = 0xA3; break; - /* POUND SIGN */ - case 0x00A7: y = 0xA4; break; - /* SECTION SIGN */ - case 0x2022: y = 0xA5; break; - /* BULLET */ - case 0x00B6: y = 0xA6; break; - /* PILCROW SIGN */ - case 0x00DF: y = 0xA7; break; - /* LATIN SMALL LETTER SHARP S */ - case 0x00AE: y = 0xA8; break; - /* REGISTERED SIGN */ - case 0x00A9: y = 0xA9; break; - /* COPYRIGHT SIGN */ - case 0x2122: y = 0xAA; break; - /* TRADE MARK SIGN */ - case 0x00B4: y = 0xAB; break; - /* ACUTE ACCENT */ - case 0x00A8: y = 0xAC; break; - /* DIAERESIS */ - case 0x2260: y = 0xAD; break; - /* NOT EQUAL TO */ - case 0x00C6: y = 0xAE; break; - /* LATIN CAPITAL LETTER AE */ - case 0x00D8: y = 0xAF; break; - /* LATIN CAPITAL LETTER O WITH STROKE */ - case 0x221E: y = 0xB0; break; - /* INFINITY */ - case 0x00B1: y = 0xB1; break; - /* PLUS-MINUS SIGN */ - case 0x2264: y = 0xB2; break; - /* LESS-THAN OR EQUAL TO */ - case 0x2265: y = 0xB3; break; - /* GREATER-THAN OR EQUAL TO */ - case 0x00A5: y = 0xB4; break; - /* YEN SIGN */ - case 0x00B5: y = 0xB5; break; - /* MICRO SIGN */ - case 0x2202: y = 0xB6; break; - /* PARTIAL DIFFERENTIAL */ - case 0x2211: y = 0xB7; break; - /* N-ARY SUMMATION */ - case 0x220F: y = 0xB8; break; - /* N-ARY PRODUCT */ - case 0x03C0: y = 0xB9; break; - /* GREEK SMALL LETTER PI */ - case 0x222B: y = 0xBA; break; - /* INTEGRAL */ - case 0x00AA: y = 0xBB; break; - /* FEMININE ORDINAL INDICATOR */ - case 0x00BA: y = 0xBC; break; - /* MASCULINE ORDINAL INDICATOR */ - case 0x03A9: y = 0xBD; break; - /* GREEK CAPITAL LETTER OMEGA */ - case 0x00E6: y = 0xBE; break; - /* LATIN SMALL LETTER AE */ - case 0x00F8: y = 0xBF; break; - /* LATIN SMALL LETTER O WITH STROKE */ - case 0x00BF: y = 0xC0; break; - /* INVERTED QUESTION MARK */ - case 0x00A1: y = 0xC1; break; - /* INVERTED EXCLAMATION MARK */ - case 0x00AC: y = 0xC2; break; - /* NOT SIGN */ - case 0x221A: y = 0xC3; break; - /* SQUARE ROOT */ - case 0x0192: y = 0xC4; break; - /* LATIN SMALL LETTER F WITH HOOK */ - case 0x2248: y = 0xC5; break; - /* ALMOST EQUAL TO */ - case 0x2206: y = 0xC6; break; - /* INCREMENT */ - case 0x00AB: y = 0xC7; break; - /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ - case 0x00BB: y = 0xC8; break; - /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ - case 0x2026: y = 0xC9; break; - /* HORIZONTAL ELLIPSIS */ - case 0x00A0: y = 0xCA; break; - /* NO-BREAK SPACE */ - case 0x00C0: y = 0xCB; break; - /* LATIN CAPITAL LETTER A WITH GRAVE */ - case 0x00C3: y = 0xCC; break; - /* LATIN CAPITAL LETTER A WITH TILDE */ - case 0x00D5: y = 0xCD; break; - /* LATIN CAPITAL LETTER O WITH TILDE */ - case 0x0152: y = 0xCE; break; - /* LATIN CAPITAL LIGATURE OE */ - case 0x0153: y = 0xCF; break; - /* LATIN SMALL LIGATURE OE */ - case 0x2013: y = 0xD0; break; - /* EN DASH */ - case 0x2014: y = 0xD1; break; - /* EM DASH */ - case 0x201C: y = 0xD2; break; - /* LEFT DOUBLE QUOTATION MARK */ - case 0x201D: y = 0xD3; break; - /* RIGHT DOUBLE QUOTATION MARK */ - case 0x2018: y = 0xD4; break; - /* LEFT SINGLE QUOTATION MARK */ - case 0x2019: y = 0xD5; break; - /* RIGHT SINGLE QUOTATION MARK */ - case 0x00F7: y = 0xD6; break; - /* DIVISION SIGN */ - case 0x25CA: y = 0xD7; break; - /* LOZENGE */ - case 0x00FF: y = 0xD8; break; - /* LATIN SMALL LETTER Y WITH DIAERESIS */ - case 0x0178: y = 0xD9; break; - /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ - case 0x2044: y = 0xDA; break; - /* FRACTION SLASH */ - case 0x20AC: y = 0xDB; break; - /* EURO SIGN */ - case 0x2039: y = 0xDC; break; - /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ - case 0x203A: y = 0xDD; break; - /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ - case 0xFB01: y = 0xDE; break; - /* LATIN SMALL LIGATURE FI */ - case 0xFB02: y = 0xDF; break; - /* LATIN SMALL LIGATURE FL */ - case 0x2021: y = 0xE0; break; - /* DOUBLE DAGGER */ - case 0x00B7: y = 0xE1; break; - /* MIDDLE DOT */ - case 0x201A: y = 0xE2; break; - /* SINGLE LOW-9 QUOTATION MARK */ - case 0x201E: y = 0xE3; break; - /* DOUBLE LOW-9 QUOTATION MARK */ - case 0x2030: y = 0xE4; break; - /* PER MILLE SIGN */ - case 0x00C2: y = 0xE5; break; - /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ - case 0x00CA: y = 0xE6; break; - /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ - case 0x00C1: y = 0xE7; break; - /* LATIN CAPITAL LETTER A WITH ACUTE */ - case 0x00CB: y = 0xE8; break; - /* LATIN CAPITAL LETTER E WITH DIAERESIS */ - case 0x00C8: y = 0xE9; break; - /* LATIN CAPITAL LETTER E WITH GRAVE */ - case 0x00CD: y = 0xEA; break; - /* LATIN CAPITAL LETTER I WITH ACUTE */ - case 0x00CE: y = 0xEB; break; - /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ - case 0x00CF: y = 0xEC; break; - /* LATIN CAPITAL LETTER I WITH DIAERESIS */ - case 0x00CC: y = 0xED; break; - /* LATIN CAPITAL LETTER I WITH GRAVE */ - case 0x00D3: y = 0xEE; break; - /* LATIN CAPITAL LETTER O WITH ACUTE */ - case 0x00D4: y = 0xEF; break; - /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ - case 0xF8FF: y = 0xF0; break; - /* Apple logo */ - case 0x00D2: y = 0xF1; break; - /* LATIN CAPITAL LETTER O WITH GRAVE */ - case 0x00DA: y = 0xF2; break; - /* LATIN CAPITAL LETTER U WITH ACUTE */ - case 0x00DB: y = 0xF3; break; - /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ - case 0x00D9: y = 0xF4; break; - /* LATIN CAPITAL LETTER U WITH GRAVE */ - case 0x0131: y = 0xF5; break; - /* LATIN SMALL LETTER DOTLESS I */ - case 0x02C6: y = 0xF6; break; - /* MODIFIER LETTER CIRCUMFLEX ACCENT */ - case 0x02DC: y = 0xF7; break; - /* SMALL TILDE */ - case 0x00AF: y = 0xF8; break; - /* MACRON */ - case 0x02D8: y = 0xF9; break; - /* BREVE */ - case 0x02D9: y = 0xFA; break; - /* DOT ABOVE */ - case 0x02DA: y = 0xFB; break; - /* RING ABOVE */ - case 0x00B8: y = 0xFC; break; - /* CEDILLA */ - case 0x02DD: y = 0xFD; break; - /* DOUBLE ACUTE ACCENT */ - case 0x02DB: y = 0xFE; break; - /* OGONEK */ - case 0x02C7: y = 0xFF; break; - /* CARON */ - default: y = '?'; break; - /* unrecognized */ - } - } - - return y; -} -#endif - -#if IncludeHostTextClipExchange -LOCALPROC UniCodeStr2MacRoman(char *s, char *r) -{ - MacErr_t err; - uint8_t t; - uint8_t t2; - uint8_t t3; - uint8_t t4; - uint32_t v; - char *p = s; - char *q = r; - -label_retry: - if (0 == (t = *p++)) { - err = mnvm_noErr; - /* done */ - } else - if (0 == (0x80 & t)) { - *q++ = t; - goto label_retry; - } else - if (0 == (0x40 & t)) { - /* continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (t2 = *p++)) { - err = mnvm_miscErr; - } else - if (0x80 != (0xC0 & t2)) { - /* not a continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (0x20 & t)) { - /* two bytes */ - v = t & 0x1F; - v = (v << 6) | (t2 & 0x3F); - *q++ = UniCodePoint2MacRoman(v); - goto label_retry; - } else - if (0 == (t3 = *p++)) { - err = mnvm_miscErr; - } else - if (0x80 != (0xC0 & t3)) { - /* not a continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (0x10 & t)) { - /* three bytes */ - v = t & 0x0F; - v = (v << 6) | (t3 & 0x3F); - v = (v << 6) | (t2 & 0x3F); - *q++ = UniCodePoint2MacRoman(v); - goto label_retry; - } else - if (0 == (t4 = *p++)) { - err = mnvm_miscErr; - } else - if (0x80 != (0xC0 & t4)) { - /* not a continuation code, error */ - err = mnvm_miscErr; - } else - if (0 == (0x08 & t)) { - /* four bytes */ - v = t & 0x07; - v = (v << 6) | (t4 & 0x3F); - v = (v << 6) | (t3 & 0x3F); - v = (v << 6) | (t2 & 0x3F); - *q++ = UniCodePoint2MacRoman(v); - goto label_retry; - } else - { - err = mnvm_miscErr; - /* longer code not supported yet */ - } -} -#endif - -#if IncludeHostTextClipExchange -GLOBALOSGLUFUNC MacErr_t HTCEimport(tPbuf *r) -{ - MacErr_t err; - uimr L; - char *s = NULL; - tPbuf t = NotAPbuf; - - if (NULL == (s = SDL_GetClipboardText())) { - err = mnvm_miscErr; - } else - if (mnvm_noErr != (err = - UniCodeStrLength(s, &L))) - { - /* fail */ - } else - if (mnvm_noErr != (err = - PbufNew(L, &t))) - { - /* fail */ - } else - { - err = mnvm_noErr; - - UniCodeStr2MacRoman(s, PbufDat[t]); - *r = t; - t = NotAPbuf; - } - - if (NotAPbuf != t) { - PbufDispose(t); - } - if (NULL != s) { - SDL_free(s); - } - - return err; -} -#endif - /* --- event handling for main window --- */ #define UseMotionEvents 1 @@ -3406,7 +391,7 @@ LOCALFUNC bool CreateMainWindow(void) #endif if (NULL == (main_wind = SDL_CreateWindow( - (NULL != n_arg) ? n_arg : kStrAppName, + kStrAppName, NewWindowX, NewWindowY, NewWindowWidth, NewWindowHeight, flags))) @@ -3747,7 +732,7 @@ LOCALPROC ZapWinStateVars(void) } #if 1 -LOCALPROC ToggleWantFullScreen(void) +void ToggleWantFullScreen(void) { WantFullScreen = ! WantFullScreen; @@ -3922,55 +907,9 @@ LOCALPROC CheckForSavedTasks(void) /* --- command line parsing --- */ +// TODO: reimplement with an actual argument parsing library LOCALFUNC bool ScanCommandLine(void) { - char *pa; - int i = 1; - -label_retry: - if (i < argc) { - pa = argv[i++]; - if ('-' == pa[0]) { - if ((0 == strcmp(pa, "--rom")) - || (0 == strcmp(pa, "-r"))) - { - if (i < argc) { - rom_path = argv[i++]; - goto label_retry; - } - } else - if (0 == strcmp(pa, "-n")) - { - if (i < argc) { - n_arg = argv[i++]; - goto label_retry; - } - } else - if (0 == strcmp(pa, "-d")) - { - if (i < argc) { - d_arg = argv[i++]; - goto label_retry; - } - } else - if (('p' == pa[1]) && ('s' == pa[2]) && ('n' == pa[3])) - { - /* seen in OS X. ignore */ - goto label_retry; - } else - { - MacMsg(kStrBadArgTitle, kStrBadArgMessage, false); -#if dbglog_HAVE - dbglog_writeln("bad command line argument"); - dbglog_writeln(pa); -#endif - } - } else { - (void) Sony_Insert1(pa, false); - goto label_retry; - } - } - return true; } diff --git a/src/UI/SDL2/OSGLUSD2.h b/src/UI/SDL2/OSGLUSD2.h new file mode 100644 index 0000000..1aec99e --- /dev/null +++ b/src/UI/SDL2/OSGLUSD2.h @@ -0,0 +1,79 @@ +#pragma once + +#include +#include +#include +#include "UI/MYOSGLUE.h" + +/* --- defines and macros and such --- */ + +// video defines +#ifndef UseSDLscaling +#define UseSDLscaling 0 +#endif + +#if 1 && ! UseSDLscaling +#define MaxScale WindowScale +#else +#define MaxScale 1 +#endif + +#define CLUT_finalsz (256 * 8 * 4 * MaxScale) + +// sound defines +#define kLn2SoundBuffers 4 /* kSoundBuffers must be a power of two */ +#define kSoundBuffers (1 << kLn2SoundBuffers) +#define kSoundBuffMask (kSoundBuffers - 1) + +#define DesiredMinFilledSoundBuffs 3 + /* + if too big then sound lags behind emulation. + if too small then sound will have pauses. + */ + +#define kLnOneBuffLen 9 +#define kLnAllBuffLen (kLn2SoundBuffers + kLnOneBuffLen) +#define kOneBuffLen (1UL << kLnOneBuffLen) +#define kAllBuffLen (1UL << kLnAllBuffLen) +#define kLnOneBuffSz (kLnOneBuffLen + kLn2SoundSampSz - 3) +#define kLnAllBuffSz (kLnAllBuffLen + kLn2SoundSampSz - 3) +#define kOneBuffSz (1UL << kLnOneBuffSz) +#define kAllBuffSz (1UL << kLnAllBuffSz) +#define kOneBuffMask (kOneBuffLen - 1) +#define kAllBuffMask (kAllBuffLen - 1) +#define dbhBufferSize (kAllBuffSz + kOneBuffSz) + +#define dbglog_SoundStuff (0 && dbglog_HAVE) +#define dbglog_SoundBuffStats (0 && dbglog_HAVE) + + +/* --- globals --- */ + +#if MayFullScreen +extern int hOffset; +extern int vOffset; +#endif +extern bool UseFullScreen; +extern bool UseMagnify; + +extern uint32_t TrueEmulatedTime; +extern uint32_t LastTime; +extern uint32_t NextIntTime; +extern uint32_t NextFracTime; + +extern bool gBackgroundFlag; +extern bool gTrueBackgroundFlag; +extern bool CurSpeedStopped; + +extern SDL_Window *main_wind; +extern SDL_Renderer *renderer; +extern SDL_Texture *texture; +extern SDL_PixelFormat *format; + +extern uint8_t * ScalingBuff; +extern uint8_t * CLUT_final; + +extern bool HaveCursorHidden; +extern bool WantCursorHidden; + +extern tpSoundSamp TheSoundBuffer; diff --git a/src/UI/SDL2/ROM.c b/src/UI/SDL2/ROM.c new file mode 100644 index 0000000..a0767ff --- /dev/null +++ b/src/UI/SDL2/ROM.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include "SYSDEPNS.h" +#include "UI/MYOSGLUE.h" +#include "UI/COMOSGLU.h" + +/* --- ROM --- */ + +LOCALVAR char *rom_path = NULL; + +#if CanGetAppPath +LOCALFUNC MacErr_t LoadMacRomFromPrefDir(void) +{ + MacErr_t err; + char *t = NULL; + char *t2 = NULL; + + if (NULL == pref_dir) { + err = mnvm_fnfErr; + } else + if (mnvm_noErr != (err = + ChildPath(pref_dir, "mnvm_rom", &t))) + { + /* fail */ + } else + if (mnvm_noErr != (err = + ChildPath(t, RomFileName, &t2))) + { + /* fail */ + } else + { + err = LoadMacRomFrom(t2); + } + + MayFree(t2); + MayFree(t); + + return err; +} +#endif + +#if CanGetAppPath +LOCALFUNC MacErr_t LoadMacRomFromAppPar(void) +{ + MacErr_t err; + char *d = (NULL == d_arg) ? app_parent : d_arg; + char *t = NULL; + + if (NULL == d) { + err = mnvm_fnfErr; + } else + if (mnvm_noErr != (err = + ChildPath(d, RomFileName, &t))) + { + /* fail */ + } else + { + err = LoadMacRomFrom(t); + } + + MayFree(t); + + return err; +} +#endif + +bool LoadMacRom(void) +{ + MacErr_t err; + + if ((NULL == rom_path) + || (mnvm_fnfErr == (err = LoadMacRomFrom(rom_path)))) +#if CanGetAppPath + if (mnvm_fnfErr == (err = LoadMacRomFromAppPar())) + if (mnvm_fnfErr == (err = LoadMacRomFromPrefDir())) +#endif + if (mnvm_fnfErr == (err = LoadMacRomFrom(RomFileName))) + { + } + + return true; /* keep launching Mini vMac, regardless */ +} diff --git a/src/UI/SDL2/SOUND.c b/src/UI/SDL2/SOUND.c new file mode 100644 index 0000000..a81128f --- /dev/null +++ b/src/UI/SDL2/SOUND.c @@ -0,0 +1,453 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "UI/COMOSGLU.h" +#include "STRCONST.h" +#include "OSGLUSD2.h" + +/* --- sound --- */ + +#if SoundEnabled + + +tpSoundSamp TheSoundBuffer = nullpr; +volatile static uint16_t ThePlayOffset; +volatile static uint16_t TheFillOffset; +volatile static uint16_t MinFilledSoundBuffs; +#if dbglog_SoundBuffStats +LOCALVAR uint16_t MaxFilledSoundBuffs; +#endif +LOCALVAR uint16_t TheWriteOffset; + +void Sound_Init0(void) +{ + ThePlayOffset = 0; + TheFillOffset = 0; + TheWriteOffset = 0; +} + +void Sound_Start0(void) +{ + /* Reset variables */ + MinFilledSoundBuffs = kSoundBuffers + 1; +#if dbglog_SoundBuffStats + MaxFilledSoundBuffs = 0; +#endif +} + +GLOBALOSGLUFUNC tpSoundSamp Sound_BeginWrite(uint16_t n, uint16_t *actL) +{ + uint16_t ToFillLen = kAllBuffLen - (TheWriteOffset - ThePlayOffset); + uint16_t WriteBuffContig = + kOneBuffLen - (TheWriteOffset & kOneBuffMask); + + if (WriteBuffContig < n) { + n = WriteBuffContig; + } + if (ToFillLen < n) { + /* overwrite previous buffer */ +#if dbglog_SoundStuff + dbglog_writeln("sound buffer over flow"); +#endif + TheWriteOffset -= kOneBuffLen; + } + + *actL = n; + return TheSoundBuffer + (TheWriteOffset & kAllBuffMask); +} + +#if 4 == kLn2SoundSampSz +void ConvertSoundBlockToNative(tpSoundSamp p) +{ + int i; + + for (i = kOneBuffLen; --i >= 0; ) { + *p++ -= 0x8000; + } +} +#else +#define ConvertSoundBlockToNative(p) +#endif + +void Sound_WroteABlock(void) +{ +#if (4 == kLn2SoundSampSz) + uint16_t PrevWriteOffset = TheWriteOffset - kOneBuffLen; + tpSoundSamp p = TheSoundBuffer + (PrevWriteOffset & kAllBuffMask); +#endif + +#if dbglog_SoundStuff + dbglog_writeln("enter Sound_WroteABlock"); +#endif + + ConvertSoundBlockToNative(p); + + TheFillOffset = TheWriteOffset; + +#if dbglog_SoundBuffStats + { + uint16_t ToPlayLen = TheFillOffset + - ThePlayOffset; + uint16_t ToPlayBuffs = ToPlayLen >> kLnOneBuffLen; + + if (ToPlayBuffs > MaxFilledSoundBuffs) { + MaxFilledSoundBuffs = ToPlayBuffs; + } + } +#endif +} + +bool Sound_EndWrite0(uint16_t actL) +{ + bool v; + + TheWriteOffset += actL; + + if (0 != (TheWriteOffset & kOneBuffMask)) { + v = false; + } else { + /* just finished a block */ + + Sound_WroteABlock(); + + v = true; + } + + return v; +} + +void Sound_SecondNotify0(void) +{ + if (MinFilledSoundBuffs <= kSoundBuffers) { + if (MinFilledSoundBuffs > DesiredMinFilledSoundBuffs) { +#if dbglog_SoundStuff + dbglog_writeln("MinFilledSoundBuffs too high"); +#endif + IncrNextTime(); + } else if (MinFilledSoundBuffs < DesiredMinFilledSoundBuffs) { +#if dbglog_SoundStuff + dbglog_writeln("MinFilledSoundBuffs too low"); +#endif + ++TrueEmulatedTime; + } +#if dbglog_SoundBuffStats + dbglog_writelnNum("MinFilledSoundBuffs", + MinFilledSoundBuffs); + dbglog_writelnNum("MaxFilledSoundBuffs", + MaxFilledSoundBuffs); + MaxFilledSoundBuffs = 0; +#endif + MinFilledSoundBuffs = kSoundBuffers + 1; + } +} + +typedef uint16_t trSoundTemp; + +#define kCenterTempSound 0x8000 + +#define AudioStepVal 0x0040 + +#if 3 == kLn2SoundSampSz +#define ConvertTempSoundSampleFromNative(v) ((v) << 8) +#elif 4 == kLn2SoundSampSz +#define ConvertTempSoundSampleFromNative(v) ((v) + kCenterSound) +#else +#error "unsupported kLn2SoundSampSz" +#endif + +#if 3 == kLn2SoundSampSz +#define ConvertTempSoundSampleToNative(v) ((v) >> 8) +#elif 4 == kLn2SoundSampSz +#define ConvertTempSoundSampleToNative(v) ((v) - kCenterSound) +#else +#error "unsupported kLn2SoundSampSz" +#endif + +void SoundRampTo(trSoundTemp *last_val, trSoundTemp dst_val, + tpSoundSamp *stream, int *len) +{ + trSoundTemp diff; + tpSoundSamp p = *stream; + int n = *len; + trSoundTemp v1 = *last_val; + + while ((v1 != dst_val) && (0 != n)) { + if (v1 > dst_val) { + diff = v1 - dst_val; + if (diff > AudioStepVal) { + v1 -= AudioStepVal; + } else { + v1 = dst_val; + } + } else { + diff = dst_val - v1; + if (diff > AudioStepVal) { + v1 += AudioStepVal; + } else { + v1 = dst_val; + } + } + + --n; + *p++ = ConvertTempSoundSampleToNative(v1); + } + + *stream = p; + *len = n; + *last_val = v1; +} + +struct SoundR { + tpSoundSamp fTheSoundBuffer; + volatile uint16_t (*fPlayOffset); + volatile uint16_t (*fFillOffset); + volatile uint16_t (*fMinFilledSoundBuffs); + + volatile trSoundTemp lastv; + + bool wantplaying; + bool HaveStartedPlaying; +}; +typedef struct SoundR SoundR; + +static void audio_callback(void *udata, Uint8 *stream, int len) +{ + uint16_t ToPlayLen; + uint16_t FilledSoundBuffs; + int i; + SoundR *datp = (SoundR *)udata; + tpSoundSamp CurSoundBuffer = datp->fTheSoundBuffer; + uint16_t CurPlayOffset = *datp->fPlayOffset; + trSoundTemp v0 = datp->lastv; + trSoundTemp v1 = v0; + tpSoundSamp dst = (tpSoundSamp)stream; + +#if kLn2SoundSampSz > 3 + len >>= (kLn2SoundSampSz - 3); +#endif + +#if dbglog_SoundStuff + dbglog_writeln("Enter audio_callback"); + dbglog_writelnNum("len", len); +#endif + +label_retry: + ToPlayLen = *datp->fFillOffset - CurPlayOffset; + FilledSoundBuffs = ToPlayLen >> kLnOneBuffLen; + + if (! datp->wantplaying) { +#if dbglog_SoundStuff + dbglog_writeln("playing end transistion"); +#endif + + SoundRampTo(&v1, kCenterTempSound, &dst, &len); + + ToPlayLen = 0; + } else if (! datp->HaveStartedPlaying) { +#if dbglog_SoundStuff + dbglog_writeln("playing start block"); +#endif + + if ((ToPlayLen >> kLnOneBuffLen) < 8) { + ToPlayLen = 0; + } else { + tpSoundSamp p = datp->fTheSoundBuffer + + (CurPlayOffset & kAllBuffMask); + trSoundTemp v2 = ConvertTempSoundSampleFromNative(*p); + +#if dbglog_SoundStuff + dbglog_writeln("have enough samples to start"); +#endif + + SoundRampTo(&v1, v2, &dst, &len); + + if (v1 == v2) { +#if dbglog_SoundStuff + dbglog_writeln("finished start transition"); +#endif + + datp->HaveStartedPlaying = true; + } + } + } + + if (0 == len) { + /* done */ + + if (FilledSoundBuffs < *datp->fMinFilledSoundBuffs) { + *datp->fMinFilledSoundBuffs = FilledSoundBuffs; + } + } else if (0 == ToPlayLen) { + +#if dbglog_SoundStuff + dbglog_writeln("under run"); +#endif + + for (i = 0; i < len; ++i) { + *dst++ = ConvertTempSoundSampleToNative(v1); + } + *datp->fMinFilledSoundBuffs = 0; + } else { + uint16_t PlayBuffContig = kAllBuffLen + - (CurPlayOffset & kAllBuffMask); + tpSoundSamp p = CurSoundBuffer + + (CurPlayOffset & kAllBuffMask); + + if (ToPlayLen > PlayBuffContig) { + ToPlayLen = PlayBuffContig; + } + if (ToPlayLen > len) { + ToPlayLen = len; + } + + for (i = 0; i < ToPlayLen; ++i) { + *dst++ = *p++; + } + v1 = ConvertTempSoundSampleFromNative(p[-1]); + + CurPlayOffset += ToPlayLen; + len -= ToPlayLen; + + *datp->fPlayOffset = CurPlayOffset; + + goto label_retry; + } + + datp->lastv = v1; +} + +LOCALVAR SoundR cur_audio; + +LOCALVAR bool HaveSoundOut = false; + +void Sound_Stop(void) +{ +#if dbglog_SoundStuff + dbglog_writeln("enter Sound_Stop"); +#endif + + if (cur_audio.wantplaying && HaveSoundOut) { + uint16_t retry_limit = 50; /* half of a second */ + + cur_audio.wantplaying = false; + +label_retry: + if (kCenterTempSound == cur_audio.lastv) { +#if dbglog_SoundStuff + dbglog_writeln("reached kCenterTempSound"); +#endif + + /* done */ + } else if (0 == --retry_limit) { +#if dbglog_SoundStuff + dbglog_writeln("retry limit reached"); +#endif + /* done */ + } else + { + /* + give time back, particularly important + if got here on a suspend event. + */ + +#if dbglog_SoundStuff + dbglog_writeln("busy, so sleep"); +#endif + + (void) SDL_Delay(10); + + goto label_retry; + } + + SDL_PauseAudio(1); + } + +#if dbglog_SoundStuff + dbglog_writeln("leave Sound_Stop"); +#endif +} + +void Sound_Start(void) +{ + if ((! cur_audio.wantplaying) && HaveSoundOut) { + Sound_Start0(); + cur_audio.lastv = kCenterTempSound; + cur_audio.HaveStartedPlaying = false; + cur_audio.wantplaying = true; + + SDL_PauseAudio(0); + } +} + +void Sound_UnInit(void) +{ + if (HaveSoundOut) { + SDL_CloseAudio(); + } +} + +#define SOUND_SAMPLERATE 22255 /* = round(7833600 * 2 / 704) */ + +bool Sound_Init(void) +{ + SDL_AudioSpec desired; + + Sound_Init0(); + + cur_audio.fTheSoundBuffer = TheSoundBuffer; + cur_audio.fPlayOffset = &ThePlayOffset; + cur_audio.fFillOffset = &TheFillOffset; + cur_audio.fMinFilledSoundBuffs = &MinFilledSoundBuffs; + cur_audio.wantplaying = false; + + desired.freq = SOUND_SAMPLERATE; + +#if 3 == kLn2SoundSampSz + desired.format = AUDIO_U8; +#elif 4 == kLn2SoundSampSz + desired.format = AUDIO_S16SYS; +#else +#error "unsupported audio format" +#endif + + desired.channels = 1; + desired.samples = 1024; + desired.callback = audio_callback; + desired.userdata = (void *)&cur_audio; + + /* Open the audio device */ + if (SDL_OpenAudio(&desired, NULL) < 0) { + fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); + } else { + HaveSoundOut = true; + + Sound_Start(); + /* + This should be taken care of by LeaveSpeedStopped, + but since takes a while to get going properly, + start early. + */ + } + + return true; /* keep going, even if no sound */ +} + +GLOBALOSGLUPROC Sound_EndWrite(uint16_t actL) +{ + if (Sound_EndWrite0(actL)) { + } +} + +void Sound_SecondNotify(void) +{ + if (HaveSoundOut) { + Sound_SecondNotify0(); + } +} + +#endif diff --git a/src/UI/SDL2/TIMEDATE.c b/src/UI/SDL2/TIMEDATE.c new file mode 100644 index 0000000..b03d13c --- /dev/null +++ b/src/UI/SDL2/TIMEDATE.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "STRCONST.h" + +/* --- time, date, location --- */ + +#define dbglog_TimeStuff (0 && dbglog_HAVE) + +uint32_t TrueEmulatedTime = 0; + +#define InvTimeDivPow 16 +#define InvTimeDiv (1 << InvTimeDivPow) +#define InvTimeDivMask (InvTimeDiv - 1) +#define InvTimeStep 1089590 /* 1000 / 60.14742 * InvTimeDiv */ + +uint32_t LastTime; +uint32_t NextIntTime; +uint32_t NextFracTime; + +void IncrNextTime(void) +{ + NextFracTime += InvTimeStep; + NextIntTime += (NextFracTime >> InvTimeDivPow); + NextFracTime &= InvTimeDivMask; +} + +void InitNextTime(void) +{ + NextIntTime = LastTime; + NextFracTime = 0; + IncrNextTime(); +} + +LOCALVAR uint32_t NewMacDateInSeconds; + +bool UpdateTrueEmulatedTime(void) +{ + Uint32 LatestTime; + int32_t TimeDiff; + + LatestTime = SDL_GetTicks(); + if (LatestTime != LastTime) { + + NewMacDateInSeconds = LatestTime / 1000; + /* no date and time api in SDL */ + + LastTime = LatestTime; + TimeDiff = (LatestTime - NextIntTime); + /* this should work even when time wraps */ + if (TimeDiff >= 0) { + if (TimeDiff > 256) { + /* emulation interrupted, forget it */ + ++TrueEmulatedTime; + InitNextTime(); + +#if dbglog_TimeStuff + dbglog_writelnNum("emulation interrupted", + TrueEmulatedTime); +#endif + } else { + do { + ++TrueEmulatedTime; + IncrNextTime(); + TimeDiff = (LatestTime - NextIntTime); + } while (TimeDiff >= 0); + } + return true; + } else { + if (TimeDiff < -256) { +#if dbglog_TimeStuff + dbglog_writeln("clock set back"); +#endif + /* clock goofed if ever get here, reset */ + InitNextTime(); + } + } + } + return false; +} + + +bool CheckDateTime(void) +{ + if (CurMacDateInSeconds != NewMacDateInSeconds) { + CurMacDateInSeconds = NewMacDateInSeconds; + return true; + } else { + return false; + } +} + +void StartUpTimeAdjust(void) +{ + LastTime = SDL_GetTicks(); + InitNextTime(); +} + +bool InitLocationDat(void) +{ + LastTime = SDL_GetTicks(); + InitNextTime(); + NewMacDateInSeconds = LastTime / 1000; + CurMacDateInSeconds = NewMacDateInSeconds; + + return true; +} diff --git a/src/UI/SDL2/VIDEO.c b/src/UI/SDL2/VIDEO.c new file mode 100644 index 0000000..1d2a3ad --- /dev/null +++ b/src/UI/SDL2/VIDEO.c @@ -0,0 +1,552 @@ +#include +#include +#include +#include +#include "CNFGRAPI.h" +#include "SYSDEPNS.h" +#include "UTIL/ENDIANAC.h" +#include "UI/MYOSGLUE.h" +#include "UI/COMOSGLU.h" +#include "STRCONST.h" +#include "OSGLUSD2.h" + +/* --- video out --- */ + +#if MayFullScreen +int hOffset; +int vOffset; +#endif +bool UseFullScreen = (WantInitFullScreen != 0); +bool UseMagnify = (WantInitMagnify != 0); + +bool gBackgroundFlag = false; +bool gTrueBackgroundFlag = false; +bool CurSpeedStopped = true; +SDL_Window *main_wind = NULL; +SDL_Renderer *renderer = NULL; +SDL_Texture *texture = NULL; +SDL_PixelFormat *format = NULL; + +uint8_t * ScalingBuff = nullpr; +uint8_t * CLUT_final; + /* + 256 possible values of one byte + 8 pixels per byte maximum (when black and white) + 4 bytes per destination pixel maximum + multiplied by WindowScale if 1 + */ + +#define ScrnMapr_DoMap UpdateBWDepth3Copy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth 0 +#define ScrnMapr_DstDepth 3 +#define ScrnMapr_Map CLUT_final + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateBWDepth4Copy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth 0 +#define ScrnMapr_DstDepth 4 +#define ScrnMapr_Map CLUT_final + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateBWDepth5Copy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth 0 +#define ScrnMapr_DstDepth 5 +#define ScrnMapr_Map CLUT_final + +#include "HW/SCREEN/SCRNMAPR.h" + +#if 1 && ! UseSDLscaling + +#define ScrnMapr_DoMap UpdateBWDepth3ScaledCopy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth 0 +#define ScrnMapr_DstDepth 3 +#define ScrnMapr_Map CLUT_final +#define ScrnMapr_Scale WindowScale + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateBWDepth4ScaledCopy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth 0 +#define ScrnMapr_DstDepth 4 +#define ScrnMapr_Map CLUT_final +#define ScrnMapr_Scale WindowScale + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateBWDepth5ScaledCopy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth 0 +#define ScrnMapr_DstDepth 5 +#define ScrnMapr_Map CLUT_final +#define ScrnMapr_Scale WindowScale + +#include "HW/SCREEN/SCRNMAPR.h" + +#endif /* 1 && ! UseSDLscaling */ + + +#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) + +#define ScrnMapr_DoMap UpdateColorDepth3Copy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth vMacScreenDepth +#define ScrnMapr_DstDepth 3 +#define ScrnMapr_Map CLUT_final + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateColorDepth4Copy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth vMacScreenDepth +#define ScrnMapr_DstDepth 4 +#define ScrnMapr_Map CLUT_final + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateColorDepth5Copy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth vMacScreenDepth +#define ScrnMapr_DstDepth 5 +#define ScrnMapr_Map CLUT_final + +#include "HW/SCREEN/SCRNMAPR.h" + +#if 1 && ! UseSDLscaling + +#define ScrnMapr_DoMap UpdateColorDepth3ScaledCopy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth vMacScreenDepth +#define ScrnMapr_DstDepth 3 +#define ScrnMapr_Map CLUT_final +#define ScrnMapr_Scale WindowScale + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateColorDepth4ScaledCopy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth vMacScreenDepth +#define ScrnMapr_DstDepth 4 +#define ScrnMapr_Map CLUT_final +#define ScrnMapr_Scale WindowScale + +#include "HW/SCREEN/SCRNMAPR.h" + +#define ScrnMapr_DoMap UpdateColorDepth5ScaledCopy +#define ScrnMapr_Src GetCurDrawBuff() +#define ScrnMapr_Dst ScalingBuff +#define ScrnMapr_SrcDepth vMacScreenDepth +#define ScrnMapr_DstDepth 5 +#define ScrnMapr_Map CLUT_final +#define ScrnMapr_Scale WindowScale + +#include "HW/SCREEN/SCRNMAPR.h" + +#endif /* 1 && ! UseSDLscaling */ + +#endif + + +LOCALPROC HaveChangedScreenBuff(uint16_t top, uint16_t left, + uint16_t bottom, uint16_t right) +{ + int i; + int j; + uint8_t *p; + Uint32 pixel; +#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) + Uint32 CLUT_pixel[CLUT_size]; +#endif + Uint32 BWLUT_pixel[2]; + uint32_t top2; + uint32_t left2; + uint32_t bottom2; + uint32_t right2; + void *pixels; + int pitch; + SDL_Rect src_rect; + SDL_Rect dst_rect; + int XDest; + int YDest; + int DestWidth; + int DestHeight; + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + if (top < ViewVStart) { + top = ViewVStart; + } + if (left < ViewHStart) { + left = ViewHStart; + } + if (bottom > ViewVStart + ViewVSize) { + bottom = ViewVStart + ViewVSize; + } + if (right > ViewHStart + ViewHSize) { + right = ViewHStart + ViewHSize; + } + + if ((top >= bottom) || (left >= right)) { + goto label_exit; + } + } +#endif + + XDest = left; + YDest = top; + DestWidth = (right - left); + DestHeight = (bottom - top); + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + XDest -= ViewHStart; + YDest -= ViewVStart; + } +#endif + +#if 1 + if (UseMagnify) { + XDest *= WindowScale; + YDest *= WindowScale; + DestWidth *= WindowScale; + DestHeight *= WindowScale; + } +#endif + +#if 1 + if (UseFullScreen) +#endif +#if MayFullScreen + { + XDest += hOffset; + YDest += vOffset; + } +#endif + + top2 = top; + left2 = left; + bottom2 = bottom; + right2 = right; + +#if 1 && ! UseSDLscaling + if (UseMagnify) { + top2 *= WindowScale; + left2 *= WindowScale; + bottom2 *= WindowScale; + right2 *= WindowScale; + } +#endif + + if (0 != SDL_LockTexture(texture, NULL, &pixels, &pitch)) { + return; + } + + { + + int bpp = format->BytesPerPixel; + uint32_t ExpectedPitch = vMacScreenWidth * bpp; + +#if 1 && ! UseSDLscaling + if (UseMagnify) { + ExpectedPitch *= WindowScale; + } +#endif + +#if 0 != vMacScreenDepth + if (UseColorMode) { +#if vMacScreenDepth < 4 + for (i = 0; i < CLUT_size; ++i) { + CLUT_pixel[i] = SDL_MapRGB(format, + CLUT_reds[i] >> 8, + CLUT_greens[i] >> 8, + CLUT_blues[i] >> 8); + } +#endif + } else +#endif + { + BWLUT_pixel[1] = SDL_MapRGB(format, 0, 0, 0); + /* black */ + BWLUT_pixel[0] = SDL_MapRGB(format, 255, 255, 255); + /* white */ + } + + if ((0 == ((bpp - 1) & bpp)) /* a power of 2 */ + && (pitch == ExpectedPitch) +#if (vMacScreenDepth > 3) + && ! UseColorMode +#endif + ) + { + int k; + Uint32 v; +#if 1 && ! UseSDLscaling + int a; +#endif + int PixPerByte = +#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) + UseColorMode ? (1 << (3 - vMacScreenDepth)) : +#endif + 8; + Uint8 *p4 = (Uint8 *)CLUT_final; + + for (i = 0; i < 256; ++i) { + for (k = PixPerByte; --k >= 0; ) { + +#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) + if (UseColorMode) { + v = CLUT_pixel[ +#if 3 == vMacScreenDepth + i +#else + (i >> (k << vMacScreenDepth)) + & (CLUT_size - 1) +#endif + ]; + } else +#endif + { + v = BWLUT_pixel[(i >> k) & 1]; + } + +#if 1 && ! UseSDLscaling + for (a = UseMagnify ? WindowScale : 1; --a >= 0; ) +#endif + { + switch (bpp) { + case 1: /* Assuming 8-bpp */ + *p4++ = v; + break; + case 2: /* Probably 15-bpp or 16-bpp */ + *(Uint16 *)p4 = v; + p4 += 2; + break; + case 4: /* Probably 32-bpp */ + *(Uint32 *)p4 = v; + p4 += 4; + break; + } + } + } + } + + ScalingBuff = (uint8_t *)pixels; + +#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) + if (UseColorMode) { +#if 1 && ! UseSDLscaling + if (UseMagnify) { + switch (bpp) { + case 1: + UpdateColorDepth3ScaledCopy( + top, left, bottom, right); + break; + case 2: + UpdateColorDepth4ScaledCopy( + top, left, bottom, right); + break; + case 4: + UpdateColorDepth5ScaledCopy( + top, left, bottom, right); + break; + } + } else +#endif + { + switch (bpp) { + case 1: + UpdateColorDepth3Copy(top, left, bottom, right); + break; + case 2: + UpdateColorDepth4Copy(top, left, bottom, right); + break; + case 4: + UpdateColorDepth5Copy(top, left, bottom, right); + break; + } + } + } else +#endif + { +#if 1 && ! UseSDLscaling + if (UseMagnify) { + switch (bpp) { + case 1: + UpdateBWDepth3ScaledCopy( + top, left, bottom, right); + break; + case 2: + UpdateBWDepth4ScaledCopy( + top, left, bottom, right); + break; + case 4: + UpdateBWDepth5ScaledCopy( + top, left, bottom, right); + break; + } + } else +#endif + { + switch (bpp) { + case 1: + UpdateBWDepth3Copy(top, left, bottom, right); + break; + case 2: + UpdateBWDepth4Copy(top, left, bottom, right); + break; + case 4: + UpdateBWDepth5Copy(top, left, bottom, right); + break; + } + } + } + + } else { + uint8_t *the_data = (uint8_t *)GetCurDrawBuff(); + + /* adapted from putpixel in SDL documentation */ + + for (i = top2; i < bottom2; ++i) { + for (j = left2; j < right2; ++j) { + int i0 = i; + int j0 = j; + Uint8 *bufp = (Uint8 *)pixels + + i * pitch + j * bpp; + +#if 1 && ! UseSDLscaling + if (UseMagnify) { + i0 /= WindowScale; + j0 /= WindowScale; + } +#endif + +#if 0 != vMacScreenDepth + if (UseColorMode) { +#if vMacScreenDepth < 4 + p = the_data + ((i0 * vMacScreenWidth + j0) + >> (3 - vMacScreenDepth)); + { + uint8_t k = (*p >> (((~ j0) + & ((1 << (3 - vMacScreenDepth)) - 1)) + << vMacScreenDepth)) + & (CLUT_size - 1); + pixel = CLUT_pixel[k]; + } +#elif 4 == vMacScreenDepth + p = the_data + ((i0 * vMacScreenWidth + j0) << 1); + { + uint16_t t0 = do_get_mem_word(p); + pixel = SDL_MapRGB(format, + ((t0 & 0x7C00) >> 7) + | ((t0 & 0x7000) >> 12), + ((t0 & 0x03E0) >> 2) + | ((t0 & 0x0380) >> 7), + ((t0 & 0x001F) << 3) + | ((t0 & 0x001C) >> 2)); + } +#elif 5 == vMacScreenDepth + p = the_data + ((i0 * vMacScreenWidth + j0) << 2); + pixel = SDL_MapRGB(format, + p[1], + p[2], + p[3]); +#endif + } else +#endif + { + p = the_data + ((i0 * vMacScreenWidth + j0) / 8); + pixel = BWLUT_pixel[(*p >> ((~ j0) & 0x7)) & 1]; + } + + switch (bpp) { + case 1: /* Assuming 8-bpp */ + *bufp = pixel; + break; + case 2: /* Probably 15-bpp or 16-bpp */ + *(Uint16 *)bufp = pixel; + break; + case 3: + /* Slow 24-bpp mode, usually not used */ + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + bufp[0] = (pixel >> 16) & 0xff; + bufp[1] = (pixel >> 8) & 0xff; + bufp[2] = pixel & 0xff; + } else { + bufp[0] = pixel & 0xff; + bufp[1] = (pixel >> 8) & 0xff; + bufp[2] = (pixel >> 16) & 0xff; + } + break; + case 4: /* Probably 32-bpp */ + *(Uint32 *)bufp = pixel; + break; + } + } + } + } + + } + + SDL_UnlockTexture(texture); + + src_rect.x = left2; + src_rect.y = top2; + src_rect.w = right2 - left2; + src_rect.h = bottom2 - top2; + + dst_rect.x = XDest; + dst_rect.y = YDest; + dst_rect.w = DestWidth; + dst_rect.h = DestHeight; + + /* SDL_RenderClear(renderer); */ + SDL_RenderCopy(renderer, texture, &src_rect, &dst_rect); + SDL_RenderPresent(renderer); + +#if MayFullScreen +label_exit: + ; +#endif +} + +LOCALPROC DrawChangesAndClear(void) +{ + if (ScreenChangedBottom > ScreenChangedTop) { + HaveChangedScreenBuff(ScreenChangedTop, ScreenChangedLeft, + ScreenChangedBottom, ScreenChangedRight); + ScreenClearChanges(); + } +} + +GLOBALOSGLUPROC DoneWithDrawingForTick(void) +{ +#if EnableFSMouseMotion + if (HaveMouseMotion) { + AutoScrollScreen(); + } +#endif + DrawChangesAndClear(); +}