summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--twasm/asm/main.asm74
-rw-r--r--twasm/package.nix3
2 files changed, 63 insertions, 14 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm
index 6ffe830..9af9ac4 100644
--- a/twasm/asm/main.asm
+++ b/twasm/asm/main.asm
@@ -112,7 +112,6 @@ assemble:
jmp .unexpected_token ; otherwise, fail
- dq 0,0,0 ; TODO figure out why this does anything and fix it :shrug:
.label:
push rsi
mov rsi, .msg_label
@@ -479,9 +478,15 @@ assemble:
pop rdi ; di = next tte
je .operator_2_register_const
+ push rcx
+ push rdi
+ push rsi
; di = next tte
call get_tte_type
; al = type of token
+ pop rsi ; si = dst tte
+ pop rdi ; di = src tte
+ pop rcx ; cx = operator tte
cmp al, 0x02 ; check if token is a register
je .operator_2_register_register ; if so, handle
@@ -551,19 +556,20 @@ assemble:
push rdi
push rsi
mov di, cx ; di = tte of operator
- mov sil, 1 ; dst = reg
+ mov sil, 0 ; dst = r/m
; bl = operator flag byte
call get_opcode
; al = opcode
- ; dl = op flag
- ; TODO do something if the op flag is present
+ ; dl = flags
call .write_byte
pop rsi ; si = tte
pop rdi ; di = tte
+ push rdx
; di = tte
call get_tte_typed_metadata
; al = register typed metadata
+ pop rdx ; dl = flags
and al, 11b ; al = register width
cmp al, 00b ; 8 bit
@@ -581,10 +587,12 @@ assemble:
; 16 bit
push rdi
push rsi
+ push rdx
mov edi, .buffer_end - .buffer ; length of buffer
mov rsi, .buffer ; buffer location
mov dl, 0x66
call elemb
+ pop rdx ; dl = flags
pop rsi ; si = src tte
pop rdi ; di = dst tte
cmp al, 1
@@ -593,10 +601,12 @@ assemble:
; 64 bit
push rdi
push rsi
+ push rdx
mov edi, .buffer_end - .buffer ; length of buffer
mov rsi, .buffer ; buffer location
mov dl, 0x48
call elemb
+ pop rdx ; dl = flags
pop rsi ; si = src tte
pop rdi ; di = dst tte
cmp al, 0
@@ -607,10 +617,12 @@ assemble:
; 16 bit
push rdi
push rsi
+ push rdx
mov edi, .buffer_end - .buffer ; length of buffer
mov rsi, .buffer ; buffer location
mov dl, 0x66
call elemb
+ pop rdx ; dl = flags
pop rsi ; si = src tte
pop rdi ; di = dst tte
cmp al, 0
@@ -619,10 +631,12 @@ assemble:
; 64 bit
push rdi
push rsi
+ push rdx
mov edi, .buffer_end - .buffer ; length of buffer
mov rsi, .buffer ; buffer location
mov dl, 0x48
call elemb
+ pop rdx ; dl = flags
pop rsi ; si = src tte
pop rdi ; di = dst tte
cmp al, 0
@@ -633,10 +647,12 @@ assemble:
; 16 bit
push rdi
push rsi
+ push rdx
mov edi, .buffer_end - .buffer ; length of buffer
mov rsi, .buffer ; buffer location
mov dl, 0x66
call elemb
+ pop rdx ; dl = flags
pop rsi ; si = src tte
pop rdi ; di = dst tte
cmp al, 0
@@ -645,10 +661,12 @@ assemble:
; 64 bit
push rdi
push rsi
+ push rdx
mov edi, .buffer_end - .buffer ; length of buffer
mov rsi, .buffer ; buffer location
mov dl, 0x48
call elemb
+ pop rdx ; dl = flags
pop rsi ; si = src tte
pop rdi ; di = dst tte
cmp al, 1
@@ -656,14 +674,17 @@ assemble:
jmp .operator_2_register_register_continue
.operator_2_register_register_continue:
- push rsi
- mov esi, edi ; si = reg; src tte
- pop rdi ; di = r/m; dst tte
+ shr dl, 4
+ and dl, 1
+ cmp dl, 1
+ je .operator_2_register_register_continue_no_ModRM
+ ; si = reg; src tte
+ ; di = r/m; dst tte
mov edx, 11b ; dl = mod bits
call get_ModRM
; al = Mod R/M byte
call .write_byte
-
+ .operator_2_register_register_continue_no_ModRM:
jmp .loop_next_token
.operator_2_register_const:
push rsi
@@ -1083,7 +1104,15 @@ get_ModRM:
;
; returned:
; al = opcode; the rest of rax is zeroed.
-; dl = flags
+; dl = flagsX
+; +----------------------------------------------------+
+; | flagsX byte |
+; +----------+-----------+-------------+---------------+
+; | 7 5 | 4 | 3 | 2 0 |
+; +----------+-----------+-------------+---------------+
+; | reserved | no ModR/M | 0x0F prefix | operator flag |
+; +----------+-----------+-------------+---------------+
+;
; ------------------------------------------------------------------------------
get_opcode:
@@ -1172,7 +1201,6 @@ get_reg_bits:
; rax = number of tokens processed
; ------------------------------------------------------------------------------
-align 16 ; idk, fixes some alignment bug sometimes :/
tokenise:
; rdi -> current byte of program
add rsi, rdi ; rsi -> last byte of program
@@ -2768,16 +2796,22 @@ opcodes:
dw 0x004F
db 0xF4 ; opcode
db 0x00 ; reserved
+
dd 0x00000000
+
dd 0x00000000
+
dd 0x00000000
; int3
dw 0x0050
db 0xCC ; opcode
db 0x00 ; reserved
+
dd 0x00000000
+
dd 0x00000000
+
dd 0x00000000
; xor
@@ -2799,8 +2833,11 @@ opcodes:
dw 0x0054
db 0xFF ; r/m
db 0x00
+
dd 0x00000000
+
dd 0x00000000
+
dd 0x00000000
; dec
@@ -2826,6 +2863,7 @@ opcodes:
dw 0x0000
dd 0x00000000
+
dd 0x00000000
; mov bit8
@@ -2853,6 +2891,7 @@ opcodes:
dw 0x0000
dd 0x00000000
+
dd 0x00000000
; sub
@@ -2889,8 +2928,11 @@ opcodes:
dw 0x005A
db 0xC3 ; opcode
db 0x00 ; reserved
+
dd 0x00000000
+
dd 0x00000000
+
dd 0x00000000
; cmp
@@ -2989,17 +3031,25 @@ opcodes:
dw 0x0060
db 0x8F ; r/m
db 0x00
+
dd 0x00000000
+
dd 0x00000000
+
dd 0x00000000
; out
; TODO enforce DX AL requirement, ignore ModR/M correctly
dw 0x0061
- db 0xEE
+ db 0xEE ; r/m <- r
db 0x00
+
dd 0x00000000
- dd 0x00000000
+
+ db 0x10 ; 10: no ModRM flag
+ db 0x00
+ dw 0x0000
+
dd 0x00000000
.by_id_end:
diff --git a/twasm/package.nix b/twasm/package.nix
index c96b1bc..ee4e250 100644
--- a/twasm/package.nix
+++ b/twasm/package.nix
@@ -14,8 +14,7 @@ stdenv.mkDerivation {
asm/main.asm \
-o out.bin \
-w+all \
- -w-reloc-abs \
- -O0
+ -w-reloc-abs
'';
installPhase = ''
dd if=/dev/zero of=disk bs=512 count=2880