commit 3bf9b0863d0c8f1519e9c17b1601b412371818be
parent d4f34dd6c76b4aafa0d8bad55fa309f61f2407e1
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Thu, 9 Jun 2022 15:41:08 -0400
asm: simplify messed up modrm2, word
Diffstat:
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/fs/asm.fs b/fs/asm.fs
@@ -49,7 +49,6 @@
: i32 IMM $400 or to src ;
\ Writing the thing
-\ TODO: seriously, this is a mess. rework this.
: disp, disp? if disp c, then ;
: prefix, ( -- ) exit
tgt is16? if $66 c, then src isimm? not swap is16? and if $67 c, then ;
@@ -58,15 +57,16 @@
: modrm1, ( reg op -- ) \ modrm op with 1 argument
prefix, op, ( reg ) 3 lshift tgtid tgt mod or or ( modrm ) c,
disp? if disp c, then asm$ ;
+: modrm<imm, ( imm immreg op -- ) \ immediate src, modrm tgt
+ op, 3 lshift tgtid or tgt mod or ( modrm ) c, , disp, asm$ ;
: modrm2, ( imm? reg op -- ) \ modrm op with 2 arguments
- prefix,
- isimm? not if src mod $c0 = not if
+ src mod $c0 = not if
\ surprise! it's not tgt that is the mod rm, it's src. We're in "alternate"
\ mode and op is +2.
- 2 + c, ( src ) mod tgt 3 lshift or srcid or ( modrm ) c,
- disp, asm$ exit then then
- c, 3 lshift tgtid or tgt mod or ( modrm ) c,
- isimm? if , then disp, asm$ ;
+ 2 + c, ( src ) mod tgt 3 lshift or srcid or
+ else
+ c, 3 lshift tgtid or tgt mod or then
+ ( modrm ) c, disp, asm$ ;
\ operations
\ Inherent
@@ -85,10 +85,10 @@ $00e9 op jmp, $0f84 op jz, $0f85 op jnz,
\ Two operands
: op ( immop immreg regop -- ) doer c, c, c, does> ( imm? a -- )
+ prefix,
isimm? if
- dup 1+ c@ ( immreg ) swap 2 + c@ ( immreg immop ) else
- c@ src swap ( reg regop ) then
- modrm2, ;
+ dup 1+ c@ ( immreg ) swap 2 + c@ ( immreg immop ) modrm<imm, else
+ c@ src swap ( reg regop ) modrm2, then ;
$81 0 $01 op add, $81 7 $39 op cmp, $81 5 29 op sub, $f7 0 $85 op test,
\ tgt or-ed in
@@ -96,6 +96,7 @@ $81 0 $01 op add, $81 7 $39 op cmp, $81 5 29 op sub, $f7 0 $85 op test,
$58 op pop, $50 op push,
\ Special
-: mov, isimm? if
- prefix, $b8 tgtid or c, , asm$ else
+: mov,
+ prefix, isimm? if
+ $b8 tgtid or c, , asm$ else
src $89 modrm2, then ;