diff options
Diffstat (limited to 'twasm/asm/main.asm')
| -rw-r--r-- | twasm/asm/main.asm | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm new file mode 100644 index 0000000..4cd4e1f --- /dev/null +++ b/twasm/asm/main.asm @@ -0,0 +1,161 @@ +LOAD_ADDR equ 0x00010000 ; address this program is loaded at + +TOKEN_TABLE_ADDR equ 0x00060000 ; address the token table is loaded at +TOKEN_TABLE_SIZE equ 0x1000 ; max length of table + +TEST_ARENA_ADDR equ 0x00060000 ; address to run tests at +TEST_ARENA_SIZE equ 0x1000 ; maximum size tests can use + +OUTPUT_ADDR equ 0x00070000 ; address of outputed binary +OUTPUT_SIZE equ 0x1000 ; max length of outputed binary + +[bits 64] +[org LOAD_ADDR] + +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 +; rsi -> start of buffer to be written +; +; returned: +copy_token: + mov rax, rdi + .loop: + cmp al, " " + je .continue + jne .break + .continue: + call copy_byte + .break: + inc rax + ret + +; copy_byte +; +; description: +; copies a byte from one spot in memory to another +; +; parameters: +; rdi -> word to be read +; rsi -> word to be written +; +; returned: +; al = byte that was read +copy_byte: + mov al, [rdi] + mov [rsi], al + ret + +; +; utilities +; + +; print +; +; description: +; prints a null-terminated string +; +; parameters: +; rsi -> start of null-terminated string +; dx = port to output to +print: + .loop: + mov al, [rsi] + test al, al + jz .done + out dx, al + inc rsi + jmp .loop + .done: + 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 + + 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 +test_copy_byte: + mov rsi, .msg + call print + + mov rdi, test_byte ; byte to be copied + mov rsi, TEST_ARENA_ADDR ; location of test + call copy_byte + + mov cx, [rsi] + cmp ax, cx ; compare returned byte to copied byte + jne .fail + je .pass + + .pass: + mov rsi, msg_pass + call print + ret + .fail: + mov rsi, msg_fail + call print + ret + .msg db "test_copy_byte...", 0x00 + +; +; data +; + +msg_welcome db "Welcome to Twasm", 0x0D, 0x0A, 0x00 +msg_halt db "halted.", 0x0D, 0x0A, 0x00 +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 |
