summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm.myr30
1 files changed, 21 insertions, 9 deletions
diff --git a/asm.myr b/asm.myr
index 5206f86..dcacbda 100644
--- a/asm.myr
+++ b/asm.myr
@@ -71,14 +71,23 @@ const emitinstr = {p
-> `std.Ok((b, mark))
}
+const die_emit = {msg, lc
+ std.die(std.fmt("{} on line {}\n", msg, lc))
+}
+
+const die_rewrite = {l, lc
+ const s = "ref to undefined label '{}' on line {}\n"
+ std.die(std.fmt(s, l, lc))
+}
+
const main = {
var fd = bio.mkfile(std.In, bio.Rd)
var src = bio.byline(fd)
var lc = 0
var offset = 0
- var queue = [][:]
var buf = [][:]
+ var q = [][:]
var labels = std.mkht()
var res
@@ -90,14 +99,16 @@ const main = {
;;
match res
- | `std.Err(msg): std.die(std.fmt("{} on line {}\n", msg, lc))
+ | `std.Err(msg): die_emit(msg, lc)
| `std.Ok((bytes, marker)):
match marker
- | `std.Some(label): queue = std.slpush(&queue, (label, offset, lc))
+ | `std.Some(label):
+ q = std.slpush(&q, (label, offset, lc))
| `std.None:
;;
match bytes
- | `std.Some(arr): buf = std.sljoin(&buf, arr[:])
+ | `std.Some(arr):
+ buf = std.sljoin(&buf, arr[:])
offset += 2
| `std.None:
;;
@@ -106,12 +117,13 @@ const main = {
lc++
;;
- for replacement : queue ;
- match replacement
- | (l, buf_pos, src_pos):
+ for p : q ;
+ match p
+ | (l, buf_pos, linum):
match std.htget(labels, l)
- | `std.None: std.die(std.fmt("reference to undefined label '{}' on line {}\n", l, src_pos))
- | `std.Some(addr): buf[buf_pos] |= addr & 0x0f00
+ | `std.None: die_rewrite(l, linum)
+ | `std.Some(addr):
+ buf[buf_pos] |= addr & 0x0f00
buf[buf_pos + 1] |= addr & 0xff
;;
;;