aboutsummaryrefslogtreecommitdiff
path: root/scumm/script_v8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scumm/script_v8.cpp')
-rw-r--r--scumm/script_v8.cpp238
1 files changed, 42 insertions, 196 deletions
diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp
index ce201ad831..d5bb9120fa 100644
--- a/scumm/script_v8.cpp
+++ b/scumm/script_v8.cpp
@@ -33,35 +33,36 @@
void Scumm_v8::setupOpcodes()
{
+ // TODO: any of the o6_ entries are potentially wrong and pure guesses :-)
static const OpcodeEntryV8 opcodes[256] = {
/* 00 */
OPCODE(o8_unknown),
- OPCODE(o8_pushNumber),
- OPCODE(o8_pushVariable),
- OPCODE(o8_arrayRead),
+ OPCODE(o6_pushWord),
+ OPCODE(o6_pushWordVar),
+ OPCODE(o6_wordArrayRead),
/* 04 */
- OPCODE(o8_arrayIndexedRead),
- OPCODE(o8_dup),
+ OPCODE(o6_wordArrayIndexedRead),
+ OPCODE(o6_dup),
OPCODE(o8_pop),
- OPCODE(o8_not),
+ 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_le),
- OPCODE(o8_ge),
- 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_unknown),
/* 18 */
@@ -160,10 +161,10 @@ void Scumm_v8::setupOpcodes()
OPCODE(o8_unknown),
OPCODE(o8_unknown),
/* 64 */
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
- OPCODE(o8_jump),
- OPCODE(o8_breakHere),
+ OPCODE(o6_jumpFalse),
+ OPCODE(o6_jumpTrue),
+ OPCODE(o6_jump),
+ OPCODE(o6_breakHere),
/* 68 */
OPCODE(o8_unknown),
OPCODE(o8_wait),
@@ -171,17 +172,17 @@ void Scumm_v8::setupOpcodes()
OPCODE(o8_unknown),
/* 6C */
OPCODE(o8_unknown),
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
+ OPCODE(o6_writeWordVar),
+ OPCODE(o6_wordVarInc),
+ OPCODE(o6_wordVarDec),
/* 70 */
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
+ OPCODE(o6_dim),
+ OPCODE(o6_wordArrayWrite),
+ OPCODE(o6_wordArrayInc),
+ OPCODE(o6_wordArrayDec),
/* 74 */
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
+ OPCODE(o6_dim2),
+ OPCODE(o6_wordArrayIndexedWrite),
OPCODE(o8_unknown),
OPCODE(o8_unknown),
/* 78 */
@@ -196,12 +197,12 @@ void Scumm_v8::setupOpcodes()
OPCODE(o8_unknown),
/* 80 */
OPCODE(o8_unknown),
- OPCODE(o8_cutscene),
- OPCODE(o8_endCutscene),
+ OPCODE(o6_cutscene),
+ OPCODE(o6_endCutscene),
OPCODE(o8_unknown),
/* 84 */
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
+ OPCODE(o6_beginOverride),
+ OPCODE(o6_endOverride),
OPCODE(o8_unknown),
OPCODE(o8_unknown),
/* 88 */
@@ -285,15 +286,15 @@ void Scumm_v8::setupOpcodes()
OPCODE(o8_unknown),
OPCODE(o8_unknown),
/* C8 */
- OPCODE(o8_startScript),
- OPCODE(o8_startObject),
+ OPCODE(o6_startScript),
+ OPCODE(o6_startObject),
OPCODE(o8_unknown),
OPCODE(o8_unknown),
/* CC */
OPCODE(o8_unknown),
OPCODE(o8_unknown),
- OPCODE(o8_unknown),
- OPCODE(o8_unknown),
+ OPCODE(o6_getRandomNumber),
+ OPCODE(o6_getRandomNumberRange),
/* D0 */
OPCODE(o8_unknown),
OPCODE(o8_unknown),
@@ -380,151 +381,17 @@ void Scumm_v8::o8_invalid()
error("Invalid opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer);
}
-void Scumm_v8::o8_pushNumber()
-{
- // TODO - is this correct?!?
- push((int16)fetchScriptWord());
-}
-
-void Scumm_v8::o8_pushVariable()
-{
- // TODO - is this correct?!?
- push(readVar(fetchScriptWord()));
-}
-
-void Scumm_v8::o8_arrayRead()
-{
- // TODO - is this correct?!?
- int base = pop();
- push(readArray(fetchScriptWord(), 0, base));
-}
-
-void Scumm_v8::o8_arrayIndexedRead()
-{
- // TODO - is this correct?!?
- int base = pop();
- int idx = pop();
- push(readArray(fetchScriptWord(), idx, base));
-}
-
-void Scumm_v8::o8_dup()
-{
- int a = pop();
- push(a);
- push(a);
-}
-
void Scumm_v8::o8_pop()
{
pop();
}
-void Scumm_v8::o8_not()
-{
- push(pop() == 0);
-}
-
-void Scumm_v8::o8_eq()
-{
- push(pop() == pop());
-}
-
-void Scumm_v8::o8_neq()
-{
- push(pop() != pop());
-}
-
-void Scumm_v8::o8_gt()
-{
- int a = pop();
- push(pop() > a);
-}
-
-void Scumm_v8::o8_lt()
-{
- int a = pop();
- push(pop() < a);
-}
-
-void Scumm_v8::o8_le()
-{
- int a = pop();
- push(pop() <= a);
-}
-
-void Scumm_v8::o8_ge()
-{
- int a = pop();
- push(pop() >= a);
-}
-
-void Scumm_v8::o8_add()
-{
- int a = pop();
- push(pop() + a);
-}
-
-void Scumm_v8::o8_sub()
-{
- int a = pop();
- push(pop() - a);
-}
-
-void Scumm_v8::o8_mul()
-{
- int a = pop();
- push(pop() * a);
-}
-
-void Scumm_v8::o8_div()
-{
- int a = pop();
- if (a == 0)
- error("division by zero");
- push(pop() / a);
-}
-
-void Scumm_v8::o8_land() // Logical And
-{
- int a = pop();
- push(pop() && a);
-}
-
-void Scumm_v8::o8_lor() // Logical Or
-{
- int a = pop();
- push(pop() || a);
-}
-
-void Scumm_v8::o8_bor() // Bitwise Or
-{
- int a = pop();
- push(pop() | a);
-}
-
-void Scumm_v8::o8_band() // Bitwise And
-{
- int a = pop();
- push(pop() | a);
-}
-
void Scumm_v8::o8_mod()
{
int a = pop();
push(pop() % a);
}
-void Scumm_v8::o8_jump()
-{
- // TODO - is this correct?!?
- _scriptPointer += (int16)fetchScriptWord();
-}
-
-void Scumm_v8::o8_breakHere()
-{
- // TODO
-}
-
void Scumm_v8::o8_wait()
{
// TODO
@@ -541,16 +408,6 @@ void Scumm_v8::o8_wait()
}
}
-void Scumm_v8::o8_cutscene()
-{
- // TODO
-}
-
-void Scumm_v8::o8_endCutscene()
-{
- // TODO
-}
-
void Scumm_v8::o8_cursorCommand()
{
// TODO
@@ -721,17 +578,6 @@ void Scumm_v8::o8_verbOps()
}
}
-void Scumm_v8::o8_startObject()
-{
- // TODO
-}
-
-void Scumm_v8::o8_startScript()
-{
- // TODO
-}
-
-
/*
From http://scummrev.mixnmojo.com/specs/CMIOpcodes.shtml