diff options
-rw-r--r-- | scumm/intern.h | 11 | ||||
-rw-r--r-- | scumm/script_v100he.cpp | 6 | ||||
-rw-r--r-- | scumm/script_v5.cpp | 6 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 6 | ||||
-rw-r--r-- | scumm/script_v6he.cpp | 2 | ||||
-rw-r--r-- | scumm/script_v72he.cpp | 38 | ||||
-rw-r--r-- | scumm/script_v7he.cpp | 54 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 6 | ||||
-rw-r--r-- | scumm/script_v80he.cpp | 2 | ||||
-rw-r--r-- | scumm/script_v90he.cpp | 2 |
10 files changed, 90 insertions, 43 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index cb57a157ee..a52d5ec57c 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -161,7 +161,7 @@ protected: void o5_putActor(); void o5_putActorAtObject(); void o5_putActorInRoom(); - void o5_quitPauseRestart(); + void o5_systemOps(); void o5_resourceRoutines(); void o5_roomOps(); void o5_saveLoadGame(); @@ -671,7 +671,7 @@ protected: void o6_getActorAnimCounter1(); void o6_soundKludge(); void o6_isAnyOf(); - void o6_quitPauseRestart(); + void o6_systemOps(); void o6_isActorInBox(); void o6_delay(); void o6_delaySeconds(); @@ -839,7 +839,7 @@ protected: void o70_pickupObject(); void o70_getActorRoom(); void o70_resourceRoutines(); - void o70_quitPauseRestart(); + void o70_systemOps(); void o70_kernelSetFunctions(); void o70_seekFilePos(); void o70_copyString(); @@ -978,6 +978,7 @@ protected: void o72_verbOps(); void o72_findObject(); void o72_arrayOps(); + void o72_systemOps(); void o72_talkActor(); void o72_talkEgo(); void o72_dimArray(); @@ -1249,7 +1250,7 @@ protected: void o100_startSound(); void o100_setSpriteInfo(); void o100_startScript(); - void o100_quitPauseRestart(); + void o100_systemOps(); void o100_cursorCommand(); void o100_wait(); void o100_writeFile(); @@ -1363,7 +1364,7 @@ protected: void o8_cameraOps(); void o8_verbOps(); - void o8_system(); + void o8_systemOps(); void o8_startVideo(); void o8_kernelSetFunctions(); void o8_kernelGetFunctions(); diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp index 284818efb9..5f78d0d9e9 100644 --- a/scumm/script_v100he.cpp +++ b/scumm/script_v100he.cpp @@ -212,7 +212,7 @@ void ScummEngine_v100he::setupOpcodes() { OPCODE(o6_wordArrayIndexedWrite), OPCODE(o6_sub), /* 88 */ - OPCODE(o100_quitPauseRestart), + OPCODE(o100_systemOps), OPCODE(o6_invalid), OPCODE(o72_setTimer), OPCODE(o100_cursorCommand), @@ -2052,7 +2052,7 @@ void ScummEngine_v100he::o100_startScript() { runScript(script, (flags == 128 || flags == 129), (flags == 130 || flags == 129), args); } -void ScummEngine_v100he::o100_quitPauseRestart() { +void ScummEngine_v100he::o100_systemOps() { byte subOp = fetchScriptByte(); subOp -= 61; @@ -2072,7 +2072,7 @@ void ScummEngine_v100he::o100_quitPauseRestart() { // Update palette break; default: - error("o100_quitPauseRestart invalid case %d", subOp); + error("o100_systemOps invalid case %d", subOp); } } diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index b868cf2420..06c67ebfc0 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -229,7 +229,7 @@ void ScummEngine_v5::setupOpcodes() { OPCODE(o5_getRandomNr), OPCODE(o5_and), /* 98 */ - OPCODE(o5_quitPauseRestart), + OPCODE(o5_systemOps), OPCODE(o5_doSentence), OPCODE(o5_move), OPCODE(o5_multiply), @@ -1673,7 +1673,7 @@ void ScummEngine_v5::o5_putActorInRoom() { a->putActor(0, 0, 0); } -void ScummEngine_v5::o5_quitPauseRestart() { +void ScummEngine_v5::o5_systemOps() { byte subOp = fetchScriptByte(); switch (subOp) { case 1: // SO_RESTART @@ -1686,7 +1686,7 @@ void ScummEngine_v5::o5_quitPauseRestart() { shutDown(); break; default: - error("o5_quitPauseRestart: unknown subopcode %d", subOp); + error("o5_systemOps: unknown subopcode %d", subOp); } } diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index 6e7fe6bd31..47dc0974fb 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -266,7 +266,7 @@ void ScummEngine_v6::setupOpcodes() { /* AC */ OPCODE(o6_soundKludge), OPCODE(o6_isAnyOf), - OPCODE(o6_quitPauseRestart), + OPCODE(o6_systemOps), OPCODE(o6_isActorInBox), /* B0 */ OPCODE(o6_delay), @@ -2266,7 +2266,7 @@ void ScummEngine_v6::o6_isAnyOf() { push(0); } -void ScummEngine_v6::o6_quitPauseRestart() { +void ScummEngine_v6::o6_systemOps() { byte subOp = fetchScriptByte(); switch (subOp) { case 158: // SO_RESTART @@ -2279,7 +2279,7 @@ void ScummEngine_v6::o6_quitPauseRestart() { shutDown(); break; default: - error("o6_quitPauseRestart invalid case %d", subOp); + error("o6_systemOps invalid case %d", subOp); } } diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index 414fa4e402..a444a6397c 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -285,7 +285,7 @@ void ScummEngine_v60he::setupOpcodes() { /* AC */ OPCODE(o6_invalid), OPCODE(o6_isAnyOf), - OPCODE(o6_quitPauseRestart), + OPCODE(o6_systemOps), OPCODE(o6_isActorInBox), /* B0 */ OPCODE(o6_delay), diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp index d4929821c2..1ab4f0620c 100644 --- a/scumm/script_v72he.cpp +++ b/scumm/script_v72he.cpp @@ -261,7 +261,7 @@ void ScummEngine_v72he::setupOpcodes() { /* AC */ OPCODE(o6_invalid), OPCODE(o6_isAnyOf), - OPCODE(o70_quitPauseRestart), + OPCODE(o72_systemOps), OPCODE(o6_isActorInBox), /* B0 */ OPCODE(o6_delay), @@ -1563,6 +1563,42 @@ void ScummEngine_v72he::o72_arrayOps() { } } +void ScummEngine_v72he::o72_systemOps() { + byte string[1024]; + + byte subOp = fetchScriptByte(); + + switch (subOp) { + case 22: // HE80+ + clearDrawObjectQueue(); + break; + case 26: // HE80+ + gdi.copyVirtScreenBuffers(Common::Rect(_screenWidth, _screenHeight)); + updatePalette(); + break; + case 158: + restart(); + break; + case 160: + // Confirm shutdown + shutDown(); + break; + case 244: + shutDown(); + break; + case 251: + copyScriptString(string, sizeof(string)); + debug(0, "Start executable (%s)", string); + break; + case 252: + copyScriptString(string, sizeof(string)); + debug(0, "Start game (%s)", string); + break; + default: + error("o72_systemOps invalid case %d", subOp); + } +} + void ScummEngine_v72he::o72_talkActor() { Actor *a; diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index ca883aa06e..7bd2a66d77 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -259,7 +259,7 @@ void ScummEngine_v70he::setupOpcodes() { /* AC */ OPCODE(o6_invalid), OPCODE(o6_isAnyOf), - OPCODE(o70_quitPauseRestart), + OPCODE(o70_systemOps), OPCODE(o6_isActorInBox), /* B0 */ OPCODE(o6_delay), @@ -666,41 +666,51 @@ void ScummEngine_v70he::o70_resourceRoutines() { } } -void ScummEngine_v70he::o70_quitPauseRestart() { +void ScummEngine_v70he::o70_systemOps() { + byte *src, string[256]; + int id, len; + byte subOp = fetchScriptByte(); - int par1; switch (subOp) { - case 22: // HE80+ - clearDrawObjectQueue(); - break; - case 26: // HE80+ - // Clear screen - // Update palette - break; - case 158: // SO_RESTART + case 158: restart(); break; case 160: - // FIXME: check + // Confirm shutdown shutDown(); break; - case 250: - par1 = pop(); - warning("stub: o70_quitPauseRestart subOpcode %d", subOp); - break; - case 253: - par1 = pop(); - warning("stub: o70_quitPauseRestart subOpcode %d", subOp); - case 244: // SO_QUIT + case 244: shutDown(); break; + case 250: + id = pop(); + src = getStringAddress(id); + len = resStrLen(src) + 1; + memcpy(string, src, len); + debug(0, "Start executable (%s)", string); + break; case 251: + convertMessageToString(_scriptPointer, string, sizeof(string)); + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + debug(0, "Start executable (%s)", string); + break; case 252: - warning("stub: o70_quitPauseRestart subOpcode %d", subOp); + convertMessageToString(_scriptPointer, string, sizeof(string)); + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + debug(0, "Start game (%s)", string); + break; + case 253: + id = pop(); + src = getStringAddress(id); + len = resStrLen(src) + 1; + memcpy(string, src, len); + debug(0, "Start game (%s)", string); break; default: - warning("o70_quitPauseRestart invalid case %d", subOp); + error("o70_systemOps invalid case %d", subOp); } } diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 3b7755b82b..1381c66f13 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -265,7 +265,7 @@ void ScummEngine_v8::setupOpcodes() { OPCODE(o6_startMusic), OPCODE(o6_stopSound), OPCODE(o6_soundKludge), - OPCODE(o8_system), + OPCODE(o8_systemOps), /* B4 */ OPCODE(o6_saveRestoreVerbs), OPCODE(o6_setObjectName), @@ -1177,7 +1177,7 @@ void ScummEngine_v8::o8_verbOps() { } } -void ScummEngine_v8::o8_system() { +void ScummEngine_v8::o8_systemOps() { byte subOp = fetchScriptByte(); switch (subOp) { case 0x28: // SO_SYSTEM_RESTART Restart game @@ -1187,7 +1187,7 @@ void ScummEngine_v8::o8_system() { shutDown(); break; default: - error("o8_system: invalid case 0x%x", subOp); + error("o8_systemOps: invalid case 0x%x", subOp); } } diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp index d16ff17b23..d86235c079 100644 --- a/scumm/script_v80he.cpp +++ b/scumm/script_v80he.cpp @@ -261,7 +261,7 @@ void ScummEngine_v80he::setupOpcodes() { /* AC */ OPCODE(o80_drawWizPolygon), OPCODE(o6_isAnyOf), - OPCODE(o70_quitPauseRestart), + OPCODE(o72_systemOps), OPCODE(o6_isActorInBox), /* B0 */ OPCODE(o6_delay), diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp index 5c8dd8fe78..e6b288fc67 100644 --- a/scumm/script_v90he.cpp +++ b/scumm/script_v90he.cpp @@ -260,7 +260,7 @@ void ScummEngine_v90he::setupOpcodes() { /* AC */ OPCODE(o80_drawWizPolygon), OPCODE(o6_isAnyOf), - OPCODE(o70_quitPauseRestart), + OPCODE(o72_systemOps), OPCODE(o6_isActorInBox), /* B0 */ OPCODE(o6_delay), |