summaryrefslogtreecommitdiff
path: root/asm.myr
diff options
context:
space:
mode:
authorJakob L. Kreuze <zerodaysfordays@sdf.lonestar.org>2019-12-27 17:50:36 -0500
committerJakob L. Kreuze <zerodaysfordays@sdf.lonestar.org>2019-12-27 17:50:36 -0500
commitd935d45514eafe7809f5105516b9953e68772f03 (patch)
tree908aff36fa1a1066929c3708803820a6e31fad53 /asm.myr
parente3feedee60a3b1b5177c8e0576f307a2f473a589 (diff)
Implement remaining instructions.
Diffstat (limited to 'asm.myr')
-rw-r--r--asm.myr77
1 files changed, 77 insertions, 0 deletions
diff --git a/asm.myr b/asm.myr
index 9dcde13..52e7bc4 100644
--- a/asm.myr
+++ b/asm.myr
@@ -65,6 +65,11 @@ const parselit = {s
|`std.Some(n): -> `Register(n)
|`std.None: -> `Invalid
;;
+ elif std.isdigit((s[0] : char))
+ match std.intparsebase((s : byte[:]), 10)
+ |`std.Some(n): -> `Number(n)
+ |`std.None: -> `Label(s)
+ ;;
elif s[0] == ('[' : byte)
-> `DerefAddr
elif s[0] == ('K' : byte)
@@ -230,6 +235,78 @@ const emitinstr = {p
| _:
-> `std.Err(std.fmt("invalid argument to SUBN: {}", p[1]))
;;
+ | "OR":
+ if p.len < 3
+ -> `std.Err("OR missing arguments")
+ ;;
+ match (parselit(p[1]), parselit(p[2]))
+ | (`Register(m), `Register(n)): b = `std.Some([0x80 | (m & 0x0f), ((n & 0x0f) << 1) | 0x01])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to OR: {}", p[1]))
+ ;;
+ | "AND":
+ if p.len < 3
+ -> `std.Err("AND missing arguments")
+ ;;
+ match (parselit(p[1]), parselit(p[2]))
+ | (`Register(m), `Register(n)): b = `std.Some([0x80 | (m & 0x0f), ((n & 0x0f) << 1) | 0x02])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to AND: {}", p[1]))
+ ;;
+ | "XOR":
+ if p.len < 3
+ -> `std.Err("XOR missing arguments")
+ ;;
+ match (parselit(p[1]), parselit(p[2]))
+ | (`Register(m), `Register(n)): b = `std.Some([0x80 | (m & 0x0f), ((n & 0x0f) << 1) | 0x03])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to XOR: {}", p[1]))
+ ;;
+ | "SHR":
+ if p.len < 2
+ -> `std.Err("SHR missing arguments")
+ ;;
+ match parselit(p[1])
+ | `Register(n): `std.Some([0x80 | (n & 0x0f), 0x06])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to SHR: {}", p[1]))
+ ;;
+ | "SHL":
+ if p.len < 2
+ -> `std.Err("SHL missing arguments")
+ ;;
+ match parselit(p[1])
+ | `Register(n): `std.Some([0x80 | (n & 0x0f), 0x0e])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to SHL: {}", p[1]))
+ ;;
+ | "BCD":
+ if p.len < 2
+ -> `std.Err("BCD missing arguments")
+ ;;
+ match parselit(p[1])
+ | `Register(n): `std.Some([0xf0 | (n & 0x0f), 0x33])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to BCD: {}", p[1]))
+ ;;
+ | "RND":
+ if p.len < 3
+ -> `std.Err("RND missing arguments")
+ ;;
+ match (parselit(p[1]), parselit(p[2]))
+ | (`Register(m), `Number(n)): b = `std.Some([0xc0 | (m & 0x0f), n & 0xff])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to RND: {}", p[1]))
+ ;;
+ | "DRW":
+ if p.len < 4
+ -> `std.Err("DRW missing arguments")
+ ;;
+ match (parselit(p[1]), parselit(p[2]), parselit(p[3]))
+ | (`Register(m), `Register(n), `Number(q)): b = `std.Some([0xc0 | (m & 0x0f), (n & 0x0f) << 1 | (q & 0x0f)])
+ | _:
+ -> `std.Err(std.fmt("invalid argument to DRW: {}", p[1]))
+ ;;
| _:
-> `std.Err(std.fmt("unrecognized instruction {}", p[0]))
;;