aboutsummaryrefslogtreecommitdiff
path: root/engines/agi
diff options
context:
space:
mode:
authorJussi Pitkanen2011-06-25 12:06:28 +0300
committerEugene Sandulenko2011-08-13 23:27:24 +0100
commitaf691e46c4ccbe0457d2a7d5a4386d9287518740 (patch)
tree1f78d48f29b1ec5a2cd08341d13db27df4b2b583 /engines/agi
parent1dbe5bfccfb3d10b31ea9b5ac567165c650b3f98 (diff)
downloadscummvm-rg350-af691e46c4ccbe0457d2a7d5a4386d9287518740.tar.gz
scummvm-rg350-af691e46c4ccbe0457d2a7d5a4386d9287518740.tar.bz2
scummvm-rg350-af691e46c4ccbe0457d2a7d5a4386d9287518740.zip
AGI: Updates to V1 instruction table, plus an outcommented experiment
The experiment tries to implement the program control of the V1 interpreter. Maybe it is better to add another method for doing that once the workings of it are more clear.
Diffstat (limited to 'engines/agi')
-rw-r--r--engines/agi/agi.h4
-rw-r--r--engines/agi/op_cmd.cpp57
-rw-r--r--engines/agi/opcodes.cpp118
-rw-r--r--engines/agi/opcodes.h4
4 files changed, 122 insertions, 61 deletions
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 1c89718a6e..579580127c 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -640,6 +640,10 @@ struct AgiGame {
// IF condition handling
int testResult;
+
+
+ int max_logics;
+ int logic_list[256];
};
/**
diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp
index bd189eeac5..673cac450b 100644
--- a/engines/agi/op_cmd.cpp
+++ b/engines/agi/op_cmd.cpp
@@ -1420,9 +1420,11 @@ void cmdSetString(AgiGame *state, uint8 *p) {
}
void cmdDisplay(AgiGame *state, uint8 *p) {
+ // V1 has 4 args
+ int t = (getVersion() >= 0x2000 ? p2 : p3);
int len = 40;
- char *s = state->_vm->wordWrapString(state->_curLogic->texts[p2 - 1], &len);
+ char *s = state->_vm->wordWrapString(state->_curLogic->texts[t - 1], &len);
state->_vm->printText(s, p1, 0, p0, 40, state->colorFg, state->colorBg);
@@ -1581,6 +1583,34 @@ void cmdSetSpeed(AgiGame *state, uint8 *p) {
(void)p;
}
+void cmdSetItemView(AgiGame *state, uint8 *p) {
+ // V1 command
+ (void)state;
+ (void)p;
+}
+
+void cmdCallV1(AgiGame *state, uint8 *p) {
+ state->_vm->agiLoadResource(rLOGIC, p0);
+ state->logic_list[++state->max_logics];
+ _v[13] = 1;
+}
+
+void cmdNewRoomV1(AgiGame *state, uint8 *p) {
+ warning("cmdNewRoomV1()");
+ state->_vm->agiLoadResource(rLOGIC, p0);
+ state->max_logics = 1;
+ state->logic_list[1] = p0;
+ _v[13] = 1;
+}
+
+void cmdNewRoomVV1(AgiGame *state, uint8 *p) {
+ warning("cmdNewRoomVV1()");
+ state->_vm->agiLoadResource(rLOGIC, _v[p0]);
+ state->max_logics = 1;
+ state->logic_list[1] = _v[p0];
+ _v[13] = 1;
+}
+
void cmdUnknown(AgiGame *state, uint8 *p) {
warning("Skipping unknown opcode %2X", *(code + ip - 1));
}
@@ -1595,6 +1625,10 @@ int AgiEngine::runLogic(int n) {
uint8 p[CMD_BSIZE] = { 0 };
int num = 0;
ScriptPos sp;
+ //int logic_index = 0;
+
+ state->logic_list[0] = 0;
+ state->max_logics = 0;
debugC(2, kDebugLevelScripts, "=================");
debugC(2, kDebugLevelScripts, "runLogic(%d)", n);
@@ -1659,6 +1693,18 @@ int AgiEngine::runLogic(int n) {
debugC(2, kDebugLevelScripts, "%sreturn() // Logic %d", st, n);
debugC(2, kDebugLevelScripts, "=================");
+// if (getVersion() < 0x2000) {
+// if (logic_index < state->max_logics) {
+// n = state->logic_list[++logic_index];
+// state->_curLogic = &state->logics[n];
+// state->lognum = n;
+// ip = 2;
+// warning("running logic %d\n", n);
+// break;
+// }
+// _v[13]=0;
+// }
+
_game.execStack.pop_back();
return 1;
default:
@@ -1672,6 +1718,14 @@ int AgiEngine::runLogic(int n) {
ip += num;
}
+// if ((op == 0x0B || op == 0x3F || op == 0x40) && logic_index < state->max_logics) {
+// n = state->logic_list[++logic_index];
+// state->_curLogic = &state->logics[n];
+// state->lognum = n;
+// ip = 2;
+// warning("running logic %d\n", n);
+// }
+
if (_game.exitAllLogics)
break;
}
@@ -1685,7 +1739,6 @@ void AgiEngine::executeAgiCommand(uint8 op, uint8 *p) {
debugC(2, kDebugLevelScripts, "%s(%d %d %d)", logicNamesCmd[op].name, p[0], p[1], p[2]);
_agiCommands[op](&_game, p);
-// (this->*_agiCommands[op])(p);
}
} // End of namespace Agi
diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
index ba7f587d11..e69d16701e 100644
--- a/engines/agi/opcodes.cpp
+++ b/engines/agi/opcodes.cpp
@@ -49,103 +49,103 @@ AgiInstruction insV1Test[] = {
};
AgiInstruction insV1[] = {
- { "return", "", NULL }, // 00
- { "increment", "v", &cmdIncrement }, // 01
- { "decrement", "v", &cmdDecrement }, // 02
- { "assignn", "vn", &cmdAssignN }, // 03
- { "assignv", "vv", &cmdAssignV }, // 04
+ { "return", "", NULL }, // 00
+ { "increment", "v", &cmdIncrement }, // 01
+ { "decrement", "v", &cmdDecrement }, // 02
+ { "assignn", "vn", &cmdAssignN }, // 03
+ { "assignv", "vv", &cmdAssignV }, // 04
{ "addn", "vn", &cmdAddN }, // 05
{ "addv", "vv", &cmdAddV }, // 06
{ "subn", "vn", &cmdSubN }, // 07
{ "subv", "vv", &cmdSubV }, // 08
{ "load.view", "n", &cmdLoadView }, // 09
- { "animate.obj", "n", &cmdAnimateObj }, // 0A
- { "new.room", "n", &cmdNewRoom }, // 0B
+ { "animate.obj", "n", &cmdAnimateObj }, // 0A
+ { "new.room", "n", &cmdNewRoomV1 }, // 0B
{ "draw.pic", "v", &cmdDrawPic }, // 0C
- { "print", "s", &cmdPrint }, // 0D
- { "status", "", &cmdStatus }, // 0E
+ { "print", "s", &cmdPrint }, // 0D
+ { "status", "", &cmdStatus }, // 0E
{ "save.game", "", &cmdSaveGame }, // 0F
{ "restore.game", "", &cmdLoadGame }, // 10
{ "...", "", &cmdInitDisk }, // 11 TODO
{ "restart.game", "", &cmdRestartGame }, // 12
- { "random", "v", &cmdRandom }, // 13 TODO: 1 vs 3 vars
- { "get", "n", &cmdGet }, // 14
+ { "random", "v", &cmdRandom }, // 13 TODO: 1 vs 3 vars
+ { "get", "n", &cmdGet }, // 14
{ "drop", "n", &cmdDrop }, // 15
{ "draw", "n", &cmdDraw }, // 16
- { "erase", "n", &cmdErase }, // 17
+ { "erase", "n", &cmdErase }, // 17
{ "position", "nnn", &cmdPosition }, // 18
- { "position.v", "nvv", &cmdPositionF }, // 19
+ { "position.v", "nvv", &cmdPositionF }, // 19
{ "get.posn", "nvv", &cmdGetPosn }, // 1A
- { "set.cel", "nn", &cmdSetCel }, // 1B
+ { "set.cel", "nn", &cmdSetCel }, // 1B
{ "set.loop", "nn", &cmdSetLoop }, // 1C
- { "end.of.loop", "nn", &cmdEndOfLoop }, // 1D
+ { "end.of.loop", "nn", &cmdEndOfLoop }, // 1D
{ "reverse.loop", "nn", &cmdReverseLoop }, // 1E
{ "move.obj", "nnnnn", &cmdMoveObj }, // 1F
{ "set.view", "nn", &cmdSetView }, // 20
- { "follow.ego", "nnn", &cmdFollowEgo }, // 21
- { "...", "", &cmdUnknown }, // 22
- { "...", "", &cmdUnknown }, // 23
+ { "follow.ego", "nnn", &cmdFollowEgo }, // 21
+ { "...", "", &cmdUnknown }, // 22
+ { "...", "", &cmdUnknown }, // 23
{ "ignore.blocks", "n", &cmdIgnoreBlocks }, // 24
- { "observe.blocks", "n", &cmdObserveBlocks }, // 25
- { "wander", "n", &cmdWander }, // 26
- { "reposition", "nvv", &cmdReposition }, // 27
- { "stop.motion", "n", &cmdStopMotion }, // 28
+ { "observe.blocks", "n", &cmdObserveBlocks }, // 25
+ { "wander", "n", &cmdWander }, // 26
+ { "reposition", "nvv", &cmdReposition }, // 27
+ { "stop.motion", "n", &cmdStopMotion }, // 28
{ "start.motion", "n", &cmdStartMotion }, // 29
{ "stop.cycling", "n", &cmdStopCycling }, // 2A
{ "start.cycling", "n", &cmdStartCycling }, // 2B
- { "stop.update", "n", &cmdStopUpdate }, // 2C
+ { "stop.update", "n", &cmdStopUpdate }, // 2C
{ "start.update", "n", &cmdStartUpdate }, // 2D
- { "program.control", "", &cmdProgramControl }, // 2E
- { "player.control", "", &cmdPlayerControl }, // 2F
+ { "program.control", "", &cmdProgramControl }, // 2E
+ { "player.control", "", &cmdPlayerControl }, // 2F
{ "set.priority", "nn", &cmdSetPriority }, // 30
{ "release.priority", "n", &cmdReleasePriority }, // 31
{ "add.to.pic", "nnnnnn", &cmdAddToPic }, // 32 TODO: 7 vs 8 args
- { "set.horizon", "n", &cmdSetHorizon }, // 33
- { "ignore.horizon", "n", &cmdIgnoreHorizon }, // 34
- { "observe.horizon", "n", &cmdObserveHorizon }, // 35
- { "load.logics", "n", &cmdLoadLogic }, // 36
- { "object.on.water", "n", &cmdObjectOnWater }, // 37
+ { "set.horizon", "n", &cmdSetHorizon }, // 33
+ { "ignore.horizon", "n", &cmdIgnoreHorizon }, // 34
+ { "observe.horizon", "n", &cmdObserveHorizon }, // 35
+ { "load.logics", "n", &cmdLoadLogic }, // 36
+ { "object.on.water", "n", &cmdObjectOnWater }, // 37
{ "load.pic", "v", &cmdLoadPic }, // 38
- { "load.sound", "n", &cmdLoadSound }, // 39
- { "sound", "nn", &cmdSound }, // 3A
- { "stop.sound", "", &cmdStopSound }, // 3B
+ { "load.sound", "n", &cmdLoadSound }, // 39
+ { "sound", "nn", &cmdSound }, // 3A
+ { "stop.sound", "", &cmdStopSound }, // 3B
{ "set.v", "v", &cmdSetV }, // 3C
- { "reset.v", "v", &cmdResetV }, // 3D
+ { "reset.v", "v", &cmdResetV }, // 3D
{ "toggle.v", "v", &cmdToggleV }, // 3E
- { "new.room.v", "v", &cmdNewRoomF }, // 3F
- { "call", "n", &cmdCall }, // 40
- { "...", "", &cmdUnknown }, // 41
+ { "new.room.v", "v", &cmdNewRoomVV1 }, // 3F
+ { "call", "n", &cmdCallV1 }, // 40
+ { "...", "", &cmdUnknown }, // 41
{ "set.speed", "v", &cmdSetSpeed }, // 42
{ "move.obj.v", "nvvvv", &cmdMoveObjF }, // 43
- { "...", "", &cmdUnknown }, // 44
- { "...", "", &cmdUnknown }, // 45
- { "...", "", &cmdUnknown }, // 46
- { "...", "", &cmdUnknown }, // 47
- { "...", "nv", &cmdUnknown }, // 48 get.priority??
- { "ignore.objs", "n", &cmdIgnoreObjs }, // 49
+ { "...", "nn", &cmdUnknown }, // 44
+ { "get.v", "v", &cmdUnknown }, // 45
+ { "assign.v", "vv", &cmdUnknown }, // 46
+ { "...", "n", &cmdUnknown }, // 47
+ { "get.priority", "nv", &cmdGetPriority }, // 48
+ { "ignore.objs", "n", &cmdIgnoreObjs }, // 49
{ "observe.objs", "n", &cmdObserveObjs }, // 4A
{ "distance", "nnv", &cmdDistance }, // 4B
{ "object.on.land", "n", &cmdObjectOnLand }, // 4C
- { "...", "nv", &cmdUnknown }, // 4D set.priority.v???
- { "...", "", &cmdUnknown }, // 4E
- { "load.logics", "n", &cmdLoadLogic }, // 4F TODO: what is the other load.logics then?
- { "display", "nnns", &cmdDisplay }, // 50 TODO: 4 vs 3 args
- { "prevent.input???", "", &cmdUnknown }, // 51
- { "...", "", &cmdUnknown }, // 52
- { "...", "n", &cmdUnknown }, // 53 ???
- { "...", "", &cmdUnknown }, // 54 ???
- { "stop.motion", "", &cmdStopMotion }, // 55 or force.update??
+ { "...", "nv", &cmdUnknown }, // 4D set.priority.v???
+ { "...", "", &cmdUnknown }, // 4E
+ { "load.logics", "n", &cmdLoadLogic }, // 4F TODO: what is the other load.logics then?
+ { "display", "nnns", &cmdDisplay }, // 50 TODO: 4 vs 3 args
+ { "prevent.input???", "", &cmdUnknown }, // 51
+ { "...", "", &cmdUnknown }, // 52
+ { "...", "n", &cmdUnknown }, // 53 ???
+ { "...", "", &cmdUnknown }, // 54 ???
+ { "stop.motion", "", &cmdStopMotion }, // 55 or force.update??
{ "discard.view", "n", &cmdDiscardView }, // 56
- { "discard.pic", "v", &cmdDiscardPic }, // 57
- { "...", "nn", &cmdUnknown }, // 58
- { "...", "", &cmdUnknown }, // 59
+ { "discard.pic", "v", &cmdDiscardPic }, // 57
+ { "set.item.view", "nn", &cmdSetItemView }, // 58
+ { "...", "", &cmdUnknown }, // 59
{ "last.cel", "nv", &cmdLastCel }, // 5A
{ "set.cel.v", "nv", &cmdSetCelF }, // 5B
- { "...", "", &cmdUnknown }, // 5C
+ { "...", "", &cmdUnknown }, // 5C
{ "load.view", "n", &cmdLoadView }, // 5D
- { "...", "", &cmdUnknown }, // 5E
- { "...", "", &cmdUnknown }, // 5F
- { "setbit", "nv", &cmdUnknown }, // 60
+ { "...", "", &cmdUnknown }, // 5E
+ { "...", "", &cmdUnknown }, // 5F
+ { "setbit", "nv", &cmdUnknown }, // 60
};
AgiInstruction insV2Test[] = {
diff --git a/engines/agi/opcodes.h b/engines/agi/opcodes.h
index f45a52b611..3885c10aac 100644
--- a/engines/agi/opcodes.h
+++ b/engines/agi/opcodes.h
@@ -222,6 +222,10 @@ void cmdReleaseKey(AgiGame *state, uint8 *p);
void cmdAdjEgoMoveToXY(AgiGame *state, uint8 *p);
void cmdSetSpeed(AgiGame *state, uint8 *p);
+void cmdSetItemView(AgiGame *state, uint8 *p);
+void cmdCallV1(AgiGame *state, uint8 *p);
+void cmdNewRoomV1(AgiGame *state, uint8 *p);
+void cmdNewRoomVV1(AgiGame *state, uint8 *p);
void cmdUnknown(AgiGame *state, uint8 *p);
void condEqual(AgiGame *state, uint8 *p);