diff options
author | Jussi Pitkanen | 2011-06-25 12:06:28 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2011-08-13 23:27:24 +0100 |
commit | af691e46c4ccbe0457d2a7d5a4386d9287518740 (patch) | |
tree | 1f78d48f29b1ec5a2cd08341d13db27df4b2b583 /engines/agi | |
parent | 1dbe5bfccfb3d10b31ea9b5ac567165c650b3f98 (diff) | |
download | scummvm-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.h | 4 | ||||
-rw-r--r-- | engines/agi/op_cmd.cpp | 57 | ||||
-rw-r--r-- | engines/agi/opcodes.cpp | 118 | ||||
-rw-r--r-- | engines/agi/opcodes.h | 4 |
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); |