diff options
| -rw-r--r-- | 6502/include/lcq/6502.h | 2 | ||||
| -rw-r--r-- | 6502/src/6502.c | 2 | ||||
| -rw-r--r-- | 6502/src/test.c | 24 | ||||
| -rw-r--r-- | 6502/test/test.fnl | 45 |
4 files changed, 59 insertions, 14 deletions
diff --git a/6502/include/lcq/6502.h b/6502/include/lcq/6502.h index 4d20e26..3d10301 100644 --- a/6502/include/lcq/6502.h +++ b/6502/include/lcq/6502.h @@ -33,7 +33,7 @@ void l6502_mem_basic_new(l6502_mem *m); typedef struct { u16 pc; - l6502_reg regs[L6502_REG__MARKER]; + u8 regs[L6502_REG__MARKER]; l6502_mem mem; } l6502_emu; diff --git a/6502/src/6502.c b/6502/src/6502.c index add78a0..54013ae 100644 --- a/6502/src/6502.c +++ b/6502/src/6502.c @@ -63,7 +63,7 @@ void l6502_emulate(l6502_emu *e) { case BRK: l6502_push_addr(e, e->pc); l6502_push(e, e->regs[L6502_REG_FLAGS]); - e->pc = l6502_read_addr(e, 0xfffe); + e->pc = l6502_read_addr(e, 0xfffe) - 1; l6502_flag_set(e, L6502_FLAG_BREAK_COMMAND, true); break; case PHP: l6502_push(e, e->regs[L6502_REG_FLAGS]); break; diff --git a/6502/src/test.c b/6502/src/test.c index 1b4e241..1497df6 100644 --- a/6502/src/test.c +++ b/6502/src/test.c @@ -58,14 +58,14 @@ int emu_get_flag(lua_State *l); int emu_get_flag(lua_State *l) { l6502_emu *e = get_emu(l); l6502_flag f = lua_tointeger(l, 2); - lua_pushinteger(l, l6502_flag_get(e, f)); + lua_pushboolean(l, l6502_flag_get(e, f)); return 1; } int emu_set_flag(lua_State *l); int emu_set_flag(lua_State *l) { l6502_emu *e = get_emu(l); l6502_flag f = lua_tointeger(l, 2); - u8 v = (u8) lua_tointeger(l, 3); + bool v = lua_toboolean(l, 3); l6502_flag_set(e, f, v); lua_pushvalue(l, 1); return 1; @@ -86,6 +86,24 @@ int emu_set_pc(lua_State *l) { return 1; } +int emu_read(lua_State *l); +int emu_read(lua_State *l) { + l6502_emu *e = get_emu(l); + u16 addr = (u16) lua_tointeger(l, 2); + lua_pushinteger(l, l6502_read(e, addr)); + return 1; +} + +int emu_write(lua_State *l); +int emu_write(lua_State *l) { + l6502_emu *e = get_emu(l); + u16 addr = (u16) lua_tointeger(l, 2); + u8 v = (u8) lua_tointeger(l, 3); + l6502_write(e, addr, v); + lua_pushvalue(l, 1); + return 1; +} + int emu_emulate(lua_State *l); int emu_emulate(lua_State *l) { l6502_emu *e = get_emu(l); @@ -106,6 +124,8 @@ int new(lua_State *l) { lua_pushcfunction(l, emu_set_flag); lua_setfield(l, -2, "set-flag"); lua_pushcfunction(l, emu_get_pc); lua_setfield(l, -2, "pc"); lua_pushcfunction(l, emu_set_pc); lua_setfield(l, -2, "set-pc"); + lua_pushcfunction(l, emu_read); lua_setfield(l, -2, "read"); + lua_pushcfunction(l, emu_write); lua_setfield(l, -2, "write"); lua_pushcfunction(l, emu_emulate); lua_setfield(l, -2, "emulate"); lua_setfield(l, -2, "__index"); lua_setmetatable(l, -2); diff --git a/6502/test/test.fnl b/6502/test/test.fnl index 11c4f9a..f99a0d6 100644 --- a/6502/test/test.fnl +++ b/6502/test/test.fnl @@ -6,15 +6,40 @@ (let [f (io.open path)] (f:read "*all"))) -(local emu (l6502.new)) -(print (emu:set-pc 42)) -(print (emu:set-reg l6502.reg.SP 10)) -(print (emu:set-reg l6502.reg.A 255)) -(emu:emulate) -(print (inspect (emu:summary))) +(fn must-match [fnm a e] + (if (= a e) true + (io.stderr:write (.. "\n -> in field " fnm ", expected " (tostring e) " but found " (tostring a) "\n")) + (os.exit 1))) -;; (local testcases (json.decode (slurp "testcases/6502/v1/00.json"))) -;; (each [_ test (ipairs testcases)] -;; (l6502.run test.name)) +(fn u8-flag? [v f] (not (= (band v f) 0))) -;; (print (inspect )) +(fn run-test [e tc] + (io.stderr:write (.. "running test: " tc.name "...")) + (let [i tc.initial] + (e:set-pc i.pc) + (e:set-reg l6502.reg.SP i.s) + (e:set-reg l6502.reg.A i.a) + (e:set-reg l6502.reg.X i.x) + (e:set-reg l6502.reg.Y i.y) + (e:set-reg l6502.reg.FLAGS i.p) + (each [_ [addr v] (ipairs i.ram)] + (e:write addr v))) + (e:emulate) + (let [f tc.final] + (must-match :pc (e:pc) f.pc) + (must-match :sp (e:reg l6502.reg.SP) f.s) + (must-match :a (e:reg l6502.reg.A) f.a) + (must-match :x (e:reg l6502.reg.X) f.x) + (must-match :y (e:reg l6502.reg.Y) f.y)) + (io.stderr:write " done\n") + ) + +(fn run-tests-file [e p] + (let [tcs (json.decode (slurp p))] + (each [_ tc (ipairs tcs)] + (run-test e tc)))) + +(let [e (l6502.new)] + (for [i 0x00 0xff] + (run-tests-file e (string.format "testcases/6502/v1/%02x.json" i)) + )) |
