From 00be2cc5452bbe3518fad9f3d652b9111ba137ad Mon Sep 17 00:00:00 2001 From: andromeda Date: Fri, 6 Mar 2026 22:16:26 +0100 Subject: [PATCH] reformat, add copy_token and test, fix bug --- twasm/asm/main.asm | 120 +++++++++++++++++++++++++++++++++------------ twasm/package.nix | 1 + 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