commit 8e4589dd5e53a06626eb21706fa1c73c2b2e5906
parent 8a25fd43647b5c161cfad152e32876e7ef9c27e9
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Thu, 16 Mar 2023 19:14:10 -0400
hal i386: add "32b)" "+," "[+n]," "[@]," "[!],"
EAX=1234 at bye
Diffstat:
2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/fs/xcomp/bootlo2.fs b/fs/xcomp/bootlo2.fs
@@ -32,4 +32,40 @@ code8b HERE @ W>A, PSP) @, A) 8b) !, 2drop, exit,
code c! branch, drop
code w! branch, drop
-: foo 42 43 44 rot bye ; foo
+code +! W>A, drop, A) +, A) !, drop, exit,
+code16b W>A, drop, A) 16b) +, A) 16b) !, drop, exit,
+code8b W>A, drop, A) 8b) +, A) 8b) !, drop, exit,
+code @! W>A, drop, A) @!, exit,
+code16b W>A, drop, A) 16b) @!, exit,
+code8b W>A, drop, A) 8b) @!, exit,
+code @+ W>A, A) @, W<>A, 4 W+n, dup, W<>A, exit,
+code16b W>A, A) 16b) @, W<>A, 2 W+n, dup, W<>A, exit,
+code8b HERE @ W>A, A) 8b) @, W<>A, 1 W+n, dup, W<>A, exit,
+code c@+ branch, drop
+
+code !+ W>A, drop, A) !, W<>A, 4 W+n, exit,
+code16b W>A, drop, A) 16b) !, W<>A, 2 W+n, exit,
+code8b HERE @ W>A, drop, A) 8b) !, W<>A, 1 W+n, exit,
+code c!+ branch, drop
+
+code @@+ W>A, A) [@], 4 A) [+n], exit,
+code16b W>A, A) 16b) [@], 2 A) [+n], exit,
+code8b W>A, A) 8b) [@], 1 A) [+n], exit,
+code @!+ W>A, drop, A) [!], 4 A) [+n], drop, exit,
+code16b W>A, drop, A) 16b) [!], 2 A) [+n], drop, exit,
+code8b W>A, drop, A) 8b) [!], 1 A) [+n], drop, exit,
+
+code + PSP) +, nip, exit,
+: e>w 5 + ;
+: w>e 5 - ;
+: current sysdict @ e>w ;
+code 1+ 1 W+n, exit,
+code 1- -1 W+n, exit,
+: immediate current 1- dup c@ $80 or swap c! ;
+: EMETA_16B $11 ; : EMETA_8B $10 ;
+: 16b EMETA_16B MOD ! ; immediate
+: 8b EMETA_8B MOD ! ; immediate
+
+: , HERE @!+ ;
+: foo HERE @ 4 - @ bye ;
+$1234 , foo
diff --git a/fs/xcomp/i386/kernel.fs b/fs/xcomp/i386/kernel.fs
@@ -169,6 +169,9 @@ xcode 8b) ( operand -- operand )
xcode 16b) ( operand -- operand )
ax $20000 i) or, ret,
+xcode 32b) ( operand -- operand )
+ ax $100 i) or, ax $fffdffff i) and, ret,
+
\ Write routines
pc to lblcallwr \ bx=abs addr
$e8 i) cwrite,
@@ -227,6 +230,7 @@ xcode W<>A, ( n -- ) \ di ax xchg,
$97 i) cwrite, ret,
pc to L1 \ ax=opmod
+ ax $20000 i) test, forward8 jz, $66 i) cwrite, forward! \ 16b?
al ah xchg,
ax wwrite,
ah $40 i) test, forward8 jz, \ disp8
@@ -241,6 +245,7 @@ xcode !, ( operand -- ) \ operand ax mov,
ax $8800 i) or, L1 absjmp,
pc to L2 \ 16b or 8b
+ ax $fffdffff i) and,
$0f i) cwrite,
ax $b600 i) or, L1 absjmp,
xcode @, ( operand -- ) \ ax operand mov,
@@ -251,6 +256,26 @@ xcode @, ( operand -- ) \ ax operand mov,
xcode @!, ( operand -- ) \ operand ax xchg,
ax $8600 i) or, L1 absjmp,
+xcode +, ( operand -- ) \ operand ax add,
+ ax $0200 i) or, L1 absjmp,
+
+xcode [@], ( operand -- ) \ ax 32b) operand mov, ax Xb) ax 0 d) mov,
+ xdup, wcall, 32b) wcall, @, ( operand -- )
+ ax $ffffff00 i) and, \ set operand to [eax] but keep size
+ wjmp, @,
+
+\ bx 32b) operand mov, Xb) bx 0 d) ax mov,
+xcode [!], ( operand -- )
+ xdup, al $18 i) or, \ change target from ax to bx
+ wcall, 32b) wcall, @, ( operand -- )
+ ah $88 i) or,
+ al $03 i) mov, \ keep size, but modrm is for bx 0 d) ax mov,
+ L1 absjmp,
+
+xcode [+n], ( n operand -- ) \ operand n i) add,
+ ax $8000 i) or, L1 abscall, ( n -- )
+ ax dwrite, xdrop, ret,
+
xcode dup,
-4 xlit, wcall, ps+,
wcall, PSP)