home *** CD-ROM | disk | FTP | other *** search
- \ KERNEL4.SEQ Last part of the kernel file, finishes up the compile.
-
- \ Link this file into the FILELIST chain.
-
- FILES DEFINITIONS
-
- VARIABLE KERNEL4.SEQ
-
- FORTH DEFINITIONS META IN-META
-
- VARIABLE #USER
-
- VOCABULARY USER USER DEFINITIONS
-
- : ALLOT ( n -- ) #USER +! ;
-
- ' CREATE ( avoid recursion: leave address for , in CREATE )
-
- : CREATE ( -- ) [ , ] #USER @ , ;USES DOUSER-VARIABLE ,-X
-
- : VARIABLE ( -- ) CREATE 2 ALLOT ;
-
- : DEFER ( -- ) VARIABLE ;USES DOUSER-DEFER ,-X
-
- FORTH DEFINITIONS META IN-META
-
- : >IS ( cfa -- data-address )
- DUP 1+ @ OVER >BODY +
- DUP [ [ASSEMBLER] DOUSER-VARIABLE META ] LITERAL = SWAP
- DUP [ [ASSEMBLER] DOUSER-DEFER META ] LITERAL = SWAP
- DROP OR IF >BODY @ UP @ + ELSE >BODY THEN ;
-
- : (IS) ( cfa --- ) R@ X@ >IS ! R> 2+ >R ;
-
- : IS ( cfa --- ) STATE @
- IF COMPILE (IS) ELSE ' >IS ! THEN ; IMMEDIATE
-
- CODE (=:) ( N1 --- ) \ Store to BODY field of following def
- MOV ES: BX, 0 [IP]
- POP 3 [BX]
- INC IP INC IP
- NEXT END-CODE
-
- CODE (@) ( --- N1 ) \ Fetch BODY field of following def
- MOV ES: BX, 0 [IP]
- PUSH 3 [BX]
- INC IP INC IP
- NEXT END-CODE
-
- : =: ( N1 T1 --- )
- STATE @
- IF COMPILE (=:)
- ELSE ' >BODY !
- THEN ; IMMEDIATE
-
- CODE INCR> ( --- )
- MOV ES: BX, 0 [IP]
- MOV AX, 3 [BX] INC AX MOV 3 [BX], AX
- INC IP INC IP
- NEXT END-CODE
-
- CODE DECR> ( --- )
- MOV ES: BX, 0 [IP]
- MOV AX, 3 [BX] DEC AX MOV 3 [BX], AX
- INC IP INC IP
- NEXT END-CODE
-
- CODE +!> ( N1 --- )
- POP CX
- MOV ES: BX, 0 [IP]
- MOV AX, 3 [BX] ADD AX, CX MOV 3 [BX], AX
- INC IP INC IP
- NEXT END-CODE
-
- : !> ( N1 T1 --- )
- STATE @
- IF COMPILE (=:)
- ELSE ' >BODY !
- THEN ; IMMEDIATE
-
- : @> ( N1 T1 --- )
- STATE @
- IF COMPILE (@)
- ELSE ' >BODY @
- THEN ; IMMEDIATE
-
- : QUIT ( -- )
- SP0 @ 'TIB ! [COMPILE] [
- BEGIN BEGIN RP0 @ RP! STATUS QUERY RUN
- STATE @ NOT UNTIL ." ok" AGAIN ;
-
- DEFER BOOT
- DEFER INITSTUFF ' NOOP IS INITSTUFF
- DEFER SEGSET ' SETYSEG IS SEGSET
-
- : WARM ( -- )
- [ XLABEL 'WARMBODY ]
- TRUE ABORT" Warm Start" ;
-
- : COLD ( -- )
- [ XLABEL 'COLDBODY ]
- SEGSET VMODE.SET INITSTUFF
- BOOT QUIT ;
-
- : START ( -- )
- SP0 @ 'TIB !
- >IN OFF
- SPAN OFF
- #TIB OFF
- LOADING OFF
- DEFAULT INTERPRET ;
-
- DEFER BYEFUNC ' NOOP IS BYEFUNC
-
- : BYE ( -- )
- BYEFUNC
- CR CR ." Giddaye, mate" CR 0 0 BDOS ;
-
- [FORTH] ASSEMBLER
-
- LABEL WORIG
- HERE ORIGIN 6 + - ORIGIN 4 + !-T ( WARM ENTRY )
- MOV IP, # 'WARMBODY \ IP = WARM
- NEXT
- END-CODE
-
- LABEL CORIG
- HERE ORIGIN 3 + - ORIGIN 1+ !-T ( COLD ENTRY )
- MOV AX, CS \ move CS to AX
- MOV DS, AX
- MOV SS, AX
- MOV BX, YSTART \ Read YSTART
- OR BX, BX 0<> \ If not reset, then move stuff
- IF
- ADD AX, # #CODESEGS #LISTSEGS + \ Add 128k to get to head space
- MOV ES, AX \ move head seg to ES
- MOV BX, # YDP
- ADD BX, UP
- MOV CX, 0 [BX]
- MOV DI, # 0 \ Clear DI
- MOV SI, YSTART \ MOV YSTART to AX
- OR CX, CX 0<> \ if YDP was not zero (0)
- IF CLD
- REPZ
- MOVSB \ move HEADS to head space
- CLD
- THEN
- MOV YSEG ES \ set YSEG to ES
- THEN
- MOV BX, XMOVED \ Has LIST been moved?
- OR BX, BX 0= \ If not reset, then move stuff
- IF
- MOV AX, DS \ move DS to AX
- ADD AX, # #CODESEGS \ Add 64k to get to heads
- MOV ES, AX \ move head seg to ES
- MOV BX, # XDP
- ADD BX, UP
- MOV CX, 0 [BX]
- MOV DI, # 0 \ Clear DI
- MOV SI, XSTART \ MOV XSTART to AX
- OR CX, CX 0<> \ if YDP was not zero (0)
- IF CLD
- REPZ
- MOVSB \ move LISTS to LIST space
- CLD
- THEN
- MOV XSEG ES \ set XSEG to ES
- THEN
- MOV AX, CS
- MOV AX, 6
- MOV AL, # 0 \ AX = contents of address 6
- MOV ' LIMIT 3 + AX \ LIMIT = 6 @
- SUB AX, # 10
- MOV ' FIRST 3 + AX \ FIRST = LIMIT - 10h
- SUB AX, # 10
- MOV RP, AX \ RP = FIRST - 10h
- MOV BX, # RP0
- ADD BX, UP
- MOV 0 [BX], RP \ RP0 = RP
- SUB AX, # 200
- MOV 'TIB AX \ TIB = RP - 200 DECIMAL
- MOV BX, # SP0
- ADD BX, UP
- MOV 0 [BX], AX \ SP0 = TIB
- MOV SP, AX \ SP = TIB
- MOV IP, # 'COLDBODY \ IP = COLD
- NEXT
- END-CODE
- IN-META
-
- HERE UP !-T ( SET UP USER AREA )
- 0 , ( TOS )
- 0 , ( ENTRY )
- 0 , ( LINK )
- INIT-R0 256 - , ( SP0 )
- INIT-R0 , ( RP0 )
- 0 , ( DP ) ( Must be patched later )
- 0 , ( OFFSET )
- 10 , ( BASE )
- 0 , ( HLD )
- FALSE , ( PRINTING )
- 0 , ( YDP ) ( Must be patched by Cold start code )
- ' (EMIT) , ( EMIT )
- ' (KEY?) , ( KEY? )
- ' (KEY) , ( KEY )
- ' (TYPE) , ( TYPE )
- 0 , ( XDP ) ( Must be patched by Cold start code )
-
- : DEPTH ( -- n ) SP@ SP0 @ SWAP - 2/ ;
-
- VARIABLE MAX.S
-
- : .S ( -- ) DEPTH 0< ABORT" Stack UNDERFLOW !! "
- DEPTH ?DUP MAX.S @ 1 < IF 4 MAX.S ! THEN
- IF DUP ." [" 1 .R ." ]" 0 SWAP 1- MAX.S @ 1- MIN
- DO I PICK 7 U.R BL FEMIT -1 +LOOP
- ELSE ." Stack Empty. " THEN ;
-
- : .ID ( nfa -- )
- DUP 1+ DUP YC@ ROT YC@ 31 AND 0
- ?DO DUP 127 AND FEMIT 128 AND
- IF ASCII _ 128 OR ELSE 1+ DUP YC@ THEN
- LOOP 2DROP BL FEMIT ;
-
- : DUMP ( addr len -- )
- 0 DO CR DUP 6 .R SPACE 16 0 DO DUP C@ 3 .R 1+ LOOP
- 16 +LOOP DROP ;
-
- : RECURSE ( -- ) LAST @ NAME> X, ; IMMEDIATE
-
- : H. ( N1 --- ) BASE @ >R HEX U. R> BASE ! ;
-
- VARIABLE LMARGIN 0 LMARGIN !-T
- VARIABLE RMARGIN 70 RMARGIN !-T
- VARIABLE TABSIZE 8 TABSIZE !-T
-
- : ?LINE ( n -- )
- #OUT @ + RMARGIN @ > IF CR LMARGIN @ SPACES THEN ;
-
- : ?CR ( -- ) 0 ?LINE ;
-
- : TAB ( --- ) #OUT @ TABSIZE @ MOD TABSIZE @ SWAP - SPACES ;
-
- : \ ( --- ) SPAN @ >IN ! ; IMMEDIATE
-
- ' (.") :RESOLVES <(.")>
- ' (") :RESOLVES <(")>
- ' (;CODE) :RESOLVES <(;CODE)>
- ' (;USES) :RESOLVES <(;USES)>
- ' (IS) :RESOLVES <(IS)>
- ' (ABORT") :RESOLVES <(ABORT")>
- [ASSEMBLER] >NEXT META RESOLVES <VARIABLE>
- [ASSEMBLER] DOUSER-DEFER META RESOLVES <USER-DEFER>
- [ASSEMBLER] DOUSER-VARIABLE META RESOLVES <USER-VARIABLE>
-
- ' DEFINITIONS :RESOLVES DEFINITIONS
- ' [ :RESOLVES [
- ' ?MISSING :RESOLVES ?MISSING
- ' QUIT :RESOLVES QUIT
- ' .ID :RESOLVES .ID
-
- \ Fill in some defered words
- ' CRLF IS CR
- ' NOOP IS WHERE
- ' CR IS STATUS
- ' (SOURCE) IS SOURCE
- ' START IS BOOT
- ' (NUMBER) IS NUMBER
- ' (?ERROR) IS ?ERROR
-
- ' FORTH >BODY-T CURRENT !-T
- ' FORTH >BODY-T CONTEXT !-T
- ' NORM-KEYTBL >BODY-T @-T KEYTBL !-T
- HERE-T DP UP @-T + !-T ( INIT USER DP )
- #USER-T @ #USER !-T ( INIT USER VAR COUNT )
- TRUE CAPS !-T ( SET TO IGNORE CASE )
- TRUE WARNING !-T ( SET TO ISSUE WARNINGS )
- 31 WIDTH !-T ( 31 CHARACTER NAMES )
- VOC-LINK-T @ VOC-LINK !-T ( INIT VOC-LINK )
-
- CR .( Unresolved references: ) CR .UNRESOLVED ?NEWPAGE
- CR .( Statistics: )
- CR .( Last Host Address: ) [FORTH] HERE U.
- CR .( First Target Code Address: ) META 256 THERE U.
- CR .( Last Target Code Address: ) META HERE-T THERE U.
- META 256 THERE \ start addr
- SVXSEG XSTART !-T
- CR .( CODE space used: ) HERE-T U.
- CR .( LIST space used: ) HERE-X U.
- CR .( HEAD space used: ) HERE-Y U.
- HERE-X ALLOT-T
- HERE-X XDP UP @-T + !-T
- SVYSEG DUP YSTART !-T
- 0 XMOVED !-T
- HERE-Y + HERE-Y YDP UP @-T + !-T
- DUP THERE ONLY FORTH ALSO SP@ SWAP -
- CR .( Free Symbol Table bytes: ) U.
- ONLY FORTH ALSO
-
- .ELAPSED
-
- ( A1 N1 --- ) ZSAVE FKERNEL.COM FORTH
-
- CR .( Now type INSTALL <enter> at the DOS prompt.)
- CR
-