diff options
author | Max Horn | 2002-12-25 14:46:39 +0000 |
---|---|---|
committer | Max Horn | 2002-12-25 14:46:39 +0000 |
commit | 004ea9f8eb7aa3cd79540c72b75986a9fa182cf6 (patch) | |
tree | 136ede26c4d6b73c99b3b102b18d548b1aae9ab3 | |
parent | a01b169434b87aacb67fd1939545f3b3120ae235 (diff) | |
download | scummvm-rg350-004ea9f8eb7aa3cd79540c72b75986a9fa182cf6.tar.gz scummvm-rg350-004ea9f8eb7aa3cd79540c72b75986a9fa182cf6.tar.bz2 scummvm-rg350-004ea9f8eb7aa3cd79540c72b75986a9fa182cf6.zip |
converted heaps of int16 to int for V8 compatibility; fixed defineArray for V8; added some work in o8_kludge2
svn-id: r6132
-rw-r--r-- | scumm/intern.h | 4 | ||||
-rw-r--r-- | scumm/module.mk | 4 | ||||
-rw-r--r-- | scumm/script.cpp | 43 | ||||
-rw-r--r-- | scumm/script_v5.cpp | 20 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 49 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 49 | ||||
-rw-r--r-- | scumm/scumm.h | 13 | ||||
-rw-r--r-- | scumm/sound.cpp | 2 | ||||
-rw-r--r-- | scumm/sound.h | 2 |
9 files changed, 106 insertions, 80 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index 02da8da181..324568aea8 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -46,7 +46,7 @@ protected: virtual const char *getOpcodeDesc(int i); void decodeParseString(); - int getWordVararg(int16 *ptr); + int getWordVararg(int *ptr); int getVarOrDirectWord(byte mask); int getVarOrDirectByte(byte mask); @@ -210,7 +210,7 @@ protected: int popRoomAndObj(int *room); void decodeParseString(int a, int b); - int getStackList(int16 *args, uint maxnum); + int getStackList(int *args, uint maxnum); /* Version 6 script opcodes */ void o6_setBlastObjectWindow(); diff --git a/scumm/module.mk b/scumm/module.mk index 7d83592a81..1f74deb23a 100644 --- a/scumm/module.mk +++ b/scumm/module.mk @@ -11,6 +11,7 @@ SCUMM_OBJS = \ scumm/gfx.o \ scumm/imuse.o \ scumm/instrument.o \ + scumm/nut_renderer.o \ scumm/object.o \ scumm/resource.o \ scumm/resource_v2.o \ @@ -25,8 +26,7 @@ SCUMM_OBJS = \ scumm/sound.o \ scumm/string.o \ scumm/vars.o \ - scumm/verbs.o \ - scumm/nut_renderer.o + scumm/verbs.o SMUSH_OBJS = \ scumm/smush/blitter.o \ diff --git a/scumm/script.cpp b/scumm/script.cpp index beeeeffec0..7d036bdd7d 100644 --- a/scumm/script.cpp +++ b/scumm/script.cpp @@ -35,7 +35,7 @@ enum { /* Start executing script 'script' with parameters 'a' and 'b' */ -void Scumm::runScript(int script, int a, int b, int16 *lvarptr) +void Scumm::runScript(int script, int a, int b, int *lvarptr) { byte *scriptPtr; uint32 scriptOffs; @@ -592,7 +592,7 @@ bool Scumm::isScriptInUse(int script) void Scumm::runHook(int i) { - int16 tmp[16]; + int tmp[16]; tmp[0] = i; if (_vars[VAR_HOOK_SCRIPT]) { runScript(_vars[VAR_HOOK_SCRIPT], 0, 0, tmp); @@ -781,7 +781,7 @@ void Scumm::checkAndRunSentenceScript() void Scumm::runInputScript(int a, int cmd, int mode) { - int16 args[16]; + int args[16]; memset(args, 0, sizeof(args)); args[0] = a; args[1] = cmd; @@ -805,7 +805,7 @@ void Scumm::decreaseScriptDelay(int amount) } } -void Scumm::runVerbCode(int object, int entry, int a, int b, int16 *vars) +void Scumm::runVerbCode(int object, int entry, int a, int b, int *vars) { uint32 obcd; int slot, where, offs; @@ -843,7 +843,7 @@ void Scumm::runVerbCode(int object, int entry, int a, int b, int16 *vars) runScriptNested(slot); } -void Scumm::initializeLocals(int slot, int16 *vars) +void Scumm::initializeLocals(int slot, int *vars) { int i; if (!vars) { @@ -897,7 +897,7 @@ void Scumm::endCutscene() { ScriptSlot *ss = &vm.slot[_currentScript]; uint32 *csptr; - int16 args[16]; + int args[16]; memset(args, 0, sizeof(args)); @@ -919,7 +919,7 @@ void Scumm::endCutscene() runScript(_vars[VAR_CUTSCENE_END_SCRIPT], 0, 0, args); } -void Scumm::cutscene(int16 *args) +void Scumm::cutscene(int *args) { int scr = _currentScript; vm.slot[scr].cutsceneOverride++; @@ -1016,21 +1016,30 @@ int Scumm::defineArray(int array, int type, int dim2, int dim1) id = getArrayId(); - if (array & 0x4000) { - _arrays[id] = (char)vm.slot[_currentScript].number; - } - - if (array & 0x8000) { - error("Can't define bit variable as array pointer"); - } - - writeVar(array, id); - if (_features & GF_AFTER_V8) { + if (array & 0x40000000) { + _arrays[id] = (char)vm.slot[_currentScript].number; + } + + if (array & 0x80000000) { + error("Can't define bit variable as array pointer"); + } + size = (type == 5) ? 32 : 8; } else { + if (array & 0x4000) { + _arrays[id] = (char)vm.slot[_currentScript].number; + } + + if (array & 0x8000) { + error("Can't define bit variable as array pointer"); + } + size = (type == 5) ? 16 : 8; } + + writeVar(array, id); + size *= dim2 + 1; size *= dim1 + 1; size >>= 3; diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index 97b7fc9ac4..0b82f0dd85 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -466,7 +466,7 @@ void Scumm_v5::o5_actorSet() case 15: /* unk */ error("o5_actorset:unk not implemented"); #if 0 - int16 args[16] = + int args[16] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, @@ -583,7 +583,7 @@ void Scumm_v5::o5_breakHere() void Scumm_v5::o5_chainScript() { - int16 vars[16]; + int vars[16]; int data; int cur; @@ -603,7 +603,7 @@ void Scumm_v5::o5_chainScript() void Scumm_v5::o5_cursorCommand() { int i, j, k; - int16 table[16]; + int table[16]; switch ((_opcode = fetchScriptByte()) & 0x1F) { case 1: /* cursor show */ _cursor.state = 1; @@ -665,7 +665,7 @@ void Scumm_v5::o5_cursorCommand() void Scumm_v5::o5_cutscene() { - int16 args[16]; + int args[16]; getWordVararg(args); cutscene(args); } @@ -2030,7 +2030,7 @@ void Scumm_v5::o5_setVarRange() void Scumm_v5::o5_soundKludge() { - int16 items[15]; + int items[15]; int i; if (_features & GF_SMALL_HEADER) { // Is WaitForSentence in SCUMM V3 @@ -2048,9 +2048,9 @@ void Scumm_v5::o5_soundKludge() for (i = 0; i < 15; i++) items[i] = 0; - getWordVararg(items); + int num = getWordVararg(items); - _sound->soundKludge(items); + _sound->soundKludge(items, num); } void Scumm_v5::o5_startMusic() @@ -2061,7 +2061,7 @@ void Scumm_v5::o5_startMusic() void Scumm_v5::o5_startObject() { int obj, script; - int16 data[16]; + int data[16]; obj = getVarOrDirectWord(0x80); script = getVarOrDirectByte(0x40); @@ -2073,7 +2073,7 @@ void Scumm_v5::o5_startObject() void Scumm_v5::o5_startScript() { int op, script; - int16 data[16]; + int data[16]; int a, b; op = _opcode; @@ -2449,7 +2449,7 @@ void Scumm_v5::o5_walkActorToObject() } } -int Scumm_v5::getWordVararg(int16 *ptr) +int Scumm_v5::getWordVararg(int *ptr) { int i; diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index ae564b6919..2e4e1f3a41 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -410,7 +410,6 @@ int Scumm::readArray(int array, int idx, int base) if (ah->type == 4) { return ah->data[base]; } else if (_features & GF_AFTER_V8) { - // FIXME - this is just a guess, might be wrong return (int32)READ_LE_UINT32(ah->data + base * 4); } else { return (int16)READ_LE_UINT16(ah->data + base * 2); @@ -436,7 +435,7 @@ void Scumm::writeArray(int array, int idx, int base, int value) } } -int Scumm_v6::getStackList(int16 *args, uint maxnum) +int Scumm_v6::getStackList(int *args, uint maxnum) { uint num, i; @@ -720,7 +719,7 @@ void Scumm_v6::o6_jump() void Scumm_v6::o6_startScriptEx() { - int16 args[16]; + int args[16]; int script, flags; getStackList(args, sizeof(args) / sizeof(args[0])); @@ -731,7 +730,7 @@ void Scumm_v6::o6_startScriptEx() void Scumm_v6::o6_jumpToScript() { - int16 args[16]; + int args[16]; int script, flags; getStackList(args, sizeof(args) / sizeof(args[0])); @@ -743,7 +742,7 @@ void Scumm_v6::o6_jumpToScript() void Scumm_v6::o6_startScript() { - int16 args[16]; + int args[16]; int script; getStackList(args, sizeof(args) / sizeof(args[0])); script = pop(); @@ -752,7 +751,7 @@ void Scumm_v6::o6_startScript() void Scumm_v6::o6_startObject() { - int16 args[16]; + int args[16]; int script, entryp; int flags; getStackList(args, sizeof(args) / sizeof(args[0])); @@ -794,7 +793,7 @@ void Scumm_v6::o6_endCutscene() void Scumm_v6::o6_cutscene() { - int16 args[16]; + int args[16]; getStackList(args, sizeof(args) / sizeof(args[0])); cutscene(args); } @@ -816,7 +815,7 @@ void Scumm_v6::o6_freezeUnfreeze() void Scumm_v6::o6_cursorCommand() { int a, i; - int16 args[16]; + int args[16]; switch (fetchScriptByte()) { case 0x90: @@ -885,7 +884,7 @@ void Scumm_v6::o6_breakHere() void Scumm_v6::o6_ifClassOfIs() { - int16 args[16]; + int args[16]; int num, obj, cls; bool b; int cond = 1; @@ -904,7 +903,7 @@ void Scumm_v6::o6_ifClassOfIs() void Scumm_v6::o6_setClass() { - int16 args[16]; + int args[16]; int num, obj, cls; num = getStackList(args, sizeof(args) / sizeof(args[0])); @@ -1355,7 +1354,7 @@ void Scumm_v6::o6_isSoundRunning() void Scumm_v6::o6_setBoxFlags() { - int16 table[65]; + int table[65]; int num, value; value = pop(); @@ -1608,7 +1607,7 @@ void Scumm_v6::o6_actorOps() { Actor *a; int i, j, k; - int16 args[8]; + int args[8]; byte b; b = fetchScriptByte(); @@ -1907,7 +1906,7 @@ void Scumm_v6::o6_findObject() void Scumm_v6::o6_pseudoRoom() { - int16 list[100]; + int list[100]; int num, a, value; num = getStackList(list, sizeof(list) / sizeof(list[0])); @@ -1946,7 +1945,7 @@ void Scumm::arrayop_1(int a, byte *ptr) void Scumm_v6::o6_arrayOps() { int a, b, c, d, num; - int16 list[128]; + int list[128]; switch (fetchScriptByte()) { case 205: @@ -2140,15 +2139,15 @@ void Scumm_v6::o6_getAnimateVariable() void Scumm_v6::o6_soundKludge() { - int16 list[16]; - getStackList(list, sizeof(list) / sizeof(list[0])); + int list[16]; + int num = getStackList(list, sizeof(list) / sizeof(list[0])); - _sound->soundKludge(list); + _sound->soundKludge(list, num); } void Scumm_v6::o6_isAnyOf() { - int16 list[100]; + int list[100]; int num; int16 val; @@ -2350,7 +2349,7 @@ void Scumm_v6::o6_dummy() void Scumm_v6::o6_startObjectQuick() { - int16 args[16]; + int args[16]; int script, entryp; getStackList(args, sizeof(args) / sizeof(args[0])); entryp = pop(); @@ -2360,7 +2359,7 @@ void Scumm_v6::o6_startObjectQuick() void Scumm_v6::o6_startScriptQuick() { - int16 args[16]; + int args[16]; int script; getStackList(args, sizeof(args) / sizeof(args[0])); script = pop(); @@ -2430,7 +2429,7 @@ void Scumm_v6::o6_distPtPt() void Scumm_v6::o6_drawBlastObject() { - int16 args[16]; + int args[16]; int a, b, c, d, e; getStackList(args, sizeof(args) / sizeof(args[0])); @@ -2459,7 +2458,7 @@ void Scumm_v6::o6_setBlastObjectWindow() void Scumm_v6::o6_miscOps() { - int16 args[30]; + int args[30]; int i; Actor *a; @@ -2758,7 +2757,7 @@ void Scumm_v6::o6_miscOps() void Scumm_v6::o6_kernelFunction() { - int16 args[30]; + int args[30]; int i; Actor *a; @@ -2858,7 +2857,7 @@ void Scumm_v6::o6_delayFrames() void Scumm_v6::o6_pickOneOf() { - int16 args[100]; + int args[100]; int i, num; num = getStackList(args, sizeof(args) / sizeof(args[0])); @@ -2870,7 +2869,7 @@ void Scumm_v6::o6_pickOneOf() void Scumm_v6::o6_pickOneOfDefault() { - int16 args[100]; + int args[100]; int i, num, def; def = pop(); diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 23f3a8a5c0..9b763807a6 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -627,7 +627,7 @@ void Scumm_v8::o8_arrayOps() byte subOp = fetchScriptByte(); int array = fetchScriptWord(); int b, c, d, len; - int16 list[128]; + int list[128]; switch (subOp) { case 0x14: // SO_ASSIGN_STRING @@ -706,7 +706,7 @@ void Scumm_v8::o8_cursorCommand() // TODO byte subOp = fetchScriptByte(); int a, i; - int16 args[16]; + int args[16]; switch (subOp) { case 0xDC: // SO_CURSOR_ON Turn cursor on @@ -744,8 +744,6 @@ void Scumm_v8::o8_cursorCommand() int idx = pop(); int room, obj; obj = popRoomAndObj(&room); - // FIXME - printf("setCursorImg(%d, %d, %d)\n", obj, room, idx); setCursorImg(obj, room, idx); } break; @@ -1131,11 +1129,10 @@ void Scumm_v8::o8_verbOps() void Scumm_v8::o8_soundKludge() { - int16 args[16]; - getStackList(args, sizeof(args) / sizeof(args[0])); + int args[16]; + int num = getStackList(args, sizeof(args) / sizeof(args[0])); - // FIXME - is this right? - _sound->soundKludge(args); + _sound->soundKludge(args, num); } void Scumm_v8::o8_system() @@ -1151,8 +1148,8 @@ void Scumm_v8::o8_system() void Scumm_v8::o8_kludge() { // TODO - int16 args[30]; - getStackList(args, sizeof(args) / sizeof(args[0])); + int args[30]; + int len = getStackList(args, sizeof(args) / sizeof(args[0])); switch (args[0]) { case 11: @@ -1196,15 +1193,15 @@ void Scumm_v8::o8_kludge() case 34: case 109: default: - warning("o8_kludge: default case %d", args[0]); + warning("o8_kludge: default case (len = %d)", len); } } void Scumm_v8::o8_kludge2() { // TODO - int16 args[30]; - getStackList(args, sizeof(args) / sizeof(args[0])); + int args[30]; + int len = getStackList(args, sizeof(args) / sizeof(args[0])); switch (args[0]) { case 0xCE: // getRGBSlot @@ -1215,14 +1212,34 @@ void Scumm_v8::o8_kludge2() case 0xDA: // lipSyncWidth case 0xDB: // lipSyncHeight case 0xDC: // actorTalkAnimation + // FIXME - hack! + push(0); + break; case 0xDD: // getMasterSFXVol + push(_sound->_sound_volume_sfx / 2); + break; case 0xDE: // getMasterVoiceVol + push(_sound->_sound_volume_sfx / 2); + break; case 0xDF: // getMasterMusicVol + push(_sound->_sound_volume_music / 2); + break; case 0xE0: // readRegistryValue + { + printf("readRegistryValue(%d)\n", args[1]); + int array = args[1]; + // FIXME - hack: for some reasons the wrong variable ID arrives here, compared to the + // scripts. Probably a wrong push/pop somewhere. For now override to correct value. + array = 658; + ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, readVar(array)); + if (!strcmp((char *)ah->data, "Saveload Page")) + push(1); + else + push(0); + } + break; default: - // FIXME - hack! - push(0); -// warning("o8_kludge2: default case %d", args[0]); + error("o8_kludge2: default case (len = %d)", len); } } diff --git a/scumm/scumm.h b/scumm/scumm.h index 47113673c6..502fc26667 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -400,7 +400,8 @@ public: uint16 _mouseButStat; byte _leftBtnPressed, _rightBtnPressed; - int16 _virtual_mouse_x, _virtual_mouse_y, _bootParam; + int16 _virtual_mouse_x, _virtual_mouse_y; + int _bootParam; uint16 _debugMode, _soundCardType; /* Not sure where this stuff goes */ @@ -464,15 +465,15 @@ public: uint16 _curExecScript; byte **_lastCodePtr; int _resultVarNumber, _scummStackPos; - int16 _localParamList[16], _scummStack[150]; + int _localParamList[16], _scummStack[150]; virtual void setupOpcodes() = 0; virtual void executeOpcode(int i) = 0; virtual const char *getOpcodeDesc(int i) = 0; - void initializeLocals(int slot, int16 *vars); + void initializeLocals(int slot, int *vars); int getScriptSlot(); - void runScript(int script, int a, int b, int16 *lvarptr); + void runScript(int script, int a, int b, int *lvarptr); void stopScriptNr(int script); void runScriptNested(int script); void executeScript(); @@ -497,7 +498,7 @@ public: void freezeScripts(int scr); void unfreezeScripts(); void runAllScripts(); - void cutscene(int16 *args); + void cutscene(int *args); void endCutscene(); void exitCutscene(); void runExitScript(); @@ -648,7 +649,7 @@ public: int getVerbEntrypoint(int obj, int entry); int getVerbSlot(int id, int mode); void killVerb(int slot); - void runVerbCode(int script, int entry, int a, int b, int16 *vars); + void runVerbCode(int script, int entry, int a, int b, int *vars); void setVerbObject(uint room, uint object, uint verb); /* Should be in Actor class */ diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 3e1c24aac7..867d2095b2 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -684,7 +684,7 @@ void Sound::clearSoundQue() { memset(_soundQue2, 0, sizeof(_soundQue2)); } -void Sound::soundKludge(int16 * list) { +void Sound::soundKludge(int *list, int num) { int16 *ptr; int i; diff --git a/scumm/sound.h b/scumm/sound.h index 78182f2c2b..d388576327 100644 --- a/scumm/sound.h +++ b/scumm/sound.h @@ -148,7 +148,7 @@ public: void stopSound(int a); void stopAllSounds(); void clearSoundQue(); - void soundKludge(int16 * list); + void soundKludge(int *list, int num); void talkSound(uint32 a, uint32 b, int mode, int frame); void setupSound(); void pauseSounds(bool pause); |