SCI: kernelMap cleanup and making it possible to have version (not implemented yet) or platform specific entries - changing signature for kNewWindow - using old dummy-signature for mac-only

svn-id: r50504
This commit is contained in:
Martin Kiewitz 2010-06-29 20:44:19 +00:00
parent 3a2ac994d4
commit 7951e3ddcf

View File

@ -199,201 +199,227 @@ static const char *s_defaultKernelNames[] = {
/*0x88*/ "Dummy" // DbugStr
};
struct SciKernelFunction {
// [io] -> either integer or object
// (io) -> optionally integer AND an object
// (i) -> optional integer
// . -> any type
// i* -> optional multiple integers
// .* -> any parameters afterwards (or none)
struct SciKernelMapEntry {
const char *name;
KernelFunc *func; /* The actual function */
const char *signature; /* kfunct signature */
KernelFunc *function;
SciVersion fromVersion;
SciVersion toVersion;
byte forPlatform;
const char *signature;
const char *subSignature; // placeholder
};
static SciKernelFunction s_kernelFuncMap[] = {
/*00*/ { "Load", kLoad, "iii*" },
/*01*/ { "UnLoad", kUnLoad, "i.*" }, // Work around SQ1 bug, when exiting the Ulence flats bar
/*02*/ { "ScriptID", kScriptID, "Ioi*" },
/*03*/ { "DisposeScript", kDisposeScript, "Oii*" }, // Work around QfG1 bug
/*04*/ { "Clone", kClone, "o" },
/*05*/ { "DisposeClone", kDisposeClone, "o" },
/*06*/ { "IsObject", kIsObject, "." },
/*07*/ { "RespondsTo", kRespondsTo, ".i" },
/*08*/ { "DrawPic", kDrawPic, "i*" },
#define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE
#define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1
#define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1
#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE
/*0a*/ { "PicNotValid", kPicNotValid, "i*" },
/*0b*/ { "Animate", kAnimate, "LI*" }, // More like (li?)?
/*0c*/ { "SetNowSeen", kSetNowSeen, "oi*" }, // The second parameter is ignored
/*0d*/ { "NumLoops", kNumLoops, "o" },
/*0e*/ { "NumCels", kNumCels, "o" },
/*0f*/ { "CelWide", kCelWide, "iOi*" },
/*10*/ { "CelHigh", kCelHigh, "iOi*" },
/*11*/ { "DrawCel", kDrawCel, "iiiiii*i*r*" },
/*12*/ { "AddToPic", kAddToPic, "Il*" },
// FIXME: signature check removed (set to .*) as kNewWindow is different in Mac versions
/*13*/ { "NewWindow", kNewWindow, "*." },
///*13*/ { "NewWindow", kNewWindow, "iiiiZRi*" },
/*14*/ { "GetPort", kGetPort, "" },
/*15*/ { "SetPort", kSetPort, "ii*" },
/*16*/ { "DisposeWindow", kDisposeWindow, "ii*" },
/*17*/ { "DrawControl", kDrawControl, "o" },
/*18*/ { "HiliteControl", kHiliteControl, "o" },
/*19*/ { "EditControl", kEditControl, "ZoZo" },
/*1a*/ { "TextSize", kTextSize, "rZrii*r*" },
/*1b*/ { "Display", kDisplay, ".*" },
/*1c*/ { "GetEvent", kGetEvent, "ioi*" }, // Mac versions pass an extra 3rd parameter (ignored - always 0?)
/*1d*/ { "GlobalToLocal", kGlobalToLocal, "oo*" },
/*1e*/ { "LocalToGlobal", kLocalToGlobal, "oo*" },
/*1f*/ { "MapKeyToDir", kMapKeyToDir, "o" },
/*20*/ { "DrawMenuBar", kDrawMenuBar, "i" },
/*21*/ { "MenuSelect", kMenuSelect, "oi*" },
/*22*/ { "AddMenu", kAddMenu, "rr" },
/*23*/ { "DrawStatus", kDrawStatus, "Zri*" },
/*24*/ { "Parse", kParse, "ro" },
/*25*/ { "Said", kSaid, "Zr" },
/*26*/ { "SetSynonyms", kSetSynonyms, "o" },
/*27*/ { "HaveMouse", kHaveMouse, "" },
/*28*/ { "SetCursor", kSetCursor, "i*" },
// FIXME: The number 0x28 occurs twice :-)
/*28*/ { "MoveCursor", kMoveCursor, "ii" },
/*29*/ { "FOpen", kFOpen, "ri" },
/*2a*/ { "FPuts", kFPuts, "ir" },
/*2b*/ { "FGets", kFGets, "rii" },
/*2c*/ { "FClose", kFClose, "i" },
/*2d*/ { "SaveGame", kSaveGame, "rirr*" },
/*2e*/ { "RestoreGame", kRestoreGame, "rir*" },
/*2f*/ { "RestartGame", kRestartGame, "" },
/*30*/ { "GameIsRestarting", kGameIsRestarting, "i*" },
/*31*/ { "DoSound", kDoSound, "iIo*" },
/*32*/ { "NewList", kNewList, "" },
/*33*/ { "DisposeList", kDisposeList, "l" },
/*34*/ { "NewNode", kNewNode, ".." },
/*35*/ { "FirstNode", kFirstNode, "Zl" },
/*36*/ { "LastNode", kLastNode, "l" },
/*37*/ { "EmptyList", kEmptyList, "l" },
/*38*/ { "NextNode", kNextNode, "n" },
/*39*/ { "PrevNode", kPrevNode, "n" },
/*3a*/ { "NodeValue", kNodeValue, "Zn" },
/*3b*/ { "AddAfter", kAddAfter, "lnn" },
/*3c*/ { "AddToFront", kAddToFront, "ln" },
/*3d*/ { "AddToEnd", kAddToEnd, "ln" },
/*3e*/ { "FindKey", kFindKey, "l." },
/*3f*/ { "DeleteKey", kDeleteKey, "l." },
/*40*/ { "Random", kRandom, "i*" },
/*41*/ { "Abs", kAbs, "Oi" },
/*42*/ { "Sqrt", kSqrt, "i" },
/*43*/ { "GetAngle", kGetAngle, "iiiii*" }, // occasionally KQ6 passes a 5th argument by mistake
/*44*/ { "GetDistance", kGetDistance, "iiiii*" },
/*45*/ { "Wait", kWait, "i" },
/*46*/ { "GetTime", kGetTime, "i*" },
/*47*/ { "StrEnd", kStrEnd, "r" },
/*48*/ { "StrCat", kStrCat, "rr" },
/*49*/ { "StrCmp", kStrCmp, "rri*" },
/*4a*/ { "StrLen", kStrLen, "Zr" },
/*4b*/ { "StrCpy", kStrCpy, "rZri*" },
/*4c*/ { "Format", kFormat, "r.*" },
/*4d*/ { "GetFarText", kGetFarText, "iiZr" },
/*4e*/ { "ReadNumber", kReadNumber, "r" },
/*4f*/ { "BaseSetter", kBaseSetter, "o" },
/*50*/ { "DirLoop", kDirLoop, "oi" },
// Opcode 51 is defined twice for a reason: In older SCI versions
// it is CanBeHere, whereas in newer version it is CantBeHere
/*51*/ { "CanBeHere", kCanBeHere, "ol*" },
/*51*/ { "CantBeHere", kCantBeHere, "ol*" },
/*52*/ { "OnControl", kOnControl, "i*" },
/*53*/ { "InitBresen", kInitBresen, "oi*" },
/*54*/ { "DoBresen", kDoBresen, "o" },
/*55*/ { "DoAvoider", kDoAvoider, "o" },
/*56*/ { "SetJump", kSetJump, "oiii" },
/*57*/ { "SetDebug", kSetDebug, "i*" },
/*5c*/ { "MemoryInfo", kMemoryInfo, "i" },
/*5f*/ { "GetMenu", kGetMenu, "i." },
/*60*/ { "SetMenu", kSetMenu, "i.*" },
/*61*/ { "GetSaveFiles", kGetSaveFiles, "rrr" },
/*62*/ { "GetCWD", kGetCWD, "r" },
/*63*/ { "CheckFreeSpace", kCheckFreeSpace, "r.*" },
/*64*/ { "ValidPath", kValidPath, "r" },
/*65*/ { "CoordPri", kCoordPri, "ii*" },
/*66*/ { "StrAt", kStrAt, "rii*" },
/*67*/ { "DeviceInfo", kDeviceInfo, "i.*" },
/*68*/ { "GetSaveDir", kGetSaveDir, ".*" }, // accepts a parameter in SCI2+ games
/*69*/ { "CheckSaveGame", kCheckSaveGame, ".*" },
/*6a*/ { "ShakeScreen", kShakeScreen, "ii*" },
/*6b*/ { "FlushResources", kFlushResources, "i" },
/*6c*/ { "TimesSin", kTimesSin, "ii" },
/*6d*/ { "TimesCos", kTimesCos, "ii" },
/*6e*/ { "6e", kTimesSin, "ii" },
/*6f*/ { "6f", kTimesCos, "ii" },
/*70*/ { "Graph", kGraph, ".*" },
/*71*/ { "Joystick", kJoystick, ".*" },
#define SIGFOR_ALL 0x4f
#define SIGFOR_PC 1 << 0
#define SIGFOR_PC98 1 << 1
#define SIGFOR_WIN 1 << 2
#define SIGFOR_MAC 1 << 3
#define SIGFOR_AMIGA 1 << 4
#define SIGFOR_ATARI 1 << 5
// Experimental functions
/*74*/ { "FileIO", kFileIO, "i.*" },
/*(?)*/ { "Memory", kMemory, "i.*" },
/*(?)*/ { "Sort", kSort, "ooo" },
/*(?)*/ { "AvoidPath", kAvoidPath, "ii.*" },
/*(?)*/ { "Lock", kLock, "iii*" },
/*(?)*/ { "Palette", kPalette, "i.*" },
/*(?)*/ { "IsItSkip", kIsItSkip, "iiiii" },
/*7b*/ { "StrSplit", kStrSplit, "rrZr" },
#define SIG_EVERYWHERE SIG_SCI32, SIGFOR_ALL
// Non-experimental functions without a fixed ID
{ "CosMult", kTimesCos, "ii" },
{ "SinMult", kTimesSin, "ii" },
#define MAP_CALL(_name_) #_name_, k##_name_
// Misc functions
/*(?)*/ { "CosDiv", kCosDiv, "ii" },
/*(?)*/ { "PriCoord", kPriCoord, "i" },
/*(?)*/ { "SinDiv", kSinDiv, "ii" },
/*(?)*/ { "TimesCot", kTimesCot, "ii" },
/*(?)*/ { "TimesTan", kTimesTan, "ii" },
{ "Message", kMessage, ".*" },
{ "GetMessage", kGetMessage, "iiir" },
{ "DoAudio", kDoAudio, ".*" },
{ "DoSync", kDoSync, ".*" },
{ "MemorySegment", kMemorySegment, "iri*" },
{ "Intersections", kIntersections, "iiiiriiiri" },
{ "MergePoly", kMergePoly, "rli" },
{ "ResCheck", kResCheck, "iii*" },
{ "SetQuitStr", kSetQuitStr, "r" },
{ "ShowMovie", kShowMovie, ".*" },
{ "SetVideoMode", kSetVideoMode, "i" },
{ "Platform", kPlatform, ".*" },
{ "TextColors", kTextColors, ".*" },
{ "TextFonts", kTextFonts, ".*" },
{ "Portrait", kPortrait, ".*" },
{ "PalVary", kPalVary, "ii*" },
{ "AssertPalette", kAssertPalette, "i" },
{ "Empty", kEmpty, ".*" },
// name, version, platf., function, signature, subfunction-signatures
static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL },
{ MAP_CALL(UnLoad), SIG_EVERYWHERE, "i.*", NULL },
// ^^ FIXME - Work around SQ1 bug, when exiting the Ulence flats bar
{ MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL },
{ MAP_CALL(DisposeScript), SIG_EVERYWHERE, "Oii*", NULL },
// ^^ FIXME - Work around QfG1 bug
{ MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL },
{ MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL },
{ MAP_CALL(DrawPic), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(PicNotValid), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(Animate), SIG_EVERYWHERE, "LI*", NULL },
// ^^ FIXME - More like (li?)?
{ MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "oi*", NULL },
// ^^ FIXME - The second parameter is ignored
{ MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(CelWide), SIG_EVERYWHERE, "iOi*", NULL },
{ MAP_CALL(CelHigh), SIG_EVERYWHERE, "iOi*", NULL },
{ MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*r*", NULL },
{ MAP_CALL(AddToPic), SIG_EVERYWHERE, "Il*", NULL },
{ MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, "*.", NULL },
{ MAP_CALL(NewWindow), SIG_EVERYWHERE, "iiiiZRi*", NULL },
{ MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(SetPort), SIG_EVERYWHERE, "ii*", NULL },
{ MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "ii*", NULL },
{ MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(EditControl), SIG_EVERYWHERE, "ZoZo", NULL },
{ MAP_CALL(TextSize), SIG_EVERYWHERE, "rZrii*r*", NULL },
{ MAP_CALL(Display), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(GetEvent), SIG_EVERYWHERE, "ioi*", NULL },
// ^^ FIXME Mac versions pass an extra 3rd parameter (ignored - always 0?)
{ MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "oo*", NULL },
{ MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "oo*", NULL },
{ MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(MenuSelect), SIG_EVERYWHERE, "oi*", NULL },
{ MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL },
{ MAP_CALL(DrawStatus), SIG_EVERYWHERE, "Zri*", NULL },
{ MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL },
{ MAP_CALL(Said), SIG_EVERYWHERE, "Zr", NULL },
{ MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(SetCursor), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL },
{ MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL },
{ MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL },
{ MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(SaveGame), SIG_EVERYWHERE, "rirr*", NULL },
{ MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir*", NULL },
{ MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(DoSound), SIG_EVERYWHERE, "iIo*", NULL },
{ MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL },
{ MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL },
{ MAP_CALL(FirstNode), SIG_EVERYWHERE, "Zl", NULL },
{ MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL },
{ MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL },
{ MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL },
{ MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL },
{ MAP_CALL(NodeValue), SIG_EVERYWHERE, "Zn", NULL },
{ MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL },
{ MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL },
{ MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL },
{ MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL },
{ MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL },
{ MAP_CALL(Random), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(Abs), SIG_EVERYWHERE, "Oi", NULL },
{ MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiiii*", NULL },
// ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake
{ MAP_CALL(GetDistance), SIG_EVERYWHERE, "iiiii*", NULL },
{ MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(GetTime), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL },
{ MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL },
{ MAP_CALL(StrCmp), SIG_EVERYWHERE, "rri*", NULL },
{ MAP_CALL(StrLen), SIG_EVERYWHERE, "Zr", NULL },
{ MAP_CALL(StrCpy), SIG_EVERYWHERE, "rZri*", NULL },
{ MAP_CALL(Format), SIG_EVERYWHERE, "r.*", NULL },
{ MAP_CALL(GetFarText), SIG_EVERYWHERE, "iiZr", NULL },
{ MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL },
{ MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL },
{ MAP_CALL(CanBeHere), SIG_EVERYWHERE, "ol*", NULL },
{ MAP_CALL(CantBeHere), SIG_EVERYWHERE, "ol*", NULL },
{ MAP_CALL(OnControl), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(InitBresen), SIG_EVERYWHERE, "oi*", NULL },
{ MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL },
{ MAP_CALL(SetDebug), SIG_EVERYWHERE, "i*", NULL },
{ MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL },
{ MAP_CALL(SetMenu), SIG_EVERYWHERE, "i.*", NULL },
{ MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL },
{ MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL },
{ MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r.*", NULL },
{ MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL },
{ MAP_CALL(CoordPri), SIG_EVERYWHERE, "ii*", NULL },
{ MAP_CALL(StrAt), SIG_EVERYWHERE, "rii*", NULL },
{ MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i.*", NULL },
{ MAP_CALL(GetSaveDir), SIG_EVERYWHERE, ".*", NULL },
// ^^ FIXME accepts a parameter in SCI2+ games
{ MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "ii*", NULL },
{ MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(Graph), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(Joystick), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(FileIO), SIG_EVERYWHERE, "i.*", NULL },
{ MAP_CALL(Memory), SIG_EVERYWHERE, "i.*", NULL },
{ MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL },
{ MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii.*", NULL },
{ MAP_CALL(Lock), SIG_EVERYWHERE, "iii*", NULL },
{ MAP_CALL(Palette), SIG_EVERYWHERE, "i.*", NULL },
{ MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL },
{ MAP_CALL(StrSplit), SIG_EVERYWHERE, "rrZr", NULL },
{ "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL },
{ "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL },
{ MAP_CALL(Message), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL },
{ MAP_CALL(DoAudio), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(DoSync), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(MemorySegment), SIG_EVERYWHERE, "iri*", NULL },
{ MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL },
{ MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL },
{ MAP_CALL(ResCheck), SIG_EVERYWHERE, "iii*", NULL },
{ MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL },
{ MAP_CALL(ShowMovie), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(Platform), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(TextColors), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(TextFonts), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(Portrait), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(PalVary), SIG_EVERYWHERE, "ii*", NULL },
{ MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL },
{ MAP_CALL(Empty), SIG_EVERYWHERE, ".*", NULL },
#ifdef ENABLE_SCI32
// SCI2 Kernel Functions
{ "IsHiRes", kIsHiRes, "" },
{ "Array", kArray, ".*" },
{ "ListAt", kListAt, "li" },
{ "String", kString, ".*" },
{ "AddScreenItem", kAddScreenItem, "o" },
{ "UpdateScreenItem", kUpdateScreenItem, "o" },
{ "DeleteScreenItem", kDeleteScreenItem, "o" },
{ "AddPlane", kAddPlane, "o" },
{ "DeletePlane", kDeletePlane, "o" },
{ "UpdatePlane", kUpdatePlane, "o" },
{ "RepaintPlane", kRepaintPlane, "o" },
{ "GetHighPlanePri", kGetHighPlanePri, "" },
{ "FrameOut", kFrameOut, "" },
{ "ListEachElementDo", kListEachElementDo, "li.*" },
{ "ListFirstTrue", kListFirstTrue, "li.*" },
{ "ListAllTrue", kListAllTrue, "li.*" },
{ "ListIndexOf", kListIndexOf, "lZo" },
{ "OnMe", kOnMe, "iio.*" },
{ "InPolygon", kInPolygon, "iio" },
{ "CreateTextBitmap", kCreateTextBitmap, "i.*" },
// SCI2.1 Kernel Functions
{ "Save", kSave, ".*" },
{ "List", kList, ".*" },
{ "Robot", kRobot, ".*" },
{ "PlayVMD", kPlayVMD, ".*" },
{ "IsOnMe", kIsOnMe, "iio.*" },
{ "MulDiv", kMulDiv, "iii" },
{ "Text", kText, ".*" },
// SCI2 Kernel Functions
{ MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(Array), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL },
{ MAP_CALL(String), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL },
{ MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL },
{ MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li.*", NULL },
{ MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li.*", NULL },
{ MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li.*", NULL },
{ MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "lZo", NULL },
{ MAP_CALL(OnMe), SIG_EVERYWHERE, "iio.*", NULL },
{ MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL },
{ MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i.*", NULL },
// SCI2.1 Kernel Functions
{ MAP_CALL(Save), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(List), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(Robot), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(PlayVMD), SIG_EVERYWHERE, ".*", NULL },
{ MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio.*", NULL },
{ MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL },
{ MAP_CALL(Text), SIG_EVERYWHERE, ".*", NULL },
{ NULL, NULL, SIG_EVERYWHERE, NULL, NULL }
#endif
};
#if 0
// Stub functions
@ -406,9 +432,6 @@ static SciKernelFunction s_kernelFuncMap[] = {
{ "DbugStr", kDbugStr, ".*" },
#endif
{NULL, NULL, NULL} // Terminator
};
Kernel::Kernel(ResourceManager *resMan, SegManager *segMan)
: _resMan(resMan), _segMan(segMan), _invalid("<invalid>") {
loadSelectorNames();
@ -569,55 +592,83 @@ static char *compileKernelSignature(const char *s) {
void Kernel::mapFunctions() {
int mapped = 0;
int ignored = 0;
uint functions_nr = _kernelNames.size();
uint functionCount = _kernelNames.size();
byte platformMask = 0;
_kernelFuncs.resize(functions_nr);
switch (g_sci->getPlatform()) {
case Common::kPlatformPC:
platformMask = SIGFOR_PC;
break;
case Common::kPlatformPC98:
platformMask = SIGFOR_PC98;
break;
case Common::kPlatformWindows:
platformMask = SIGFOR_WIN;
break;
case Common::kPlatformMacintosh:
platformMask = SIGFOR_MAC;
break;
case Common::kPlatformAmiga:
platformMask = SIGFOR_AMIGA;
break;
case Common::kPlatformAtariST:
platformMask = SIGFOR_ATARI;
break;
default:
break;
}
for (uint functnr = 0; functnr < functions_nr; functnr++) {
int found = -1;
_kernelFuncs.resize(functionCount);
for (uint functNr = 0; functNr < functionCount; functNr++) {
// First, get the name, if known, of the kernel function with number functnr
Common::String sought_name = _kernelNames[functnr];
Common::String sought_name = _kernelNames[functNr];
// Reset the table entry
_kernelFuncs[functnr].func = NULL;
_kernelFuncs[functnr].signature = NULL;
_kernelFuncs[functnr].origName = sought_name;
_kernelFuncs[functNr].func = NULL;
_kernelFuncs[functNr].signature = NULL;
_kernelFuncs[functNr].origName = sought_name;
_kernelFuncs[functNr].isDummy = true;
if (sought_name.empty()) {
// No name was given -> must be an unknown opcode
warning("Kernel function %x unknown", functnr);
_kernelFuncs[functnr].isDummy = true;
warning("Kernel function %x unknown", functNr);
continue;
}
// Don't map dummy functions - they will never be called
if (sought_name == "Dummy") {
_kernelFuncs[functnr].isDummy = true;
if (sought_name == "Dummy")
continue;
// If the name is known, look it up in s_kernelMap. This table
// maps kernel func names to actual function (pointers).
SciKernelMapEntry *kernelMap = s_kernelMap;
bool nameMatch = false;
while (kernelMap->name) {
if (sought_name == kernelMap->name) {
if (platformMask & kernelMap->forPlatform)
break;
nameMatch = true;
}
kernelMap++;
}
// If the name is known, look it up in s_kernelFuncMap. This table
// maps kernel func names to actual function (pointers).
for (uint seeker = 0; (found == -1) && s_kernelFuncMap[seeker].name; seeker++)
if (sought_name == s_kernelFuncMap[seeker].name)
found = seeker; // Found a kernel function with the correct name!
if (found == -1) {
// No match but a name was given -> stub
warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functnr);
_kernelFuncs[functnr].isDummy = true;
} else {
// A match in s_kernelFuncMap was found
if (s_kernelFuncMap[found].func) {
_kernelFuncs[functnr].func = s_kernelFuncMap[found].func;
_kernelFuncs[functnr].signature = compileKernelSignature(s_kernelFuncMap[found].signature);
_kernelFuncs[functnr].isDummy = false;
if (kernelMap->name) {
// A match was found
if (kernelMap->function) {
_kernelFuncs[functNr].func = kernelMap->function;
_kernelFuncs[functNr].signature = compileKernelSignature(kernelMap->signature);
_kernelFuncs[functNr].isDummy = false;
++mapped;
} else {
//warning("Ignoring function %s\n", s_kernelFuncMap[found].name);
++ignored;
}
} else {
if (nameMatch)
error("kernel function %s[%x] not found for this version/platform", sought_name.c_str(), functNr);
// No match but a name was given -> stub
warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functNr);
}
} // for all functions requesting to be mapped