aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
Diffstat (limited to 'scumm')
-rw-r--r--scumm/intern.h11
-rw-r--r--scumm/script_v100he.cpp6
-rw-r--r--scumm/script_v5.cpp6
-rw-r--r--scumm/script_v6.cpp6
-rw-r--r--scumm/script_v6he.cpp2
-rw-r--r--scumm/script_v72he.cpp38
-rw-r--r--scumm/script_v7he.cpp54
-rw-r--r--scumm/script_v8.cpp6
-rw-r--r--scumm/script_v80he.cpp2
-rw-r--r--scumm/script_v90he.cpp2
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),