summaryrefslogtreecommitdiff
path: root/6502
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-07-10 14:48:59 -0400
committerLLLL Colonq <llll@colonq>2026-07-10 14:48:59 -0400
commitb6f00172b4e7045a14cebba0a7d4011528a28741 (patch)
tree0e5d90ea1bb56085f6b773d54f2f8fdbd90538e9 /6502
parent9ba3ccd51d94e2db6920351eccb9050d1a2c41e1 (diff)
6502: More Lua bindings
Diffstat (limited to '6502')
-rw-r--r--6502/include/lcq/6502.h2
-rw-r--r--6502/src/6502.c2
-rw-r--r--6502/src/test.c24
-rw-r--r--6502/test/test.fnl45
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))
+ ))