summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-03-11 20:14:13 +0100
committerandromeda <andromeda@lenovo>2026-03-11 20:14:13 +0100
commita84f2d7453e6695a677045a479667c3881d773f3 (patch)
tree9d0077a7aa2794ff871fa27aa5bc3192fa00ea19
parente6d7cb2f2104183e6d090ead5ad0f491f603e3ce (diff)
add get_ModRM
-rw-r--r--twasm/asm/main.asm31
1 files changed, 27 insertions, 4 deletions
diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm
index 96d15bc..c8dd826 100644
--- a/twasm/asm/main.asm
+++ b/twasm/asm/main.asm
@@ -320,6 +320,29 @@ get_tte_typed_metadata:
; ------------------------------------------------------------------------------
get_direct_addressing_ModRM:
+ mov dl, 11b
+ call get_ModRM
+ ret
+
+; ------------------------------------------------------------------------------
+; get_ModRM
+;
+; description:
+; given 2 register tokens and the mod bits, returns the ModR/M byte
+;
+; parameters:
+; di = token table entry `reg`
+; si = token table entry `R/M`
+; dl = lower 2 bits: mod bits. The rest is ignored
+;
+; returned:
+; al = ModR/M byte; the rest of rax is zeroed
+; ------------------------------------------------------------------------------
+
+get_ModRM:
+ and dl, 11b ; mask for mod bits
+ shl dl, 6
+
; di = tte
call get_reg_bits
; al = reg bits
@@ -332,12 +355,12 @@ get_direct_addressing_ModRM:
call get_reg_bits
; al = reg bits
- mov dl, al
+ mov cl, al
xor eax, eax
- or al, 11b << 6 ; mod bits
- or al, bl ; reg bits
- or al, dl ; R/M bits
+ or al, dl ; mod bits
+ or al, bl ; reg bits
+ or al, cl ; R/M bits
and rax, 0xFF ; mask for byte
ret