- Replaced more cases of EngineState parameters

- Made some version comparisons for old SCI0 versions easier to read
- Removed the GET_SEL32SV macro

svn-id: r43729
This commit is contained in:
Filippos Karapetis 2009-08-25 15:14:29 +00:00
parent 70a63a8dbd
commit ac025f4294
22 changed files with 237 additions and 199 deletions

View file

@ -2735,7 +2735,7 @@ bool Console::cmdStopSfx(int argc, const char **argv) {
} }
int handle = id.segment << 16 | id.offset; // frobnicate handle int handle = id.segment << 16 | id.offset; // frobnicate handle
EngineState* s = _vm->_gamestate; // for PUT_SEL32V SegManager *segManager = _vm->_gamestate->segmentManager; // for PUT_SEL32V
if (id.segment) { if (id.segment) {
_vm->_gamestate->_sound.sfx_song_set_status(handle, SOUND_STATUS_STOPPED); _vm->_gamestate->_sound.sfx_song_set_status(handle, SOUND_STATUS_STOPPED);

View file

@ -102,7 +102,7 @@ reg_t_hash_map *find_all_used_references(EngineState *s) {
wm.push(es.objp); wm.push(es.objp);
wm.push(es.sendp); wm.push(es.sendp);
if (es.type == EXEC_STACK_TYPE_VARSELECTOR) if (es.type == EXEC_STACK_TYPE_VARSELECTOR)
wm.push(*(es.getVarPointer(s))); wm.push(*(es.getVarPointer(s->segmentManager)));
} }
} }

View file

