diff --git a/.travis.yml b/.travis.yml index 38dffc2..0399c49 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ os: osx language: c before_install: - brew update - - brew install sdl2 + - brew install sdl2 lua before_script: - cd src script: diff --git a/src/Makefile b/src/Makefile index 2513e87..3e53d54 100644 --- a/src/Makefile +++ b/src/Makefile @@ -22,32 +22,32 @@ CC?=cc CFLAGS=-std=gnu11 -O3 -Wall -Wextra -Werror -Wno-unused-parameter -LDFLAGS=-g -L/usr/local/lib +LDFLAGS=-L/usr/local/lib EWM_EXECUTABLE=ewm -EWM_SOURCES=cpu.c ins.c pia.c mem.c ewm.c fmt.c two.c scr.c dsk.c chr.c alc.c one.c tty.c utl.c boo.c +EWM_SOURCES=cpu.c ins.c pia.c mem.c ewm.c fmt.c two.c scr.c dsk.c chr.c alc.c one.c tty.c utl.c boo.c lua.c EWM_OBJECTS=$(EWM_SOURCES:.c=.o) -EWM_LIBS=-lSDL2 +EWM_LIBS=-lSDL2 -llua CPU_TEST_EXECUTABLE=cpu_test -CPU_TEST_SOURCES=cpu.c ins.c mem.c fmt.c utl.c cpu_test.c +CPU_TEST_SOURCES=cpu.c ins.c mem.c fmt.c utl.c cpu_test.c lua.c CPU_TEST_OBJECTS=$(CPU_TEST_SOURCES:.c=.o) -CPU_TEST_LIBS= +CPU_TEST_LIBS=-llua SCR_TEST_EXECUTABLE=scr_test -SCR_TEST_SOURCES=cpu.c ins.c mem.c fmt.c two.c scr.c dsk.c chr.c alc.c utl.c scr_test.c +SCR_TEST_SOURCES=cpu.c ins.c mem.c fmt.c two.c scr.c dsk.c chr.c alc.c utl.c scr_test.c lua.c SCR_TEST_OBJECTS=$(SCR_TEST_SOURCES:.c=.o) -SCR_TEST_LIBS=-lSDL2 +SCR_TEST_LIBS=-lSDL2 -llua CPU_BENCH=cpu_bench -CPU_BENCH_SOURCES=cpu.c ins.c mem.c fmt.c utl.c cpu_bench.c +CPU_BENCH_SOURCES=cpu.c ins.c mem.c fmt.c utl.c cpu_bench.c lua.c CPU_BENCH_OBJECTS=$(CPU_BENCH_SOURCES:.c=.o) -CPU_BENCH_LIBS= +CPU_BENCH_LIBS=-llua MEM_BENCH=mem_bench -MEM_BENCH_SOURCES=cpu.c ins.c mem.c fmt.c utl.c mem_bench.c +MEM_BENCH_SOURCES=cpu.c ins.c mem.c fmt.c utl.c mem_bench.c lua.c MEM_BENCH_OBJECTS=$(MEM_BENCH_SOURCES:.c=.o) -MEM_BENCH_LIBS= +MEM_BENCH_LIBS=-llua all: $(EWM_SOURCES) $(EWM_EXECUTABLE) $(CPU_TEST_SOURCES) $(CPU_TEST_EXECUTABLE) $(SCR_TEST_EXECUTABLE) $(CPU_BENCH) $(MEM_BENCH) diff --git a/src/cpu.c b/src/cpu.c index 0ff4d95..e745ab6 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -21,6 +21,7 @@ // SOFTWARE. #include +#include #include #include #include @@ -36,6 +37,7 @@ #include "ins.h" #include "mem.h" #include "fmt.h" +#include "lua.h" // Stack management. @@ -131,6 +133,26 @@ static int cpu_execute_instruction(struct cpu_t *cpu) { cpu->state.pc += i->bytes; } + if (i->lua_before_handler != LUA_NOREF) { + lua_rawgeti(cpu->lua->state, LUA_REGISTRYINDEX, i->lua_before_handler); + ewm_lua_push_cpu(cpu->lua, cpu); + lua_pushinteger(cpu->lua->state, i->opcode); + switch (i->bytes) { + case 1: + lua_pushinteger(cpu->lua->state, 0); + break; + case 2: + lua_pushinteger(cpu->lua->state, mem_get_byte(cpu, pc+1)); + break; + case 3: + lua_pushinteger(cpu->lua->state, mem_get_word(cpu, pc+1)); + break; + } + if (lua_pcall(cpu->lua->state, 3, 0, 0) != LUA_OK) { + printf("cpu: script error: %s\n", lua_tostring(cpu->lua->state, -1)); + } + } + /* Execute instruction */ switch (i->bytes) { case 1: @@ -144,6 +166,26 @@ static int cpu_execute_instruction(struct cpu_t *cpu) { break; } + if (i->lua_after_handler != LUA_NOREF) { + lua_rawgeti(cpu->lua->state, LUA_REGISTRYINDEX, i->lua_after_handler); + ewm_lua_push_cpu(cpu->lua, cpu); + lua_pushinteger(cpu->lua->state, i->opcode); + switch (i->bytes) { + case 1: + lua_pushinteger(cpu->lua->state, 0); + break; + case 2: + lua_pushinteger(cpu->lua->state, mem_get_byte(cpu, pc+1)); + break; + case 3: + lua_pushinteger(cpu->lua->state, mem_get_word(cpu, pc+1)); + break; + } + if (lua_pcall(cpu->lua->state, 3, 0, 0) != LUA_OK) { + printf("cpu: script error: %s\n", lua_tostring(cpu->lua->state, -1)); + } + } + if (cpu->trace) { cpu_format_state(cpu, trace_state); cpu_format_stack(cpu, trace_stack); @@ -190,7 +232,8 @@ static int cpu_init(struct cpu_t *cpu, int model) { memset(cpu, 0x00, sizeof(struct cpu_t)); cpu->model = model; - cpu->instructions = (cpu->model == EWM_CPU_MODEL_6502) ? instructions : instructions_65C02; + cpu->instructions = malloc(sizeof instructions); + memcpy(cpu->instructions, (cpu->model == EWM_CPU_MODEL_6502) ? instructions : instructions_65C02, sizeof instructions); return 0; } @@ -198,6 +241,7 @@ static int cpu_init(struct cpu_t *cpu, int model) { struct cpu_t *cpu_create(int model) { struct cpu_t *cpu = malloc(sizeof(struct cpu_t)); if (cpu_init(cpu, model) != 0) { + cpu_destroy(cpu); free(cpu); cpu = NULL; } @@ -205,6 +249,9 @@ struct cpu_t *cpu_create(int model) { } void cpu_destroy(struct cpu_t *cpu) { + if (cpu->instructions != NULL) { + free(cpu->instructions); + } if (cpu->trace != NULL) { (void) fclose(cpu->trace); cpu->trace = NULL; @@ -442,3 +489,217 @@ int cpu_nmi(struct cpu_t *cpu) { int cpu_step(struct cpu_t *cpu) { return cpu_execute_instruction(cpu); } + +// Lua support + +// cpu state functions + +static int cpu_lua_index(lua_State *state) { + void *cpu_data = luaL_checkudata(state, 1, "cpu_meta_table"); + struct cpu_t *cpu = *((struct cpu_t**) cpu_data); + + if (!lua_isstring(state, 2)) { + printf("TODO lua_cpu_index: arg 2 is not a string\n"); + return 0; + } + + const char *name = lua_tostring(state, 2); + + if (strcmp(name, "a") == 0) { + lua_pushnumber(state, cpu->state.a); + return 1; + } + + if (strcmp(name, "x") == 0) { + lua_pushnumber(state, cpu->state.x); + return 1; + } + + if (strcmp(name, "y") == 0) { + lua_pushnumber(state, cpu->state.y); + return 1; + } + + if (strcmp(name, "s") == 0) { + lua_pushnumber(state, _cpu_get_status(cpu)); + return 1; + } + + if (strcmp(name, "pc") == 0) { + lua_pushnumber(state, cpu->state.pc); + return 1; + } + + if (strcmp(name, "sp") == 0) { + lua_pushnumber(state, cpu->state.sp); + return 1; + } + + if (strcmp(name, "model") == 0) { + switch (cpu->model) { + case EWM_CPU_MODEL_6502: + lua_pushstring(state, "6502"); + break; + case EWM_CPU_MODEL_65C02: + lua_pushstring(state, "65C02"); + break; + } + return 1; + } + + luaL_getmetatable(state, "cpu_methods_meta_table"); + lua_pushvalue(state, 2); + lua_rawget(state, -2); + + return 1; +} + +static int cpu_lua_newindex(lua_State *state) { + void *cpu_data = luaL_checkudata(state, 1, "cpu_meta_table"); + struct cpu_t *cpu = *((struct cpu_t**) cpu_data); + + if(!lua_isstring(state, 2)) { + printf("TODO lua_cpu_new_index: arg 2 is not a string\n"); + return 0; + } + + if(!lua_isnumber(state, 3)) { + printf("TODO lua_cpu_new_index: arg 3 is not a string\n"); + + return 0; + } + + const char *name = lua_tostring(state, 2); + int value = lua_tointeger(state, 3); + + if (strcmp(name, "a") == 0) { + cpu->state.a = (uint8_t) value; + return 0; + } + + if (strcmp(name, "x") == 0) { + cpu->state.x = (uint8_t) value; + return 0; + } + + if (strcmp(name, "y") == 0) { + cpu->state.y = (uint8_t) value; + return 0; + } + + if (strcmp(name, "s") == 0) { + _cpu_set_status(cpu, (uint8_t) value); + return 0; + } + + if (strcmp(name, "pc") == 0) { + cpu->state.pc = (uint16_t) value; + return 0; + } + + if (strcmp(name, "sp") == 0) { + cpu->state.pc = (uint16_t) value; + return 0; + } + + return 0; +} + +static int cpu_lua_reset(lua_State *state) { + void *cpu_data = luaL_checkudata(state, 1, "cpu_meta_table"); + struct cpu_t *cpu = *((struct cpu_t**) cpu_data); + cpu_reset(cpu); + return 0; +} + +// cpu module functions + +// onBeforeExecution(op, fn) +static int cpu_lua_onBeforeExecuteInstruction(lua_State *state) { + if (lua_gettop(state) != 3) { + printf("Not enough arguments\n"); + return 0; + } + + void *cpu_data = luaL_checkudata(state, 1, "cpu_meta_table"); + struct cpu_t *cpu = *((struct cpu_t**) cpu_data); + + if (lua_type(state, 2) != LUA_TNUMBER) { + printf("First arg fail\n"); + return 0; + } + + if (lua_type(state, 3) != LUA_TFUNCTION) { + printf("Second arg fail\n"); + return 0; + } + + uint8_t opcode = lua_tointeger(state, 2); + + lua_pushvalue(state, 3); + cpu->instructions[opcode].lua_before_handler = luaL_ref(state, LUA_REGISTRYINDEX); + + return 0; +} + +// onAfterExecuteFuncton(op, fn) +static int cpu_lua_onAfterExecuteInstruction(lua_State *state) { + if (lua_gettop(state) != 3) { + printf("Not enough arguments\n"); + return 0; + } + + void *cpu_data = luaL_checkudata(state, 1, "cpu_meta_table"); + struct cpu_t *cpu = *((struct cpu_t**) cpu_data); + + if(lua_type(state, 2) != LUA_TNUMBER) { + printf("First arg fail\n"); + return 0; + } + + if(lua_type(state, 3) != LUA_TFUNCTION) { + printf("Second arg fail\n"); + return 0; + } + + uint8_t opcode = lua_tointeger(state, 2); + + lua_pushvalue(state, 3); + cpu->instructions[opcode].lua_after_handler = luaL_ref(state, LUA_REGISTRYINDEX); + + return 0; +} + +int ewm_cpu_init_lua(struct cpu_t *cpu, struct ewm_lua_t *lua) { + // TODO Most of this needs to move to cpu_luaopen so that we don't + // actually enable lua support until this module is required in a + // script. Same for other components. + + cpu->lua = lua; + + luaL_Reg functions[] = { + {"__index", cpu_lua_index}, + {"__newindex", cpu_lua_newindex}, + {NULL, NULL} + }; + ewm_lua_register_component(lua, "cpu", functions); + + luaL_Reg cpu_methods[] = { + {"onBeforeExecuteInstruction", cpu_lua_onBeforeExecuteInstruction}, + {"onAfterExecuteInstruction", cpu_lua_onAfterExecuteInstruction}, + {"reset", cpu_lua_reset}, + {NULL, NULL} + }; + ewm_lua_register_component(lua, "cpu_methods", cpu_methods); + + // Register a global cpu instance + + void *cpu_data = lua_newuserdata(lua->state, sizeof(struct cpu_t*)); + *((struct cpu_t**) cpu_data) = cpu; + + luaL_getmetatable(lua->state, "cpu_meta_table"); + lua_setmetatable(lua->state, -2); + lua_setglobal(lua->state, "cpu"); + + return 0; +} diff --git a/src/cpu.h b/src/cpu.h index 0cb230e..21a1124 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -39,6 +39,7 @@ #define EWM_VECTOR_IRQ 0xfffe struct cpu_instruction_t; +struct ewm_lua_t; struct cpu_state_t { uint8_t a, x, y, s, sp; @@ -57,6 +58,8 @@ struct cpu_t { uint8_t *page0; uint8_t *page1; + + struct ewm_lua_t *lua; }; typedef void (*cpu_instruction_handler_t)(struct cpu_t *cpu); @@ -122,4 +125,6 @@ uint8_t cpu_memory_get_byte(struct cpu_t *cpu, uint16_t addr); void cpu_memory_set_word(struct cpu_t *cpu, uint16_t addr, uint16_t v); void cpu_memory_set_byte(struct cpu_t *cpu, uint16_t addr, uint8_t v); +int ewm_cpu_init_lua(struct cpu_t *cpu, struct ewm_lua_t *lua); + #endif diff --git a/src/cpu_test.c b/src/cpu_test.c index d5d0d7f..b86b168 100644 --- a/src/cpu_test.c +++ b/src/cpu_test.c @@ -30,6 +30,7 @@ #include "cpu.h" #include "mem.h" #include "utl.h" +#include "lua.h" int test(int model, uint16_t start_addr, uint16_t success_addr, char *rom_path) { struct cpu_t *cpu = cpu_create(model); @@ -37,6 +38,16 @@ int test(int model, uint16_t start_addr, uint16_t success_addr, char *rom_path) cpu_reset(cpu); cpu->state.pc = start_addr; +#if 1 + cpu->lua = ewm_lua_create(); + ewm_cpu_init_lua(cpu, cpu->lua); + + if (ewm_lua_load_script(cpu->lua, "cpu_test.lua") != 0) { + printf("Lua script failed to load\n"); // TODO Move errors reporting into C code + exit(1); + } +#endif + uint16_t last_pc = cpu->state.pc; struct timespec start; diff --git a/src/cpu_test.lua b/src/cpu_test.lua new file mode 100644 index 0000000..9ef2343 --- /dev/null +++ b/src/cpu_test.lua @@ -0,0 +1,31 @@ +-- EWM Meets Lua + +local function myerrhandler(err) + print(err) + print(debug.traceback()) + return false +end + +-- TODO How do we do this in C? +xpcall(function() + -- Add some random intercepts to measure the performance impact + + local cpu = require 'cpu' + + cpu.onBeforeExecuteInstruction(0x60, function(state, opcode, operand) + --print(string.format('Before RTS from 0x%.4x', state.pc)) + end) + + cpu.onBeforeExecuteInstruction(0x20, function(state, opcode, operand) + --print(string.format('Before JSR from 0x%.4x', state.pc)) + end) + + cpu.onAfterExecuteInstruction(0x60, function(state, opcode, operand) + --print(string.format('After RTS from 0x%.4x', state.pc)) + end) + + cpu.onAfterExecuteInstruction(0x20, function(state, opcode, operand) + --print(string.format('After JSR from 0x%.4x', state.pc)) + end) + +end , myerrhandler) diff --git a/src/dsk.c b/src/dsk.c index 5684630..761222e 100644 --- a/src/dsk.c +++ b/src/dsk.c @@ -30,6 +30,7 @@ #include "mem.h" #include "cpu.h" #include "utl.h" +#include "lua.h" #include "dsk.h" // @@ -553,3 +554,25 @@ int ewm_dsk_set_disk_file(struct ewm_dsk_t *dsk, uint8_t drive, bool readonly, c return result; } + +// Lua Support + +static int ewm_dsk_lua_hello(lua_State *lua) { + printf("This is dsk.hello()\n"); + return 0; +} + +int ewm_dsk_luaopen(lua_State *state) { + luaL_Reg functions[] = { + {"hello", ewm_dsk_lua_hello}, + {NULL, NULL} + }; + luaL_newlib(state, functions); + return 1; +} + +int ewm_dsk_init_lua(struct ewm_dsk_t *dsk, struct ewm_lua_t *lua) { + dsk->lua = lua; + luaL_requiref(dsk->lua->state, "dsk", ewm_dsk_luaopen, 0); + return 0; +} diff --git a/src/dsk.h b/src/dsk.h index d63fa70..c48e2cb 100644 --- a/src/dsk.h +++ b/src/dsk.h @@ -28,6 +28,7 @@ struct cpu_t; struct mem_t; +struct ewm_lua_t; #define EWM_DSK_DRIVE1 (0) #define EWM_DSK_DRIVE2 (1) @@ -61,6 +62,7 @@ struct ewm_dsk_t { struct ewm_dsk_drive_t drives[2]; uint8_t drive; // 0 based int skip; + struct ewm_lua_t *lua; }; #define EWM_DSK_TYPE_UNKNOWN (-1) @@ -72,4 +74,6 @@ struct ewm_dsk_t *ewm_dsk_create(struct cpu_t *cpu); int ewm_dsk_set_disk_data(struct ewm_dsk_t *dsk, uint8_t index, bool readonly, void *data, size_t length, int type); int ewm_dsk_set_disk_file(struct ewm_dsk_t *dsk, uint8_t index, bool readonly, char *path); +int ewm_dsk_init_lua(struct ewm_dsk_t *dsk, struct ewm_lua_t *lua); + #endif diff --git a/src/frogger.lua b/src/frogger.lua new file mode 100644 index 0000000..e6de232 --- /dev/null +++ b/src/frogger.lua @@ -0,0 +1,37 @@ +-- EWM Meets Lua + +local function myerrhandler(err) + print(err) + print(debug.traceback()) + return false +end + +xpcall(function() + -- + -- Frogger.lua - Change the default Frogger key bindings. + -- + -- Intercept LDA $C000. The key code will be in the + -- accumulator. Map the values to our own preferences. + -- + -- GETKEY: LDA $C000 ; AD 00 C0 + -- CMP #$80 ; C9 80 + -- BCC GETKEY ; 90 F9 + -- STA $C010 ; 8D 10 C0 + -- + + local cpu = require 'cpu' + cpu.onAfterExecuteInstruction(0xAD, function(state, opcode, operand) + if operand == 0xc000 then + if state.a == 0xc9 then -- I + state.a = 0xc1 -- A + elseif state.a == 0xcb then -- K + state.a = 0xda -- Z + elseif state.a == 0xca then -- J + state.a = 0x88 -- <- + elseif state.a == 0xcc then -- L + state.a = 0x95 -- -> + end + end + end) + +end , myerrhandler ) diff --git a/src/ins.c b/src/ins.c index c2da5f8..ad10b00 100644 --- a/src/ins.c +++ b/src/ins.c @@ -23,6 +23,10 @@ #include #include +#include +#include +#include + #include "ins.h" #include "cpu.h" #include "mem.h" @@ -914,269 +918,269 @@ static void unimplemented(struct cpu_t *cpu) { /* Instruction dispatch table */ struct cpu_instruction_t instructions[256] = { - /* 0x00 */ { "BRK", 0x00, 1, 2, 3, (void*) brk }, - /* 0x01 */ { "ORA", 0x01, 2, 6, 0, (void*) ora_indx }, - /* 0x02 */ { "???", 0x02, 1, 2, 0, (void*) unimplemented }, - /* 0x03 */ { "???", 0x03, 1, 2, 0, (void*) unimplemented }, - /* 0x04 */ { "???", 0x04, 1, 2, 0, (void*) unimplemented }, - /* 0x05 */ { "ORA", 0x05, 2, 2, 0, (void*) ora_zpg }, - /* 0x06 */ { "ASL", 0x06, 2, 5, 0, (void*) asl_zpg }, - /* 0x07 */ { "???", 0x07, 1, 2, 0, (void*) unimplemented }, - /* 0x08 */ { "PHP", 0x08, 1, 3, 0, (void*) php }, - /* 0x09 */ { "ORA", 0x09, 2, 2, 0, (void*) ora_imm }, - /* 0x0a */ { "ASL", 0x0a, 1, 2, 0, (void*) asl_acc }, - /* 0x0b */ { "???", 0x0b, 1, 2, 0, (void*) unimplemented }, - /* 0x0c */ { "???", 0x0c, 1, 2, 0, (void*) unimplemented }, - /* 0x0d */ { "ORA", 0x0d, 3, 4, 0, (void*) ora_abs }, - /* 0x0e */ { "ASL", 0x0e, 3, 6, 0, (void*) asl_abs }, - /* 0x0f */ { "???", 0x0f, 1, 2, 0, (void*) unimplemented }, - /* 0x10 */ { "BPL", 0x10, 2, 2, 0, (void*) bpl }, - /* 0x11 */ { "ORA", 0x11, 2, 5, 0, (void*) ora_indy }, - /* 0x12 */ { "???", 0x12, 1, 2, 0, (void*) unimplemented }, - /* 0x13 */ { "???", 0x13, 1, 2, 0, (void*) unimplemented }, - /* 0x14 */ { "???", 0x14, 1, 2, 0, (void*) unimplemented }, - /* 0x15 */ { "ORA", 0x15, 2, 3, 0, (void*) ora_zpgx }, - /* 0x16 */ { "ASL", 0x16, 2, 6, 0, (void*) asl_zpgx }, - /* 0x17 */ { "???", 0x17, 1, 2, 0, (void*) unimplemented }, - /* 0x18 */ { "CLC", 0x18, 1, 2, 0, (void*) clc }, - /* 0x19 */ { "ORA", 0x19, 3, 4, 0, (void*) ora_absy }, - /* 0x1a */ { "???", 0x1a, 1, 2, 0, (void*) unimplemented }, - /* 0x1b */ { "???", 0x1b, 1, 2, 0, (void*) unimplemented }, - /* 0x1c */ { "???", 0x1c, 1, 2, 0, (void*) unimplemented }, - /* 0x1d */ { "ORA", 0x1d, 3, 4, 0, (void*) ora_absx }, - /* 0x1e */ { "ASL", 0x1e, 3, 7, 0, (void*) asl_absx }, - /* 0x1f */ { "???", 0x1f, 1, 2, 0, (void*) unimplemented }, + /* 0x00 */ { "BRK", 0x00, 1, 2, 3, (void*) brk, LUA_NOREF, LUA_NOREF }, + /* 0x01 */ { "ORA", 0x01, 2, 6, 0, (void*) ora_indx, LUA_NOREF, LUA_NOREF }, + /* 0x02 */ { "???", 0x02, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x03 */ { "???", 0x03, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x04 */ { "???", 0x04, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x05 */ { "ORA", 0x05, 2, 2, 0, (void*) ora_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x06 */ { "ASL", 0x06, 2, 5, 0, (void*) asl_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x07 */ { "???", 0x07, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x08 */ { "PHP", 0x08, 1, 3, 0, (void*) php, LUA_NOREF, LUA_NOREF }, + /* 0x09 */ { "ORA", 0x09, 2, 2, 0, (void*) ora_imm, LUA_NOREF, LUA_NOREF }, + /* 0x0a */ { "ASL", 0x0a, 1, 2, 0, (void*) asl_acc, LUA_NOREF, LUA_NOREF }, + /* 0x0b */ { "???", 0x0b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x0c */ { "???", 0x0c, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x0d */ { "ORA", 0x0d, 3, 4, 0, (void*) ora_abs, LUA_NOREF, LUA_NOREF }, + /* 0x0e */ { "ASL", 0x0e, 3, 6, 0, (void*) asl_abs, LUA_NOREF, LUA_NOREF }, + /* 0x0f */ { "???", 0x0f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x10 */ { "BPL", 0x10, 2, 2, 0, (void*) bpl, LUA_NOREF, LUA_NOREF }, + /* 0x11 */ { "ORA", 0x11, 2, 5, 0, (void*) ora_indy, LUA_NOREF, LUA_NOREF }, + /* 0x12 */ { "???", 0x12, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x13 */ { "???", 0x13, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x14 */ { "???", 0x14, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x15 */ { "ORA", 0x15, 2, 3, 0, (void*) ora_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x16 */ { "ASL", 0x16, 2, 6, 0, (void*) asl_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x17 */ { "???", 0x17, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x18 */ { "CLC", 0x18, 1, 2, 0, (void*) clc, LUA_NOREF, LUA_NOREF }, + /* 0x19 */ { "ORA", 0x19, 3, 4, 0, (void*) ora_absy, LUA_NOREF, LUA_NOREF }, + /* 0x1a */ { "???", 0x1a, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x1b */ { "???", 0x1b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x1c */ { "???", 0x1c, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x1d */ { "ORA", 0x1d, 3, 4, 0, (void*) ora_absx, LUA_NOREF, LUA_NOREF }, + /* 0x1e */ { "ASL", 0x1e, 3, 7, 0, (void*) asl_absx, LUA_NOREF, LUA_NOREF }, + /* 0x1f */ { "???", 0x1f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0x20 */ { "JSR", 0x20, 3, 6, 2, (void*) jsr_abs }, - /* 0x21 */ { "AND", 0x21, 2, 6, 0, (void*) and_indx }, - /* 0x22 */ { "???", 0x22, 1, 2, 0, (void*) unimplemented }, - /* 0x23 */ { "???", 0x23, 1, 2, 0, (void*) unimplemented }, - /* 0x24 */ { "BIT", 0x24, 2, 3, 0, (void*) bit_zpg }, - /* 0x25 */ { "AND", 0x25, 2, 3, 0, (void*) and_zpg }, - /* 0x26 */ { "ROL", 0x26, 2, 5, 0, (void*) rol_zpg }, - /* 0x27 */ { "???", 0x27, 1, 2, 0, (void*) unimplemented }, - /* 0x28 */ { "PLP", 0x28, 1, 4, 0, (void*) plp }, - /* 0x29 */ { "AND", 0x29, 2, 2, 0, (void*) and_imm }, - /* 0x2a */ { "ROL", 0x2a, 1, 2, 0, (void*) rol_acc }, - /* 0x2b */ { "???", 0x2b, 1, 2, 0, (void*) unimplemented }, - /* 0x2c */ { "BIT", 0x2c, 3, 4, 0, (void*) bit_abs }, - /* 0x2d */ { "AND", 0x2d, 3, 4, 0, (void*) and_abs }, - /* 0x2e */ { "ROL", 0x2e, 3, 6, 0, (void*) rol_abs }, - /* 0x2f */ { "???", 0x2f, 1, 2, 0, (void*) unimplemented }, - /* 0x30 */ { "BMI", 0x30, 2, 2, 0, (void*) bmi }, - /* 0x31 */ { "AND", 0x31, 2, 5, 0, (void*) and_indy }, - /* 0x32 */ { "???", 0x32, 1, 2, 0, (void*) unimplemented }, - /* 0x33 */ { "???", 0x33, 1, 2, 0, (void*) unimplemented }, - /* 0x34 */ { "???", 0x34, 1, 2, 0, (void*) unimplemented }, - /* 0x35 */ { "AND", 0x35, 2, 4, 0, (void*) and_zpgx }, - /* 0x36 */ { "ROL", 0x36, 2, 6, 0, (void*) rol_zpgx }, - /* 0x37 */ { "???", 0x37, 1, 2, 0, (void*) unimplemented }, - /* 0x38 */ { "SEC", 0x38, 1, 2, 0, (void*) sec }, - /* 0x39 */ { "AND", 0x39, 3, 4, 0, (void*) and_absy }, - /* 0x3a */ { "???", 0x3a, 1, 2, 0, (void*) unimplemented }, - /* 0x3b */ { "???", 0x3b, 1, 2, 0, (void*) unimplemented }, - /* 0x3c */ { "???", 0x3c, 1, 2, 0, (void*) unimplemented }, - /* 0x3d */ { "AND", 0x3d, 3, 4, 0, (void*) and_absx }, - /* 0x3e */ { "ROL", 0x3e, 3, 7, 0, (void*) rol_absx }, - /* 0x3f */ { "???", 0x3f, 1, 2, 0, (void*) unimplemented }, + /* 0x20 */ { "JSR", 0x20, 3, 6, 2, (void*) jsr_abs, LUA_NOREF, LUA_NOREF }, + /* 0x21 */ { "AND", 0x21, 2, 6, 0, (void*) and_indx, LUA_NOREF, LUA_NOREF }, + /* 0x22 */ { "???", 0x22, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x23 */ { "???", 0x23, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x24 */ { "BIT", 0x24, 2, 3, 0, (void*) bit_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x25 */ { "AND", 0x25, 2, 3, 0, (void*) and_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x26 */ { "ROL", 0x26, 2, 5, 0, (void*) rol_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x27 */ { "???", 0x27, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x28 */ { "PLP", 0x28, 1, 4, 0, (void*) plp, LUA_NOREF, LUA_NOREF }, + /* 0x29 */ { "AND", 0x29, 2, 2, 0, (void*) and_imm, LUA_NOREF, LUA_NOREF }, + /* 0x2a */ { "ROL", 0x2a, 1, 2, 0, (void*) rol_acc, LUA_NOREF, LUA_NOREF }, + /* 0x2b */ { "???", 0x2b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x2c */ { "BIT", 0x2c, 3, 4, 0, (void*) bit_abs, LUA_NOREF, LUA_NOREF }, + /* 0x2d */ { "AND", 0x2d, 3, 4, 0, (void*) and_abs, LUA_NOREF, LUA_NOREF }, + /* 0x2e */ { "ROL", 0x2e, 3, 6, 0, (void*) rol_abs, LUA_NOREF, LUA_NOREF }, + /* 0x2f */ { "???", 0x2f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x30 */ { "BMI", 0x30, 2, 2, 0, (void*) bmi, LUA_NOREF, LUA_NOREF }, + /* 0x31 */ { "AND", 0x31, 2, 5, 0, (void*) and_indy, LUA_NOREF, LUA_NOREF }, + /* 0x32 */ { "???", 0x32, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x33 */ { "???", 0x33, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x34 */ { "???", 0x34, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x35 */ { "AND", 0x35, 2, 4, 0, (void*) and_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x36 */ { "ROL", 0x36, 2, 6, 0, (void*) rol_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x37 */ { "???", 0x37, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x38 */ { "SEC", 0x38, 1, 2, 0, (void*) sec, LUA_NOREF, LUA_NOREF }, + /* 0x39 */ { "AND", 0x39, 3, 4, 0, (void*) and_absy, LUA_NOREF, LUA_NOREF }, + /* 0x3a */ { "???", 0x3a, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x3b */ { "???", 0x3b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x3c */ { "???", 0x3c, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x3d */ { "AND", 0x3d, 3, 4, 0, (void*) and_absx, LUA_NOREF, LUA_NOREF }, + /* 0x3e */ { "ROL", 0x3e, 3, 7, 0, (void*) rol_absx, LUA_NOREF, LUA_NOREF }, + /* 0x3f */ { "???", 0x3f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0x40 */ { "RTI", 0x40, 1, 6, -3, (void*) rti }, - /* 0x41 */ { "EOR", 0x41, 2, 6, 0, (void*) eor_indx }, - /* 0x42 */ { "???", 0x42, 1, 2, 0, (void*) unimplemented }, - /* 0x43 */ { "???", 0x43, 1, 2, 0, (void*) unimplemented }, - /* 0x44 */ { "???", 0x44, 1, 2, 0, (void*) unimplemented }, - /* 0x45 */ { "EOR", 0x45, 2, 3, 0, (void*) eor_zpg }, - /* 0x46 */ { "LSR", 0x46, 2, 5, 0, (void*) lsr_zpg }, - /* 0x47 */ { "???", 0x47, 1, 2, 0, (void*) unimplemented }, - /* 0x48 */ { "PHA", 0x48, 1, 3, 1, (void*) pha }, - /* 0x49 */ { "EOR", 0x49, 2, 2, 0, (void*) eor_imm }, - /* 0x4a */ { "LSR", 0x4a, 1, 2, 0, (void*) lsr_acc }, - /* 0x4b */ { "???", 0x4b, 1, 2, 0, (void*) unimplemented }, - /* 0x4c */ { "JMP", 0x4c, 3, 3, 0, (void*) jmp_abs }, - /* 0x4d */ { "EOR", 0x4d, 3, 4, 0, (void*) eor_abs }, - /* 0x4e */ { "LSR", 0x4e, 3, 6, 0, (void*) lsr_abs }, - /* 0x4f */ { "???", 0x4f, 1, 2, 0, (void*) unimplemented }, - /* 0x50 */ { "BVC", 0x50, 2, 2, 0, (void*) bvc }, - /* 0x51 */ { "EOR", 0x51, 2, 5, 0, (void*) eor_indy }, - /* 0x52 */ { "???", 0x52, 1, 2, 0, (void*) unimplemented }, - /* 0x53 */ { "???", 0x53, 1, 2, 0, (void*) unimplemented }, - /* 0x54 */ { "???", 0x54, 1, 2, 0, (void*) unimplemented }, - /* 0x55 */ { "EOR", 0x55, 2, 4, 0, (void*) eor_zpgx }, - /* 0x56 */ { "LSR", 0x56, 2, 6, 0, (void*) lsr_zpgx }, - /* 0x57 */ { "???", 0x57, 1, 2, 0, (void*) unimplemented }, - /* 0x58 */ { "CLI", 0x58, 1, 2, 0, (void*) cli }, - /* 0x59 */ { "EOR", 0x59, 3, 4, 0, (void*) eor_absy }, - /* 0x5a */ { "???", 0x5a, 1, 2, 0, (void*) unimplemented }, - /* 0x5b */ { "???", 0x5b, 1, 2, 0, (void*) unimplemented }, - /* 0x5c */ { "???", 0x5c, 1, 2, 0, (void*) unimplemented }, - /* 0x5d */ { "EOR", 0x5d, 3, 4, 0, (void*) eor_absx }, - /* 0x5e */ { "LSR", 0x5e, 3, 7, 0, (void*) lsr_absx }, - /* 0x5f */ { "???", 0x5f, 1, 2, 0, (void*) unimplemented }, + /* 0x40 */ { "RTI", 0x40, 1, 6, -3, (void*) rti, LUA_NOREF, LUA_NOREF }, + /* 0x41 */ { "EOR", 0x41, 2, 6, 0, (void*) eor_indx, LUA_NOREF, LUA_NOREF }, + /* 0x42 */ { "???", 0x42, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x43 */ { "???", 0x43, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x44 */ { "???", 0x44, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x45 */ { "EOR", 0x45, 2, 3, 0, (void*) eor_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x46 */ { "LSR", 0x46, 2, 5, 0, (void*) lsr_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x47 */ { "???", 0x47, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x48 */ { "PHA", 0x48, 1, 3, 1, (void*) pha, LUA_NOREF, LUA_NOREF }, + /* 0x49 */ { "EOR", 0x49, 2, 2, 0, (void*) eor_imm, LUA_NOREF, LUA_NOREF }, + /* 0x4a */ { "LSR", 0x4a, 1, 2, 0, (void*) lsr_acc, LUA_NOREF, LUA_NOREF }, + /* 0x4b */ { "???", 0x4b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x4c */ { "JMP", 0x4c, 3, 3, 0, (void*) jmp_abs, LUA_NOREF, LUA_NOREF }, + /* 0x4d */ { "EOR", 0x4d, 3, 4, 0, (void*) eor_abs, LUA_NOREF, LUA_NOREF }, + /* 0x4e */ { "LSR", 0x4e, 3, 6, 0, (void*) lsr_abs, LUA_NOREF, LUA_NOREF }, + /* 0x4f */ { "???", 0x4f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x50 */ { "BVC", 0x50, 2, 2, 0, (void*) bvc, LUA_NOREF, LUA_NOREF }, + /* 0x51 */ { "EOR", 0x51, 2, 5, 0, (void*) eor_indy, LUA_NOREF, LUA_NOREF }, + /* 0x52 */ { "???", 0x52, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x53 */ { "???", 0x53, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x54 */ { "???", 0x54, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x55 */ { "EOR", 0x55, 2, 4, 0, (void*) eor_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x56 */ { "LSR", 0x56, 2, 6, 0, (void*) lsr_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x57 */ { "???", 0x57, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x58 */ { "CLI", 0x58, 1, 2, 0, (void*) cli, LUA_NOREF, LUA_NOREF }, + /* 0x59 */ { "EOR", 0x59, 3, 4, 0, (void*) eor_absy, LUA_NOREF, LUA_NOREF }, + /* 0x5a */ { "???", 0x5a, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x5b */ { "???", 0x5b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x5c */ { "???", 0x5c, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x5d */ { "EOR", 0x5d, 3, 4, 0, (void*) eor_absx, LUA_NOREF, LUA_NOREF }, + /* 0x5e */ { "LSR", 0x5e, 3, 7, 0, (void*) lsr_absx, LUA_NOREF, LUA_NOREF }, + /* 0x5f */ { "???", 0x5f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0x60 */ { "RTS", 0x60, 1, 6, -2, (void*) rts }, - /* 0x61 */ { "ADC", 0x61, 2, 6, 0, (void*) adc_indx }, - /* 0x62 */ { "???", 0x62, 1, 2, 0, (void*) unimplemented }, - /* 0x63 */ { "???", 0x63, 1, 2, 0, (void*) unimplemented }, - /* 0x64 */ { "???", 0x64, 1, 2, 0, (void*) unimplemented }, - /* 0x65 */ { "ADC", 0x65, 2, 3, 0, (void*) adc_zpg }, - /* 0x66 */ { "ROR", 0x66, 2, 5, 0, (void*) ror_zpg }, - /* 0x67 */ { "???", 0x67, 1, 2, 0, (void*) unimplemented }, - /* 0x68 */ { "PLA", 0x68, 1, 4, -1, (void*) pla }, - /* 0x69 */ { "ADC", 0x69, 2, 2, 0, (void*) adc_imm }, - /* 0x6a */ { "ROR", 0x6a, 1, 2, 0, (void*) ror_acc }, - /* 0x6b */ { "???", 0x6b, 1, 2, 0, (void*) unimplemented }, - /* 0x6c */ { "JMP", 0x6c, 3, 5, 0, (void*) jmp_ind }, - /* 0x6d */ { "ADC", 0x6d, 3, 4, 0, (void*) adc_abs }, - /* 0x6e */ { "ROR", 0x6e, 3, 6, 0, (void*) ror_abs }, - /* 0x6f */ { "???", 0x6f, 1, 2, 0, (void*) unimplemented }, - /* 0x70 */ { "BVS", 0x70, 2, 2, 0, (void*) bvs }, - /* 0x71 */ { "ADC", 0x71, 2, 5, 0, (void*) adc_indy }, - /* 0x72 */ { "???", 0x72, 1, 2, 0, (void*) unimplemented }, - /* 0x73 */ { "???", 0x73, 1, 2, 0, (void*) unimplemented }, - /* 0x74 */ { "???", 0x74, 1, 2, 0, (void*) unimplemented }, - /* 0x75 */ { "ADC", 0x75, 2, 4, 0, (void*) adc_zpgx }, - /* 0x76 */ { "ROR", 0x76, 2, 6, 0, (void*) ror_zpgx }, - /* 0x77 */ { "???", 0x77, 1, 2, 0, (void*) unimplemented }, - /* 0x78 */ { "SEI", 0x78, 1, 2, 0, (void*) sei }, - /* 0x79 */ { "ADC", 0x79, 3, 4, 0, (void*) adc_absy }, - /* 0x7a */ { "???", 0x7a, 1, 2, 0, (void*) unimplemented }, - /* 0x7b */ { "???", 0x7b, 1, 2, 0, (void*) unimplemented }, - /* 0x7c */ { "???", 0x7c, 1, 2, 0, (void*) unimplemented }, - /* 0x7d */ { "ADC", 0x7d, 3, 4, 0, (void*) adc_absx }, - /* 0x7e */ { "ROR", 0x7e, 3, 7, 0, (void*) ror_absx }, - /* 0x7f */ { "???", 0x7f, 1, 2, 0, (void*) unimplemented }, + /* 0x60 */ { "RTS", 0x60, 1, 6, -2, (void*) rts, LUA_NOREF, LUA_NOREF }, + /* 0x61 */ { "ADC", 0x61, 2, 6, 0, (void*) adc_indx, LUA_NOREF, LUA_NOREF }, + /* 0x62 */ { "???", 0x62, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x63 */ { "???", 0x63, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x64 */ { "???", 0x64, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x65 */ { "ADC", 0x65, 2, 3, 0, (void*) adc_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x66 */ { "ROR", 0x66, 2, 5, 0, (void*) ror_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x67 */ { "???", 0x67, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x68 */ { "PLA", 0x68, 1, 4, -1, (void*) pla, LUA_NOREF, LUA_NOREF }, + /* 0x69 */ { "ADC", 0x69, 2, 2, 0, (void*) adc_imm, LUA_NOREF, LUA_NOREF }, + /* 0x6a */ { "ROR", 0x6a, 1, 2, 0, (void*) ror_acc, LUA_NOREF, LUA_NOREF }, + /* 0x6b */ { "???", 0x6b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x6c */ { "JMP", 0x6c, 3, 5, 0, (void*) jmp_ind, LUA_NOREF, LUA_NOREF }, + /* 0x6d */ { "ADC", 0x6d, 3, 4, 0, (void*) adc_abs, LUA_NOREF, LUA_NOREF }, + /* 0x6e */ { "ROR", 0x6e, 3, 6, 0, (void*) ror_abs, LUA_NOREF, LUA_NOREF }, + /* 0x6f */ { "???", 0x6f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x70 */ { "BVS", 0x70, 2, 2, 0, (void*) bvs, LUA_NOREF, LUA_NOREF }, + /* 0x71 */ { "ADC", 0x71, 2, 5, 0, (void*) adc_indy, LUA_NOREF, LUA_NOREF }, + /* 0x72 */ { "???", 0x72, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x73 */ { "???", 0x73, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x74 */ { "???", 0x74, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x75 */ { "ADC", 0x75, 2, 4, 0, (void*) adc_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x76 */ { "ROR", 0x76, 2, 6, 0, (void*) ror_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x77 */ { "???", 0x77, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x78 */ { "SEI", 0x78, 1, 2, 0, (void*) sei, LUA_NOREF, LUA_NOREF }, + /* 0x79 */ { "ADC", 0x79, 3, 4, 0, (void*) adc_absy, LUA_NOREF, LUA_NOREF }, + /* 0x7a */ { "???", 0x7a, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x7b */ { "???", 0x7b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x7c */ { "???", 0x7c, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x7d */ { "ADC", 0x7d, 3, 4, 0, (void*) adc_absx, LUA_NOREF, LUA_NOREF }, + /* 0x7e */ { "ROR", 0x7e, 3, 7, 0, (void*) ror_absx, LUA_NOREF, LUA_NOREF }, + /* 0x7f */ { "???", 0x7f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0x80 */ { "???", 0x80, 1, 2, 0, (void*) unimplemented }, - /* 0x81 */ { "STA", 0x81, 2, 6, 0, (void*) sta_indx }, - /* 0x82 */ { "???", 0x82, 1, 2, 0, (void*) unimplemented }, - /* 0x83 */ { "???", 0x83, 1, 2, 0, (void*) unimplemented }, - /* 0x84 */ { "STY", 0x84, 2, 3, 0, (void*) sty_zpg }, - /* 0x85 */ { "STA", 0x85, 2, 3, 0, (void*) sta_zpg }, - /* 0x86 */ { "STX", 0x86, 2, 3, 0, (void*) stx_zpg }, - /* 0x87 */ { "???", 0x87, 1, 2, 0, (void*) unimplemented }, - /* 0x88 */ { "DEY", 0x88, 1, 2, 0, (void*) dey }, - /* 0x89 */ { "???", 0x89, 1, 2, 0, (void*) unimplemented }, - /* 0x8a */ { "TXA", 0x8a, 1, 2, 0, (void*) txa }, - /* 0x8b */ { "???", 0x8b, 1, 2, 0, (void*) unimplemented }, - /* 0x8c */ { "STY", 0x8c, 3, 4, 0, (void*) sty_abs }, - /* 0x8d */ { "STA", 0x8d, 3, 4, 0, (void*) sta_abs }, - /* 0x8e */ { "STX", 0x8e, 3, 4, 0, (void*) stx_abs }, - /* 0x8f */ { "???", 0x8f, 1, 2, 0, (void*) unimplemented }, - /* 0x90 */ { "BCC", 0x90, 2, 2, 0, (void*) bcc }, - /* 0x91 */ { "STA", 0x91, 2, 6, 0, (void*) sta_indy }, - /* 0x92 */ { "???", 0x92, 1, 2, 0, (void*) unimplemented }, - /* 0x93 */ { "???", 0x93, 1, 2, 0, (void*) unimplemented }, - /* 0x94 */ { "STY", 0x94, 2, 4, 0, (void*) sty_zpgx }, - /* 0x95 */ { "STA", 0x95, 2, 4, 0, (void*) sta_zpgx }, - /* 0x96 */ { "STX", 0x96, 2, 4, 0, (void*) stx_zpgy }, - /* 0x97 */ { "???", 0x97, 1, 2, 0, (void*) unimplemented }, - /* 0x98 */ { "TYA", 0x98, 1, 2, 0, (void*) tya }, - /* 0x99 */ { "STA", 0x99, 3, 5, 0, (void*) sta_absy }, - /* 0x9a */ { "TXS", 0x9a, 1, 2, 0, (void*) txs }, - /* 0x9b */ { "???", 0x9b, 1, 2, 0, (void*) unimplemented }, - /* 0x9c */ { "???", 0x9c, 1, 2, 0, (void*) unimplemented }, - /* 0x9d */ { "STA", 0x9d, 3, 5, 0, (void*) sta_absx }, - /* 0x9e */ { "???", 0x9e, 1, 2, 0, (void*) unimplemented }, - /* 0x9f */ { "???", 0x9f, 1, 2, 0, (void*) unimplemented }, + /* 0x80 */ { "???", 0x80, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x81 */ { "STA", 0x81, 2, 6, 0, (void*) sta_indx, LUA_NOREF, LUA_NOREF }, + /* 0x82 */ { "???", 0x82, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x83 */ { "???", 0x83, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x84 */ { "STY", 0x84, 2, 3, 0, (void*) sty_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x85 */ { "STA", 0x85, 2, 3, 0, (void*) sta_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x86 */ { "STX", 0x86, 2, 3, 0, (void*) stx_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x87 */ { "???", 0x87, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x88 */ { "DEY", 0x88, 1, 2, 0, (void*) dey, LUA_NOREF, LUA_NOREF }, + /* 0x89 */ { "???", 0x89, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x8a */ { "TXA", 0x8a, 1, 2, 0, (void*) txa, LUA_NOREF, LUA_NOREF }, + /* 0x8b */ { "???", 0x8b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x8c */ { "STY", 0x8c, 3, 4, 0, (void*) sty_abs, LUA_NOREF, LUA_NOREF }, + /* 0x8d */ { "STA", 0x8d, 3, 4, 0, (void*) sta_abs, LUA_NOREF, LUA_NOREF }, + /* 0x8e */ { "STX", 0x8e, 3, 4, 0, (void*) stx_abs, LUA_NOREF, LUA_NOREF }, + /* 0x8f */ { "???", 0x8f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x90 */ { "BCC", 0x90, 2, 2, 0, (void*) bcc, LUA_NOREF, LUA_NOREF }, + /* 0x91 */ { "STA", 0x91, 2, 6, 0, (void*) sta_indy, LUA_NOREF, LUA_NOREF }, + /* 0x92 */ { "???", 0x92, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x93 */ { "???", 0x93, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x94 */ { "STY", 0x94, 2, 4, 0, (void*) sty_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x95 */ { "STA", 0x95, 2, 4, 0, (void*) sta_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x96 */ { "STX", 0x96, 2, 4, 0, (void*) stx_zpgy, LUA_NOREF, LUA_NOREF }, + /* 0x97 */ { "???", 0x97, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x98 */ { "TYA", 0x98, 1, 2, 0, (void*) tya, LUA_NOREF, LUA_NOREF }, + /* 0x99 */ { "STA", 0x99, 3, 5, 0, (void*) sta_absy, LUA_NOREF, LUA_NOREF }, + /* 0x9a */ { "TXS", 0x9a, 1, 2, 0, (void*) txs, LUA_NOREF, LUA_NOREF }, + /* 0x9b */ { "???", 0x9b, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x9c */ { "???", 0x9c, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x9d */ { "STA", 0x9d, 3, 5, 0, (void*) sta_absx, LUA_NOREF, LUA_NOREF }, + /* 0x9e */ { "???", 0x9e, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0x9f */ { "???", 0x9f, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0xa0 */ { "LDY", 0xa0, 2, 2, 0, (void*) ldy_imm }, - /* 0xa1 */ { "LDA", 0xa1, 2, 6, 0, (void*) lda_indx }, - /* 0xa2 */ { "LDX", 0xa2, 2, 2, 0, (void*) ldx_imm }, - /* 0xa3 */ { "???", 0xa3, 1, 2, 0, (void*) unimplemented }, - /* 0xa4 */ { "LDY", 0xa4, 2, 3, 0, (void*) ldy_zpg }, - /* 0xa5 */ { "LDA", 0xa5, 2, 3, 0, (void*) lda_zpg }, - /* 0xa6 */ { "LDX", 0xa6, 2, 3, 0, (void*) ldx_zpg }, - /* 0xa7 */ { "???", 0xa7, 1, 2, 0, (void*) unimplemented }, - /* 0xa8 */ { "TAY", 0xa8, 1, 2, 0, (void*) tay }, - /* 0xa9 */ { "LDA", 0xa9, 2, 2, 0, (void*) lda_imm }, - /* 0xaa */ { "TAX", 0xaa, 1, 2, 0, (void*) tax }, - /* 0xab */ { "???", 0xab, 1, 2, 0, (void*) unimplemented }, - /* 0xac */ { "LDY", 0xac, 3, 4, 0, (void*) ldy_abs }, - /* 0xad */ { "LDA", 0xad, 3, 4, 0, (void*) lda_abs }, - /* 0xae */ { "LDX", 0xae, 3, 4, 0, (void*) ldx_abs }, - /* 0xaf */ { "???", 0xaf, 1, 2, 0, (void*) unimplemented }, - /* 0xb0 */ { "BCS", 0xb0, 2, 2, 0, (void*) bcs }, - /* 0xb1 */ { "LDA", 0xb1, 2, 5, 0, (void*) lda_indy }, - /* 0xb2 */ { "???", 0xb2, 1, 2, 0, (void*) unimplemented }, - /* 0xb3 */ { "???", 0xb3, 1, 2, 0, (void*) unimplemented }, - /* 0xb4 */ { "LDY", 0xb4, 2, 4, 0, (void*) ldy_zpgx }, - /* 0xb5 */ { "LDA", 0xb5, 2, 4, 0, (void*) lda_zpgx }, - /* 0xb6 */ { "LDX", 0xb6, 2, 4, 0, (void*) ldx_zpgy }, - /* 0xb7 */ { "???", 0xb7, 1, 2, 0, (void*) unimplemented }, - /* 0xb8 */ { "CLV", 0xb8, 1, 2, 0, (void*) clv }, - /* 0xb9 */ { "LDA", 0xb9, 3, 4, 0, (void*) lda_absy }, - /* 0xba */ { "TSX", 0xba, 1, 2, 0, (void*) tsx }, - /* 0xbb */ { "???", 0xbb, 1, 2, 0, (void*) unimplemented }, - /* 0xbc */ { "LDY", 0xbc, 3, 4, 0, (void*) ldy_absx }, - /* 0xbd */ { "LDA", 0xbd, 3, 4, 0, (void*) lda_absx }, - /* 0xbe */ { "LDX", 0xbe, 3, 4, 0, (void*) ldx_absy }, - /* 0xbf */ { "???", 0xbf, 1, 2, 0, (void*) unimplemented }, + /* 0xa0 */ { "LDY", 0xa0, 2, 2, 0, (void*) ldy_imm, LUA_NOREF, LUA_NOREF }, + /* 0xa1 */ { "LDA", 0xa1, 2, 6, 0, (void*) lda_indx, LUA_NOREF, LUA_NOREF }, + /* 0xa2 */ { "LDX", 0xa2, 2, 2, 0, (void*) ldx_imm, LUA_NOREF, LUA_NOREF }, + /* 0xa3 */ { "???", 0xa3, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xa4 */ { "LDY", 0xa4, 2, 3, 0, (void*) ldy_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xa5 */ { "LDA", 0xa5, 2, 3, 0, (void*) lda_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xa6 */ { "LDX", 0xa6, 2, 3, 0, (void*) ldx_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xa7 */ { "???", 0xa7, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xa8 */ { "TAY", 0xa8, 1, 2, 0, (void*) tay, LUA_NOREF, LUA_NOREF }, + /* 0xa9 */ { "LDA", 0xa9, 2, 2, 0, (void*) lda_imm, LUA_NOREF, LUA_NOREF }, + /* 0xaa */ { "TAX", 0xaa, 1, 2, 0, (void*) tax, LUA_NOREF, LUA_NOREF }, + /* 0xab */ { "???", 0xab, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xac */ { "LDY", 0xac, 3, 4, 0, (void*) ldy_abs, LUA_NOREF, LUA_NOREF }, + /* 0xad */ { "LDA", 0xad, 3, 4, 0, (void*) lda_abs, LUA_NOREF, LUA_NOREF }, + /* 0xae */ { "LDX", 0xae, 3, 4, 0, (void*) ldx_abs, LUA_NOREF, LUA_NOREF }, + /* 0xaf */ { "???", 0xaf, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xb0 */ { "BCS", 0xb0, 2, 2, 0, (void*) bcs, LUA_NOREF, LUA_NOREF }, + /* 0xb1 */ { "LDA", 0xb1, 2, 5, 0, (void*) lda_indy, LUA_NOREF, LUA_NOREF }, + /* 0xb2 */ { "???", 0xb2, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xb3 */ { "???", 0xb3, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xb4 */ { "LDY", 0xb4, 2, 4, 0, (void*) ldy_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0xb5 */ { "LDA", 0xb5, 2, 4, 0, (void*) lda_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0xb6 */ { "LDX", 0xb6, 2, 4, 0, (void*) ldx_zpgy, LUA_NOREF, LUA_NOREF }, + /* 0xb7 */ { "???", 0xb7, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xb8 */ { "CLV", 0xb8, 1, 2, 0, (void*) clv, LUA_NOREF, LUA_NOREF }, + /* 0xb9 */ { "LDA", 0xb9, 3, 4, 0, (void*) lda_absy, LUA_NOREF, LUA_NOREF }, + /* 0xba */ { "TSX", 0xba, 1, 2, 0, (void*) tsx, LUA_NOREF, LUA_NOREF }, + /* 0xbb */ { "???", 0xbb, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xbc */ { "LDY", 0xbc, 3, 4, 0, (void*) ldy_absx, LUA_NOREF, LUA_NOREF }, + /* 0xbd */ { "LDA", 0xbd, 3, 4, 0, (void*) lda_absx, LUA_NOREF, LUA_NOREF }, + /* 0xbe */ { "LDX", 0xbe, 3, 4, 0, (void*) ldx_absy, LUA_NOREF, LUA_NOREF }, + /* 0xbf */ { "???", 0xbf, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0xc0 */ { "CPY", 0xc0, 2, 2, 0, (void*) cpy_imm }, - /* 0xc1 */ { "CMP", 0xc1, 2, 6, 0, (void*) cmp_indx }, - /* 0xc2 */ { "???", 0xc2, 1, 2, 0, (void*) unimplemented }, - /* 0xc3 */ { "???", 0xc3, 1, 2, 0, (void*) unimplemented }, - /* 0xc4 */ { "CPY", 0xc4, 2, 3, 0, (void*) cpy_zpg }, - /* 0xc5 */ { "CMP", 0xc5, 2, 3, 0, (void*) cmp_zpg }, - /* 0xc6 */ { "DEC", 0xc6, 2, 5, 0, (void*) dec_zpg }, - /* 0xc7 */ { "???", 0xc7, 1, 2, 0, (void*) unimplemented }, - /* 0xc8 */ { "INY", 0xc8, 1, 2, 0, (void*) iny }, - /* 0xc9 */ { "CMP", 0xc9, 2, 2, 0, (void*) cmp_imm }, - /* 0xca */ { "DEX", 0xca, 1, 2, 0, (void*) dex }, - /* 0xcb */ { "???", 0xcb, 1, 2, 0, (void*) unimplemented }, - /* 0xcc */ { "CPY", 0xcc, 3, 4, 0, (void*) cpy_abs }, - /* 0xcd */ { "CMP", 0xcd, 3, 4, 0, (void*) cmp_abs }, - /* 0xce */ { "DEC", 0xce, 3, 3, 0, (void*) dec_abs }, - /* 0xcf */ { "???", 0xcf, 1, 2, 0, (void*) unimplemented }, - /* 0xd0 */ { "BNE", 0xd0, 2, 2, 0, (void*) bne }, - /* 0xd1 */ { "CMP", 0xd1, 2, 5, 0, (void*) cmp_indy }, - /* 0xd2 */ { "???", 0xd2, 1, 2, 0, (void*) unimplemented }, - /* 0xd3 */ { "???", 0xd3, 1, 2, 0, (void*) unimplemented }, - /* 0xd4 */ { "???", 0xd4, 1, 2, 0, (void*) unimplemented }, - /* 0xd5 */ { "CMP", 0xd5, 2, 4, 0, (void*) cmp_zpgx }, - /* 0xd6 */ { "DEC", 0xd6, 2, 6, 0, (void*) dec_zpgx }, - /* 0xd7 */ { "???", 0xd7, 1, 2, 0, (void*) unimplemented }, - /* 0xd8 */ { "CLD", 0xd8, 1, 2, 0, (void*) cld }, - /* 0xd9 */ { "CMP", 0xd9, 3, 4, 0, (void*) cmp_absy }, - /* 0xda */ { "???", 0xda, 1, 2, 0, (void*) unimplemented }, - /* 0xdb */ { "???", 0xdb, 1, 2, 0, (void*) unimplemented }, - /* 0xdc */ { "???", 0xdc, 1, 2, 0, (void*) unimplemented }, - /* 0xdd */ { "CMP", 0xdd, 3, 4, 0, (void*) cmp_absx }, - /* 0xde */ { "DEC", 0xde, 3, 7, 0, (void*) dec_absx }, - /* 0xdf */ { "???", 0xdf, 1, 2, 0, (void*) unimplemented }, + /* 0xc0 */ { "CPY", 0xc0, 2, 2, 0, (void*) cpy_imm, LUA_NOREF, LUA_NOREF }, + /* 0xc1 */ { "CMP", 0xc1, 2, 6, 0, (void*) cmp_indx, LUA_NOREF, LUA_NOREF }, + /* 0xc2 */ { "???", 0xc2, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xc3 */ { "???", 0xc3, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xc4 */ { "CPY", 0xc4, 2, 3, 0, (void*) cpy_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xc5 */ { "CMP", 0xc5, 2, 3, 0, (void*) cmp_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xc6 */ { "DEC", 0xc6, 2, 5, 0, (void*) dec_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xc7 */ { "???", 0xc7, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xc8 */ { "INY", 0xc8, 1, 2, 0, (void*) iny, LUA_NOREF, LUA_NOREF }, + /* 0xc9 */ { "CMP", 0xc9, 2, 2, 0, (void*) cmp_imm, LUA_NOREF, LUA_NOREF }, + /* 0xca */ { "DEX", 0xca, 1, 2, 0, (void*) dex, LUA_NOREF, LUA_NOREF }, + /* 0xcb */ { "???", 0xcb, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xcc */ { "CPY", 0xcc, 3, 4, 0, (void*) cpy_abs, LUA_NOREF, LUA_NOREF }, + /* 0xcd */ { "CMP", 0xcd, 3, 4, 0, (void*) cmp_abs, LUA_NOREF, LUA_NOREF }, + /* 0xce */ { "DEC", 0xce, 3, 3, 0, (void*) dec_abs, LUA_NOREF, LUA_NOREF }, + /* 0xcf */ { "???", 0xcf, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xd0 */ { "BNE", 0xd0, 2, 2, 0, (void*) bne, LUA_NOREF, LUA_NOREF }, + /* 0xd1 */ { "CMP", 0xd1, 2, 5, 0, (void*) cmp_indy, LUA_NOREF, LUA_NOREF }, + /* 0xd2 */ { "???", 0xd2, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xd3 */ { "???", 0xd3, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xd4 */ { "???", 0xd4, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xd5 */ { "CMP", 0xd5, 2, 4, 0, (void*) cmp_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0xd6 */ { "DEC", 0xd6, 2, 6, 0, (void*) dec_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0xd7 */ { "???", 0xd7, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xd8 */ { "CLD", 0xd8, 1, 2, 0, (void*) cld, LUA_NOREF, LUA_NOREF }, + /* 0xd9 */ { "CMP", 0xd9, 3, 4, 0, (void*) cmp_absy, LUA_NOREF, LUA_NOREF }, + /* 0xda */ { "???", 0xda, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xdb */ { "???", 0xdb, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xdc */ { "???", 0xdc, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xdd */ { "CMP", 0xdd, 3, 4, 0, (void*) cmp_absx, LUA_NOREF, LUA_NOREF }, + /* 0xde */ { "DEC", 0xde, 3, 7, 0, (void*) dec_absx, LUA_NOREF, LUA_NOREF }, + /* 0xdf */ { "???", 0xdf, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, - /* 0xe0 */ { "CPX", 0xe0, 2, 2, 0, (void*) cpx_imm }, - /* 0xe1 */ { "SBC", 0xe1, 2, 2, 0, (void*) sbc_indx }, - /* 0xe2 */ { "???", 0xe2, 1, 2, 0, (void*) unimplemented }, - /* 0xe3 */ { "???", 0xe3, 1, 2, 0, (void*) unimplemented }, - /* 0xe4 */ { "CPX", 0xe4, 2, 3, 0, (void*) cpx_zpg }, - /* 0xe5 */ { "SBC", 0xe5, 2, 2, 0, (void*) sbc_zpg }, - /* 0xe6 */ { "INC", 0xe6, 2, 5, 0, (void*) inc_zpg }, - /* 0xe7 */ { "???", 0xe7, 1, 2, 0, (void*) unimplemented }, - /* 0xe8 */ { "INX", 0xe8, 1, 2, 0, (void*) inx }, - /* 0xe9 */ { "SBC", 0xe9, 2, 2, 0, (void*) sbc_imm }, - /* 0xea */ { "NOP", 0xea, 1, 2, 0, (void*) nop }, - /* 0xeb */ { "???", 0xeb, 1, 2, 0, (void*) unimplemented }, - /* 0xec */ { "CPX", 0xec, 3, 4, 0, (void*) cpx_abs }, - /* 0xed */ { "SBC", 0xed, 3, 2, 0, (void*) sbc_abs }, - /* 0xee */ { "INC", 0xee, 3, 6, 0, (void*) inc_abs }, - /* 0xef */ { "???", 0xef, 1, 2, 0, (void*) unimplemented }, - /* 0xf0 */ { "BEQ", 0xf0, 2, 2, 0, (void*) beq }, - /* 0xf1 */ { "SBC", 0xf1, 2, 2, 0, (void*) sbc_indy }, - /* 0xf2 */ { "???", 0xf2, 1, 2, 0, (void*) unimplemented }, - /* 0xf3 */ { "???", 0xf3, 1, 2, 0, (void*) unimplemented }, - /* 0xf4 */ { "???", 0xf4, 1, 2, 0, (void*) unimplemented }, - /* 0xf5 */ { "SBC", 0xf5, 2, 2, 0, (void*) sbc_zpgx }, - /* 0xf6 */ { "INC", 0xf6, 2, 6, 0, (void*) inc_zpgx }, - /* 0xf7 */ { "???", 0xf7, 1, 2, 0, (void*) unimplemented }, - /* 0xf8 */ { "SED", 0xf8, 1, 2, 0, (void*) sed }, - /* 0xf9 */ { "SBC", 0xf9, 3, 2, 0, (void*) sbc_absy }, - /* 0xfa */ { "???", 0xfa, 1, 2, 0, (void*) unimplemented }, - /* 0xfb */ { "???", 0xfb, 1, 2, 0, (void*) unimplemented }, - /* 0xfc */ { "???", 0xfc, 1, 2, 0, (void*) unimplemented }, - /* 0xfd */ { "SBC", 0xfd, 3, 2, 0, (void*) sbc_absx }, - /* 0xfe */ { "INC", 0xfe, 3, 7, 0, (void*) inc_absx }, - /* 0xff */ { "???", 0xff, 1, 2, 0, (void*) unimplemented } + /* 0xe0 */ { "CPX", 0xe0, 2, 2, 0, (void*) cpx_imm, LUA_NOREF, LUA_NOREF }, + /* 0xe1 */ { "SBC", 0xe1, 2, 2, 0, (void*) sbc_indx, LUA_NOREF, LUA_NOREF }, + /* 0xe2 */ { "???", 0xe2, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xe3 */ { "???", 0xe3, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xe4 */ { "CPX", 0xe4, 2, 3, 0, (void*) cpx_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xe5 */ { "SBC", 0xe5, 2, 2, 0, (void*) sbc_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xe6 */ { "INC", 0xe6, 2, 5, 0, (void*) inc_zpg, LUA_NOREF, LUA_NOREF }, + /* 0xe7 */ { "???", 0xe7, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xe8 */ { "INX", 0xe8, 1, 2, 0, (void*) inx, LUA_NOREF, LUA_NOREF }, + /* 0xe9 */ { "SBC", 0xe9, 2, 2, 0, (void*) sbc_imm, LUA_NOREF, LUA_NOREF }, + /* 0xea */ { "NOP", 0xea, 1, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xeb */ { "???", 0xeb, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xec */ { "CPX", 0xec, 3, 4, 0, (void*) cpx_abs, LUA_NOREF, LUA_NOREF }, + /* 0xed */ { "SBC", 0xed, 3, 2, 0, (void*) sbc_abs, LUA_NOREF, LUA_NOREF }, + /* 0xee */ { "INC", 0xee, 3, 6, 0, (void*) inc_abs, LUA_NOREF, LUA_NOREF }, + /* 0xef */ { "???", 0xef, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xf0 */ { "BEQ", 0xf0, 2, 2, 0, (void*) beq, LUA_NOREF, LUA_NOREF }, + /* 0xf1 */ { "SBC", 0xf1, 2, 2, 0, (void*) sbc_indy, LUA_NOREF, LUA_NOREF }, + /* 0xf2 */ { "???", 0xf2, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xf3 */ { "???", 0xf3, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xf4 */ { "???", 0xf4, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xf5 */ { "SBC", 0xf5, 2, 2, 0, (void*) sbc_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0xf6 */ { "INC", 0xf6, 2, 6, 0, (void*) inc_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0xf7 */ { "???", 0xf7, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xf8 */ { "SED", 0xf8, 1, 2, 0, (void*) sed, LUA_NOREF, LUA_NOREF }, + /* 0xf9 */ { "SBC", 0xf9, 3, 2, 0, (void*) sbc_absy, LUA_NOREF, LUA_NOREF }, + /* 0xfa */ { "???", 0xfa, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xfb */ { "???", 0xfb, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xfc */ { "???", 0xfc, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF }, + /* 0xfd */ { "SBC", 0xfd, 3, 2, 0, (void*) sbc_absx, LUA_NOREF, LUA_NOREF }, + /* 0xfe */ { "INC", 0xfe, 3, 7, 0, (void*) inc_absx, LUA_NOREF, LUA_NOREF }, + /* 0xff */ { "???", 0xff, 1, 2, 0, (void*) unimplemented, LUA_NOREF, LUA_NOREF } }; // EWM_CPU_MODEL_65C02 @@ -1454,275 +1458,275 @@ static void smb7(struct cpu_t *cpu, uint8_t oper) { /* Instruction dispatch table */ struct cpu_instruction_t instructions_65C02[256] = { - /* 0x00 */ { "???", 0x00, 0, 0, 0, NULL }, - /* 0x01 */ { "???", 0x01, 0, 0, 0, NULL }, - /* 0x02 */ { "NOP", 0x02, 2, 2, 0, (void*) nop }, - /* 0x03 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x04 */ { "TSB", 0x04, 2, 5, 0, (void*) tsb_zpg }, - /* 0x05 */ { "???", 0x05, 0, 0, 0, NULL }, - /* 0x06 */ { "???", 0x06, 0, 0, 0, NULL }, - /* 0x07 */ { "RMB", 0x07, 2, 5, 0, (void*) rmb0 }, - /* 0x08 */ { "???", 0x08, 0, 0, 0, NULL }, - /* 0x09 */ { "???", 0x09, 0, 0, 0, NULL }, - /* 0x0a */ { "???", 0x0a, 0, 0, 0, NULL }, - /* 0x0b */ { "NOP", 0x0b, 1, 1, 0, (void*) nop }, - /* 0x0c */ { "TSB", 0x0c, 3, 6, 0, (void*) tsb_abs }, - /* 0x0d */ { "???", 0x0d, 0, 0, 0, NULL }, - /* 0x0e */ { "???", 0x0e, 0, 0, 0, NULL }, - /* 0x0f */ { "BBR", 0x0f, 3, 5, 0, (void*) bbr0 }, + /* 0x00 */ { "???", 0x00, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x01 */ { "???", 0x01, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x02 */ { "NOP", 0x02, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x03 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x04 */ { "TSB", 0x04, 2, 5, 0, (void*) tsb_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x05 */ { "???", 0x05, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x06 */ { "???", 0x06, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x07 */ { "RMB", 0x07, 2, 5, 0, (void*) rmb0, LUA_NOREF, LUA_NOREF }, + /* 0x08 */ { "???", 0x08, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x09 */ { "???", 0x09, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x0a */ { "???", 0x0a, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x0b */ { "NOP", 0x0b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x0c */ { "TSB", 0x0c, 3, 6, 0, (void*) tsb_abs, LUA_NOREF, LUA_NOREF }, + /* 0x0d */ { "???", 0x0d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x0e */ { "???", 0x0e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x0f */ { "BBR", 0x0f, 3, 5, 0, (void*) bbr0, LUA_NOREF, LUA_NOREF }, - /* 0x10 */ { "???", 0x10, 0, 0, 0, NULL }, - /* 0x11 */ { "???", 0x12, 0, 0, 0, NULL }, - /* 0x12 */ { "ORA", 0x12, 2, 5, 0, (void*) ora_ind }, - /* 0x13 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x14 */ { "TRB", 0x14, 2, 5, 0, (void*) trb_zpg }, - /* 0x15 */ { "???", 0x15, 0, 0, 0, NULL }, - /* 0x16 */ { "???", 0x16, 0, 0, 0, NULL }, - /* 0x17 */ { "RMB", 0x17, 2, 5, 0, (void*) rmb1 }, - /* 0x18 */ { "???", 0x18, 0, 0, 0, NULL }, - /* 0x19 */ { "???", 0x19, 0, 0, 0, NULL }, - /* 0x1a */ { "INC", 0x1a, 1, 2, 0, (void*) inc_acc }, - /* 0x1b */ { "NOP", 0x1b, 1, 1, 0, (void*) nop }, - /* 0x1c */ { "TRB", 0x1c, 3, 6, 0, (void*) trb_abs }, - /* 0x1d */ { "???", 0x1d, 0, 0, 0, NULL }, - /* 0x1e */ { "???", 0x1e, 0, 0, 0, NULL }, - /* 0x1f */ { "BBR", 0x1f, 3, 5, 0, (void*) bbr1 }, + /* 0x10 */ { "???", 0x10, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x11 */ { "???", 0x12, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x12 */ { "ORA", 0x12, 2, 5, 0, (void*) ora_ind, LUA_NOREF, LUA_NOREF }, + /* 0x13 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x14 */ { "TRB", 0x14, 2, 5, 0, (void*) trb_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x15 */ { "???", 0x15, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x16 */ { "???", 0x16, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x17 */ { "RMB", 0x17, 2, 5, 0, (void*) rmb1, LUA_NOREF, LUA_NOREF }, + /* 0x18 */ { "???", 0x18, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x19 */ { "???", 0x19, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x1a */ { "INC", 0x1a, 1, 2, 0, (void*) inc_acc, LUA_NOREF, LUA_NOREF }, + /* 0x1b */ { "NOP", 0x1b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x1c */ { "TRB", 0x1c, 3, 6, 0, (void*) trb_abs, LUA_NOREF, LUA_NOREF }, + /* 0x1d */ { "???", 0x1d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x1e */ { "???", 0x1e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x1f */ { "BBR", 0x1f, 3, 5, 0, (void*) bbr1, LUA_NOREF, LUA_NOREF }, - /* 0x20 */ { "???", 0x20, 0, 0, 0, NULL }, - /* 0x21 */ { "???", 0x21, 0, 0, 0, NULL }, - /* 0x22 */ { "NOP", 0x22, 2, 2, 0, (void*) nop }, - /* 0x23 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x24 */ { "???", 0x24, 0, 0, 0, NULL }, - /* 0x25 */ { "???", 0x25, 0, 0, 0, NULL }, - /* 0x26 */ { "???", 0x26, 0, 0, 0, NULL }, - /* 0x27 */ { "RMB", 0x27, 2, 5, 0, (void*) rmb2 }, - /* 0x28 */ { "???", 0x28, 0, 0, 0, NULL }, - /* 0x29 */ { "???", 0x29, 0, 0, 0, NULL }, - /* 0x2a */ { "???", 0x2a, 0, 0, 0, NULL }, - /* 0x2b */ { "NOP", 0x2b, 1, 1, 0, (void*) nop }, - /* 0x2c */ { "???", 0x2c, 0, 0, 0, NULL }, - /* 0x2d */ { "???", 0x2d, 0, 0, 0, NULL }, - /* 0x2e */ { "???", 0x2e, 0, 0, 0, NULL }, - /* 0x2f */ { "BBR", 0x2f, 3, 5, 0, (void*) bbr2 }, + /* 0x20 */ { "???", 0x20, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x21 */ { "???", 0x21, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x22 */ { "NOP", 0x22, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x23 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x24 */ { "???", 0x24, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x25 */ { "???", 0x25, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x26 */ { "???", 0x26, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x27 */ { "RMB", 0x27, 2, 5, 0, (void*) rmb2, LUA_NOREF, LUA_NOREF }, + /* 0x28 */ { "???", 0x28, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x29 */ { "???", 0x29, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x2a */ { "???", 0x2a, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x2b */ { "NOP", 0x2b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x2c */ { "???", 0x2c, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x2d */ { "???", 0x2d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x2e */ { "???", 0x2e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x2f */ { "BBR", 0x2f, 3, 5, 0, (void*) bbr2, LUA_NOREF, LUA_NOREF }, - /* 0x30 */ { "???", 0x30, 0, 0, 0, NULL }, - /* 0x31 */ { "???", 0x31, 0, 0, 0, NULL }, - /* 0x32 */ { "AND", 0x32, 2, 5, 0, (void*) and_ind }, - /* 0x33 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x34 */ { "BIT", 0x34, 2, 4, 0, (void*) bit_zpgx }, - /* 0x35 */ { "???", 0x35, 0, 0, 0, NULL }, - /* 0x36 */ { "???", 0x36, 0, 0, 0, NULL }, - /* 0x37 */ { "RMB", 0x37, 2, 5, 0, (void*) rmb3 }, - /* 0x38 */ { "???", 0x38, 0, 0, 0, NULL }, - /* 0x39 */ { "???", 0x39, 0, 0, 0, NULL }, - /* 0x3a */ { "DEC", 0x3a, 1, 2, 0, (void*) dec_acc }, - /* 0x3b */ { "NOP", 0x3b, 1, 1, 0, (void*) nop }, - /* 0x3c */ { "BIT", 0x3c, 3, 4, 0, (void*) bit_absx }, - /* 0x3d */ { "???", 0x3d, 0, 0, 0, NULL }, - /* 0x3e */ { "???", 0x3e, 0, 0, 0, NULL }, - /* 0x3f */ { "BBR", 0x3f, 3, 5, 0, (void*) bbr3 }, + /* 0x30 */ { "???", 0x30, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x31 */ { "???", 0x31, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x32 */ { "AND", 0x32, 2, 5, 0, (void*) and_ind, LUA_NOREF, LUA_NOREF }, + /* 0x33 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x34 */ { "BIT", 0x34, 2, 4, 0, (void*) bit_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x35 */ { "???", 0x35, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x36 */ { "???", 0x36, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x37 */ { "RMB", 0x37, 2, 5, 0, (void*) rmb3, LUA_NOREF, LUA_NOREF }, + /* 0x38 */ { "???", 0x38, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x39 */ { "???", 0x39, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x3a */ { "DEC", 0x3a, 1, 2, 0, (void*) dec_acc, LUA_NOREF, LUA_NOREF }, + /* 0x3b */ { "NOP", 0x3b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x3c */ { "BIT", 0x3c, 3, 4, 0, (void*) bit_absx, LUA_NOREF, LUA_NOREF }, + /* 0x3d */ { "???", 0x3d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x3e */ { "???", 0x3e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x3f */ { "BBR", 0x3f, 3, 5, 0, (void*) bbr3, LUA_NOREF, LUA_NOREF }, - /* 0x40 */ { "???", 0x40, 0, 0, 0, NULL }, - /* 0x41 */ { "???", 0x41, 0, 0, 0, NULL }, - /* 0x42 */ { "NOP", 0x42, 2, 2, 0, (void*) nop }, - /* 0x43 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x44 */ { "NOP", 0x44, 2, 3, 0, (void*) nop }, - /* 0x45 */ { "???", 0x45, 0, 0, 0, NULL }, - /* 0x46 */ { "???", 0x46, 0, 0, 0, NULL }, - /* 0x47 */ { "RMB", 0x47, 2, 5, 0, (void*) rmb4 }, - /* 0x48 */ { "???", 0x48, 0, 0, 0, NULL }, - /* 0x49 */ { "???", 0x49, 0, 0, 0, NULL }, - /* 0x4a */ { "???", 0x4a, 0, 0, 0, NULL }, - /* 0x4b */ { "NOP", 0x4b, 1, 1, 0, (void*) nop }, - /* 0x4c */ { "???", 0x4c, 0, 0, 0, NULL }, - /* 0x4d */ { "???", 0x4d, 0, 0, 0, NULL }, - /* 0x4e */ { "???", 0x4e, 0, 0, 0, NULL }, - /* 0x4f */ { "BBR", 0x4f, 3, 5, 0, (void*) bbr4 }, + /* 0x40 */ { "???", 0x40, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x41 */ { "???", 0x41, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x42 */ { "NOP", 0x42, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x43 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x44 */ { "NOP", 0x44, 2, 3, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x45 */ { "???", 0x45, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x46 */ { "???", 0x46, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x47 */ { "RMB", 0x47, 2, 5, 0, (void*) rmb4, LUA_NOREF, LUA_NOREF }, + /* 0x48 */ { "???", 0x48, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x49 */ { "???", 0x49, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x4a */ { "???", 0x4a, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x4b */ { "NOP", 0x4b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x4c */ { "???", 0x4c, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x4d */ { "???", 0x4d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x4e */ { "???", 0x4e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x4f */ { "BBR", 0x4f, 3, 5, 0, (void*) bbr4, LUA_NOREF, LUA_NOREF }, - /* 0x50 */ { "???", 0x50, 0, 0, 0, NULL }, - /* 0x51 */ { "???", 0x51, 0, 0, 0, NULL }, - /* 0x52 */ { "EOR", 0x52, 2, 5, 0, (void*) eor_ind }, - /* 0x53 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x54 */ { "NOP", 0x54, 2, 4, 0, (void*) nop }, - /* 0x55 */ { "???", 0x55, 0, 0, 0, NULL }, - /* 0x56 */ { "???", 0x56, 0, 0, 0, NULL }, - /* 0x57 */ { "RMB", 0x57, 2, 5, 0, (void*) rmb5 }, - /* 0x58 */ { "???", 0x58, 0, 0, 0, NULL }, - /* 0x59 */ { "???", 0x59, 0, 0, 0, NULL }, - /* 0x5a */ { "PHY", 0x5a, 1, 3, 0, (void*) phy }, - /* 0x5b */ { "NOP", 0x5b, 1, 1, 0, (void*) nop }, - /* 0x5c */ { "NOP", 0x5c, 3, 8, 0, (void*) nop }, - /* 0x5d */ { "???", 0x5d, 0, 0, 0, NULL }, - /* 0x5e */ { "???", 0x5e, 0, 0, 0, NULL }, - /* 0x5f */ { "BBR", 0x5f, 3, 5, 0, (void*) bbr5 }, + /* 0x50 */ { "???", 0x50, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x51 */ { "???", 0x51, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x52 */ { "EOR", 0x52, 2, 5, 0, (void*) eor_ind, LUA_NOREF, LUA_NOREF }, + /* 0x53 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x54 */ { "NOP", 0x54, 2, 4, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x55 */ { "???", 0x55, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x56 */ { "???", 0x56, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x57 */ { "RMB", 0x57, 2, 5, 0, (void*) rmb5, LUA_NOREF, LUA_NOREF }, + /* 0x58 */ { "???", 0x58, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x59 */ { "???", 0x59, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x5a */ { "PHY", 0x5a, 1, 3, 0, (void*) phy, LUA_NOREF, LUA_NOREF }, + /* 0x5b */ { "NOP", 0x5b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x5c */ { "NOP", 0x5c, 3, 8, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x5d */ { "???", 0x5d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x5e */ { "???", 0x5e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x5f */ { "BBR", 0x5f, 3, 5, 0, (void*) bbr5, LUA_NOREF, LUA_NOREF }, - /* 0x60 */ { "???", 0x60, 0, 0, 0, NULL }, - /* 0x61 */ { "???", 0x61, 0, 0, 0, NULL }, - /* 0x62 */ { "NOP", 0x62, 2, 2, 0, (void*) nop }, - /* 0x63 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x64 */ { "STZ", 0x64, 2, 3, 0, (void*) stz_zpg }, - /* 0x65 */ { "???", 0x65, 0, 0, 0, NULL }, - /* 0x66 */ { "???", 0x66, 0, 0, 0, NULL }, - /* 0x67 */ { "RMB", 0x67, 2, 5, 0, (void*) rmb6 }, - /* 0x68 */ { "???", 0x68, 0, 0, 0, NULL }, - /* 0x69 */ { "???", 0x69, 0, 0, 0, NULL }, - /* 0x6a */ { "???", 0x6a, 0, 0, 0, NULL }, - /* 0x6b */ { "NOP", 0x6b, 1, 1, 0, (void*) nop }, - /* 0x6c */ { "???", 0x6c, 0, 0, 0, NULL }, - /* 0x6d */ { "???", 0x6d, 0, 0, 0, NULL }, - /* 0x6e */ { "???", 0x6e, 0, 0, 0, NULL }, - /* 0x6f */ { "BBR", 0x6f, 3, 5, 0, (void*) bbr6 }, + /* 0x60 */ { "???", 0x60, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x61 */ { "???", 0x61, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x62 */ { "NOP", 0x62, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x63 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x64 */ { "STZ", 0x64, 2, 3, 0, (void*) stz_zpg, LUA_NOREF, LUA_NOREF }, + /* 0x65 */ { "???", 0x65, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x66 */ { "???", 0x66, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x67 */ { "RMB", 0x67, 2, 5, 0, (void*) rmb6, LUA_NOREF, LUA_NOREF }, + /* 0x68 */ { "???", 0x68, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x69 */ { "???", 0x69, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x6a */ { "???", 0x6a, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x6b */ { "NOP", 0x6b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x6c */ { "???", 0x6c, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x6d */ { "???", 0x6d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x6e */ { "???", 0x6e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x6f */ { "BBR", 0x6f, 3, 5, 0, (void*) bbr6, LUA_NOREF, LUA_NOREF }, - /* 0x70 */ { "???", 0x70, 0, 0, 0, NULL }, - /* 0x71 */ { "???", 0x71, 0, 0, 0, NULL }, - /* 0x72 */ { "ADC", 0x72, 2, 5, 0, (void*) adc_ind }, - /* 0x73 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x74 */ { "STZ", 0x74, 2, 4, 0, (void*) stz_zpgx }, - /* 0x75 */ { "???", 0x75, 0, 0, 0, NULL }, - /* 0x76 */ { "???", 0x76, 0, 0, 0, NULL }, - /* 0x77 */ { "RMB", 0x77, 2, 5, 0, (void*) rmb7 }, - /* 0x78 */ { "???", 0x78, 0, 0, 0, NULL }, - /* 0x79 */ { "???", 0x79, 0, 0, 0, NULL }, - /* 0x7a */ { "PLY", 0x7a, 1, 4, 0, (void*) ply }, - /* 0x7b */ { "NOP", 0x7b, 1, 1, 0, (void*) nop }, - /* 0x7c */ { "JMP", 0x7c, 3, 6, 0, (void*) jmp_absx }, - /* 0x7d */ { "???", 0x7d, 0, 0, 0, NULL }, - /* 0x7e */ { "???", 0x7e, 0, 0, 0, NULL }, - /* 0x7f */ { "BBR", 0x7f, 3, 5, 0, (void*) bbr7 }, + /* 0x70 */ { "???", 0x70, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x71 */ { "???", 0x71, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x72 */ { "ADC", 0x72, 2, 5, 0, (void*) adc_ind, LUA_NOREF, LUA_NOREF }, + /* 0x73 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x74 */ { "STZ", 0x74, 2, 4, 0, (void*) stz_zpgx, LUA_NOREF, LUA_NOREF }, + /* 0x75 */ { "???", 0x75, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x76 */ { "???", 0x76, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x77 */ { "RMB", 0x77, 2, 5, 0, (void*) rmb7, LUA_NOREF, LUA_NOREF }, + /* 0x78 */ { "???", 0x78, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x79 */ { "???", 0x79, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x7a */ { "PLY", 0x7a, 1, 4, 0, (void*) ply, LUA_NOREF, LUA_NOREF }, + /* 0x7b */ { "NOP", 0x7b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x7c */ { "JMP", 0x7c, 3, 6, 0, (void*) jmp_absx, LUA_NOREF, LUA_NOREF }, + /* 0x7d */ { "???", 0x7d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x7e */ { "???", 0x7e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x7f */ { "BBR", 0x7f, 3, 5, 0, (void*) bbr7, LUA_NOREF, LUA_NOREF }, - /* 0x80 */ { "BRA", 0x80, 2, 3, 0, (void*) bra }, - /* 0x81 */ { "???", 0x81, 0, 0, 0, NULL }, - /* 0x82 */ { "NOP", 0x82, 2, 2, 0, (void*) nop }, - /* 0x83 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x84 */ { "???", 0x84, 0, 0, 0, NULL }, - /* 0x85 */ { "???", 0x85, 0, 0, 0, NULL }, - /* 0x86 */ { "???", 0x86, 0, 0, 0, NULL }, - /* 0x87 */ { "SMB", 0x87, 2, 5, 0, (void*) smb0 }, - /* 0x88 */ { "???", 0x88, 0, 0, 0, NULL }, - /* 0x89 */ { "BIT", 0x89, 2, 2, 0, (void*) bit_imm }, - /* 0x8a */ { "???", 0x8a, 0, 0, 0, NULL }, - /* 0x8b */ { "NOP", 0x8b, 1, 1, 0, (void*) nop }, - /* 0x8c */ { "???", 0x8c, 0, 0, 0, NULL }, - /* 0x8d */ { "???", 0x8d, 0, 0, 0, NULL }, - /* 0x8e */ { "???", 0x8e, 0, 0, 0, NULL }, - /* 0x8f */ { "BBS", 0x8f, 3, 5, 0, (void*) bbs0 }, + /* 0x80 */ { "BRA", 0x80, 2, 3, 0, (void*) bra, LUA_NOREF, LUA_NOREF }, + /* 0x81 */ { "???", 0x81, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x82 */ { "NOP", 0x82, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x83 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x84 */ { "???", 0x84, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x85 */ { "???", 0x85, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x86 */ { "???", 0x86, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x87 */ { "SMB", 0x87, 2, 5, 0, (void*) smb0, LUA_NOREF, LUA_NOREF }, + /* 0x88 */ { "???", 0x88, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x89 */ { "BIT", 0x89, 2, 2, 0, (void*) bit_imm, LUA_NOREF, LUA_NOREF }, + /* 0x8a */ { "???", 0x8a, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x8b */ { "NOP", 0x8b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x8c */ { "???", 0x8c, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x8d */ { "???", 0x8d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x8e */ { "???", 0x8e, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x8f */ { "BBS", 0x8f, 3, 5, 0, (void*) bbs0, LUA_NOREF, LUA_NOREF }, - /* 0x90 */ { "???", 0x90, 0, 0, 0, NULL }, - /* 0x91 */ { "???", 0x91, 0, 0, 0, NULL }, - /* 0x92 */ { "STA", 0x92, 2, 5, 0, (void*) sta_ind }, - /* 0x93 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0x94 */ { "???", 0x94, 0, 0, 0, NULL }, - /* 0x95 */ { "???", 0x95, 0, 0, 0, NULL }, - /* 0x96 */ { "???", 0x96, 0, 0, 0, NULL }, - /* 0x97 */ { "SMB", 0x97, 2, 5, 0, (void*) smb1 }, - /* 0x98 */ { "???", 0x98, 0, 0, 0, NULL }, - /* 0x99 */ { "???", 0x99, 0, 0, 0, NULL }, - /* 0x9a */ { "???", 0x9a, 0, 0, 0, NULL }, - /* 0x9b */ { "NOP", 0x9b, 1, 1, 0, (void*) nop }, - /* 0x9c */ { "STZ", 0x9c, 3, 4, 0, (void*) stz_abs }, - /* 0x9d */ { "???", 0x9d, 0, 0, 0, NULL }, - /* 0x9e */ { "STZ", 0x9e, 3, 5, 0, (void*) stz_absx }, - /* 0x9f */ { "BBS", 0x9f, 3, 5, 0, (void*) bbs1 }, + /* 0x90 */ { "???", 0x90, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x91 */ { "???", 0x91, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x92 */ { "STA", 0x92, 2, 5, 0, (void*) sta_ind, LUA_NOREF, LUA_NOREF }, + /* 0x93 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x94 */ { "???", 0x94, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x95 */ { "???", 0x95, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x96 */ { "???", 0x96, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x97 */ { "SMB", 0x97, 2, 5, 0, (void*) smb1, LUA_NOREF, LUA_NOREF }, + /* 0x98 */ { "???", 0x98, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x99 */ { "???", 0x99, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x9a */ { "???", 0x9a, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x9b */ { "NOP", 0x9b, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0x9c */ { "STZ", 0x9c, 3, 4, 0, (void*) stz_abs, LUA_NOREF, LUA_NOREF }, + /* 0x9d */ { "???", 0x9d, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0x9e */ { "STZ", 0x9e, 3, 5, 0, (void*) stz_absx, LUA_NOREF, LUA_NOREF }, + /* 0x9f */ { "BBS", 0x9f, 3, 5, 0, (void*) bbs1, LUA_NOREF, LUA_NOREF }, - /* 0xa0 */ { "???", 0xa0, 0, 0, 0, NULL }, - /* 0xa1 */ { "???", 0xa1, 0, 0, 0, NULL }, - /* 0xa2 */ { "???", 0xa2, 0, 0, 0, NULL }, - /* 0xa3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0xa4 */ { "???", 0xa4, 0, 0, 0, NULL }, - /* 0xa5 */ { "???", 0xa5, 0, 0, 0, NULL }, - /* 0xa6 */ { "???", 0xa6, 0, 0, 0, NULL }, - /* 0xa7 */ { "SMB", 0xa7, 2, 5, 0, (void*) smb2 }, - /* 0xa8 */ { "???", 0xa8, 0, 0, 0, NULL }, - /* 0xa9 */ { "???", 0xa9, 0, 0, 0, NULL }, - /* 0xaa */ { "???", 0xaa, 0, 0, 0, NULL }, - /* 0xab */ { "NOP", 0xab, 1, 1, 0, (void*) nop }, - /* 0xac */ { "???", 0xac, 0, 0, 0, NULL }, - /* 0xad */ { "???", 0xad, 0, 0, 0, NULL }, - /* 0xae */ { "???", 0xae, 0, 0, 0, NULL }, - /* 0xaf */ { "BBS", 0xaf, 3, 5, 0, (void*) bbs2 }, + /* 0xa0 */ { "???", 0xa0, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa1 */ { "???", 0xa1, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa2 */ { "???", 0xa2, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xa4 */ { "???", 0xa4, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa5 */ { "???", 0xa5, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa6 */ { "???", 0xa6, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa7 */ { "SMB", 0xa7, 2, 5, 0, (void*) smb2, LUA_NOREF, LUA_NOREF }, + /* 0xa8 */ { "???", 0xa8, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xa9 */ { "???", 0xa9, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xaa */ { "???", 0xaa, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xab */ { "NOP", 0xab, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xac */ { "???", 0xac, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xad */ { "???", 0xad, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xae */ { "???", 0xae, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xaf */ { "BBS", 0xaf, 3, 5, 0, (void*) bbs2, LUA_NOREF, LUA_NOREF }, - /* 0xb0 */ { "???", 0xb0, 0, 0, 0, NULL }, - /* 0xb1 */ { "???", 0xb1, 0, 0, 0, NULL }, - /* 0xb2 */ { "LDA", 0xb2, 2, 5, 0, (void*) lda_ind }, - /* 0xb3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0xb4 */ { "???", 0xb4, 0, 0, 0, NULL }, - /* 0xb5 */ { "???", 0xb5, 0, 0, 0, NULL }, - /* 0xb6 */ { "???", 0xb6, 0, 0, 0, NULL }, - /* 0xb7 */ { "SMB", 0xb7, 2, 5, 0, (void*) smb3 }, - /* 0xb8 */ { "???", 0xb8, 0, 0, 0, NULL }, - /* 0xb9 */ { "???", 0xb9, 0, 0, 0, NULL }, - /* 0xba */ { "???", 0xba, 0, 0, 0, NULL }, - /* 0xbb */ { "NOP", 0xbb, 1, 1, 0, (void*) nop }, - /* 0xbc */ { "???", 0xbc, 0, 0, 0, NULL }, - /* 0xbd */ { "???", 0xbd, 0, 0, 0, NULL }, - /* 0xbe */ { "???", 0xbe, 0, 0, 0, NULL }, - /* 0xbf */ { "BBS", 0xbf, 3, 5, 0, (void*) bbs3 }, + /* 0xb0 */ { "???", 0xb0, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xb1 */ { "???", 0xb1, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xb2 */ { "LDA", 0xb2, 2, 5, 0, (void*) lda_ind, LUA_NOREF, LUA_NOREF }, + /* 0xb3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xb4 */ { "???", 0xb4, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xb5 */ { "???", 0xb5, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xb6 */ { "???", 0xb6, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xb7 */ { "SMB", 0xb7, 2, 5, 0, (void*) smb3, LUA_NOREF, LUA_NOREF }, + /* 0xb8 */ { "???", 0xb8, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xb9 */ { "???", 0xb9, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xba */ { "???", 0xba, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xbb */ { "NOP", 0xbb, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xbc */ { "???", 0xbc, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xbd */ { "???", 0xbd, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xbe */ { "???", 0xbe, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xbf */ { "BBS", 0xbf, 3, 5, 0, (void*) bbs3, LUA_NOREF, LUA_NOREF }, - /* 0xc0 */ { "???", 0xc0, 0, 0, 0, NULL }, - /* 0xc1 */ { "???", 0xc1, 0, 0, 0, NULL }, - /* 0xc2 */ { "NOP", 0xc2, 2, 2, 0, (void*) nop }, - /* 0xc3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0xc4 */ { "???", 0xc4, 0, 0, 0, NULL }, - /* 0xc5 */ { "???", 0xc5, 0, 0, 0, NULL }, - /* 0xc6 */ { "???", 0xc6, 0, 0, 0, NULL }, - /* 0xc7 */ { "SMB", 0xc7, 2, 5, 0, (void*) smb4 }, - /* 0xc8 */ { "???", 0xc8, 0, 0, 0, NULL }, - /* 0xc9 */ { "???", 0xc9, 0, 0, 0, NULL }, - /* 0xca */ { "???", 0xca, 0, 0, 0, NULL }, - /* 0xcb */ { "NOP", 0xcb, 1, 1, 0, (void*) nop }, - /* 0xcc */ { "???", 0xcc, 0, 0, 0, NULL }, - /* 0xcd */ { "???", 0xcd, 0, 0, 0, NULL }, - /* 0xce */ { "???", 0xce, 0, 0, 0, NULL }, - /* 0xcf */ { "BBS", 0xcf, 3, 5, 0, (void*) bbs4 }, + /* 0xc0 */ { "???", 0xc0, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xc1 */ { "???", 0xc1, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xc2 */ { "NOP", 0xc2, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xc3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xc4 */ { "???", 0xc4, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xc5 */ { "???", 0xc5, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xc6 */ { "???", 0xc6, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xc7 */ { "SMB", 0xc7, 2, 5, 0, (void*) smb4, LUA_NOREF, LUA_NOREF }, + /* 0xc8 */ { "???", 0xc8, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xc9 */ { "???", 0xc9, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xca */ { "???", 0xca, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xcb */ { "NOP", 0xcb, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xcc */ { "???", 0xcc, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xcd */ { "???", 0xcd, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xce */ { "???", 0xce, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xcf */ { "BBS", 0xcf, 3, 5, 0, (void*) bbs4, LUA_NOREF, LUA_NOREF }, - /* 0xd0 */ { "???", 0xd0, 0, 0, 0, NULL }, - /* 0xd1 */ { "???", 0xd1, 0, 0, 0, NULL }, - /* 0xd2 */ { "CMP", 0xd2, 2, 5, 0, (void*) cmp_ind }, - /* 0xd3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0xd4 */ { "NOP", 0xd4, 2, 4, 0, (void*) nop }, - /* 0xd5 */ { "???", 0xd5, 0, 0, 0, NULL }, - /* 0xd6 */ { "???", 0xd6, 0, 0, 0, NULL }, - /* 0xd7 */ { "SMB", 0xd7, 2, 5, 0, (void*) smb5 }, - /* 0xd8 */ { "???", 0xd8, 0, 0, 0, NULL }, - /* 0xd9 */ { "???", 0xd9, 0, 0, 0, NULL }, - /* 0xda */ { "PHX", 0xda, 1, 3, 0, (void*) phx }, - /* 0xdb */ { "NOP", 0xdb, 1, 1, 0, (void*) nop }, - /* 0xdc */ { "NOP", 0xdc, 3, 4, 0, (void*) nop }, - /* 0xdd */ { "???", 0xdd, 0, 0, 0, NULL }, - /* 0xde */ { "???", 0xde, 0, 0, 0, NULL }, - /* 0xdf */ { "BBS", 0xdf, 3, 5, 0, (void*) bbs5 }, + /* 0xd0 */ { "???", 0xd0, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xd1 */ { "???", 0xd1, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xd2 */ { "CMP", 0xd2, 2, 5, 0, (void*) cmp_ind, LUA_NOREF, LUA_NOREF }, + /* 0xd3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xd4 */ { "NOP", 0xd4, 2, 4, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xd5 */ { "???", 0xd5, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xd6 */ { "???", 0xd6, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xd7 */ { "SMB", 0xd7, 2, 5, 0, (void*) smb5, LUA_NOREF, LUA_NOREF }, + /* 0xd8 */ { "???", 0xd8, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xd9 */ { "???", 0xd9, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xda */ { "PHX", 0xda, 1, 3, 0, (void*) phx, LUA_NOREF, LUA_NOREF }, + /* 0xdb */ { "NOP", 0xdb, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xdc */ { "NOP", 0xdc, 3, 4, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xdd */ { "???", 0xdd, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xde */ { "???", 0xde, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xdf */ { "BBS", 0xdf, 3, 5, 0, (void*) bbs5, LUA_NOREF, LUA_NOREF }, - /* 0xe0 */ { "???", 0xe0, 0, 0, 0, NULL }, - /* 0xe1 */ { "???", 0xe1, 0, 0, 0, NULL }, - /* 0xe2 */ { "NOP", 0xe2, 2, 2, 0, (void*) nop }, - /* 0xe3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0xe4 */ { "???", 0xe4, 0, 0, 0, NULL }, - /* 0xe5 */ { "???", 0xe5, 0, 0, 0, NULL }, - /* 0xe6 */ { "???", 0xe6, 0, 0, 0, NULL }, - /* 0xe7 */ { "SMB", 0xe7, 2, 5, 0, (void*) smb6 }, - /* 0xe8 */ { "???", 0xe8, 0, 0, 0, NULL }, - /* 0xe9 */ { "???", 0xe9, 0, 0, 0, NULL }, - /* 0xea */ { "???", 0xea, 0, 0, 0, NULL }, - /* 0xeb */ { "NOP", 0xeb, 1, 1, 0, (void*) nop }, - /* 0xec */ { "???", 0xec, 0, 0, 0, NULL }, - /* 0xed */ { "???", 0xed, 0, 0, 0, NULL }, - /* 0xee */ { "???", 0xee, 0, 0, 0, NULL }, - /* 0xef */ { "BBS", 0xef, 3, 5, 0, (void*) bbs6 }, + /* 0xe0 */ { "???", 0xe0, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xe1 */ { "???", 0xe1, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xe2 */ { "NOP", 0xe2, 2, 2, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xe3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xe4 */ { "???", 0xe4, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xe5 */ { "???", 0xe5, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xe6 */ { "???", 0xe6, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xe7 */ { "SMB", 0xe7, 2, 5, 0, (void*) smb6, LUA_NOREF, LUA_NOREF }, + /* 0xe8 */ { "???", 0xe8, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xe9 */ { "???", 0xe9, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xea */ { "???", 0xea, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xeb */ { "NOP", 0xeb, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xec */ { "???", 0xec, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xed */ { "???", 0xed, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xee */ { "???", 0xee, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xef */ { "BBS", 0xef, 3, 5, 0, (void*) bbs6, LUA_NOREF, LUA_NOREF }, - /* 0xf0 */ { "???", 0xf0, 0, 0, 0, NULL }, - /* 0xf1 */ { "???", 0xf1, 0, 0, 0, NULL }, - /* 0xf2 */ { "SBC", 0xf2, 2, 5, 0, (void*) sbc_ind }, - /* 0xf3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop }, - /* 0xf4 */ { "NOP", 0xf4, 2, 4, 0, (void*) nop }, - /* 0xf5 */ { "???", 0xf5, 0, 0, 0, NULL }, - /* 0xf6 */ { "???", 0xf6, 0, 0, 0, NULL }, - /* 0xf7 */ { "SMB", 0xf7, 2, 5, 0, (void*) smb7 }, - /* 0xf8 */ { "???", 0xf8, 0, 0, 0, NULL }, - /* 0xf9 */ { "???", 0xf9, 0, 0, 0, NULL }, - /* 0xfa */ { "PLX", 0xfa, 1, 4, 0, (void*) plx }, - /* 0xfb */ { "NOP", 0xfb, 1, 1, 0, (void*) nop }, - /* 0xfc */ { "NOP", 0xfc, 3, 4, 0, (void*) nop }, - /* 0xfd */ { "???", 0xfd, 0, 0, 0, NULL }, - /* 0xfe */ { "???", 0xfe, 0, 0, 0, NULL }, - /* 0xff */ { "BBS", 0xff, 3, 5, 0, (void*) bbs7 } + /* 0xf0 */ { "???", 0xf0, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xf1 */ { "???", 0xf1, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xf2 */ { "SBC", 0xf2, 2, 5, 0, (void*) sbc_ind, LUA_NOREF, LUA_NOREF }, + /* 0xf3 */ { "NOP", 0x03, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xf4 */ { "NOP", 0xf4, 2, 4, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xf5 */ { "???", 0xf5, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xf6 */ { "???", 0xf6, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xf7 */ { "SMB", 0xf7, 2, 5, 0, (void*) smb7, LUA_NOREF, LUA_NOREF }, + /* 0xf8 */ { "???", 0xf8, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xf9 */ { "???", 0xf9, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xfa */ { "PLX", 0xfa, 1, 4, 0, (void*) plx, LUA_NOREF, LUA_NOREF }, + /* 0xfb */ { "NOP", 0xfb, 1, 1, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xfc */ { "NOP", 0xfc, 3, 4, 0, (void*) nop, LUA_NOREF, LUA_NOREF }, + /* 0xfd */ { "???", 0xfd, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xfe */ { "???", 0xfe, 0, 0, 0, NULL, LUA_NOREF, LUA_NOREF }, + /* 0xff */ { "BBS", 0xff, 3, 5, 0, (void*) bbs7, LUA_NOREF, LUA_NOREF } }; diff --git a/src/ins.h b/src/ins.h index f8fcd7b..8c1baf3 100644 --- a/src/ins.h +++ b/src/ins.h @@ -26,12 +26,15 @@ #include struct cpu_instruction_t { - char *name; - uint8_t opcode; - uint8_t bytes; - uint8_t cycles; - int8_t stack; // How much stack does this instruction need. Negative means pull, positive push - void *handler; + char *name; + uint8_t opcode; + uint8_t bytes; + uint8_t cycles; + int8_t stack; // How much stack does this instruction need. Negative means pull, positive push + void *handler; + + int lua_before_handler; + int lua_after_handler; }; extern struct cpu_instruction_t instructions[256]; diff --git a/src/inverse.lua b/src/inverse.lua new file mode 100644 index 0000000..d109a37 --- /dev/null +++ b/src/inverse.lua @@ -0,0 +1,17 @@ + +-- +-- Intercept JSR COUT calls and turn A-Z into inverse. The key code is +-- in the accumulator so we can simply see if it is in the range we +-- are interested in and then shift it to the inverse character range. +-- + +JSR = 0x20 +COUT = 0xfded + +cpu.onBeforeExecuteInstruction(JSR, function(state, opcode, operand) + if operand == COUT then + if state.a >= 0xc1 and state.a <= 0xda then + state.a = state.a - 0xC0 + end + end +end) diff --git a/src/lua.c b/src/lua.c new file mode 100644 index 0000000..45ed841 --- /dev/null +++ b/src/lua.c @@ -0,0 +1,94 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 Stefan Arentz - http://github.com/st3fan/ewm +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include + +#include +#include +#include + +#include "lua.h" +#include "two.h" +#include "cpu.h" +#include "dsk.h" + +static int ewm_lua_init(struct ewm_lua_t *lua) { + memset(lua, 0x00, sizeof(struct ewm_lua_t)); + lua->state = luaL_newstate(); + luaL_openlibs(lua->state); + return 0; +} + +struct ewm_lua_t *ewm_lua_create() { + struct ewm_lua_t *lua = malloc(sizeof(struct ewm_lua_t)); + if (ewm_lua_init(lua) != 0) { + free(lua); + lua = NULL; + } + return lua; +} + +int ewm_lua_load_script(struct ewm_lua_t *lua, char *script_path) { + if (luaL_dofile(lua->state, script_path) != LUA_OK) { + printf("ewm: script error: %s\n", lua_tostring(lua->state, -1)); + return -1; + } + return 0; +} + +void ewm_lua_push_cpu(struct ewm_lua_t *lua, struct cpu_t *cpu) { + void *cpu_data = lua_newuserdata(lua->state, sizeof(struct cpu_t*)); + *((struct cpu_t**) cpu_data) = cpu; + luaL_getmetatable(lua->state, "cpu_meta_table"); + lua_setmetatable(lua->state, -2); +} + +void ewm_lua_push_two(struct ewm_lua_t *lua, struct ewm_two_t *two) { + void *two_data = lua_newuserdata(lua->state, sizeof(struct ewm_two_t*)); + *((struct ewm_two_t**) two_data) = two; + luaL_getmetatable(lua->state, "two_meta_table"); + lua_setmetatable(lua->state, -2); +} + +void ewm_lua_push_dsk(struct ewm_lua_t *lua, struct ewm_dsk_t *dsk) { + void *dsk_data = lua_newuserdata(lua->state, sizeof(struct ewm_dsk_t*)); + *((struct ewm_dsk_t**) dsk_data) = dsk; + luaL_getmetatable(lua->state, "dsk_meta_table"); + lua_setmetatable(lua->state, -2); +} + +void ewm_lua_register_component(struct ewm_lua_t *lua, char *name, luaL_Reg *functions) { + char table_name[64]; + strncpy(table_name, name, sizeof(table_name)-1); + strncat(table_name, "_meta_table", sizeof(table_name)-1); + + char global_name[64]; + strncpy(global_name, name, sizeof(global_name)-1); + for (size_t i = 0; i < strlen(global_name); i++) { + global_name[i] = toupper(global_name[i]); + } + + // Register the cpu meta table + luaL_newmetatable(lua->state, table_name); + luaL_setfuncs(lua->state, functions, 0); +} diff --git a/src/lua.h b/src/lua.h new file mode 100644 index 0000000..4cb8118 --- /dev/null +++ b/src/lua.h @@ -0,0 +1,47 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 Stefan Arentz - http://github.com/st3fan/ewm +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef LUA_H +#define LUA_H + +#include +#include +#include + +struct cpu_t; +struct ewm_two_t; +struct ewm_dsk_t; + +struct ewm_lua_t { + lua_State *state; +}; + +struct ewm_lua_t *ewm_lua_create(); +int ewm_lua_load_script(struct ewm_lua_t *lua, char *script_path); + +void ewm_lua_push_cpu(struct ewm_lua_t *lua, struct cpu_t *cpu); +void ewm_lua_push_two(struct ewm_lua_t *lua, struct ewm_two_t *two); +void ewm_lua_push_dsk(struct ewm_lua_t *lua, struct ewm_dsk_t *dsk); + +void ewm_lua_register_component(struct ewm_lua_t *lua, char *name, luaL_Reg *functions); + +#endif // LUA_H diff --git a/src/test.lua b/src/test.lua new file mode 100644 index 0000000..5988b61 --- /dev/null +++ b/src/test.lua @@ -0,0 +1,32 @@ +-- EWM Meets Lua + +cpu:onAfterExecuteInstruction(0xAD, function(cpu, opcode, operand) + if operand == 0xc000 and cpu.a == 0xd2 then + print(string.format("This is a %s", cpu.model)) + cpu:reset() + end +end) + +-- cpu.onBeforeExecuteInstruction(0x60, function(state, opcode, operand) +-- print(string.format('Before RTS from 0x%.4x', state.pc)) +-- end) + +-- cpu.onBeforeExecuteInstruction(0x20, function(state, opcode, operand) +-- print(string.format('Before JSR from 0x%.4x', state.pc)) +-- end) + +-- cpu.onBeforeExecuteInstruction(0xAD, function(state, opcode, operand) +-- print(string.format('Before LDA from 0x%.4x', state.pc)) +-- end) + +-- cpu.onAfterExecuteInstruction(0x60, function(state, opcode, operand) +-- print(string.format('After RTS from 0x%.4x', state.pc)) +-- end) + +-- cpu.onAfterExecuteInstruction(0x20, function(state, opcode, operand) +-- print(string.format('After JSR from 0x%.4x', state.pc)) +-- end) + +-- cpu.onAfterExecuteInstruction(0xAD, function(state, opcode, operand) +-- print(string.format('After LDA from 0x%.4x', state.pc)) +-- end) diff --git a/src/two.c b/src/two.c index fd3e888..9c9dfc3 100644 --- a/src/two.c +++ b/src/two.c @@ -34,9 +34,9 @@ #include "alc.h" #include "chr.h" #include "scr.h" +#include "lua.h" #include "two.h" - #define EWM_A2P_SS_KBD 0xc000 #define EWM_A2P_SS_KBDSTRB 0xc010 #define EWM_A2P_SS_SPKR 0xc030 @@ -347,15 +347,32 @@ struct ewm_two_t *ewm_two_create(int type, SDL_Renderer *renderer, SDL_Joystick } void ewm_two_destroy(struct ewm_two_t *two) { - // TODO + // TODO Or maybe not. } +// Lua support + +int ewm_two_luaopen(lua_State *state) { + luaL_Reg ewm_two_functions[] = { + // TODO What module level functions do we need here? + {NULL, NULL} + }; + luaL_newlib(state, ewm_two_functions); + return 1; +} + +int ewm_two_init_lua(struct ewm_two_t *two, struct ewm_lua_t *lua) { + two->lua = lua; + luaL_requiref(two->lua->state, "two", ewm_two_luaopen, 0); + return 0; +} + +// External API + int ewm_two_load_disk(struct ewm_two_t *two, int drive, char *path) { return ewm_dsk_set_disk_file(two->dsk, drive, false, path); } - - static bool ewm_two_poll_event(struct ewm_two_t *two, SDL_Window *window) { // TODO Should window be part of ewm_two_t? SDL_Event event; while (SDL_PollEvent(&event) != 0) { @@ -537,6 +554,7 @@ static void ewm_two_update_status_bar(struct ewm_two_t *two, double mhz) { #define EWM_TWO_OPT_TRACE (6) #define EWM_TWO_OPT_STRICT (7) #define EWM_TWO_OPT_DEBUG (8) +#define EWM_TWO_OPT_SCRIPT (9) static struct option one_options[] = { { "help", no_argument, NULL, EWM_TWO_OPT_HELP }, @@ -548,6 +566,7 @@ static struct option one_options[] = { { "trace", optional_argument, NULL, EWM_TWO_OPT_TRACE }, { "strict", no_argument, NULL, EWM_TWO_OPT_STRICT }, { "debug", no_argument, NULL, EWM_TWO_OPT_DEBUG }, + { "script", required_argument, NULL, EWM_TWO_OPT_SCRIPT }, { NULL, 0, NULL, 0 } }; @@ -561,6 +580,7 @@ static void usage() { fprintf(stderr, " --trace trace cpu to file\n"); fprintf(stderr, " --strict run emulator in strict mode\n"); fprintf(stderr, " --debug print debug info\n"); + fprintf(stderr, " --script