scummvm/engines/agi/op_dbg.cpp
Max Horn 03953bf292 AGI: Remove some global vars
svn-id: r45255
2009-10-19 22:51:37 +00:00

344 lines
10 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#include "agi/agi.h"
#include "agi/opcodes.h"
namespace Agi {
#define ip (_game.logics[lognum].cIP)
#define code (_game.logics[lognum].data)
#ifdef _L
#undef _L
#endif
#define _L(a,b,c) { a, b, c }
struct AgiLogicnames logicNamesTest[] = {
_L("", 0, 0x00),
_L("equaln", 2, 0x80),
_L("equalv", 2, 0xC0),
_L("lessn", 2, 0x80),
_L("lessv", 2, 0xC0),
_L("greatern", 2, 0x80),
_L("greaterv", 2, 0xC0),
_L("isset", 1, 0x00),
_L("issetv", 1, 0x80),
_L("has", 1, 0x00),
_L("obj.in.room", 2, 0x40),
_L("posn", 5, 0x00),
_L("controller", 1, 0x00),
_L("have.key", 0, 0x00),
// Not 0 args. Has variable number.
_L("said", 0, 0x00),
_L("compare.strings", 2, 0x00),
_L("obj.in.box", 5, 0x00),
_L("center.posn", 5, 0x00),
_L("right.posn", 5, 0x00),
// Haven't seen an official name for this command so tried to name it descriptively.
_L("in.motion.using.mouse", 0, 0x00)
};
struct AgiLogicnames logicNamesIf[] = {
_L("OR", 0, 0x00),
_L("NOT", 0, 0x00),
_L("ELSE", 0, 0x00),
_L("IF", 0, 0x00)
};
struct AgiLogicnames logicNamesCmd[] = {
_L("return", 0, 0x00), // 00
_L("increment", 1, 0x80), // 01
_L("decrement", 1, 0x80), // 02
_L("assignn", 2, 0x80), // 03
_L("assignv", 2, 0xC0), // 04
_L("addn", 2, 0x80), // 05
_L("addv", 2, 0xC0), // 06
_L("subn", 2, 0x80), // 07
_L("subv", 2, 0xC0), // 08
_L("lindirectv", 2, 0xC0), // 09
_L("rindirect", 2, 0xC0), // 0A
_L("lindirectn", 2, 0x80), // 0B
_L("set", 1, 0x00), // 0C
_L("reset", 1, 0x00), // 0D
_L("toggle", 1, 0x00), // 0E
_L("set.v", 1, 0x80), // 0F
_L("reset.v", 1, 0x80), // 10
_L("toggle.v", 1, 0x80), // 11
_L("new.room", 1, 0x00), // 12
_L("new.room.v", 1, 0x80), // 13
_L("load.logics", 1, 0x00), // 14
_L("load.logics.v", 1, 0x80), // 15
_L("call", 1, 0x00), // 16
_L("call.v", 1, 0x80), // 17
_L("load.pic", 1, 0x80), // 18
_L("draw.pic", 1, 0x80), // 19
_L("show.pic", 0, 0x00), // 1A
_L("discard.pic", 1, 0x80), // 1B
_L("overlay.pic", 1, 0x80), // 1C
_L("show.pri.screen", 0, 0x00), // 1D
_L("load.view", 1, 0x00), // 1E
_L("load.view.v", 1, 0x80), // 1F
_L("discard.view", 1, 0x00), // 20
_L("animate.obj", 1, 0x00), // 21
_L("unanimate.all", 0, 0x00), // 22
_L("draw", 1, 0x00), // 23
_L("erase", 1, 0x00), // 24
_L("position", 3, 0x00), // 25
_L("position.v", 3, 0x60), // 26
_L("get.posn", 3, 0x60), // 27
_L("reposition", 3, 0x60), // 28
_L("set.view", 2, 0x00), // 29
_L("set.view.v", 2, 0x40), // 2A
_L("set.loop", 2, 0x00), // 2B
_L("set.loop.v", 2, 0x40), // 2C
_L("fix.loop", 1, 0x00), // 2D
_L("release.loop", 1, 0x00), // 2E
_L("set.cel", 2, 0x00), // 2F
_L("set.cel.v", 2, 0x40), // 30
_L("last.cel", 2, 0x40), // 31
_L("current.cel", 2, 0x40), // 32
_L("current.loop", 2, 0x40), // 33
_L("current.view", 2, 0x40), // 34
_L("number.of.loops", 2, 0x40), // 35
_L("set.priority", 2, 0x00), // 36
_L("set.priority.v", 2, 0x40), // 37
_L("release.priority", 1, 0x00), // 38
_L("get.priority", 2, 0x40), // 39
_L("stop.update", 1, 0x00), // 3A
_L("start.update", 1, 0x00), // 3B
_L("force.update", 1, 0x00), // 3C
_L("ignore.horizon", 1, 0x00), // 3D
_L("observe.horizon", 1, 0x00), // 3E
_L("set.horizon", 1, 0x00), // 3F
_L("object.on.water", 1, 0x00), // 40
_L("object.on.land", 1, 0x00), // 41
_L("object.on.anything", 1, 0x00), // 42
_L("ignore.objs", 1, 0x00), // 43
_L("observe.objs", 1, 0x00), // 44
_L("distance", 3, 0x20), // 45
_L("stop.cycling", 1, 0x00), // 46
_L("start.cycling", 1, 0x00), // 47
_L("normal.cycle", 1, 0x00), // 48
_L("end.of.loop", 2, 0x00), // 49
_L("reverse.cycle", 1, 0x00), // 4A
_L("reverse.loop", 2, 0x00), // 4B
_L("cycle.time", 2, 0x40), // 4C
_L("stop.motion", 1, 0x00), // 4D
_L("start.motion", 1, 0x00), // 4E
_L("step.size", 2, 0x40), // 4F
_L("step.time", 2, 0x40), // 50
_L("move.obj", 5, 0x00), // 51
_L("move.obj.v", 5, 0x70), // 52
_L("follow.ego", 3, 0x00), // 53
_L("wander", 1, 0x00), // 54
_L("normal.motion", 1, 0x00), // 55
_L("set.dir", 2, 0x40), // 56
_L("get.dir", 2, 0x40), // 57
_L("ignore.blocks", 1, 0x00), // 58
_L("observe.blocks", 1, 0x00), // 59
_L("block", 4, 0x00), // 5A
_L("unblock", 0, 0x00), // 5B
_L("get", 1, 0x00), // 5C
_L("get.v", 1, 0x80), // 5D
_L("drop", 1, 0x00), // 5E
_L("put", 2, 0x00), // 5F
_L("put.v", 2, 0x40), // 60
_L("get.room.v", 2, 0xC0), // 61
_L("load.sound", 1, 0x00), // 62
_L("sound", 2, 0x00), // 63
_L("stop.sound", 0, 0x00), // 64
_L("print", 1, 0x00), // 65
_L("print.v", 1, 0x80), // 66
_L("display", 3, 0x00), // 67
_L("display.v", 3, 0xE0), // 68
_L("clear.lines", 3, 0x00), // 69
_L("text.screen", 0, 0x00), // 6A
_L("graphics", 0, 0x00), // 6B
_L("set.cursor.char", 1, 0x00), // 6C
_L("set.text.attribute", 2, 0x00), // 6D
_L("shake.screen", 1, 0x00), // 6E
_L("configure.screen", 3, 0x00), // 6F
_L("status.line.on", 0, 0x00), // 70
_L("status.line.off", 0, 0x00), // 71
_L("set.string", 2, 0x00), // 72
_L("get.string", 5, 0x00), // 73
_L("word.to.string", 2, 0x00), // 74
_L("parse", 1, 0x00), // 75
_L("get.num", 2, 0x40), // 76
_L("prevent.input", 0, 0x00), // 77
_L("accept.input", 0, 0x00), // 78
_L("set.key", 3, 0x00), // 79
_L("add.to.pic", 7, 0x00), // 7A
_L("add.to.pic.v", 7, 0xFE), // 7B
_L("status", 0, 0x00), // 7C
_L("save.game", 0, 0x00), // 7D
_L("restore.game", 0, 0x00), // 7E
_L("init.disk", 0, 0x00), // 7F
_L("restart.game", 0, 0x00), // 80
_L("show.obj", 1, 0x00), // 81
_L("random", 3, 0x20), // 82
_L("program.control", 0, 0x00), // 83
_L("player.control", 0, 0x00), // 84
_L("obj.status.v", 1, 0x80), // 85
// 0 args for AGI version 2.089
_L("quit", 1, 0x00), // 86
_L("show.mem", 0, 0x00), // 87
_L("pause", 0, 0x00), // 88
_L("echo.line", 0, 0x00), // 89
_L("cancel.line", 0, 0x00), // 8A
_L("init.joy", 0, 0x00), // 8B
_L("toggle.monitor", 0, 0x00), // 8C
_L("version", 0, 0x00), // 8D
_L("script.size", 1, 0x00), // 8E
_L("set.game.id", 1, 0x00), // 8F
_L("log", 1, 0x00), // 90
_L("set.scan.start", 0, 0x00), // 91
_L("reset.scan.start", 0, 0x00), // 92
_L("reposition.to", 3, 0x00), // 93
_L("reposition.to.v", 3, 0x60), // 94
_L("trace.on", 0, 0x00), // 95
_L("trace.info", 3, 0x00), // 96
// 3 args for AGI versions before 2.440
_L("print.at", 4, 0x00), // 97
_L("print.at.v", 4, 0x80), // 98
_L("discard.view.v", 1, 0x80), // 99
_L("clear.text.rect", 5, 0x00), // 9A
_L("set.upper.left", 2, 0x00), // 9B
_L("set.menu", 1, 0x00), // 9C
_L("set.menu.item", 2, 0x00), // 9D
_L("submit.menu", 0, 0x00), // 9E
_L("enable.item", 1, 0x00), // 9F
_L("disable.item", 1, 0x00), // A0
_L("menu.input", 0, 0x00), // A1
_L("show.obj.v", 1, 0x01), // A2
_L("open.dialogue", 0, 0x00), // A3
_L("close.dialogue", 0, 0x00), // A4
_L("mul.n", 2, 0x80), // A5
_L("mul.v", 2, 0xC0), // A6
_L("div.n", 2, 0x80), // A7
_L("div.v", 2, 0xC0), // A8
_L("close.window", 0, 0x00), // A9
_L("set.simple", 1, 0x00), // AA
_L("push.script", 0, 0x00), // AB
_L("pop.script", 0, 0x00), // AC
_L("hold.key", 0, 0x00), // AD
_L("set.pri.base", 1, 0x00), // AE
_L("discard.sound", 1, 0x00), // AF
// 1 arg for AGI version 3.002.086
_L("hide.mouse", 0, 0x00), // B0
_L("allow.menu", 1, 0x00), // B1
_L("show.mouse", 0, 0x00), // B2
_L("fence.mouse", 4, 0x00), // B3
_L("mouse.posn", 2, 0x00), // B4
_L("release.key", 0, 0x00), // B5
// 2 args for at least the Amiga Gold Rush! (v2.05 1989-03-09) using Amiga AGI 2.316.
_L("adj.ego.move.to.xy", 0, 0x00), // B6
_L(NULL, 0, 0x00)
};
void AgiEngine::debugConsole(int lognum, int mode, const char *str) {
AgiLogicnames *x;
uint8 a, c, z;
if (str) {
report(" %s\n", str);
return;
}
report("%03d:%04x ", lognum, ip);
switch (*(code + ip)) {
case 0xFC:
case 0xFD:
case 0xFE:
case 0xFF:
x = logicNamesIf;
if (_debug.opcodes) {
report("%02X %02X %02X %02X %02X %02X %02X %02X %02X\n"
" ",
(uint8)*(code + (0 + ip)) & 0xFF,
(uint8)*(code + (1 + ip)) & 0xFF,
(uint8)*(code + (2 + ip)) & 0xFF,
(uint8)*(code + (3 + ip)) & 0xFF,
(uint8)*(code + (4 + ip)) & 0xFF,
(uint8)*(code + (5 + ip)) & 0xFF,
(uint8)*(code + (6 + ip)) & 0xFF,
(uint8)*(code + (7 + ip)) & 0xFF,
(uint8)*(code + (8 + ip)) & 0xFF);
}
report("%s ", (x + *(code + ip) - 0xFC)->name);
break;
default:
x = mode == lCOMMAND_MODE ? logicNamesCmd : logicNamesTest;
a = (unsigned char)(x + *(code + ip))->numArgs;
c = (unsigned char)(x + *(code + ip))->argMask;
if (_debug.opcodes) {
report("%02X %02X %02X %02X %02X %02X %02X %02X %02X\n"
" ",
(uint8)*(code + (0 + ip)) & 0xFF,
(uint8)*(code + (1 + ip)) & 0xFF,
(uint8)*(code + (2 + ip)) & 0xFF,
(uint8)*(code + (3 + ip)) & 0xFF,
(uint8)*(code + (4 + ip)) & 0xFF,
(uint8)*(code + (5 + ip)) & 0xFF,
(uint8)*(code + (6 + ip)) & 0xFF,
(uint8)*(code + (7 + ip)) & 0xFF,
(uint8)*(code + (8 + ip)) & 0xFF);
}
report("%s ", (x + *(code + ip))->name);
for (z = 1; a > 0;) {
if (~c & 0x80) {
report("%d", *(code + (ip + z)));
} else {
report("v%d[%d]", *(code + (ip + z)), getvar(*(code + (ip + z))));
}
c <<= 1;
z++;
if (--a > 0)
report(",");
}
break;
}
report("\n");
}
} // End of namespace Agi