summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--twasm/asm/main.asm55
1 files changed, 47 insertions, 8 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm
index c068c5e..c858a7a 100644
--- a/twasm/asm/main.asm
+++ b/twasm/asm/main.asm
@@ -184,9 +184,9 @@ assemble:
.operator_1_memory_access:
push rsi
mov rsi, .msg_operator_1_memory_access
- call print.error
+ call print.debug
pop rsi
- jmp halt
+ jmp .unsupported_memory_access
.operator_1_register:
push rsi
@@ -254,9 +254,9 @@ assemble:
.operator_2_memory_access:
push rsi
mov rsi, .msg_operator_2_memory_access
- call print.error
+ call print.debug
pop rsi
- jmp halt
+ jmp .unsupported_memory_access
.operator_2_register:
push rsi
@@ -299,9 +299,38 @@ assemble:
.operator_2_register_memory_access:
push rsi
mov rsi, .msg_operator_2_register_memory_access
- call print.error
+ call print.debug
pop rsi
- jmp halt
+
+ cmp di, 0x1000 ; check if token is addressing to a register
+ jne .unsupported_memory_access ; if not, unsupported :/
+
+ pop rax
+ pop rdi
+ inc rax
+ cmp rax, rdi
+ jge .break
+ push rdi
+ push rax
+ xor edi, edi
+ mov di, [rax * TOKEN_TABLE_ENTRY_SIZE + TOKEN_TABLE_ADDR] ; di = next tte
+
+ ; si = `R/M` tte
+ ; di = `reg` tte
+ push rsi
+ mov si, di
+ pop rdi
+ mov dl, 00b ; dl = mod bits
+ call get_ModRM
+ ; al = Mod R/M byte
+ call .output_byte
+
+ pop rax ; rax = number of tokens processed
+ pop rdi ; rdi = total number of tokens
+ inc rax
+ cmp rax, rdi
+ jge .break
+ jmp .loop
.operator_2_register_register:
push rsi
@@ -311,6 +340,9 @@ assemble:
; si = `R/M` tte
; di = `reg` tte
+ push rsi
+ mov si, di
+ pop rdi
mov dl, 11b ; dl = mod bits
call get_ModRM
; al = Mod R/M byte
@@ -331,6 +363,11 @@ assemble:
call print.error
jmp halt
+ .unsupported_memory_access:
+ mov rsi, .msg_unsupported_memory_access
+ call print.error
+ jmp halt
+
; procedures
; al = byte to write
@@ -343,7 +380,8 @@ assemble:
.next_output_byte dd OUTPUT_ADDR ; next empty byte in output
; TODO get rid of this sketchy bit of state
- .msg_unexpected_token db "unexpected token while assembling, aborting", 0x0A, 0x00
+ .msg_unexpected_token db "unexpected token, aborting", 0x0A, 0x00
+ .msg_unsupported_memory_access db "unsupported memory access, aborting", 0x0A, 0x00
.msg_operator_0 db "operator_0", 0x0A, 0x00
.msg_operator_1 db "operator_1", 0x0A, 0x00
.msg_operator_1_memory_access db "operator_1_memory_access", 0x0A, 0x00
@@ -1677,7 +1715,7 @@ opcodes:
db 0x00 ; reserved
dw 0x0056 ; mov
- db 0x89
+ db 0x8B
db 0x00 ; reserved
dw 0x004F ; hlt
@@ -1695,6 +1733,7 @@ program:
db "xor eax, eax", 0x0A
db "inc rax ; inline comment", 0x0A
db "; one line comment", 0x0A
+ db "mov rdx, [rax]", 0x0A
db "mov [rax], rdx", 0x0A
db "hlt", 0x0A ; TODO make it so it doesn't need to end with a newline; this
; would mean range checking members in operator/operand/com-