1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef SCI_ENGINE_KERNEL_TABLES_H
24 #define SCI_ENGINE_KERNEL_TABLES_H
25 
26 #include "sci/engine/workarounds.h"
27 #include "sci/engine/vm_types.h" // for opcode_formats
28 
29 namespace Sci {
30 
31 // [io] -> either integer or object
32 // (io) -> optionally integer AND an object
33 // (i) -> optional integer
34 // . -> any type
35 // i* -> optional multiple integers
36 // .* -> any parameters afterwards (or none)
37 //
38 // data types:
39 // i - regular integer
40 // o - object
41 // r - reference
42 // n - node
43 // 0 - NULL
44 // . - any
45 // ! - invalid reference/offset
46 
47 struct SciKernelMapSubEntry {
48 	SciVersion fromVersion;
49 	SciVersion toVersion;
50 
51 	uint16 id;
52 
53 	const char *name;
54 	KernelFunctionCall *function;
55 
56 	const char *signature;
57 	const SciWorkaroundEntry *workarounds;
58 };
59 
60 #define SCI_SUBOPENTRY_TERMINATOR { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, NULL, NULL, NULL, NULL }
61 
62 
63 #define SIG_SCIALL           SCI_VERSION_NONE, SCI_VERSION_NONE
64 #define SIG_SCI0             SCI_VERSION_NONE, SCI_VERSION_01
65 #define SIG_SCI1             SCI_VERSION_1_EGA_ONLY, SCI_VERSION_1_LATE
66 #define SIG_SCI11            SCI_VERSION_1_1, SCI_VERSION_1_1
67 #define SIG_SINCE_SCI11      SCI_VERSION_1_1, SCI_VERSION_NONE
68 #define SIG_SCI2             SCI_VERSION_2, SCI_VERSION_2
69 #define SIG_SCI21EARLY       SCI_VERSION_2_1_EARLY, SCI_VERSION_2_1_EARLY
70 #define SIG_SCI21MID_LATE    SCI_VERSION_2_1_MIDDLE, SCI_VERSION_2_1_LATE
71 #define SIG_THRU_SCI21EARLY  SCI_VERSION_2, SCI_VERSION_2_1_EARLY
72 #define SIG_THRU_SCI21MID    SCI_VERSION_2, SCI_VERSION_2_1_MIDDLE
73 #define SIG_SINCE_SCI21      SCI_VERSION_2_1_EARLY, SCI_VERSION_3
74 #define SIG_SINCE_SCI21MID   SCI_VERSION_2_1_MIDDLE, SCI_VERSION_3
75 #define SIG_SINCE_SCI21LATE  SCI_VERSION_2_1_LATE, SCI_VERSION_3
76 #define SIG_SCI21LATE        SCI_VERSION_2_1_LATE, SCI_VERSION_2_1_LATE
77 #define SIG_SCI3             SCI_VERSION_3, SCI_VERSION_3
78 
79 #define SIG_SCI16          SCI_VERSION_NONE, SCI_VERSION_1_1
80 #define SIG_SCI32          SCI_VERSION_2, SCI_VERSION_NONE
81 
82 // SCI-Sound-Version
83 #define SIG_SOUNDSCI0      SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE
84 #define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY
85 #define SIG_SOUNDSCI1LATE  SCI_VERSION_1_LATE, SCI_VERSION_1_LATE
86 
87 #define SIGFOR_ALL   0x3f
88 #define SIGFOR_DOS   1 << 0
89 #define SIGFOR_PC98  1 << 1
90 #define SIGFOR_WIN   1 << 2
91 #define SIGFOR_MAC   1 << 3
92 #define SIGFOR_AMIGA 1 << 4
93 #define SIGFOR_ATARI 1 << 5
94 #define SIGFOR_PC    SIGFOR_DOS|SIGFOR_WIN
95 
96 #define SIG_EVERYWHERE  SIG_SCIALL, SIGFOR_ALL
97 
98 #define MAP_CALL(_name_) #_name_, k##_name_
99 #define MAP_EMPTY(_name_) #_name_, kEmpty
100 #define MAP_DUMMY(_name_) #_name_, kDummy
101 
102 //    version,         subId, function-mapping,                    signature,              workarounds
103 static const SciKernelMapSubEntry kDoSound_subops[] = {
104 	{ SIG_SOUNDSCI0,       0, MAP_CALL(DoSoundInit),               "o",                    NULL },
105 	{ SIG_SOUNDSCI0,       1, MAP_CALL(DoSoundPlay),               "o",                    NULL },
106 	{ SIG_SOUNDSCI0,       2, MAP_EMPTY(DoSoundRestore),           "(o)",                  NULL },
107 	{ SIG_SOUNDSCI0,       3, MAP_CALL(DoSoundDispose),            "o",                    NULL },
108 	{ SIG_SOUNDSCI0,       4, MAP_CALL(DoSoundMute),               "(i)",                  NULL },
109 	{ SIG_SOUNDSCI0,       5, MAP_CALL(DoSoundStop),               "o",                    NULL },
110 	{ SIG_SOUNDSCI0,       6, MAP_CALL(DoSoundPause),              "i",                    NULL },
111 	{ SIG_SOUNDSCI0,       7, MAP_CALL(DoSoundResumeAfterRestore), "",                     NULL },
112 	{ SIG_SOUNDSCI0,       8, MAP_CALL(DoSoundMasterVolume),       "(i)",                  NULL },
113 	{ SIG_SOUNDSCI0,       9, MAP_CALL(DoSoundUpdate),             "o",                    NULL },
114 	{ SIG_SOUNDSCI0,      10, MAP_CALL(DoSoundFade),               "[o0]",                 kDoSoundFade_workarounds },
115 	{ SIG_SOUNDSCI0,      11, MAP_CALL(DoSoundGetPolyphony),       "",                     NULL },
116 	{ SIG_SOUNDSCI0,      12, MAP_CALL(DoSoundStopAll),            "",                     NULL },
117 	{ SIG_SOUNDSCI1EARLY,  0, MAP_CALL(DoSoundMasterVolume),       NULL,                   NULL },
118 	{ SIG_SOUNDSCI1EARLY,  1, MAP_CALL(DoSoundMute),               NULL,                   NULL },
119 	{ SIG_SOUNDSCI1EARLY,  2, MAP_EMPTY(DoSoundRestore),           NULL,                   NULL },
120 	{ SIG_SOUNDSCI1EARLY,  3, MAP_CALL(DoSoundGetPolyphony),       NULL,                   NULL },
121 	{ SIG_SOUNDSCI1EARLY,  4, MAP_CALL(DoSoundUpdate),             NULL,                   NULL },
122 	{ SIG_SOUNDSCI1EARLY,  5, MAP_CALL(DoSoundInit),               NULL,                   NULL },
123 	{ SIG_SOUNDSCI1EARLY,  6, MAP_CALL(DoSoundDispose),            NULL,                   NULL },
124 	{ SIG_SOUNDSCI1EARLY,  7, MAP_CALL(DoSoundPlay),               "oi",                   NULL },
125 	{ SIG_SOUNDSCI1EARLY,  8, MAP_CALL(DoSoundStop),               NULL,                   NULL },
126 	{ SIG_SOUNDSCI1EARLY,  9, MAP_CALL(DoSoundPause),              "[o0]i",                NULL },
127 	{ SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade),               "oiiii",                kDoSoundFade_workarounds },
128 	{ SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues),         "o",                    NULL },
129 	{ SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi),           "oiii",                 NULL },
130 	{ SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundGlobalReverb),       "(i)",                  NULL },
131 	{ SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold),            "oi",                   NULL },
132 	{ SIG_SOUNDSCI1EARLY, 15, MAP_EMPTY(DoSoundDummy),             "",                     NULL },
133 	//  ^^ Longbow demo
134 	{ SIG_SOUNDSCI1LATE,   0, MAP_CALL(DoSoundMasterVolume),       NULL,                   NULL },
135 	{ SIG_SOUNDSCI1LATE,   1, MAP_CALL(DoSoundMute),               NULL,                   NULL },
136 	{ SIG_SOUNDSCI1LATE,   2, MAP_EMPTY(DoSoundRestore),           "",                     NULL },
137 	{ SIG_SOUNDSCI1LATE,   3, MAP_CALL(DoSoundGetPolyphony),       NULL,                   NULL },
138 	{ SIG_SOUNDSCI1LATE,   4, MAP_CALL(DoSoundGetAudioCapability), "",                     NULL },
139 	{ SIG_SOUNDSCI1LATE,   5, MAP_CALL(DoSoundSuspend),            "i",                    NULL },
140 	{ SIG_SOUNDSCI1LATE,   6, MAP_CALL(DoSoundInit),               NULL,                   NULL },
141 	{ SIG_SOUNDSCI1LATE,   7, MAP_CALL(DoSoundDispose),            NULL,                   NULL },
142 	{ SIG_SOUNDSCI1LATE,   8, MAP_CALL(DoSoundPlay),               NULL,                   NULL },
143 	{ SIG_SOUNDSCI1LATE,   9, MAP_CALL(DoSoundStop),               NULL,                   NULL },
144 	{ SIG_SOUNDSCI1LATE,  10, MAP_CALL(DoSoundPause),              NULL,                   NULL },
145 	{ SIG_SOUNDSCI1LATE,  11, MAP_CALL(DoSoundFade),               "oiiii(i)",             kDoSoundFade_workarounds },
146 	{ SIG_SOUNDSCI1LATE,  12, MAP_CALL(DoSoundSetHold),            NULL,                   NULL },
147 	{ SIG_SOUNDSCI1LATE,  13, MAP_EMPTY(DoSoundDummy),             NULL,                   NULL },
148 	{ SIG_SOUNDSCI1LATE,  14, MAP_CALL(DoSoundSetVolume),          "oi",                   NULL },
149 	{ SIG_SOUNDSCI1LATE,  15, MAP_CALL(DoSoundSetPriority),        "oi",                   NULL },
150 	{ SIG_SOUNDSCI1LATE,  16, MAP_CALL(DoSoundSetLoop),            "oi",                   NULL },
151 	{ SIG_SOUNDSCI1LATE,  17, MAP_CALL(DoSoundUpdateCues),         NULL,                   NULL },
152 	{ SIG_SOUNDSCI1LATE,  18, MAP_CALL(DoSoundSendMidi),           "oiii(i)",              NULL },
153 	{ SIG_SOUNDSCI1LATE,  19, MAP_CALL(DoSoundGlobalReverb),       NULL,                   NULL },
154 	{ SIG_SOUNDSCI1LATE,  20, MAP_CALL(DoSoundUpdate),             NULL,                   NULL },
155 #ifdef ENABLE_SCI32
156 	{ SIG_SCI32,           0, MAP_CALL(DoSoundMasterVolume),       "(i)",                  NULL },
157 	{ SIG_SCI32,           1, MAP_CALL(DoSoundMute),               "(i)",                  NULL },
158 	{ SIG_SCI32,           2, MAP_EMPTY(DoSoundRestore),           NULL,                   NULL },
159 	{ SIG_SCI32,           3, MAP_CALL(DoSoundGetPolyphony),       "",                     NULL },
160 	{ SIG_SCI32,           4, MAP_CALL(DoSoundGetAudioCapability), "",                     NULL },
161 	{ SIG_SCI32,           5, MAP_CALL(DoSoundSuspend),            "i",                    NULL },
162 	{ SIG_SCI32,           6, MAP_CALL(DoSoundInit),               "o",                    NULL },
163 	{ SIG_SCI32,           7, MAP_CALL(DoSoundDispose),            "o",                    NULL },
164 	{ SIG_SCI32,           8, MAP_CALL(DoSoundPlay),               "o",                    kDoSoundPlay_workarounds },
165 	{ SIG_SCI32,           9, MAP_CALL(DoSoundStop),               "o",                    NULL },
166 	{ SIG_SCI32,          10, MAP_CALL(DoSoundPause),              "[o0]i",                NULL },
167 	{ SIG_SCI32,          11, MAP_CALL(DoSoundFade),               "oiiii",                kDoSoundFade_workarounds },
168 	{ SIG_SCI32,          12, MAP_CALL(DoSoundSetHold),            "oi",                   NULL },
169 	{ SIG_SCI32,          13, MAP_EMPTY(DoSoundDummy),             NULL,                   NULL },
170 	{ SIG_SCI32,          14, MAP_CALL(DoSoundSetVolume),          "oi",                   NULL },
171 	{ SIG_SCI32,          15, MAP_CALL(DoSoundSetPriority),        "oi",                   NULL },
172 	{ SIG_SCI32,          16, MAP_CALL(DoSoundSetLoop),            "oi",                   NULL },
173 	{ SIG_SCI32,          17, MAP_CALL(DoSoundUpdateCues),         "o",                    NULL },
174 	{ SIG_SCI32,          18, MAP_CALL(DoSoundSendMidi),           "oiiii",                NULL },
175 	{ SIG_SCI32,          19, MAP_CALL(DoSoundGlobalReverb),       "(i)",                  NULL },
176 	{ SIG_SCI32,          20, MAP_CALL(DoSoundUpdate),             "o",                    NULL },
177 #endif
178 	SCI_SUBOPENTRY_TERMINATOR
179 };
180 
181 #ifdef ENABLE_SCI32
182 // NOTE: In SSCI, some 'unused' kDoAudio subops are actually called indirectly
183 // by kDoSound:
184 //
185 // kDoSoundGetAudioCapability -> kDoAudioGetCapability
186 // kDoSoundPlay       -> kDoAudioPlay, kDoAudioStop
187 // kDoSoundPause      -> kDoAudioPause, kDoAudioResume
188 // kDoSoundFade       -> kDoAudioFade
189 // kDoSoundSetVolume  -> kDoAudioVolume
190 // kDoSoundSetLoop    -> kDoAudioSetLoop
191 // kDoSoundUpdateCues -> kDoAudioPosition
192 //
193 // In ScummVM, logic inside these kernel functions has been moved to methods of
194 // Audio32, and direct calls to Audio32 are made from kDoSound instead.
195 //
196 // Some kDoAudio methods are esoteric and appear to be used only by one or two
197 // games:
198 //
199 // - kDoAudioMixing:    Phantasmagoria (other games call this function, but only
200 //                      to disable the feature)
201 // - kDoAudioHasSignal: SQ6 TalkRandCycle
202 // - kDoAudioPan:       Rama RegionSFX::pan method
203 // - kDoAudioCritical:  Phantasmagoria, chapter 3, nursery (room 14200), during
204 //                      the "ghost lullaby" event. It is used to make the
205 //                      lullaby sound exclusive, but it really doesn't make any
206 //                      major difference. Returning 0 means "non-critical", i.e.
207 //                      normal audio behavior.
208 //
209 // Finally, there is a split in SCI2.1mid audio code. QFG4CD & SQ6 do not have
210 // opcodes 18 and 19, but they exist in GK2, KQ7 2.00b, Phantasmagoria 1,
211 // PQ:SWAT, and Torin. It is unknown if they exist in MUMG Deluxe or Shivers 1;
212 // they are not used in either of these games.
213 
214 //    version,         subId, function-mapping,                    signature,              workarounds
215 static const SciKernelMapSubEntry kDoAudio_subops[] = {
216 	{ SIG_SCI32,           0, MAP_CALL(DoAudioInit),               "",                     NULL },
217 	// SCI2 includes a Sync script that would call
218 	// kDoAudioWaitForPlay, but SSCI has no opcode 1 until
219 	// SCI2.1early
220 	{ SIG_SINCE_SCI21,     1, MAP_CALL(DoAudioWaitForPlay),        "(i)(i)(i)(i)(i)(i)(i)", NULL },
221 	{ SIG_SCI32,           2, MAP_CALL(DoAudioPlay),               "(i)(i)(i)(i)(i)(i)(i)", NULL },
222 	{ SIG_SCI32,           3, MAP_CALL(DoAudioStop),               "(i)(i)(i)(i)(i)",      NULL },
223 	{ SIG_SCI32,           4, MAP_CALL(DoAudioPause),              "(i)(i)(i)(i)(i)",      NULL },
224 	{ SIG_SCI32,           5, MAP_CALL(DoAudioResume),             "(i)(i)(i)(i)(i)",      kDoAudioResume_workarounds },
225 	{ SIG_SCI32,           6, MAP_CALL(DoAudioPosition),           "(i)(i)(i)(i)(i)",      NULL },
226 	{ SIG_SCI32,           7, MAP_CALL(DoAudioRate),               "(i)",                  NULL },
227 	{ SIG_SCI32,           8, MAP_CALL(DoAudioVolume),             "(i)(i)(i)(i)(i)(i)",   NULL },
228 	{ SIG_SCI32,           9, MAP_CALL(DoAudioGetCapability),      "",                     NULL },
229 	{ SIG_SCI32,          10, MAP_CALL(DoAudioBitDepth),           "(i)",                  NULL },
230 	{ SIG_SCI32,          11, MAP_DUMMY(DoAudioDistort),           "(i)",                  NULL },
231 	{ SIG_SCI32,          12, MAP_CALL(DoAudioMixing),             "(i)",                  NULL },
232 	{ SIG_SCI2,           13, MAP_EMPTY(DoAudioSetBufferSize),     "i",                    NULL },
233 	{ SIG_SINCE_SCI21,    13, MAP_CALL(DoAudioChannels),           "(i)",                  NULL },
234 	{ SIG_SINCE_SCI21,    14, MAP_CALL(DoAudioPreload),            "(i)",                  NULL },
235 	{ SIG_SINCE_SCI21MID, 15, MAP_CALL(DoAudioFade),               "(iiii)(i)(i)",         NULL },
236 	{ SIG_SINCE_SCI21MID, 16, MAP_DUMMY(DoAudioFade36),            "iiiii(iii)(i)",        NULL },
237 	{ SIG_SINCE_SCI21MID, 17, MAP_CALL(DoAudioHasSignal),          "",                     NULL },
238 	{ SIG_SINCE_SCI21MID, 18, MAP_EMPTY(DoAudioCritical),          "(i)",                  NULL },
239 	{ SIG_SINCE_SCI21MID, 19, MAP_CALL(DoAudioSetLoop),            "iii(o)",               NULL },
240 	{ SIG_SCI3,           20, MAP_CALL(DoAudioPan),                "ii(i)(iii)",           NULL },
241 	{ SIG_SCI3,           21, MAP_CALL(DoAudioPanOff),             "i(i)(iii)",            NULL },
242 	SCI_SUBOPENTRY_TERMINATOR
243 };
244 #endif
245 
246 //    version,         subId, function-mapping,                    signature,              workarounds
247 static const SciKernelMapSubEntry kGraph_subops[] = {
248 	// 1 - load bits
249 	{ SIG_SCIALL,          2, MAP_CALL(GraphGetColorCount),        "",                     NULL },
250 	// 3 - set palette via resource
251 	{ SIG_SCIALL,          4, MAP_CALL(GraphDrawLine),             "iiiii(i)(i)",          kGraphDrawLine_workarounds },
252 	// 5 - nop
253 	// 6 - draw pattern
254 	{ SIG_SCIALL,          7, MAP_CALL(GraphSaveBox),              "iiiii",                kGraphSaveBox_workarounds },
255 	{ SIG_SCIALL,          8, MAP_CALL(GraphRestoreBox),           "[r0!]",                kGraphRestoreBox_workarounds },
256 	// ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same
257 	{ SIG_SCIALL,          9, MAP_CALL(GraphFillBoxBackground),    "iiii",                 NULL },
258 	{ SIG_SCIALL,         10, MAP_CALL(GraphFillBoxForeground),    "iiii",                 kGraphFillBoxForeground_workarounds },
259 	{ SIG_SCIALL,         11, MAP_CALL(GraphFillBoxAny),           "iiiiii(i)(i)",         kGraphFillBoxAny_workarounds },
260 	{ SIG_SCI11,          12, MAP_CALL(GraphUpdateBox),            "iiii(i)(r0)",          kGraphUpdateBox_workarounds }, // kq6 hires
261 	{ SIG_SCIALL,         12, MAP_CALL(GraphUpdateBox),            "iiii(i)",              kGraphUpdateBox_workarounds },
262 	{ SIG_SCIALL,         13, MAP_CALL(GraphRedrawBox),            "iiii",                 kGraphRedrawBox_workarounds },
263 	{ SIG_SCIALL,         14, MAP_CALL(GraphAdjustPriority),       "ii",                   NULL },
264 	{ SIG_SCI11,          15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii",                 NULL }, // kq6 hires
265 	SCI_SUBOPENTRY_TERMINATOR
266 };
267 
268 //    version,         subId, function-mapping,                    signature,              workarounds
269 static const SciKernelMapSubEntry kPalVary_subops[] = {
270 	{ SIG_SCI16,           0, MAP_CALL(PalVaryInit),               "ii(i)(i)",             NULL },
271 	{ SIG_SCI16,           1, MAP_CALL(PalVaryReverse),            "(i)(i)(i)",            NULL },
272 	{ SIG_SCI16,           2, MAP_CALL(PalVaryGetCurrentStep),     "",                     NULL },
273 	{ SIG_SCI16,           3, MAP_CALL(PalVaryDeinit),             "",                     NULL },
274 	{ SIG_SCI16,           4, MAP_CALL(PalVaryChangeTarget),       "i",                    NULL },
275 	{ SIG_SCI16,           5, MAP_CALL(PalVaryChangeTicks),        "i",                    NULL },
276 	{ SIG_SCI16,           6, MAP_CALL(PalVaryPauseResume),        "i",                    NULL },
277 #ifdef ENABLE_SCI32
278 	{ SIG_SCI32,           0, MAP_CALL(PalVarySetVary),            "i(i)(i)(i)(i)",        kPalVarySetVary_workarounds },
279 	{ SIG_SCI32,           1, MAP_CALL(PalVarySetPercent),         "(i)(i)",               kPalVarySetPercent_workarounds },
280 	{ SIG_SCI32,           2, MAP_CALL(PalVaryGetPercent),         "",                     NULL },
281 	{ SIG_SCI32,           3, MAP_CALL(PalVaryOff),                "",                     NULL },
282 	{ SIG_SCI32,           4, MAP_CALL(PalVaryMergeTarget),        "i",                    NULL },
283 	{ SIG_SCI32,           5, MAP_CALL(PalVarySetTime),            "i",                    NULL },
284 	{ SIG_SCI32,           6, MAP_CALL(PalVaryPauseResume),        "i",                    NULL },
285 	{ SIG_SCI32,           7, MAP_CALL(PalVarySetTarget),          "i",                    NULL },
286 	{ SIG_SCI32,           8, MAP_CALL(PalVarySetStart),           "i",                    kPalVarySetStart_workarounds },
287 	{ SIG_SCI32,           9, MAP_CALL(PalVaryMergeStart),         "i",                    kPalVaryMergeStart_workarounds },
288 #endif
289 	SCI_SUBOPENTRY_TERMINATOR
290 };
291 
292 //    version,         subId, function-mapping,                    signature,              workarounds
293 static const SciKernelMapSubEntry kPalette_subops[] = {
294 	{ SIG_SCI16,          1, MAP_CALL(PaletteSetFromResource),    "i(i)",                 NULL },
295 	{ SIG_SCI16,          2, MAP_CALL(PaletteSetFlag),            "iii",                  NULL },
296 	{ SIG_SCI16,          3, MAP_CALL(PaletteUnsetFlag),          "iii",                  kPaletteUnsetFlag_workarounds },
297 	{ SIG_SCI16,          4, MAP_CALL(PaletteSetIntensity),       "iii(i)",               NULL },
298 	{ SIG_SCI16,          5, MAP_CALL(PaletteFindColor),          "iii",                  NULL },
299 	{ SIG_SCI16,          6, MAP_CALL(PaletteAnimate),            "i*",                   NULL },
300 	{ SIG_SCI16,          7, MAP_CALL(PaletteSave),               "",                     NULL },
301 	{ SIG_SCI16,          8, MAP_CALL(PaletteRestore),            "[r0]",                 NULL },
302 #ifdef ENABLE_SCI32
303 	{ SIG_SCI32,          1, MAP_CALL(PaletteSetFromResource32),  "i(i)",                 NULL },
304 	{ SIG_SCI32,          2, MAP_CALL(PaletteSetFade),            "iii",                  NULL },
305 	{ SIG_SCI32,          3, MAP_CALL(PaletteFindColor32),        "iii",                  NULL },
306 	{ SIG_SCI32,          4, MAP_CALL(PaletteSetGamma),           "i",                    NULL },
307 #endif
308 	SCI_SUBOPENTRY_TERMINATOR
309 };
310 
311 //    version,         subId, function-mapping,                    signature,              workarounds
312 static const SciKernelMapSubEntry kFileIO_subops[] = {
313 	{ SIG_SCIALL,          0, MAP_CALL(FileIOOpen),                "ri",                   kFileIOOpen_workarounds },
314 	{ SIG_SCIALL,          1, MAP_CALL(FileIOClose),               "i",                    NULL },
315 	{ SIG_SCIALL,          2, MAP_CALL(FileIOReadRaw),             "iri",                  NULL },
316 	{ SIG_SCIALL,          3, MAP_CALL(FileIOWriteRaw),            "iri",                  NULL },
317 	{ SIG_SCIALL,          4, MAP_CALL(FileIOUnlink),              "r",                    NULL },
318 	{ SIG_SCIALL,          5, MAP_CALL(FileIOReadString),          "rii",                  kFileIOReadString_workarounds },
319 	{ SIG_SCIALL,          6, MAP_CALL(FileIOWriteString),         "ir",                   NULL },
320 	{ SIG_SCIALL,          7, MAP_CALL(FileIOSeek),                "iii",                  NULL },
321 	{ SIG_SCIALL,          8, MAP_CALL(FileIOFindFirst),           "rri",                  NULL },
322 	{ SIG_SCIALL,          9, MAP_CALL(FileIOFindNext),            "r",                    NULL },
323 	{ SIG_SCIALL,         10, MAP_CALL(FileIOExists),              "r",                    NULL },
324 	{ SIG_SINCE_SCI11,    11, MAP_CALL(FileIORename),              "rr",                   NULL },
325 	{ SIG_SINCE_SCI11,    12, MAP_CALL(FileIOCopy),                "rr",                   NULL },
326 #ifdef ENABLE_SCI32
327 	{ SIG_SINCE_SCI21MID, 13, MAP_CALL(FileIOReadByte),            "i",                    NULL },
328 	{ SIG_SINCE_SCI21MID, 14, MAP_CALL(FileIOWriteByte),           "ii",                   NULL },
329 	{ SIG_SINCE_SCI21MID, 15, MAP_CALL(FileIOReadWord),            "i",                    NULL },
330 	{ SIG_SCI21MID_LATE,  16, MAP_CALL(FileIOWriteWord),           "ii",                   NULL },
331 	{ SIG_SCI3,           16, MAP_CALL(FileIOWriteWord),           "i[.!]",                NULL },
332 	{ SIG_SINCE_SCI21MID, 17, "FileIOCheckFreeSpace", kCheckFreeSpace, "i(r)",             kFileIOCheckFreeSpace_workarounds },
333 	{ SIG_SINCE_SCI21MID, 18, MAP_CALL(FileIOGetCWD),              "r",                    NULL },
334 	{ SIG_SINCE_SCI21MID, 19, MAP_CALL(FileIOIsValidDirectory),    "[ro]",                 NULL },
335 #endif
336 	SCI_SUBOPENTRY_TERMINATOR
337 };
338 
339 #ifdef ENABLE_SCI32
340 
341 //    version,         subId, function-mapping,                    signature,              workarounds
342 static const SciKernelMapSubEntry kPalCycle_subops[] = {
343 	{ SIG_SCI32,           0, MAP_CALL(PalCycleSetCycle),          "iii(i)",               NULL },
344 	{ SIG_SCI32,           1, MAP_CALL(PalCycleDoCycle),           "i(i)",                 NULL },
345 	{ SIG_SCI32,           2, MAP_CALL(PalCyclePause),             "(i)",                  NULL },
346 	{ SIG_SCI32,           3, MAP_CALL(PalCycleOn),                "(i)",                  NULL },
347 	{ SIG_SCI32,           4, MAP_CALL(PalCycleOff),               "(i)",                  NULL },
348 	SCI_SUBOPENTRY_TERMINATOR
349 };
350 
351 //    version,         subId, function-mapping,                    signature,              workarounds
352 static const SciKernelMapSubEntry kSave_subops[] = {
353 	{ SIG_SCI32,           0, MAP_CALL(SaveGame32),                "[r0]i[r0][r0]",        NULL },
354 	{ SIG_SCI32,           1, MAP_CALL(RestoreGame32),             "[r0]i[r0]",            NULL },
355 	// System script 64994 in several SCI2.1mid games (KQ7 2.00b, Phant1,
356 	// PQ:SWAT, SQ6, Torin) calls GetSaveDir with an extra unused argument, and
357 	// it is easier to just handle it here than to bother with creating
358 	// workarounds
359 	{ SIG_SCI32,           2, MAP_CALL(GetSaveDir),                "(r)",                  NULL },
360 	{ SIG_SCI32,           3, MAP_CALL(CheckSaveGame32),           "ri[r0]",               NULL },
361 	// Subop 4 hasn't been encountered yet
362 	{ SIG_SCI32,           5, MAP_CALL(GetSaveFiles32),            "rrr",                  NULL },
363 	{ SIG_SCI32,           6, MAP_CALL(MakeSaveCatName),           "rr",                   NULL },
364 	{ SIG_SCI32,           7, MAP_CALL(MakeSaveFileName),          "rri",                  NULL },
365 	{ SIG_SCI32,           8, MAP_EMPTY(GameIsRestarting),         "(.*)",                 NULL },
366 	SCI_SUBOPENTRY_TERMINATOR
367 };
368 
369 //    version,         subId, function-mapping,                    signature,              workarounds
370 static const SciKernelMapSubEntry kFont_subops[] = {
371 	{ SIG_SINCE_SCI21MID,  0, MAP_CALL(PointSize),                 "i",                    NULL },
372 	{ SIG_SINCE_SCI21MID,  1, MAP_CALL(SetFontRes),                "ii",                   NULL },
373 	SCI_SUBOPENTRY_TERMINATOR
374 };
375 
376 //    version,         subId, function-mapping,                    signature,              workarounds
377 static const SciKernelMapSubEntry kText_subops[] = {
378 	{ SIG_SINCE_SCI21MID,  0, MAP_CALL(TextSize32),                "r[r0]i(i)(i)",         NULL },
379 	{ SIG_SINCE_SCI21MID,  1, MAP_CALL(TextWidth),                 "ri",                   NULL },
380 	SCI_SUBOPENTRY_TERMINATOR
381 };
382 
383 //    version,         subId, function-mapping,                    signature,              workarounds
384 static const SciKernelMapSubEntry kBitmap_subops[] = {
385 	{ SIG_SINCE_SCI21,     0, MAP_CALL(BitmapCreate),              "iiii(i)(i)(i)",        NULL },
386 	{ SIG_SINCE_SCI21,     1, MAP_CALL(BitmapDestroy),             "[r!]",                 NULL },
387 	{ SIG_SINCE_SCI21,     2, MAP_DUMMY(BitmapDrawLine),           "riiiii(i)(i)",         NULL },
388 	{ SIG_SINCE_SCI21,     3, MAP_CALL(BitmapDrawView),            "riii(i)(i)(0)(i)(i)",  NULL },
389 	{ SIG_SINCE_SCI21,     4, MAP_CALL(BitmapDrawText),            "rriiiiiiiiiii",        NULL },
390 	{ SIG_SINCE_SCI21,     5, MAP_CALL(BitmapDrawColor),           "riiiii",               NULL },
391 	{ SIG_SINCE_SCI21,     6, MAP_DUMMY(BitmapDrawBitmap),         "rr(i)(i)(i)",          NULL },
392 	{ SIG_SINCE_SCI21,     7, MAP_DUMMY(BitmapInvert),             "riiiiii",              NULL },
393 	{ SIG_SINCE_SCI21MID,  8, MAP_CALL(BitmapSetOrigin),           "rii",                  NULL },
394 	{ SIG_SINCE_SCI21MID,  9, MAP_CALL(BitmapCreateFromView),      "iii(i)(i)(i)([r0])",   NULL },
395 	{ SIG_SINCE_SCI21MID, 10, MAP_DUMMY(BitmapCopyPixels),         "rr",                   NULL },
396 	{ SIG_SINCE_SCI21MID, 11, MAP_DUMMY(BitmapClone),              "r",                    NULL },
397 	{ SIG_SINCE_SCI21MID, 12, MAP_CALL(BitmapGetInfo),             "r(i)(i)",              NULL },
398 	{ SIG_SINCE_SCI21LATE,13, MAP_DUMMY(BitmapScale),              "r...ii",               NULL },
399 	{ SIG_SCI3,           14, MAP_DUMMY(BitmapCreateFromUnknown),  "......",               NULL },
400 	{ SIG_SCI3,           15, MAP_DUMMY(Bitmap),                   "(.*)",                 NULL },
401 	{ SIG_SCI3,           16, MAP_DUMMY(Bitmap),                   "(.*)",                 NULL },
402 	SCI_SUBOPENTRY_TERMINATOR
403 };
404 
405 //    version,         subId, function-mapping,                    signature,              workarounds
406 static const SciKernelMapSubEntry kCD_subops[] = {
407 	{ SIG_SINCE_SCI21MID,  0, MAP_CALL(CheckCD),                   "(i)",                  NULL },
408 	{ SIG_SINCE_SCI21MID,  1, MAP_CALL(GetSavedCD),                "",                     NULL },
409 	SCI_SUBOPENTRY_TERMINATOR
410 };
411 
412 //    version,         subId, function-mapping,                    signature,              workarounds
413 static const SciKernelMapSubEntry kList_subops[] = {
414 	{ SIG_SINCE_SCI21,     0, MAP_CALL(NewList),                   "",                     NULL },
415 	{ SIG_SINCE_SCI21,     1, MAP_CALL(DisposeList),               "l",                    NULL },
416 	{ SIG_SINCE_SCI21,     2, MAP_CALL(NewNode),                   ".(.)",                 NULL },
417 	{ SIG_SINCE_SCI21,     3, MAP_CALL(FirstNode),                 "[l0]",                 NULL },
418 	{ SIG_SINCE_SCI21,     4, MAP_CALL(LastNode),                  "l",                    NULL },
419 	{ SIG_SINCE_SCI21,     5, MAP_CALL(EmptyList),                 "l",                    NULL },
420 	{ SIG_SINCE_SCI21,     6, MAP_CALL(NextNode),                  "n",                    NULL },
421 	{ SIG_SINCE_SCI21,     7, MAP_CALL(PrevNode),                  "n",                    NULL },
422 	{ SIG_SINCE_SCI21,     8, MAP_CALL(NodeValue),                 "[n0]",                 NULL },
423 	{ SIG_SINCE_SCI21,     9, MAP_CALL(AddAfter),                  "lnn(.)",               NULL },
424 	{ SIG_SINCE_SCI21,    10, MAP_CALL(AddToFront),                "ln(.)",                NULL },
425 	{ SIG_SINCE_SCI21,    11, MAP_CALL(AddToEnd),                  "ln(.)",                NULL },
426 	{ SIG_SINCE_SCI21,    12, MAP_CALL(AddBefore),                 "ln.",                  NULL },
427 	{ SIG_SINCE_SCI21,    13, MAP_CALL(MoveToFront),               "ln",                   NULL },
428 	{ SIG_SINCE_SCI21,    14, MAP_CALL(MoveToEnd),                 "ln",                   NULL },
429 	{ SIG_SINCE_SCI21,    15, MAP_CALL(FindKey),                   "l.",                   NULL },
430 	{ SIG_SINCE_SCI21,    16, MAP_CALL(DeleteKey),                 "l.",                   NULL },
431 	{ SIG_SINCE_SCI21,    17, MAP_CALL(ListAt),                    "li",                   kListAt_workarounds },
432 	{ SIG_SINCE_SCI21,    18, MAP_CALL(ListIndexOf) ,              "l[io]",                NULL },
433 	{ SIG_SINCE_SCI21,    19, MAP_CALL(ListEachElementDo),         "li(.*)",               NULL },
434 	{ SIG_SINCE_SCI21,    20, MAP_CALL(ListFirstTrue),             "li(.*)",               NULL },
435 	{ SIG_SINCE_SCI21,    21, MAP_CALL(ListAllTrue),               "li(.*)",               NULL },
436 	{ SIG_SINCE_SCI21,    22, MAP_CALL(ListSort),                  "li(i)",                NULL },
437 	SCI_SUBOPENTRY_TERMINATOR
438 };
439 
440 //    version,         subId, function-mapping,                    signature,              workarounds
441 static const SciKernelMapSubEntry kShowMovieWin_subops[] = {
442 	{ SIG_SCI2,            0, MAP_CALL(ShowMovieWinOpen),          "r",                    NULL },
443 	{ SIG_SCI2,            1, MAP_CALL(ShowMovieWinInit),          "ii(ii)",               NULL },
444 	{ SIG_SCI2,            2, MAP_CALL(ShowMovieWinPlay),          "i",                    NULL },
445 	{ SIG_SCI2,            6, MAP_CALL(ShowMovieWinClose),         "",                     NULL },
446 	{ SIG_SINCE_SCI21,     0, MAP_CALL(ShowMovieWinOpen),          "ir",                   NULL },
447 	{ SIG_SINCE_SCI21,     1, MAP_CALL(ShowMovieWinInit),          "iii(ii)",              NULL },
448 	{ SIG_SINCE_SCI21,     2, MAP_CALL(ShowMovieWinPlay),          "i(ii)(i)(i)",          NULL },
449 	{ SIG_SINCE_SCI21,     6, MAP_CALL(ShowMovieWinClose),         "i",                    NULL },
450 	// Since movies are rendered within the graphics engine in ScummVM,
451 	// it is not necessary to copy the palette from SCI to MCI, so this
452 	// can be a no-op
453 	{ SIG_SINCE_SCI21,     7, MAP_EMPTY(ShowMovieWinSetPalette),   "i",                    NULL },
454 	{ SIG_SINCE_SCI21,     8, MAP_CALL(ShowMovieWinGetDuration),   "i",                    NULL },
455 	{ SIG_SINCE_SCI21,    11, MAP_CALL(ShowMovieWinCue),           "ii",                   NULL },
456 	{ SIG_SINCE_SCI21,    14, MAP_CALL(ShowMovieWinPlayUntilEvent), "i(i)",                NULL },
457 	{ SIG_SINCE_SCI21,    15, MAP_CALL(ShowMovieWinInitDouble),    "iii",                  NULL },
458 	SCI_SUBOPENTRY_TERMINATOR
459 };
460 
461 // There are a lot of subops to PlayVMD, but only a few of them are ever
462 // actually used by games
463 //    version,         subId, function-mapping,                    signature,              workarounds
464 static const SciKernelMapSubEntry kPlayVMD_subops[] = {
465 	{ SIG_SINCE_SCI21,     0, MAP_CALL(PlayVMDOpen),               "r(i)(i)",              NULL },
466 	{ SIG_SINCE_SCI21,     1, MAP_CALL(PlayVMDInit),               "ii(i)(i)(ii)",         NULL },
467 	{ SIG_SINCE_SCI21,     6, MAP_CALL(PlayVMDClose),              "",                     NULL },
468 	{ SIG_SINCE_SCI21,     7, MAP_CALL(PlayVMDIgnorePalettes),     "",                     NULL },
469 	{ SIG_SINCE_SCI21,    10, MAP_CALL(PlayVMDGetStatus),          "",                     NULL },
470 	{ SIG_SINCE_SCI21,    14, MAP_CALL(PlayVMDPlayUntilEvent),     "i(i)(i)",              NULL },
471 	{ SIG_SINCE_SCI21,    16, MAP_CALL(PlayVMDShowCursor),         "i",                    NULL },
472 	{ SIG_SINCE_SCI21,    17, MAP_CALL(PlayVMDStartBlob),          "",                     NULL },
473 	{ SIG_SINCE_SCI21,    18, MAP_CALL(PlayVMDStopBlobs),          "",                     NULL },
474 	{ SIG_SINCE_SCI21,    19, MAP_CALL(PlayVMDAddBlob),            "iiiii",                NULL },
475 	{ SIG_SINCE_SCI21,    20, MAP_CALL(PlayVMDDeleteBlob),         "i",                    NULL },
476 	{ SIG_SINCE_SCI21,    21, MAP_CALL(PlayVMDSetBlackoutArea),    "iiii",                 NULL },
477 	{ SIG_SINCE_SCI21,    23, MAP_CALL(PlayVMDRestrictPalette),    "ii",                   NULL },
478 	{ SIG_SCI3,           27, MAP_CALL(PlayVMDSetPlane),           "i(i)",                 NULL },
479 	{ SIG_SCI3,           28, MAP_EMPTY(PlayVMDSetPreload),        "i",                    NULL },
480 	{ SIG_SCI3,           31, MAP_EMPTY(PlayVMDSetFrameRate),      "i",                    NULL },
481 	SCI_SUBOPENTRY_TERMINATOR
482 };
483 
484 //    version,         subId, function-mapping,                    signature,              workarounds
485 static const SciKernelMapSubEntry kRobot_subops[] = {
486 	{ SIG_SINCE_SCI21,     0, MAP_CALL(RobotOpen),                 "ioiii(i)",             NULL },
487 	{ SIG_SINCE_SCI21,     1, MAP_CALL(RobotShowFrame),            "i(ii)",                NULL },
488 	{ SIG_SINCE_SCI21,     2, MAP_CALL(RobotGetFrameSize),         "r",                    NULL },
489 	{ SIG_SINCE_SCI21,     4, MAP_CALL(RobotPlay),                 "",                     NULL },
490 	{ SIG_SINCE_SCI21,     5, MAP_CALL(RobotGetIsFinished),        "",                     NULL },
491 	{ SIG_SINCE_SCI21,     6, MAP_CALL(RobotGetIsInitialized),     "",                     NULL },
492 	{ SIG_SINCE_SCI21,     7, MAP_CALL(RobotClose),                "",                     NULL },
493 	{ SIG_SINCE_SCI21,     8, MAP_CALL(RobotGetCue),               "o",                    NULL },
494 	{ SIG_SINCE_SCI21,    10, MAP_CALL(RobotPause),                "",                     NULL },
495 	{ SIG_SINCE_SCI21,    11, MAP_CALL(RobotGetFrameNo),           "",                     NULL },
496 	{ SIG_SINCE_SCI21,    12, MAP_CALL(RobotSetPriority),          "i",                    NULL },
497 	SCI_SUBOPENTRY_TERMINATOR
498 };
499 
500 //    version,         subId, function-mapping,                    signature,              workarounds
501 static const SciKernelMapSubEntry kPlayDuck_subops[] = {
502 	{ SIG_SCI3,            1, MAP_CALL(PlayDuckPlay),              "iiiii",                NULL },
503 	{ SIG_SCI3,            2, MAP_CALL(PlayDuckSetFrameOut),       "i",                    NULL },
504 	{ SIG_SCI3,            5, MAP_CALL(PlayDuckClose),             "",                     NULL },
505 	{ SIG_SCI3,            6, MAP_CALL(PlayDuckSetVolume),         "i",                    NULL },
506 	SCI_SUBOPENTRY_TERMINATOR
507 };
508 
509 //    version,         subId, function-mapping,                    signature,              workarounds
510 static const SciKernelMapSubEntry kRemapColors_subops[] = {
511 	{ SIG_SCI32,           0, MAP_CALL(RemapColorsOff),            "(i)",                  NULL },
512 	{ SIG_SCI32,           1, MAP_CALL(RemapColorsByRange),        "iiii(i)",              NULL },
513 	{ SIG_SCI32,           2, MAP_CALL(RemapColorsByPercent),      "ii(i)",                NULL },
514 	{ SIG_SCI32,           3, MAP_CALL(RemapColorsToGray),         "ii(i)",                NULL },
515 	{ SIG_SCI32,           4, MAP_CALL(RemapColorsToPercentGray),  "iii(i)",               NULL },
516 	{ SIG_SCI32,           5, MAP_CALL(RemapColorsBlockRange),     "ii",                   NULL },
517 	SCI_SUBOPENTRY_TERMINATOR
518 };
519 
520 //    version,         subId, function-mapping,                    signature,              workarounds
521 static const SciKernelMapSubEntry kArray_subops[] = {
522 	{ SIG_SCI32,           0, MAP_CALL(ArrayNew),                  "ii",                   NULL },
523 	{ SIG_SCI32,           1, MAP_CALL(ArrayGetSize),              "r",                    NULL },
524 	{ SIG_SCI32,           2, MAP_CALL(ArrayGetElement),           "ri",                   NULL },
525 	{ SIG_SCI32,           3, MAP_CALL(ArraySetElements),          "ri(.*)",               kArraySetElements_workarounds },
526 	{ SIG_SCI32,           4, MAP_CALL(ArrayFree),                 "[r0]",                 NULL },
527 	{ SIG_SCI32,           5, MAP_CALL(ArrayFill),                 "riii",                 kArrayFill_workarounds },
528 	{ SIG_SCI32,           6, MAP_CALL(ArrayCopy),                 "ririi",                NULL },
529 	// there is no subop 7
530 	{ SIG_SCI32,           8, MAP_CALL(ArrayDuplicate),            "r",                    NULL },
531 	{ SIG_SCI32,           9, MAP_CALL(ArrayGetData),              "[or0]",                NULL },
532 	{ SIG_SCI3,           10, MAP_CALL(ArrayByteCopy),             "ririi",                NULL },
533 	SCI_SUBOPENTRY_TERMINATOR
534 };
535 
536 //    version,         subId, function-mapping,                    signature,              workarounds
537 static const SciKernelMapSubEntry kString_subops[] = {
538 	// every single copy of script 64918 in SCI2 through 2.1mid calls StringNew
539 	// with a second type argument which is unused (new strings are always type
540 	// 3)
541 	{ SIG_THRU_SCI21MID,   0, MAP_CALL(StringNew),                 "i(i)",                 NULL },
542 	{ SIG_THRU_SCI21MID,   1, MAP_CALL(ArrayGetSize),              "r",                    NULL },
543 	{ SIG_THRU_SCI21MID,   2, MAP_CALL(StringGetChar),             "[r0]i",                NULL },
544 	{ SIG_THRU_SCI21MID,   3, MAP_CALL(ArraySetElements),          "ri(i*)",               kArraySetElements_workarounds },
545 	{ SIG_THRU_SCI21MID,   4, MAP_CALL(StringFree),                "[r0]",                 NULL },
546 	{ SIG_THRU_SCI21MID,   5, MAP_CALL(ArrayFill),                 "rii",                  kArrayFill_workarounds },
547 	{ SIG_THRU_SCI21MID,   6, MAP_CALL(ArrayCopy),                 "ririi",                NULL },
548 	{ SIG_SCI32,           7, MAP_CALL(StringCompare),             "[r0][r0](i)",          NULL },
549 
550 	{ SIG_THRU_SCI21MID,   8, MAP_CALL(ArrayDuplicate),            "r",                    NULL },
551 	{ SIG_THRU_SCI21MID,   9, MAP_CALL(ArrayGetData),              "[or0]",                NULL },
552 	{ SIG_THRU_SCI21MID,  10, MAP_CALL(StringLength),              "[r0]",                 NULL },
553 	{ SIG_THRU_SCI21MID,  11, MAP_CALL(StringFormat),              "[or0](.*)",            NULL },
554 	{ SIG_THRU_SCI21MID,  12, MAP_CALL(StringFormatAt),            "r[or0](.*)",           NULL },
555 	{ SIG_THRU_SCI21MID,  13, MAP_CALL(StringToInteger),           "[r0]",                 NULL },
556 	{ SIG_THRU_SCI21MID,  14, MAP_CALL(StringTrim),                "[r0]i(i)",             NULL },
557 	{ SIG_THRU_SCI21MID,  15, MAP_CALL(StringToUpperCase),         "[r0]",                 NULL },
558 	{ SIG_THRU_SCI21MID,  16, MAP_CALL(StringToLowerCase),         "[r0]",                 NULL },
559 	{ SIG_THRU_SCI21MID,  17, MAP_CALL(StringReplaceSubstring),    "[r0][r0][r0][r0]",     NULL },
560 	{ SIG_THRU_SCI21MID,  18, MAP_CALL(StringReplaceSubstringEx),  "[r0][r0][r0][r0]",     NULL },
561 
562 	{ SIG_SINCE_SCI21LATE, 8, MAP_CALL(StringLength),              "[r0]",                 NULL },
563 	{ SIG_SINCE_SCI21LATE, 9, MAP_CALL(StringFormat),              "[or0](.*)",            NULL },
564 	{ SIG_SINCE_SCI21LATE,10, MAP_CALL(StringFormatAt),            "[r0][or0](.*)",        NULL },
565 	{ SIG_SINCE_SCI21LATE,11, MAP_CALL(StringToInteger),           "[r0]",                 NULL },
566 	{ SIG_SINCE_SCI21LATE,12, MAP_CALL(StringTrim),                "[r0]i(i)",             NULL },
567 	{ SIG_SINCE_SCI21LATE,13, MAP_CALL(StringToUpperCase),         "[r0]",                 NULL },
568 	{ SIG_SINCE_SCI21LATE,14, MAP_CALL(StringToLowerCase),         "[r0]",                 NULL },
569 	{ SIG_SINCE_SCI21LATE,15, MAP_CALL(StringReplaceSubstring),    "[r0][r0][r0][r0]",     NULL },
570 	{ SIG_SINCE_SCI21LATE,16, MAP_CALL(StringReplaceSubstringEx),  "[r0][r0][r0][r0]",     NULL },
571 	SCI_SUBOPENTRY_TERMINATOR
572 };
573 
574 //    version,         subId, function-mapping,                    signature,              workarounds
575 static const SciKernelMapSubEntry kCelInfo_subops[] = {
576 	{ SIG_SINCE_SCI21MID,  0, MAP_CALL(CelInfoGetOriginX),         "iii",                  NULL },
577 	{ SIG_SINCE_SCI21MID,  1, MAP_CALL(CelInfoGetOriginY),         "iii",                  NULL },
578 	{ SIG_SINCE_SCI21MID,  2, MAP_EMPTY(CelInfo),                  "iii",                  NULL },
579 	{ SIG_SINCE_SCI21MID,  3, MAP_EMPTY(CelInfo),                  "iii",                  NULL },
580 	{ SIG_SINCE_SCI21MID,  4, MAP_CALL(CelInfoGetPixel),           "iiiii",                NULL },
581 	SCI_SUBOPENTRY_TERMINATOR
582 };
583 
584 //    version,         subId, function-mapping,                    signature,              workarounds
585 static const SciKernelMapSubEntry kCelLink_subops[] = {
586 	{ SIG_SINCE_SCI21MID,  0, MAP_DUMMY(CelLink0),                 "",                     NULL },
587 	{ SIG_SINCE_SCI21MID,  1, MAP_DUMMY(CelLink1),                 "",                     NULL },
588 	{ SIG_SINCE_SCI21MID,  2, MAP_CALL(CelLinkGetX),               "iiii",                 NULL },
589 	{ SIG_SINCE_SCI21MID,  3, MAP_CALL(CelLinkGetY),               "iiii",                 NULL },
590 	{ SIG_SINCE_SCI21MID,  4, MAP_DUMMY(CelLink4),                 "",                     NULL },
591 	SCI_SUBOPENTRY_TERMINATOR
592 };
593 
594 //    version,         subId, function-mapping,                    signature,              workarounds
595 static const SciKernelMapSubEntry kScrollWindow_subops[] = {
596 	{ SIG_SCI32,           0, MAP_CALL(ScrollWindowCreate),        "oi",                   NULL },
597 	{ SIG_SCI32,           1, MAP_CALL(ScrollWindowAdd),           "iriii(i)",             kScrollWindowAdd_workarounds },
598 	{ SIG_SCI32,           2, MAP_DUMMY(ScrollWindowClear),        "i",                    NULL },
599 	{ SIG_SCI32,           3, MAP_CALL(ScrollWindowPageUp),        "i",                    NULL },
600 	{ SIG_SCI32,           4, MAP_CALL(ScrollWindowPageDown),      "i",                    NULL },
601 	{ SIG_SCI32,           5, MAP_CALL(ScrollWindowUpArrow),       "i",                    NULL },
602 	{ SIG_SCI32,           6, MAP_CALL(ScrollWindowDownArrow),     "i",                    NULL },
603 	{ SIG_SCI32,           7, MAP_CALL(ScrollWindowHome),          "i",                    NULL },
604 	{ SIG_SCI32,           8, MAP_CALL(ScrollWindowEnd),           "i",                    NULL },
605 	{ SIG_SCI32,           9, MAP_DUMMY(ScrollWindowResize),       "i.",                   NULL },
606 	{ SIG_SCI32,          10, MAP_CALL(ScrollWindowWhere),         "ii",                   NULL },
607 	{ SIG_SCI32,          11, MAP_CALL(ScrollWindowGo),            "i..",                  NULL },
608 	{ SIG_SCI32,          12, MAP_DUMMY(ScrollWindowInsert),       "i.....",               NULL },
609 	{ SIG_SCI32,          13, MAP_DUMMY(ScrollWindowDelete),       "i.",                   NULL },
610 	{ SIG_SCI32,          14, MAP_CALL(ScrollWindowModify),        "iiriii(i)",            NULL },
611 	{ SIG_SCI32,          15, MAP_CALL(ScrollWindowHide),          "i",                    NULL },
612 	{ SIG_SCI32,          16, MAP_CALL(ScrollWindowShow),          "i",                    NULL },
613 	{ SIG_SCI32,          17, MAP_CALL(ScrollWindowDestroy),       "i",                    NULL },
614 	// LSL6hires uses kScrollWindowText and kScrollWindowReconstruct to try to save
615 	// and restore the content of the game's subtitle window, but this feature did not
616 	// use the normal save/load functionality of the engine and was actually broken
617 	// (all text formatting was missing on restore). Since there is no real reason to
618 	// save the subtitle scrollback anyway, we just ignore calls to these two functions.
619 	{ SIG_SCI32,          18, MAP_EMPTY(ScrollWindowText),         "i",                    NULL },
620 	{ SIG_SCI32,          19, MAP_EMPTY(ScrollWindowReconstruct),  "i.",                   NULL },
621 	SCI_SUBOPENTRY_TERMINATOR
622 };
623 
624 #endif
625 
626 struct SciKernelMapEntry {
627 	const char *name;
628 	KernelFunctionCall *function;
629 
630 	SciVersion fromVersion;
631 	SciVersion toVersion;
632 	byte forPlatform;
633 
634 	const char *signature;
635 	const SciKernelMapSubEntry *subFunctions;
636 	const SciWorkaroundEntry *workarounds;
637 };
638 
639 //    name,                        version/platform,         signature,              sub-signatures,  workarounds
640 static SciKernelMapEntry s_kernelMap[] = {
641 	{ MAP_CALL(Abs),               SIG_EVERYWHERE,           "i",                     NULL,            kAbs_workarounds },
642 	{ MAP_CALL(AddAfter),          SIG_EVERYWHERE,           "lnn",                   NULL,            NULL },
643 	{ MAP_CALL(AddMenu),           SIG_EVERYWHERE,           "rr",                    NULL,            NULL },
644 	{ MAP_CALL(AddToEnd),          SIG_EVERYWHERE,           "ln",                    NULL,            NULL },
645 	{ MAP_CALL(AddToFront),        SIG_EVERYWHERE,           "ln",                    NULL,            NULL },
646 	{ MAP_CALL(AddToPic),          SIG_EVERYWHERE,           "[il](iiiiii)",          NULL,            NULL },
647 	{ MAP_CALL(Animate),           SIG_EVERYWHERE,           "(l0)(i)",               NULL,            NULL },
648 	{ MAP_CALL(AssertPalette),     SIG_EVERYWHERE,           "i",                     NULL,            NULL },
649 	{ MAP_CALL(AvoidPath),         SIG_EVERYWHERE,           "ii(.*)",                NULL,            NULL },
650 	{ MAP_CALL(BaseSetter),        SIG_SCI16, SIGFOR_ALL,    "o",                     NULL,            NULL },
651 #ifdef ENABLE_SCI32
652 	{ "BaseSetter", kBaseSetter32, SIG_SCI32, SIGFOR_ALL,    "o",                     NULL,            NULL },
653 #endif
654 	{ MAP_CALL(CanBeHere),         SIG_EVERYWHERE,           "o(l)",                  NULL,            NULL },
655 	{ MAP_CALL(CantBeHere),        SIG_SCI16, SIGFOR_ALL,    "o(l)",                  NULL,            NULL },
656 #ifdef ENABLE_SCI32
657 	{ MAP_CALL(CantBeHere),        SIG_SCI32, SIGFOR_ALL,    "ol",                    NULL,            NULL },
658 #endif
659 	{ MAP_CALL(CelHigh),           SIG_SCI16, SIGFOR_ALL,    "ii(i)",                 NULL,            kCelHigh_workarounds },
660 	{ MAP_CALL(CelWide),           SIG_SCI16, SIGFOR_ALL,    "ii(i)",                 NULL,            kCelWide_workarounds },
661 #ifdef ENABLE_SCI32
662 	{ "CelHigh", kCelHigh32,       SIG_SCI32, SIGFOR_ALL,    "iii",                   NULL,            NULL },
663 	{ "CelWide", kCelWide32,       SIG_SCI32, SIGFOR_ALL,    "iii",                   NULL,            kCelWide_workarounds },
664 #endif
665 	{ MAP_CALL(CheckFreeSpace),    SIG_THRU_SCI21EARLY, SIGFOR_ALL, "r(i)",           NULL,            NULL },
666 	{ MAP_CALL(CheckFreeSpace),    SIG_SCI11, SIGFOR_ALL,    "r(i)",                  NULL,            NULL },
667 	{ MAP_CALL(CheckFreeSpace),    SIG_SCI16, SIGFOR_ALL,    "r",                     NULL,            NULL },
668 #ifdef ENABLE_SCI32
669 	{ "CheckSaveGame", kCheckSaveGame32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri[r0]",   NULL,            NULL },
670 #endif
671 	{ MAP_CALL(CheckSaveGame),     SIG_SCI16, SIGFOR_ALL,    ".*",                    NULL,            NULL },
672 	{ MAP_CALL(Clone),             SIG_EVERYWHERE,           "o",                     NULL,            NULL },
673 	{ MAP_CALL(CoordPri),          SIG_EVERYWHERE,           "i(i)",                  NULL,            NULL },
674 	{ MAP_CALL(CosDiv),            SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
675 	{ MAP_CALL(DeleteKey),         SIG_EVERYWHERE,           "l.",                    NULL,            kDeleteKey_workarounds },
676 	{ MAP_CALL(DeviceInfo),        SIG_EVERYWHERE,           "i(r)(r)(i)",            NULL,            kDeviceInfo_workarounds }, // subop
677 	{ MAP_CALL(Display),           SIG_EVERYWHERE,           "[ir]([ir!]*)",          NULL,            kDisplay_workarounds },
678 	// ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro
679 	//    restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same
680 	{ MAP_CALL(DirLoop),           SIG_EVERYWHERE,           "oi",                    NULL,            kDirLoop_workarounds },
681 	{ MAP_CALL(DisposeClone),      SIG_EVERYWHERE,           "o",                     NULL,            NULL },
682 	{ MAP_CALL(DisposeList),       SIG_EVERYWHERE,           "l",                     NULL,            NULL },
683 	{ MAP_CALL(DisposeScript),     SIG_EVERYWHERE,           "i(i*)",                 NULL,            kDisposeScript_workarounds },
684 	{ MAP_CALL(DisposeWindow),     SIG_EVERYWHERE,           "i(i)",                  NULL,            NULL },
685 	{ MAP_CALL(DoAudio),           SIG_SCI16, SIGFOR_ALL,    "i(.*)",                 NULL,            NULL }, // subop
686 #ifdef ENABLE_SCI32
687 	{ "DoAudio", kDoAudio32,       SIG_SCI32, SIGFOR_ALL,    "(.*)",                  kDoAudio_subops, NULL },
688 #endif
689 	{ MAP_CALL(DoAvoider),         SIG_EVERYWHERE,           "o(i)",                  NULL,            NULL },
690 	{ MAP_CALL(DoBresen),          SIG_EVERYWHERE,           "o",                     NULL,            NULL },
691 	{ MAP_CALL(DoSound),           SIG_EVERYWHERE,           "i(.*)",                 kDoSound_subops, NULL },
692 	{ MAP_CALL(DoSync),            SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL }, // subop
693 	{ MAP_CALL(DrawCel),           SIG_SCI11, SIGFOR_PC,     "iiiii(i)(i)([ri])",     NULL,            NULL }, // reference for kq6 hires
694 	{ MAP_CALL(DrawCel),           SIG_EVERYWHERE,           "iiiii(i)(i)",           NULL,            NULL },
695 	{ MAP_CALL(DrawControl),       SIG_EVERYWHERE,           "o",                     NULL,            NULL },
696 	{ MAP_CALL(DrawMenuBar),       SIG_EVERYWHERE,           "i",                     NULL,            NULL },
697 	{ MAP_CALL(DrawPic),           SIG_EVERYWHERE,           "i(i)(i)(i)",            NULL,            NULL },
698 	{ MAP_CALL(DrawStatus),        SIG_EVERYWHERE,           "[r0](i)(i)",            NULL,            NULL },
699 	{ MAP_CALL(EditControl),       SIG_EVERYWHERE,           "[o0][o0]",              NULL,            NULL },
700 	{ MAP_CALL(Empty),             SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
701 	{ MAP_CALL(EmptyList),         SIG_EVERYWHERE,           "l",                     NULL,            NULL },
702 	{ "FClose", kFileIOClose,      SIG_EVERYWHERE,           "i",                     NULL,            NULL },
703 	{ "FGets", kFileIOReadString,  SIG_EVERYWHERE,           "rii",                   NULL,            NULL },
704 	{ "FOpen", kFileIOOpen,        SIG_EVERYWHERE,           "ri",                    NULL,            NULL },
705 	{ "FPuts", kFileIOWriteString, SIG_EVERYWHERE,           "ir",                    NULL,            NULL },
706 	{ MAP_CALL(FileIO),            SIG_EVERYWHERE,           "i([.!]*)",              kFileIO_subops,  NULL },
707 	{ MAP_CALL(FindKey),           SIG_EVERYWHERE,           "l.",                    NULL,            kFindKey_workarounds },
708 	{ MAP_CALL(FirstNode),         SIG_EVERYWHERE,           "[l0]",                  NULL,            NULL },
709 	{ MAP_CALL(FlushResources),    SIG_EVERYWHERE,           "i",                     NULL,            NULL },
710 	{ MAP_CALL(Format),            SIG_EVERYWHERE,           "r[ri](.*)",             NULL,            NULL },
711 	{ MAP_CALL(GameIsRestarting),  SIG_EVERYWHERE,           "(i)",                   NULL,            NULL },
712 	{ MAP_CALL(GetAngle),          SIG_EVERYWHERE,           "iiii",                  NULL,            kGetAngle_workarounds },
713 	{ MAP_CALL(GetCWD),            SIG_EVERYWHERE,           "r",                     NULL,            kGetCWD_workarounds },
714 	{ MAP_CALL(GetDistance),       SIG_EVERYWHERE,           "ii(i)(i)(i)(i)",        NULL,            NULL },
715 	{ MAP_CALL(GetEvent),          SIG_SCIALL, SIGFOR_MAC,   "io(i*)",                NULL,            NULL },
716 	{ MAP_CALL(GetEvent),          SIG_EVERYWHERE,           "io",                    NULL,            NULL },
717 	{ MAP_CALL(GetFarText),        SIG_EVERYWHERE,           "ii[r0]",                NULL,            NULL },
718 	{ MAP_CALL(GetMenu),           SIG_EVERYWHERE,           "i.",                    NULL,            NULL },
719 	{ MAP_CALL(GetMessage),        SIG_EVERYWHERE,           "iiir",                  NULL,            NULL },
720 	{ MAP_CALL(GetPort),           SIG_EVERYWHERE,           "",                      NULL,            NULL },
721 #ifdef ENABLE_SCI32
722 	{ MAP_CALL(GetSaveDir),        SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(r)",            NULL,            NULL },
723 #endif
724 	{ MAP_CALL(GetSaveDir),        SIG_SCI16, SIGFOR_ALL,    "",                      NULL,            NULL },
725 #ifdef ENABLE_SCI32
726 	{ "GetSaveFiles", kGetSaveFiles32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "rrr",        NULL,            NULL },
727 #endif
728 	{ MAP_CALL(GetSaveFiles),      SIG_EVERYWHERE,           "rrr",                   NULL,            NULL },
729 	{ MAP_CALL(GetTime),           SIG_EVERYWHERE,           "(i)",                   NULL,            NULL },
730 	{ MAP_CALL(GlobalToLocal),     SIG_SCI16, SIGFOR_ALL,    "o",                     NULL,            NULL },
731 #ifdef ENABLE_SCI32
732 	{ "GlobalToLocal", kGlobalToLocal32, SIG_SCI32, SIGFOR_ALL, "oo",                 NULL,            NULL },
733 #endif
734 	{ MAP_CALL(Graph),             SIG_SCI16, SIGFOR_ALL,    NULL,                    kGraph_subops,   NULL },
735 #ifdef ENABLE_SCI32
736 	{ MAP_EMPTY(Graph),            SIG_SCI32, SIGFOR_ALL,    "(.*)",                  NULL,            NULL },
737 #endif
738 	{ MAP_CALL(HaveMouse),         SIG_EVERYWHERE,           "",                      NULL,            NULL },
739 	{ MAP_CALL(HiliteControl),     SIG_EVERYWHERE,           "o",                     NULL,            NULL },
740 	{ MAP_CALL(InitBresen),        SIG_EVERYWHERE,           "o(i)",                  NULL,            NULL },
741 	{ MAP_CALL(Intersections),     SIG_EVERYWHERE,           "iiiiriiiri",            NULL,            NULL },
742 	{ MAP_CALL(IsItSkip),          SIG_EVERYWHERE,           "iiiii",                 NULL,            NULL },
743 	{ MAP_CALL(IsObject),          SIG_EVERYWHERE,           ".",                     NULL,            kIsObject_workarounds },
744 	{ MAP_CALL(Joystick),          SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL }, // subop
745 	{ MAP_CALL(LastNode),          SIG_EVERYWHERE,           "l",                     NULL,            NULL },
746 	{ MAP_CALL(Load),              SIG_EVERYWHERE,           "ii(i*)",                NULL,            NULL },
747 	{ MAP_CALL(LocalToGlobal),     SIG_SCI16, SIGFOR_ALL,    "o",                     NULL,            NULL },
748 #ifdef ENABLE_SCI32
749 	{ "LocalToGlobal", kLocalToGlobal32, SIG_SCI32, SIGFOR_ALL, "oo",                 NULL,            NULL },
750 #endif
751 	{ MAP_CALL(Lock),              SIG_EVERYWHERE,           "ii(i)",                 NULL,            kLock_workarounds },
752 	{ MAP_CALL(MapKeyToDir),       SIG_EVERYWHERE,           "o",                     NULL,            NULL },
753 	{ MAP_CALL(Memory),            SIG_EVERYWHERE,           "i(.*)",                 NULL,            kMemory_workarounds }, // subop
754 	{ MAP_CALL(MemoryInfo),        SIG_EVERYWHERE,           "i",                     NULL,            NULL },
755 	{ MAP_CALL(MemorySegment),     SIG_EVERYWHERE,           "ir(i)",                 NULL,            NULL }, // subop
756 	{ MAP_CALL(MenuSelect),        SIG_EVERYWHERE,           "o(i)",                  NULL,            NULL },
757 	{ MAP_CALL(MergePoly),         SIG_EVERYWHERE,           "rli",                   NULL,            NULL },
758 	{ MAP_CALL(Message),           SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL }, // subop
759 	{ MAP_CALL(MoveCursor),        SIG_EVERYWHERE,           "ii",                    NULL,            kMoveCursor_workarounds },
760 	{ MAP_CALL(NewList),           SIG_EVERYWHERE,           "",                      NULL,            NULL },
761 	{ MAP_CALL(NewNode),           SIG_EVERYWHERE,           "..",                    NULL,            NULL },
762 	{ MAP_CALL(NewWindow),         SIG_SCIALL, SIGFOR_MAC,   ".*",                    NULL,            NULL },
763 	{ MAP_CALL(NewWindow),         SIG_SCI0, SIGFOR_ALL,     "iiii[r0]i(i)(i)(i)",    NULL,            NULL },
764 	{ MAP_CALL(NewWindow),         SIG_SCI1, SIGFOR_ALL,     "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL },
765 	{ MAP_CALL(NewWindow),         SIG_SCI11, SIGFOR_ALL,    "iiiiiiii[r0]i(i)(i)(i)", NULL,           kNewWindow_workarounds },
766 	{ MAP_CALL(NextNode),          SIG_EVERYWHERE,           "n",                     NULL,            NULL },
767 	{ MAP_CALL(NodeValue),         SIG_EVERYWHERE,           "[n0]",                  NULL,            NULL },
768 	{ MAP_CALL(NumCels),           SIG_EVERYWHERE,           "o",                     NULL,            NULL },
769 	{ MAP_CALL(NumLoops),          SIG_EVERYWHERE,           "o",                     NULL,            NULL },
770 	{ MAP_CALL(OnControl),         SIG_EVERYWHERE,           "ii(i)(i)(i)",           NULL,            NULL },
771 	{ MAP_CALL(PalVary),           SIG_EVERYWHERE,           "i(i*)",                 kPalVary_subops, NULL },
772 	{ MAP_CALL(Palette),           SIG_EVERYWHERE,           "i(.*)",                 kPalette_subops, NULL },
773 	{ MAP_CALL(Parse),             SIG_EVERYWHERE,           "ro",                    NULL,            NULL },
774 	{ MAP_CALL(PicNotValid),       SIG_EVERYWHERE,           "(i)",                   NULL,            NULL },
775 	{ MAP_CALL(Platform),          SIG_SCI16, SIGFOR_ALL,    "(.*)",                  NULL,            NULL },
776 #ifdef ENABLE_SCI32
777 	{ "Platform", kPlatform32,     SIG_SCI32, SIGFOR_MAC,    "(.*)",                  NULL,            NULL },
778 	{ "Platform", kPlatform32,     SIG_SCI32, SIGFOR_ALL,    "(i)",                   NULL,            kPlatform32_workarounds },
779 #endif
780 	{ MAP_CALL(Portrait),          SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL }, // subop
781 	{ MAP_CALL(PrevNode),          SIG_EVERYWHERE,           "n",                     NULL,            NULL },
782 	{ MAP_CALL(PriCoord),          SIG_EVERYWHERE,           "i",                     NULL,            NULL },
783 	{ MAP_CALL(Random),            SIG_EVERYWHERE,           "(i)(i)",                NULL,            kRandom_workarounds },
784 	{ MAP_CALL(ReadNumber),        SIG_EVERYWHERE,           "r",                     NULL,            kReadNumber_workarounds },
785 	{ MAP_CALL(RemapColors),       SIG_SCI11, SIGFOR_ALL,    "i(i)(i)(i)(i)",         NULL,            NULL },
786 	{ MAP_CALL(RemapColorsKawa),   SIG_SCI11, SIGFOR_ALL,    "i(i)(i)(i)(i)(i)",      NULL,            NULL },
787 #ifdef ENABLE_SCI32
788 	{ "RemapColors", kRemapColors32, SIG_SCI32, SIGFOR_ALL,  "i(i)(i)(i)(i)(i)",      kRemapColors_subops, NULL },
789 #endif
790 	{ MAP_CALL(ResCheck),          SIG_EVERYWHERE,           "ii(iiii)",              NULL,            kResCheck_workarounds },
791 	{ MAP_CALL(RespondsTo),        SIG_EVERYWHERE,           ".i",                    NULL,            NULL },
792 	{ "RestartGame", kRestartGame16, SIG_SCI16, SIGFOR_ALL,  "",                      NULL,            NULL },
793 #ifdef ENABLE_SCI32
794 	{ MAP_EMPTY(RestartGame),      SIG_SCI32, SIGFOR_ALL,    "",                      NULL,            NULL },
795 	{ "RestoreGame", kRestoreGame32, SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri[r0]",       NULL,            NULL },
796 #endif
797 	{ MAP_CALL(RestoreGame),       SIG_EVERYWHERE,           "[r0]i[r0]",             NULL,            NULL },
798 	{ MAP_CALL(Said),              SIG_EVERYWHERE,           "[r0]",                  NULL,            NULL },
799 #ifdef ENABLE_SCI32
800 	{ "SaveGame", kSaveGame32,     SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri[r0][r0]",     NULL,            NULL },
801 	{ MAP_CALL(ScummVMSaveLoad),   SIG_SCI32, SIGFOR_ALL,    "([iro])([iro])",        NULL,            NULL },
802 #endif
803 	{ MAP_CALL(SaveGame),          SIG_SCI16, SIGFOR_ALL,    "[r0]i[r0](r0)",         NULL,            NULL },
804 	{ MAP_CALL(ScriptID),          SIG_EVERYWHERE,           "[io](i)",               NULL,            NULL },
805 	{ MAP_CALL(SetCursor),         SIG_SCI11, SIGFOR_ALL,    "i(i)(i)(i)(iiiiii)",    NULL,            NULL },
806 	{ MAP_CALL(SetCursor),         SIG_SCI16, SIGFOR_ALL,    "i(i)(i)(i)(i)",         NULL,            kSetCursor_workarounds },
807 #ifdef ENABLE_SCI32
808 	{ "SetCursor", kSetCursor32,   SIG_SCI32, SIGFOR_ALL,    "i(i)(i)(i)",            NULL,            kSetCursor_workarounds },
809 #endif
810 	{ MAP_CALL(SetDebug),          SIG_EVERYWHERE,           "(i*)",                  NULL,            NULL },
811 	{ MAP_CALL(SetJump),           SIG_EVERYWHERE,           "oiii",                  NULL,            NULL },
812 	{ MAP_CALL(SetMenu),           SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL },
813 	{ MAP_CALL(SetNowSeen),        SIG_SCI16, SIGFOR_ALL,    "o(i)",                  NULL,            NULL },
814 #ifdef ENABLE_SCI32
815 	{ "SetNowSeen", kSetNowSeen32, SIG_SCI32, SIGFOR_ALL,    "o",                     NULL,            NULL },
816 #endif
817 	{ MAP_CALL(SetPort),           SIG_EVERYWHERE,           "i(iiiii)(i)",           NULL,            kSetPort_workarounds },
818 	{ MAP_CALL(SetQuitStr),        SIG_EVERYWHERE,           "r",                     NULL,            NULL },
819 	{ MAP_CALL(SetSynonyms),       SIG_EVERYWHERE,           "o",                     NULL,            NULL },
820 	{ MAP_CALL(SetVideoMode),      SIG_EVERYWHERE,           "i",                     NULL,            NULL },
821 	{ MAP_CALL(ShakeScreen),       SIG_SCI16, SIGFOR_ALL,    "(i)(i)",                NULL,            NULL },
822 #ifdef ENABLE_SCI32
823 	{ "ShakeScreen", kShakeScreen32, SIG_SCI32, SIGFOR_ALL,  "i(i)",                  NULL,            NULL },
824 #endif
825 	{ MAP_CALL(ShowMovie),         SIG_SCI16, SIGFOR_ALL,    "(.*)",                  NULL,            NULL },
826 #ifdef ENABLE_SCI32
827 	{ "ShowMovie", kShowMovie32,   SIG_SCI32, SIGFOR_DOS,    "ri(i)(i)",              NULL,            NULL },
828 	{ "ShowMovie", kShowMovie32,   SIG_SCI32, SIGFOR_MAC,    "ri(i)(i)",              NULL,            NULL },
829 	{ "ShowMovie", kShowMovieWin,  SIG_SCI32, SIGFOR_WIN,    "(.*)",                  kShowMovieWin_subops, NULL },
830 #endif
831 	{ MAP_CALL(Show),              SIG_EVERYWHERE,           "i",                     NULL,            NULL },
832 	{ MAP_CALL(SinDiv),            SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
833 	{ MAP_CALL(Sort),              SIG_EVERYWHERE,           "ooo",                   NULL,            NULL },
834 	{ MAP_CALL(Sqrt),              SIG_EVERYWHERE,           "i",                     NULL,            NULL },
835 	{ MAP_CALL(StrAt),             SIG_EVERYWHERE,           "ri(i)",                 NULL,            kStrAt_workarounds },
836 	{ MAP_CALL(StrCat),            SIG_EVERYWHERE,           "rr",                    NULL,            NULL },
837 	{ MAP_CALL(StrCmp),            SIG_EVERYWHERE,           "rr(i)",                 NULL,            NULL },
838 	{ MAP_CALL(StrCpy),            SIG_EVERYWHERE,           "r[r0](i)",              NULL,            kStrCpy_workarounds },
839 	{ MAP_CALL(StrEnd),            SIG_EVERYWHERE,           "r",                     NULL,            NULL },
840 	{ MAP_CALL(StrLen),            SIG_EVERYWHERE,           "[r0]",                  NULL,            kStrLen_workarounds },
841 	{ MAP_CALL(StrSplit),          SIG_EVERYWHERE,           "rr[r0]",                NULL,            NULL },
842 	{ MAP_CALL(TextColors),        SIG_SCI16, SIGFOR_ALL,    "(i*)",                  NULL,            NULL },
843 	{ MAP_CALL(TextFonts),         SIG_SCI16, SIGFOR_ALL,    "(i*)",                  NULL,            NULL },
844 	{ MAP_CALL(TextSize),          SIG_SCI16, SIGFOR_MAC,    "r[r0]i(i)(r0)(i)",      NULL,            NULL },
845 	{ MAP_CALL(TextSize),          SIG_SCI16, SIGFOR_ALL,    "r[r0]i(i)(r0)",         NULL,            NULL },
846 	{ MAP_CALL(TimesCos),          SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
847 	{ "CosMult", kTimesCos,        SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
848 	{ MAP_CALL(TimesCot),          SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
849 	{ MAP_CALL(TimesSin),          SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
850 	{ "SinMult", kTimesSin,        SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
851 	{ MAP_CALL(TimesTan),          SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
852 	{ MAP_CALL(UnLoad),            SIG_EVERYWHERE,           "i[ir!]",                NULL,            kUnLoad_workarounds },
853 	// ^ We allow invalid references here (e.g. bug #6600), since they will be invalidated anyway by the call itself
854 	{ MAP_CALL(ValidPath),         SIG_EVERYWHERE,           "r",                     NULL,            NULL },
855 	{ MAP_CALL(Wait),              SIG_EVERYWHERE,           "i",                     NULL,            NULL },
856 
857 	// Unimplemented SCI0-SCI1.1 unused functions, always mapped to kDummy
858 	{ MAP_DUMMY(InspectObj),      SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
859 	{ MAP_DUMMY(ShowSends),       SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
860 	{ MAP_DUMMY(ShowObjs),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
861 	{ MAP_DUMMY(ShowFree),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
862 	{ MAP_DUMMY(StackUsage),      SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
863 	{ MAP_DUMMY(Profiler),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
864 	{ MAP_DUMMY(ShiftScreen),     SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
865 	{ MAP_DUMMY(ListOps),         SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
866 	// Used by the sysLogger class (e.g. script 952 in GK1CD), a class used to report bugs by Sierra's testers
867 	{ MAP_DUMMY(ATan),            SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
868 	{ MAP_DUMMY(Record),          SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
869 	{ MAP_DUMMY(PlayBack),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
870 	{ MAP_DUMMY(DbugStr),         SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
871 	// Used in Kawa's SCI11+
872 	{ MAP_CALL(KawaDbugStr),      SIG_SCI11, SIGFOR_ALL,    "(.*)",                  NULL,            NULL },
873 	{ MAP_CALL(KawaHacks),        SIG_SCI11, SIGFOR_ALL,    "(.*)",                  NULL,            NULL },
874 
875 	// =======================================================================================================
876 
877 #ifdef ENABLE_SCI32
878 	// SCI2 Kernel Functions
879 	// TODO: whoever knows his way through those calls, fix the signatures.
880 	{ "TextSize", kTextSize32,     SIG_THRU_SCI21EARLY, SIGFOR_ALL, "r[r0]i(i)",      NULL,            NULL },
881 	{ MAP_DUMMY(TextColors),       SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(.*)",           NULL,            NULL },
882 	{ MAP_DUMMY(TextFonts),        SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(.*)",           NULL,            NULL },
883 
884 	{ MAP_CALL(AddPlane),          SIG_EVERYWHERE,           "o",                     NULL,            NULL },
885 	{ MAP_CALL(AddScreenItem),     SIG_EVERYWHERE,           "o",                     NULL,            NULL },
886 	{ MAP_CALL(Array),             SIG_EVERYWHERE,           "i(.*)",                 kArray_subops,   NULL },
887 	{ MAP_CALL(CreateTextBitmap),  SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL },
888 	{ MAP_CALL(DeletePlane),       SIG_EVERYWHERE,           "o",                     NULL,            NULL },
889 	{ MAP_CALL(DeleteScreenItem),  SIG_EVERYWHERE,           "o",                     NULL,            NULL },
890 	{ "DisposeTextBitmap", kBitmapDestroy, SIG_SCI2, SIGFOR_ALL, "[r!]",              NULL,            NULL },
891 	{ MAP_CALL(FrameOut),          SIG_EVERYWHERE,           "(i)",                   NULL,            kFrameOut_workarounds },
892 	{ MAP_CALL(GetHighPlanePri),   SIG_EVERYWHERE,           "",                      NULL,            NULL },
893 	{ MAP_CALL(InPolygon),         SIG_EVERYWHERE,           "iio",                   NULL,            NULL },
894 	{ MAP_CALL(IsHiRes),           SIG_EVERYWHERE,           "",                      NULL,            NULL },
895 	{ MAP_CALL(ListAllTrue),       SIG_EVERYWHERE,           "li(.*)",                NULL,            NULL },
896 	{ MAP_CALL(ListAt),            SIG_EVERYWHERE,           "li",                    NULL,            NULL },
897 	{ MAP_CALL(ListEachElementDo), SIG_EVERYWHERE,           "li(.*)",                NULL,            NULL },
898 	{ MAP_CALL(ListFirstTrue),     SIG_EVERYWHERE,           "li(.*)",                NULL,            NULL },
899 	{ MAP_CALL(ListIndexOf),       SIG_EVERYWHERE,           "l[o0]",                 NULL,            NULL },
900 	// kMessageBox is used only by KQ7 1.51
901 	{ MAP_CALL(MessageBox),        SIG_SCI32, SIGFOR_ALL,    "rri",                   NULL,            NULL },
902 	{ "OnMe", kIsOnMe,             SIG_EVERYWHERE,           "iioi",                  NULL,            NULL },
903 	// Purge is used by the memory manager in SSCI to ensure that X number of bytes (the so called "unmovable
904 	// memory") are available when the current room changes. This is similar to the SCI0-SCI1.1 FlushResources
905 	// call, with the added functionality of ensuring that a specific amount of memory is available. We have
906 	// our own memory manager and garbage collector, thus we simply call FlushResources, which in turn invokes
907 	// our garbage collector (i.e. the SCI0-SCI1.1 semantics).
908 	{ "Purge", kFlushResources,    SIG_EVERYWHERE,           "i",                     NULL,            NULL },
909 	{ MAP_CALL(SetShowStyle),      SIG_THRU_SCI21MID, SIGFOR_ALL, "ioiiiii([ri])(i)", NULL,            NULL },
910 	{ MAP_CALL(SetShowStyle),      SIG_SCI21LATE,     SIGFOR_ALL, "ioiiiii([ri])([ri])(i)", NULL,      NULL },
911 	{ MAP_CALL(SetShowStyle),      SIG_SCI3,          SIGFOR_ALL, "ioiiiiii(r)(i)",   NULL,            NULL },
912 	{ MAP_CALL(String),            SIG_EVERYWHERE,           "(.*)",                  kString_subops,  NULL },
913 	{ MAP_CALL(UpdatePlane),       SIG_EVERYWHERE,           "o",                     NULL,            NULL },
914 	{ MAP_CALL(UpdateScreenItem),  SIG_EVERYWHERE,           "o",                     NULL,            NULL },
915 	{ MAP_CALL(ObjectIntersect),   SIG_EVERYWHERE,           "oo",                    NULL,            NULL },
916 	{ MAP_CALL(EditText),          SIG_EVERYWHERE,           "o",                     NULL,            NULL },
917 	{ MAP_CALL(MakeSaveCatName),   SIG_THRU_SCI21EARLY, SIGFOR_ALL, "rr",             NULL,            NULL },
918 	{ MAP_CALL(MakeSaveFileName),  SIG_THRU_SCI21EARLY, SIGFOR_ALL, "rri",            NULL,            NULL },
919 	{ MAP_CALL(SetScroll),         SIG_EVERYWHERE,           "oiiii(i)(i)",           NULL,            NULL },
920 	{ MAP_CALL(PalCycle),          SIG_EVERYWHERE,           "(.*)",                  kPalCycle_subops, NULL },
921 
922 	// SCI2 Empty functions
923 
924 	// Debug function used to track resources
925 	{ MAP_EMPTY(ResourceTrack),     SIG_EVERYWHERE,          "(.*)",                  NULL,            NULL },
926 	// Future TODO: This call is used in the floppy version of QFG4 to add
927 	// vibration to exotic mice with force feedback, such as the Logitech
928 	// Cyberman and Wingman mice. Since this is only used for very exotic
929 	// hardware and we have no direct and cross-platform way of communicating
930 	// with them via SDL, plus we would probably need to make changes to common
931 	// code, this call is mapped to an empty function for now as it's a rare
932 	// feature not worth the effort.
933 	{ MAP_EMPTY(VibrateMouse),      SIG_EVERYWHERE,          "(.*)",                  NULL,            NULL },
934 
935 	// Unused / debug SCI2 unused functions, always mapped to kDummy
936 
937 	// AddMagnify/DeleteMagnify are both called by script 64979 (the Magnifier
938 	// object) in GK1 only. There is also an associated empty magnifier view
939 	// (view 1), however, it doesn't seem to be used anywhere, as all the
940 	// magnifier closeups (e.g. in scene 470) are normal views. Thus, these
941 	// are marked as dummy, so if they're ever used the engine will error out.
942 	{ MAP_DUMMY(AddMagnify),       SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
943 	{ MAP_DUMMY(DeleteMagnify),    SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
944 	{ MAP_DUMMY(RepaintPlane),     SIG_EVERYWHERE,           "o",                     NULL,            NULL },
945 	{ MAP_DUMMY(InspectObject),    SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
946 	// Profiler (same as SCI0-SCI1.1)
947 	// Record (same as SCI0-SCI1.1)
948 	// PlayBack (same as SCI0-SCI1.1)
949 	{ MAP_DUMMY(MonoOut),          SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
950 	{ MAP_DUMMY(SetFatalStr),      SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
951 	{ MAP_DUMMY(IntegrityChecking),SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
952 	{ MAP_DUMMY(CheckIntegrity),   SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
953 	{ MAP_DUMMY(MarkMemory),       SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
954 	{ MAP_DUMMY(GetHighItemPri),   SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
955 	{ MAP_DUMMY(ShowStylePercent), SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
956 	{ MAP_DUMMY(InvertRect),       SIG_THRU_SCI21EARLY, SIGFOR_ALL, "(.*)",           NULL,            NULL },
957 	{ MAP_DUMMY(InputText),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
958 	{ MAP_CALL(TextWidth),         SIG_THRU_SCI21EARLY, SIGFOR_ALL, "ri",             NULL,            NULL },
959 	{ MAP_CALL(PointSize),         SIG_THRU_SCI21EARLY, SIGFOR_ALL, "i",              NULL,            NULL },
960 
961 	// SCI2.1 Kernel Functions
962 	{ "CheckCDisc", kCheckCD,      SIG_SCI21EARLY, SIGFOR_ALL, "(i)",                 NULL,            NULL },
963 	{ "GetSaveCDisc", kGetSavedCD, SIG_SCI21EARLY, SIGFOR_ALL, "",                    NULL,            NULL },
964 	{ MAP_CALL(CD),                SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)",            kCD_subops,      NULL },
965 	{ MAP_CALL(IsOnMe),            SIG_EVERYWHERE,           "iioi",                  NULL,            NULL },
966 	{ MAP_CALL(List),              SIG_SINCE_SCI21, SIGFOR_ALL, "(.*)",               kList_subops,    NULL },
967 	{ MAP_CALL(MulDiv),            SIG_EVERYWHERE,           "iii",                   NULL,            NULL },
968 	{ MAP_CALL(PlayVMD),           SIG_EVERYWHERE,           "(.*)",                  kPlayVMD_subops, NULL },
969 	{ MAP_CALL(Robot),             SIG_EVERYWHERE,           "(.*)",                  kRobot_subops,   NULL },
970 	{ MAP_CALL(Save),              SIG_EVERYWHERE,           "i(.*)",                 kSave_subops,    NULL },
971 	{ MAP_CALL(Text),              SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)",           kText_subops,    NULL },
972 	{ MAP_CALL(AddPicAt),          SIG_EVERYWHERE,           "oiii(i)(i)",            NULL,            NULL },
973 	{ MAP_CALL(GetWindowsOption),  SIG_EVERYWHERE,           "i",                     NULL,            NULL },
974 	{ MAP_CALL(WinHelp),           SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
975 	{ MAP_CALL(GetConfig),         SIG_EVERYWHERE,           "ro",                    NULL,            NULL },
976 	{ MAP_CALL(GetSierraProfileInt), SIG_EVERYWHERE,         "rri",                   NULL,            NULL },
977 	{ MAP_CALL(CelInfo),           SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)",            kCelInfo_subops, NULL },
978 	{ MAP_CALL(SetLanguage),       SIG_SINCE_SCI21MID, SIGFOR_ALL, "r",               NULL,            NULL },
979 	{ MAP_CALL(ScrollWindow),      SIG_EVERYWHERE,           "i(.*)",                 kScrollWindow_subops, NULL },
980 	{ MAP_CALL(SetFontRes),        SIG_SCI21EARLY, SIGFOR_ALL, "ii",                  NULL,            NULL },
981 	{ MAP_CALL(Font),              SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(.*)",           kFont_subops,    NULL },
982 	{ MAP_CALL(Bitmap),            SIG_EVERYWHERE,           "(.*)",                  kBitmap_subops,  NULL },
983 	{ MAP_CALL(AddLine),           SIG_EVERYWHERE,           "oiiii(iiiii)",          NULL,            NULL },
984 	// The first argument is a ScreenItem instance ID that is created by the
985 	// engine, not the VM; as a result, in ScummVM, this argument looks like
986 	// an integer and not an object, although it is an object reference.
987 	{ MAP_CALL(UpdateLine),        SIG_EVERYWHERE,           "ioiiii(iiiii)",         NULL,            NULL },
988 	{ MAP_CALL(DeleteLine),        SIG_EVERYWHERE,           "io",                    NULL,            NULL },
989 
990 	// SCI2.1 Empty Functions
991 
992 	// Debug function, used in of Shivers (demo and full). It's marked as a
993 	// stub in the original interpreters, but it gets called by the game scripts.
994 	// Usually, it gets called with a string (which is the output format) and a
995 	// variable number of parameters
996 	{ MAP_CALL(PrintDebug),        SIG_SCI32, SIGFOR_ALL,    "r(.*)",                 NULL,            NULL },
997 
998 	// SetWindowsOption is used to set Windows specific options, like for example the title bar visibility of
999 	// the game window in Phantasmagoria 2. We ignore these settings completely.
1000 	{ MAP_EMPTY(SetWindowsOption), SIG_EVERYWHERE,           "ii",                    NULL,            NULL },
1001 
1002 	// Debug function called whenever the current room changes
1003 	{ MAP_EMPTY(NewRoom),          SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
1004 
1005 	// Unused / debug SCI2.1 unused functions, always mapped to kDummy
1006 
1007 	// The debug functions are called from the inbuilt debugger or polygon
1008 	// editor in SCI2.1 games. Related objects are: PEditor, EditablePolygon,
1009 	// aeDisplayClass and scalerCode
1010 	{ MAP_DUMMY(FindSelector),      SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1011 	{ MAP_DUMMY(FindClass),         SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1012 	{ MAP_DUMMY(CelRect),           SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1013 	{ MAP_DUMMY(BaseLineSpan),      SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1014 	{ MAP_CALL(CelLink),            SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)",           kCelLink_subops, NULL },
1015 	{ MAP_DUMMY(AddPolygon),        SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1016 	{ MAP_DUMMY(DeletePolygon),     SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1017 	{ MAP_DUMMY(UpdatePolygon),     SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1018 	{ MAP_DUMMY(Table),             SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1019 	{ MAP_DUMMY(LoadChunk),         SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1020 	{ MAP_DUMMY(Priority),          SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1021 	{ MAP_CALL(WinDLL),             SIG_SINCE_SCI21MID, SIGFOR_ALL,  "ir(r)",         NULL,            NULL },
1022 	{ MAP_DUMMY(DeletePic),         SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1023 	{ MAP_DUMMY(GetSierraProfileString), SIG_EVERYWHERE,      "(.*)",                 NULL,            NULL },
1024 
1025 	// Unused / debug functions in the in-between SCI2.1 interpreters
1026 	{ MAP_DUMMY(PreloadResource),   SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1027 	{ MAP_DUMMY(TestPoly),          SIG_EVERYWHERE,           "(.*)",                 NULL,            NULL },
1028 
1029 	// Used by Phantasmagoria 1, script 64981 (used in the chase scene)
1030 	{ MAP_CALL(SetHotRectangles), SIG_SINCE_SCI21MID, SIGFOR_ALL, "i(r)",             NULL,            NULL },
1031 
1032 	// Used by SQ6 to scroll through the inventory via the up/down buttons
1033 	{ MAP_CALL(MovePlaneItems),     SIG_SINCE_SCI21, SIGFOR_ALL, "oii(i)",            NULL,            NULL },
1034 
1035 	{ MAP_CALL(SetPalStyleRange),   SIG_EVERYWHERE,           "ii",                   NULL,            NULL },
1036 
1037 	{ MAP_CALL(MorphOn),            SIG_EVERYWHERE,           "",                     NULL,            NULL },
1038 
1039 	// SCI3 Kernel Functions
1040 	{ MAP_EMPTY(Minimize),          SIG_SCI3, SIGFOR_ALL,     "(.*)",                 NULL,            NULL },
1041 	{ MAP_CALL(PlayDuck),           SIG_SCI3, SIGFOR_ALL,     "(.*)",                 kPlayDuck_subops,NULL },
1042 	{ MAP_CALL(WebConnect),         SIG_SCI3, SIGFOR_ALL,     "(r)",                  NULL,            NULL },
1043 	{ MAP_CALL(WinExec),            SIG_SCI3, SIGFOR_ALL,     "r",                    NULL,            NULL },
1044 #endif
1045 
1046 	{ NULL, NULL,                   SIG_EVERYWHERE,           NULL,                   NULL,            NULL }
1047 };
1048 
1049 /** Default kernel name table. */
1050 static const char *const s_defaultKernelNames[] = {
1051 	/*0x00*/ "Load",
1052 	/*0x01*/ "UnLoad",
1053 	/*0x02*/ "ScriptID",
1054 	/*0x03*/ "DisposeScript",
1055 	/*0x04*/ "Clone",
1056 	/*0x05*/ "DisposeClone",
1057 	/*0x06*/ "IsObject",
1058 	/*0x07*/ "RespondsTo",
1059 	/*0x08*/ "DrawPic",
1060 	/*0x09*/ "Show",
1061 	/*0x0a*/ "PicNotValid",
1062 	/*0x0b*/ "Animate",
1063 	/*0x0c*/ "SetNowSeen",
1064 	/*0x0d*/ "NumLoops",
1065 	/*0x0e*/ "NumCels",
1066 	/*0x0f*/ "CelWide",
1067 	/*0x10*/ "CelHigh",
1068 	/*0x11*/ "DrawCel",
1069 	/*0x12*/ "AddToPic",
1070 	/*0x13*/ "NewWindow",
1071 	/*0x14*/ "GetPort",
1072 	/*0x15*/ "SetPort",
1073 	/*0x16*/ "DisposeWindow",
1074 	/*0x17*/ "DrawControl",
1075 	/*0x18*/ "HiliteControl",
1076 	/*0x19*/ "EditControl",
1077 	/*0x1a*/ "TextSize",
1078 	/*0x1b*/ "Display",
1079 	/*0x1c*/ "GetEvent",
1080 	/*0x1d*/ "GlobalToLocal",
1081 	/*0x1e*/ "LocalToGlobal",
1082 	/*0x1f*/ "MapKeyToDir",
1083 	/*0x20*/ "DrawMenuBar",
1084 	/*0x21*/ "MenuSelect",
1085 	/*0x22*/ "AddMenu",
1086 	/*0x23*/ "DrawStatus",
1087 	/*0x24*/ "Parse",
1088 	/*0x25*/ "Said",
1089 	/*0x26*/ "SetSynonyms",	// Portrait (KQ6 hires)
1090 	/*0x27*/ "HaveMouse",
1091 	/*0x28*/ "SetCursor",
1092 	// FOpen (SCI0)
1093 	// FPuts (SCI0)
1094 	// FGets (SCI0)
1095 	// FClose (SCI0)
1096 	/*0x29*/ "SaveGame",
1097 	/*0x2a*/ "RestoreGame",
1098 	/*0x2b*/ "RestartGame",
1099 	/*0x2c*/ "GameIsRestarting",
1100 	/*0x2d*/ "DoSound",
1101 	/*0x2e*/ "NewList",
1102 	/*0x2f*/ "DisposeList",
1103 	/*0x30*/ "NewNode",
1104 	/*0x31*/ "FirstNode",
1105 	/*0x32*/ "LastNode",
1106 	/*0x33*/ "EmptyList",
1107 	/*0x34*/ "NextNode",
1108 	/*0x35*/ "PrevNode",
1109 	/*0x36*/ "NodeValue",
1110 	/*0x37*/ "AddAfter",
1111 	/*0x38*/ "AddToFront",
1112 	/*0x39*/ "AddToEnd",
1113 	/*0x3a*/ "FindKey",
1114 	/*0x3b*/ "DeleteKey",
1115 	/*0x3c*/ "Random",
1116 	/*0x3d*/ "Abs",
1117 	/*0x3e*/ "Sqrt",
1118 	/*0x3f*/ "GetAngle",
1119 	/*0x40*/ "GetDistance",
1120 	/*0x41*/ "Wait",
1121 	/*0x42*/ "GetTime",
1122 	/*0x43*/ "StrEnd",
1123 	/*0x44*/ "StrCat",
1124 	/*0x45*/ "StrCmp",
1125 	/*0x46*/ "StrLen",
1126 	/*0x47*/ "StrCpy",
1127 	/*0x48*/ "Format",
1128 	/*0x49*/ "GetFarText",
1129 	/*0x4a*/ "ReadNumber",
1130 	/*0x4b*/ "BaseSetter",
1131 	/*0x4c*/ "DirLoop",
1132 	/*0x4d*/ "CanBeHere",       // CantBeHere in newer SCI versions
1133 	/*0x4e*/ "OnControl",
1134 	/*0x4f*/ "InitBresen",
1135 	/*0x50*/ "DoBresen",
1136 	/*0x51*/ "Platform",        // DoAvoider (SCI0)
1137 	/*0x52*/ "SetJump",
1138 	/*0x53*/ "SetDebug",        // for debugging
1139 	/*0x54*/ "InspectObj",      // for debugging
1140 	/*0x55*/ "ShowSends",       // for debugging
1141 	/*0x56*/ "ShowObjs",        // for debugging
1142 	/*0x57*/ "ShowFree",        // for debugging
1143 	/*0x58*/ "MemoryInfo",
1144 	/*0x59*/ "StackUsage",      // for debugging
1145 	/*0x5a*/ "Profiler",        // for debugging
1146 	/*0x5b*/ "GetMenu",
1147 	/*0x5c*/ "SetMenu",
1148 	/*0x5d*/ "GetSaveFiles",
1149 	/*0x5e*/ "GetCWD",
1150 	/*0x5f*/ "CheckFreeSpace",
1151 	/*0x60*/ "ValidPath",
1152 	/*0x61*/ "CoordPri",
1153 	/*0x62*/ "StrAt",
1154 	/*0x63*/ "DeviceInfo",
1155 	/*0x64*/ "GetSaveDir",
1156 	/*0x65*/ "CheckSaveGame",
1157 	/*0x66*/ "ShakeScreen",
1158 	/*0x67*/ "FlushResources",
1159 	/*0x68*/ "SinMult",
1160 	/*0x69*/ "CosMult",
1161 	/*0x6a*/ "SinDiv",
1162 	/*0x6b*/ "CosDiv",
1163 	/*0x6c*/ "Graph",
1164 	/*0x6d*/ "Joystick",
1165 	// End of kernel function table for SCI0
1166 	/*0x6e*/ "ShiftScreen",     // never called?
1167 	/*0x6f*/ "Palette",
1168 	/*0x70*/ "MemorySegment",
1169 	/*0x71*/ "Intersections",	// MoveCursor (SCI1 late), PalVary (SCI1.1)
1170 	/*0x72*/ "Memory",
1171 	/*0x73*/ "ListOps",         // never called?
1172 	/*0x74*/ "FileIO",
1173 	/*0x75*/ "DoAudio",
1174 	/*0x76*/ "DoSync",
1175 	/*0x77*/ "AvoidPath",
1176 	/*0x78*/ "Sort",            // StrSplit (SCI01)
1177 	/*0x79*/ "ATan",            // never called?
1178 	/*0x7a*/ "Lock",
1179 	/*0x7b*/ "StrSplit",
1180 	/*0x7c*/ "GetMessage",      // Message (SCI1.1)
1181 	/*0x7d*/ "IsItSkip",
1182 	/*0x7e*/ "MergePoly",
1183 	/*0x7f*/ "ResCheck",
1184 	/*0x80*/ "AssertPalette",
1185 	/*0x81*/ "TextColors",
1186 	/*0x82*/ "TextFonts",
1187 	/*0x83*/ "Record",          // for debugging
1188 	/*0x84*/ "PlayBack",        // for debugging
1189 	/*0x85*/ "ShowMovie",
1190 	/*0x86*/ "SetVideoMode",
1191 	/*0x87*/ "SetQuitStr",
1192 	/*0x88*/ "DbugStr",         // for debugging
1193 	/*0x89*/ "Empty",
1194 	/*0x8a*/ "Empty"
1195 };
1196 
1197 #ifdef ENABLE_SCI32
1198 
1199 // NOTE: 0x72-0x79, 0x85-0x86, 0x88 are from the GK2 demo (which has debug support) and are
1200 // just Dummy in other SCI2 games.
1201 static const char *const sci2_default_knames[] = {
1202 	/*0x00*/ "Load",
1203 	/*0x01*/ "UnLoad",
1204 	/*0x02*/ "ScriptID",
1205 	/*0x03*/ "DisposeScript",
1206 	/*0x04*/ "Lock",
1207 	/*0x05*/ "ResCheck",
1208 	/*0x06*/ "Purge",
1209 	/*0x07*/ "Clone",
1210 	/*0x08*/ "DisposeClone",
1211 	/*0x09*/ "RespondsTo",
1212 	/*0x0a*/ "SetNowSeen",
1213 	/*0x0b*/ "NumLoops",
1214 	/*0x0c*/ "NumCels",
1215 	/*0x0d*/ "CelWide",
1216 	/*0x0e*/ "CelHigh",
1217 	/*0x0f*/ "GetHighPlanePri",
1218 	/*0x10*/ "GetHighItemPri",		// unused function
1219 	/*0x11*/ "ShakeScreen",
1220 	/*0x12*/ "OnMe",
1221 	/*0x13*/ "ShowMovie",
1222 	/*0x14*/ "SetVideoMode",
1223 	/*0x15*/ "AddScreenItem",
1224 	/*0x16*/ "DeleteScreenItem",
1225 	/*0x17*/ "UpdateScreenItem",
1226 	/*0x18*/ "FrameOut",
1227 	/*0x19*/ "AddPlane",
1228 	/*0x1a*/ "DeletePlane",
1229 	/*0x1b*/ "UpdatePlane",
1230 	/*0x1c*/ "RepaintPlane",		// unused function
1231 	/*0x1d*/ "SetShowStyle",
1232 	/*0x1e*/ "ShowStylePercent",	// unused function
1233 	/*0x1f*/ "SetScroll",
1234 	/*0x20*/ "AddMagnify",
1235 	/*0x21*/ "DeleteMagnify",
1236 	/*0x22*/ "IsHiRes",
1237 	/*0x23*/ "Graph",		// Robot in early SCI2.1 games with a SCI2 kernel table
1238 	/*0x24*/ "InvertRect",	// only in SCI2, not used in any SCI2 game
1239 	/*0x25*/ "TextSize",
1240 	/*0x26*/ "Message",
1241 	/*0x27*/ "TextColors",
1242 	/*0x28*/ "TextFonts",
1243 	/*0x29*/ "Dummy",
1244 	/*0x2a*/ "SetQuitStr",
1245 	/*0x2b*/ "EditText",
1246 	/*0x2c*/ "InputText",			// unused function
1247 	/*0x2d*/ "CreateTextBitmap",
1248 	/*0x2e*/ "DisposeTextBitmap",	// Priority in early SCI2.1 games with a SCI2 kernel table
1249 	/*0x2f*/ "GetEvent",
1250 	/*0x30*/ "GlobalToLocal",
1251 	/*0x31*/ "LocalToGlobal",
1252 	/*0x32*/ "MapKeyToDir",
1253 	/*0x33*/ "HaveMouse",
1254 	/*0x34*/ "SetCursor",
1255 	/*0x35*/ "VibrateMouse",
1256 	/*0x36*/ "SaveGame",
1257 	/*0x37*/ "RestoreGame",
1258 	/*0x38*/ "RestartGame",
1259 	/*0x39*/ "GameIsRestarting",
1260 	/*0x3a*/ "MakeSaveCatName",
1261 	/*0x3b*/ "MakeSaveFileName",
1262 	/*0x3c*/ "GetSaveFiles",
1263 	/*0x3d*/ "GetSaveDir",
1264 	/*0x3e*/ "CheckSaveGame",
1265 	/*0x3f*/ "CheckFreeSpace",
1266 	/*0x40*/ "DoSound",
1267 	/*0x41*/ "DoAudio",
1268 	/*0x42*/ "DoSync",
1269 	/*0x43*/ "NewList",
1270 	/*0x44*/ "DisposeList",
1271 	/*0x45*/ "NewNode",
1272 	/*0x46*/ "FirstNode",
1273 	/*0x47*/ "LastNode",
1274 	/*0x48*/ "EmptyList",
1275 	/*0x49*/ "NextNode",
1276 	/*0x4a*/ "PrevNode",
1277 	/*0x4b*/ "NodeValue",
1278 	/*0x4c*/ "AddAfter",
1279 	/*0x4d*/ "AddToFront",
1280 	/*0x4e*/ "AddToEnd",
1281 	/*0x4f*/ "Dummy",
1282 	/*0x50*/ "Dummy",
1283 	/*0x51*/ "FindKey",
1284 	/*0x52*/ "Dummy",
1285 	/*0x53*/ "Dummy",
1286 	/*0x54*/ "Dummy",
1287 	/*0x55*/ "DeleteKey",
1288 	/*0x56*/ "Dummy",
1289 	/*0x57*/ "Dummy",
1290 	/*0x58*/ "ListAt",
1291 	/*0x59*/ "ListIndexOf",
1292 	/*0x5a*/ "ListEachElementDo",
1293 	/*0x5b*/ "ListFirstTrue",
1294 	/*0x5c*/ "ListAllTrue",
1295 	/*0x5d*/ "Random",
1296 	/*0x5e*/ "Abs",
1297 	/*0x5f*/ "Sqrt",
1298 	/*0x60*/ "GetAngle",
1299 	/*0x61*/ "GetDistance",
1300 	/*0x62*/ "ATan",
1301 	/*0x63*/ "SinMult",
1302 	/*0x64*/ "CosMult",
1303 	/*0x65*/ "SinDiv",
1304 	/*0x66*/ "CosDiv",
1305 	/*0x67*/ "GetTime",
1306 	/*0x68*/ "Platform",
1307 	/*0x69*/ "BaseSetter",
1308 	/*0x6a*/ "DirLoop",
1309 	/*0x6b*/ "CantBeHere",
1310 	/*0x6c*/ "InitBresen",
1311 	/*0x6d*/ "DoBresen",
1312 	/*0x6e*/ "SetJump",
1313 	/*0x6f*/ "AvoidPath",
1314 	/*0x70*/ "InPolygon",
1315 	/*0x71*/ "MergePoly",
1316 	/*0x72*/ "SetDebug",
1317 	/*0x73*/ "InspectObject",     // for debugging
1318 	/*0x74*/ "MemoryInfo",
1319 	/*0x75*/ "Profiler",          // for debugging
1320 	/*0x76*/ "Record",            // for debugging
1321 	/*0x77*/ "PlayBack",          // for debugging
1322 	/*0x78*/ "MonoOut",           // for debugging
1323 	/*0x79*/ "SetFatalStr",       // for debugging
1324 	/*0x7a*/ "GetCWD",
1325 	/*0x7b*/ "ValidPath",
1326 	/*0x7c*/ "FileIO",
1327 	/*0x7d*/ "Dummy",
1328 	/*0x7e*/ "DeviceInfo",
1329 	/*0x7f*/ "Palette",
1330 	/*0x80*/ "PalVary",
1331 	/*0x81*/ "PalCycle",
1332 	/*0x82*/ "Array",
1333 	/*0x83*/ "String",
1334 	/*0x84*/ "RemapColors",
1335 	/*0x85*/ "IntegrityChecking", // for debugging
1336 	/*0x86*/ "CheckIntegrity",	  // for debugging
1337 	/*0x87*/ "ObjectIntersect",
1338 	/*0x88*/ "MarkMemory",	      // for debugging
1339 	/*0x89*/ "TextWidth",
1340 	/*0x8a*/ "PointSize",
1341 
1342 	/*0x8b*/ "AddLine",
1343 	/*0x8c*/ "DeleteLine",
1344 	/*0x8d*/ "UpdateLine",
1345 	/*0x8e*/ "AddPolygon",
1346 	/*0x8f*/ "DeletePolygon",
1347 	/*0x90*/ "UpdatePolygon",
1348 	/*0x91*/ "Bitmap",
1349 	/*0x92*/ "ScrollWindow",
1350 	/*0x93*/ "SetFontRes",
1351 	/*0x94*/ "MovePlaneItems",
1352 	/*0x95*/ "PreloadResource",
1353 	/*0x96*/ "Dummy",
1354 	/*0x97*/ "ResourceTrack",
1355 	/*0x98*/ "CheckCDisc",
1356 	/*0x99*/ "GetSaveCDisc",
1357 	/*0x9a*/ "TestPoly",
1358 	/*0x9b*/ "WinHelp",
1359 	/*0x9c*/ "LoadChunk",
1360 	/*0x9d*/ "SetPalStyleRange",
1361 	/*0x9e*/ "AddPicAt",
1362 	/*0x9f*/ "MessageBox"
1363 };
1364 
1365 static const char *const sci21_default_knames[] = {
1366 	/*0x00*/ "Load",
1367 	/*0x01*/ "UnLoad",
1368 	/*0x02*/ "ScriptID",
1369 	/*0x03*/ "DisposeScript",
1370 	/*0x04*/ "Lock",
1371 	/*0x05*/ "ResCheck",
1372 	/*0x06*/ "Purge",
1373 	/*0x07*/ "SetLanguage",
1374 	/*0x08*/ "Dummy",
1375 	/*0x09*/ "Dummy",
1376 	/*0x0a*/ "Clone",
1377 	/*0x0b*/ "DisposeClone",
1378 	/*0x0c*/ "RespondsTo",
1379 	/*0x0d*/ "FindSelector",
1380 	/*0x0e*/ "FindClass",
1381 	/*0x0f*/ "Dummy",
1382 	/*0x10*/ "Dummy",
1383 	/*0x11*/ "Dummy",
1384 	/*0x12*/ "Dummy",
1385 	/*0x13*/ "Dummy",
1386 	/*0x14*/ "SetNowSeen",
1387 	/*0x15*/ "NumLoops",
1388 	/*0x16*/ "NumCels",
1389 	/*0x17*/ "IsOnMe",
1390 	/*0x18*/ "AddMagnify",		// dummy in SCI3
1391 	/*0x19*/ "DeleteMagnify",	// dummy in SCI3
1392 	/*0x1a*/ "CelRect",
1393 	/*0x1b*/ "BaseLineSpan",
1394 	/*0x1c*/ "CelWide",
1395 	/*0x1d*/ "CelHigh",
1396 	/*0x1e*/ "AddScreenItem",
1397 	/*0x1f*/ "DeleteScreenItem",
1398 	/*0x20*/ "UpdateScreenItem",
1399 	/*0x21*/ "FrameOut",
1400 	/*0x22*/ "CelInfo",
1401 	/*0x23*/ "Bitmap",
1402 	/*0x24*/ "CelLink",
1403 	/*0x25*/ "Dummy",
1404 	/*0x26*/ "Dummy",
1405 	/*0x27*/ "Dummy",
1406 	/*0x28*/ "AddPlane",
1407 	/*0x29*/ "DeletePlane",
1408 	/*0x2a*/ "UpdatePlane",
1409 	/*0x2b*/ "RepaintPlane",
1410 	/*0x2c*/ "GetHighPlanePri",
1411 	/*0x2d*/ "GetHighItemPri",		// unused function
1412 	/*0x2e*/ "SetShowStyle",
1413 	/*0x2f*/ "ShowStylePercent",	// unused function
1414 	/*0x30*/ "SetScroll",			// dummy in SCI3
1415 	/*0x31*/ "MovePlaneItems",
1416 	/*0x32*/ "ShakeScreen",
1417 	/*0x33*/ "Dummy",
1418 	/*0x34*/ "Dummy",
1419 	/*0x35*/ "Dummy",
1420 	/*0x36*/ "Dummy",
1421 	/*0x37*/ "IsHiRes",
1422 	/*0x38*/ "SetVideoMode",
1423 	/*0x39*/ "ShowMovie",			// dummy in SCI3
1424 	/*0x3a*/ "Robot",
1425 	/*0x3b*/ "CreateTextBitmap",
1426 	/*0x3c*/ "Random",
1427 	/*0x3d*/ "Abs",
1428 	/*0x3e*/ "Sqrt",
1429 	/*0x3f*/ "GetAngle",
1430 	/*0x40*/ "GetDistance",
1431 	/*0x41*/ "ATan",
1432 	/*0x42*/ "SinMult",
1433 	/*0x43*/ "CosMult",
1434 	/*0x44*/ "SinDiv",
1435 	/*0x45*/ "CosDiv",
1436 	/*0x46*/ "Text",
1437 	/*0x47*/ "Dummy",
1438 	/*0x48*/ "Message",
1439 	/*0x49*/ "Font",
1440 	/*0x4a*/ "EditText",
1441 	/*0x4b*/ "InputText",		// unused function
1442 	/*0x4c*/ "ScrollWindow",	// Dummy in SCI3
1443 	/*0x4d*/ "Dummy",
1444 	/*0x4e*/ "Dummy",
1445 	/*0x4f*/ "Dummy",           // Replaced with kWait for Hoyle5 in ScummVM
1446 	/*0x50*/ "GetEvent",
1447 	/*0x51*/ "GlobalToLocal",
1448 	/*0x52*/ "LocalToGlobal",
1449 	/*0x53*/ "MapKeyToDir",
1450 	/*0x54*/ "HaveMouse",
1451 	/*0x55*/ "SetCursor",
1452 	/*0x56*/ "VibrateMouse",	// Dummy in SCI3
1453 	/*0x57*/ "Dummy",
1454 	/*0x58*/ "Dummy",
1455 	/*0x59*/ "Dummy",
1456 	/*0x5a*/ "List",
1457 	/*0x5b*/ "Array",
1458 	/*0x5c*/ "String",
1459 	/*0x5d*/ "FileIO",
1460 	/*0x5e*/ "BaseSetter",
1461 	/*0x5f*/ "DirLoop",
1462 	/*0x60*/ "CantBeHere",
1463 	/*0x61*/ "InitBresen",
1464 	/*0x62*/ "DoBresen",
1465 	/*0x63*/ "SetJump",
1466 	/*0x64*/ "AvoidPath",		// dummy in SCI3
1467 	/*0x65*/ "InPolygon",
1468 	/*0x66*/ "MergePoly",		// dummy in SCI3
1469 	/*0x67*/ "ObjectIntersect",
1470 	/*0x68*/ "Dummy",
1471 	/*0x69*/ "MemoryInfo",
1472 	/*0x6a*/ "DeviceInfo",
1473 	/*0x6b*/ "Palette",
1474 	/*0x6c*/ "PalVary",
1475 	/*0x6d*/ "PalCycle",
1476 	/*0x6e*/ "RemapColors",
1477 	/*0x6f*/ "AddLine",
1478 	/*0x70*/ "DeleteLine",
1479 	/*0x71*/ "UpdateLine",
1480 	/*0x72*/ "AddPolygon",
1481 	/*0x73*/ "DeletePolygon",
1482 	/*0x74*/ "UpdatePolygon",
1483 	/*0x75*/ "DoSound",
1484 	/*0x76*/ "DoAudio",
1485 	/*0x77*/ "DoSync",
1486 	/*0x78*/ "Save",
1487 	/*0x79*/ "GetTime",
1488 	/*0x7a*/ "Platform",
1489 	/*0x7b*/ "CD",
1490 	/*0x7c*/ "SetQuitStr",
1491 	/*0x7d*/ "GetConfig",
1492 	/*0x7e*/ "Table",
1493 	/*0x7f*/ "WinHelp",		// Windows only
1494 	/*0x80*/ "Dummy",
1495 	/*0x81*/ "Empty",       // called when clicking the On-line Help button in Phant2 control panel
1496 	/*0x82*/ "Dummy",
1497 	/*0x83*/ "PrintDebug",	// debug function, used by Shivers (demo and full)
1498 	/*0x84*/ "Dummy",
1499 	/*0x85*/ "Dummy",
1500 	/*0x86*/ "Dummy",
1501 	/*0x87*/ "Dummy",
1502 	/*0x88*/ "Dummy",
1503 	/*0x89*/ "Dummy",
1504 	/*0x8a*/ "LoadChunk",
1505 	/*0x8b*/ "SetPalStyleRange",
1506 	/*0x8c*/ "AddPicAt",
1507 	/*0x8d*/ "Dummy",	// MessageBox in SCI3
1508 	/*0x8e*/ "NewRoom",		// debug function
1509 	/*0x8f*/ "Dummy",
1510 	/*0x90*/ "Priority",
1511 	/*0x91*/ "MorphOn",
1512 	/*0x92*/ "PlayVMD",
1513 	/*0x93*/ "SetHotRectangles",
1514 	/*0x94*/ "MulDiv",
1515 	/*0x95*/ "GetSierraProfileInt", // , Windows only
1516 	/*0x96*/ "GetSierraProfileString", // , Windows only
1517 	/*0x97*/ "SetWindowsOption", // Windows only
1518 	/*0x98*/ "GetWindowsOption", // Windows only
1519 	/*0x99*/ "WinDLL", // Windows only
1520 	/*0x9a*/ "Dummy",
1521 	/*0x9b*/ "Dummy",	// Minimize in SCI3
1522 	/*0x9c*/ "DeletePic",
1523 	// == SCI3 only ===============
1524 	/*0x9d*/ "Dummy",
1525 	/*0x9e*/ "WebConnect",
1526 	/*0x9f*/ "Dummy",
1527 	/*0xa0*/ "PlayDuck",
1528 	/*0xa1*/ "WinExec"
1529 };
1530 
1531 #endif
1532 
1533 // Base set of opcode formats. They're copied and adjusted slightly in
1534 // script_adjust_opcode_format depending on SCI version.
1535 static const opcode_format g_base_opcode_formats[128][4] = {
1536 	// 00 - 03 / bnot, add, sub, mul
1537 	{Script_None}, {Script_None}, {Script_None}, {Script_None},
1538 	// 04 - 07 / div, mod, shr, shl
1539 	{Script_None}, {Script_None}, {Script_None}, {Script_None},
1540 	// 08 - 0B / xor, and, or, neg
1541 	{Script_None}, {Script_None}, {Script_None}, {Script_None},
1542 	// 0C - 0F / not, eq, ne, gt
1543 	{Script_None}, {Script_None}, {Script_None}, {Script_None},
1544 	// 10 - 13 / ge, lt, le, ugt
1545 	{Script_None}, {Script_None}, {Script_None}, {Script_None},
1546 	// 14 - 17 / uge, ult, ule, bt
1547 	{Script_None}, {Script_None}, {Script_None}, {Script_SRelative},
1548 	// 18 - 1B / bnt, jmp, ldi, push
1549 	{Script_SRelative}, {Script_SRelative}, {Script_SVariable}, {Script_None},
1550 	// 1C - 1F / pushi, toss, dup, link
1551 	{Script_SVariable}, {Script_None}, {Script_None}, {Script_Variable},
1552 	// 20 - 23 / call, callk, callb, calle
1553 	{Script_SRelative, Script_Byte}, {Script_Variable, Script_Byte}, {Script_Variable, Script_Byte}, {Script_Variable, Script_SVariable, Script_Byte},
1554 	// 24 - 27 / ret, send, dummy, dummy
1555 	{Script_End}, {Script_Byte}, {Script_Invalid}, {Script_Invalid},
1556 	// 28 - 2B / class, dummy, self, super
1557 	{Script_Variable}, {Script_Invalid}, {Script_Byte}, {Script_Variable, Script_Byte},
1558 	// 2C - 2F / rest, lea, selfID, dummy
1559 	{Script_SVariable}, {Script_SVariable, Script_Variable}, {Script_None}, {Script_Invalid},
1560 	// 30 - 33 / pprev, pToa, aTop, pTos
1561 	{Script_None}, {Script_Property}, {Script_Property}, {Script_Property},
1562 	// 34 - 37 / sTop, ipToa, dpToa, ipTos
1563 	{Script_Property}, {Script_Property}, {Script_Property}, {Script_Property},
1564 	// 38 - 3B / dpTos, lofsa, lofss, push0
1565 	{Script_Property}, {Script_SRelative}, {Script_SRelative}, {Script_None},
1566 	// 3C - 3F / push1, push2, pushSelf, line
1567 	{Script_None}, {Script_None}, {Script_None}, {Script_Word},
1568 	// ------------------------------------------------------------------------
1569 	// 40 - 43 / lag, lal, lat, lap
1570 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1571 	// 44 - 47 / lsg, lsl, lst, lsp
1572 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1573 	// 48 - 4B / lagi, lali, lati, lapi
1574 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1575 	// 4C - 4F / lsgi, lsli, lsti, lspi
1576 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1577 	// ------------------------------------------------------------------------
1578 	// 50 - 53 / sag, sal, sat, sap
1579 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1580 	// 54 - 57 / ssg, ssl, sst, ssp
1581 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1582 	// 58 - 5B / sagi, sali, sati, sapi
1583 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1584 	// 5C - 5F / ssgi, ssli, ssti, sspi
1585 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1586 	// ------------------------------------------------------------------------
1587 	// 60 - 63 / plusag, plusal, plusat, plusap
1588 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1589 	// 64 - 67 / plussg, plussl, plusst, plussp
1590 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1591 	// 68 - 6B / plusagi, plusali, plusati, plusapi
1592 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1593 	// 6C - 6F / plussgi, plussli, plussti, plusspi
1594 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1595 	// ------------------------------------------------------------------------
1596 	// 70 - 73 / minusag, minusal, minusat, minusap
1597 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1598 	// 74 - 77 / minussg, minussl, minusst, minussp
1599 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1600 	// 78 - 7B / minusagi, minusali, minusati, minusapi
1601 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param},
1602 	// 7C - 7F / minussgi, minussli, minussti, minusspi
1603 	{Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}
1604 };
1605 
1606 } // End of namespace Sci
1607 
1608 #endif // SCI_ENGINE_KERNEL_TABLES_H
1609