mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-24 03:24:50 +00:00
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.
This commit is contained in:
parent
1dbe5bfccf
commit
af691e46c4
@ -640,6 +640,10 @@ struct AgiGame {
|
||||
|
||||
// IF condition handling
|
||||
int testResult;
|
||||
|
||||
|
||||
int max_logics;
|
||||
int logic_list[256];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
|
@ -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[] = {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user