- 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:
parent
70a63a8dbd
commit
ac025f4294
22 changed files with 237 additions and 199 deletions
|
@ -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);
|
||||||
|
|
|
@ -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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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 ********************/
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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]));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue