From d935d45514eafe7809f5105516b9953e68772f03 Mon Sep 17 00:00:00 2001 From: "Jakob L. Kreuze" Date: Fri, 27 Dec 2019 17:50:36 -0500 Subject: Implement remaining instructions. --- asm.myr | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) 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])) ;; -- cgit v1.3