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