@ -422,6 +422,7 @@ void Kernel::detectSciFeatures() {
void Kernel::loadSelectorNames() { void Kernel::loadSelectorNames() {
Resource *r = _resourceManager->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0); Resource *r = _resourceManager->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
bool oldScriptHeader = (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY);
if (!r) { // No such resource? if (!r) { // No such resource?
// Check if we have a table for this game // Check if we have a table for this game
@ -433,7 +434,7 @@ void Kernel::loadSelectorNames() {
for (uint32 i = 0; i < staticSelectorTable.size(); i++) { for (uint32 i = 0; i < staticSelectorTable.size(); i++) {
_selectorNames.push_back(staticSelectorTable[i]); _selectorNames.push_back(staticSelectorTable[i]);
if (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY) if (oldScriptHeader)
_selectorNames.push_back(staticSelectorTable[i]); _selectorNames.push_back(staticSelectorTable[i]);
} }
@ -452,7 +453,7 @@ void Kernel::loadSelectorNames() {
// Early SCI versions used the LSB in the selector ID as a read/write // Early SCI versions used the LSB in the selector ID as a read/write
// toggle. To compensate for that, we add every selector name twice. // toggle. To compensate for that, we add every selector name twice.
if (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY) if (oldScriptHeader)
_selectorNames.push_back(tmp); _selectorNames.push_back(tmp);
} }
} }
@ -714,14 +715,14 @@ const char *kernel_argtype_description(int type) {
return argtype_description[sci_ffs(type)]; return argtype_description[sci_ffs(type)];
} }
bool kernel_matches_signature(EngineState *s, const char *sig, int argc, const reg_t *argv) { bool kernel_matches_signature(SegManager *segManager, const char *sig, int argc, const reg_t *argv) {
// Always "match" if no signature is given // Always "match" if no signature is given
if (!sig) if (!sig)
return true; return true;
while (*sig && argc) { while (*sig && argc) {
if ((*sig & KSIG_ANY) != KSIG_ANY) { if ((*sig & KSIG_ANY) != KSIG_ANY) {
int type = determine_reg_type(s->segmentManager, *argv, *sig & KSIG_ALLOW_INV); int type = determine_reg_type(segManager, *argv, *sig & KSIG_ALLOW_INV);
if (!type) { if (!type) {
warning("[KERN] Could not determine type of ref %04x:%04x; failing signature check", PRINT_REG(*argv)); warning("[KERN] Could not determine type of ref %04x:%04x; failing signature check", PRINT_REG(*argv));
@ -750,9 +751,9 @@ bool kernel_matches_signature(EngineState *s, const char *sig, int argc, const r
return (*sig == 0 || (*sig & KSIG_ELLIPSIS)); return (*sig == 0 || (*sig & KSIG_ELLIPSIS));
} }
static void *_kernel_dereference_pointer(EngineState *s, reg_t pointer, int entries, int align) { static void *_kernel_dereference_pointer(SegManager *segManager, reg_t pointer, int entries, int align) {
int maxsize; int maxsize;
void *retval = s->segmentManager->dereference(pointer, &maxsize); void *retval = segManager->dereference(pointer, &maxsize);
if (!retval) if (!retval)
return NULL; return NULL;
@ -770,12 +771,12 @@ static void *_kernel_dereference_pointer(EngineState *s, reg_t pointer, int entr
} }
byte *kernel_dereference_bulk_pointer(EngineState *s, reg_t pointer, int entries) { byte *kernel_dereference_bulk_pointer(SegManager *segManager, reg_t pointer, int entries) {
return (byte*)_kernel_dereference_pointer(s, pointer, entries, 1); return (byte*)_kernel_dereference_pointer(segManager, pointer, entries, 1);
} }
reg_t *kernel_dereference_reg_pointer(EngineState *s, reg_t pointer, int entries) { reg_t *kernel_dereference_reg_pointer(SegManager *segManager, reg_t pointer, int entries) {
return (reg_t*)_kernel_dereference_pointer(s, pointer, entries, sizeof(reg_t)); return (reg_t*)_kernel_dereference_pointer(segManager, pointer, entries, sizeof(reg_t));
} }
void Kernel::setDefaultKernelNames() { void Kernel::setDefaultKernelNames() {

View file

@ -187,9 +187,8 @@ enum SelectorInvocation {
kContinueOnInvalidSelector = 1 kContinueOnInvalidSelector = 1
}; };
#define GET_SEL32(_o_, _slc_) read_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, __FILE__, __LINE__) #define GET_SEL32(_o_, _slc_) read_selector(segManager, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, __FILE__, __LINE__)
#define GET_SEL32V(_o_, _slc_) (GET_SEL32(_o_, _slc_).offset) #define GET_SEL32V(_o_, _slc_) (GET_SEL32(_o_, _slc_).offset)
#define GET_SEL32SV(_o_, _slc_) ((int16)(GET_SEL32(_o_, _slc_).offset))
/* Retrieves a selector from an object /* Retrieves a selector from an object
** Parameters: (reg_t) object: The address of the object which the selector should be read from ** Parameters: (reg_t) object: The address of the object which the selector should be read from
** (selector_name) selector: The selector to read ** (selector_name) selector: The selector to read
@ -198,8 +197,8 @@ enum SelectorInvocation {
** selector_map_t and mapped in script.c. ** selector_map_t and mapped in script.c.
*/ */
#define PUT_SEL32(_o_, _slc_, _val_) write_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, _val_, __FILE__, __LINE__) #define PUT_SEL32(_o_, _slc_, _val_) write_selector(segManager, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, _val_, __FILE__, __LINE__)
#define PUT_SEL32V(_o_, _slc_, _val_) write_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, make_reg(0, _val_), __FILE__, __LINE__) #define PUT_SEL32V(_o_, _slc_, _val_) write_selector(segManager, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, make_reg(0, _val_), __FILE__, __LINE__)
/* Writes a selector value to an object /* Writes a selector value to an object
** Parameters: (reg_t) object: The address of the object which the selector should be written to ** Parameters: (reg_t) object: The address of the object which the selector should be written to
** (selector_name) selector: The selector to read ** (selector_name) selector: The selector to read
@ -217,8 +216,8 @@ enum SelectorInvocation {
*/ */
reg_t read_selector(EngineState *s, reg_t object, Selector selector_id, const char *fname, int line); reg_t read_selector(SegManager *segManager, reg_t object, Selector selector_id, const char *fname, int line);
void write_selector(EngineState *s, reg_t object, Selector selector_id, reg_t value, const char *fname, int line); void write_selector(SegManager *segManager, reg_t object, Selector selector_id, reg_t value, const char *fname, int line);
int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid, int kfunct, int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid, int kfunct,
StackPtr k_argp, int k_argc, const char *fname, int line, int argc, ...); StackPtr k_argp, int k_argc, const char *fname, int line, int argc, ...);
@ -260,8 +259,8 @@ bool is_object(SegManager *segManager, reg_t obj);
* if not enugh entries were available. * if not enugh entries were available.
* reg_t dereferenciation also assures alignedness of data. * reg_t dereferenciation also assures alignedness of data.
*/ */
reg_t *kernel_dereference_reg_pointer(EngineState *s, reg_t pointer, int entries); reg_t *kernel_dereference_reg_pointer(SegManager *segManager, reg_t pointer, int entries);
byte *kernel_dereference_bulk_pointer(EngineState *s, reg_t pointer, int entries); byte *kernel_dereference_bulk_pointer(SegManager *segManager, reg_t pointer, int entries);
#define kernel_dereference_char_pointer(state, pointer, entries) (char*)kernel_dereference_bulk_pointer(state, pointer, entries) #define kernel_dereference_char_pointer(state, pointer, entries) (char*)kernel_dereference_bulk_pointer(state, pointer, entries)
/******************** Priority macros/functions ********************/ /******************** Priority macros/functions ********************/

View file

@ -75,7 +75,7 @@ namespace Sci {
* @param argv argument list * @param argv argument list
* @return true if the signature was matched, false otherwise * @return true if the signature was matched, false otherwise
*/ */
bool kernel_matches_signature(EngineState *s, const char *sig, int argc, const reg_t *argv); bool kernel_matches_signature(SegManager *segManager, const char *sig, int argc, const reg_t *argv);
/** /**
* Determines the type of the object indicated by reg. * Determines the type of the object indicated by reg.

View file

@ -41,6 +41,7 @@ reg_t kGetEvent(EngineState *s, int funct_nr, int argc, reg_t *argv) {
sci_event_t e; sci_event_t e;
int oldx, oldy; int oldx, oldy;
int modifier_mask = s->resourceManager->sciVersion() <= SCI_VERSION_01 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK; int modifier_mask = s->resourceManager->sciVersion() <= SCI_VERSION_01 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK;
SegManager *segManager = s->segmentManager;
// If there's a simkey pending, and the game wants a keyboard event, use the // If there's a simkey pending, and the game wants a keyboard event, use the
// simkey instead of a normal event // simkey instead of a normal event
@ -152,6 +153,7 @@ reg_t kGetEvent(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kMapKeyToDir(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kMapKeyToDir(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t obj = argv[0]; reg_t obj = argv[0];
SegManager *segManager = s->segmentManager;
if (GET_SEL32V(obj, type) == SCI_EVT_KEYBOARD) { // Keyboard if (GET_SEL32V(obj, type) == SCI_EVT_KEYBOARD) { // Keyboard
int mover = -1; int mover = -1;
@ -201,6 +203,7 @@ reg_t kMapKeyToDir(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kGlobalToLocal(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kGlobalToLocal(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars
SegManager *segManager = s->segmentManager;
if (obj.segment) { if (obj.segment) {
int x = GET_SEL32V(obj, x); int x = GET_SEL32V(obj, x);
@ -216,6 +219,7 @@ reg_t kGlobalToLocal(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kLocalToGlobal(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kLocalToGlobal(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars
SegManager *segManager = s->segmentManager;
if (obj.segment) { if (obj.segment) {
int x = GET_SEL32V(obj, x); int x = GET_SEL32V(obj, x);

View file

@ -196,7 +196,7 @@ void file_open(EngineState *s, const char *filename, int mode) {
} }
reg_t kFOpen(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kFOpen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *name = kernel_dereference_char_pointer(s, argv[0], 0); char *name = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
int mode = argv[1].toUint16(); int mode = argv[1].toUint16();
debug(3, "kFOpen(%s,0x%x)", name, mode); debug(3, "kFOpen(%s,0x%x)", name, mode);
@ -249,7 +249,7 @@ void fwrite_wrapper(EngineState *s, int handle, char *data, int length) {
reg_t kFPuts(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kFPuts(EngineState *s, int funct_nr, int argc, reg_t *argv) {
int handle = argv[0].toUint16(); int handle = argv[0].toUint16();
char *data = kernel_dereference_char_pointer(s, argv[1], 0); char *data = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
fwrite_wrapper(s, handle, data, strlen(data)); fwrite_wrapper(s, handle, data, strlen(data));
return s->r_acc; return s->r_acc;
@ -306,7 +306,7 @@ static void fseek_wrapper(EngineState *s, int handle, int offset, int whence) {
} }
reg_t kFGets(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kFGets(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *dest = kernel_dereference_char_pointer(s, argv[0], 0); char *dest = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
int maxsize = argv[1].toUint16(); int maxsize = argv[1].toUint16();
int handle = argv[2].toUint16(); int handle = argv[2].toUint16();
@ -319,7 +319,7 @@ reg_t kFGets(EngineState *s, int funct_nr, int argc, reg_t *argv) {
* Writes the cwd to the supplied address and returns the address in acc. * Writes the cwd to the supplied address and returns the address in acc.
*/ */
reg_t kGetCWD(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kGetCWD(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *targetaddr = kernel_dereference_char_pointer(s, argv[0], 0); char *targetaddr = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
// We do not let the scripts see the file system, instead pretending // We do not let the scripts see the file system, instead pretending
// we are always in the same directory. // we are always in the same directory.
@ -355,8 +355,8 @@ reg_t kDeviceInfo(EngineState *s, int funct_nr, int argc, reg_t *argv) {
switch (mode) { switch (mode) {
case K_DEVICE_INFO_GET_DEVICE: case K_DEVICE_INFO_GET_DEVICE:
input_s = kernel_dereference_char_pointer(s, argv[1], 0); input_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
output_s = kernel_dereference_char_pointer(s, argv[2], 0); output_s = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
assert(input_s != output_s); assert(input_s != output_s);
strcpy(output_s, "/"); strcpy(output_s, "/");
@ -364,15 +364,15 @@ reg_t kDeviceInfo(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
case K_DEVICE_INFO_GET_CURRENT_DEVICE: case K_DEVICE_INFO_GET_CURRENT_DEVICE:
output_s = kernel_dereference_char_pointer(s, argv[1], 0); output_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
strcpy(output_s, "/"); strcpy(output_s, "/");
debug(3, "K_DEVICE_INFO_GET_CURRENT_DEVICE() -> %s", output_s); debug(3, "K_DEVICE_INFO_GET_CURRENT_DEVICE() -> %s", output_s);
break; break;
case K_DEVICE_INFO_PATHS_EQUAL: { case K_DEVICE_INFO_PATHS_EQUAL: {
char *path1_s = kernel_dereference_char_pointer(s, argv[1], 0); char *path1_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
char *path2_s = kernel_dereference_char_pointer(s, argv[2], 0); char *path2_s = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
debug(3, "K_DEVICE_INFO_PATHS_EQUAL(%s,%s)", path1_s, path2_s); debug(3, "K_DEVICE_INFO_PATHS_EQUAL(%s,%s)", path1_s, path2_s);
return make_reg(0, Common::matchString(path2_s, path1_s, true)); return make_reg(0, Common::matchString(path2_s, path1_s, true));
@ -380,7 +380,7 @@ reg_t kDeviceInfo(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
case K_DEVICE_INFO_IS_FLOPPY: case K_DEVICE_INFO_IS_FLOPPY:
input_s = kernel_dereference_char_pointer(s, argv[1], 0); input_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
debug(3, "K_DEVICE_INFO_IS_FLOPPY(%s)", input_s); debug(3, "K_DEVICE_INFO_IS_FLOPPY(%s)", input_s);
return NULL_REG; /* Never */ return NULL_REG; /* Never */
@ -389,8 +389,8 @@ reg_t kDeviceInfo(EngineState *s, int funct_nr, int argc, reg_t *argv) {
** for more information on our workaround for this. ** for more information on our workaround for this.
*/ */
case K_DEVICE_INFO_GET_SAVECAT_NAME: { case K_DEVICE_INFO_GET_SAVECAT_NAME: {
output_s = kernel_dereference_char_pointer(s, argv[1], 0); output_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
game_prefix = kernel_dereference_char_pointer(s, argv[2], 0); game_prefix = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
sprintf(output_s, "__throwaway"); sprintf(output_s, "__throwaway");
debug(3, "K_DEVICE_INFO_GET_SAVECAT_NAME(%s) -> %s", game_prefix, output_s); debug(3, "K_DEVICE_INFO_GET_SAVECAT_NAME(%s) -> %s", game_prefix, output_s);
@ -398,8 +398,8 @@ reg_t kDeviceInfo(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
case K_DEVICE_INFO_GET_SAVEFILE_NAME: { case K_DEVICE_INFO_GET_SAVEFILE_NAME: {
output_s = kernel_dereference_char_pointer(s, argv[1], 0); output_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
game_prefix = kernel_dereference_char_pointer(s, argv[2], 0); game_prefix = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
int savegame_id = argv[3].toUint16(); int savegame_id = argv[3].toUint16();
sprintf(output_s, "__throwaway"); sprintf(output_s, "__throwaway");
debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix, savegame_id, output_s); debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix, savegame_id, output_s);
@ -421,7 +421,7 @@ reg_t kGetSaveDir(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kCheckFreeSpace(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kCheckFreeSpace(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *path = kernel_dereference_char_pointer(s, argv[0], 0); char *path = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
debug(3, "kCheckFreeSpace(%s)", path); debug(3, "kCheckFreeSpace(%s)", path);
// We simply always pretend that there is enough space. // We simply always pretend that there is enough space.
@ -479,7 +479,7 @@ void listSavegames(Common::Array<SavegameDesc> &saves) {
} }
reg_t kCheckSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kCheckSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *game_id = kernel_dereference_char_pointer(s, argv[0], 0); char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
int savedir_nr = argv[1].toUint16(); int savedir_nr = argv[1].toUint16();
debug(3, "kCheckSaveGame(%s, %d)", game_id, savedir_nr); debug(3, "kCheckSaveGame(%s, %d)", game_id, savedir_nr);
@ -515,10 +515,10 @@ reg_t kCheckSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kGetSaveFiles(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kGetSaveFiles(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *game_id = kernel_dereference_char_pointer(s, argv[0], 0); char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
char *nametarget = kernel_dereference_char_pointer(s, argv[1], 0); char *nametarget = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
reg_t nametarget_base = argv[1]; reg_t nametarget_base = argv[1];
reg_t *nameoffsets = kernel_dereference_reg_pointer(s, argv[2], 0); reg_t *nameoffsets = kernel_dereference_reg_pointer(s->segmentManager, argv[2], 0);
debug(3, "kGetSaveFiles(%s,%s)", game_id, nametarget); debug(3, "kGetSaveFiles(%s,%s)", game_id, nametarget);
@ -565,11 +565,11 @@ reg_t kGetSaveFiles(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *game_id = kernel_dereference_char_pointer(s, argv[0], 0); char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
int savedir_nr = argv[1].toUint16(); int savedir_nr = argv[1].toUint16();
int savedir_id; // Savegame ID, derived from savedir_nr and the savegame ID list int savedir_id; // Savegame ID, derived from savedir_nr and the savegame ID list
char *game_description = kernel_dereference_char_pointer(s, argv[2], 0); char *game_description = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
char *version = argc > 3 ? strdup(kernel_dereference_char_pointer(s, argv[3], 0)) : NULL; char *version = argc > 3 ? strdup(kernel_dereference_char_pointer(s->segmentManager, argv[3], 0)) : NULL;
debug(3, "kSaveGame(%s,%d,%s,%s)", game_id, savedir_nr, game_description, version); debug(3, "kSaveGame(%s,%d,%s,%s)", game_id, savedir_nr, game_description, version);
s->game_version = version; s->game_version = version;
@ -638,7 +638,7 @@ reg_t kSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kRestoreGame(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kRestoreGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *game_id = kernel_dereference_char_pointer(s, argv[0], 0); char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
int savedir_nr = argv[1].toUint16(); int savedir_nr = argv[1].toUint16();
debug(3, "kRestoreGame(%s,%d)", game_id, savedir_nr); debug(3, "kRestoreGame(%s,%d)", game_id, savedir_nr);
@ -677,7 +677,7 @@ reg_t kRestoreGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kValidPath(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kValidPath(EngineState *s, int funct_nr, int argc, reg_t *argv) {
const char *path = kernel_dereference_char_pointer(s, argv[0], 0); const char *path = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
// FIXME: For now, we only accept the (fake) root dir "/" as a valid path. // FIXME: For now, we only accept the (fake) root dir "/" as a valid path.
s->r_acc = make_reg(0, 0 == strcmp(path, "/")); s->r_acc = make_reg(0, 0 == strcmp(path, "/"));
@ -728,7 +728,7 @@ void DirSeeker::nextFile() {
return; return;
} }
char *mem = kernel_dereference_char_pointer(_vm, _outbuffer, 0); char *mem = kernel_dereference_char_pointer(_vm->segmentManager, _outbuffer, 0);
memset(mem, 0, 13); memset(mem, 0, 13);
// TODO: Transform the string back into a format usable by the SCI scripts. // TODO: Transform the string back into a format usable by the SCI scripts.
@ -749,7 +749,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
switch (func_nr) { switch (func_nr) {
case K_FILEIO_OPEN : { case K_FILEIO_OPEN : {
char *name = kernel_dereference_char_pointer(s, argv[1], 0); char *name = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
int mode = argv[2].toUint16(); int mode = argv[2].toUint16();
file_open(s, name, mode); file_open(s, name, mode);
@ -765,7 +765,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
case K_FILEIO_READ_RAW : { case K_FILEIO_READ_RAW : {
int handle = argv[1].toUint16(); int handle = argv[1].toUint16();
char *dest = kernel_dereference_char_pointer(s, argv[2], 0); char *dest = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
int size = argv[3].toUint16(); int size = argv[3].toUint16();
debug(3, "K_FILEIO_READ_RAW(%d,%d)", handle, size); debug(3, "K_FILEIO_READ_RAW(%d,%d)", handle, size);
@ -774,7 +774,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
case K_FILEIO_WRITE_RAW : { case K_FILEIO_WRITE_RAW : {
int handle = argv[1].toUint16(); int handle = argv[1].toUint16();
char *buf = kernel_dereference_char_pointer(s, argv[2], 0); char *buf = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
int size = argv[3].toUint16(); int size = argv[3].toUint16();
debug(3, "K_FILEIO_WRITE_RAW(%d,%d)", handle, size); debug(3, "K_FILEIO_WRITE_RAW(%d,%d)", handle, size);
@ -782,7 +782,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
} }
case K_FILEIO_UNLINK : { case K_FILEIO_UNLINK : {
char *name = kernel_dereference_char_pointer(s, argv[1], 0); char *name = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
debug(3, "K_FILEIO_UNLINK(%s)", name); debug(3, "K_FILEIO_UNLINK(%s)", name);
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
@ -793,7 +793,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
} }
case K_FILEIO_READ_STRING : { case K_FILEIO_READ_STRING : {
char *dest = kernel_dereference_char_pointer(s, argv[1], 0); char *dest = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
int size = argv[2].toUint16(); int size = argv[2].toUint16();
int handle = argv[3].toUint16(); int handle = argv[3].toUint16();
debug(3, "K_FILEIO_READ_STRING(%d,%d)", handle, size); debug(3, "K_FILEIO_READ_STRING(%d,%d)", handle, size);
@ -804,7 +804,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
case K_FILEIO_WRITE_STRING : { case K_FILEIO_WRITE_STRING : {
int handle = argv[1].toUint16(); int handle = argv[1].toUint16();
int size = argv[3].toUint16(); int size = argv[3].toUint16();
char *buf = kernel_dereference_char_pointer(s, argv[2], size); char *buf = kernel_dereference_char_pointer(s->segmentManager, argv[2], size);
debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size); debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size);
// FIXME: What is the difference between K_FILEIO_WRITE_STRING and // FIXME: What is the difference between K_FILEIO_WRITE_STRING and
@ -825,7 +825,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
} }
case K_FILEIO_FIND_FIRST : { case K_FILEIO_FIND_FIRST : {
char *mask = kernel_dereference_char_pointer(s, argv[1], 0); char *mask = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
reg_t buf = argv[2]; reg_t buf = argv[2];
int attr = argv[3].toUint16(); // We won't use this, Win32 might, though... int attr = argv[3].toUint16(); // We won't use this, Win32 might, though...
debug(3, "K_FILEIO_FIND_FIRST(%s,0x%x)", mask, attr); debug(3, "K_FILEIO_FIND_FIRST(%s,0x%x)", mask, attr);
@ -844,7 +844,7 @@ reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
} }
case K_FILEIO_FILE_EXISTS : { case K_FILEIO_FILE_EXISTS : {
char *name = kernel_dereference_char_pointer(s, argv[1], 0); char *name = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
// Check for regular file // Check for regular file
bool exists = Common::File::exists(name); bool exists = Common::File::exists(name);

View file

@ -627,14 +627,14 @@ reg_t kGraph(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kTextSize(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kTextSize(EngineState *s, int funct_nr, int argc, reg_t *argv) {
int width, height; int width, height;
char *text = argv[1].segment ? (char *) kernel_dereference_bulk_pointer(s, argv[1], 0) : NULL; char *text = argv[1].segment ? (char *) kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 0) : NULL;
const char *sep = NULL; const char *sep = NULL;
reg_t *dest = kernel_dereference_reg_pointer(s, argv[0], 4); reg_t *dest = kernel_dereference_reg_pointer(s->segmentManager, argv[0], 4);
int maxwidth = (argc > 3) ? argv[3].toUint16() : 0; int maxwidth = (argc > 3) ? argv[3].toUint16() : 0;
int font_nr = argv[2].toUint16(); int font_nr = argv[2].toUint16();
if ((argc > 4) && (argv[4].segment)) if ((argc > 4) && (argv[4].segment))
sep = (const char *)kernel_dereference_bulk_pointer(s, argv[4], 0); sep = (const char *)kernel_dereference_bulk_pointer(s->segmentManager, argv[4], 0);
if (maxwidth < 0) if (maxwidth < 0)
maxwidth = 0; maxwidth = 0;
@ -689,6 +689,7 @@ reg_t kPriCoord(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int funct_nr, int argc, reg_t *argv) { void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
int view = GET_SEL32V(obj, view); int view = GET_SEL32V(obj, view);
int signal = GET_SEL32V(obj, signal); int signal = GET_SEL32V(obj, signal);
int loop; int loop;
@ -746,9 +747,10 @@ reg_t kDirLoop(EngineState *s, int funct_nr, int argc, reg_t *argv) {
static Common::Rect nsrect_clip(EngineState *s, int y, Common::Rect retval, int priority); static Common::Rect nsrect_clip(EngineState *s, int y, Common::Rect retval, int priority);
static int collides_with(EngineState *s, Common::Rect area, reg_t other_obj, int use_nsrect, int view_mask, int funct_nr, int argc, reg_t *argv) { static int collides_with(EngineState *s, Common::Rect area, reg_t other_obj, int use_nsrect, int view_mask, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
int other_signal = GET_SEL32V(other_obj, signal); int other_signal = GET_SEL32V(other_obj, signal);
int other_priority = GET_SEL32V(other_obj, priority); int other_priority = GET_SEL32V(other_obj, priority);
int y = GET_SEL32SV(other_obj, y); int y = (int16)GET_SEL32V(other_obj, y);
Common::Rect other_area; Common::Rect other_area;
if (use_nsrect) { if (use_nsrect) {
@ -785,6 +787,7 @@ static int collides_with(EngineState *s, Common::Rect area, reg_t other_obj, int
} }
reg_t kCanBeHere(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kCanBeHere(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t obj = argv[0]; reg_t obj = argv[0];
reg_t cliplist_ref = (argc > 1) ? argv[1] : NULL_REG; reg_t cliplist_ref = (argc > 1) ? argv[1] : NULL_REG;
List *cliplist = NULL; List *cliplist = NULL;
@ -797,10 +800,10 @@ reg_t kCanBeHere(EngineState *s, int funct_nr, int argc, reg_t *argv) {
uint16 edgehit; uint16 edgehit;
uint16 illegal_bits; uint16 illegal_bits;
abs_zone.left = GET_SEL32SV(obj, brLeft); abs_zone.left = (int16)GET_SEL32V(obj, brLeft);
abs_zone.right = GET_SEL32SV(obj, brRight); abs_zone.right = (int16)GET_SEL32V(obj, brRight);
abs_zone.top = GET_SEL32SV(obj, brTop); abs_zone.top = (int16)GET_SEL32V(obj, brTop);
abs_zone.bottom = GET_SEL32SV(obj, brBottom); abs_zone.bottom = (int16)GET_SEL32V(obj, brBottom);
zone = gfx_rect(abs_zone.left + port->zone.x, abs_zone.top + port->zone.y, abs_zone.width(), abs_zone.height()); zone = gfx_rect(abs_zone.left + port->zone.x, abs_zone.top + port->zone.y, abs_zone.width(), abs_zone.height());
@ -939,6 +942,7 @@ reg_t kCelWide(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kNumLoops(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kNumLoops(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t obj = argv[0]; reg_t obj = argv[0];
int view = GET_SEL32V(obj, view); int view = GET_SEL32V(obj, view);
int loops_nr = gfxop_lookup_view_get_loops(s->gfx_state, view); int loops_nr = gfxop_lookup_view_get_loops(s->gfx_state, view);
@ -954,12 +958,12 @@ reg_t kNumLoops(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kNumCels(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kNumCels(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t obj = argv[0]; reg_t obj = argv[0];
int loop = GET_SEL32V(obj, loop); int loop = GET_SEL32V(obj, loop);
int view = GET_SEL32V(obj, view); int view = GET_SEL32V(obj, view);
int cel = 0xffff; int cel = 0xffff;
if (gfxop_check_cel(s->gfx_state, view, &loop, &cel)) { if (gfxop_check_cel(s->gfx_state, view, &loop, &cel)) {
// OK, this is a hack and there's a // OK, this is a hack and there's a
// real function to calculate cel numbers... // real function to calculate cel numbers...
@ -1073,6 +1077,7 @@ reg_t kDrawPic(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
Common::Rect set_base(EngineState *s, reg_t object) { Common::Rect set_base(EngineState *s, reg_t object) {
SegManager *segManager = s->segmentManager;
int x, y, original_y, z, ystep, xsize, ysize; int x, y, original_y, z, ystep, xsize, ysize;
int xbase, ybase, xend, yend; int xbase, ybase, xend, yend;
int view, loop, cel; int view, loop, cel;
@ -1080,19 +1085,19 @@ Common::Rect set_base(EngineState *s, reg_t object) {
int xmod = 0, ymod = 0; int xmod = 0, ymod = 0;
Common::Rect retval; Common::Rect retval;
x = GET_SEL32SV(object, x); x = (int16)GET_SEL32V(object, x);
original_y = y = GET_SEL32SV(object, y); original_y = y = (int16)GET_SEL32V(object, y);
if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1) if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1)
z = GET_SEL32SV(object, z); z = (int16)GET_SEL32V(object, z);
else else
z = 0; z = 0;
y -= z; // Subtract z offset y -= z; // Subtract z offset
ystep = GET_SEL32SV(object, yStep); ystep = (int16)GET_SEL32V(object, yStep);
view = GET_SEL32SV(object, view); view = (int16)GET_SEL32V(object, view);
oldloop = loop = sign_extend_byte(GET_SEL32V(object, loop)); oldloop = loop = sign_extend_byte(GET_SEL32V(object, loop));
oldcel = cel = sign_extend_byte(GET_SEL32V(object, cel)); oldcel = cel = sign_extend_byte(GET_SEL32V(object, cel));
@ -1135,6 +1140,7 @@ Common::Rect set_base(EngineState *s, reg_t object) {
} }
void _k_base_setter(EngineState *s, reg_t object) { void _k_base_setter(EngineState *s, reg_t object) {
SegManager *segManager = s->segmentManager;
Common::Rect absrect = set_base(s, object); Common::Rect absrect = set_base(s, object);
if (lookup_selector(s->segmentManager, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.brLeft, NULL, NULL) != kSelectorVariable) if (lookup_selector(s->segmentManager, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.brLeft, NULL, NULL) != kSelectorVariable)
@ -1211,28 +1217,29 @@ static Common::Rect calculate_nsrect(EngineState *s, int x, int y, int view, int
} }
Common::Rect get_nsrect(EngineState *s, reg_t object, byte clip) { Common::Rect get_nsrect(EngineState *s, reg_t object, byte clip) {
SegManager *segManager = s->segmentManager;
int x, y, z; int x, y, z;
int view, loop, cel; int view, loop, cel;
Common::Rect retval; Common::Rect retval;
x = GET_SEL32SV(object, x); x = (int16)GET_SEL32V(object, x);
y = GET_SEL32SV(object, y); y = (int16)GET_SEL32V(object, y);
if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1) if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1)
z = GET_SEL32SV(object, z); z = (int16)GET_SEL32V(object, z);
else else
z = 0; z = 0;
y -= z; // Subtract z offset y -= z; // Subtract z offset
view = GET_SEL32SV(object, view); view = (int16)GET_SEL32V(object, view);
loop = sign_extend_byte(GET_SEL32SV(object, loop)); loop = sign_extend_byte((int16)GET_SEL32V(object, loop));
cel = sign_extend_byte(GET_SEL32SV(object, cel)); cel = sign_extend_byte((int16)GET_SEL32V(object, cel));
retval = calculate_nsrect(s, x, y, view, loop, cel); retval = calculate_nsrect(s, x, y, view, loop, cel);
if (clip) { if (clip) {
int priority = GET_SEL32SV(object, priority); int priority = (int16)GET_SEL32V(object, priority);
return nsrect_clip(s, y, retval, priority); return nsrect_clip(s, y, retval, priority);
} }
@ -1240,6 +1247,7 @@ Common::Rect get_nsrect(EngineState *s, reg_t object, byte clip) {
} }
static void _k_set_now_seen(EngineState *s, reg_t object) { static void _k_set_now_seen(EngineState *s, reg_t object) {
SegManager *segManager = s->segmentManager;
Common::Rect absrect = get_nsrect(s, object, 0); Common::Rect absrect = get_nsrect(s, object, 0);
if (lookup_selector(s->segmentManager, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsTop, NULL, NULL) != kSelectorVariable) { if (lookup_selector(s->segmentManager, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsTop, NULL, NULL) != kSelectorVariable) {
@ -1331,6 +1339,7 @@ reg_t kPalette(EngineState *s, int funct_nr, int argc, reg_t *argv) {
static void _k_draw_control(EngineState *s, reg_t obj, int inverse); static void _k_draw_control(EngineState *s, reg_t obj, int inverse);
static void _k_disable_delete_for_now(EngineState *s, reg_t obj) { static void _k_disable_delete_for_now(EngineState *s, reg_t obj) {
SegManager *segManager = s->segmentManager;
reg_t text_pos = GET_SEL32(obj, text); reg_t text_pos = GET_SEL32(obj, text);
char *text = text_pos.isNull() ? NULL : (char *)s->segmentManager->dereference(text_pos, NULL); char *text = text_pos.isNull() ? NULL : (char *)s->segmentManager->dereference(text_pos, NULL);
int type = GET_SEL32V(obj, type); int type = GET_SEL32V(obj, type);
@ -1401,6 +1410,7 @@ void update_cursor_limits(int *display_offset, int *cursor, int max_displayed) {
} }
reg_t kEditControl(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kEditControl(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t obj = argv[0]; reg_t obj = argv[0];
reg_t event = argv[1]; reg_t event = argv[1];
@ -1575,10 +1585,11 @@ reg_t kEditControl(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
static void _k_draw_control(EngineState *s, reg_t obj, int inverse) { static void _k_draw_control(EngineState *s, reg_t obj, int inverse) {
int x = GET_SEL32SV(obj, nsLeft); SegManager *segManager = s->segmentManager;
int y = GET_SEL32SV(obj, nsTop); int x = (int16)GET_SEL32V(obj, nsLeft);
int xl = GET_SEL32SV(obj, nsRight) - x; int y = (int16)GET_SEL32V(obj, nsTop);
int yl = GET_SEL32SV(obj, nsBottom) - y; int xl = (int16)GET_SEL32V(obj, nsRight) - x;
int yl = (int16)GET_SEL32V(obj, nsBottom) - y;
rect_t area = gfx_rect(x, y, xl, yl); rect_t area = gfx_rect(x, y, xl, yl);
int font_nr = GET_SEL32V(obj, font); int font_nr = GET_SEL32V(obj, font);
@ -1708,7 +1719,7 @@ static void draw_obj_to_control_map(EngineState *s, GfxDynView *view) {
if (!is_object(s->segmentManager, obj)) if (!is_object(s->segmentManager, obj))
warning("View %d does not contain valid object reference %04x:%04x", view->_ID, PRINT_REG(obj)); warning("View %d does not contain valid object reference %04x:%04x", view->_ID, PRINT_REG(obj));
reg_t* sp = view->signalp.getPointer(s); reg_t* sp = view->signalp.getPointer(s->segmentManager);
if (!(sp && (sp->offset & _K_VIEW_SIG_FLAG_IGNORE_ACTOR))) { if (!(sp && (sp->offset & _K_VIEW_SIG_FLAG_IGNORE_ACTOR))) {
Common::Rect abs_zone = get_nsrect(s, make_reg(view->_ID, view->_subID), 1); Common::Rect abs_zone = get_nsrect(s, make_reg(view->_ID, view->_subID), 1);
draw_rect_to_control_map(s, abs_zone); draw_rect_to_control_map(s, abs_zone);
@ -1716,6 +1727,7 @@ static void draw_obj_to_control_map(EngineState *s, GfxDynView *view) {
} }
static void _k_view_list_do_postdraw(EngineState *s, GfxList *list) { static void _k_view_list_do_postdraw(EngineState *s, GfxList *list) {
SegManager *segManager = s->segmentManager;
GfxDynView *widget = (GfxDynView *) list->_contents; GfxDynView *widget = (GfxDynView *) list->_contents;
while (widget) { while (widget) {
@ -1760,7 +1772,7 @@ static void _k_view_list_do_postdraw(EngineState *s, GfxList *list) {
fprintf(stderr, "obj %04x:%04x has pflags %x\n", PRINT_REG(obj), (widget->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE))); fprintf(stderr, "obj %04x:%04x has pflags %x\n", PRINT_REG(obj), (widget->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE)));
#endif #endif
reg_t* sp = widget->signalp.getPointer(s); reg_t* sp = widget->signalp.getPointer(s->segmentManager);
if (sp) { if (sp) {
*sp = make_reg(0, widget->signal & 0xffff); /* Write back signal */ *sp = make_reg(0, widget->signal & 0xffff); /* Write back signal */
} }
@ -1792,6 +1804,7 @@ int _k_view_list_dispose_loop(EngineState *s, List *list, GfxDynView *widget, in
// returns non-zero IFF views were dropped // returns non-zero IFF views were dropped
int signal; int signal;
int dropped = 0; int dropped = 0;
SegManager *segManager = s->segmentManager;
_k_animate_ran = false; _k_animate_ran = false;
@ -1804,7 +1817,7 @@ int _k_view_list_dispose_loop(EngineState *s, List *list, GfxDynView *widget, in
return -1; return -1;
if (GFXW_IS_DYN_VIEW(widget) && (widget->_ID != GFXW_NO_ID)) { if (GFXW_IS_DYN_VIEW(widget) && (widget->_ID != GFXW_NO_ID)) {
signal = widget->signalp.getPointer(s)->offset; signal = widget->signalp.getPointer(segManager)->offset;
if (signal & _K_VIEW_SIG_FLAG_DISPOSE_ME) { if (signal & _K_VIEW_SIG_FLAG_DISPOSE_ME) {
reg_t obj = make_reg(widget->_ID, widget->_subID); reg_t obj = make_reg(widget->_ID, widget->_subID);
reg_t under_bits = NULL_REG; reg_t under_bits = NULL_REG;
@ -1813,7 +1826,7 @@ int _k_view_list_dispose_loop(EngineState *s, List *list, GfxDynView *widget, in
error("Non-object %04x:%04x present in view list during delete time", PRINT_REG(obj)); error("Non-object %04x:%04x present in view list during delete time", PRINT_REG(obj));
obj = NULL_REG; obj = NULL_REG;
} else { } else {
reg_t *ubp = widget->under_bitsp.getPointer(s); reg_t *ubp = widget->under_bitsp.getPointer(segManager);
if (ubp) { // Is there a bg picture left to clean? if (ubp) { // Is there a bg picture left to clean?
reg_t mem_handle = *ubp; reg_t mem_handle = *ubp;
@ -1827,7 +1840,7 @@ int _k_view_list_dispose_loop(EngineState *s, List *list, GfxDynView *widget, in
} }
} }
} }
if (is_object(s->segmentManager, obj)) { if (is_object(segManager, obj)) {
if (invoke_selector(INV_SEL(obj, delete_, kContinueOnInvalidSelector), 0)) if (invoke_selector(INV_SEL(obj, delete_, kContinueOnInvalidSelector), 0))
warning("Object at %04x:%04x requested deletion, but does not have a delete funcselector", PRINT_REG(obj)); warning("Object at %04x:%04x requested deletion, but does not have a delete funcselector", PRINT_REG(obj));
if (_k_animate_ran) { if (_k_animate_ran) {
@ -1835,7 +1848,7 @@ int _k_view_list_dispose_loop(EngineState *s, List *list, GfxDynView *widget, in
return dropped; return dropped;
} }
reg_t *ubp = widget->under_bitsp.getPointer(s); reg_t *ubp = widget->under_bitsp.getPointer(segManager);
if (ubp) if (ubp)
under_bits = *ubp; under_bits = *ubp;
@ -1880,8 +1893,9 @@ enum {
}; };
static GfxDynView *_k_make_dynview_obj(EngineState *s, reg_t obj, int options, int nr, int funct_nr, int argc, reg_t *argv) { static GfxDynView *_k_make_dynview_obj(EngineState *s, reg_t obj, int options, int nr, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
short oldloop, oldcel; short oldloop, oldcel;
int cel, loop, view_nr = GET_SEL32SV(obj, view); int cel, loop, view_nr = (int16)GET_SEL32V(obj, view);
int palette; int palette;
int signal; int signal;
reg_t under_bits; reg_t under_bits;
@ -1893,12 +1907,12 @@ static GfxDynView *_k_make_dynview_obj(EngineState *s, reg_t obj, int options, i
obj = obj; obj = obj;
pos.x = GET_SEL32SV(obj, x); pos.x = (int16)GET_SEL32V(obj, x);
pos.y = GET_SEL32SV(obj, y); pos.y = (int16)GET_SEL32V(obj, y);
pos.y++; // magic: Sierra appears to do something like this pos.y++; // magic: Sierra appears to do something like this
z = GET_SEL32SV(obj, z); z = (int16)GET_SEL32V(obj, z);
// !-- nsRect used to be checked here! // !-- nsRect used to be checked here!
loop = oldloop = sign_extend_byte(GET_SEL32V(obj, loop)); loop = oldloop = sign_extend_byte(GET_SEL32V(obj, loop));
@ -1932,7 +1946,7 @@ static GfxDynView *_k_make_dynview_obj(EngineState *s, reg_t obj, int options, i
under_bits = NULL_REG; under_bits = NULL_REG;
debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no underBits\n", PRINT_REG(obj)); debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no underBits\n", PRINT_REG(obj));
} else } else
under_bits = *under_bitsp.getPointer(s); under_bits = *under_bitsp.getPointer(s->segmentManager);
ObjVarRef signalp; ObjVarRef signalp;
if (lookup_selector(s->segmentManager, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.signal, &(signalp), NULL) != kSelectorVariable) { if (lookup_selector(s->segmentManager, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.signal, &(signalp), NULL) != kSelectorVariable) {
@ -1940,7 +1954,7 @@ static GfxDynView *_k_make_dynview_obj(EngineState *s, reg_t obj, int options, i
signal = 0; signal = 0;
debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no signal selector\n", PRINT_REG(obj)); debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no signal selector\n", PRINT_REG(obj));
} else { } else {
signal = signalp.getPointer(s)->offset; signal = signalp.getPointer(s->segmentManager)->offset;
debugC(2, kDebugLevelGraphics, " with signal = %04x\n", signal); debugC(2, kDebugLevelGraphics, " with signal = %04x\n", signal);
} }
@ -1963,6 +1977,7 @@ static void _k_make_view_list(EngineState *s, GfxList **widget_list, List *list,
** number of list entries in *list_nr. Calls doit for each entry if cycle is set. ** number of list entries in *list_nr. Calls doit for each entry if cycle is set.
** argc, argv, funct_nr should be the same as in the calling kernel function. ** argc, argv, funct_nr should be the same as in the calling kernel function.
*/ */
SegManager *segManager = s->segmentManager;
Node *node; Node *node;
int sequence_nr = 0; int sequence_nr = 0;
GfxDynView *widget; GfxDynView *widget;
@ -2015,7 +2030,7 @@ static void _k_make_view_list(EngineState *s, GfxList **widget_list, List *list,
widget = (GfxDynView *)(*widget_list)->_contents; widget = (GfxDynView *)(*widget_list)->_contents;
while (widget) { // Read back widget values while (widget) { // Read back widget values
reg_t *sp = widget->signalp.getPointer(s); reg_t *sp = widget->signalp.getPointer(s->segmentManager);
if (sp) if (sp)
widget->signal = sp->offset; widget->signal = sp->offset;
@ -2024,6 +2039,7 @@ static void _k_make_view_list(EngineState *s, GfxList **widget_list, List *list,
} }
static void _k_prepare_view_list(EngineState *s, GfxList *list, int options) { static void _k_prepare_view_list(EngineState *s, GfxList *list, int options) {
SegManager *segManager = s->segmentManager;
GfxDynView *view = (GfxDynView *) list->_contents; GfxDynView *view = (GfxDynView *) list->_contents;
while (view) { while (view) {
reg_t obj = make_reg(view->_ID, view->_subID); reg_t obj = make_reg(view->_ID, view->_subID);
@ -2036,7 +2052,7 @@ static void _k_prepare_view_list(EngineState *s, GfxList *list, int options) {
_priority = _find_view_priority(s, _priority - 1); _priority = _find_view_priority(s, _priority - 1);
if (options & _K_MAKE_VIEW_LIST_DRAW_TO_CONTROL_MAP) { // Picview if (options & _K_MAKE_VIEW_LIST_DRAW_TO_CONTROL_MAP) { // Picview
priority = GET_SEL32SV(obj, priority); priority = (int16)GET_SEL32V(obj, priority);
if (priority < 0) if (priority < 0)
priority = _priority; // Always for picviews priority = _priority; // Always for picviews
} else { // Dynview } else { // Dynview
@ -2047,7 +2063,7 @@ static void _k_prepare_view_list(EngineState *s, GfxList *list, int options) {
priority = _priority; priority = _priority;
} else // DON'T calculate the priority } else // DON'T calculate the priority
priority = GET_SEL32SV(obj, priority); priority = (int16)GET_SEL32V(obj, priority);
} }
view->_color.priority = priority; view->_color.priority = priority;
@ -2243,7 +2259,7 @@ void _k_draw_view_list(EngineState *s, GfxList *list, int flags) {
widget = gfxw_picviewize_dynview(widget); widget = gfxw_picviewize_dynview(widget);
if (GFXW_IS_DYN_VIEW(widget) && widget->_ID) { if (GFXW_IS_DYN_VIEW(widget) && widget->_ID) {
uint16 signal = (flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) ? widget->signalp.getPointer(s)->offset : 0; uint16 signal = (flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) ? widget->signalp.getPointer(s->segmentManager)->offset : 0;
if (signal & _K_VIEW_SIG_FLAG_HIDDEN) if (signal & _K_VIEW_SIG_FLAG_HIDDEN)
gfxw_hide_widget(widget); gfxw_hide_widget(widget);
@ -2263,7 +2279,7 @@ void _k_draw_view_list(EngineState *s, GfxList *list, int flags) {
else else
gfxw_show_widget(widget); gfxw_show_widget(widget);
*widget->signalp.getPointer(s) = make_reg(0, signal); // Write the changes back *widget->signalp.getPointer(s->segmentManager) = make_reg(0, signal); // Write the changes back
}; };
} // ...if we're drawing disposeables and this one is disposeable, or if we're drawing non- } // ...if we're drawing disposeables and this one is disposeable, or if we're drawing non-
@ -2537,7 +2553,7 @@ reg_t kNewWindow(EngineState *s, int funct_nr, int argc, reg_t *argv) {
lWhite.alpha = 0; lWhite.alpha = 0;
lWhite.priority = -1; lWhite.priority = -1;
lWhite.control = -1; lWhite.control = -1;
const char *title = argv[4 + argextra].segment ? kernel_dereference_char_pointer(s, argv[4 + argextra], 0) : NULL; const char *title = argv[4 + argextra].segment ? kernel_dereference_char_pointer(s->segmentManager, argv[4 + argextra], 0) : NULL;
window = sciw_new_window(s, gfx_rect(x, y, xl, yl), s->titlebar_port->_font, fgcolor, bgcolor, window = sciw_new_window(s, gfx_rect(x, y, xl, yl), s->titlebar_port->_font, fgcolor, bgcolor,
s->titlebar_port->_font, lWhite, black, title ? s->strSplit(title, NULL).c_str() : NULL, flags); s->titlebar_port->_font, lWhite, black, title ? s->strSplit(title, NULL).c_str() : NULL, flags);
@ -3164,7 +3180,7 @@ reg_t kDisplay(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (textp.segment) { if (textp.segment) {
argpt = 1; argpt = 1;
text = (char *)kernel_dereference_bulk_pointer(s, textp, 0); text = (char *)kernel_dereference_bulk_pointer(s->segmentManager, textp, 0);
} else { } else {
argpt = 2; argpt = 2;
text = kernel_lookup_text(s, textp, index); text = kernel_lookup_text(s, textp, index);
@ -3332,7 +3348,7 @@ reg_t kDisplay(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kShowMovie(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kShowMovie(EngineState *s, int funct_nr, int argc, reg_t *argv) {
const char *filename = kernel_dereference_char_pointer(s, argv[0], 0); const char *filename = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
int delay = argv[1].toUint16(); // Time between frames in ticks int delay = argv[1].toUint16(); // Time between frames in ticks
int frameNr = 0; int frameNr = 0;
SeqDecoder seq; SeqDecoder seq;

View file

@ -425,11 +425,12 @@ int sort_temp_cmp(const void *p1, const void *p2) {
} }
reg_t kSort(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kSort(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t source = argv[0]; reg_t source = argv[0];
reg_t dest = argv[1]; reg_t dest = argv[1];
reg_t order_func = argv[2]; reg_t order_func = argv[2];
int input_size = GET_SEL32SV(source, size); int input_size = (int16)GET_SEL32V(source, size);
int i; int i;
sort_temp_t *temp_array = (sort_temp_t *)malloc(sizeof(sort_temp_t) * input_size); sort_temp_t *temp_array = (sort_temp_t *)malloc(sizeof(sort_temp_t) * input_size);

View file

@ -34,8 +34,8 @@
namespace Sci { namespace Sci {
reg_t kAddMenu(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kAddMenu(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *name = kernel_dereference_char_pointer(s, argv[0], 0); char *name = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
char *contents = kernel_dereference_char_pointer(s, argv[1], 0); char *contents = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
s->_menubar->addMenu(s->gfx_state, name, s->_menubar->addMenu(s->gfx_state, name,
contents, s->titlebar_port->_font, argv[1]); contents, s->titlebar_port->_font, argv[1]);
@ -78,7 +78,7 @@ reg_t kDrawStatus(EngineState *s, int funct_nr, int argc, reg_t *argv) {
s->status_bar_background = bgcolor; s->status_bar_background = bgcolor;
if (text.segment) { if (text.segment) {
const char *tmp = strdup(kernel_dereference_char_pointer(s, text, 0)); const char *tmp = strdup(kernel_dereference_char_pointer(s->segmentManager, text, 0));
s->_statusBarText = tmp ? tmp : ""; s->_statusBarText = tmp ? tmp : "";
} }
@ -124,6 +124,7 @@ static int _menu_go_down(Menubar *menubar, int menu_nr, int item_nr) {
reg_t kMenuSelect(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kMenuSelect(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t event = argv[0]; reg_t event = argv[0];
/*int pause_sound = (argc > 1) ? argv[1].toUint16() : 1;*/ /* FIXME: Do this eventually */ /*int pause_sound = (argc > 1) ? argv[1].toUint16() : 1;*/ /* FIXME: Do this eventually */
bool claimed = false; bool claimed = false;

View file

@ -195,8 +195,8 @@ reg_t kMemory(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
case K_MEMORY_MEMCPY : { case K_MEMORY_MEMCPY : {
int size = argv[3].toUint16(); int size = argv[3].toUint16();
byte *dest = kernel_dereference_bulk_pointer(s, argv[1], size); byte *dest = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], size);
byte *src = kernel_dereference_bulk_pointer(s, argv[2], size); byte *src = kernel_dereference_bulk_pointer(s->segmentManager, argv[2], size);
if (dest && src) if (dest && src)
memcpy(dest, src, size); memcpy(dest, src, size);
@ -212,7 +212,7 @@ reg_t kMemory(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
} }
case K_MEMORY_PEEK : { case K_MEMORY_PEEK : {
byte *ref = kernel_dereference_bulk_pointer(s, argv[1], 2); byte *ref = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 2);
if (!ref) { if (!ref) {
// This occurs in KQ5CD when interacting with certain objects // This occurs in KQ5CD when interacting with certain objects
@ -226,7 +226,7 @@ reg_t kMemory(EngineState *s, int funct_nr, int argc, reg_t *argv) {
break; break;
} }
case K_MEMORY_POKE : { case K_MEMORY_POKE : {
byte *ref = kernel_dereference_bulk_pointer(s, argv[1], 2); byte *ref = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 2);
if (!ref) { if (!ref) {
warning("Attempt to poke invalid memory at %04x:%04x", PRINT_REG(argv[1])); warning("Attempt to poke invalid memory at %04x:%04x", PRINT_REG(argv[1]));

View file

@ -68,6 +68,7 @@ Still, what we compute in the end is of course not a real velocity anymore, but
used in an iterative stepping algorithm used in an iterative stepping algorithm
*/ */
reg_t kSetJump(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kSetJump(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
// Input data // Input data
reg_t object = argv[0]; reg_t object = argv[0];
int dx = argv[1].toSint16(); int dx = argv[1].toSint16();
@ -164,10 +165,10 @@ reg_t kSetJump(EngineState *s, int funct_nr, int argc, reg_t *argv) {
#define _K_BRESEN_AXIS_X 0 #define _K_BRESEN_AXIS_X 0
#define _K_BRESEN_AXIS_Y 1 #define _K_BRESEN_AXIS_Y 1
static void initialize_bresen(EngineState *s, int argc, reg_t *argv, reg_t mover, int step_factor, int deltax, int deltay) { static void initialize_bresen(SegManager *segManager, int argc, reg_t *argv, reg_t mover, int step_factor, int deltax, int deltay) {
reg_t client = GET_SEL32(mover, client); reg_t client = GET_SEL32(mover, client);
int stepx = GET_SEL32SV(client, xStep) * step_factor; int stepx = (int16)GET_SEL32V(client, xStep) * step_factor;
int stepy = GET_SEL32SV(client, yStep) * step_factor; int stepy = (int16)GET_SEL32V(client, yStep) * step_factor;
int numsteps_x = stepx ? (abs(deltax) + stepx - 1) / stepx : 0; int numsteps_x = stepx ? (abs(deltax) + stepx - 1) / stepx : 0;
int numsteps_y = stepy ? (abs(deltay) + stepy - 1) / stepy : 0; int numsteps_y = stepy ? (abs(deltay) + stepy - 1) / stepy : 0;
int bdi, i1; int bdi, i1;
@ -218,14 +219,15 @@ static void initialize_bresen(EngineState *s, int argc, reg_t *argv, reg_t mover
} }
reg_t kInitBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kInitBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t mover = argv[0]; reg_t mover = argv[0];
reg_t client = GET_SEL32(mover, client); reg_t client = GET_SEL32(mover, client);
int deltax = GET_SEL32SV(mover, x) - GET_SEL32SV(client, x); int deltax = (int16)GET_SEL32V(mover, x) - (int16)GET_SEL32V(client, x);
int deltay = GET_SEL32SV(mover, y) - GET_SEL32SV(client, y); int deltay = (int16)GET_SEL32V(mover, y) - (int16)GET_SEL32V(client, y);
int step_factor = (argc < 1) ? argv[1].toUint16() : 1; int step_factor = (argc < 1) ? argv[1].toUint16() : 1;
initialize_bresen(s, argc, argv, mover, step_factor, deltax, deltay); initialize_bresen(s->segmentManager, argc, argv, mover, step_factor, deltax, deltay);
return s->r_acc; return s->r_acc;
} }
@ -283,11 +285,12 @@ static void bresenham_autodetect(EngineState *s) {
} }
reg_t kDoBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDoBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t mover = argv[0]; reg_t mover = argv[0];
reg_t client = GET_SEL32(mover, client); reg_t client = GET_SEL32(mover, client);
int x = GET_SEL32SV(client, x); int x = (int16)GET_SEL32V(client, x);
int y = GET_SEL32SV(client, y); int y = (int16)GET_SEL32V(client, y);
int oldx, oldy, destx, desty, dx, dy, bdi, bi1, bi2, movcnt, bdelta, axis; int oldx, oldy, destx, desty, dx, dy, bdi, bi1, bi2, movcnt, bdelta, axis;
uint16 signal = GET_SEL32V(client, signal); uint16 signal = GET_SEL32V(client, signal);
int completed = 0; int completed = 0;
@ -302,16 +305,16 @@ reg_t kDoBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
PUT_SEL32(client, signal, make_reg(0, signal)); // This is a NOP for SCI0 PUT_SEL32(client, signal, make_reg(0, signal)); // This is a NOP for SCI0
oldx = x; oldx = x;
oldy = y; oldy = y;
destx = GET_SEL32SV(mover, x); destx = (int16)GET_SEL32V(mover, x);
desty = GET_SEL32SV(mover, y); desty = (int16)GET_SEL32V(mover, y);
dx = GET_SEL32SV(mover, dx); dx = (int16)GET_SEL32V(mover, dx);
dy = GET_SEL32SV(mover, dy); dy = (int16)GET_SEL32V(mover, dy);
bdi = GET_SEL32SV(mover, b_di); bdi = (int16)GET_SEL32V(mover, b_di);
bi1 = GET_SEL32SV(mover, b_i1); bi1 = (int16)GET_SEL32V(mover, b_i1);
bi2 = GET_SEL32SV(mover, b_i2); bi2 = (int16)GET_SEL32V(mover, b_i2);
movcnt = GET_SEL32V(mover, b_movCnt); movcnt = GET_SEL32V(mover, b_movCnt);
bdelta = GET_SEL32SV(mover, b_incr); bdelta = (int16)GET_SEL32V(mover, b_incr);
axis = GET_SEL32SV(mover, b_xAxis); axis = (int16)GET_SEL32V(mover, b_xAxis);
//printf("movecnt %d, move speed %d\n", movcnt, max_movcnt); //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt);
@ -392,6 +395,7 @@ int is_heap_object(EngineState *s, reg_t pos);
extern int get_angle(int xrel, int yrel); extern int get_angle(int xrel, int yrel);
reg_t kDoAvoider(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDoAvoider(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t avoider = argv[0]; reg_t avoider = argv[0];
reg_t client, looper, mover; reg_t client, looper, mover;
int angle; int angle;

View file

@ -284,7 +284,7 @@ static Common::Point read_point(const byte *list, int is_reg_t, int offset) {
/** /**
* Checks whether two polygons are equal * Checks whether two polygons are equal
*/ */
static bool polygons_equal(EngineState *s, reg_t p1, reg_t p2) { static bool polygons_equal(SegManager *segManager, reg_t p1, reg_t p2) {
// Check for same type // Check for same type
if (GET_SEL32(p1, type).toUint16() != GET_SEL32(p2, type).toUint16()) if (GET_SEL32(p1, type).toUint16() != GET_SEL32(p2, type).toUint16())
return false; return false;
@ -295,8 +295,8 @@ static bool polygons_equal(EngineState *s, reg_t p1, reg_t p2) {
if (size != GET_SEL32(p2, size).toUint16()) if (size != GET_SEL32(p2, size).toUint16())
return false; return false;
const byte *p1_points = kernel_dereference_bulk_pointer(s, GET_SEL32(p1, points), size * POLY_POINT_SIZE); const byte *p1_points = kernel_dereference_bulk_pointer(segManager, GET_SEL32(p1, points), size * POLY_POINT_SIZE);
const byte *p2_points = kernel_dereference_bulk_pointer(s, GET_SEL32(p2, points), size * POLY_POINT_SIZE); const byte *p2_points = kernel_dereference_bulk_pointer(segManager, GET_SEL32(p2, points), size * POLY_POINT_SIZE);
bool p1_is_reg_t = polygon_is_reg_t(p1_points, size); bool p1_is_reg_t = polygon_is_reg_t(p1_points, size);
bool p2_is_reg_t = polygon_is_reg_t(p2_points, size); bool p2_is_reg_t = polygon_is_reg_t(p2_points, size);
@ -359,7 +359,7 @@ static void draw_polygon(EngineState *s, reg_t polygon) {
int size = GET_SEL32(polygon, size).toUint16(); int size = GET_SEL32(polygon, size).toUint16();
int type = GET_SEL32(polygon, type).toUint16(); int type = GET_SEL32(polygon, type).toUint16();
Common::Point first, prev; Common::Point first, prev;
const byte *list = kernel_dereference_bulk_pointer(s, points, size * POLY_POINT_SIZE); const byte *list = kernel_dereference_bulk_pointer(s->segmentManager, points, size * POLY_POINT_SIZE);
int is_reg_t = polygon_is_reg_t(list, size); int is_reg_t = polygon_is_reg_t(list, size);
int i; int i;
@ -401,12 +401,12 @@ static void draw_input(EngineState *s, reg_t poly_list, Common::Point start, Com
#endif // DEBUG_AVOIDPATH #endif // DEBUG_AVOIDPATH
static void print_polygon(EngineState *s, reg_t polygon) { static void print_polygon(SegManager *segManager, reg_t polygon) {
reg_t points = GET_SEL32(polygon, points); reg_t points = GET_SEL32(polygon, points);
int size = GET_SEL32(polygon, size).toUint16(); int size = GET_SEL32(polygon, size).toUint16();
int type = GET_SEL32(polygon, type).toUint16(); int type = GET_SEL32(polygon, type).toUint16();
int i; int i;
const byte *point_array = kernel_dereference_bulk_pointer(s, points, size * POLY_POINT_SIZE); const byte *point_array = kernel_dereference_bulk_pointer(segManager, points, size * POLY_POINT_SIZE);
int is_reg_t = polygon_is_reg_t(point_array, size); int is_reg_t = polygon_is_reg_t(point_array, size);
Common::Point point; Common::Point point;
@ -443,7 +443,7 @@ static void print_input(EngineState *s, reg_t poly_list, Common::Point start, Co
node = lookup_node(s, list->first); node = lookup_node(s, list->first);
while (node) { while (node) {
print_polygon(s, node->value); print_polygon(s->segmentManager, node->value);
node = lookup_node(s, node->succ); node = lookup_node(s, node->succ);
} }
} }
@ -1226,10 +1226,11 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) {
// Parameters: (EngineState *) s: The game state // Parameters: (EngineState *) s: The game state
// (reg_t) polygon: The SCI polygon to convert // (reg_t) polygon: The SCI polygon to convert
// Returns : (Polygon *) The converted polygon // Returns : (Polygon *) The converted polygon
SegManager *segManager = s->segmentManager;
int i; int i;
reg_t points = GET_SEL32(polygon, points); reg_t points = GET_SEL32(polygon, points);
int size = GET_SEL32(polygon, size).toUint16(); int size = GET_SEL32(polygon, size).toUint16();
const byte *list = kernel_dereference_bulk_pointer(s, points, size * POLY_POINT_SIZE); const byte *list = kernel_dereference_bulk_pointer(s->segmentManager, points, size * POLY_POINT_SIZE);
Polygon *poly = new Polygon(GET_SEL32(polygon, type).toUint16()); Polygon *poly = new Polygon(GET_SEL32(polygon, type).toUint16());
int is_reg_t = polygon_is_reg_t(list, size); int is_reg_t = polygon_is_reg_t(list, size);
@ -1362,6 +1363,7 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co
// (int) opt: Optimization level (0, 1 or 2) // (int) opt: Optimization level (0, 1 or 2)
// Returns : (PathfindingState *) On success a newly allocated pathfinding state, // Returns : (PathfindingState *) On success a newly allocated pathfinding state,
// NULL otherwise // NULL otherwise
SegManager *segManager = s->segmentManager;
Polygon *polygon; Polygon *polygon;
int err; int err;
int count = 0; int count = 0;
@ -1377,7 +1379,7 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co
// Workaround for game bugs that put a polygon in the list more than once // Workaround for game bugs that put a polygon in the list more than once
while (dup != node) { while (dup != node) {
if (polygons_equal(s, node->value, dup->value)) { if (polygons_equal(s->segmentManager, node->value, dup->value)) {
warning("[avoidpath] Ignoring duplicate polygon"); warning("[avoidpath] Ignoring duplicate polygon");
break; break;
} }

View file

@ -31,16 +31,16 @@
namespace Sci { namespace Sci {
reg_t read_selector(EngineState *s, reg_t object, Selector selector_id, const char *file, int line) { reg_t read_selector(SegManager *segManager, reg_t object, Selector selector_id, const char *file, int line) {
ObjVarRef address; ObjVarRef address;
if (lookup_selector(s->segmentManager, object, selector_id, &address, NULL) != kSelectorVariable) if (lookup_selector(segManager, object, selector_id, &address, NULL) != kSelectorVariable)
return NULL_REG; return NULL_REG;
else else
return *address.getPointer(s); return *address.getPointer(segManager);
} }
void write_selector(EngineState *s, reg_t object, Selector selector_id, reg_t value, const char *fname, int line) { void write_selector(SegManager *segManager, reg_t object, Selector selector_id, reg_t value, const char *fname, int line) {
ObjVarRef address; ObjVarRef address;
if ((selector_id < 0) || (selector_id > (int)((SciEngine*)g_engine)->getKernel()->getSelectorNamesSize())) { if ((selector_id < 0) || (selector_id > (int)((SciEngine*)g_engine)->getKernel()->getSelectorNamesSize())) {
@ -49,11 +49,11 @@ void write_selector(EngineState *s, reg_t object, Selector selector_id, reg_t va
return; return;
} }
if (lookup_selector(s->segmentManager, object, selector_id, &address, NULL) != kSelectorVariable) if (lookup_selector(segManager, object, selector_id, &address, NULL) != kSelectorVariable)
warning("Selector '%s' of object at %04x:%04x could not be" warning("Selector '%s' of object at %04x:%04x could not be"
" written to (%s L%d)", ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line); " written to (%s L%d)", ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line);
else else
*address.getPointer(s) = value; *address.getPointer(segManager) = value;
} }
int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid, int kfunct, int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid, int kfunct,
@ -221,6 +221,7 @@ reg_t kClone(EngineState *s, int funct_nr, int argc, reg_t *argv) {
extern void _k_view_list_mark_free(EngineState *s, reg_t off); extern void _k_view_list_mark_free(EngineState *s, reg_t off);
reg_t kDisposeClone(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDisposeClone(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t victim_addr = argv[0]; reg_t victim_addr = argv[0];
Clone *victim_obj = obj_get(s->segmentManager, victim_addr); Clone *victim_obj = obj_get(s->segmentManager, victim_addr);
uint16 underBits; uint16 underBits;

View file

@ -122,6 +122,7 @@ enum AudioSyncCommands {
static void script_set_priority(EngineState *s, reg_t obj, int priority) { static void script_set_priority(EngineState *s, reg_t obj, int priority) {
SegManager *segManager = s->segmentManager;
int song_nr = GET_SEL32V(obj, number); int song_nr = GET_SEL32V(obj, number);
Resource *song = s->resourceManager->findResource(ResourceId(kResourceTypeSound, song_nr), 0); Resource *song = s->resourceManager->findResource(ResourceId(kResourceTypeSound, song_nr), 0);
int flags = GET_SEL32V(obj, flags); int flags = GET_SEL32V(obj, flags);
@ -156,6 +157,7 @@ void process_sound_events(EngineState *s) { /* Get all sound events, apply their
int result; int result;
SongHandle handle; SongHandle handle;
int cue; int cue;
SegManager *segManager = s->segmentManager;
if (s->resourceManager->sciVersion() > SCI_VERSION_01) if (s->resourceManager->sciVersion() > SCI_VERSION_01)
return; return;
@ -205,6 +207,7 @@ void process_sound_events(EngineState *s) { /* Get all sound events, apply their
reg_t kDoSoundSci0(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDoSoundSci0(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t obj = (argc > 1) ? argv[1] : NULL_REG; reg_t obj = (argc > 1) ? argv[1] : NULL_REG;
uint16 command = argv[0].toUint16(); uint16 command = argv[0].toUint16();
SongHandle handle = FROBNICATE_HANDLE(obj); SongHandle handle = FROBNICATE_HANDLE(obj);
@ -384,6 +387,7 @@ reg_t kDoSoundSci0(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kDoSoundSci1Early(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDoSoundSci1Early(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
uint16 command = argv[0].toUint16(); uint16 command = argv[0].toUint16();
reg_t obj = (argc > 1) ? argv[1] : NULL_REG; reg_t obj = (argc > 1) ? argv[1] : NULL_REG;
SongHandle handle = FROBNICATE_HANDLE(obj); SongHandle handle = FROBNICATE_HANDLE(obj);
@ -674,6 +678,7 @@ reg_t kDoSoundSci1Early(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kDoSoundSci1Late(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDoSoundSci1Late(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
uint16 command = argv[0].toUint16(); uint16 command = argv[0].toUint16();
reg_t obj = (argc > 1) ? argv[1] : NULL_REG; reg_t obj = (argc > 1) ? argv[1] : NULL_REG;
SongHandle handle = FROBNICATE_HANDLE(obj); SongHandle handle = FROBNICATE_HANDLE(obj);
@ -1062,6 +1067,7 @@ reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kDoSync(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kDoSync(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
switch (argv[0].toUint16()) { switch (argv[0].toUint16()) {
case kSciAudioSyncStart: { case kSciAudioSyncStart: {
ResourceId id; ResourceId id;

View file

@ -44,7 +44,7 @@ char *kernel_lookup_text(EngineState *s, reg_t address, int index) {
Resource *textres; Resource *textres;
if (address.segment) if (address.segment)
return (char *)kernel_dereference_bulk_pointer(s, address, 0); return (char *)kernel_dereference_bulk_pointer(s->segmentManager, address, 0);
else { else {
int textlen; int textlen;
int _index = index; int _index = index;
@ -79,6 +79,7 @@ char *kernel_lookup_text(EngineState *s, reg_t address, int index) {
reg_t kSaid(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kSaid(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t heap_said_block = argv[0]; reg_t heap_said_block = argv[0];
byte *said_block; byte *said_block;
int new_lastmatch; int new_lastmatch;
@ -86,7 +87,7 @@ reg_t kSaid(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (!heap_said_block.segment) if (!heap_said_block.segment)
return NULL_REG; return NULL_REG;
said_block = (byte *) kernel_dereference_bulk_pointer(s, heap_said_block, 0); said_block = (byte *) kernel_dereference_bulk_pointer(s->segmentManager, heap_said_block, 0);
if (!said_block) { if (!said_block) {
warning("Said on non-string, pointer %04x:%04x", PRINT_REG(heap_said_block)); warning("Said on non-string, pointer %04x:%04x", PRINT_REG(heap_said_block));
@ -128,6 +129,7 @@ reg_t kSaid(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kSetSynonyms(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kSetSynonyms(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t object = argv[0]; reg_t object = argv[0];
List *list; List *list;
Node *node; Node *node;
@ -185,8 +187,9 @@ reg_t kSetSynonyms(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kParse(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kParse(EngineState *s, int funct_nr, int argc, reg_t *argv) {
SegManager *segManager = s->segmentManager;
reg_t stringpos = argv[0]; reg_t stringpos = argv[0];
char *string = kernel_dereference_char_pointer(s, stringpos, 0); char *string = kernel_dereference_char_pointer(s->segmentManager, stringpos, 0);
char *error; char *error;
ResultWordList words; ResultWordList words;
reg_t event = argv[1]; reg_t event = argv[1];
@ -239,7 +242,7 @@ reg_t kParse(EngineState *s, int funct_nr, int argc, reg_t *argv) {
s->r_acc = make_reg(0, 0); s->r_acc = make_reg(0, 0);
PUT_SEL32V(event, claimed, 1); PUT_SEL32V(event, claimed, 1);
if (error) { if (error) {
char *pbase_str = kernel_dereference_char_pointer(s, s->parser_base, 0); char *pbase_str = kernel_dereference_char_pointer(s->segmentManager, s->parser_base, 0);
strcpy(pbase_str, error); strcpy(pbase_str, error);
debugC(2, kDebugLevelParser, "Word unknown: %s\n", error); debugC(2, kDebugLevelParser, "Word unknown: %s\n", error);
/* Issue warning: */ /* Issue warning: */
@ -256,7 +259,7 @@ reg_t kParse(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kStrEnd(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrEnd(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t address = argv[0]; reg_t address = argv[0];
char *seeker = kernel_dereference_char_pointer(s, address, 0); char *seeker = kernel_dereference_char_pointer(s->segmentManager, address, 0);
while (*seeker++) while (*seeker++)
++address.offset; ++address.offset;
@ -265,16 +268,16 @@ reg_t kStrEnd(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kStrCat(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrCat(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *s1 = kernel_dereference_char_pointer(s, argv[0], 0); char *s1 = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
char *s2 = kernel_dereference_char_pointer(s, argv[1], 0); char *s2 = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
strcat(s1, s2); strcat(s1, s2);
return argv[0]; return argv[0];
} }
reg_t kStrCmp(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrCmp(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *s1 = kernel_dereference_char_pointer(s, argv[0], 0); char *s1 = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
char *s2 = kernel_dereference_char_pointer(s, argv[1], 0); char *s2 = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
if (argc > 2) if (argc > 2)
return make_reg(0, strncmp(s1, s2, argv[2].toUint16())); return make_reg(0, strncmp(s1, s2, argv[2].toUint16()));
@ -284,8 +287,8 @@ reg_t kStrCmp(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kStrCpy(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrCpy(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *dest = (char *) kernel_dereference_bulk_pointer(s, argv[0], 0); char *dest = (char *) kernel_dereference_bulk_pointer(s->segmentManager, argv[0], 0);
char *src = (char *) kernel_dereference_bulk_pointer(s, argv[1], 0); char *src = (char *) kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 0);
if (!dest) { if (!dest) {
warning("Attempt to strcpy TO invalid pointer %04x:%04x", warning("Attempt to strcpy TO invalid pointer %04x:%04x",
@ -349,7 +352,7 @@ static int is_print_str(const char *str) {
reg_t kStrAt(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrAt(EngineState *s, int funct_nr, int argc, reg_t *argv) {
byte *dest = (byte *)kernel_dereference_bulk_pointer(s, argv[0], 0); byte *dest = (byte *)kernel_dereference_bulk_pointer(s->segmentManager, argv[0], 0);
reg_t *dest2; reg_t *dest2;
if (!dest) { if (!dest) {
@ -391,7 +394,7 @@ reg_t kStrAt(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kReadNumber(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kReadNumber(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *source = kernel_dereference_char_pointer(s, argv[0], 0); char *source = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
while (isspace(*source)) while (isspace(*source))
source++; /* Skip whitespace */ source++; /* Skip whitespace */
@ -417,7 +420,7 @@ reg_t kReadNumber(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kFormat(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kFormat(EngineState *s, int funct_nr, int argc, reg_t *argv) {
int *arguments; int *arguments;
reg_t dest = argv[0]; reg_t dest = argv[0];
char *target = (char *) kernel_dereference_bulk_pointer(s, dest, 0); char *target = (char *) kernel_dereference_bulk_pointer(s->segmentManager, dest, 0);
reg_t position = argv[1]; /* source */ reg_t position = argv[1]; /* source */
int index = argv[2].toUint16(); int index = argv[2].toUint16();
char *source; char *source;
@ -630,7 +633,7 @@ reg_t kFormat(EngineState *s, int funct_nr, int argc, reg_t *argv) {
reg_t kStrLen(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrLen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *str = kernel_dereference_char_pointer(s, argv[0], 0); char *str = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
if (!str) { if (!str) {
warning("StrLen: invalid pointer %04x:%04x", PRINT_REG(argv[0])); warning("StrLen: invalid pointer %04x:%04x", PRINT_REG(argv[0]));
@ -662,7 +665,7 @@ reg_t kGetFarText(EngineState *s, int funct_nr, int argc, reg_t *argv) {
** resource. ** resource.
*/ */
strcpy(kernel_dereference_char_pointer(s, argv[2], 0), seeker); /* Copy the string and get return value */ strcpy(kernel_dereference_char_pointer(s->segmentManager, argv[2], 0), seeker); /* Copy the string and get return value */
return argv[2]; return argv[2];
} }
@ -737,7 +740,7 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (!bufferReg.isNull()) { if (!bufferReg.isNull()) {
int len = str.size() + 1; int len = str.size() + 1;
buffer = kernel_dereference_char_pointer(s, bufferReg, len); buffer = kernel_dereference_char_pointer(s->segmentManager, bufferReg, len);
if (buffer) { if (buffer) {
strcpy(buffer, str.c_str()); strcpy(buffer, str.c_str());
@ -745,7 +748,7 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(bufferReg), len, str.c_str()); warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(bufferReg), len, str.c_str());
// Set buffer to empty string if possible // Set buffer to empty string if possible
buffer = kernel_dereference_char_pointer(s, bufferReg, 1); buffer = kernel_dereference_char_pointer(s->segmentManager, bufferReg, 1);
if (buffer) if (buffer)
*buffer = 0; *buffer = 0;
} }
@ -785,7 +788,7 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
case K_MESSAGE_LASTMESSAGE: { case K_MESSAGE_LASTMESSAGE: {
MessageTuple msg = s->_msgState.getLastTuple(); MessageTuple msg = s->_msgState.getLastTuple();
int module = s->_msgState.getLastModule(); int module = s->_msgState.getLastModule();
byte *buffer = kernel_dereference_bulk_pointer(s, argv[1], 10); byte *buffer = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 10);
if (buffer) { if (buffer) {
WRITE_LE_UINT16(buffer, module); WRITE_LE_UINT16(buffer, module);
@ -807,18 +810,18 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
} }
reg_t kSetQuitStr(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kSetQuitStr(EngineState *s, int funct_nr, int argc, reg_t *argv) {
char *quitStr = kernel_dereference_char_pointer(s, argv[0], 0); char *quitStr = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
debug("Setting quit string to '%s'", quitStr); debug("Setting quit string to '%s'", quitStr);
return s->r_acc; return s->r_acc;
} }
reg_t kStrSplit(EngineState *s, int funct_nr, int argc, reg_t *argv) { reg_t kStrSplit(EngineState *s, int funct_nr, int argc, reg_t *argv) {
const char *format = kernel_dereference_char_pointer(s, argv[1], 0); const char *format = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
const char *sep = !argv[2].isNull() ? kernel_dereference_char_pointer(s, argv[2], 0) : NULL; const char *sep = !argv[2].isNull() ? kernel_dereference_char_pointer(s->segmentManager, argv[2], 0) : NULL;
Common::String str = s->strSplit(format, sep); Common::String str = s->strSplit(format, sep);
// Make sure target buffer is large enough // Make sure target buffer is large enough
char *buf = kernel_dereference_char_pointer(s, argv[0], str.size() + 1); char *buf = kernel_dereference_char_pointer(s->segmentManager, argv[0], str.size() + 1);
if (buf) { if (buf) {
strcpy(buf, str.c_str()); strcpy(buf, str.c_str());

View file

@ -138,6 +138,7 @@ Script *SegManager::allocateScript(int script_nr, SegmentId *seg_id) {
void SegManager::setScriptSize(Script &scr, int script_nr) { void SegManager::setScriptSize(Script &scr, int script_nr) {
Resource *script = _resourceManager->findResource(ResourceId(kResourceTypeScript, script_nr), 0); Resource *script = _resourceManager->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
Resource *heap = _resourceManager->findResource(ResourceId(kResourceTypeHeap, script_nr), 0); Resource *heap = _resourceManager->findResource(ResourceId(kResourceTypeHeap, script_nr), 0);
bool oldScriptHeader = (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY);
scr.script_size = script->size; scr.script_size = script->size;
scr.heap_size = 0; // Set later scr.heap_size = 0; // Set later
@ -145,7 +146,7 @@ void SegManager::setScriptSize(Script &scr, int script_nr) {
if (!script || (_resourceManager->sciVersion() >= SCI_VERSION_1_1 && !heap)) { if (!script || (_resourceManager->sciVersion() >= SCI_VERSION_1_1 && !heap)) {
error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap"); error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap");
} }
if (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY) { // check if we got an old script header if (oldScriptHeader) {
scr.buf_size = script->size + READ_LE_UINT16(script->data) * 2; scr.buf_size = script->size + READ_LE_UINT16(script->data) * 2;
//locals_size = READ_LE_UINT16(script->data) * 2; //locals_size = READ_LE_UINT16(script->data) * 2;
} else if (_resourceManager->sciVersion() < SCI_VERSION_1_1) { } else if (_resourceManager->sciVersion() < SCI_VERSION_1_1) {
@ -390,7 +391,6 @@ void SegManager::scriptRelocate(reg_t block) {
for (k = 0; k < scr->_objects.size(); k++) for (k = 0; k < scr->_objects.size(); k++)
printf("- obj#%d at %04x w/ %d vars\n", k, scr->_objects[k].pos.offset, scr->_objects[k]._variables.size()); printf("- obj#%d at %04x w/ %d vars\n", k, scr->_objects[k].pos.offset, scr->_objects[k]._variables.size());
// SQ3 script 71 has broken relocation entries. // SQ3 script 71 has broken relocation entries.
// Since this is mainstream, we can't break out as we used to do.
printf("Trying to continue anyway...\n"); printf("Trying to continue anyway...\n");
} }
} }

View file

@ -183,11 +183,11 @@ kLanguage EngineState::getLanguage() {
kLanguage lang = K_LANG_ENGLISH; kLanguage lang = K_LANG_ENGLISH;
if (((SciEngine*)g_engine)->getKernel()->_selectorMap.printLang != -1) { if (((SciEngine*)g_engine)->getKernel()->_selectorMap.printLang != -1) {
EngineState *s = this; SegManager *segManager = this->segmentManager;
lang = (kLanguage)GET_SEL32V(s->game_obj, printLang); lang = (kLanguage)GET_SEL32V(this->game_obj, printLang);
if ((s->resourceManager->sciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) { if ((segManager->sciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
// If language is set to none, we use the language from the game detector. // If language is set to none, we use the language from the game detector.
// SSCI reads this from resource.cfg (early games do not have a language // SSCI reads this from resource.cfg (early games do not have a language
// setting in resource.cfg, but instead have the secondary language number // setting in resource.cfg, but instead have the secondary language number
@ -220,7 +220,7 @@ kLanguage EngineState::getLanguage() {
} }
// Store language in printLang selector // Store language in printLang selector
PUT_SEL32V(s->game_obj, printLang, lang); PUT_SEL32V(this->game_obj, printLang, lang);
} }
} }
@ -228,13 +228,13 @@ kLanguage EngineState::getLanguage() {
} }
Common::String EngineState::strSplit(const char *str, const char *sep) { Common::String EngineState::strSplit(const char *str, const char *sep) {
EngineState *s = this; SegManager *segManager = this->segmentManager;
kLanguage lang = getLanguage(); kLanguage lang = getLanguage();
kLanguage subLang = K_LANG_NONE; kLanguage subLang = K_LANG_NONE;
if (((SciEngine*)g_engine)->getKernel()->_selectorMap.subtitleLang != -1) if (((SciEngine*)g_engine)->getKernel()->_selectorMap.subtitleLang != -1)
subLang = (kLanguage)GET_SEL32V(s->game_obj, subtitleLang); subLang = (kLanguage)GET_SEL32V(this->game_obj, subtitleLang);
Common::String retval = getLanguageString(str, lang); Common::String retval = getLanguageString(str, lang);

View file

@ -103,7 +103,7 @@ static int internal_is_valid_stringfrag(EngineState *s, reg_t *buffer) {
} }
int is_valid_stringfrag(EngineState *s, reg_t pos) { int is_valid_stringfrag(EngineState *s, reg_t pos) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
return internal_is_valid_stringfrag(s, buffer); return internal_is_valid_stringfrag(s, buffer);
} }
@ -138,7 +138,7 @@ static int internal_stringfrag_length(EngineState *s, reg_t *buffer) {
} }
int stringfrag_length(EngineState *s, reg_t pos) { int stringfrag_length(EngineState *s, reg_t pos) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
return internal_stringfrag_length(s, buffer); return internal_stringfrag_length(s, buffer);
} }
@ -169,7 +169,7 @@ static void internal_stringfrag_to_ascii(EngineState *s, reg_t *buffer) {
} }
void stringfrag_to_ascii(EngineState *s, reg_t pos) { void stringfrag_to_ascii(EngineState *s, reg_t pos) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
internal_stringfrag_to_ascii(s, buffer); internal_stringfrag_to_ascii(s, buffer);
} }
@ -191,7 +191,7 @@ static void internal_ascii_to_stringfrag(EngineState *s, reg_t *buffer) {
} }
void ascii_to_stringfrag(EngineState *s, reg_t pos) { void ascii_to_stringfrag(EngineState *s, reg_t pos) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
internal_ascii_to_stringfrag(s, buffer); internal_ascii_to_stringfrag(s, buffer);
} }
@ -214,7 +214,7 @@ static void internal_stringfrag_append_char(EngineState *s, reg_t *buffer, unsig
} }
void stringfrag_append_char(EngineState *s, reg_t pos, unsigned char c) { void stringfrag_append_char(EngineState *s, reg_t pos, unsigned char c) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
internal_stringfrag_append_char(s, buffer, c); internal_stringfrag_append_char(s, buffer, c);
} }
@ -311,7 +311,7 @@ static void internal_stringfrag_insert_char(EngineState *s, reg_t *buffer, int p
} }
void stringfrag_insert_char(EngineState *s, reg_t pos, int p, unsigned char c) { void stringfrag_insert_char(EngineState *s, reg_t pos, int p, unsigned char c) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
internal_stringfrag_insert_char(s, buffer, p, c); internal_stringfrag_insert_char(s, buffer, p, c);
} }
@ -343,7 +343,7 @@ static void internal_stringfrag_delete_char(EngineState *s, reg_t *buffer, int p
} }
void stringfrag_delete_char(EngineState *s, reg_t pos, int p) { void stringfrag_delete_char(EngineState *s, reg_t pos, int p) {
reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1); reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
internal_stringfrag_delete_char(s, buffer, p); internal_stringfrag_delete_char(s, buffer, p);
} }
@ -360,8 +360,8 @@ void internal_stringfrag_strcpy(EngineState *s, reg_t *dest, reg_t *src) {
} }
void stringfrag_strcpy(EngineState *s, reg_t dest, reg_t src) { void stringfrag_strcpy(EngineState *s, reg_t dest, reg_t src) {
reg_t *destbuf = kernel_dereference_reg_pointer(s, dest, 1); reg_t *destbuf = kernel_dereference_reg_pointer(s->segmentManager, dest, 1);
reg_t *srcbuf = kernel_dereference_reg_pointer(s, src, 1); reg_t *srcbuf = kernel_dereference_reg_pointer(s->segmentManager, src, 1);
internal_stringfrag_strcpy(s, destbuf, srcbuf); internal_stringfrag_strcpy(s, destbuf, srcbuf);
} }
@ -388,8 +388,8 @@ void internal_stringfrag_strncpy(EngineState *s, reg_t *dest, reg_t *src, int le
} }
void stringfrag_strncpy(EngineState *s, reg_t dest, reg_t src, int len) { void stringfrag_strncpy(EngineState *s, reg_t dest, reg_t src, int len) {
reg_t *destbuf = kernel_dereference_reg_pointer(s, dest, 1); reg_t *destbuf = kernel_dereference_reg_pointer(s->segmentManager, dest, 1);
reg_t *srcbuf = kernel_dereference_reg_pointer(s, src, 1); reg_t *srcbuf = kernel_dereference_reg_pointer(s->segmentManager, src, 1);
internal_stringfrag_strncpy(s, destbuf, srcbuf, len); internal_stringfrag_strncpy(s, destbuf, srcbuf, len);
} }
@ -416,8 +416,8 @@ int internal_stringfrag_strcmp(EngineState *s, reg_t *s1, reg_t *s2) {
} }
void stringfrag_strcmp(EngineState *s, reg_t s1, reg_t s2) { void stringfrag_strcmp(EngineState *s, reg_t s1, reg_t s2) {
reg_t *s1buf = kernel_dereference_reg_pointer(s, s1, 1); reg_t *s1buf = kernel_dereference_reg_pointer(s->segmentManager, s1, 1);
reg_t *s2buf = kernel_dereference_reg_pointer(s, s2, 1); reg_t *s2buf = kernel_dereference_reg_pointer(s->segmentManager, s2, 1);
internal_stringfrag_strcmp(s, s1buf, s2buf); internal_stringfrag_strcmp(s, s1buf, s2buf);
} }
@ -449,8 +449,8 @@ int internal_stringfrag_strncmp(EngineState *s, reg_t *s1, reg_t *s2, int len) {
} }
void stringfrag_strncmp(EngineState *s, reg_t s1, reg_t s2, int len) { void stringfrag_strncmp(EngineState *s, reg_t s1, reg_t s2, int len) {
reg_t *s1buf = kernel_dereference_reg_pointer(s, s1, 1); reg_t *s1buf = kernel_dereference_reg_pointer(s->segmentManager, s1, 1);
reg_t *s2buf = kernel_dereference_reg_pointer(s, s2, 1); reg_t *s2buf = kernel_dereference_reg_pointer(s->segmentManager, s2, 1);
internal_stringfrag_strncmp(s, s1buf, s2buf, len); internal_stringfrag_strncmp(s, s1buf, s2buf, len);
} }

View file

@ -248,10 +248,10 @@ static void _exec_varselectors(EngineState *s) {
ExecStack &xs = s->_executionStack.back(); ExecStack &xs = s->_executionStack.back();
// varselector access? // varselector access?
if (xs.argc) { // write? if (xs.argc) { // write?
*(xs.getVarPointer(s)) = xs.variables_argp[1]; *(xs.getVarPointer(s->segmentManager)) = xs.variables_argp[1];
} else // No, read } else // No, read
s->r_acc = *(xs.getVarPointer(s)); s->r_acc = *(xs.getVarPointer(s->segmentManager));
s->_executionStack.pop_back(); s->_executionStack.pop_back();
} }
@ -338,7 +338,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
#endif #endif
{ // Argument is supplied -> Selector should be set { // Argument is supplied -> Selector should be set
if (print_send_action) { if (print_send_action) {
reg_t oldReg = *varp.getPointer(s); reg_t oldReg = *varp.getPointer(s->segmentManager);
reg_t newReg = argp[1]; reg_t newReg = argp[1];
printf("[write to selector: change %04x:%04x to %04x:%04x]\n", PRINT_REG(oldReg), PRINT_REG(newReg)); printf("[write to selector: change %04x:%04x to %04x:%04x]\n", PRINT_REG(oldReg), PRINT_REG(newReg));
@ -936,7 +936,7 @@ void run_vm(EngineState *s, int restoring) {
argc += scriptState.restAdjust; argc += scriptState.restAdjust;
if (((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature if (((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature
&& !kernel_matches_signature(s, && !kernel_matches_signature(s->segmentManager,
((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature, argc, ((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature, argc,
scriptState.xs->sp + 1)) { scriptState.xs->sp + 1)) {
error("[VM] Invalid arguments to kernel call %x", opparams[0]); error("[VM] Invalid arguments to kernel call %x", opparams[0]);
@ -1003,9 +1003,9 @@ void run_vm(EngineState *s, int restoring) {
if (old_xs->type == EXEC_STACK_TYPE_VARSELECTOR) { if (old_xs->type == EXEC_STACK_TYPE_VARSELECTOR) {
// varselector access? // varselector access?
if (old_xs->argc) // write? if (old_xs->argc) // write?
*(old_xs->getVarPointer(s)) = old_xs->variables_argp[1]; *(old_xs->getVarPointer(s->segmentManager)) = old_xs->variables_argp[1];
else // No, read else // No, read
s->r_acc = *(old_xs->getVarPointer(s)); s->r_acc = *(old_xs->getVarPointer(s->segmentManager));
} }
// Not reached the base, so let's do a soft return // Not reached the base, so let's do a soft return
@ -1984,15 +1984,15 @@ void shrink_execution_stack(EngineState *s, uint size) {
s->_executionStack.erase(iter, s->_executionStack.end()); s->_executionStack.erase(iter, s->_executionStack.end());
} }
reg_t* ObjVarRef::getPointer(EngineState *s) const { reg_t* ObjVarRef::getPointer(SegManager *segManager) const {
Object *o = obj_get(s->segmentManager, obj); Object *o = obj_get(segManager, obj);
if (!o) return 0; if (!o) return 0;
return &(o->_variables[varindex]); return &(o->_variables[varindex]);
} }
reg_t* ExecStack::getVarPointer(EngineState *s) const { reg_t* ExecStack::getVarPointer(SegManager *segManager) const {
assert(type == EXEC_STACK_TYPE_VARSELECTOR); assert(type == EXEC_STACK_TYPE_VARSELECTOR);
return addr.varp.getPointer(s); return addr.varp.getPointer(segManager);
} }
} // End of namespace Sci } // End of namespace Sci

View file

@ -212,7 +212,7 @@ struct ObjVarRef {
reg_t obj; reg_t obj;
int varindex; int varindex;
reg_t* getPointer(EngineState *s) const; reg_t* getPointer(SegManager *segManager) const;
}; };
@ -263,7 +263,7 @@ struct ExecStack {
int origin; // The stack frame position the call was made from, or -1 if it was the initial call int origin; // The stack frame position the call was made from, or -1 if it was the initial call
ExecStackType type; ExecStackType type;
reg_t* getVarPointer(EngineState *s) const; reg_t* getVarPointer(SegManager *segManager) const;
}; };

View file

@ -294,7 +294,7 @@ int Menubar::setAttribute(EngineState *s, int menu_nr, int item_nr, int attribut
case MENU_ATTRIBUTE_SAID: case MENU_ATTRIBUTE_SAID:
if (value.segment) { if (value.segment) {
item->_saidPos = value; item->_saidPos = value;
memcpy(item->_said, kernel_dereference_bulk_pointer(s, value, 0), MENU_SAID_SPEC_SIZE); // Copy Said spec memcpy(item->_said, kernel_dereference_bulk_pointer(s->segmentManager, value, 0), MENU_SAID_SPEC_SIZE); // Copy Said spec
item->_flags |= MENU_ATTRIBUTE_FLAGS_SAID; item->_flags |= MENU_ATTRIBUTE_FLAGS_SAID;
} else } else
@ -304,7 +304,7 @@ int Menubar::setAttribute(EngineState *s, int menu_nr, int item_nr, int attribut
case MENU_ATTRIBUTE_TEXT: case MENU_ATTRIBUTE_TEXT:
assert(value.segment); assert(value.segment);
item->_text = kernel_dereference_char_pointer(s, value, 0); item->_text = kernel_dereference_char_pointer(s->segmentManager, value, 0);
item->_textPos = value; item->_textPos = value;
break; break;