commit db0722451449a030945ad1fe447c0a80d9f875f9
parent e10c4e928c341578e2db7420f0fc40e13373e957
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Thu, 16 Mar 2023 21:40:55 -0400
hal i386: add conditional branching
EAX=2a at bye
Diffstat:
2 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/fs/xcomp/bootlo2.fs b/fs/xcomp/bootlo2.fs
@@ -2,7 +2,6 @@ code : ] code ] ;
: :8b code8b ] ;
: :16b code16b ] ;
: noop ;
-: Z) $11 ; : NZ) $01 ; : C) $22 ; : NC) $02 ;
code dup dup, exit,
code swap PSP) @!, exit,
code << 1 <<n, exit,
@@ -66,6 +65,21 @@ code 1- -1 W+n, exit,
: 16b EMETA_16B MOD ! ; immediate
: 8b EMETA_8B MOD ! ; immediate
-: , HERE @!+ ;
-: foo HERE @ 4 - 16b @ bye ;
-$12345678 , foo
+: , HERE @!+ ; :16b HERE 16b @!+ ; :8b HERE 8b @!+ ; : c, 8b , ;
+
+code execute W>A, drop, branchA,
+code not W=0>Z, Z>W, exit,
+code bool W=0>Z, Z>W, 1 xorn, exit,
+: litn dup, LIT>W, ;
+: if 0 W>A, drop, A=0>Z, Z) branchC, ; immediate
+: ahead 0 branch, ; immediate
+: then HERE @ swap branch! ; immediate
+code ?dup W=0>Z, 0 Z) branchC, dup, then exit,
+: ' word sysdict @ find dup not if (wnf) then ;
+: ['] ' litn ; immediate
+: foo if 54 + then bye ;
+$12345678 , 42 0 foo
+: compile ' litn ['] execute, execute, ; immediate
+: [compile] ' execute, ; immediate
+: allot HERE +! ;
+
diff --git a/fs/xcomp/i386/kernel.fs b/fs/xcomp/i386/kernel.fs
@@ -69,7 +69,6 @@ forward16 jmp, to L1
L2 xconst IDT
5 xconst CALLSZ
5 xconst BRSZ
-15 xconst ?BRSZ
HERESTART xconst herestart
pc HEREMAX , xconst HEREMAX
@@ -151,6 +150,8 @@ MODRM_[AX] xconst W)
MODRM_[DI] xconst A)
MODRM_[SI] xconst PSP)
MODRM_[SP] xconst RSP)
+$4 xconst Z)
+$5 xconst NZ)
xcode m) ( a -- operand )
xdup,
@@ -305,6 +306,18 @@ xcode exit,
$c3 ( ret ) i) cwrite,
ret,
+xcode andn, ( n -- ) \ ax XX i) and,
+ $25 i) cwrite, ax dwrite, xdrop, ret,
+
+xcode orn, ( n -- ) \ ax XX i) or,
+ $0d i) cwrite, ax dwrite, xdrop, ret,
+
+xcode xorn, ( n -- ) \ ax XX i) xor,
+ $35 i) cwrite, ax dwrite, xdrop, ret,
+
+xcode Z=0>Z, $c085 i) wwrite, ret, \ ax ax test,
+xcode A=0>Z, $ff85 i) wwrite, ret, \ di di test,
+
xcode branch,
$e9 ( jmp ) i) cwrite,
pc to L1
@@ -314,11 +327,12 @@ pc to L1
ax 4 i) sub,
ret,
-\ bx ax mov, xdrop, bx bx test, XX jz,
-pc 11 nc, $89 $c3 $8b $06 $83 $c6 $04 $85 $db $0f $84
-xcode ?branch,
- ( pc ) 11 movewrite,
- L1 absjmp,
+\ we always encode the long form.
+xcode branchC, ( a cond -- a )
+ ax $f80 i) or, al ah xchg, ax wwrite,
+ xdrop, L1 absjmp,
+
+xcode branchA, $e7ff i) wwrite, ret, \ di jmp,
xcode branch!
bx si 0 d) mov, xnip, \ ax=a bx=n