[Scummvm-cvs-logs] SF.net SVN: scummvm:[51220] scummvm/trunk/engines/sci
m_kiewitz at users.sourceforge.net
m_kiewitz at users.sourceforge.net
Fri Jul 23 22:47:15 CEST 2010
Revision: 51220
http://scummvm.svn.sourceforge.net/scummvm/?rev=51220&view=rev
Author: m_kiewitz
Date: 2010-07-23 20:47:15 +0000 (Fri, 23 Jul 2010)
Log Message:
-----------
SCI: adding new debug command logkernel
Modified Paths:
--------------
scummvm/trunk/engines/sci/console.cpp
scummvm/trunk/engines/sci/console.h
scummvm/trunk/engines/sci/engine/kernel.cpp
scummvm/trunk/engines/sci/engine/kernel.h
scummvm/trunk/engines/sci/engine/vm.cpp
Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp 2010-07-23 20:01:54 UTC (rev 51219)
+++ scummvm/trunk/engines/sci/console.cpp 2010-07-23 20:47:15 UTC (rev 51220)
@@ -168,6 +168,7 @@
DCmd_Register("disasm_addr", WRAP_METHOD(Console, cmdDisassembleAddress));
DCmd_Register("send", WRAP_METHOD(Console, cmdSend));
DCmd_Register("go", WRAP_METHOD(Console, cmdGo));
+ DCmd_Register("logkernel", WRAP_METHOD(Console, cmdLogKernel));
// Breakpoints
DCmd_Register("bp_list", WRAP_METHOD(Console, cmdBreakpointList));
DCmd_Register("bplist", WRAP_METHOD(Console, cmdBreakpointList)); // alias
@@ -374,6 +375,7 @@
DebugPrintf(" disasm_addr - Disassembles one or more commands\n");
DebugPrintf(" send - Sends a message to an object\n");
DebugPrintf(" go - Executes the script\n");
+ DebugPrintf(" logkernel - Logs kernel calls\n");
DebugPrintf("\n");
DebugPrintf("Breakpoints:\n");
DebugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n");
@@ -2690,6 +2692,31 @@
return Cmd_Exit(argc, argv);
}
+bool Console::cmdLogKernel(int argc, const char **argv) {
+ if (argc < 3) {
+ DebugPrintf("Logs calls to specified kernel function.\n");
+ DebugPrintf("Usage: %s <kernel-function> <on/off>\n", argv[0]);
+ DebugPrintf("Example: %s StrCpy on\n", argv[0]);
+ return true;
+ }
+
+ bool logging;
+ if (strcmp(argv[2], "on") == 0)
+ logging = true;
+ else if (strcmp(argv[2], "off") == 0)
+ logging = false;
+ else {
+ DebugPrintf("2nd parameter must be either on or off\n");
+ return true;
+ }
+
+ if (g_sci->getKernel()->debugSetFunctionLogging(argv[1], logging))
+ DebugPrintf("Logging %s for k%s\n", logging ? "enabled" : "disabled", argv[1]);
+ else
+ DebugPrintf("Unknown kernel function %s\n", argv[1]);
+ return true;
+}
+
bool Console::cmdBreakpointList(int argc, const char **argv) {
int i = 0;
int bpdata;
Modified: scummvm/trunk/engines/sci/console.h
===================================================================
--- scummvm/trunk/engines/sci/console.h 2010-07-23 20:01:54 UTC (rev 51219)
+++ scummvm/trunk/engines/sci/console.h 2010-07-23 20:47:15 UTC (rev 51220)
@@ -130,6 +130,7 @@
bool cmdDisassembleAddress(int argc, const char **argv);
bool cmdSend(int argc, const char **argv);
bool cmdGo(int argc, const char **argv);
+ bool cmdLogKernel(int argc, const char **argv);
// Breakpoints
bool cmdBreakpointList(int argc, const char **argv);
bool cmdBreakpointDelete(int argc, const char **argv);
Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp 2010-07-23 20:01:54 UTC (rev 51219)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp 2010-07-23 20:47:15 UTC (rev 51220)
@@ -544,7 +544,7 @@
_kernelFuncs[id].workarounds = NULL;
_kernelFuncs[id].subFunctions = NULL;
_kernelFuncs[id].subFunctionCount = 0;
- _kernelFuncs[id].debugCalls = false;
+ _kernelFuncs[id].debugLogging = false;
if (kernelName.empty()) {
// No name was given -> must be an unknown opcode
warning("Kernel function %x unknown", id);
@@ -650,6 +650,18 @@
return;
}
+bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) {
+ for (uint id = 0; id < _kernelFuncs.size(); id++) {
+ if (_kernelFuncs[id].name) {
+ if (strcmp(kernelName, _kernelFuncs[id].name) == 0) {
+ _kernelFuncs[id].debugLogging = logging;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
void Kernel::setDefaultKernelNames() {
_kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames));
Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h 2010-07-23 20:01:54 UTC (rev 51219)
+++ scummvm/trunk/engines/sci/engine/kernel.h 2010-07-23 20:47:15 UTC (rev 51220)
@@ -135,7 +135,7 @@
const SciWorkaroundEntry *workarounds;
const KernelSubFunction *subFunctions;
uint16 subFunctionCount;
- bool debugCalls;
+ bool debugLogging;
};
class Kernel {
@@ -216,6 +216,11 @@
*/
void loadKernelNames(GameFeatures *features);
+ /**
+ * Sets debugCalls flag for a kernel function
+ */
+ bool debugSetFunctionLogging(const char *kernelName, bool debugCalls);
+
private:
/**
* Sets the default kernel function names, based on the SCI version used.
Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp 2010-07-23 20:01:54 UTC (rev 51219)
+++ scummvm/trunk/engines/sci/engine/vm.cpp 2010-07-23 20:47:15 UTC (rev 51220)
@@ -642,6 +642,38 @@
xstack->type = EXEC_STACK_TYPE_KERNEL;
}
+static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int argc, reg_t *argv) {
+ Kernel *kernel = g_sci->getKernel();
+ printf("k%s: ", kernelCall->name);
+ for (int parmNr = 0; parmNr < argc; parmNr++) {
+ if (parmNr)
+ printf(", ");
+ uint16 regType = kernel->findRegType(argv[parmNr]);
+ if (regType & SIG_TYPE_NULL)
+ printf("NULL");
+ else if (regType & SIG_TYPE_UNINITIALIZED)
+ printf("UNINIT");
+ else if (regType & SIG_IS_INVALID)
+ printf("INVALID");
+ else if (regType & SIG_TYPE_INTEGER)
+ printf("%04x", argv[parmNr].offset);
+ else {
+ printf("%04x:%04x", PRINT_REG(argv[parmNr]));
+ switch (regType) {
+ case SIG_TYPE_OBJECT:
+ printf(" (%s)", s->_segMan->getObjectName(argv[parmNr]));
+ break;
+ case SIG_TYPE_REFERENCE:
+ printf(" ('%s')", s->_segMan->getString(argv[parmNr]).c_str());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ printf("\n");
+}
+
static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) {
Kernel *kernel = g_sci->getKernel();
@@ -676,6 +708,8 @@
// Call kernel function
if (!kernelCall.subFunctionCount) {
+ if (kernelCall.debugLogging)
+ logKernelCall(&kernelCall, s, argc, argv);
addKernelCallToExecStack(s, kernelCallNr, argc, argv);
s->r_acc = kernelCall.function(s, argc, argv);
} else {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list