summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-03-15 22:02:36 +0100
committerandromeda <andromeda@lenovo>2026-03-15 22:02:36 +0100
commit0160d2e127f506bb36625861e2dd91e009583e24 (patch)
treebb31b2221b61a884ffaecc4141c1c05d6d6dd227
parentc05adee382fec7b28a971cc6460d81e486bd3684 (diff)
add binary
-rw-r--r--twasm/asm/main.asm29
-rw-r--r--twasm/asm/tests.asm16
2 files changed, 42 insertions, 3 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm
index 069e3f3..c792eb9 100644
--- a/twasm/asm/main.asm
+++ b/twasm/asm/main.asm
@@ -730,7 +730,8 @@ tokenise:
; | type | p. | description |
; |------|----|--------------|
; | 0x00 | 0x | hexidecimal |
-; | 0x01 | 0b | octal |
+; | 0x01 | 0q | octal |
+; | 0x02 | 0b | binary |
; | 0xFF | | unrecognised |
;
; where `p.` is the prefix
@@ -774,6 +775,13 @@ evaluate_constant:
je .oct_loop
pop rcx
+ ; binary case
+ mov rcx, 0x02
+ push rcx
+ cmp dl, 'b'
+ je .bin_loop
+ pop rcx
+
jmp .unrecognised
.hex_loop:
@@ -822,6 +830,25 @@ evaluate_constant:
inc rdi ; point to next byte
jmp .oct_loop ; and loop
+ .bin_loop:
+ cmp rsi, 0 ; range check
+ je .break
+
+ shl rax, 1
+
+ mov dl, [rdi]
+
+ sub dl, '0'
+ cmp dl, 1
+ jg .unrecognised
+
+ and dl, 1 ; mask
+ or al, dl ; and newest bit
+
+ dec rsi
+ inc rdi
+ jmp .bin_loop
+
.break:
pop rdx
ret
diff --git a/twasm/asm/tests.asm b/twasm/asm/tests.asm
index 10c80ad..bc2ad84 100644
--- a/twasm/asm/tests.asm
+++ b/twasm/asm/tests.asm
@@ -341,7 +341,7 @@ test_evaluate_constant:
cmp rdx, 0x00
jne .fail
- ; PI
+ ; PI x
mov rdi, .case3h ; addr of constant
mov rsi, 18 ; length of constant
call evaluate_constant
@@ -350,7 +350,7 @@ test_evaluate_constant:
cmp rdx, 0x00
jne .fail
- ; PI
+ ; PI q
mov rdi, .case0q
mov rsi, 16
call evaluate_constant
@@ -359,6 +359,15 @@ test_evaluate_constant:
cmp rdx, 0x01
jne .fail
+ ; PI b
+ mov rdi, .case0b
+ mov rsi, 66
+ call evaluate_constant
+ cmp rax, [.case0b_solution]
+ jne .fail
+ cmp rdx, 0x02
+ jne .fail
+
.pass:
mov rsi, msg_pass
call print
@@ -380,6 +389,9 @@ test_evaluate_constant:
.case0q db "0q31103755242102"
.case0q_solution dq 0q31103755242102
+ .case0b db "0b0110011001101001011100100111001101110100001000000011011000110100"
+ .case0b_solution dq 0b0110011001101001011100100111001101110100001000000011011000110100
+
msg_pass:
db 0x0A
times (TEST_LINE_LENGTH + .start - .end) db " ", ; right align