aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h30
-rw-r--r--scumm/script_v8.cpp238
2 files changed, 44 insertions, 224 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 452e04faeb..68e5992def 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -376,7 +376,7 @@ protected:
virtual void setupScummVars();
};
-class Scumm_v8 : public Scumm
+class Scumm_v8 : public Scumm_v6
{
protected:
typedef void (Scumm_v8::*OpcodeProcV8)();
@@ -388,7 +388,7 @@ protected:
const OpcodeEntryV8 *_opcodesV8;
public:
- Scumm_v8(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+ Scumm_v8(GameDetector *detector, OSystem *syst) : Scumm_v6(detector, syst) {}
protected:
virtual void setupOpcodes();
@@ -400,41 +400,15 @@ protected:
void o8_unknown();
void o8_invalid();
- void o8_pushNumber();
- void o8_pushVariable();
- void o8_arrayRead();
- void o8_arrayIndexedRead();
- void o8_dup();
void o8_pop();
- void o8_not();
- void o8_eq();
- void o8_neq();
- void o8_gt();
- void o8_lt();
- void o8_le();
- void o8_ge();
- 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_jump();
- void o8_breakHere();
void o8_wait();
- void o8_cutscene();
- void o8_endCutscene();
void o8_cursorCommand();
void o8_resourceRoutines();
void o8_roomOps();
void o8_actorSet();
void o8_cameraStuff();
void o8_verbOps();
- void o8_startScript();
- void o8_startObject();
};
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