summaryrefslogtreecommitdiff
path: root/twasm/asm
diff options
context:
space:
mode:
Diffstat (limited to 'twasm/asm')
-rw-r--r--twasm/asm/main.asm161
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