don't let unknown V8 codes pass by (it makes debugging pretty hard)
svn-id: r6081
This commit is contained in:
parent
4524d870f3
commit
8380596966
2 changed files with 153 additions and 114 deletions
|
@ -407,8 +407,6 @@ protected:
|
||||||
void decodeParseString(int m, int n);
|
void decodeParseString(int m, int n);
|
||||||
|
|
||||||
/* Version 8 script opcodes */
|
/* Version 8 script opcodes */
|
||||||
void o8_unknown();
|
|
||||||
|
|
||||||
void o8_mod();
|
void o8_mod();
|
||||||
void o8_wait();
|
void o8_wait();
|
||||||
|
|
||||||
|
@ -427,8 +425,10 @@ protected:
|
||||||
void o8_cameraOps();
|
void o8_cameraOps();
|
||||||
void o8_verbOps();
|
void o8_verbOps();
|
||||||
|
|
||||||
|
void o8_soundKludge();
|
||||||
void o8_system();
|
void o8_system();
|
||||||
void o8_kludge();
|
void o8_kludge();
|
||||||
|
void o8_kludge2();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ void Scumm_v8::setupOpcodes()
|
||||||
// TODO: any of the o6_ entries are potentially wrong and pure guesses :-)
|
// TODO: any of the o6_ entries are potentially wrong and pure guesses :-)
|
||||||
static const OpcodeEntryV8 opcodes[256] = {
|
static const OpcodeEntryV8 opcodes[256] = {
|
||||||
/* 00 */
|
/* 00 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o6_pushWord),
|
OPCODE(o6_pushWord),
|
||||||
OPCODE(o6_pushWordVar),
|
OPCODE(o6_pushWordVar),
|
||||||
OPCODE(o6_wordArrayRead),
|
OPCODE(o6_wordArrayRead),
|
||||||
|
@ -168,12 +168,12 @@ void Scumm_v8::setupOpcodes()
|
||||||
OPCODE(o6_jump),
|
OPCODE(o6_jump),
|
||||||
OPCODE(o6_breakHere),
|
OPCODE(o6_breakHere),
|
||||||
/* 68 */
|
/* 68 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_wait),
|
OPCODE(o8_wait),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_delay), // FIXME - is the delay period right?
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_delayLonger), // FIXME - is the delay period right?
|
||||||
/* 6C */
|
/* 6C */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_delayVeryLong), // FIXME - is the delay period right?
|
||||||
OPCODE(o6_writeWordVar),
|
OPCODE(o6_writeWordVar),
|
||||||
OPCODE(o6_wordVarInc),
|
OPCODE(o6_wordVarInc),
|
||||||
OPCODE(o6_wordVarDec),
|
OPCODE(o6_wordVarDec),
|
||||||
|
@ -186,52 +186,52 @@ void Scumm_v8::setupOpcodes()
|
||||||
OPCODE(o8_dim2),
|
OPCODE(o8_dim2),
|
||||||
OPCODE(o6_wordArrayIndexedWrite),
|
OPCODE(o6_wordArrayIndexedWrite),
|
||||||
OPCODE(o8_arrayOps),
|
OPCODE(o8_arrayOps),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 78 */
|
/* 78 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o6_startScript),
|
OPCODE(o6_startScript),
|
||||||
OPCODE(o6_startScriptQuick),
|
OPCODE(o6_startScriptQuick),
|
||||||
OPCODE(o6_stopObjectCode),
|
OPCODE(o6_stopObjectCode),
|
||||||
/* 7C */
|
/* 7C */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_stopScript),
|
||||||
OPCODE(o6_jumpToScript), // FIXME - is this right? "O_CHAIN_SCRIPT"
|
OPCODE(o6_jumpToScript), // FIXME - is this right? "O_CHAIN_SCRIPT"
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_startObject),
|
||||||
/* 80 */
|
/* 80 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_stopObjectScript), // FIXME - is this right?
|
||||||
OPCODE(o6_cutscene),
|
OPCODE(o6_cutscene),
|
||||||
OPCODE(o6_endCutscene),
|
OPCODE(o6_endCutscene),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 84 */
|
/* 84 */
|
||||||
OPCODE(o6_beginOverride),
|
OPCODE(o6_beginOverride),
|
||||||
OPCODE(o6_endOverride),
|
OPCODE(o6_endOverride),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 88 */
|
/* 88 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o6_setClass),
|
OPCODE(o6_setClass),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 8C */
|
/* 8C */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 90 */
|
/* 90 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_printLine),
|
OPCODE(o8_printLine),
|
||||||
/* 94 */
|
/* 94 */
|
||||||
OPCODE(o8_printCursor),
|
OPCODE(o8_printCursor),
|
||||||
OPCODE(o8_printDebug),
|
OPCODE(o8_printDebug),
|
||||||
OPCODE(o8_printSystem),
|
OPCODE(o8_printSystem),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 98 */
|
/* 98 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* 9C */
|
/* 9C */
|
||||||
OPCODE(o8_cursorCommand),
|
OPCODE(o8_cursorCommand),
|
||||||
OPCODE(o6_loadRoom),
|
OPCODE(o6_loadRoom),
|
||||||
|
@ -246,117 +246,117 @@ void Scumm_v8::setupOpcodes()
|
||||||
OPCODE(o6_animateActor),
|
OPCODE(o6_animateActor),
|
||||||
OPCODE(o6_doSentence),
|
OPCODE(o6_doSentence),
|
||||||
OPCODE(o6_pickupObject),
|
OPCODE(o6_pickupObject),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* A8 */
|
/* A8 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_resourceRoutines),
|
OPCODE(o8_resourceRoutines),
|
||||||
OPCODE(o8_roomOps),
|
OPCODE(o8_roomOps),
|
||||||
/* AC */
|
/* AC */
|
||||||
OPCODE(o8_actorOps),
|
OPCODE(o8_actorOps),
|
||||||
OPCODE(o8_cameraOps),
|
OPCODE(o8_cameraOps),
|
||||||
OPCODE(o8_verbOps),
|
OPCODE(o8_verbOps),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* B0 */
|
/* B0 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o8_soundKludge),
|
||||||
OPCODE(o8_system),
|
OPCODE(o8_system),
|
||||||
/* B4 */
|
/* B4 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* B8 */
|
/* B8 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_kludge),
|
OPCODE(o8_kludge),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* BC */
|
/* BC */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* C0 */
|
/* C0 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* C4 */
|
/* C4 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* C8 */
|
/* C8 */
|
||||||
OPCODE(o6_startScript),
|
OPCODE(o6_startScript),
|
||||||
OPCODE(o6_startObject),
|
OPCODE(o6_startObject),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* CC */
|
/* CC */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o6_isAnyOf),
|
OPCODE(o6_isAnyOf),
|
||||||
OPCODE(o6_getRandomNumber),
|
OPCODE(o6_getRandomNumber),
|
||||||
OPCODE(o6_getRandomNumberRange),
|
OPCODE(o6_getRandomNumberRange),
|
||||||
/* D0 */
|
/* D0 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_ifClassOfIs), // FIXME - this is a guess
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_getState),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_getOwner),
|
||||||
OPCODE(o6_isScriptRunning),
|
OPCODE(o6_isScriptRunning),
|
||||||
/* D4 */
|
/* D4 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o6_isSoundRunning),
|
OPCODE(o6_isSoundRunning),
|
||||||
OPCODE(o6_abs),
|
OPCODE(o6_abs),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* D8 */
|
/* D8 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o8_kludge2),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_getActorFromXY),
|
||||||
/* DC */
|
/* DC */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_findObject),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* E0 */
|
/* E0 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* E4 */
|
/* E4 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* E8 */
|
/* E8 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* EC */
|
/* EC */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* F0 */
|
/* F0 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* F4 */
|
/* F4 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* F8 */
|
/* F8 */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
/* FC */
|
/* FC */
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
OPCODE(o8_unknown),
|
OPCODE(o6_invalid),
|
||||||
};
|
};
|
||||||
|
|
||||||
_opcodesV8 = opcodes;
|
_opcodesV8 = opcodes;
|
||||||
|
@ -521,11 +521,6 @@ void Scumm_v8::decodeParseString(int m, int n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm_v8::o8_unknown()
|
|
||||||
{
|
|
||||||
warning("Unknown opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Scumm_v8::o8_mod()
|
void Scumm_v8::o8_mod()
|
||||||
{
|
{
|
||||||
int a = pop();
|
int a = pop();
|
||||||
|
@ -596,6 +591,8 @@ void Scumm_v8::o8_arrayOps()
|
||||||
{
|
{
|
||||||
byte subOp = fetchScriptByte();
|
byte subOp = fetchScriptByte();
|
||||||
int array = fetchScriptWord();
|
int array = fetchScriptWord();
|
||||||
|
int b, c, d, len;
|
||||||
|
int16 list[128];
|
||||||
|
|
||||||
switch (subOp) {
|
switch (subOp) {
|
||||||
case 0x14: // SO_ASSIGN_STRING
|
case 0x14: // SO_ASSIGN_STRING
|
||||||
|
@ -603,7 +600,7 @@ void Scumm_v8::o8_arrayOps()
|
||||||
int idx = pop();
|
int idx = pop();
|
||||||
ArrayHeader *ah;
|
ArrayHeader *ah;
|
||||||
int r;
|
int r;
|
||||||
int len = getStringLen(NULL);
|
len = getStringLen(NULL);
|
||||||
|
|
||||||
r = defineArray(array, 4, 0, len);
|
r = defineArray(array, 4, 0, len);
|
||||||
ah = (ArrayHeader *)getResourceAddress(rtString, r);
|
ah = (ArrayHeader *)getResourceAddress(rtString, r);
|
||||||
|
@ -611,9 +608,29 @@ void Scumm_v8::o8_arrayOps()
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x15: // SO_ASSIGN_SCUMMVAR_LIST
|
case 0x15: // SO_ASSIGN_SCUMMVAR_LIST
|
||||||
// TODO
|
// TODO / FIXME: is this right?
|
||||||
|
b = pop();
|
||||||
|
c = pop();
|
||||||
|
d = readVar(array);
|
||||||
|
if (d == 0) {
|
||||||
|
defineArray(array, 5, 0, b + c);
|
||||||
|
}
|
||||||
|
while (c--) {
|
||||||
|
writeArray(array, 0, b + c, pop());
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 0x16: // SO_ASSIGN_2DIM_LIST
|
case 0x16: // SO_ASSIGN_2DIM_LIST
|
||||||
// TODO
|
// TODO / FIXME: is this right?
|
||||||
|
b = pop();
|
||||||
|
len = getStackList(list, sizeof(list) / sizeof(list[0]));
|
||||||
|
d = readVar(array);
|
||||||
|
if (d == 0)
|
||||||
|
error("Must DIM a two dimensional array before assigning");
|
||||||
|
c = pop();
|
||||||
|
while (--len >= 0) {
|
||||||
|
writeArray(array, c, b + len, list[len]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error("o8_arrayOps: default case %d (array %d)", subOp, array);
|
error("o8_arrayOps: default case %d (array %d)", subOp, array);
|
||||||
}
|
}
|
||||||
|
@ -937,6 +954,12 @@ void Scumm_v8::o8_verbOps()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scumm_v8::o8_soundKludge()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
int16 args[30];
|
||||||
|
getStackList(args, sizeof(args) / sizeof(args[0]));
|
||||||
|
}
|
||||||
|
|
||||||
void Scumm_v8::o8_system()
|
void Scumm_v8::o8_system()
|
||||||
{
|
{
|
||||||
|
@ -960,6 +983,22 @@ void Scumm_v8::o8_kludge()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scumm_v8::o8_kludge2()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
int16 args[30];
|
||||||
|
getStackList(args, sizeof(args) / sizeof(args[0]));
|
||||||
|
|
||||||
|
switch (args[0]) {
|
||||||
|
case 0xE0:
|
||||||
|
// TODO - ReadRegistryValue
|
||||||
|
push(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
warning("o8_kludge2: default case %d", args[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
From http://scummrev.mixnmojo.com/specs/CMIOpcodes.shtml
|
From http://scummrev.mixnmojo.com/specs/CMIOpcodes.shtml
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue