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:
Jussi Pitkanen 2011-06-25 12:06:28 +03:00 committed by Eugene Sandulenko
parent 1dbe5bfccf
commit af691e46c4
4 changed files with 122 additions and 61 deletions

View File

@ -640,6 +640,10 @@ struct AgiGame {
// IF condition handling
int testResult;
int max_logics;
int logic_list[256];
};
/**

View File

@ -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

View File

@ -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[] = {

View File

@ -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);