duskos

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

commit fa861cdc04e2d98aa158c118b16466a013dc38ab
parent a2e9e3f148bb24a0bd6d9d2a0de78b0a5da54cb5
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Thu,  6 Apr 2023 07:22:21 -0400

hal: slightly rework the API

Rename some ops and remove <<n, and >>n, which aren't worth their weight in the
Low HAL as they're only used by "<<" and ">>". They're then replaced by High
HAL's "<<," and ">>," and become useless. Might as well move "<<" and ">>" in
the kernel.

Diffstat:
Mfs/asm/i386.fs | 4++--
Mfs/comp/c/egen.fs | 2+-
Mfs/comp/c/fgen.fs | 2+-
Mfs/doc/design/simple.txt | 13+++++++------
Mfs/doc/hal.txt | 22++++++++++------------
Mfs/tests/asm/hal.fs | 2+-
Mfs/xcomp/bootlo.fs | 6++----
Mfs/xcomp/i386/kernel.fs | 16+++++++---------
8 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/fs/asm/i386.fs b/fs/asm/i386.fs @@ -277,9 +277,8 @@ $e2 op loop, $e1 op loopz, $e0 op loopnz, op @, ?movzx, op @!, xchg, op addr, lea, : !, <>) @, ; -\ TODO: in 32-bit mode, arithmetics can be done directly, no need for bx : op doer ' , does> @ ( halop w ) dip halop>dstsrc ( dst src ) - bx swap ?movzx, bx | execute ; + bi+ 16b? | 8b? or if bx swap ?movzx, bx then | execute ; op +, add, op -, sub, op compare, cmp, : *, @@ -290,6 +289,7 @@ op +, add, op -, sub, op compare, cmp, dup imm? not if cx swap mov, cl then | execute ; op <<, shl, op >>, shr, +: [+n], ( n halop -- ) halop>dstsrc nip swap i) add, ; : _ ( halop -- dst src ) dup 16b? >r dup 8b? >r 32b) halop>dstsrc bx swap mov, ( dst ) diff --git a/fs/comp/c/egen.fs b/fs/comp/c/egen.fs @@ -27,7 +27,7 @@ alias noop parseFactor ( tok -- res ) \ forward declaration over Result :isconst? if CELLSZ + @ over Result arg swap execute over to Result arg else @ over Result :?>W execute then ( res ) ; -unaryop _neg, negate, neg +unaryop _neg, -W, neg : _ -1 i) ^, ; unaryop _not, _ ^ : _ W=0>Z, Z) C>W, ; diff --git a/fs/comp/c/fgen.fs b/fs/comp/c/fgen.fs @@ -84,7 +84,7 @@ code _lookup ( nref lookup -- ) 1 RSP) [+n], CELLSZ A+n, A) @, PSP) compare, NZ) branchC, drop \ Z=match \ we have a match, add totcnt*CELLSZ to A, dereference. that's our target. - RSP) 4 +) @, 2 <<n, RSP) !, W<>A, RSP) +, W) @, \ W=target + RSP) 4 +) @, 2 i) <<, RSP) !, W<>A, RSP) +, W) @, \ W=target 12 rs+, W>A, nip, branchA, \ Switch works by constructing a lookup table of all the cases and generating diff --git a/fs/doc/design/simple.txt b/fs/doc/design/simple.txt @@ -13,13 +13,14 @@ innovation compared to other Forths is to include a C compiler, my main reference when comparing complexity is Fabrice Bellard's Tiny C Compiler. Tcc enjoys a very good reputation among geeks, and Fabrice Bellard is generally -considered to be a genius. Nevertheless, Dusk's C compiler, excluding backends, -is 1300 lines of code and tcc, excluding backend is roughly 30,000 lines of -code. At the time of this writing, Dusk CC isn't quite completed yet, but there -isn't much left to add, I don't think it will exceed 2000 lines by much. +considered to be a genius. Nevertheless, Dusk's C compiler, excluding +assemblers, is 1400 lines of code and tcc, excluding backends is roughly 30,000 +lines of code. At the time of this writing, Dusk CC isn't quite completed yet, +but there isn't much left to add, I don't think it will exceed 2000 lines by +much. -The i386 backend of Dusk CC, including its assembler, is 600 lines of code. In -tcc, the i386 backend weighs in at 1600 lines of code. +The i386 backend (the HAL) of Dusk CC, including its assembler, is 400 lines of +code. In tcc, the i386 backend weighs in at 1600 lines of code. How can we explain this difference? It's true that Forth code is generally denser than C, but not by a factor of 15. It's true that I'm sometimes clever, diff --git a/fs/doc/hal.txt b/fs/doc/hal.txt @@ -194,15 +194,15 @@ branchA, -- Instructions: -@, op -- Read source into dest -!, op -- Write dest to source -@!, op -- Swap dest and source -+, op -- *Z* Add source to dest -[@], op -- Read indirect source into dest -[!], op -- Write indirect source into dest -compare, op -- Compare source to dest -[+n], n op -- *Z* Add n to indirect source without affecting dest -&, op -- Store the effective address of the operand in dest +@, op -- Read source into dest +!, op -- Write dest to source +@!, op -- Swap dest and source ++, op -- *Z* Add source to dest +[@], op -- Read indirect source into dest +[!], op -- Write indirect source into dest +compare, op -- Compare source to dest +[+n], n op -- *Z* Add n to indirect source without affecting dest +addr, op -- Store the effective address of the operand in dest ps+, n -- Add n to PSP rs+, n -- Add n to RSP @@ -211,9 +211,7 @@ A+n, n -- *Z* Add n to A W>A, -- Copy W to A A>W, -- Copy A to W W<>A, -- Swap W and A -negate, -- dest = -dest -<<n, n -- Shift dest left by n ->>n, n -- Shift dest right by n +-W, -- W = -W ## High HAL diff --git a/fs/tests/asm/hal.fs b/fs/tests/asm/hal.fs @@ -172,7 +172,7 @@ code test17 ( n -- ) \ test &). this returns item "idx" from PSP code test18 ( ... idx -- n ) - 2 <<n, PSP) &) +, W) @, + 2 i) <<, PSP) &) +, W) @, exit, 42 12 123 0 test18 123 #eq diff --git a/fs/xcomp/bootlo.fs b/fs/xcomp/bootlo.fs @@ -4,8 +4,6 @@ code : ] code ] ; : noop ; code dup dup, exit, code swap PSP) @!, exit, -code << 1 <<n, exit, -code >> 1 >>n, exit, : nip, 4 ps+, ; code nip nip, exit, : drop, PSP) @, nip, ; @@ -55,7 +53,7 @@ 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, -code - negate, PSP) +, nip, exit, +code - -W, PSP) +, nip, exit, : -^ swap - ; : e>w 5 + ; : w>e 5 - ; @@ -108,7 +106,7 @@ code ?dup W=0>Z, 0 Z) branchC, dup, then exit, : min ?swap drop ; : max ?swap nip ; : max0 ( n -- n ) dup 0< if drop 0 then ; : =><= ( n l h -- f ) over - rot> ( h n l ) - >= ; -code neg negate, exit, +code neg -W, exit, : ^ -1 xor ; : and? bool swap bool and ; : or? or bool ; diff --git a/fs/xcomp/i386/kernel.fs b/fs/xcomp/i386/kernel.fs @@ -284,14 +284,6 @@ xcode litn wcall, dup, wjmp, LIT>W, -xcode <<n, ( n -- ) \ ax XX i) shl, - $e0c1 i) wwrite, al cwrite, - xdrop, ret, - -xcode >>n, ( n -- ) \ ax XX i) shr, - $e8c1 i) wwrite, al cwrite, - xdrop, ret, - pc 3 nc, $5b $ff $d3 \ bx pop, bx call, xcode yield ximm ( pc ) 3 movewrite, ret, @@ -304,7 +296,7 @@ xcode exit, $c3 ( ret ) i) cwrite, ret, -xcode negate, ( -- ) \ ax neg, +xcode -W, ( -- ) \ ax neg, $d8f7 i) wwrite, ret, xcode W=0>Z, $c085 i) wwrite, ret, \ ax ax test, @@ -351,6 +343,12 @@ xcode /mod ( a b -- r q ) si 0 d) dx mov, \ remainder ret, +xcode << ( n -- n ) + ax 1 i) shl, ret, + +xcode >> ( n -- n ) + ax 1 i) shr, ret, + xcode lshift ( n u -- n ) cx ax mov, xdrop, ax cl shl,