aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/gargoyle/frotz/err.cpp134
-rw-r--r--engines/gargoyle/frotz/err.h117
-rw-r--r--engines/gargoyle/frotz/frotz_types.h64
-rw-r--r--engines/gargoyle/frotz/mem.h1
-rw-r--r--engines/gargoyle/frotz/processor.cpp3
-rw-r--r--engines/gargoyle/frotz/processor.h51
-rw-r--r--engines/gargoyle/frotz/processor_buffer.cpp98
-rw-r--r--engines/gargoyle/frotz/processor_text.cpp11
-rw-r--r--engines/gargoyle/module.mk1
9 files changed, 180 insertions, 300 deletions
diff --git a/engines/gargoyle/frotz/err.cpp b/engines/gargoyle/frotz/err.cpp
deleted file mode 100644
index f75b764ad0..0000000000
--- a/engines/gargoyle/frotz/err.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "gargoyle/frotz/err.h"
-#include "gargoyle/frotz/frotz.h"
-#include "common/textconsole.h"
-
-namespace Gargoyle {
-namespace Frotz {
-
-const char *const Errors::ERR_MESSAGES[ERR_NUM_ERRORS] = {
- "Text buffer overflow",
- "Store out of dynamic memory",
- "Division by zero",
- "Illegal object",
- "Illegal attribute",
- "No such property",
- "Stack overflow",
- "Call to illegal address",
- "Call to non-routine",
- "Stack underflow",
- "Illegal opcode",
- "Bad stack frame",
- "Jump to illegal address",
- "Can't save while in interrupt",
- "Nesting stream #3 too deep",
- "Illegal window",
- "Illegal window property",
- "Print at illegal address",
- "Illegal dictionary word length",
- "@jin called with object 0",
- "@get_child called with object 0",
- "@get_parent called with object 0",
- "@get_sibling called with object 0",
- "@get_prop_addr called with object 0",
- "@get_prop called with object 0",
- "@put_prop called with object 0",
- "@clear_attr called with object 0",
- "@set_attr called with object 0",
- "@test_attr called with object 0",
- "@move_object called moving object 0",
- "@move_object called moving into object 0",
- "@remove_object called with object 0",
- "@get_next_prop called with object 0"
-};
-
-Errors::Errors() {
- Common::fill(&_count[0], &_count[ERR_NUM_ERRORS], 0);
-}
-
-void Errors::runtimeError(ErrorCode errNum) {
-#ifdef TODO
- int wasfirst;
-
- if (errNum <= 0 || errNum > ERR_NUM_ERRORS)
- return;
-
- if (g_vm->_err_report_mode == ERR_REPORT_FATAL
- || (!g_vm->_ignore_errors && errNum <= ERR_MAX_FATAL)) {
- g_vm->_buffer.flush();
- error(ERR_MESSAGES[errNum - 1]);
- return;
- }
-
- wasfirst = (_count[errNum - 1] == 0);
- _count[errNum - 1]++;
-
- if ((g_vm->_err_report_mode == ERR_REPORT_ALWAYS)
- || (_err_report_mode == ERR_REPORT_ONCE && wasfirst)) {
- long pc = g_vm->_processor
- GET_PC(pc);
- printString("Warning: ");
- printString(ERR_MESSAGES[errNum - 1]);
- printString(" (PC = ");
- printLong(pc, 16);
- printChar(')');
-
- if (_err_report_mode == ERR_REPORT_ONCE) {
- printString(" (will ignore further occurrences)");
- } else {
- printString(" (occurence ");
- printLong(_count[errNum - 1], 10);
- printChar(')');
- }
-
- newLine();
- }
-#endif
-}
-
-void Errors::printLong(uint value, int base) {
- unsigned long i;
- char c;
-
- for (i = (base == 10 ? 1000000000 : 0x10000000); i != 0; i /= base)
- if (value >= i || i == 1) {
- c = (value / i) % base;
- printChar(c + (c <= 9 ? '0' : 'a' - 10));
- }
-}
-
-void Errors::printChar(const char c) {
- // TODO
-}
-
-void Errors::printString(const char *str) {
- // TODO
-}
-
-void Errors::newLine() {
- // TODO
-}
-
-} // End of namespace Scott
-} // End of namespace Gargoyle
diff --git a/engines/gargoyle/frotz/err.h b/engines/gargoyle/frotz/err.h
deleted file mode 100644
index 090ce3f7df..0000000000
--- a/engines/gargoyle/frotz/err.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef GARGOYLE_FROTZ_ERR
-#define GARGOYLE_FROTZ_ERR
-
-#include "gargoyle/frotz/frotz_types.h"
-
-namespace Gargoyle {
-namespace Frotz {
-
-enum ErrorCode {
- ERR_TEXT_BUF_OVF = 1, ///< Text buffer overflow
- ERR_STORE_RANGE = 2, ///< Store out of dynamic memory
- ERR_DIV_ZERO = 3, ///< Division by zero
- ERR_ILL_OBJ = 4, ///< Illegal object
- ERR_ILL_ATTR = 5, ///< Illegal attribute
- ERR_NO_PROP = 6, ///< No such property
- ERR_STK_OVF = 7, ///< Stack overflow
- ERR_ILL_CALL_ADDR = 8, ///< Call to illegal address
- ERR_CALL_NON_RTN = 9, ///< Call to non-routine
- ERR_STK_UNDF = 10, ///< Stack underflow
- ERR_ILL_OPCODE = 11, ///< Illegal opcode
- ERR_BAD_FRAME = 12, ///< Bad stack frame
- ERR_ILL_JUMP_ADDR = 13, ///< Jump to illegal address
- ERR_SAVE_IN_INTER = 14, ///< Can't save while in interrupt
- ERR_STR3_NESTING = 15, ///< Nesting stream #3 too deep
- ERR_ILL_WIN = 16, ///< Illegal window
- ERR_ILL_WIN_PROP = 17, ///< Illegal window property
- ERR_ILL_PRINT_ADDR = 18, ///< Print at illegal address
- ERR_DICT_LEN = 19, ///< Illegal dictionary word length
- ERR_MAX_FATAL = 19,
-
- // Less serious errors
- ERR_JIN_0 = 20, ///< @jin called with object 0
- ERR_GET_CHILD_0 = 21, ///< @get_child called with object 0
- ERR_GET_PARENT_0 = 22, ///< @get_parent called with object 0
- ERR_GET_SIBLING_0 = 23, ///< @get_sibling called with object 0
- ERR_GET_PROP_ADDR_0 = 24, ///< @get_prop_addr called with object 0
- ERR_GET_PROP_0 = 25, ///< @get_prop called with object 0
- ERR_PUT_PROP_0 = 26, ///< @put_prop called with object 0
- ERR_CLEAR_ATTR_0 = 27, ///< @clear_attr called with object 0
- ERR_SET_ATTR_0 = 28, ///< @set_attr called with object 0
- ERR_TEST_ATTR_0 = 29, ///< @test_attr called with object 0
- ERR_MOVE_OBJECT_0 = 30, ///< @move_object called moving object 0
- ERR_MOVE_OBJECT_TO_0 = 31, ///< @move_object called moving into object 0
- ERR_REMOVE_OBJECT_0 = 32, ///< @remove_object called with object 0
- ERR_GET_NEXT_PROP_0 = 33, ///< @get_next_prop called with object 0
- ERR_NUM_ERRORS = 33
-};
-
-class Errors {
-private:
- static const char *const ERR_MESSAGES[ERR_NUM_ERRORS];
- int _count[ERR_NUM_ERRORS];
-private:
- /**
- * Print an unsigned 32bit number in decimal or hex.
- */
- void printLong(uint value, int base);
-
- /**
- * Print a character
- */
- void printChar(const char c);
-
- /**
- * Print a string
- */
- void printString(const char *str);
-
- /**
- * Add a newline
- */
- void newLine();
-protected:
- /**
- * Get the PC. Is implemented by the Processor class, which derives from Errors
- */
- virtual uint getPC() const = 0;
-public:
- /**
- * Constructor
- */
- Errors();
-
- /**
- * An error has occurred. Ignore it, pass it to os_fatal or report
- * it according to err_report_mode.
- * @param errNum Numeric code for error (1 to ERR_NUM_ERRORS)
- */
- void runtimeError(ErrorCode errNum);
-};
-
-} // End of namespace Frotz
-} // End of namespace Gargoyle
-
-#endif
diff --git a/engines/gargoyle/frotz/frotz_types.h b/engines/gargoyle/frotz/frotz_types.h
index 3ccaa451f8..6efd0fca5a 100644
--- a/engines/gargoyle/frotz/frotz_types.h
+++ b/engines/gargoyle/frotz/frotz_types.h
@@ -149,19 +149,59 @@ enum {
TRANSPARENT_FLAG = 0x0001 ///< Game wants to use transparency - V6
};
+enum ErrorCode {
+ ERR_TEXT_BUF_OVF = 1, ///< Text buffer overflow
+ ERR_STORE_RANGE = 2, ///< Store out of dynamic memory
+ ERR_DIV_ZERO = 3, ///< Division by zero
+ ERR_ILL_OBJ = 4, ///< Illegal object
+ ERR_ILL_ATTR = 5, ///< Illegal attribute
+ ERR_NO_PROP = 6, ///< No such property
+ ERR_STK_OVF = 7, ///< Stack overflow
+ ERR_ILL_CALL_ADDR = 8, ///< Call to illegal address
+ ERR_CALL_NON_RTN = 9, ///< Call to non-routine
+ ERR_STK_UNDF = 10, ///< Stack underflow
+ ERR_ILL_OPCODE = 11, ///< Illegal opcode
+ ERR_BAD_FRAME = 12, ///< Bad stack frame
+ ERR_ILL_JUMP_ADDR = 13, ///< Jump to illegal address
+ ERR_SAVE_IN_INTER = 14, ///< Can't save while in interrupt
+ ERR_STR3_NESTING = 15, ///< Nesting stream #3 too deep
+ ERR_ILL_WIN = 16, ///< Illegal window
+ ERR_ILL_WIN_PROP = 17, ///< Illegal window property
+ ERR_ILL_PRINT_ADDR = 18, ///< Print at illegal address
+ ERR_DICT_LEN = 19, ///< Illegal dictionary word length
+ ERR_MAX_FATAL = 19,
+
+ // Less serious errors
+ ERR_JIN_0 = 20, ///< @jin called with object 0
+ ERR_GET_CHILD_0 = 21, ///< @get_child called with object 0
+ ERR_GET_PARENT_0 = 22, ///< @get_parent called with object 0
+ ERR_GET_SIBLING_0 = 23, ///< @get_sibling called with object 0
+ ERR_GET_PROP_ADDR_0 = 24, ///< @get_prop_addr called with object 0
+ ERR_GET_PROP_0 = 25, ///< @get_prop called with object 0
+ ERR_PUT_PROP_0 = 26, ///< @put_prop called with object 0
+ ERR_CLEAR_ATTR_0 = 27, ///< @clear_attr called with object 0
+ ERR_SET_ATTR_0 = 28, ///< @set_attr called with object 0
+ ERR_TEST_ATTR_0 = 29, ///< @test_attr called with object 0
+ ERR_MOVE_OBJECT_0 = 30, ///< @move_object called moving object 0
+ ERR_MOVE_OBJECT_TO_0 = 31, ///< @move_object called moving into object 0
+ ERR_REMOVE_OBJECT_0 = 32, ///< @remove_object called with object 0
+ ERR_GET_NEXT_PROP_0 = 33, ///< @get_next_prop called with object 0
+ ERR_NUM_ERRORS = 33
+};
+
enum FrotzInterp {
-#define INTERP_DEFAULT 0
-#define INTERP_DEC_20 1
-#define INTERP_APPLE_IIE 2
-#define INTERP_MACINTOSH 3
-#define INTERP_AMIGA 4
-#define INTERP_ATARI_ST 5
-#define INTERP_MSDOS 6
-#define INTERP_CBM_128 7
-#define INTERP_CBM_64 8
-#define INTERP_APPLE_IIC 9
-#define INTERP_APPLE_IIGS 10
-#define INTERP_TANDY 11
+ INTERP_DEFAULT = 0,
+ INTERP_DEC_20 = 1,
+ INTERP_APPLE_IIE = 2,
+ INTERP_MACINTOSH = 3,
+ INTERP_AMIGA = 4,
+ INTERP_ATARI_ST = 5,
+ INTERP_MSDOS = 6,
+ INTERP_CBM_128 = 7,
+ INTERP_CBM_64 = 8,
+ INTERP_APPLE_IIC = 9,
+ INTERP_APPLE_IIGS = 10,
+ INTERP_TANDY = 11
};
enum Colour {
diff --git a/engines/gargoyle/frotz/mem.h b/engines/gargoyle/frotz/mem.h
index a45eec5e7f..a2e0e347b6 100644
--- a/engines/gargoyle/frotz/mem.h
+++ b/engines/gargoyle/frotz/mem.h
@@ -24,7 +24,6 @@
#define GARGOYLE_FROTZ_MEM
#include "gargoyle/frotz/frotz_types.h"
-#include "gargoyle/frotz/err.h"
namespace Gargoyle {
namespace Frotz {
diff --git a/engines/gargoyle/frotz/processor.cpp b/engines/gargoyle/frotz/processor.cpp
index ac18a23593..3336aaec8b 100644
--- a/engines/gargoyle/frotz/processor.cpp
+++ b/engines/gargoyle/frotz/processor.cpp
@@ -132,7 +132,7 @@ Opcode Processor::ext_opcodes[64] = {
};
Processor::Processor(OSystem *syst, const GargoyleGameDescription *gameDesc) :
- GlkInterface(syst, gameDesc), Errors(),
+ GlkInterface(syst, gameDesc),
_finished(0), _sp(nullptr), _fp(nullptr), _frameCount(0),
zargc(0), _decoded(nullptr), _encoded(nullptr), _resolution(0),
_randomInterval(0), _randomCtr(0), first_restart(true), script_valid(false),
@@ -180,6 +180,7 @@ Processor::Processor(OSystem *syst, const GargoyleGameDescription *gameDesc) :
Common::fill(&_stack[0], &_stack[STACK_SIZE], 0);
Common::fill(&zargs[0], &zargs[8], 0);
Common::fill(&_buffer[0], &_buffer[TEXT_BUFFER_SIZE], '\0');
+ Common::fill(&_errorCount[0], &_errorCount[ERR_NUM_ERRORS], 0);
}
void Processor::initialize() {
diff --git a/engines/gargoyle/frotz/processor.h b/engines/gargoyle/frotz/processor.h
index 0f7ecc06b4..3ead900762 100644
--- a/engines/gargoyle/frotz/processor.h
+++ b/engines/gargoyle/frotz/processor.h
@@ -23,7 +23,6 @@
#ifndef GARGOYLE_FROTZ_PROCESSOR
#define GARGOYLE_FROTZ_PROCESSOR
-#include "gargoyle/frotz/err.h"
#include "gargoyle/frotz/mem.h"
#include "gargoyle/frotz/glk_interface.h"
#include "gargoyle/frotz/frotz_types.h"
@@ -51,9 +50,15 @@ typedef void (Processor::*Opcode)();
/**
* Zcode processor
*/
-class Processor : public Errors, public GlkInterface, public virtual Mem {
+class Processor : public GlkInterface, public virtual Mem {
friend class Quetzal;
private:
+ Opcode op0_opcodes[16];
+ Opcode op1_opcodes[16];
+ static const char *const ERR_MESSAGES[ERR_NUM_ERRORS];
+ static Opcode var_opcodes[64];
+ static Opcode ext_opcodes[64];
+
int _finished;
zword zargs[8];
int zargc;
@@ -72,17 +77,13 @@ private:
static zchar ZSCII_TO_LATIN1[];
zchar *_decoded, *_encoded;
int _resolution;
+ int _errorCount[ERR_NUM_ERRORS];
// Buffer related fields
- zchar _buffer[TEXT_BUFFER_SIZE];
- size_t _bufPos;
bool _locked;
zchar _prevC;
-
- Opcode op0_opcodes[16];
- Opcode op1_opcodes[16];
- static Opcode var_opcodes[64];
- static Opcode ext_opcodes[64];
+ zchar _buffer[TEXT_BUFFER_SIZE];
+ size_t _bufPos;
// Stream related fields
int script_width;
@@ -172,6 +173,16 @@ private:
*/
void print_char(zchar c);
+ /**
+ * Print a string of ASCII characters.
+ */
+ void print_string(const char *s);
+
+ /**
+ * Print an unsigned 32bit number in decimal or hex.
+ */
+ void print_long(uint value, int base);
+
/**
* High level newline function.
*/
@@ -182,6 +193,13 @@ private:
*/
bool bufferEmpty() const { return !_bufPos; }
+ /**
+ * An error has occurred. Ignore it, pass it to os_fatal or report
+ * it according to err_report_mode.
+ * @param errNum Numeric code for error (1 to ERR_NUM_ERRORS)
+ */
+ void runtimeError(ErrorCode errNum);
+
/**@}*/
/**
@@ -217,13 +235,6 @@ private:
*/
/**
- * Generates a runtime error
- */
- virtual void runtimeError(ErrorCode errNum) override {
- Errors::runtimeError(errNum);
- }
-
- /**
* Called when the H_FLAGS field of the header has changed
*/
virtual void flagsChanged(zbyte value) override;
@@ -1395,11 +1406,6 @@ protected:
void z_print_ret();
/**
- * Print a string of ASCII characters.
- */
- void print_string(const char *s);
-
- /**
* Print unicode character
*
* zargs[0] = Unicode
@@ -1561,9 +1567,8 @@ public:
/**
* Return the current program execution offset
- * @remarks This virtual as a convenient way for the ancestor Err class to access
*/
- virtual uint getPC() const override { return pcp - zmp; }
+ uint getPC() const { return pcp - zmp; }
/**
* Set the program execution offset
diff --git a/engines/gargoyle/frotz/processor_buffer.cpp b/engines/gargoyle/frotz/processor_buffer.cpp
index b2b6ccd015..62980fb20e 100644
--- a/engines/gargoyle/frotz/processor_buffer.cpp
+++ b/engines/gargoyle/frotz/processor_buffer.cpp
@@ -27,6 +27,42 @@
namespace Gargoyle {
namespace Frotz {
+const char *const Processor::ERR_MESSAGES[ERR_NUM_ERRORS] = {
+ "Text buffer overflow",
+ "Store out of dynamic memory",
+ "Division by zero",
+ "Illegal object",
+ "Illegal attribute",
+ "No such property",
+ "Stack overflow",
+ "Call to illegal address",
+ "Call to non-routine",
+ "Stack underflow",
+ "Illegal opcode",
+ "Bad stack frame",
+ "Jump to illegal address",
+ "Can't save while in interrupt",
+ "Nesting stream #3 too deep",
+ "Illegal window",
+ "Illegal window property",
+ "Print at illegal address",
+ "Illegal dictionary word length",
+ "@jin called with object 0",
+ "@get_child called with object 0",
+ "@get_parent called with object 0",
+ "@get_sibling called with object 0",
+ "@get_prop_addr called with object 0",
+ "@get_prop called with object 0",
+ "@put_prop called with object 0",
+ "@clear_attr called with object 0",
+ "@set_attr called with object 0",
+ "@test_attr called with object 0",
+ "@move_object called moving object 0",
+ "@move_object called moving into object 0",
+ "@remove_object called with object 0",
+ "@get_next_prop called with object 0"
+};
+
void Processor::flush_buffer() {
/* Make sure we stop when flush_buffer is called from flush_buffer.
* Note that this is difficult to avoid as we might print a newline
@@ -85,10 +121,72 @@ void Processor::print_char(zchar c) {
}
}
+void Processor::print_string(const char *s) {
+ char c;
+
+ while ((c = *s++) != 0) {
+ if (c == '\n')
+ new_line();
+ else
+ print_char(c);
+ }
+}
+
+void Processor::print_long(uint value, int base) {
+ unsigned long i;
+ char c;
+
+ for (i = (base == 10 ? 1000000000 : 0x10000000); i != 0; i /= base) {
+ if (value >= i || i == 1) {
+ c = (value / i) % base;
+ print_char(c + (c <= 9 ? '0' : 'a' - 10));
+ }
+ }
+}
+
void Processor::new_line() {
flush_buffer();
stream_new_line();
}
+void Processor::runtimeError(ErrorCode errNum) {
+ int wasfirst;
+
+ if (errNum <= 0 || errNum > ERR_NUM_ERRORS)
+ return;
+
+ if (_err_report_mode == ERR_REPORT_FATAL
+ || (!_ignore_errors && errNum <= ERR_MAX_FATAL)) {
+ flush_buffer();
+ error(ERR_MESSAGES[errNum - 1]);
+ return;
+ }
+
+ wasfirst = (_errorCount[errNum - 1] == 0);
+ _errorCount[errNum - 1]++;
+
+ if ((_err_report_mode == ERR_REPORT_ALWAYS)
+ || (_err_report_mode == ERR_REPORT_ONCE && wasfirst)) {
+ long pc;
+ GET_PC(pc);
+ print_string("Warning: ");
+ print_string(ERR_MESSAGES[errNum - 1]);
+ print_string(" (PC = ");
+ print_long(pc, 16);
+ print_char(')');
+
+ if (_err_report_mode == ERR_REPORT_ONCE) {
+ print_string(" (will ignore further occurrences)");
+ }
+ else {
+ print_string(" (occurence ");
+ print_long(_errorCount[errNum - 1], 10);
+ print_char(')');
+ }
+
+ new_line();
+ }
+}
+
} // End of namespace Scott
} // End of namespace Gargoyle
diff --git a/engines/gargoyle/frotz/processor_text.cpp b/engines/gargoyle/frotz/processor_text.cpp
index 630bd50dbe..0852dc4b38 100644
--- a/engines/gargoyle/frotz/processor_text.cpp
+++ b/engines/gargoyle/frotz/processor_text.cpp
@@ -479,17 +479,6 @@ void Processor::print_object(zword object) {
}
}
-void Processor::print_string(const char *s) {
- char c;
-
- while ((c = *s++) != 0) {
- if (c == '\n')
- new_line();
- else
- print_char(c);
- }
-}
-
zword Processor::lookup_text(int padding, zword dct) {
zword entry_addr;
zword entry_count;
diff --git a/engines/gargoyle/module.mk b/engines/gargoyle/module.mk
index 4694449349..3c09b32595 100644
--- a/engines/gargoyle/module.mk
+++ b/engines/gargoyle/module.mk
@@ -23,7 +23,6 @@ MODULE_OBJS := \
window_text_grid.o \
frotz/detection.o \
frotz/detection_tables.o \
- frotz/err.o \
frotz/frotz.o \
frotz/glk_interface.o \
frotz/mem.o \