summaryrefslogtreecommitdiff
path: root/static/20240817-aarch64-bootstrapping-1/hex.s
diff options
context:
space:
mode:
Diffstat (limited to 'static/20240817-aarch64-bootstrapping-1/hex.s')
-rw-r--r--static/20240817-aarch64-bootstrapping-1/hex.s95
1 files changed, 95 insertions, 0 deletions
diff --git a/static/20240817-aarch64-bootstrapping-1/hex.s b/static/20240817-aarch64-bootstrapping-1/hex.s
new file mode 100644
index 0000000..b120014
--- /dev/null
+++ b/static/20240817-aarch64-bootstrapping-1/hex.s
@@ -0,0 +1,95 @@
+.section .data
+buf:
+ .byte 0 // input/output character buffer
+
+.section .text
+.global _start
+_start:
+ mov x19, #0 // value
+ mov x20, #0 // count
+
+loop:
+ mov x8, #63 // read
+ mov x0, #0 // stdin
+ adr x1, buf
+ mov x2, #1
+ svc 0
+
+ cmp x0, #0 // count of bytes read; 0 means EOF
+ b.ne 1f
+
+exit:
+ mov x8, #93 // exit
+ mov x0, #0 // error code (no error)
+ svc 0
+
+1:
+ adr x1, buf
+ ldurb w9, [x1]
+
+ cmp w9, #92 // backslash; start of comment
+ b.ne 2f
+
+comment:
+ mov x8, #63 // read
+ mov x0, #0 // stdin
+ adr x1, buf
+ mov x2, #1
+ svc 0
+
+ cmp x0, #0
+ b.eq exit
+
+ adr x1, buf
+ ldurb w9, [x1]
+ cmp w9, '\n'
+ b.ne comment
+ b loop
+
+2:
+ cmp w9, '0'
+ b.lt 3f
+ cmp w9, '9'
+ b.gt 3f
+
+ sub w9, w9, '0'
+ b 4f
+
+3:
+ cmp w9, 'a'
+ b.lt 5f
+ cmp w9, 'f'
+ b.gt 5f
+
+ sub w9, w9, ('a' - 10)
+ b 4f
+
+4:
+ lsl x19, x19, #4
+ add x19, x19, w9, uxtb
+ add x20, x20, #1
+ b loop
+
+5:
+ cmp w9, ' '
+ b.ne loop
+
+ tst x20, #1
+ cinc x20, x20, ne
+ lsr x20, x20, #1
+
+6:
+ cmp x20, #0
+ b.eq loop
+
+ mov x8, #64 // write
+ mov x0, #1 // stdout
+ adr x1, buf
+ sturb w19, [x1]
+ mov x2, #1
+ svc 0
+
+ lsr x19, x19, #8
+
+ sub x20, x20, #1
+ b 6b