duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

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:
Mfs/asm.fs | 25+++++++++++++------------
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 ;