Added Nitfol and Frotz source code.
[rodin/chimara.git] / interpreters / nitfol / oplist.c
diff --git a/interpreters/nitfol/oplist.c b/interpreters/nitfol/oplist.c
new file mode 100644 (file)
index 0000000..454e02a
--- /dev/null
@@ -0,0 +1,222 @@
+/*  Nitfol - z-machine interpreter using Glk for output.
+    Copyright (C) 1999  Evin Robertson
+
+    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., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+
+    The author can be reached at nitfol@deja.com
+*/
+#include "nitfol.h"
+
+static void op_nop(void) { ; }
+
+static void op_XXX(void)
+{
+  zbyte ins = HIBYTE(oldPC);
+  n_show_error(E_INSTR, "illegal instruction", ins);
+}
+
+#ifdef HEADER
+
+/* offsets in opcodetable for various types */
+#define OFFSET_0OP 0x00
+#define OFFSET_1OP 0x10
+#define OFFSET_2OP 0x20
+#define OFFSET_VAR 0x40
+#define OFFSET_EXT 0x60
+#define OFFSET_END 0x80
+
+typedef void (*op_func)(void);
+
+#endif
+
+op_func opcodetable[] = {
+  /* 0OP */
+  op_rtrue,         op_rfalse,        op_print,         op_print_ret,
+  op_nop,           op_save4,         op_restore4,      op_restart,
+  op_ret_popped,    op_catch,         op_quit,          op_new_line,
+  op_show_status,   op_verify,        op_XXX,           op_piracy,
+  /* 1OP */
+  op_jz,            op_get_sibling,   op_get_child,     op_get_parent,
+  op_get_prop_len,  op_inc,           op_dec,           op_print_addr,
+  op_call_s,        op_remove_obj,    op_print_obj,     op_ret,
+  op_jump,          op_print_paddr,   op_load,          op_call_n,
+  /* 2OP */
+  op_XXX,           op_je,            op_jl,            op_jg,
+  op_dec_chk,       op_inc_chk,       op_jin,           op_test,
+  op_or,            op_and,           op_test_attr,     op_set_attr,
+  op_clear_attr,    op_store,         op_insert_obj,    op_loadw,
+  op_loadb,         op_get_prop,      op_get_prop_addr, op_get_next_prop,
+  op_add,           op_sub,           op_mul,           op_div,
+  op_mod,           op_call_s,        op_call_n,        op_set_colour,
+  op_throw,         op_XXX,           op_XXX,           op_XXX,    
+  /* VAR */
+  op_call_s,        op_storew,        op_storeb,        op_put_prop,
+  op_aread,         op_print_char,    op_print_num,     op_random,
+  op_push,          op_pull,          op_split_window,  op_set_window,
+  op_call_s,        op_erase_window,  op_erase_line,    op_set_cursor,
+  op_get_cursor,    op_set_text_style,op_buffer_mode,   op_output_stream,
+  op_input_stream,  op_sound_effect,  op_read_char,     op_scan_table,   
+  op_not,           op_call_n,        op_call_n,        op_tokenise,
+  op_encode_text,   op_copy_table,    op_print_table,   op_check_arg_count,
+  /* EXT */
+  op_save5,         op_restore5,      op_log_shift,     op_art_shift,
+  op_set_font,      op_draw_picture,  op_picture_data,  op_erase_picture,
+  op_set_margins,   op_save_undo,     op_restore_undo,  op_print_unicode,
+  op_check_unicode, op_XXX,           op_XXX,           op_XXX,    
+  op_move_window,   op_window_size,   op_window_style,  op_get_wind_prop,
+  op_scroll_window, op_pop_stack,     op_read_mouse,    op_mouse_window,
+  op_push_stack,    op_put_wind_prop, op_print_form,    op_make_menu,
+  op_picture_table, op_XXX,           op_XXX,           op_XXX
+};
+
+#ifdef DEBUGGING
+
+opcodeinfo opcodelist[] = {
+  /* 0OP */
+  { "rtrue",           v1, vM,   0, 0, opNONE, 0 },
+  { "rfalse",          v1, vM,   0, 0, opNONE, 0 },
+  { "print",           v1, vM,   0, 0, opTEXTINLINE, 0 },
+  { "print_ret",       v1, vM,   0, 0, opTEXTINLINE, 0 },
+  { "nop",             v1, vM,   0, 0, opNONE, 0 },
+  { "save",            v4, v4,   0, 0, opSTORES, 0 },
+  { "restore",         v4, v4,   0, 0, opSTORES, 0 },
+  { "restart",         v1, vM,   0, 0, opNONE, 0 },
+  { "ret_popped",      v1, vM,   0, 0, opNONE, 0 },
+  { "catch",           v5, vM,   0, 0, opSTORES, 0 },
+  { "quit",            v1, vM,   0, 0, opNONE, 0 },
+  { "new_line",        v1, vM,   0, 0, opNONE, 0 },
+  { "show_status",     v3, v3,   0, 0, opNONE, 0 },
+  { "verify",          v3, vM,   0, 0, opBRANCHES, 0 },
+  { "extended",        v5, vM,   0, 0, opNONE, 0 },
+  { "piracy",          v5, vM,   0, 0, opBRANCHES, 0 },
+  /* 1OP */
+  { "jz",              v1, vM,   1, 1, opBRANCHES, 0 },
+  { "get_sibling",     v1, vM,   1, 1, opSTORES | opBRANCHES, 0 },
+  { "get_child",       v1, vM,   1, 1, opSTORES | opBRANCHES, 0 },
+  { "get_parent",      v1, vM,   1, 1, opSTORES, 0 },
+  { "get_prop_len",    v1, vM,   1, 1, opSTORES, 0 },
+  { "inc",             v1, vM,   1, 1, opNONE, 0 },
+  { "dec",             v1, vM,   1, 1, opNONE, 0 },
+  { "print_addr",      v1, vM,   1, 1, opNONE, 0 },
+  { "call_1s",         v4, vM,   1, 1, opSTORES, 0 },
+  { "remove_obj",      v1, vM,   1, 1, opNONE, 0 },
+  { "print_obj",       v1, vM,   1, 1, opNONE, 0 },
+  { "ret",             v1, vM,   1, 1, opNONE, 0 },
+  { "jump",            v1, vM,   1, 1, opJUMPS, 0 },
+  { "print_paddr",     v1, vM,   1, 1, opNONE, 0 },
+  { "load",            v1, vM,   1, 1, opSTORES, 0 },
+  { "call_1n",         v5, vM,   1, 1, opNONE, 0 },
+  /* 2OP, 0 */
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "je",              v1, vM,   1, 4, opBRANCHES, 0 },
+  { "jl",              v1, vM,   2, 2, opBRANCHES, 0 },
+  { "jg",              v1, vM,   2, 2, opBRANCHES, 0 },
+  { "dec_chk",         v1, vM,   2, 2, opBRANCHES, 0 },
+  { "inc_chk",         v1, vM,   2, 2, opBRANCHES, 0 },
+  { "jin",             v1, vM,   2, 2, opBRANCHES, 0 },
+  { "test",            v1, vM,   2, 2, opBRANCHES, 0 },
+  { "or",              v1, vM,   2, 2, opNONE, 0 },
+  { "and",             v1, vM,   2, 2, opNONE, 0 },
+  { "test_attr",       v1, vM,   2, 2, opBRANCHES, 0 },
+  { "set_attr",        v1, vM,   2, 2, opNONE, 0 },
+  { "clear_attr",      v1, vM,   2, 2, opNONE, 0 },
+  { "store",           v1, vM,   2, 2, opNONE, 0 },
+  { "insert_obj",      v1, vM,   2, 2, opNONE, 0 },
+  { "loadw",           v1, vM,   2, 2, opSTORES, 0 },
+  { "loadb",           v1, vM,   2, 2, opSTORES, 0 },
+  { "get_prop",        v1, vM,   2, 2, opSTORES, 0 },
+  { "get_prop_addr",   v1, vM,   2, 2, opSTORES, 0 },
+  { "get_next_prop",   v1, vM,   2, 2, opSTORES, 0 },
+  { "add",             v1, vM,   2, 2, opSTORES, 0 },
+  { "sub",             v1, vM,   2, 2, opSTORES, 0 },
+  { "mul",             v1, vM,   2, 2, opSTORES, 0 },
+  { "div",             v1, vM,   2, 2, opSTORES, 0 },
+  { "mod",             v1, vM,   2, 2, opSTORES, 0 },
+  { "call_2s",         v4, vM,   2, 2, opSTORES, 0 },
+  { "call_2n",         v5, vM,   2, 2, opNONE, 0 },
+  { "set_colour",      v5, vM,   2, 2, opNONE, 0 },
+  { "throw",           v5, vM,   2, 2, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  /* VAR */
+  { "call_vs",         v1, vM,   1, 4, opSTORES, 0 },
+  { "storew",          v1, vM,   3, 3, opNONE, 0 },
+  { "storeb",          v1, vM,   3, 3, opNONE, 0 },
+  { "put_prop",        v1, vM,   3, 3, opNONE, 0 },
+  { "aread",           v5, vM,   0, 4, opSTORES, 0 },
+  { "print_char",      v1, vM,   1, 1, opNONE, 0 },
+  { "print_num",       v1, vM,   1, 1, opNONE, 0 },
+  { "random",          v1, vM,   1, 1, opSTORES, 0 },
+  { "push",            v1, vM,   1, 1, opNONE, 0 },
+  { "pull",            v1, vM,   1, 1, opNONE, 0 },
+  { "split_window",    v3, vM,   1, 1, opNONE, 0 },
+  { "set_window",      v3, vM,   1, 1, opNONE, 0 },
+  { "call_vs2",        v4, vM,   1, 8, opSTORES, 0 },
+  { "erase_window",    v4, vM,   1, 1, opNONE, 0 },
+  { "erase_line",      v4, vM,   1, 1, opNONE, 0 },
+  { "set_cursor",      v4, vM,   2, 2, opNONE, 0 },
+  { "get_cursor",      v4, vM,   1, 1, opNONE, 0 },
+  { "set_text_style",  v4, vM,   1, 1, opNONE, 0 },
+  { "buffer_mode",     v4, vM,   1, 1, opNONE, 0 },
+  { "output_stream",   v5, vM,   1, 2, opNONE, 0 },
+  { "input_stream",    v3, vM,   1, 1, opNONE, 0 },
+  { "sound_effect",    v3, vM,   4, 4, opNONE, 0 },
+  { "read_char",       v4, vM,   1, 3, opSTORES, 0 },
+  { "scan_table",      v4, vM,   4, 4, opSTORES | opBRANCHES, 0 },
+  { "not",             v5, vM,   1, 1, opSTORES, 0 },
+  { "call_vn",         v5, vM,   1, 4, opNONE, 0 },
+  { "call_vn2",        v5, vM,   1, 8, opNONE, 0 },
+  { "tokenise",        v5, vM,   4, 4, opNONE, 0 },
+  { "encode_text",     v5, vM,   4, 4, opNONE, 0 },
+  { "copy_table",      v5, vM,   3, 3, opNONE, 0 },
+  { "print_table",     v5, vM,   4, 4, opNONE, 0 },
+  { "check_arg_count", v5, vM,   1, 1, opBRANCHES, 0 },
+  /* EXT */
+  { "save",            v5, vM,   0, 3, opSTORES, 0 },
+  { "restore",         v5, vM,   0, 3, opSTORES, 0 },
+  { "log_shift",       v5, vM,   2, 2, opSTORES, 0 },
+  { "art_shift",       v5, vM,   2, 2, opSTORES, 0 },
+  { "set_font",        v5, vM,   1, 1, opSTORES, 0 },
+  { "draw_picture",    v6, vM,   3, 3, opNONE, 0 },
+  { "picture_data",    v6, vM,   2, 2, opBRANCHES, 0 },
+  { "erase_picture",   v6, vM,   3, 3, opNONE, 0 },
+  { "set_margins",     v6, vM,   3, 3, opNONE, 0 },
+  { "save_undo",       v5, vM,   0, 0, opSTORES, 0 },
+  { "restore_undo",    v5, vM,   0, 0, opSTORES, 0 },
+  { "print_unicode",   v5, vM,   1, 1, opNONE, 0 },
+  { "check_unicode",   v5, vM,   1, 1, opSTORES, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "move_window",     v6, vM,   3, 3, opNONE, 0 },
+  { "window_size",     v6, vM,   3, 3, opNONE, 0 },
+  { "window_style",    v6, vM,   2, 3, opNONE, 0 },
+  { "get_wind_prop",   v6, vM,   2, 2, opSTORES, 0 },
+  { "scroll_window",   v6, vM,   2, 2, opNONE, 0 },
+  { "pop_stack",       v6, vM,   1, 2, opNONE, 0 },
+  { "read_mouse",      v6, vM,   1, 1, opNONE, 0 },
+  { "mouse_window",    v6, vM,   1, 1, opNONE, 0 },
+  { "push_stack",      v6, vM,   1, 2, opBRANCHES, 0 },
+  { "put_wind_prop",   v6, vM,   3, 3, opNONE, 0 },
+  { "print_form",      v6, vM,   1, 1, opNONE, 0 },
+  { "make_menu",       v6, vM,   2, 2, opBRANCHES, 0 },
+  { "picture_table",   v6, vM,   1, 1, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 },
+  { "XXX",             v1, vM,   0, 8, opNONE, 0 }, 
+};
+
+#endif