duskos

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

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:
Mfs/xcomp/bootlo2.fs | 22++++++++++++++++++----
Mfs/xcomp/i386/kernel.fs | 26++++++++++++++++++++------
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