aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2002-12-25 14:46:39 +0000
committerMax Horn2002-12-25 14:46:39 +0000
commit004ea9f8eb7aa3cd79540c72b75986a9fa182cf6 (patch)
tree136ede26c4d6b73c99b3b102b18d548b1aae9ab3
parenta01b169434b87aacb67fd1939545f3b3120ae235 (diff)
downloadscummvm-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.h4
-rw-r--r--scumm/module.mk4
-rw-r--r--scumm/script.cpp43
-rw-r--r--scumm/script_v5.cpp20
-rw-r--r--scumm/script_v6.cpp49
-rw-r--r--scumm/script_v8.cpp49
-rw-r--r--scumm/scumm.h13
-rw-r--r--scumm/sound.cpp2
-rw-r--r--scumm/sound.h2
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);