summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-03-06 22:16:26 +0100
committerandromeda <andromeda@lenovo>2026-03-06 22:16:26 +0100
commit00be2cc5452bbe3518fad9f3d652b9111ba137ad (patch)
tree6b7f175f1f33563268aa6ae954b00ce87cd33c2c
parente5c715d54fc0c970b3a7a9ddb6648d5e32edd805 (diff)
reformat, add copy_token and test, fix bug
-rw-r--r--twasm/asm/main.asm120
-rw-r--r--twasm/package.nix1
2 files changed, 91 insertions, 30 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm
index 4cd4e1f..b570cf2 100644
--- a/twasm/asm/main.asm
+++ b/twasm/asm/main.asm
@@ -15,38 +15,49 @@ OUTPUT_SIZE equ 0x1000 ; max length of outputed binary
start:
mov rsi, msg_welcome
call print
-
+
call run_tests
jmp halt
-;
+; ------------------------------------------------------------------------------
; tokenising
-;
+; ------------------------------------------------------------------------------
+; ------------------------------------------------------------------------------
; copy_token
;
; description:
; copies a token from one spot in memory to another
-; and returns metadata about that token
;
; parameters:
-; rdi -> start of asm command to be read
+; rdi -> start of buffer to be read
; rsi -> start of buffer to be written
;
; returned:
+; rax -> last byte read
+; rdx -> last byte written
+; ------------------------------------------------------------------------------
+
copy_token:
- mov rax, rdi
.loop:
+ mov al, [rdi] ; check if next char is a space
cmp al, " "
- je .continue
- jne .break
- .continue:
- call copy_byte
+ je .break
+
+ call copy_byte ; copy the next byte if not
+
+ inc rdi ; increment read- and write-pointers
+ inc rsi
+ jmp .loop ; and loop again
+
.break:
- inc rax
- ret
+ mov rax, rdi ; return values
+ mov rdx, rsi
+ ret
+ .msg db "yo loop copy_token", 0x0D, 0x0A, 0x00
+; ------------------------------------------------------------------------------
; copy_byte
;
; description:
@@ -57,16 +68,20 @@ copy_token:
; rsi -> word to be written
;
; returned:
-; al = byte that was read
+; rax = byte that was read
+; ------------------------------------------------------------------------------
+
copy_byte:
+ xor rax, rax ; zero out so it returns fine
mov al, [rdi]
mov [rsi], al
ret
-;
+; ------------------------------------------------------------------------------
; utilities
-;
+; ------------------------------------------------------------------------------
+; ------------------------------------------------------------------------------
; print
;
; description:
@@ -74,8 +89,11 @@ copy_byte:
;
; parameters:
; rsi -> start of null-terminated string
-; dx = port to output to
+; ------------------------------------------------------------------------------
+
print:
+ push rdx
+ mov rdx, 0x3F8
.loop:
mov al, [rsi]
test al, al
@@ -84,47 +102,50 @@ print:
inc rsi
jmp .loop
.done:
+ pop rdx
ret
+; ------------------------------------------------------------------------------
; halt
;
; description:
; halts the program, silly :)
+; ------------------------------------------------------------------------------
+
halt:
mov rsi, msg_halt
call print
hlt
jmp halt
-;
+; ------------------------------------------------------------------------------
; tests
-;
+; ------------------------------------------------------------------------------
+; ------------------------------------------------------------------------------
; run_tests
;
; description:
; runs all tests
-;
-; parameters:
-; dx = port to output to
+; ------------------------------------------------------------------------------
+
run_tests:
mov rsi, .msg
call print
call test_copy_byte
+ call test_copy_token
ret
.msg db "running test suite...", 0x0D, 0x0A, 0x00
+; ------------------------------------------------------------------------------
; test_copy_byte
;
; description:
-; makes sure copy_byte function works by testing the following
-; - that it copies one byte to a specified memory address
-; - that it returns the copied byte in al
-;
-; parameters:
-; dx = port to output to
+; tests copy_byte's described functionality
+; ------------------------------------------------------------------------------
+
test_copy_byte:
mov rsi, .msg
call print
@@ -134,9 +155,12 @@ test_copy_byte:
call copy_byte
mov cx, [rsi]
+ and ax, 0xFF ; only compare bottom byte
+ and cx, 0xFF
cmp ax, cx ; compare returned byte to copied byte
jne .fail
- je .pass
+ cmp al, [test_byte] ; compare returned byte to expected byte
+ jne .fail
.pass:
mov rsi, msg_pass
@@ -148,9 +172,45 @@ test_copy_byte:
ret
.msg db "test_copy_byte...", 0x00
+; ------------------------------------------------------------------------------
+; test_copy_token
;
+; description:
+; tests copy_token described functionality
+; ------------------------------------------------------------------------------
+
+test_copy_token:
+ mov rsi, .msg
+ call print
+
+ mov rdi, test_token ; read buffer
+ mov rsi, TEST_ARENA_ADDR ; write buffer
+ call copy_token
+
+ ; check reported final indicies with the expected final indicies
+ cmp rax, test_token + 8 ; last byte read
+ jne .fail
+ cmp rdx, TEST_ARENA_ADDR + 8 ; last byte written
+ jne .fail
+
+ mov rsi, TEST_ARENA_ADDR
+ mov rcx, [rsi]
+ cmp rcx, [test_token] ; compare copied token to expected token
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_copy_token...", 0x00
+
+; ------------------------------------------------------------------------------
; data
-;
+; ------------------------------------------------------------------------------
msg_welcome db "Welcome to Twasm", 0x0D, 0x0A, 0x00
msg_halt db "halted.", 0x0D, 0x0A, 0x00
@@ -158,4 +218,4 @@ msg_pass db "passed.", 0x0D, 0x0A, 0x00
msg_fail db "failed.", 0x0D, 0x0A, 0x00
test_byte db "T"
-test_token db "Test Token" ; two tokens, one followed by a space and one by nothing
+test_token db "TestTokn " ; followed by space. Quad word
diff --git a/twasm/package.nix b/twasm/package.nix
index f621780..b435ebb 100644
--- a/twasm/package.nix
+++ b/twasm/package.nix
@@ -28,6 +28,7 @@ stdenv.mkDerivation {
${qemu}/bin/qemu-system-x86_64 \
-nographic \
+ -s \
-drive file=./.bootle/disk,format=raw,index=0,media=disk
rm ./.bootle -r