scummvm/engines/m4/dbg/dbg_wscript.cpp
2025-02-18 22:38:35 +01:00

283 lines
5.8 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/debug.h"
#include "m4/dbg/dbg_wscript.h"
#include "m4/detection.h"
#include "m4/vars.h"
namespace M4 {
static const char *IMM_OPCODES[16] = {
"NONE",
"op_DO_NOTHING",
"op_GOTO",
"op_JUMP",
"op_TERMINATE",
"op_START_SEQ",
"op_PAUSE_SEQ",
"op_RESUME_SEQ",
"op_STORE_VAL",
"op_SEND_MSG",
"op_SEND_GMSG",
"op_REPLY_MSG",
"op_SYSTEM_MSG",
"op_TRIG",
"op_TRIG_W",
"op_CLEAR_REGS"
};
static const char *COND_OPCODES[10] = {
"op_AFTER",
"op_ON_END_SEQ",
"op_ON_MSG",
"op_ON_P_MSG",
"op_SWITCH_LT",
"op_SWITCH_LE",
"op_SWITCH_EQ",
"op_SWITCH_NE",
"op_SWITCH_GE",
"op_SWITCH_GT"
};
static const char *PCODE_OPCODES[40] = {
"op_END",
"op_CLEAR",
"op_SET",
"op_COMPARE",
"op_ADD",
"op_SUB",
"op_MULT",
"op_DIV",
"op_AND",
"op_OR",
"op_NOT",
"op_SIN",
"op_COS",
"op_ABS",
"op_MIN",
"op_MAX",
"op_MOD",
"op_FLOOR",
"op_ROUND",
"op_CEIL",
"op_POINT",
"op_DIST2D",
"op_CRUNCH",
"op_BRANCH",
"op_SETCEL",
"op_SEQ_SEND_MSG",
"op_PUSH",
"op_POP",
"op_JSR",
"op_RETURN",
"op_GET_CELS_COUNT",
"op_GET_CELS_FRAME_RATE",
"op_GET_CELS_PIX_SPEED",
"op_SET_INDEX",
"op_SET_LAYER",
"op_SET_DEPTH",
"op_SET_DATA",
"op_OPEN_STREAM_SS",
"op_NEXT_STREAM_SS",
"op_CLOSE_STREAM_SS"
};
static const char *GLOBAL_NAMES[39] = {
"GLB_TIM",
"GLB_WATCH_DOG",
"GLB_MIN_Y",
"GLB_MAX_Y",
"GLB_MIN_SCALE",
"GLB_MAX_SCALE",
"GLB_SCALER",
"GLB_TEMP_1",
"GLB_TEMP_2",
"GLB_TEMP_3",
"GLB_TEMP_4",
"GLB_TEMP_5",
"GLB_TEMP_6",
"GLB_TEMP_7",
"GLB_TEMP_8",
"GLB_TEMP_9",
"GLB_TEMP_10",
"GLB_TEMP_11",
"GLB_TEMP_12",
"GLB_TEMP_13",
"GLB_TEMP_14",
"GLB_TEMP_15",
"GLB_TEMP_16",
"GLB_TEMP_17",
"GLB_TEMP_18",
"GLB_TEMP_19",
"GLB_TEMP_20",
"GLB_TEMP_21",
"GLB_TEMP_22",
"GLB_TEMP_23",
"GLB_TEMP_24",
"GLB_TEMP_25",
"GLB_TEMP_26",
"GLB_TEMP_27",
"GLB_TEMP_28",
"GLB_TEMP_29",
"GLB_TEMP_30",
"GLB_TEMP_31",
"GLB_TEMP_32",
};
static const char *REG_NAMES[33] = {
"IDX_TIMER",
"IDX_TAG",
"IDX_LAYER",
"IDX_W",
"IDX_H",
"IDX_X",
"IDX_Y",
"IDX_S",
"IDX_R",
"IDX_CELS_HASH",
"IDX_CELS_INDEX",
"IDX_CELS_COUNT",
"IDX_CELS_FRAME_RATE",
"IDX_CELS_PIX_SPEED",
"IDX_TARG_S",
"IDX_TARG_R",
"IDX_TARG_X",
"IDX_TARG_Y",
"IDX_DELTA_S",
"IDX_DELTA_R",
"IDX_DELTA_X",
"IDX_DELTA_Y",
"IDX_VELOCITY",
"IDX_THETA",
"IDX_ZTEMP1",
"IDX_ZTEMP2",
"IDX_ZTEMP3",
"IDX_ZTEMP4",
"IDX_ZTEMP5",
"IDX_ZTEMP6",
"IDX_ZTEMP7",
"IDX_ZTEMP8",
"IDX_MACH_ID"
};
static char g_instructionText[256];
bool g_hasParams;
bool g_isPcode;
bool dbg_ws_init(bool showTheScreen, Font *useThisFont, frac16 *theGlobals) {
return true;
}
void dbg_ws_shutdown() {
// No implementation
}
void dbg_SetCurrMachInstr(machine *m, int32 pcOffset, bool isPcode) {
if (debugChannelSet(1, kDebugScripts)) {
Common::sprintf_s(g_instructionText, "%s (%.4x): ",
m ? m->machName : "NONE", pcOffset);
g_hasParams = false;
g_isPcode = isPcode;
}
}
void dbg_AddOpcodeToMachineInstr(int instruction) {
if (debugChannelSet(1, kDebugScripts)) {
if (g_isPcode) {
Common::strcat_s(g_instructionText, PCODE_OPCODES[instruction]);
} else if (instruction >= 64)
Common::strcat_s(g_instructionText, COND_OPCODES[instruction - 64]);
else if (instruction >= 16 || instruction < 0)
warning("dbg_AddOpcodeToMachineInstr - Unexpected value for instruction: %d", instruction);
else
Common::strcat_s(g_instructionText, IMM_OPCODES[instruction]);
Common::strcat_s(g_instructionText, " ");
}
}
void dbg_AddParamToCurrMachInstr(const char *param) {
if (debugChannelSet(1, kDebugScripts)) {
if (g_hasParams)
Common::strcat_s(g_instructionText, ", ");
Common::strcat_s(g_instructionText, param);
g_hasParams = true;
}
}
void dbg_AddGlobalParamToCurrMachInstr(int num, const char *prefix) {
if (debugChannelSet(1, kDebugScripts)) {
Common::String param;
if (prefix && *prefix)
param = Common::String::format("%s ", prefix);
param += (num < 39) ? GLOBAL_NAMES[num] :
Common::String::format("REG %d", num);
dbg_AddParamToCurrMachInstr(param.c_str());
}
}
void dbg_AddRegParamToCurrMachInstr(int num, const char *prefix) {
if (debugChannelSet(1, kDebugScripts)) {
Common::String param;
if (prefix && *prefix)
param = Common::String::format("%s ", prefix);
param += (num < 33) ? REG_NAMES[num] :
Common::String::format("REG %d", num);
dbg_AddParamToCurrMachInstr(param.c_str());
}
}
void dbg_EndCurrMachInstr() {
debugC(1, kDebugScripts, "%s", g_instructionText);
}
void dbg_SetCurrSequInstr(Anim8 *myAnim8, int32 compareCCR) {
// No implementation
}
void dbg_ws_update() {
// No implementation
}
void dbg_LaunchSequence(Anim8 *myAnim8) {
// No implementation
}
void dbg_DebugWSMach(machine *m, bool debug) {
// No implementation
}
void dbg_DebugNextCycle() {
// No implementation
}
void dbg_RemoveWSMach(machine *m) {
// No implementation
}
void dbg_WSError(Common::WriteStream *logFile, machine *m, int32 errorType,
const char *errDesc, const char *errMsg, int32 pcOffset) {
// No implementation
}
} // namespace M4