aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/kernel.cpp')
-rw-r--r--engines/sci/engine/kernel.cpp80
1 files changed, 36 insertions, 44 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index d3bcae508c..3b998c7092 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -298,21 +298,14 @@ static const char *sci1_default_knames[SCI1_KNAMES_DEFAULT_ENTRIES_NR] = {
/*0x88*/ "DbugStr"
};
-enum KernelFuncType {
- KF_NEW = 1,
- KF_NONE = -1, /**< No mapping, but name is known */
- KF_TERMINATOR = -42 /**< terminates kfunct_mappers */
-};
-
struct SciKernelFunction {
- KernelFuncType type;
const char *name;
KernelFunc *fun; /* The actual function */
const char *signature; /* kfunct signature */
};
-#define DEFUN(nm, cname, sig) {KF_NEW, nm, cname, sig}
-#define NOFUN(nm) {KF_NONE, nm, NULL, NULL}
+#define DEFUN(name, fun, sig) {name, fun, sig}
+#define NOFUN(name) {name, NULL, NULL}
SciKernelFunction kfunct_mappers[] = {
/*00*/ DEFUN("Load", kLoad, "iii*"),
@@ -434,8 +427,8 @@ SciKernelFunction kfunct_mappers[] = {
/*6f*/ DEFUN("6f", kTimesCos, "ii"),
/*70*/ DEFUN("Graph", kGraph, ".*"),
/*71*/ DEFUN("Joystick", kJoystick, ".*"),
- /*72*/ NOFUN(NULL),
- /*73*/ NOFUN(NULL),
+ /*72*/ NOFUN("unknown72"),
+ /*73*/ NOFUN("unknown73"),
// Experimental functions
/*74*/ DEFUN("FileIO", kFileIO, "i.*"),
@@ -464,9 +457,9 @@ SciKernelFunction kfunct_mappers[] = {
DEFUN("SetVideoMode", kSetVideoMode, "i"),
// Special and NOP stuff
- {KF_NEW, NULL, k_Unknown, NULL},
+ {NULL, k_Unknown, NULL},
- {KF_TERMINATOR, NULL, NULL, NULL} // Terminator
+ {NULL, NULL, NULL} // Terminator
};
static const char *argtype_description[] = {
@@ -673,50 +666,49 @@ void Kernel::mapFunctions() {
functions_nr = max_functions_nr;
}
- _kfuncTable.resize(functions_nr);
+ _kernelFuncs.resize(functions_nr);
for (uint functnr = 0; functnr < functions_nr; functnr++) {
- int seeker, found = -1;
- Common::String sought_name;
+ int found = -1;
+ // First, get the name, if known, of the kernel function with number functnr
+ Common::String sought_name;
if (functnr < getKernelNamesSize())
sought_name = getKernelName(functnr);
- if (!sought_name.empty())
- for (seeker = 0; (found == -1) && kfunct_mappers[seeker].type != KF_TERMINATOR; seeker++)
- if (kfunct_mappers[seeker].name && sought_name == kfunct_mappers[seeker].name)
- found = seeker; // Found a kernel function with the same name!
+ // If the name is known, look it up in kfunct_mappers. This table
+ // maps kernel func names to actual function (pointers).
+ if (!sought_name.empty()) {
+ for (uint seeker = 0; (found == -1) && kfunct_mappers[seeker].name; seeker++)
+ if (sought_name == kfunct_mappers[seeker].name)
+ found = seeker; // Found a kernel function with the correct name!
+ }
+
+ // Reset the table entry
+ _kernelFuncs[functnr].fun = NULL;
+ _kernelFuncs[functnr].signature = NULL;
+ _kernelFuncs[functnr].orig_name = sought_name;
if (found == -1) {
if (!sought_name.empty()) {
- warning("Kernel function %s[%x] unmapped", getKernelName(functnr).c_str(), functnr);
- _kfuncTable[functnr].fun = kNOP;
+ // No match but a name was given -> NOP
+ warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functnr);
+ _kernelFuncs[functnr].fun = kNOP;
} else {
+ // No match and no name was given -> must be an unknown opcode
warning("Flagging kernel function %x as unknown", functnr);
- _kfuncTable[functnr].fun = k_Unknown;
+ _kernelFuncs[functnr].fun = k_Unknown;
}
-
- _kfuncTable[functnr].signature = NULL;
- _kfuncTable[functnr].orig_name = sought_name;
- } else
- switch (kfunct_mappers[found].type) {
- case KF_NONE:
- _kfuncTable[functnr].signature = NULL;
- ++ignored;
- break;
-
- case KF_NEW:
- _kfuncTable[functnr].fun = kfunct_mappers[found].fun;
- _kfuncTable[functnr].signature = kfunct_mappers[found].signature;
- _kfuncTable[functnr].orig_name.clear();
- kernel_compile_signature(&(_kfuncTable[functnr].signature));
+ } else {
+ // A match in kfunct_mappers was found
+ if (kfunct_mappers[found].fun) {
+ _kernelFuncs[functnr].fun = kfunct_mappers[found].fun;
+ _kernelFuncs[functnr].signature = kfunct_mappers[found].signature;
+ kernel_compile_signature(&(_kernelFuncs[functnr].signature));
++mapped;
- break;
- case KF_TERMINATOR:
- error("Unexpectedly encountered KF_TERMINATOR");
- break;
- }
-
+ } else
+ ++ignored;
+ }
} // for all functions requesting to be mapped
sciprintf("Handled %d/%d kernel functions, mapping %d", mapped + ignored, getKernelNamesSize(), mapped);