duskos

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

commit 376c70fbd0e803cd537ce444808dae81eb90d700
parent aa955b3e311a50f3f962181ce668c15d99bb9cad
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Thu, 16 Mar 2023 09:56:17 -0400

hal: i386 first steps

Not all those words written in the new kernel are tested, but at least we have
"runword" leading to "bye". It's a good chunk. I test that this words through
QEMU's "info registers": EDX is 42.

Diffstat:
Mfs/asm/i386.fs | 17+++--------------
Mfs/xcomp/bootlo.fs | 2+-
Afs/xcomp/bootlo2.fs | 1+
Mfs/xcomp/i386/kernel.fs | 988+++++++++++++++++++++++++------------------------------------------------------
Mfs/xcomp/i386/pc/build.fs | 4++--
Mfs/xcomp/i386/pc/kernel.fs | 28+++++++++++++++++-----------
6 files changed, 337 insertions(+), 703 deletions(-)

diff --git a/fs/asm/i386.fs b/fs/asm/i386.fs @@ -3,10 +3,10 @@ \ "opcode+mod" structure (very close to i386 structure) \ b2:0 regid \ b5:3 zeroes except when register is a "special" one for mov, -\ b7:6 mod ( displacement in "_disp" if present ) +\ b7:6 mod ( displacement in bank if present ) \ b8 0=8b 1=32/16b \ b14:9 zeroes -\ b15 immediate? ( value in "_imm" ) +\ b15 immediate? ( value in bank ) \ b16 opcode is 2 bytes (has $0f extension byte) \ b17 16b? \ b19:18 reserved @@ -218,7 +218,7 @@ create _tbl $8c , $120 , $121 , $124 , @ over jrel8? if $70 or op, jrel8, else $180 or op, 1- jrel32, then ; $4 op jz, $5 op jnz, $2 op jc, $3 op jnc, $8 op js, $9 op jns, $c op jl, $d op jnl, -$7 op ja, $6 op jna, +$7 op ja, $6 op jna, $2 op jb, $6 op jbe, : op ( opcode -- ) doer , does> ( rel a -- ) @ over jrel8? _assert op, jrel8, ; @@ -248,14 +248,3 @@ $e2 op loop, $e1 op loopz, $e0 op loopnz, of 8b? movzx, endof of 16b? 32b) movzx, endof mov, endcase ; - -\ Useful Dusk-related macros -: [ebp] bp 0 d) ; -: [ebp]z? [ebp] -1 i) test, ; -: [esi] si 0 d) ; -: ps+, bp CELLSZ i) sub, ; -: ps-, bp CELLSZ i) add, ; -: pspush, ( opmod -- ) ps+, [ebp] swap mov, ; -: pspop, ( opmod -- ) [ebp] mov, ps-, ; -\ equivalent to op1 pspop, then op2 pspop, -: pspop2, ( op1 op2 -- ) bp CELLSZ d) mov, r) [ebp] mov, bp CELLSZ << i) add, ; diff --git a/fs/xcomp/bootlo.fs b/fs/xcomp/bootlo.fs @@ -72,7 +72,7 @@ code 1- -1 W+n, exit, code execute W>A, drop, branchA, code not =0>Z, Z>W, exit, code bool =0>Z, Z>W, 1 xorn, exit, -: litn -4 ps+, PSP) !, LIT>W, ; +: litn dup, LIT>W, ; : if 0 =0>Z, Z) >branchC, ; immediate : ahead 0 branch, ; immediate : then HERE @ swap branch! ; immediate diff --git a/fs/xcomp/bootlo2.fs b/fs/xcomp/bootlo2.fs @@ -0,0 +1 @@ +bye diff --git a/fs/xcomp/i386/kernel.fs b/fs/xcomp/i386/kernel.fs @@ -1,14 +1,22 @@ \ This is the i386 Dusk kernel. It is called when the bootloader has finished \ loading this binary as well as the Forth boot code following it in memory. -\ We're in protected mode and all segments have been initialized. ESP and EBP -\ are uninitialized. DI is the A register. +\ We're in protected mode and all segments have been initialized. +\ ESP=RSP SI=PSP DI=A EAX=W. They begin uninitialized. +\ HAL operand structure is the same as asm/i386 opmod structure. ?f<< /asm/i386.fs ?f<< /xcomp/tools.fs \ Macros +: xnip, si CELLSZ i) add, ; +: xdrop, ax si 0 d) mov, xnip, ; +: xgrow, si CELLSZ i) sub, ; +: xdup, xgrow, si 0 d) ax mov, ; +: xlit, ( n -- ) xdup, ax swap i) mov, ; : absjmp, abs>rel jmp, ; : abscall, abs>rel call, ; : wcall, xwordlbl abscall, ; +: wjmp, xwordlbl absjmp, ; +: xconst ( n -- ) xcode dup, ax swap i) mov, ret, ; 0 value lblintnoop : idtgen ( entrycount -- ) for lblintnoop $ffff and w, $08 w, 0 c, $8e c, lblintnoop 16 rshift w, next ; @@ -16,18 +24,32 @@ \ Constants and labels 0 to realmode : values ( n -- ) for 0 value next ; -22 values lblmainalias lblbootptr lblnextword lblcurword lblnextmeta lblret +21 values lblmainalias lblbootptr lblnextword lblcurword lblnextmeta lblret lblsysdict lblparsec lblparseh lblparseud lblerrmsg lblhere lbl[rcnt] - lblmovewrite lblwrite lblcwrite lblfind lblcompiling lblidt lblmod - lblrelwr lblcallwr + lblwriterange lblfind lblcompiling lblidt lblmod + lblrelwr lblcallwr lblgrp1i $8000 const HERESTART $500 to binstart $2000 const STACKSZ $7c00 const RSTOP $80000 const PSTOP +$10 const HBANKCNT PSTOP STACKSZ - const HEREMAX -: movewrite, ( a u ) cx swap i) mov, si swap i) mov, lblmovewrite abscall, ; +$1c0 const MODRM_AX +$1c7 const MODRM_DI +$1c6 const MODRM_SI +$1c4 const MODRM_SP +$100 const MODRM_[AX] +$107 const MODRM_[DI] +$106 const MODRM_[SI] +$104 const MODRM_[SP] + +: _ dx lblhere m) mov, dx 0 d) swap mov, ; +: cwrite, ( opmod -- ) _ lblhere m) inc, ; +: wwrite, ( opmod -- ) _ lblhere m) 2 i) add, ; +: dwrite, ( opmod -- ) _ lblhere m) 4 i) add, ; +: movewrite, ( a u ) cx swap i) mov, bx swap i) mov, lblwriterange abscall, ; \ Let's go! 0 align4 here to org @@ -41,57 +63,36 @@ L1 forward! lblidt m) lidt, sti, forward16 jmp, to L1 -xcode IDT L2 i) pspush, ret, -xcode CALLSZ 5 i) pspush, ret, -xcode BRSZ 5 i) pspush, ret, -xcode ?BRSZ 14 i) pspush, ret, - -xcode noop pc to lblret ret, - -xcode (cell) - ax pop, - ax pspush, - ret, - -xcode (does) - ax pop, - bx ax mov, - bx CELLSZ i) add, - bx pspush, - ax 0 d) jmp, - -xcode (s) - si pop, \ addr of str - si pspush, - ax ax xor, - lodsb, \ len - si ax add, \ ret to PC right after str - si jmp, - -xcode herestart - HERESTART i) pspush, - ret, - -pc HEREMAX , -xcode HEREMAX - ( pc ) i) pspush, - ret, +L2 xconst IDT +5 xconst CALLSZ +5 xconst BRSZ +15 xconst ?BRSZ +HERESTART xconst herestart +pc HEREMAX , xconst HEREMAX pc to lblhere HERESTART , -xcode HERE - lblhere i) pspush, - ret, - +lblhere xconst HERE pc to lblsysdict 0 , 0 c, \ 1b zero len field. see doc/arch -xcode sysdict - lblsysdict i) pspush, - ret, +lblsysdict xconst sysdict +pc to lblmod 0 , +lblmod xconst MOD +pc to lbl[rcnt] 0 , +lbl[rcnt] xconst [rcnt] +pc to lblnextword 0 , +lblnextword xconst NEXTWORD +pc to lblcurword $20 allot0 +lblcurword xconst curword +pc to lblnextmeta 0 , +lblnextmeta xconst nextmeta + pc to lblcompiling 0 , xcode compiling - ax lblcompiling m) mov, - ax pspush, - ret, + dup, ax lblcompiling m) mov, ret, + +xcode bye \ temporary word + dx 42 i) mov, + 0 jmp, xcode quit cld, @@ -102,383 +103,281 @@ xcode quit xcode (abort) L1 forward! - bp PSTOP i) mov, - xwordlbl quit absjmp, + si PSTOP i) mov, + wjmp, quit -xcode exit - ax pop, +\ HAL operands +pc to L1 HBANKCNT CELLSZ * allot +pc to L2 0 , +xcode hbank' ( idx -- a ) + ax $0f i) and, + ax 2 i) shl, + ax L1 i) add, ret, -xcode execute - ax pspop, - ax jmp, - -xcode dup ( a -- a a ) - ax [ebp] mov, - ax pspush, +xcode @) ( operand -- n ) + ax 20 i) shr, + wcall, hbank' + ax ax 0 d) mov, ret, -xcode ?dup ( a -- a? a ) - [ebp]z? - xwordlbl dup abs>rel jnz, +xcode hbank! ( operand n -- operand ) + cx ax mov, \ cx=n + ax L2 m) mov, + L2 m) inc, + bx ax mov, \ bx=idx + wcall, hbank' \ ax=a + ax 0 d) cx mov, + xdrop, \ ax=operand + bx 20 i) shl, + ax bx or, ret, -xcode swap ( a b -- b a ) - ax [ebp] mov, - bx bp CELLSZ d) mov, - [ebp] bx mov, - bp CELLSZ d) ax mov, - ret, +MODRM_[AX] xconst W) +MODRM_[DI] xconst A) +MODRM_[SI] xconst PSP) +MODRM_[SP] xconst RSP) -xcode over ( a b -- a b a ) - ax bp CELLSZ d) mov, - ax pspush, - ret, +xcode m) ( a -- operand ) + xdup, + si 0 d) $105 i) mov, + wjmp, hbank! -xcode rot ( a b c -- b c a ) - ax [ebp] mov, - bx bp CELLSZ d) mov, - cx bp CELLSZ << d) mov, - [ebp] cx mov, - bp CELLSZ d) ax mov, - bp CELLSZ << d) bx mov, - ret, +pc to L1 xdrop, ret, +xcode +) ( operand n -- operand ) + ax ax test, L1 abs>rel jz, + si 0 d) $40 i) or, \ disp8 mode + wjmp, hbank! -xcode nip ( a b - b ) - ax pspop, - [ebp] ax mov, +\ Write routines +pc to lblcallwr \ bx=abs addr + $e8 i) cwrite, +pc to lblrelwr \ bx=abs addr + bx lblhere m) sub, \ displacement + bx 4 i) sub, \ ... from *after* call op + bx dwrite, +pc to lblret ret, -xcode tuck ( a b -- b a b ) - ax [ebp] mov, - bx bp CELLSZ d) mov, - [ebp] bx mov, - bp CELLSZ d) ax mov, - ax pspush, +pc to lblwriterange \ bx=addr cx=u + di push, si push, + si bx mov, + di lblhere m) mov, + lblhere m) cx add, + rep, movsb, + si pop, di pop, ret, -xcode rot> ( a b c -- c a b ) - ax [ebp] mov, - bx bp CELLSZ d) mov, - cx bp CELLSZ << d) mov, - [ebp] bx mov, - bp CELLSZ d) cx mov, - bp CELLSZ << d) ax mov, - ret, +\ Group1 op (add, sub, etc.) +pc to lblgrp1i \ bx=dstmodrm cx=i dx=reg + dx 3 i) shl, + bx dx or, + cx $100 i) cmp, forward8 jb, + $81 cwrite, bl cwrite, cx dwrite, ret, + forward! + $83 cwrite, bl cwrite, cl cwrite, ret, -xcode scnt - ax PSTOP i) mov, - ax bp sub, - ax 16b) 2 i) shr, \ div by 4, preserve neg - ax pspush, - ret, +\ Assembler words +xcode rs+, ( n -- ) \ sp XX i) add, + bx MODRM_SP i) mov, cx ax mov, dx dx xor, ( add ) lblgrp1i abscall, + lbl[rcnt] m) ax add, + xdrop, ret, -xcode rcnt - ax RSTOP i) mov, - ax sp sub, - ax 16b) 2 i) shr, \ div by 4, preserve neg - ax dec, \ ignore this call - ax pspush, - ret, +xcode ps+, ( n -- ) \ si XX i) add, + bx MODRM_SI i) mov, cx ax mov, dx dx xor, ( add ) lblgrp1i abscall, + xdrop, ret, -xcode 1+ - [ebp] inc, +pc to L1 + ax dwrite, xdrop, ret, -xcode 1- - [ebp] dec, - ret, +xcode LIT>W, ( n -- ) \ ax XX i) mov, + $b8 i) cwrite, L1 absjmp, -xcode + - ax pspop, - [ebp] ax add, - ret, +xcode LIT>A, ( n -- ) \ di XX i) mov, + $bf i) cwrite, L1 absjmp, -xcode - - ax pspop, - [ebp] ax sub, - ret, +xcode W+n, ( n -- ) \ ax XX i) add, + $05 i) cwrite, L1 absjmp, -xcode * - ax pspop, - [ebp] mul, - [ebp] ax mov, - ret, +xcode A+n, ( n -- ) \ di XX i) add, + $c781 i) wwrite, L1 absjmp, -xcode /mod ( a b -- r q ) - ax bp CELLSZ d) mov, - dx dx xor, - [ebp] div, - bp CELLSZ d) dx mov, \ remainder - [ebp] ax mov, \ quotient - ret, +xcode W>A, ( n -- ) \ di ax mov, + $c789 i) wwrite, ret, -xcode <<c - 0 i) pspush, - bp CELLSZ d) 1 i) shl, - [ebp] setc, - ret, +xcode W<>A, ( n -- ) \ di ax xchg, + $97 i) cwrite, ret, -xcode >>c - 0 i) pspush, - bp CELLSZ d) 1 i) shr, - [ebp] setc, +xcode !, ( operand -- ) \ operand ax mov, + ax $8800 i) or, + al ah xchg, + ax wwrite, + xdrop, ret, -xcode lshift ( n u -- n ) - cx pspop, - [ebp] cl shl, - ret, +xcode dup, + -4 xlit, wcall, ps+, + wcall, PSP) + wjmp, !, -xcode rshift ( n u -- n ) - cx pspop, - [ebp] cl shr, - ret, +xcode litn + wcall, dup, + wjmp, LIT>W, -xcode and - ax pspop, - [ebp] ax and, - ret, +pc 3 nc, $5b $ff $d3 \ bx pop, bx call, +xcode yield ximm + ( pc ) 3 movewrite, ret, -xcode or - ax pspop, - [ebp] ax or, - ret, +xcode execute, + bx ax mov, xdrop, + lblcallwr absjmp, -xcode xor - ax pspop, - [ebp] ax xor, +xcode exit, + $c3 ( ret ) i) cwrite, ret, -xcode bool - ax [ebp] mov, - [ebp] 0 i) mov, - ax ax test, - [ebp] setnz, +xcode branch, + $e9 ( jmp ) i) cwrite, +pc to L1 + bx ax mov, + lblrelwr abscall, + ax lblhere m) mov, + ax 4 i) sub, ret, -xcode not - ax [ebp] mov, - [ebp] 0 i) mov, - ax ax test, - [ebp] setz, - 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, -xcode < - ax pspop, - [ebp] ax sub, - [ebp] 0 i) mov, - [ebp] setc, +xcode branch! + bx si 0 d) mov, xnip, \ ax=a bx=n + bx ax sub, \ displacement + bx 4 i) sub, \ ... from *after* call/jmp op + ax 0 d) bx mov, + xdrop, ret, -\ Following words have binary modulator subwords +\ Regular words +xcode execute + bx ax mov, + xdrop, + bx jmp, -xcode c@ - ax [ebp] mov, \ ax=a - bx ax 0 d) 8b) movzx, - [ebp] bx mov, - ret, +xcode - + si 0 d) ax sub, + xdrop, ret, -pc 0 , EMETA_8B , - xwordlbl c@ absjmp, -pc nextmeta ! ( pc ) , EMETA_16B , - ax [ebp] mov, \ ax=a - bx ax 0 d) movzx, - [ebp] bx mov, - ret, -xcode @ ( a -- n ) - ax [ebp] mov, \ ax=a - ax ax 0 d) mov, - [ebp] ax mov, - ret, +xcode * + si 0 d) mul, + xnip, ret, -xcode c! - ax bx pspop2, \ ax=a bx=n - ax 0 d) bl mov, +xcode /mod ( a b -- r q ) + bx ax mov, ax si 0 d) mov, + dx dx xor, + bx div, + si 0 d) dx mov, \ remainder ret, -pc 0 , EMETA_8B , - xwordlbl c! absjmp, -pc nextmeta ! ( pc ) , EMETA_16B , - ax bx pspop2, \ ax=a bx=n - ax 0 d) 16b) bx mov, - ret, -xcode ! ( n a -- ) - ax bx pspop2, \ ax=a bx=n - ax 0 d) bx mov, +xcode lshift ( n u -- n ) + cx ax mov, xdrop, + ax cl shl, ret, -pc 0 , EMETA_8B , - ax bx pspop2, \ ax=a bx=n - ax 0 d) bl add, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - ax bx pspop2, \ ax=a bx=n - ax 0 d) 16b) bx add, - ret, -xcode +! ( n a -- ) - ax bx pspop2, \ ax=a bx=n - ax 0 d) bx add, +xcode rshift ( n u -- n ) + cx ax mov, xdrop, + ax cl shr, ret, -xcode c, - ax pspop, \ ax=n -pc to lblcwrite \ al=c preserves bx - si lblhere m) mov, - [esi] al mov, - lblhere m) inc, - ret, +xcode and + ax si 0 d) and, + xnip, ret, -pc 0 , EMETA_8B , - xwordlbl c, absjmp, -pc nextmeta ! ( pc ) , EMETA_16B , - ax pspop, \ ax=n - si lblhere m) mov, - [esi] 16b) ax mov, - lblhere m) 2 i) add, - ret, -xcode , - ax pspop, \ ax=n -pc to lblwrite \ ax=n - si lblhere m) mov, - [esi] ax mov, - lblhere m) 4 i) add, - ret, +xcode or + ax si 0 d) or, + xnip, ret, + +xcode xor + ax si 0 d) xor, + xnip, ret, + +xcode < + bx ax mov, + ax ax xor, + si 0 d) bx cmp, + al setc, + xnip, ret, xcode pc@ ( port -- n8 ) - dx [ebp] mov, + dx ax mov, ax ax xor, al dx in, - [ebp] ax mov, ret, xcode pc! ( n8 port -- ) - dx ax pspop2, + dx ax mov, xdrop, al dx out, ret, xcode pw@ ( port -- n16 ) - dx [ebp] mov, + dx ax mov, ax ax xor, ax 16b) dx in, - [ebp] ax mov, ret, xcode pw! ( n16 port -- ) - dx ax pspop2, + dx ax mov, xdrop, ax 16b) dx out, ret, xcode p@ ( port -- n32 ) - dx [ebp] mov, + dx ax mov, ax ax xor, ax dx in, - [ebp] ax mov, ret, xcode p! ( n32 port -- ) - dx ax pspop2, + dx ax mov, xdrop, ax dx out, ret, -xcode move ( src dst u -- ) - cx pspop, - di si pspop2, - cx cx test, - lblret abs>rel jz, - rep, movsb, - ret, - -xcode move, ( src u -- ) - cx si pspop2, - cx cx test, - lblret abs>rel jz, -pc to lblmovewrite \ esi=a ecx=u - di lblhere m) mov, - lblhere m) cx add, - rep, movsb, - ret, - -xcode []= ( a1 a2 u -- f ) - cx di pspop2, - si [ebp] mov, - ax ax xor, - repz, cmpsb, - al setz, - [ebp] ax mov, - ret, - xcode align4 ( n -- ) - ax pspop, ax lblhere m) add, ax 3 i) and, lblret abs>rel jz, lblhere m) ax sub, lblhere m) 4 i) add, - ret, + xdrop, ret, -pc to lbl[rcnt] 0 , -xcode [rcnt] - lbl[rcnt] i) pspush, - ret, - -pc 2 nc, $83 $c4 ( XX ) \ sp XX i) add, -xcode r+, ( n -- ) - ( pc ) 2 movewrite, - ax pspop, - lbl[rcnt] m) ax add, - lblcwrite absjmp, - -pc 2 nc, $83 $c5 ( XX ) \ bp XX i) add, -xcode p+, ( n -- ) - ( pc ) 2 movewrite, - ax pspop, - lblcwrite absjmp, - -pc 3 nc, $58 $ff $d0 \ ax pop, ax call, -xcode yield ximm - ( pc ) 3 movewrite, ret, - -xcode rtype xwordlbl (abort) absjmp, +xcode rtype wjmp, (abort) \ During early boot, it's better to halt the machine than to go back to the \ mainloop because the mainloop likely sends us to an infinite error loop \ through boot<. pc ," boot failure" xcode abort - ( pc ) i) pspush, - 12 i) pspush, + si 0 d) swap ( pc ) i) mov, + ax 12 i) mov, wcall, rtype 0 jmp, 0 align4 pc to lblbootptr 0 , xcode boot< - si lblbootptr m) mov, - ax [esi] 8b) movzx, + dx lblbootptr m) mov, + xdup, ax dx 0 d) 8b) movzx, lblbootptr m) inc, - ax pspush, ret, \ where "word" feeds itself -xcode in< xwordlbl boot< absjmp, +xcode in< wjmp, boot< 3 allot \ that last jump is a rel8, we need more space. -pc to lblnextword 0 , -xcode NEXTWORD - lblnextword i) pspush, - ret, - -pc to lblcurword $20 allot0 -xcode curword - lblcurword i) pspush, - ret, - pc to L1 ( word_eof ) - ax ax xor, - ax pspush, - ret, - + ax ax xor, ret, pc \ we have a nonzero lblnextword + si push, di push, si lblnextword m) mov, lblnextword m) 0 i) mov, cx cx xor, @@ -486,15 +385,16 @@ pc \ we have a nonzero lblnextword cl inc, di lblcurword i) mov, rep, movsb, - lblcurword i) pspush, + di pop, si pop, + ax lblcurword i) mov, ret, xcode maybeword ( -- str-or-0 ) + xdup, \ reserve wiggle room on PS. lblnextword m) -1 i) test, ( pc ) abs>rel jnz, pc ( loop1 ) - wcall, in< - ax pspop, + wcall, in< xnip, ax ax test, L1 ( word_eof ) abs>rel js, ax SPC 1+ i) cmp, \ is ws? @@ -504,9 +404,8 @@ pc ( loop2 ) bx 0 d) al mov, bx inc, bx push, - wcall, in< + wcall, in< xnip, bx pop, - ax pspop, ax ax test, forward js, to L1 ( stoploop ) ax SPC 1+ i) cmp, \ is ws? @@ -514,26 +413,24 @@ pc ( loop2 ) L1 forward! ( stoploop ) bx lblcurword 1+ i) sub, lblcurword m) bl mov, - lblcurword i) pspush, + ax lblcurword i) mov, ret, pc ," word expected" xcode word wcall, maybeword - [ebp]z? + ax ax test, lblret abs>rel jnz, cx 13 i) mov, - si swap ( pc ) i) mov, -pc to lblerrmsg \ exc=sl esi=sa - si pspush, - cx pspush, + bx swap ( pc ) i) mov, +pc to lblerrmsg \ ecx=sl ebx=sa + xdup, ax bx mov, xdup, ax cx mov, wcall, rtype - xwordlbl abort absjmp, + wjmp, abort xcode findmeta ( id ll -- ll-or-0 ) - ax pspop, - bx [ebp] mov, -pc to L1 + bx si 0 d) mov, xnip, +pc to L1 \ bx=id ax ax test, forward8 jz, bx ax 4 d) cmp, @@ -541,105 +438,86 @@ pc to L1 ax ax 0 d) mov, L1 absjmp, forward! forward! - [ebp] ax mov, - ret, - -pc to lblmod 0 , -xcode MOD - lblmod i) pspush, ret, xcode findmod ( w -- w ) lblmod m) -1 i) test, - forward8 jnz, ret, forward! - ax [ebp] mov, + lblret abs>rel jz, ax 9 i) sub, bx lblmod m) mov, - bx pspush, ax pspush, - wcall, findmeta - ax pspop, + L1 abs>rel call, ax ax test, - forward8 jz, - lblmod m) 0 i) mov, - ax 8 i) add, - [ebp] ax mov, - forward! + lblret abs>rel jz, + lblmod m) 0 i) mov, + ax 8 i) add, ret, xcode find ( str 'dict -- word-or-0 ) - dx pspop, -pc to lblfind - si [ebp] mov, - cx [esi] 8b) movzx, - [ebp] inc, + dx ax mov, xdrop, +pc to lblfind \ ax=str dx='dict + cx ax 0 d) 8b) movzx, \ cx=sz + ax inc, + di push, si push, pc ( loop ) - di dx mov, \ entry - al di 4 d) mov, \ len - al $3f i) and, \ 3f instead of 7f? we reserve space for another flag. - al cl cmp, + bl dx 4 d) mov, \ entry len + bl $3f i) and, \ 3f instead of 7f? we reserve space for another flag. + bl cl cmp, forward jnz, to L1 ( skip1 ) \ same length + di dx mov, di 4 i) sub, di cx sub, \ beginning of name range - si [ebp] mov, + si ax mov, repz, cmpsb, forward jnz, to L2 ( skip2 ) \ same contents + si pop, di pop, dx 5 i) add, \ word - [ebp] dx mov, - xwordlbl findmod absjmp, + ax dx mov, + wjmp, findmod L2 forward! ( skip2 ) - cl al mov, + cl bl mov, L1 forward! ( skip1 ) dx dx 0 d) mov, dx dx test, ( pc ) abs>rel jnz, ( loop ) \ not found - [ebp] 0 i) mov, + si pop, di pop, + ax ax xor, ret, pc ," word not found" xcode (wnf) - lblcurword 1+ i) pspush, - cx lblcurword m) 8b) movzx, - cx pspush, + xdup, ax lblcurword 1+ i) mov, + xdup, ax lblcurword m) 8b) movzx, wcall, rtype cx 15 i) mov, - si swap ( pc ) i) mov, + bx swap ( pc ) i) mov, lblerrmsg absjmp, -xcode ' ( "name" -- w ) - wcall, word - dx lblsysdict m) mov, - lblfind abscall, - [ebp]z? - xwordlbl (wnf) abs>rel jz, - ret, - 0 align4 pc to L1 \ parse unsuccessful - [ebp] 0 i) mov, + ax ax xor, ret, -0 align4 pc to lblparsec ( str -- n? f ) \ esi=sa ecx=sl +0 align4 pc to lblparsec ( str -- n? f ) \ eax=sa ecx=sl cx 3 i) cmp, L1 abs>rel jnz, \ fail - si 2 d) 8b) ''' i) cmp, + ax 2 d) 8b) ''' i) cmp, L1 abs>rel jnz, \ fail - ax ax xor, - al si 1 d) mov, - [ebp] ax mov, - 1 i) pspush, + ax ax 0 d) 8b) movzx, + xdup, + ax 1 i) mov, ret, -0 align4 pc to lblparseh ( str -- n? f ) \ esi=sa ecx=sl +0 align4 pc to lblparseh ( str -- n? f ) \ eax=sa ecx=sl cx 2 i) cmp, L1 abs>rel jc, \ fail - si inc, \ skip $ + ax inc, \ skip $ cx dec, - ax ax xor, + dx dx xor, bx bx xor, pc ( loop ) - bl [esi] mov, + bl ax 0 d) mov, bl $20 i) or, bl '0' i) sub, L1 abs>rel jc, \ fail @@ -651,289 +529,50 @@ pc ( loop ) bl 16 i) cmp, L1 abs>rel jnc, \ fail L2 forward! \ parse ok - ax 4 i) shl, \ res*16 - ax bx add, - si inc, + dx 4 i) shl, \ res*16 + dx bx add, + ax inc, ( pc ) abs>rel loop, ( loop ) - [ebp] ax mov, - 1 i) pspush, + xgrow, + si 0 d) dx mov, + ax 1 i) mov, ret, -0 align4 pc to lblparseud ( str -- n? f ) \ esi=sa ecx=sl +0 align4 pc to lblparseud ( str -- n? f ) \ eax=sa ecx=sl cx cx test, L1 abs>rel jz, \ fail - ax ax xor, \ res + bx ax mov, \ bx=str + ax ax xor, \ ax=res pc ( loop ) - bx 10 i) mov, - bx mul, - bl [esi] mov, - bl '0' i) sub, + dx 10 i) mov, + dx mul, + dx bx 0 d) 8b) movzx, + dl '0' i) sub, L1 abs>rel jc, \ fail - bl 10 i) cmp, + dl 10 i) cmp, L1 abs>rel jnc, \ fail - ax bx add, - si inc, + ax dx add, + bx inc, ( pc ) abs>rel loop, ( loop ) - [ebp] ax mov, - 1 i) pspush, + xdup, ax 1 i) mov, ret, xcode parse ( str -- n? f ) - si [ebp] mov, - cx [esi] 8b) movzx, - si inc, - [esi] 8b) ''' i) cmp, + cx ax 0 d) 8b) movzx, + ax inc, + ax 0 d) 8b) ''' i) cmp, lblparsec abs>rel jz, - [esi] 8b) '$' i) cmp, + ax 0 d) 8b) '$' i) cmp, lblparseh abs>rel jz, - [esi] 8b) '-' i) cmp, + ax 0 d) 8b) '-' i) cmp, lblparseud abs>rel jnz, - si inc, + ax inc, cx dec, lblparseud abscall, - [ebp]z? - L1 abs>rel jz, \ fail - bp CELLSZ d) neg, - ret, - -pc 7 nc, 'n' LF 'r' CR '0' 0 0 -xcode "< - wcall, in< - [ebp] '"' i) cmp, - forward jnz, - [ebp] -1 i) mov, - ret, - forward! - [ebp] '\' i) cmp, - lblret abs>rel jnz, - ps-, - wcall, in< - si swap ( pc ) i) mov, -pc - lodsb, - al al test, - lblret abs>rel jz, - [ebp] al cmp, - lodsb, - ( pc ) abs>rel jnz, - [ebp] al mov, - ret, - -xcode ," - wcall, "< - ax pspop, ax ax test, - lblret abs>rel js, - xwordlbl ," i) push, - lblcwrite absjmp, - -pc to lblnextmeta 0 , -xcode nextmeta - lblnextmeta i) pspush, - ret, - -pc 6 nc, $83 $ed $04 $c7 $45 $00 ( XX ) \ bp 4 i) sub, [ebp] XX i) mov, -xcode litn - ( pc ) 6 movewrite, - xwordlbl , absjmp, - -pc to lblcallwr \ bx=abs addr - al $e8 ( call ) i) mov, - lblcwrite abscall, - ax bx mov, -pc to lblrelwr \ ax=abs addr - ax lblhere m) sub, \ displacement - ax 4 i) sub, \ ... from *after* call op - lblwrite absjmp, - -xcode execute, - bx pspop, - lblcallwr absjmp, - -xcode exit, - al $c3 ( ret ) i) mov, - lblcwrite absjmp, - -xcode branch, - al $e9 ( jmp ) i) mov, lblcwrite abscall, - ax pspop, - lblrelwr abscall, - ax lblhere m) mov, - ax 4 i) sub, - ax pspush, - ret, - -pc 10 nc, $8b $45 $00 $83 $c5 $04 $85 $c0 $0f $84 \ ax pspop, ax ax test, XX jz, -xcode ?branch, - ( pc ) 10 movewrite, - ax pspop, - lblrelwr abscall, - ax lblhere m) mov, - ax 4 i) sub, - ax pspush, - ret, - -xcode branch! - ax bx pspop2, \ ax=a bx=n - bx ax sub, \ displacement - bx 4 i) sub, \ ... from *after* call/jmp op - ax 0 d) bx mov, - ret, - -pc 2 nc, $89 $e7 \ di sp mov, -xcode RSP>A, - ( pc ) 2 movewrite, ret, - -pc 2 nc, $89 $ef \ di bp mov, -xcode PSP>A, - ( pc ) 2 movewrite, ret, - -xcode LIT>A, \ di XX i) mov, --> BF XX - al $bf i) mov, lblcwrite abscall, - xwordlbl , absjmp, - -pc 6 nc, $8b $7d $00 $83 $c5 $04 \ di [ebp] mov, [ebp] 4 i) add, -xcode >A, \ di [ebp] mov, [ebp] 4 i) add, --> 8b 7d 00 83 c5 04 - ( pc ) 6 movewrite, ret, - -pc 6 nc, $83 $ed $04 $89 $7d $00 \ [ebp] 4 i) sub, [ebp] di mov, -xcode A>, - ( pc ) 6 movewrite, ret, - -pc 2 nc, $81 $c7 ( XX ) \ di XX i) add, -xcode A+, - ( pc ) 2 movewrite, - xwordlbl , absjmp, - -pc 2 nc, $81 $07 ( XX ) \ di 0 d) XX i) add, -xcode [A]+, - ( pc ) 2 movewrite, - xwordlbl , absjmp, - -pc to L1 \ 8b A@ - ax di 0 d) 8b) movzx, - ax pspush, - ret, -pc 0 , EMETA_8B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ 16b A@ - ax di 0 d) movzx, - ax pspush, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ A@ - ax di 0 d) mov, - ax pspush, - ret, -xcode A@, - bx L1 i) mov, lblcallwr absjmp, - -pc to L1 \ 8b A! - ax pspop, - di 0 d) al mov, - ret, -pc 0 , EMETA_8B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ 16b A! - ax pspop, - di 0 d) 16b) ax mov, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ A! - ax pspop, - di 0 d) ax mov, - ret, -xcode A!, - bx L1 i) mov, lblcallwr absjmp, - -pc to L1 \ 8b A@! - ax ax xor, - al [ebp] mov, - al di 0 d) xchg, - [ebp] ax mov, - ret, -pc 0 , EMETA_8B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ 16b A@! - ax ax xor, - ax 16b) [ebp] mov, - ax 16b) di 0 d) xchg, - [ebp] ax mov, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ A@! - ax [ebp] mov, - ax di 0 d) xchg, - [ebp] ax mov, - ret, -xcode A@!, - bx L1 i) mov, lblcallwr absjmp, - -pc to L1 \ 8b A+! - ax pspop, - di 0 d) al add, - ret, -pc 0 , EMETA_8B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ 16b A+! - ax pspop, - di 0 d) 16b) ax add, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ A+! - ax pspop, - di 0 d) ax add, - ret, -xcode A+!, - bx L1 i) mov, lblcallwr absjmp, - -pc to L1 \ 8b [A]@ - ax di 0 d) mov, - ax ax 0 d) 8b) movzx, - ax pspush, - ret, -pc 0 , EMETA_8B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ 16b [A]@ - ax di 0 d) mov, - ax ax 0 d) movzx, - ax pspush, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ [A]@ - ax di 0 d) mov, - ax ax 0 d) mov, - ax pspush, - ret, -xcode [A]@, - bx L1 i) mov, lblcallwr absjmp, - -pc to L1 \ 8b [A]! - bx di 0 d) mov, - ax pspop, - bx 0 d) al mov, - ret, -pc 0 , EMETA_8B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ 16b [A]! - bx di 0 d) mov, - ax pspop, - bx 0 d) 16b) ax mov, - ret, -pc nextmeta ! ( pc ) , EMETA_16B , - bx L1 i) mov, lblcallwr absjmp, -pc to L1 \ [A]! - bx di 0 d) mov, - ax pspop, - bx 0 d) ax mov, + L1 abs>rel jz, \ fail + si 0 d) neg, ret, -xcode [A]!, - bx L1 i) mov, lblcallwr absjmp, xcode [ ximm lblcompiling m) 0 i) mov, @@ -945,50 +584,49 @@ xcode ] pc ," stack underflow" xcode stack? - bp PSTOP i) cmp, + si PSTOP i) cmp, lblret abs>rel jna, cx 15 i) mov, - si swap ( pc ) i) mov, + bx swap ( pc ) i) mov, lblerrmsg absjmp, pc to L2 \ find in sys dict - lblcurword i) pspush, + ax lblcurword i) mov, dx lblsysdict m) mov, lblfind abscall, - [ebp]z? + ax ax test, xwordlbl (wnf) abs>rel jz, ret, pc to L1 \ execute imm word wcall, execute - xwordlbl stack? absjmp, + wjmp, stack? xcode compword ( str -- ) wcall, parse - ax pspop, - ax ax test, + bx ax mov, xdrop, + bx bx test, xwordlbl litn abs>rel jnz, \ literal: jump to litn \ not a literal, find and compile - L2 abscall, - ax [ebp] mov, \ w - ax dec, - ax 0 d) 8b) $80 i) test, + L2 abscall, \ ax=w + ax -1 d) 8b) $80 i) test, L1 abs>rel jnz, \ immediate? execute \ compile word - xwordlbl execute, absjmp, + wjmp, execute, xcode runword ( str -- ) pc w>e lblsysdict pc>addr ! lblcompiling m) -1 i) test, xwordlbl compword abs>rel jnz, wcall, parse - ax pspop, ax ax test, - xwordlbl noop abs>rel jnz, \ literal: nothing to do + lblret abs>rel jnz, \ literal: nothing to do \ not a literal, find and execute L2 abscall, - ax pspop, - ax call, - xwordlbl stack? absjmp, + L1 absjmp, + +\ Constants that override compile-time constant names and must come last +PSTOP xconst PSTOP +RSTOP xconst RSTOP xcode main lblmainalias forward! diff --git a/fs/xcomp/i386/pc/build.fs b/fs/xcomp/i386/pc/build.fs @@ -34,7 +34,7 @@ org value kernel : setupFAT ( drv clustercnt -- fat ) ." creating FAT and copying files\n" - createFAT bootfs over copyfs ; + createFAT ( bootfs over copyfs ) ; : spitfile ( fpath dst -- ) >r curpath :find# Path :open begin ( fc ) @@ -58,7 +58,7 @@ org value kernel : spitBoot ( iohdl -- ) >r \ V1=iohdl ." Putting kernel in place\n" kernel kernellen V1 IO :write - S" /xcomp/bootlo.fs" V1 spitfile + S" /xcomp/bootlo2.fs" V1 spitfile S" /drv/pc/int13h.fs" V1 spitfile S" /fs/fatlo.fs" V1 spitfile S" /xcomp/i386/pc/glue.fs" V1 spitfile diff --git a/fs/xcomp/i386/pc/kernel.fs b/fs/xcomp/i386/pc/kernel.fs @@ -23,20 +23,22 @@ pc to L4 \ segment with ffff limits 0 to realmode xcode int13h ( drv head cyl sec dst -- ) - bx pspop, - ax pspop, cl al mov, \ sec - ax pspop, ch al mov, \ cyl - ax pspop, dh al mov, \ head - ax pspop, dl al mov, \ drive + bx ax mov, xdrop, + cl al mov, xdrop, \ sec + ch al mov, xdrop, \ cyl + dh al mov, xdrop, \ head + dl al mov, xdrop, \ drive cli, $18 L4 jmpfar, pc to L1 \ back to protected mode! - \ we still need to push di, bx and ax dx $10 i) mov, ds dx mov, ss dx mov, es dx mov, gs dx mov, fs dx mov, - bx pspush, ax pspush, - lblidt m) lidt, sti, - \ restore PIC masks + \ restore PIC masks while preserving ax + cx ax mov, ax pop, al $a1 i) out, al ah mov, al $21 i) out, + ax cx mov, + \ we still need to push bx and ax + xgrow, si 0 d) bx mov, ( -- bx ax ) + lblidt m) lidt, sti, ret, pc to L3 1 to realmode \ we're in realmode @@ -55,10 +57,14 @@ pc to L4 \ segment with ffff limits 0 to realmode xcode int10h ( cx/dx bx ax -- bx ax ) - \ save PIC masks and disable PIC for duration of int10h + \ save PIC masks and disable PIC for duration of int10h, preserve ax + cx ax mov, al $21 i) in, ah al mov, al $a1 i) in, ax push, al $ff i) mov, al $21 i) out, al $a1 i) out, - ax pspop, bx pspop, cx pspop, cli, $18 L4 jmpfar, + ax cx mov, + bx si 0 d) mov, xnip, + cx si 0 d) mov, xnip, + cli, $18 L4 jmpfar, \ To avoid lockups, we map all PIC IRQs on boot to words that acknowledge those \ IRQs. The rest of PIC initialization is done in /drv/pc/pic.fs