Files
bootler/twasm/asm/tests.asm

615 lines
13 KiB
NASM

; ------------------------------------------------------------------------------
; tests
; ------------------------------------------------------------------------------
; ------------------------------------------------------------------------------
; run_tests
;
; description:
; runs all tests
; ------------------------------------------------------------------------------
run_tests:
mov rsi, .msg
call print
call clear_test_arena
call test_copy_byte
call clear_test_arena
call test_copy_token
call clear_test_arena
call test_elemb
call clear_test_arena
call test_identify_token
call clear_test_arena
call test_identify_next_token
call clear_test_arena
call test_get_tte_type
call clear_test_arena
call test_get_tte_typed_metadata
call clear_test_arena
call test_get_direct_addressing_ModRM
call clear_test_arena
call test_get_opcode
call clear_test_arena
call test_get_reg_bits
ret
.msg db "running test suite...", 0x0A, 0x00
; ------------------------------------------------------------------------------
; test_copy_byte
;
; description:
; tests copy_byte described functionality
; ------------------------------------------------------------------------------
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]
and ax, 0xFF ; only compare bottom byte
and cx, 0xFF
cmp ax, cx ; compare returned byte to copied byte
jne .fail
cmp al, [test_byte] ; compare returned byte to expected byte
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_copy_byte...", 0x00
; ------------------------------------------------------------------------------
; test_copy_token
;
; description:
; tests copy_token described functionality
; ------------------------------------------------------------------------------
test_copy_token:
mov rsi, .msg
call print
; test case: space terminated
mov rdi, test_token_space ; 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_space + 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_space] ; check if copied token matches expected token
jne .fail ; if not, fail
; test case: null terminated
mov rdi, test_token_null ; 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_null + 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_null] ; check if copied token matches expected token
jne .fail ; if not, fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_copy_token...", 0x00
; ------------------------------------------------------------------------------
; test_elemb
;
; description:
; tests elemb described functionality
; ------------------------------------------------------------------------------
test_elemb:
mov rsi, .msg
call print
; [0]
mov rdi, 5
mov rsi, test_elemb_5
mov dl, [test_elemb_5]
call elemb
cmp al, 1
jne .fail
; [n - 1]
mov rdi, 5
mov rsi, test_elemb_5
mov dl, [test_elemb_5 + 4]
call elemb
cmp al, 1
jne .fail
; [1]
mov rdi, 5
mov rsi, test_elemb_5
mov dl, [test_elemb_5 + 1]
call elemb
cmp al, 1
jne .fail
; not present
mov rdi, 5
mov rsi, test_elemb_5
mov dl, 0xDA
call elemb
cmp al, 0
jne .fail
; 0 length list
mov rdi, 0
mov rsi, test_elemb_0
mov dl, 0x34
call elemb
cmp al, 0
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_elemb...", 0x00
; ------------------------------------------------------------------------------
; test_identify_token
;
; description:
; tests identify_token described functionality
; ------------------------------------------------------------------------------
test_identify_token:
mov rsi, .msg
call print
; length1 token that exists
mov byte [TEST_ARENA_ADDR], "*"
mov rdi, TEST_ARENA_ADDR
mov rsi, 1
call identify_token
cmp ax, 0x0064
jne .fail
; length1 token that doesn't exist
mov byte [TEST_ARENA_ADDR], " "
mov rdi, TEST_ARENA_ADDR
mov rsi, 1
call identify_token
cmp ax, 0xFFFF
jne .fail
; length2 token that exists
mov word [TEST_ARENA_ADDR], "sp"
mov rdi, TEST_ARENA_ADDR
mov rsi, 2
call identify_token
cmp ax, 0x0026
jne .fail
; length2 token that doesn't exist
mov word [TEST_ARENA_ADDR], "QQ"
mov rdi, TEST_ARENA_ADDR
mov rsi, 2
call identify_token
cmp ax, 0xFFFF
jne .fail
; length3 token that exists
mov dword [TEST_ARENA_ADDR], "rax"
mov rdi, TEST_ARENA_ADDR
mov rsi, 3
call identify_token
cmp ax, 0x0000
jne .fail
; length3 token that exists
mov dword [TEST_ARENA_ADDR], "cr0"
mov rdi, TEST_ARENA_ADDR
mov rsi, 3
call identify_token
cmp ax, 0x004A
jne .fail
; length3 token that doesn't exist
mov dword [TEST_ARENA_ADDR], "r16"
mov rdi, TEST_ARENA_ADDR
mov rsi, 3
call identify_token
cmp ax, 0xFFFF
jne .fail
; length4 token that exists
mov dword [TEST_ARENA_ADDR], "r10d"
mov rdi, TEST_ARENA_ADDR
mov rsi, 4
call identify_token
cmp ax, 0x001A
jne .fail
; length4 token that exists
mov dword [TEST_ARENA_ADDR], "r15b"
mov rdi, TEST_ARENA_ADDR
mov rsi, 4
call identify_token
cmp ax, 0x003F
jne .fail
; length4 token that doesn't exist
mov dword [TEST_ARENA_ADDR], "r15q"
mov rdi, TEST_ARENA_ADDR
mov rsi, 4
call identify_token
cmp ax, 0xFFFF
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_identify_token...", 0x00
; ------------------------------------------------------------------------------
; test_identify_next_token
;
; description:
; tests identify_next_token described functionality
; ------------------------------------------------------------------------------
test_identify_next_token:
mov rsi, .msg
call print
; length1 token that exists
mov word [TEST_ARENA_ADDR], "* "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0x0064
jne .fail
; length1 token that doesn't exist
mov word [TEST_ARENA_ADDR], " "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0xFFFF
jne .fail
; length2 token that exists
mov dword [TEST_ARENA_ADDR], "sp "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0x0026
jne .fail
; length2 token that doesn't exist
mov dword [TEST_ARENA_ADDR], "QQ "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0xFFFF
jne .fail
; length3 token that exists
mov dword [TEST_ARENA_ADDR], "rax "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0x0000
jne .fail
; length3 token that exists
mov dword [TEST_ARENA_ADDR], "cr0 "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0x004A
jne .fail
; length3 token that doesn't exist
mov dword [TEST_ARENA_ADDR], "r16 "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0xFFFF
jne .fail
; length4 token that exists
mov dword [TEST_ARENA_ADDR], "r10d"
mov byte [TEST_ARENA_ADDR + 4], " "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0x001A
jne .fail
; length4 token that exists
mov dword [TEST_ARENA_ADDR], "r15b"
mov byte [TEST_ARENA_ADDR + 4], " "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0x003F
jne .fail
; length4 token that doesn't exist
mov dword [TEST_ARENA_ADDR], "r15q"
mov byte [TEST_ARENA_ADDR + 4], " "
mov rdi, TEST_ARENA_ADDR
call identify_next_token
cmp ax, 0xFFFF
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_identify_next_token...", 0x00
; ------------------------------------------------------------------------------
; test_get_tte_type
;
; description:
; tests get_tte_type described functionality
; ------------------------------------------------------------------------------
test_get_tte_type:
mov rsi, .msg
call print
mov di, 0x0053 ; xor
call get_tte_type
cmp al, 0x01 ; operator
jne .fail
mov di, 0x0003 ; rdx
call get_tte_type
cmp al, 0x02 ; register
jne .fail
mov di, 0x0056 ; mov
call get_tte_type
cmp al, 0x01 ; operator
jne .fail
mov di, 0xFFFF ; unrecognised token
call get_tte_type
cmp al, UNRECOGNISED_ID_TYPE
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_tte_type...", 0x00
; ------------------------------------------------------------------------------
; test_get_tte_typed_metadata
;
; description:
; tests get_tte_typed_metadata described functionality
; ------------------------------------------------------------------------------
test_get_tte_typed_metadata:
mov rsi, .msg
call print
mov di, 0x0053 ; xor
call get_tte_typed_metadata
cmp al, 0x02 ; # operands
jne .fail
mov di, 0x0003 ; rdx
call get_tte_typed_metadata
cmp al, 00001011b ; reg: 010b
; width: 11b (64 bits)
jne .fail
mov di, 0x0056 ; mov
call get_tte_typed_metadata
cmp al, 0x02 ; # operands
jne .fail
mov di, 0xFFFF ; unrecognised token
call get_tte_typed_metadata
cmp al, UNRECOGNISED_ID_METADATA
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_tte_typed_metadata...", 0x00
; ------------------------------------------------------------------------------
; test_get_direct_addressing_ModRM
;
; description:
; tests get_direct_addressing_ModRM described functionality
; ------------------------------------------------------------------------------
test_get_direct_addressing_ModRM:
mov rsi, .msg
call print
mov di, 0x0000 ; rax
mov si, 0x0000 ; rax
call get_direct_addressing_ModRM
cmp al, 11000000b ; Mod Reg R/M: 11b 000b 000b
jne .fail
mov di, 0x0000 ; rax
mov si, 0x0003 ; rdx
call get_direct_addressing_ModRM
cmp al, 11000010b ; Mod Reg R/M: 11b 000b 010b
jne .fail
mov di, 0x0003 ; rdx
mov si, 0x0000 ; rax
call get_direct_addressing_ModRM
cmp al, 11010000b ; Mod Reg R/M: 11b 010b 000b
jne .fail
mov di, 0x0003 ; rdx
mov si, 0x0003 ; rdx
call get_direct_addressing_ModRM
cmp al, 11010010b ; Mod Reg R/M 11b 010b 010b
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_direct_addressing_ModRM...", 0x00
; ------------------------------------------------------------------------------
; test_get_opcode
;
; description:
; tests get_opcode described functionality
; ------------------------------------------------------------------------------
test_get_opcode:
mov rsi, .msg
call print
mov di, 0x0053 ; xor
call get_opcode
cmp al, 0x31
jne .fail
mov di, 0x0054 ; inc
call get_opcode
cmp al, 0xFF
jne .fail
mov di, 0x004F ; hlt
call get_opcode
cmp al, 0xF4
jne .fail
mov di, 0x0003 ; rdx (not an operator)
call get_opcode
cmp al, UNRECOGNISED_ID_OPCODE
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_opcode...", 0x00
; ------------------------------------------------------------------------------
; test_get_reg_bits
;
; description:
; tests get_reg_bits described functionality
; ------------------------------------------------------------------------------
test_get_reg_bits:
mov rsi, .msg
call print
mov di, 0x0000 ; rax
call get_reg_bits
cmp al, 000b
jne .fail
mov di, 0x0010 ; eax
call get_reg_bits
cmp al, 000b
jne .fail
mov di, 0x0003 ; rdx
call get_reg_bits
cmp al, 010b
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_reg_bits...", 0x00
msg_pass:
db 0x0A
times (TEST_LINE_LENGTH + .start - .end) db " ", ; right align
.start db "passed."
.end db 0x0A, 0x00
msg_fail:
db 0x0A
times (TEST_LINE_LENGTH + .start - .end) db " ",
.start db "failed."
.end db 0x0A, 0x00
test_byte db "Q" ; unterminated, just a byte chillin
test_token_null db "TestTokn", 0x00 ; followed by null terminator. Quad word
test_token_space db "TestTokn " ; followed by space. Quad word
test_elemb_0: ; [This Page Intentionally Left Blank]
test_elemb_5 db 0x54, 0x00, 0x21, 0x20, 0x34