aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/kemu_old.c330
-rw-r--r--engines/sci/engine/simplesaid.c312
2 files changed, 0 insertions, 642 deletions
diff --git a/engines/sci/engine/kemu_old.c b/engines/sci/engine/kemu_old.c
deleted file mode 100644
index 4ec6c0a106..0000000000
--- a/engines/sci/engine/kemu_old.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/***************************************************************************
- kemu_old.c Copyright (C) 2002 Christoph Reichenbach
-
-
- This program may be modified and copied freely according to the terms of
- the GNU general public license (GPL), as long as the above copyright
- notice and the licensing information contained herein are preserved.
-
- Please refer to www.gnu.org for licensing details.
-
- This work is provided AS IS, without warranty of any kind, expressed or
- implied, including but not limited to the warranties of merchantibility,
- noninfringement, and fitness for a specific purpose. The author will not
- be held liable for any damage caused by this work or derivatives of it.
-
- By using this source code, you agree to the licensing terms as stated
- above.
-
-
- Please contact the maintainer for bug reports or inquiries.
-
- Current Maintainer:
-
- Christoph Reichenbach (CR) <jameson@linuxgames.com>
-
-***************************************************************************/
-/* Emulation code for old kernel functions */
-
-#include <engine.h>
-#include "kernel_compat.h"
-#include "kernel_types.h"
-#include "heap.h"
-
-#define EMU_HEAP_START_ADDR 1000
-
-#define EMU_TYPE_VERBATIM 0 /* Arithmetic values */
-#define EMU_TYPE_REGISTERS 1 /* Must re-interpret afterwards. Also used for objects. */
-#define EMU_TYPE_BLOCK 2 /* Bulk data; string or similar. May physically point to stack */
-
-static int funct_nr;
-
-typedef struct {
- heap_ptr start; /* Beginning of the block */
- reg_t pos; /* Needed for resolving conflicts */
- int length; /* Number of bytes occupied on the heap */
- object_t *obj; /* For object types: Pointer to the physical object */
-
- /* Emulation data part */
- int emudat_type; /* EMU_TYPE_... */
- heap_ptr emudat_location; /* Only for 1 and 2 */
- union {
- reg_t *regs; /* registers, for type 1 */
- byte *block; /* Bulk data location, for type 2 */
- } emu_data;
- int emudat_size; /* Amount of bytes or number of entries */
-} emu_param_t;
-
-static inline emu_param_t
-identify_value(state_t *s, reg_t reg, heap_ptr firstfree)
-{
- emu_param_t retval;
- int type = determine_reg_type(s, reg);
-
- retval.start = firstfree;
- retval.pos = reg;
-
- retval.obj = NULL;
- retval.length = 0;
- retval.emudat_type = EMU_TYPE_VERBATIM; /* To allow error aborts */
-
- if (type & KSIG_NULL)
- type &= KSIG_ARITHMETIC;
-
- switch (type) {
-
- case KSIG_ARITHMETIC: /* trivial */
- retval.emudat_size = 0;
- break;
-
- case KSIG_OBJECT:
- retval.emudat_type = EMU_TYPE_REGISTERS;
- retval.obj = obj_get(s, reg);
- if (!retval.obj) { BREAKPOINT(); }
- retval.length = -SCRIPT_OBJECT_MAGIC_OFFSET
- + retval.obj->variables_nr * 4 /* values and selectors */
- + 2; /* Extra magic selector word (is this really needed?) */
- retval.emu_data.regs = retval.obj->variables;
- retval.emudat_size = retval.obj->variables_nr;
- retval.emudat_location = retval.start - SCRIPT_OBJECT_MAGIC_OFFSET;
- break;
-
- case KSIG_REF: {
- retval.emudat_type = EMU_TYPE_BLOCK;
-
- retval.emu_data.block =
- s->seg_manager.dereference(&s->seg_manager,
- reg, &retval.emudat_size);
-
- if (!retval.emu_data.block) {
- SCIkdebug(SCIkERROR, "Cannot handle references into segment type %02x"
- " (from "PREG") during emulation\n",
- type, PRINT_REG(reg));
- retval.emudat_type = EMU_TYPE_VERBATIM;
- retval.length = 0;
- }
-
- retval.length = retval.emudat_size;
- retval.emudat_location = retval.start;
-
- break;
- }
-
- default:
- SCIkdebug(SCIkERROR, "Cannot handle argument type %02x (from "PREG
- ") during emulation\n",
- type, PRINT_REG(reg));
- }
-
- return retval;
-}
-
-static inline void
-writeout_value(state_t *s, emu_param_t *p)
-{
- if (p->obj) /* First copy object; don't need to read back this part later */
- memcpy(s->heap + p->start, p->obj->base_obj + SCRIPT_OBJECT_MAGIC_OFFSET,
- p->length);
-
- switch (p->emudat_type) {
-
- case EMU_TYPE_VERBATIM:
- SCIkdebug(SCIkEMU, "\tVerbatim/Arithmetic\n");
- return;
-
- case EMU_TYPE_REGISTERS: {
- int i, max = p->emudat_size;
-
- SCIkdebug(SCIkEMU, "\tObject, %d selectors\n", max);
-
- for (i = 0; i < max; i++) {
- byte *dest = s->heap + p->emudat_location + (i << 1);
-
- dest[0] = p->emu_data.regs[i].offset & 0xff;
- dest[1] = (p->emu_data.regs[i].offset >> 8) & 0xff;
- /* Assume they're all numeric values */
- }
- return;
- }
-
- case EMU_TYPE_BLOCK:
- SCIkdebug(SCIkEMU, "\tBulk\n");
- memcpy(s->heap + p->emudat_location, p->emu_data.block, p->emudat_size);
- return;
-
- default:
- BREAKPOINT();
- }
-}
-
-static inline void
-recover_value(state_t *s, emu_param_t *p)
-{ /* Writes back the value */
- switch (p->emudat_type) {
-
- case EMU_TYPE_VERBATIM:
- return;
-
- case EMU_TYPE_REGISTERS: {
- int i, max = p->emudat_size;
- for (i = 0; i < max; i++) {
- int val = GET_HEAP(p->emudat_location + (i << 1));
- if (p->emu_data.regs[i].offset != val) {
- SCIkdebug(SCIkEMU, " Recovering property #%d from %04x: 0:%04x\n",
- i, p->emudat_location + (i << 1), val);
- p->emu_data.regs[i] = make_reg(0, val);
- } else {
- SCIkdebug(SCIkEMU, " Property #%d from %04x is unchanged (%04x vs "PREG")\n",
- i, p->emudat_location + (i << 1), val, PRINT_REG(p->emu_data.regs[i]));
- }
- /* Don't overwrite unless something changed, to preserve pointers */
- }
- return;
- }
-
- case EMU_TYPE_BLOCK:
- memcpy(p->emu_data.block, s->heap + p->emudat_location, p->emudat_size);
- SCIkdebug(SCIkEMU, " Recovering %d raw bytes from %04x\n",
- p->emudat_size, p->emudat_location);
- return;
-
- default:
- BREAKPOINT();
- }
-}
-
-static void
-_restrict_against(state_t *s, emu_param_t *self, emu_param_t *other)
-{
- if (self->pos.segment != other->pos.segment)
- return;
-
- if (self->pos.offset <= other->pos.offset
- && self->pos.offset + self->emudat_size > other->pos.offset) {
- mem_obj_t *mobj = GET_SEGMENT_ANY(s->seg_manager, self->pos.segment);
-
- self->emudat_size = other->pos.offset - self->pos.offset;
-
- if (mobj && mobj->type == MEM_OBJ_STACK)
- self->emudat_size *= sizeof(reg_t); /* Accomodate for size differences */
- }
-}
-
-static void
-resolve_conflicts(state_t *s, emu_param_t *params, int count)
-{
- int i, j;
- for (i = 0; i < count; i++)
- for (j = 0; j < count; j++)
- if (i != j)
- _restrict_against(s, params + i, params + j);
-}
-
-reg_t
-kFsciEmu(state_t *s, int _funct_nr, int argc, reg_t *argv)
-{
- emu_param_t *shadow_args;
- funct_nr = _funct_nr;
-
- if (!s->kfunct_emu_table[funct_nr]) {
- SCIkwarn(SCIkERROR, "Attempt to emulate unknown kernel function %x\n",
- funct_nr);
- return NULL_REG;
- } else {
- heap_ptr argp = EMU_HEAP_START_ADDR; /* arguments go here */
- heap_ptr datap = argp + argc * 2; /* copied stuff goes here */
- int i;
-
- shadow_args = sci_malloc(sizeof(emu_param_t) * (argc + 1
- /* Prevents stupid warning */));
- memset(shadow_args, 0, sizeof(emu_param_t) * (argc + 1));
-
- SCIkdebug(SCIkEMU, "Emulating kernel call %s[%x] w/ %d arguments at HP:%04x\n",
- s->kernel_names[funct_nr], funct_nr, argc, argp);
-
- for (i = 0; i < argc; i++) {
- int emu_value = argv[i].offset; /* Value we'll pass to the function */
-
- SCIkdebug(SCIkEMU, " %3d : ["PREG"] ->\n", i, PRINT_REG(argv[i]));
-
- shadow_args[i] = identify_value(s, argv[i], datap);
-
- switch (shadow_args[i].emudat_type) {
-
- case EMU_TYPE_VERBATIM:
- break;
-
- case EMU_TYPE_REGISTERS:
- case EMU_TYPE_BLOCK:
- emu_value = shadow_args[i].emudat_location;
- break;
-
- default:
- BREAKPOINT();
-
- }
-
- SCIkdebug(SCIkEMU, "\t%04x [%d at %04x]\n",
- emu_value, shadow_args[i].length, shadow_args[i].start);
-
- PUT_HEAP(argp, emu_value);
- argp += 2;
-
- if (0xffff - shadow_args[i].length < datap) {
- SCIkdebug(SCIkERROR, "Out of heap space while emulating!\n");
- return NULL_REG;
- }
- datap += shadow_args[i].length; /* Step over last block we wrote */
- }
-
- for (i = 0; i < argc; i++)
- writeout_value(s, shadow_args + i);
-
- resolve_conflicts(s, shadow_args, argc);
-
- s->kfunct_emu_table[funct_nr](s, funct_nr, argc, EMU_HEAP_START_ADDR);
-
- for (i = 0; i < argc; i++)
- recover_value(s, shadow_args + i);
- free(shadow_args);
- return make_reg(0, s->acc);
- }
-}
-
-
-int
-read_selector16(state_t *s, heap_ptr object, selector_t selector_id, const char *file, int line)
-{
- int slc_count = GET_HEAP(object + SCRIPT_SELECTORCTR_OFFSET);
- int i;
- heap_ptr slc_names = object + slc_count * 2;
-
- for (i = 0; i < slc_count; i++) {
- if (GET_HEAP(slc_names + (i<<1)) == selector_id)
- return GET_HEAP(object + (i<<1));
- }
-
- SCIkdebug(SCIkWARNING, "[EMU] Could not read selector %d from HP:%04x (%s, L%d)\n",
- selector_id, object, file, line);
- return 0;
-}
-
-void
-write_selector16(state_t *s, heap_ptr object, selector_t selector_id,
- int value, const char *fname, int line)
-{
- int slc_count = GET_HEAP(object + SCRIPT_SELECTORCTR_OFFSET);
- int i;
- heap_ptr slc_names = object + slc_count * 2;
-
- for (i = 0; i < slc_count; i++) {
- if (GET_HEAP(slc_names + (i<<1)) == selector_id) {
- PUT_HEAP(object + (i<<1), value);
- return;
- }
- }
-
- SCIkdebug(SCIkWARNING, "[EMU] Could not write selector %d from HP:%04x (%s, L%d)\n",
- selector_id, object, fname, line);
-}
-
diff --git a/engines/sci/engine/simplesaid.c b/engines/sci/engine/simplesaid.c
deleted file mode 100644
index e74a3aec90..0000000000
--- a/engines/sci/engine/simplesaid.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/***************************************************************************
- simplesaid.c Copyright (C) 2000 Christoph Reichenbach
-
-
- This program may be modified and copied freely according to the terms of
- the GNU general public license (GPL), as long as the above copyright
- notice and the licensing information contained herein are preserved.
-
- Please refer to www.gnu.org for licensing details.
-
- This work is provided AS IS, without warranty of any kind, expressed or
- implied, including but not limited to the warranties of merchantibility,
- noninfringement, and fitness for a specific purpose. The author will not
- be held liable for any damage caused by this work or derivatives of it.
-
- By using this source code, you agree to the licensing terms as stated
- above.
-
-
- Please contact the maintainer for bug reports or inquiries.
-
- Current Maintainer:
-
- Christoph Reichenbach (CR) <jameson@linuxgames.com>
-
-***************************************************************************/
-
-
-#ifdef SCI_SIMPLE_SAID_CODE
-
-#include <engine.h>
-#include <kdebug.h>
-
-static int current_pword;
-static int said_pos;
-static int refstart_pos, parse_pos;
-static parse_tree_node_t *words;
-static int dontclaim; /* Whether the Parse() event should be claimed */
-static int reached_end;
-
-static state_t *state;
-static heap_ptr addr;
-
-#define WORDP_MODE_STAY 0
-#define WORDP_MODE_NEXT 1
-#define WORDP_MODE_SEEK 2
-
-/* hack */
-#define s state
-
-static inline int /* Returns whether the specified word matches */
-word_p(int mode, int word)
-{
- int oldpp = parse_pos;
- do {
- if (mode)
- ++parse_pos;
-
- current_pword = words[parse_pos << 1].content.value;
- /* SDEBUG("Word at %d = %03x\n", parse_pos, current_pword); */
- if (current_pword == word) {
- /* ++matches; */
- SCIkdebug(SCIkSAID, "wordp(%d, %03x) from %d -> 1\n", mode, word, oldpp);
-
- reached_end |= (words[(parse_pos + 1) << 1].type == -1);
-
- return 1;
- }
-
- } while ((mode == WORDP_MODE_SEEK) && (words[parse_pos <<1].type != -1));
-
- if (words[parse_pos << 1].type == -1)
- --parse_pos;
-
- SCIkdebug(SCIkSAID, "wordp(%d, %03x) from %d -> 0\n", mode, word, oldpp);
-
- return 0;
-}
-
-
-
-static inline int /* End of input? */
-end_p()
-{
- int val = (words[(parse_pos + 1) << 1 ].type == -1) || reached_end;
-
- SCIkdebug(SCIkSAID, "endp(pp=%d) = %d\n", parse_pos, val);
-
- return val;
-}
-
-
-
-static inline int /* Returns whether the current_word references that specified word */
-reference_p(int referenced_word_index, int word)
-{
- int val = 0;
- int seeker = (refstart_pos << 1) + 2;
-
- while (words[seeker].type != -1) {
-
- if (words[seeker].content.value == word)
- if (((words[seeker + 1].content.branches[0] > -1)
- && (words[seeker + 1].content.branches[0] == referenced_word_index))
- || ((words[seeker + 1].content.branches[1] > -1)
- && (words[seeker + 1].content.branches[1] == referenced_word_index))) {
- val = 1;
- reached_end |= (words[seeker + 2].type == -1);
- break;
- }
-
- seeker += 2;
- }
-
- SCIkdebug(SCIkSAID, "%03x > pos[%d] = %d (start at %d)\n", word, referenced_word_index, val, refstart_pos);
-
- return val;
-}
-
-
-static inline int /* Checks whether the current word has trailing references */
-follows_p(void)
-{
- /* int val = (words[(parse_pos << 1) + 1].content.branches[1] > (parse_pos << 1));
-
- SDEBUG("follows-p(pp=%d) = %d\n", parse_pos, val);*/
-
- dontclaim = 1;
- return 1; /* appears to work best */
-}
-
-
-static inline int
-next_parse_token(int *token_is_op)
-{
- int item = state->heap[addr++];
-
- if (item < 0xf0) {
- item = item << 8 | state->heap[addr++];
- *token_is_op = 0;
- } else
- *token_is_op = 1;
-
- return item;
-}
-
-#define STATE_INITIAL 0
-#define STATE_OR 1
-#define STATE_SEEK 2
-#define STATE_REF 3
-
-static int
-simplesaid(int minor_state, int terminator)
-{
- int major_state = STATE_INITIAL;
- int refword = parse_pos; /* The word references apply to */
- int aspiring_refword = -1; /* in "a < b < c", c refers to b, and aspiring_refword will be b. */
- int truth = 1;
- int token_is_op;
- SCIkdebug(SCIkSAID, "simplesaid(%02x)\n", terminator);
-
- while (42) {
-
- int token = next_parse_token(&token_is_op);
- SCIkdebug(SCIkSAID, "Got token %03x on truth %d\n", token, truth);
-
- if (token_is_op && (token == terminator)) {
- if (terminator == SAID_TERM)
- truth = truth && end_p();
- SCIkdebug(SCIkSAID, "Terminator; returning %d\n", truth);
- return truth;
- }
-
- if (token_is_op) /* operator? */
- switch (token) {
-
- case SAID_COMMA:
- minor_state = STATE_OR;
- break;
-
- case SAID_SLASH:
- if (!truth) {
- while (((token = next_parse_token(&token_is_op)) != terminator)
- && (token != SAID_TERM)); /* Proceed to end of block */
- if (token != terminator)
- SCIkwarn(SCIkERROR, "Syntax error: Unexpected end of spec");
- return 0;
- }
-
- major_state = STATE_SEEK;
- minor_state = STATE_INITIAL;
- break;
-
- case SAID_PARENC:
- SCIkwarn(SCIkERROR, "')' without matching '('\n");
- return 0;
-
- case SAID_PARENO:
- switch (minor_state) {
-
- case STATE_OR:
- truth |= simplesaid(minor_state, SAID_PARENC);
- break;
-
- case STATE_INITIAL:
- truth = truth && simplesaid(minor_state, SAID_PARENC);
- break;
-
- default:
- SCIkwarn(SCIkERROR, "'(' in minor state %d\n", minor_state);
- }
- break;
-
- case SAID_BRACKC:
- SCIkwarn(SCIkERROR, "']' without matching '['\n");
- return 0;
-
- case SAID_BRACKO: {
- int parse_pos_old = parse_pos;
- int recurse = simplesaid(minor_state, SAID_BRACKC);
- if (!recurse)
- parse_pos = parse_pos_old;
- break;
- }
-
- case SAID_LT:
- if (aspiring_refword > -1) /* "a < b < c" */
- refword = aspiring_refword; /* refword = 'b' (in the case above) */
- major_state = STATE_REF;
- break;
-
- case SAID_GT:
- return truth && follows_p();
-
- case SAID_TERM:
- SCIkwarn(SCIkERROR, "Unexpected end of spec\n");
- return 0;
-
- default:
- SCIkwarn(SCIkERROR, "Syntax error: Unexpected token 0x%02x\n", token);
- return 0;
- } else {
- int tempresult;
-
- /* ++word_tokens_nr; /* Normal word token */
-
- switch(major_state) {
-
- case STATE_INITIAL:
- tempresult = word_p(((minor_state == STATE_OR)? WORDP_MODE_STAY : WORDP_MODE_NEXT), token);
- refword = parse_pos;
- break;
-
- case STATE_SEEK:
- tempresult = word_p(WORDP_MODE_SEEK, token);
- major_state = STATE_INITIAL;
- refword = parse_pos;
- break;
-
- case STATE_REF:
- tempresult = reference_p(refword, token);
- aspiring_refword = parse_pos;
- break;
-
- default:
- SCIkwarn(SCIkERROR, "Invalid major state!\n");
- return 0;
- }
-
- SCIkdebug(SCIkSAID, "state=(%d,%d), truth = %d * %d\n", major_state, minor_state, truth, tempresult);
-
- if (minor_state == STATE_OR)
- truth |= tempresult;
- else
- truth = truth && tempresult;
-
- minor_state = STATE_INITIAL;
- }
- }
-}
-
-#undef s
-
-int
-vocab_simple_said_test(state_t *s, heap_ptr address)
-{
- int matched;
- current_pword = reached_end = 0;
- dontclaim = 0;
- said_pos = 0;
- if (s->parser_lastmatch_word == SAID_NO_MATCH)
- SCIkdebug(SCIkSAID, "lastmatch_word: none\n");
- else
- SCIkdebug(SCIkSAID, "lastmatch_word=%d\n", s->parser_lastmatch_word);
- parse_pos = (s->parser_lastmatch_word == SAID_NO_MATCH)? -1 : s->parser_lastmatch_word;
- refstart_pos = parse_pos;
- state = s;
- addr = address;
- words = s->parser_nodes;
- matched = simplesaid(STATE_INITIAL, SAID_TERM);
- SCIkdebug(SCIkSAID, "Result: (matched,dontclaim)=(%d,%d)\n", matched, dontclaim);
-
- if (!matched)
- return SAID_NO_MATCH;
-
- if (dontclaim) /* partial match */
- return parse_pos; /* Return lastmatch word */
-
- return SAID_FULL_MATCH;
-}
-
-#endif /* SCI_SIMPLE_SAID_CODE */