/* 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