From 0160d2e127f506bb36625861e2dd91e009583e24 Mon Sep 17 00:00:00 2001 From: andromeda Date: Sun, 15 Mar 2026 22:02:36 +0100 Subject: [PATCH] add binary --- twasm/asm/main.asm | 29 ++++++++++++++++++++++++++++- twasm/asm/tests.asm | 16 ++++++++++++++-- 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