aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorMax Horn2002-12-23 12:50:38 +0000
committerMax Horn2002-12-23 12:50:38 +0000
commite192142dac67b313f8dceb97417ad547e2ad68a3 (patch)
treeb22675653a5bf9be76f013020035051dc8646402 /scumm
parent034bfddd7e0da20dfe0bcc11a08af97fef9c8f7b (diff)
downloadscummvm-rg350-e192142dac67b313f8dceb97417ad547e2ad68a3.tar.gz
scummvm-rg350-e192142dac67b313f8dceb97417ad547e2ad68a3.tar.bz2
scummvm-rg350-e192142dac67b313f8dceb97417ad547e2ad68a3.zip
resolved some arguments with aquadran about how to go on about this :-). Renamed three v6 opcodes
svn-id: r6068
Diffstat (limited to 'scumm')
-rw-r--r--scumm/intern.h164
-rw-r--r--scumm/script_v6.cpp12
-rw-r--r--scumm/script_v8.cpp1358
3 files changed, 548 insertions, 986 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 3845efa993..27c0fa78f7 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -224,6 +224,7 @@ protected:
void o6_byteArrayIndexedRead();
void o6_wordArrayIndexedRead();
void o6_dup();
+ void o6_pop();
void o6_not();
void o6_eq();
void o6_neq();
@@ -237,7 +238,6 @@ protected:
void o6_div();
void o6_land();
void o6_lor();
- void o6_kill();
void o6_writeByteVar();
void o6_writeWordVar();
void o6_byteArrayWrite();
@@ -345,8 +345,8 @@ protected:
void o6_talkEgo();
void o6_dim();
void o6_dummy();
- void o6_runVerbCodeQuick();
- void o6_runScriptQuick();
+ void o6_startObjectQuick();
+ void o6_startScriptQuick();
void o6_dim2();
void o6_abs();
void o6_distObjectObject();
@@ -396,162 +396,22 @@ protected:
virtual void executeOpcode(int i);
virtual const char *getOpcodeDesc(int i);
- virtual uint32 fetchScriptUint32();
- virtual int fetchScriptInt32();
+ virtual uint fetchScriptWord();
+ virtual int fetchScriptWordSigned();
/* Version 8 script opcodes */
void o8_unknown();
void o8_invalid();
- void o8_pushNumber();
- void o8_pushVariable();
- void o8_pushArrayValue();
- void o8_pushArrayValueIndexed();
- void o8_dup();
- void o8_pop();
- void o8_not();
- void o8_eq();
- void o8_neq();
- void o8_gt();
- void o8_lt();
- void o8_leq();
- void o8_geq();
- void o8_add();
- void o8_sub();
- void o8_mul();
- void o8_div();
- void o8_land();
- void o8_lor();
- void o8_band();
- void o8_bor();
void o8_mod();
- void o8_if();
- void o8_ifNot();
- void o8_jump();
- void o8_breakHere();
- void o8_breakHereVar();
- void o8_waitForStuff();
- void o8_sleepJiffies();
- void o8_sleepSeconds();
- void o8_sleepMinutes();
- void o8_storeVariable();
- void o8_incVariable();
- void o8_decVariable();
- void o8_arrayDim();
- void o8_storeArray();
- void o8_incArray();
- void o8_decArray();
- void o8_arrayDim2();
- void o8_storeArrayIndexed();
- void o8_assignArray();
- void o8_arrayShuffle();
- void o8_arrayLocalize();
- void o8_startScript();
- void o8_startScriptQuick();
- void o8_endScript();
- void o8_stopScript();
- void o8_chainScript();
- void o8_return();
- void o8_startObject();
- void o8_stopObject();
- void o8_cutscene();
- void o8_endCutscene();
- void o8_freezeScripts();
- void o8_beginOverride();
- void o8_endOverride();
- void o8_stopSentence();
- void o8_debug();
- void o8_debugWin();
- void o8_cameraPanTo();
- void o8_cameraFollow();
- void o8_cameraAt();
- void o8_sayLine();
- void o8_sayLineDefault();
- void o8_sayLineSimple();
- void o8_sayLineSimpleDefault();
- void o8_printLine();
- void o8_printCursor();
- void o8_printDebug();
- void o8_printSystem();
- void o8_blastText();
- void o8_drawObject();
- void o8_blastObject();
- void o8_userFace();
- void o8_currentRoom();
- void o8_comeOutDoor();
- void o8_walkActorToObject();
- void o8_walkActorToXY();
- void o8_putActorAtXY();
- void o8_putActorAtObject();
- void o8_faceTowards();
- void o8_doAnimation();
- void o8_doSentence();
- void o8_pickUpObject();
- void o8_setBox();
- void o8_setBoxPath();
- void o8_setBoxSet();
- void o8_heapStuff();
- void o8_roomStuff();
- void o8_actorStuff();
+ void o8_wait();
+ void o8_cursorCommand();
+ void o8_resourceRoutines();
+ void o8_roomOps();
+ void o8_actorSet();
void o8_cameraStuff();
- void o8_verbStuff();
- void o8_startSfx();
- void o8_startMusic();
- void o8_stopSound();
- void o8_soundKludge();
- void o8_system();
- void o8_verbSets();
- void o8_newNameOf();
- void o8_getTimeDate();
- void o8_drawBox();
- void o8_actObjStamp();
- void o8_startVideo();
- void o8_kludge();
- void o8_pick();
- void o8_pickDefault();
- void o8_pickRandom();
- void o8_inSet();
- void o8_getRandomNumber();
- void o8_getRandomNumberRange();
- void o8_classOf();
- void o8_stateOf();
- void o8_ownerOf();
- void o8_scriptRunning();
- void o8_objectRunning();
- void o8_soundRunning();
- void o8_abs();
- void o8_pixel();
- void o8_inBox();
- void o8_validVerb();
- void o8_findActor();
- void o8_findObject();
- void o8_findVerb();
- void o8_findAllObjects();
- void o8_actorInvertory();
- void o8_actorInvertoryCount();
- void o8_actorVariable();
- void o8_actorRoom();
- void o8_actorBox();
- void o8_actorMoving();
- void o8_actorCostume();
- void o8_actorScale();
- void o8_actorDepth();
- void o8_actorElevation();
- void o8_actorWidth();
- void o8_actObjFacing();
- void o8_actObjX();
- void o8_actObjY();
- void o8_actorChore();
- void o8_proximity2ActObjs();
- void o8_proximity2Points();
- void o8_objectImageX();
- void o8_objectImageY();
- void o8_objectImageWidth();
- void o8_objectImageHeight();
- void o8_verbX();
- void o8_verbY();
- void o8_stringWidth();
- void o8_actorZPlane();
+ void o8_verbOps();
};
+
#endif
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp
index af7b9fc77b..20aa5b8a8c 100644
--- a/scumm/script_v6.cpp
+++ b/scumm/script_v6.cpp
@@ -74,7 +74,7 @@ void Scumm_v6::setupOpcodes()
/* 18 */
OPCODE(o6_land),
OPCODE(o6_lor),
- OPCODE(o6_kill),
+ OPCODE(o6_pop),
OPCODE(o6_invalid),
/* 1C */
OPCODE(o6_invalid),
@@ -279,8 +279,8 @@ void Scumm_v6::setupOpcodes()
/* BC */
OPCODE(o6_dim),
OPCODE(o6_dummy),
- OPCODE(o6_runVerbCodeQuick),
- OPCODE(o6_runScriptQuick),
+ OPCODE(o6_startObjectQuick),
+ OPCODE(o6_startScriptQuick),
/* C0 */
OPCODE(o6_dim2),
OPCODE(o6_invalid),
@@ -616,7 +616,7 @@ void Scumm_v6::o6_band() // Bitwise And
push(pop() | a);
}
-void Scumm_v6::o6_kill()
+void Scumm_v6::o6_pop()
{
pop();
}
@@ -2349,7 +2349,7 @@ void Scumm_v6::o6_dummy()
/* nothing */
}
-void Scumm_v6::o6_runVerbCodeQuick()
+void Scumm_v6::o6_startObjectQuick()
{
int16 args[16];
int script, entryp;
@@ -2359,7 +2359,7 @@ void Scumm_v6::o6_runVerbCodeQuick()
runVerbCode(script, entryp, 0, 1, args);
}
-void Scumm_v6::o6_runScriptQuick()
+void Scumm_v6::o6_startScriptQuick()
{
int16 args[16];
int script;
diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp
index d88a11cbe4..b6fb5dfaf8 100644
--- a/scumm/script_v8.cpp
+++ b/scumm/script_v8.cpp
@@ -33,327 +33,328 @@
void Scumm_v8::setupOpcodes()
{
+ // TODO: any of the o6_ entries are potentially wrong and pure guesses :-)
static const OpcodeEntryV8 opcodes[256] = {
/* 00 */
- OPCODE(o8_invalid),
- OPCODE(o8_pushNumber),
- OPCODE(o8_pushVariable),
- OPCODE(o8_pushArrayValue),
+ OPCODE(o8_unknown),
+ OPCODE(o6_pushWord),
+ OPCODE(o6_pushWordVar),
+ OPCODE(o6_wordArrayRead),
/* 04 */
- OPCODE(o8_pushArrayValueIndexed),
- OPCODE(o8_dup),
- OPCODE(o8_pop),
+ OPCODE(o6_wordArrayIndexedRead),
+ OPCODE(o6_dup),
+ OPCODE(o6_pop),
OPCODE(o6_not),
/* 08 */
- OPCODE(o8_eq),
- OPCODE(o8_neq),
- OPCODE(o8_gt),
- OPCODE(o8_lt),
+ OPCODE(o6_eq),
+ OPCODE(o6_neq),
+ OPCODE(o6_gt),
+ OPCODE(o6_lt),
/* 0C */
- OPCODE(o8_leq),
- OPCODE(o8_geq),
- OPCODE(o8_add),
- OPCODE(o8_sub),
+ OPCODE(o6_le),
+ OPCODE(o6_ge),
+ OPCODE(o6_add),
+ OPCODE(o6_sub),
/* 10 */
- OPCODE(o8_mul),
- OPCODE(o8_div),
- OPCODE(o8_land),
- OPCODE(o8_lor),
+ OPCODE(o6_mul),
+ OPCODE(o6_div),
+ OPCODE(o6_land),
+ OPCODE(o6_lor),
/* 14 */
- OPCODE(o8_band),
- OPCODE(o8_bor),
+ OPCODE(o6_band),
+ OPCODE(o6_bor),
OPCODE(o8_mod),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
/* 18 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 1C */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 20 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 24 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 28 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 2C */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 30 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 34 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 38 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 3C */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 40 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 44 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 48 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 4C */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 50 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 54 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 58 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 5C */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 60 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 64 */
- OPCODE(o8_if),
- OPCODE(o8_ifNot),
- OPCODE(o8_jump),
- OPCODE(o8_breakHere),
+ OPCODE(o6_jumpFalse), // Not sure about which of these two is which (false==if or true==if ?!?)...
+ OPCODE(o6_jumpTrue), // ... since "if" could mean 'jump "if"' or 'execute following code "if", otherwise jump'.
+ OPCODE(o6_jump),
+ OPCODE(o6_breakHere),
/* 68 */
- OPCODE(o8_breakHereVar),
- OPCODE(o8_waitForStuff),
- OPCODE(o8_sleepJiffies),
- OPCODE(o8_sleepSeconds),
+ OPCODE(o8_unknown),
+ OPCODE(o8_wait),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 6C */
- OPCODE(o8_sleepMinutes),
- OPCODE(o8_storeVariable),
- OPCODE(o8_incVariable),
- OPCODE(o8_decVariable),
+ OPCODE(o8_unknown),
+ OPCODE(o6_writeWordVar),
+ OPCODE(o6_wordVarInc),
+ OPCODE(o6_wordVarDec),
/* 70 */
- OPCODE(o8_arrayDim),
- OPCODE(o8_storeArray),
- OPCODE(o8_incArray),
- OPCODE(o8_decArray),
+ OPCODE(o6_dim),
+ OPCODE(o6_wordArrayWrite),
+ OPCODE(o6_wordArrayInc),
+ OPCODE(o6_wordArrayDec),
/* 74 */
- OPCODE(o8_arrayDim2),
- OPCODE(o8_storeArrayIndexed),
- OPCODE(o8_assignArray),
- OPCODE(o8_arrayShuffle),
+ OPCODE(o6_dim2),
+ OPCODE(o6_wordArrayIndexedWrite),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 78 */
- OPCODE(o8_arrayLocalize),
- OPCODE(o8_startScript),
- OPCODE(o8_startScriptQuick),
- OPCODE(o8_endScript),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 7C */
- OPCODE(o8_stopScript),
- OPCODE(o8_chainScript),
- OPCODE(o8_return),
- OPCODE(o8_startObject),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 80 */
- OPCODE(o8_stopObject),
- OPCODE(o8_cutscene),
- OPCODE(o8_endCutscene),
- OPCODE(o8_freezeScripts),
+ OPCODE(o8_unknown),
+ OPCODE(o6_cutscene),
+ OPCODE(o6_endCutscene),
+ OPCODE(o8_unknown),
/* 84 */
- OPCODE(o8_beginOverride),
- OPCODE(o8_endOverride),
- OPCODE(o8_stopSentence),
- OPCODE(o8_debug),
+ OPCODE(o6_beginOverride),
+ OPCODE(o6_endOverride),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 88 */
- OPCODE(o8_debugWin),
- OPCODE(o8_classOf),
- OPCODE(o8_stateOf),
- OPCODE(o8_ownerOf),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 8C */
- OPCODE(o8_cameraPanTo),
- OPCODE(o8_cameraFollow),
- OPCODE(o8_cameraAt),
- OPCODE(o8_sayLine),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 90 */
- OPCODE(o8_sayLineDefault),
- OPCODE(o8_sayLineSimple),
- OPCODE(o8_sayLineSimpleDefault),
- OPCODE(o8_printLine),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 94 */
- OPCODE(o8_printCursor),
- OPCODE(o8_printDebug),
- OPCODE(o8_printSystem),
- OPCODE(o8_blastText),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 98 */
- OPCODE(o8_drawObject),
- OPCODE(o8_invalid),
- OPCODE(o8_blastObject),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* 9C */
- OPCODE(o8_userFace),
- OPCODE(o8_currentRoom),
- OPCODE(o8_comeOutDoor),
- OPCODE(o8_walkActorToObject),
+ OPCODE(o8_cursorCommand),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* A0 */
- OPCODE(o8_walkActorToXY),
- OPCODE(o8_putActorAtXY),
- OPCODE(o8_putActorAtObject),
- OPCODE(o8_faceTowards),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* A4 */
- OPCODE(o8_doAnimation),
- OPCODE(o8_doSentence),
- OPCODE(o8_pickUpObject),
- OPCODE(o8_setBox),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* A8 */
- OPCODE(o8_setBoxPath),
- OPCODE(o8_setBoxSet),
- OPCODE(o8_heapStuff),
- OPCODE(o8_roomStuff),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_resourceRoutines),
+ OPCODE(o8_roomOps),
/* AC */
- OPCODE(o8_actorStuff),
+ OPCODE(o8_actorSet),
OPCODE(o8_cameraStuff),
- OPCODE(o8_verbStuff),
- OPCODE(o8_startSfx),
+ OPCODE(o8_verbOps),
+ OPCODE(o8_unknown),
/* B0 */
- OPCODE(o8_startMusic),
- OPCODE(o8_stopSound),
- OPCODE(o8_soundKludge),
- OPCODE(o8_system),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* B4 */
- OPCODE(o8_verbSets),
- OPCODE(o8_newNameOf),
- OPCODE(o8_getTimeDate),
- OPCODE(o8_drawBox),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* B8 */
- OPCODE(o8_actObjStamp),
- OPCODE(o8_startVideo),
- OPCODE(o8_kludge),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* BC */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* C0 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* C4 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* C8 */
OPCODE(o6_startScript),
OPCODE(o6_startObject),
- OPCODE(o8_pick),
- OPCODE(o8_pickDefault),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* CC */
- OPCODE(o8_pickRandom),
- OPCODE(o8_inSet),
- OPCODE(o8_getRandomNumber),
- OPCODE(o8_getRandomNumberRange),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o6_getRandomNumber),
+ OPCODE(o6_getRandomNumberRange),
/* D0 */
- OPCODE(o8_classOf),
- OPCODE(o8_stateOf),
- OPCODE(o8_ownerOf),
- OPCODE(o8_scriptRunning),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* D4 */
- OPCODE(o8_objectRunning),
- OPCODE(o8_soundRunning),
- OPCODE(o8_abs),
- OPCODE(o8_pixel),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* D8 */
- OPCODE(o8_kludge),
- OPCODE(o8_inBox),
- OPCODE(o8_validVerb),
- OPCODE(o8_findActor),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* DC */
- OPCODE(o8_findObject),
- OPCODE(o8_findVerb),
- OPCODE(o8_findAllObjects),
- OPCODE(o8_actorInvertory),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* E0 */
- OPCODE(o8_actorInvertoryCount),
- OPCODE(o8_actorVariable),
- OPCODE(o8_actorRoom),
- OPCODE(o8_actorBox),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* E4 */
- OPCODE(o8_actorMoving),
- OPCODE(o8_actorCostume),
- OPCODE(o8_actorScale),
- OPCODE(o8_actorDepth),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* E8 */
- OPCODE(o8_actorElevation),
- OPCODE(o8_actorWidth),
- OPCODE(o8_actObjFacing),
- OPCODE(o8_actObjX),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* EC */
- OPCODE(o8_actObjY),
- OPCODE(o8_actorChore),
- OPCODE(o8_proximity2ActObjs),
- OPCODE(o8_proximity2Points),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* F0 */
- OPCODE(o8_objectImageX),
- OPCODE(o8_objectImageY),
- OPCODE(o8_objectImageWidth),
- OPCODE(o8_objectImageHeight),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* F4 */
- OPCODE(o8_verbX),
- OPCODE(o8_verbY),
- OPCODE(o8_stringWidth),
- OPCODE(o8_actorZPlane),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* F8 */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
/* FC */
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
- OPCODE(o8_invalid),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
+ OPCODE(o8_unknown),
};
_opcodesV8 = opcodes;
@@ -370,7 +371,8 @@ const char *Scumm_v8::getOpcodeDesc(int i)
return _opcodesV8[i].desc;
}
-uint32 Scumm_v8::fetchScriptUint32()
+// In V8, the word size is 4 byte, not 2 bytes as in V6/V7 games
+uint Scumm_v8::fetchScriptWord()
{
int a;
if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) {
@@ -383,125 +385,28 @@ uint32 Scumm_v8::fetchScriptUint32()
return a;
}
-int Scumm_v8::fetchScriptInt32()
+int Scumm_v8::fetchScriptWordSigned()
{
- return (int32)fetchScriptUint32();
+ return (int32)fetchScriptWord();
}
-void Scumm_v8::o8_invalid()
-{
- error("Invalid opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer);
-}
-
-void Scumm_v8::o8_pushNumber()
-{
-}
-
-void Scumm_v8::o8_pushVariable()
-{
-}
-
-void Scumm_v8::o8_pushArrayValue()
-{
-}
-
-void Scumm_v8::o8_pushArrayValueIndexed()
-{
-}
-
-void Scumm_v8::o8_dup()
-{
-}
-
-void Scumm_v8::o8_pop()
-{
-}
-
-void Scumm_v8::o8_not()
-{
-}
-
-void Scumm_v8::o8_eq()
-{
-}
-
-void Scumm_v8::o8_neq()
-{
-}
-
-void Scumm_v8::o8_gt()
-{
-}
-
-void Scumm_v8::o8_lt()
-{
-}
-
-void Scumm_v8::o8_leq()
-{
-}
-
-void Scumm_v8::o8_geq()
+void Scumm_v8::o8_unknown()
{
+ warning("Unknown opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer);
}
-void Scumm_v8::o8_add()
-{
-}
-
-void Scumm_v8::o8_sub()
-{
-}
-
-void Scumm_v8::o8_mul()
-{
-}
-
-void Scumm_v8::o8_div()
-{
-}
-
-void Scumm_v8::o8_land()
-{
-}
-
-void Scumm_v8::o8_lor()
-{
-}
-
-void Scumm_v8::o8_band()
+void Scumm_v8::o8_invalid()
{
+ error("Invalid opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer);
}
void Scumm_v8::o8_mod()
{
+ int a = pop();
+ push(pop() % a);
}
-void Scumm_v8::o8_bor()
-{
-}
-
-void Scumm_v8::o8_if()
-{
-}
-
-void Scumm_v8::o8_ifNot()
-{
-}
-
-void Scumm_v8::o8_jump()
-{
-}
-
-void Scumm_v8::o8_breakHere()
-{
-}
-
-void Scumm_v8::o8_breakHereVar()
-{
-}
-
-void Scumm_v8::o8_waitForStuff()
+void Scumm_v8::o8_wait()
{
// TODO
byte subOp = fetchScriptByte();
@@ -517,187 +422,7 @@ void Scumm_v8::o8_waitForStuff()
}
}
-void Scumm_v8::o8_sleepJiffies()
-{
-}
-
-void Scumm_v8::o8_sleepSeconds()
-{
-}
-
-void Scumm_v8::o8_sleepMinutes()
-{
-}
-
-void Scumm_v8::o8_storeVariable()
-{
-}
-
-void Scumm_v8::o8_incVariable()
-{
-}
-
-void Scumm_v8::o8_decVariable()
-{
-}
-
-void Scumm_v8::o8_arrayDim()
-{
-}
-
-void Scumm_v8::o8_storeArray()
-{
-}
-
-void Scumm_v8::o8_incArray()
-{
-}
-
-void Scumm_v8::o8_decArray()
-{
-}
-
-void Scumm_v8::o8_arrayDim2()
-{
-}
-
-void Scumm_v8::o8_storeArrayIndexed()
-{
-}
-
-void Scumm_v8::o8_assignArray()
-{
-}
-
-void Scumm_v8::o8_arrayShuffle()
-{
-}
-
-void Scumm_v8::o8_arrayLocalize()
-{
-}
-
-void Scumm_v8::o8_startScript()
-{
-}
-
-void Scumm_v8::o8_startScriptQuick()
-{
-}
-
-void Scumm_v8::o8_endScript()
-{
-}
-
-void Scumm_v8::o8_stopScript()
-{
-}
-
-void Scumm_v8::o8_chainScript()
-{
-}
-
-void Scumm_v8::o8_return()
-{
-}
-
-void Scumm_v8::o8_startObject()
-{
-}
-
-void Scumm_v8::o8_stopObject()
-{
-}
-
-void Scumm_v8::o8_cutscene()
-{
-}
-
-void Scumm_v8::o8_endCutscene()
-{
-}
-
-void Scumm_v8::o8_freezeScripts()
-{
-}
-
-void Scumm_v8::o8_beginOverride()
-{
-}
-
-void Scumm_v8::o8_endOverride()
-{
-}
-
-void Scumm_v8::o8_stopSentence()
-{
-}
-
-void Scumm_v8::o8_debug()
-{
-}
-
-void Scumm_v8::o8_debugWin()
-{
-}
-
-void Scumm_v8::o8_cameraPanTo()
-{
-}
-
-void Scumm_v8::o8_cameraFollow()
-{
-}
-
-void Scumm_v8::o8_cameraAt()
-{
-}
-
-void Scumm_v8::o8_sayLine()
-{
-}
-
-void Scumm_v8::o8_sayLineDefault()
-{
-}
-
-void Scumm_v8::o8_sayLineSimple()
-{
-}
-
-void Scumm_v8::o8_sayLineSimpleDefault()
-{
-}
-
-void Scumm_v8::o8_printLine()
-{
-}
-
-void Scumm_v8::o8_printCursor()
-{
-}
-
-void Scumm_v8::o8_printDebug()
-{
-}
-
-void Scumm_v8::o8_printSystem()
-{
-}
-
-void Scumm_v8::o8_blastText()
-{
-}
-
-void Scumm_v8::o8_drawObject()
-{
-}
-
-void Scumm_v8::o8_blastObject()
-{
-}
-
-void Scumm_v8::o8_userFace()
+void Scumm_v8::o8_cursorCommand()
{
// TODO
byte subOp = fetchScriptByte();
@@ -721,59 +446,7 @@ void Scumm_v8::o8_userFace()
}
}
-void Scumm_v8::o8_currentRoom()
-{
-}
-
-void Scumm_v8::o8_comeOutDoor()
-{
-}
-
-void Scumm_v8::o8_walkActorToObject()
-{
-}
-
-void Scumm_v8::o8_walkActorToXY()
-{
-}
-
-void Scumm_v8::o8_putActorAtXY()
-{
-}
-
-void Scumm_v8::o8_putActorAtObject()
-{
-}
-
-void Scumm_v8::o8_faceTowards()
-{
-}
-
-void Scumm_v8::o8_doAnimation()
-{
-}
-
-void Scumm_v8::o8_doSentence()
-{
-}
-
-void Scumm_v8::o8_pickUpObject()
-{
-}
-
-void Scumm_v8::o8_setBox()
-{
-}
-
-void Scumm_v8::o8_setBoxPath()
-{
-}
-
-void Scumm_v8::o8_setBoxSet()
-{
-}
-
-void Scumm_v8::o8_heapStuff()
+void Scumm_v8::o8_resourceRoutines()
{
// TODO
byte subOp = fetchScriptByte();
@@ -797,11 +470,11 @@ void Scumm_v8::o8_heapStuff()
case 0x4C: // SO_HEAP_NUKE_SCRIPT Remove script from heap
case 0x4D: // SO_HEAP_NUKE_SOUND Remove sound from heap
default:
- error("o8_heapStuff: default case %d", subOp);
+ error("o8_resourceRoutines: default case %d", subOp);
}
}
-void Scumm_v8::o8_roomStuff()
+void Scumm_v8::o8_roomOps()
{
// TODO
byte subOp = fetchScriptByte();
@@ -821,17 +494,17 @@ void Scumm_v8::o8_roomStuff()
case 0x5E: // SO_ROOM_LOAD_GAME Load game
case 0x5F: // SO_ROOM_SATURATION Set saturation of room colors
default:
- error("o8_roomStuff: default case %d", subOp);
+ error("o8_roomOps: default case %d", subOp);
}
}
-void Scumm_v8::o8_actorStuff()
+void Scumm_v8::o8_actorSet()
{
// TODO
byte subOp = fetchScriptByte();
Actor *a;
- a = derefActorSafe(_curActor, "o8_actorStuff");
+ a = derefActorSafe(_curActor, "o8_actorSet");
if (!a)
return;
@@ -875,7 +548,7 @@ void Scumm_v8::o8_actorStuff()
case 0x88: // SO_ACTOR_FREQUENCY Set frequency of actor speech
case 0x89: // SO_ACTOR_PAN
default:
- error("o8_actorStuff: default case %d", subOp);
+ error("o8_actorset: default case %d", subOp);
}
}
@@ -891,7 +564,7 @@ void Scumm_v8::o8_cameraStuff()
}
}
-void Scumm_v8::o8_verbStuff()
+void Scumm_v8::o8_verbOps()
{
// TODO
byte subOp = fetchScriptByte();
@@ -915,242 +588,271 @@ void Scumm_v8::o8_verbStuff()
case 0xA6: // SO_VERB_CHARSET Choose charset for verb
case 0xA7: // SO_VERB_LINE_SPACING Choose linespacing for verb
default:
- error("o8_verbStuff: default case %d", subOp);
+ error("o8_verbops: default case %d", subOp);
}
}
-void Scumm_v8::o8_startSfx()
-{
-}
-
-void Scumm_v8::o8_startMusic()
-{
-}
-
-void Scumm_v8::o8_stopSound()
-{
-}
-
-void Scumm_v8::o8_soundKludge()
-{
-}
-
-void Scumm_v8::o8_system()
-{
-}
-
-void Scumm_v8::o8_verbSets()
-{
-}
-
-void Scumm_v8::o8_newNameOf()
-{
-}
-
-void Scumm_v8::o8_getTimeDate()
-{
-}
-
-void Scumm_v8::o8_drawBox()
-{
-}
-
-void Scumm_v8::o8_actObjStamp()
-{
-}
-
-void Scumm_v8::o8_startVideo()
-{
-}
-
-void Scumm_v8::o8_pick()
-{
-}
-
-void Scumm_v8::o8_pickDefault()
-{
-}
-
-void Scumm_v8::o8_pickRandom()
-{
-}
-
-void Scumm_v8::o8_inSet()
-{
-}
-
-void Scumm_v8::o8_getRandomNumber()
-{
-}
-
-void Scumm_v8::o8_getRandomNumberRange()
-{
-}
-
-void Scumm_v8::o8_classOf()
-{
-}
-
-void Scumm_v8::o8_stateOf()
-{
-}
-
-void Scumm_v8::o8_ownerOf()
-{
-}
-
-void Scumm_v8::o8_scriptRunning()
-{
-}
-
-void Scumm_v8::o8_objectRunning()
-{
-}
-
-void Scumm_v8::o8_soundRunning()
-{
-}
-
-void Scumm_v8::o8_abs()
-{
-}
-
-void Scumm_v8::o8_pixel()
-{
-}
-
-void Scumm_v8::o8_kludge()
-{
-}
-
-void Scumm_v8::o8_inBox()
-{
-}
-
-void Scumm_v8::o8_validVerb()
-{
-}
-
-void Scumm_v8::o8_findActor()
-{
-}
-
-void Scumm_v8::o8_findObject()
-{
-}
-
-void Scumm_v8::o8_findVerb()
-{
-}
-
-void Scumm_v8::o8_findAllObjects()
-{
-}
-
-void Scumm_v8::o8_actorInvertory()
-{
-}
-
-void Scumm_v8::o8_actorInvertoryCount()
-{
-}
-
-void Scumm_v8::o8_actorVariable()
-{
-}
-
-void Scumm_v8::o8_actorRoom()
-{
-}
-
-void Scumm_v8::o8_actorBox()
-{
-}
-
-void Scumm_v8::o8_actorMoving()
-{
-}
-
-void Scumm_v8::o8_actorCostume()
-{
-}
-
-void Scumm_v8::o8_actorScale()
-{
-}
-
-void Scumm_v8::o8_actorDepth()
-{
-}
-
-void Scumm_v8::o8_actorElevation()
-{
-}
-
-void Scumm_v8::o8_actorWidth()
-{
-}
-
-void Scumm_v8::o8_actObjFacing()
-{
-}
-
-void Scumm_v8::o8_actObjX()
-{
-}
-
-void Scumm_v8::o8_actObjY()
-{
-}
-
-void Scumm_v8::o8_actorChore()
-{
-}
-
-void Scumm_v8::o8_proximity2ActObjs()
-{
-}
-
-void Scumm_v8::o8_proximity2Points()
-{
-}
-
-void Scumm_v8::o8_objectImageX()
-{
-}
-
-void Scumm_v8::o8_objectImageY()
-{
-}
-
-void Scumm_v8::o8_objectImageWidth()
-{
-}
-
-void Scumm_v8::o8_objectImageHeight()
-{
-}
-
-void Scumm_v8::o8_verbX()
-{
-}
-
-void Scumm_v8::o8_verbY()
-{
-}
-
-void Scumm_v8::o8_stringWidth()
-{
-}
-
-void Scumm_v8::o8_actorZPlane()
-{
-}
-
/*
From http://scummrev.mixnmojo.com/specs/CMIOpcodes.shtml
+000 O_0
+001 O_PUSH_NUMBER Push number onto stack.
+002 O_PUSH_VARIABLE Push variable value onto stack.
+003 O_PUSH_ARRAY_VALUE Push array value onto stack.
+004 O_PUSH_ARRAY2_VALUE ?
+005 O_DUP Duplicate stack value
+006 O_POP Pop value from stack.
+007 O_NOT NOT (!)
+008 O_EQ Equals (==)
+009 O_NEQ Does not equal (!=)
+00A O_GT Greater than (>)
+00B O_LT Less than (<)
+00C O_LEQ Less than or equal (<=)
+00D O_GEQ Greater than or equal (>=)
+00E O_ADD Add (+)
+00F O_SUB Subtract (-)
+010 O_MUL Multiply (*)
+011 O_DIV Divide (/)
+012 O_LAND Logical AND
+013 O_LOR Logical OR
+014 O_BAND Binary AND
+015 O_BOR Binary OR
+016 O_MOD Modulus (%)
+017 O_23
+018 O_24
+019 O_25
+01A O_26
+01B O_27
+01C O_28
+01D O_29
+01E O_30
+01F O_31
+020 O_32
+021 O_33
+022 O_34
+023 O_35
+024 O_36
+025 O_37
+026 O_38
+027 O_39
+028 O_40
+029 O_41
+02A O_42
+02B O_43
+02C O_44
+02D O_45
+02E O_46
+02F O_47
+030 O_48
+031 O_49
+032 O_50
+033 O_51
+034 O_52
+035 O_53
+036 O_54
+037 O_55
+038 O_56
+039 O_57
+03A O_58
+03B O_59
+03C O_60
+03D O_61
+03E O_62
+03F O_63
+040 O_64
+041 O_65
+042 O_66
+043 O_67
+044 O_68
+045 O_69
+046 O_70
+047 O_71
+048 O_72
+049 O_73
+04A O_74
+04B O_75
+04C O_76
+04D O_77
+04E O_78
+04F O_79
+050 O_80
+051 O_81
+052 O_82
+053 O_83
+054 O_84
+055 O_85
+056 O_86
+057 O_87
+058 O_88
+059 O_89
+05A O_90
+05B O_91
+05C O_92
+05D O_93
+05E O_94
+05F O_95
+060 O_96
+061 O_97
+062 O_98
+063 O_99
+064 O_IF if ()
+065 O_IF_NOT if not ()
+066 O_JUMP jump/goto
+067 O_BREAK_HERE Break out of script
+068 O_BREAK_HERE_VAR
+069 O_WAIT_FOR_STUFF Wait Sub opcodes
+06A O_SLEEP_JIFFIES Sleep for jiffies (10ths of a second)
+06B O_SLEEP_SECONDS Sleep for seconds
+06C O_SLEEP_MINUTES Sleep for minutes
+06D O_STORE_VARIABLE Assign value to variable
+06E O_INC_VARIABLE Increase variable value (++)
+06F O_DEC_VARIABLE Decrease variable value (--)
+070 O_ARRAY_DIM Set dimension of array
+071 O_STORE_ARRAY Assign value to array
+072 O_INC_ARRAY Increase array value
+073 O_DEC_ARRAY Decrease array value
+074 O_ARRAY_DIM2 Set dimensions of 2 dimensional array
+075 O_STORE_ARRAY2 Assign value to 2 dimensional array
+076 O_ASSIGN_ARRAY ?
+077 O_ARRAY_SHUFFLE Shuffle array
+078 O_ARRAY_LOCALIZE ?
+079 O_START_SCRIPT Start script
+07A O_START_SCRIPT_QUICK ?
+07B O_END_SCRIPT End script
+07C O_STOP_SCRIPT Stop script from running
+07D O_CHAIN_SCRIPT ?
+07E O_RETURN Return
+07F O_START_OBJECT ?
+080 O_STOP_OBJECT ?
+081 O_CUT_SCENE Start of cutscene (interface off)
+082 O_END_CUT_SCENE End of cutscene (interface on)
+083 O_FREEZE_SCRIPTS ?
+084 O_OVERRIDE ?
+085 O_OVERRIDE_OFF ?
+086 O_STOP_SENTENCE ?
+087 O_DEBUG Set debug mode
+088 O_DEBUG_WINDEX Set debug mode with output to external window
+089 O_CLASS_OF Set class of script
+08A O_STATE_OF ?
+08B O_OWNER_OF Set owner of object
+08C O_CAMERA_PAN_TO Pan camera to (X,Y)
+08D O_CAMERA_FOLLOW Make camera follow character/object
+08E O_CAMERA_AT Place camera at specific (X,Y)
+08F O_SAY_LINE Talk
+090 O_SAY_LINE_DEFAULT Talk using default actor
+091 O_SAY_LINE_SIMPLE Talk with less arguments
+092 O_SAY_LINE_SIMPLE_DEFAULT Talk with less arguments using default actor
+093 O_PRINT_LINE Print a line on screen
+094 O_PRINT_CURSOR
+095 O_PRINT_DEBUG
+096 O_PRINT_SYSTEM
+097 O_BLAST_TEXT Text to output to screen
+098 O_DRAW_OBJECT Draw object
+099 O_153
+09A O_BLAST_OBJECT
+09B O_155
+09C O_USERFACE ?
+09D O_CURRENT_ROOM Set current room
+09E O_COME_OUT_DOOR
+09F O_WALK_ACTOR_TO_OBJECT Walk to object
+0A0 O_WALK_ACTOR_TO_XY Walk to coordinate
+0A1 O_PUT_ACTOR_AT_XY Put at coordinate
+0A2 O_PUT_ACTOR_AT_OBJECT Put at object
+0A3 O_FACE_TOWARDS Change facing
+0A4 O_DO_ANIMATION Animate
+0A5 O_DO_SENTENCE
+0A6 O_PICK_UP_OBJECT Pick up object
+0A7 O_SET_BOX
+0A8 O_SET_BOX_PATH
+0A9 O_SET_BOX_SET
+0AA O_HEAP_STUFF Heap sub opcodes
+0AB O_ROOM_STUFF Room sub opcodes
+0AC O_ACTOR_STUFF Actor sub opcodes
+0AD O_CAMERA_STUFF Camera sub opcodes
+0AE O_VERB_STUFF Verb sub opcodes
+0AF O_START_SFX Start sound effect
+0B0 O_START_MUSIC Start music
+0B1 O_STOP_SOUND Stop sound (effect or music)
+0B2 O_SOUND_KLUDGE ?
+0B3 O_SYSTEM System sub opcodes
+0B4 O_VERB_SETS
+0B5 O_NEW_NAME_OF Set new name of object
+0B6 O_GET_TIME_DATE Get time and/or date
+0B7 O_DRAW_BOX
+0B8 O_ACTOBJ_STAMP
+0B9 O_START_VIDEO Start cutscene video
+0BA O_KLUDGE
+0BB O_187
+0BC O_188
+0BD O_189
+0BE O_190
+0BF O_191
+0C0 O_192
+0C1 O_193
+0C2 O_194
+0C3 O_195
+0C4 O_196
+0C5 O_197
+0C6 O_198
+0C7 O_199
+0C8 F_START_SCRIPT Start script
+0C9 F_START_OBJECT Start object script
+0CA F_PICK
+0CB F_PICK_DEFAULT
+0CC F_PICK_RANDOM
+0CD F_IN_SET
+0CE F_RANDOM Get random number
+0CF F_RANDOM_BETWEEN Get random number between two values
+0D0 F_CLASS_OF Get class of script
+0D1 F_STATE_OF
+0D2 F_OWNER_OF Get owner of object
+0D3 F_SCRIPT_RUNNING Test if script is running
+0D4 F_OBJECT_RUNNING Test if object is running
+0D5 F_SOUND_RUNNING Test if sound is running
+0D6 F_ABS Get absolute value
+0D7 F_PIXEL
+0D8 F_KLUDGE
+0D9 F_IN_BOX Test if object is in box
+0DA F_VALID_VERB
+0DB F_FIND_ACTOR
+0DC F_FIND_OBJECT
+0DD F_FIND_VERB
+0DE F_FIND_ALL_OBJECTS
+0DF F_ACTOR_INVENTORY
+0E0 F_ACTOR_INVENTORY_COUNT Get number of items in inventory
+0E1 F_ACTOR_VARIABLE Get actor variable (property)
+0E2 F_ACTOR_ROOM Get current room for actor
+0E3 F_ACTOR_BOX Get current box for actor
+0E4 F_ACTOR_MOVING Test if actor is moving
+0E5 F_ACTOR_COSTUME Get current costume for actor
+0E6 F_ACTOR_SCALE Get current scale of actor
+0E7 F_ACTOR_DEPTH Get current Z position of actor
+0E8 F_ACTOR_ELEVATION Get current actor elevation
+0E9 F_ACTOR_WIDTH Get current actor width
+0EA F_ACTOBJ_FACING Get current actor/object facing
+0EB F_ACTOBJ_X Get X position of actor/object
+0EC F_ACTOBJ_Y Get Y position of actor/object
+0ED F_ACTOR_CHORE
+0EE F_PROXIMITY_2ACTOBJS Get distance between 2 actors/objects
+0EF F_PROXIMITY_2POINTS Get distance between 2 points
+0F0 F_OBJECT_IMAGE_X Get X position of object image
+0F1 F_OBJECT_IMAGE_Y Get Y position of object image
+0F2 F_OBJECT_IMAGE_WIDTH Get width of object image
+0F3 F_OBJECT_IMAGE_HEIGHT Get height of object image
+0F4 F_VERB_X Get X position of verb
+0F5 F_VERB_Y Get Y position of verb
+0F6 F_STRING_WIDTH
+0F7 F_ACTOR_ZPLANE
+0F8 O_248
+0F9 O_249
+0FA O_250
+0FB O_251
+0FC O_252
+0FD O_253
+0FE O_254
+0FF O_255
+
The following are subopcodes - just strip the leading 1
100 SO_256