home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / LASER / FPC35_5.ZIP / FPCSRC.ZIP / KERNEL3.SEQ < prev    next >
Encoding:
Text File  |  1989-08-19  |  25.0 KB  |  799 lines

  1. \ KERNEL3.SEQ   More kernel stuff
  2.  
  3. FILES DEFINITIONS
  4.  
  5. VARIABLE KERNEL3.SEQ
  6.  
  7. FORTH DEFINITIONS
  8.  
  9. : >TYPE         ( adr len -- )
  10.                 TUCK PAD SWAP CMOVE   PAD SWAP TYPE  ;
  11.  
  12. : .(            ( -- )  ASCII ) PARSE >TYPE  ; IMMEDIATE
  13.  
  14. : (             ( -- )  ASCII ) PARSE 2DROP  ; IMMEDIATE
  15.  
  16. CODE TRAVERSE   ( addr direction -- addr' )
  17.                 POP CX          POP BX
  18.                 ADD BX, CX      PUSH ES
  19.                 MOV ES, YSEG
  20.           BEGIN
  21.                 MOV ES: AL, 0 [BX]      AND AL, # 128
  22.        0= WHILE
  23.                 ADD BX, CX
  24.           REPEAT
  25.                 POP ES          PUSH BX
  26.                 NEXT            END-CODE
  27.  
  28. CODE DONE?      ( n -- f )
  29.                 POP AX
  30.                 CMP AX, STATE
  31.             0<> IF
  32.                         MOV END? # 0 WORD
  33.                         MOV AX, # -1
  34.                         1PUSH
  35.                 THEN
  36.                 PUSH END?
  37.                 MOV END? # 0 WORD
  38.                 NEXT
  39.                 END-CODE
  40.  
  41. \ : DONE?         ( n -- f )
  42. \                 STATE @ <>   END? @ OR   END? OFF   ;
  43.  
  44. : CNHASH        ( cfa -- ya )
  45.                 $0FE00 AND FLIP ;
  46.  
  47. CODE CNSRCH     ( cfa ya maxya -- nfa failf )
  48.                 pop dx          \ maxya
  49.                 pop bx          \ ya
  50.                 add bx, # 4
  51.                 pop di          \ cfa
  52.                 mov ds, yseg
  53.         HERE    cmp dx, bx
  54.              U> IF      mov ax, 0 [bx]
  55.                         and ax, # 31
  56.                         add bx, ax
  57.                         inc bx
  58.                         mov ax, 0 [bx]
  59.                         cmp ax, di      \ if they match, then we found it
  60.                      0= if      sub bx, # 2             \ 1 before last chr
  61.                                 begin   mov al, 0 [bx]  \ test high bit
  62.                                         and al, # 128   \ loop till high set
  63.                              0= while   dec bx          \ backup one char
  64.                                 repeat
  65.                                 push bx                 \ push pointer to chr
  66.                                 mov ax, cs              \ restore DS
  67.                                 mov ds, ax
  68.                                 mov ax, # false         \ push false flag
  69.                                 1push
  70.                         then
  71.                         add bx, # 6     \ step to next header
  72.                         JMP ROT         \ bring HERE around Branch resolution
  73.                                         \ used by IF and THEN
  74.                 THEN
  75.                 mov ax, cs      mov ds, ax
  76.                 mov ax, # true
  77.                 push ax
  78.                 1push           end-code
  79.  
  80. : N>LINK        ( anf -- alf)
  81.                 2-   ;
  82.  
  83. : L>NAME        ( alf -- anf )
  84.                 2+   ;
  85.  
  86. : BODY>         ( apf -- acf )
  87.                 3 -  ;
  88.  
  89. : NAME>         ( anf -- acf )
  90.                 1 TRAVERSE   1+ Y@  ;
  91.  
  92. : LINK>         ( alf -- acf )
  93.                 L>NAME   NAME>   ;
  94.  
  95. : >BODY         ( acf -- apf )
  96.                 3 +  ;
  97.  
  98. HERE-Y 4 +     \ Step from view field to name field
  99.  
  100. : NO-NAME       ( -- )  
  101.                 ;
  102.  
  103. : >NAME         ( cfa -- nfa )
  104.                 DUP CNHASH DUP Y@ SWAP
  105.                 2+ Y@ ( cfa sya mxya ) CNSRCH
  106.                 IF      DROP (LIT) [ ROT ,-X ] THEN    ;
  107.  
  108. : >LINK         ( acf -- alf )
  109.                 >NAME   N>LINK   ;
  110.  
  111. : >VIEW         ( acf -- avf )
  112.                 >LINK   2-   ;
  113.  
  114. : VIEW>         ( avf -- acf )
  115.                 2+   LINK>   ;
  116.  
  117. COMMENT:
  118.  
  119.   The hash algorithm used is as follows:
  120.  
  121.         ((firstchar*2)+secondchar)*2)+count
  122.  
  123.   This seems to provide a good distribution across the 64 threads in
  124. 1000 word FORTH vocabulary.
  125.  
  126. COMMENT;
  127.  
  128. CODE HASH       ( str-addr voc-ptr -- thread )
  129.                 POP CX          POP BX
  130.                 MOV AX, 1 [BX]          \ Get first and second chars
  131.                 SHL AL, # 1             \ Shift first char left one
  132.                 ADD AL, AH              \ Plus second char
  133.                 SHL AX, # 1             \ The sum shifted left one again
  134.                 ADD AL, 0 [BX]          \ Plus count byte
  135.                 AND AX, # #THREADS 1-
  136.                 SHL AX, # 1     ADD AX, CX
  137.                 1PUSH           END-CODE
  138.  
  139. CODE (FIND)     ( here alf -- cfa flag | here false )
  140.                 POP BX
  141.                 OR BX, BX
  142.              0= IF
  143.                         SUB AX, AX
  144.                         1PUSH
  145.                 THEN
  146.                 POP CX
  147.                 PUSH ES
  148.                 MOV ES, YSEG
  149.                 MOV DI, CX
  150.             BEGIN
  151.                 MOV ES: AX, 2 [BX]
  152.                 XOR AX, 0 [DI]
  153.                 AND AX, # ( 63 ) $7F3F
  154.              0= IF
  155.                         MOV DX, BX
  156.                         ADD BX, # 2
  157.                         BEGIN
  158.                                 INC BX  INC DI
  159.                                 MOV ES: AL, 0 [BX]
  160.                                 XOR AL, 0 [DI]
  161.                     0<> UNTIL
  162.                         AND AL, # 127
  163.                      0= IF
  164.                                 MOV ES: CX, 1 [BX]      \ pick up CFA
  165.                                 MOV BX, DX
  166.                                 MOV ES: AL, 2 [BX]
  167.                                 AND AL, # 64
  168.                                 0<> IF
  169.                                     MOV AX, # 1
  170.                                 ELSE
  171.                                     MOV AX, # -1
  172.                                 THEN
  173.                                 POP ES
  174.                                 PUSH CX
  175.                                 1PUSH
  176.                         THEN
  177.                         MOV BX, DX
  178.                         MOV DI, CX
  179.                 THEN
  180.                 MOV ES: BX, 0 [BX]
  181.                 OR BX, BX
  182.         0= UNTIL
  183.                 POP ES
  184.                 PUSH CX
  185.                 SUB AX, AX
  186.                 1PUSH           END-CODE
  187.  
  188. HEADERLESS      \ Disable generation of headers
  189.  
  190. CODE DROP.CONTEXT.I2*+@DUP   ( a1 -- n1 )
  191.                 ADD SP, # 2
  192.                 MOV AX, 0 [RP]
  193.                 ADD AX, 2 [RP]
  194.                 SHL AX, # 1
  195.                 MOV BX, # CONTEXT
  196.                 ADD BX, AX
  197.                 MOV AX, 0 [BX]
  198.                 PUSH AX
  199.                 1PUSH
  200.                 END-CODE
  201.  
  202.                                 \ DUP PRIOR @ OVER PRIOR ! =
  203. CODE PRIOR.CHECK ( n1 -- n1 f1 )
  204.                 MOV   BX, SP
  205.                 MOV   AX, 0 [BX]
  206.                 MOV BX, PRIOR
  207.                 MOV PRIOR AX
  208.                 CMP BX, AX
  209.             0<> IF
  210.                         SUB AX, AX
  211.                         1PUSH
  212.                 THEN
  213.                 MOV AX, # TRUE
  214.                 1PUSH
  215.                 END-CODE
  216.  
  217. CODE OVER.SWAP.HASH.@     ( n1 n2 -- n1 n3 )
  218.                 POP AX
  219.                 MOV BX, SP
  220.                 MOV BX, 0 [BX]
  221.                 MOV CL, 0 [BX]
  222.                 MOV BX, 1 [BX]
  223.                 SHL BL, # 1
  224.                 ADD BL, BH
  225.                 SHL BL, # 1
  226.                 ADD BL, CL
  227.                 AND BX, # #THREADS 1-
  228.                 SHL BX, # 1
  229.                 ADD BX, AX
  230.                 PUSH 0 [BX]
  231.                 NEXT            END-CODE
  232.  
  233. HEADERS         \ Restore generation of TARGET HEADERS
  234.  
  235. : %%FIND        ( addr false #vocs 0 -- cfa flag | addr false )
  236.                 DO      DROP.CONTEXT.I2*+@DUP
  237.                         IF      PRIOR.CHECK
  238.                                 IF      DROP FALSE
  239.                                 ELSE    OVER.SWAP.HASH.@ (FIND)
  240.                                         DUP ?LEAVE
  241.                                 THEN
  242.                         THEN
  243.                 LOOP    ;
  244.  
  245. CODE %FIND      ( addr -- cfa flag | addr false )
  246.                 MOV DI, SP
  247.                 MOV BX, 0 [DI]
  248.                 CMP 0 [BX], # 0 BYTE
  249.             0<> IF
  250.                         MOV PRIOR # 0 WORD                      \ prior off
  251.                         MOV BX, # 0             PUSH BX         \ false
  252.                         MOV CX, # #VOCS         PUSH CX         \ #vocs
  253.                                                 PUSH BX         \ 0
  254.                         MOV AX, # ' %%FIND
  255.                         JMP AX
  256.                 THEN
  257.                 MOV END? # TRUE WORD
  258.                 MOV 0 [DI], # ' NOOP WORD
  259.                 MOV AX, # 1
  260.                 1PUSH           END-CODE
  261.  
  262. DEFER FIND      ' %FIND IS FIND
  263.  
  264. : DEFINED       ( -- here 0 | cfa [ -1 | 1 ] )
  265.                 BL WORD  ?UPPERCASE  FIND   ;
  266.  
  267. HEADERLESS
  268.  
  269. : STACKUNDER    ( -- )
  270.                 TRUE ABORT" Stack Underflow" ;
  271.  
  272. : STACKOVER     ( -- )
  273.                 TRUE ABORT" Stack Overflow" ;
  274.  
  275. : WARNOVER      ( -- )
  276.                 CR ."  Running out of CODE memory! " ;
  277.  
  278. HEADERS
  279.  
  280. CODE (?STACK)   ( -- )
  281.                 MOV CX, SP
  282.                 MOV BX, UP
  283.                 MOV DX, SP0 [BX]
  284.                 CMP DX, CX
  285.              U< IF
  286.                         MOV AX, # ' STACKUNDER
  287.                         JMP AX
  288.                 THEN
  289.                 MOV DX, DP [BX]
  290.                 ADD DX, # 80
  291.                 CMP CX, DX
  292.              U< IF
  293.                         MOV AX, # ' STACKOVER
  294.                         JMP AX
  295.                 THEN
  296.                 ADD DX, # 200
  297.                 CMP CX, DX
  298.              U< IF
  299.                         MOV AX, # ' WARNOVER
  300.                         JMP AX
  301.                 THEN
  302.                 NEXT            END-CODE
  303.  
  304. DEFER ?STACK    ' (?STACK) IS ?STACK
  305.  
  306. : INTERP        ( -- )
  307.                 BEGIN   ?STACK DEFINED
  308.                         IF     EXECUTE
  309.                         ELSE   NUMBER  DOUBLE? NOT IF  DROP  THEN
  310.                         THEN   FALSE DONE?
  311.                 UNTIL   ;
  312.  
  313. DEFER STATUS    ( -- )
  314.  
  315. DEFER INTERPRET ' INTERP IS INTERPRET
  316.  
  317. : PRINT         ( -- ) PRINTING ON INTERPRET PRINTING OFF ;
  318.  
  319. : ALLOT         ( n -- )      DP +!   ;
  320.  
  321. CODE ,          ( n -- )
  322.                 MOV BX, UP
  323.                 MOV AX, DP [BX]
  324.                 ADD DP [BX], # 2 WORD
  325.                 MOV BX, AX
  326.                 POP CX
  327.                 MOV 0 [BX], CX
  328.                 NEXT
  329.                 END-CODE
  330.  
  331. CODE C,         ( n -- )
  332.                 MOV BX, UP
  333.                 MOV AX, DP [BX]
  334.                 INC DP [BX] WORD
  335.                 MOV BX, AX
  336.                 POP CX
  337.                 MOV 0 [BX], CL
  338.                 NEXT
  339.                 END-CODE
  340.  
  341. : PARAGRAPH     ( offset -- paragraph-inc )
  342.                 15 + U16/ ;
  343.  
  344. : ALIGN         ( -- )
  345.                 ( HERE 1 AND IF  BL C,  THEN )  ; IMMEDIATE
  346.  
  347. : EVEN          ( n1 -- n2 )
  348.                 ( DUP 1 AND + ) ;  IMMEDIATE
  349.  
  350. : COMPILE       ( -- )   
  351.                 2R@ R> 2+ >R @L X,   ;
  352.  
  353. : IMMEDIATE     ( -- )   
  354.                 64 ( Precedence bit ) LAST @ YCSET  ;
  355.  
  356. : LITERAL       ( n -- )  
  357.                 COMPILE (LIT) X, ; IMMEDIATE
  358.  
  359. : DLITERAL      ( d# -- ) 
  360.                 SWAP [COMPILE] LITERAL [COMPILE] LITERAL ; IMMEDIATE
  361.  
  362. : ASCII         ( -- n )   
  363.                 BL WORD   1+ C@
  364.                 STATE @ IF   [COMPILE] LITERAL   THEN   ; IMMEDIATE
  365.  
  366. : CONTROL       ( -- n )   
  367.                 BL WORD   1+ C@  31 AND
  368.                 STATE @ IF   [COMPILE] LITERAL   THEN   ; IMMEDIATE
  369.  
  370. : CRASH         ( -- ) 
  371.                 2R@ 2- @L >NAME CR .ID TRUE
  372.                 ABORT" <- is an Uninitialized execution vector."  ;
  373.  
  374. : ?MISSING      ( f -- )
  375.                 IF      SPACE HERE COUNT TYPE
  376.                         TRUE ABORT"  <- What? "
  377.                 THEN    ;
  378.  
  379. : '             ( -- cfa )      
  380.                 DEFINED 0= ?MISSING   ;
  381.  
  382. : [']           ( -- )          
  383.                 ' COMPILE <'> X, ; IMMEDIATE
  384.  
  385. : [COMPILE]     ( -- )          
  386.                 ' X,   ; IMMEDIATE
  387.  
  388. VARIABLE  "BUF 132 ALLOT
  389.  
  390. : XEVEN         ( xdp -- xdp_even ) 
  391.                 DUP 1 AND + ;
  392.  
  393. : XALIGN        ( -- ) 
  394.                 XHERE NIP 1 AND XDP +! ;
  395.  
  396. : X>"BUF        ( -- "buf )
  397.                 2R>
  398.                 2R@ 2DUP C@L 1+ DUP XEVEN R> + >R
  399.                         ?CS: "BUF ROT CMOVEL
  400.                 2>R "BUF ;
  401.  
  402. : (")           ( -- addr len )
  403.                 2R@ @L COUNT R> 2+ >R ;
  404.  
  405. : (X")           ( -- addr len )
  406.                 X>"BUF COUNT ;
  407.  
  408. : %(.")         ( -- )
  409.                 2R@ 2DUP C@L >R 1+ R@ TYPEL R> 1+ XEVEN R> + >R ;
  410.  
  411. DEFER (.")      ' %(.") IS (.")
  412.  
  413. : ,"            ( -- )
  414.                 ASCII " PARSE TUCK HERE PLACE 1+ ALLOT ;
  415.  
  416. : X,"           ( -- )
  417.                 ASCII " PARSE HERE PLACE
  418.                 ?CS: HERE DUP C@ 1+ >R XHERE R@ CMOVEL
  419.                 R> XEVEN XDP +! ;
  420.  
  421. : ."            ( -- )          COMPILE (.") X,"   ;   IMMEDIATE
  422.  
  423. : "             ( -- )          COMPILE (")  HERE X, ,"   ;   IMMEDIATE
  424.  
  425. : ""            ( -- )          COMPILE (X")  X,"   ;   IMMEDIATE
  426.  
  427. : ">$           ( a1 -- a2 )    
  428.                 DROP 1- ;
  429.  
  430. VARIABLE FENCE
  431.  
  432. : TRIM          ( faddr voc-addr -- )
  433.                 #THREADS 0
  434.                 DO      2DUP @ BEGIN   2DUP U> NOT WHILE Y@ REPEAT
  435.                         NIP OVER ! 2+
  436.                 LOOP    2DROP   ;
  437.  
  438. : (FRGET)       ( code-addr view-addr -- )
  439.                 DUP FENCE @ U< ABORT" Below fence"  ( ca va )
  440.                 OVER VOC-LINK @ BEGIN   2DUP U< WHILE   @ REPEAT
  441.                 DUP VOC-LINK !  ( ca va ca pt ) NIP
  442.                 BEGIN   DUP WHILE   2DUP #THREADS 2* - TRIM   @   REPEAT
  443.                 DROP    YDP !
  444.                 DUP 1+ @ OVER >BODY +
  445.                 (LIT)   TRIM DUP 1+ @ SWAP >BODY + =    \ If it's a : def
  446.                 IF      DUP >BODY @ +XSEG XDPSEG !   \ Set back XHERE too!
  447.                         XDP OFF
  448.                 THEN    DP !  ;
  449.  
  450. DEFER ?ERROR
  451.  
  452.                                         \ 07/03/89 TJZ
  453. : (ABORT")      ( f -- )                \ if f1 true, then display inline
  454.                 ?DUP                    \ compiled message from LIST space
  455.                 IF
  456.                         X>"BUF COUNT ROT ?ERROR
  457.                 ELSE    2R@ C@L 1+ XEVEN R> + >R
  458.                 THEN    ;
  459.  
  460. : ABORT"        ( -- )   
  461.                 COMPILE (ABORT") X," ;   IMMEDIATE
  462.  
  463. : ABORT         ( -- )   
  464.                 TRUE ABORT" "  ;
  465.  
  466. : FORGET        ( -- )
  467.                 BL WORD ?UPPERCASE DUP CURRENT @ HASH @
  468.                 (FIND) 0= ?MISSING DUP >VIEW (FRGET) ;
  469.  
  470. : ?CONDITION    ( f -- )        
  471.                 NOT ABORT" Conditionals Wrong"   ;
  472.  
  473. : >MARK         ( -- addr )     
  474.                 XHERE NIP 0 X,   ;
  475.  
  476. : >RESOLVE      ( addr -- )     
  477.                 XHERE -ROT SWAP !L   ;
  478.  
  479. : <MARK         ( -- addr )     
  480.                 XHERE NIP ;
  481.  
  482. : <RESOLVE      ( addr -- )     
  483.                 X, ;
  484.  
  485. : ?>MARK        ( -- f addr )   
  486.                 TRUE >MARK   ;
  487.  
  488. : ?>RESOLVE     ( f addr -- )   
  489.                 SWAP ?CONDITION >RESOLVE  ;
  490.  
  491. : ?<MARK        ( -- f addr )   
  492.                 TRUE   <MARK   ;
  493.  
  494. : ?<RESOLVE     ( f addr -- )   
  495.                 SWAP ?CONDITION <RESOLVE  ;
  496.  
  497. comment:
  498.         LEAVE and ?LEAVE could be non-immediate in this system, but the 83
  499.         standard specifies an immediate LEAVE, so they  both are for
  500.         uniformity.
  501. comment;
  502.  
  503. : LEAVE         ( -- )
  504.                 COMPILE (LEAVE)  ; IMMEDIATE
  505.  
  506. : ?LEAVE        ( f1 -- )
  507.                 COMPILE (?LEAVE) ; IMMEDIATE
  508.  
  509. comment:
  510.         BEGIN, THEN, DO ?DO, LOOP, +LOOP, UNTIL, AGAIN, REPEAT, IF ELSE,
  511.         WHILE: These are the compiling words needed to properly compile the
  512.         Forth Conditional Structures. Each of them is immediate and they
  513.         must compile their runtime routines along withwhatever addresses
  514.         they need. A modest amount of errorchecking is done. If you want to
  515.         rip out the error checking change the ?> and ?< words to > and <
  516.         words, and all of the 2DUPs to DUPs and the 2SWAPs to SWAPs. The
  517.         rest should stay the same.
  518.  
  519.         DOAGAIN, DOTHEN, DOBEGIN, ?UNTIL & ?WHILE are words that are NOOPs
  520.         , or equivalant to ?BRANCH. They are provided to make it easier for
  521.         the Decompiler to know where the control structures start and end.
  522. comment;
  523.  
  524. : BEGIN         ( -- )
  525.                 COMPILE DOBEGIN ?<MARK                          ; IMMEDIATE
  526.  
  527. : AGAIN         ( -- ) 
  528.                 COMPILE DOAGAIN ?<RESOLVE                       ; IMMEDIATE
  529.  
  530. : UNTIL         ( n -- )
  531.                 COMPILE ?UNTIL  ?<RESOLVE                       ; IMMEDIATE
  532.  
  533. : WHILE         ( n -- )
  534.                 COMPILE ?WHILE ?>MARK 2SWAP ( <- added )        ; IMMEDIATE
  535.  
  536. : REPEAT        ( -- )       ( 2SWAP removed ) 
  537.                 COMPILE DOREPEAT ?<RESOLVE ?>RESOLVE            ; IMMEDIATE
  538.  
  539. : DO            ( lim start -- )
  540.                 COMPILE (DO)   ?>MARK                           ; IMMEDIATE
  541.  
  542. : ?DO           ( lim start -- ) 
  543.                 COMPILE (?DO)  ?>MARK                           ; IMMEDIATE
  544.  
  545. : LOOP          ( -- )
  546.                 COMPILE (LOOP)  2DUP 2+ ?<RESOLVE ?>RESOLVE     ; IMMEDIATE
  547.  
  548. : +LOOP         ( n -- )
  549.                 COMPILE (+LOOP) 2DUP 2+ ?<RESOLVE ?>RESOLVE     ; IMMEDIATE
  550.  
  551. : IF            ( n -- ) 
  552.                 COMPILE  ?BRANCH  ?>MARK                        ; IMMEDIATE
  553.  
  554. : ELSE          ( -- ) 
  555.                 COMPILE  BRANCH ?>MARK  2SWAP ?>RESOLVE         ; IMMEDIATE
  556.  
  557. : THEN          ( -- ) 
  558.                 COMPILE DOTHEN ?>RESOLVE                        ; IMMEDIATE
  559.  
  560. : FORWARD       ( -- )
  561.                 COMPILE BRANCH ?>MARK                           ; IMMEDIATE
  562.  
  563. : CONTINUE      ( -- )
  564.                 2OVER [COMPILE] REPEAT                          ; IMMEDIATE
  565.  
  566. : BREAK         ( -- ) 
  567.                 COMPILE EXIT [COMPILE] THEN                     ; IMMEDIATE
  568.  
  569. : AFT           ( -- )
  570.                 2DROP [COMPILE] FORWARD ?<MARK 2SWAP            ; IMMEDIATE
  571.  
  572. : FOR           ( n1 -- )
  573.                 COMPILE >R ?<MARK                               ; IMMEDIATE
  574.  
  575. : NEXT          ( -- )
  576.                 COMPILE NEXT| ?<RESOLVE                         ; IMMEDIATE
  577.  
  578. : ,VIEW         ( -- )  
  579.                 LOADLINE @ Y, ;
  580.  
  581. HEADERLESS
  582.  
  583. : NOHEADROOM    ( -- )
  584.                 TRUE ABORT" Out of HEAD memory!" ;
  585.  
  586. : NOLISTROOM    ( -- )
  587.                 TRUE ABORT" Out of LIST memory!" ;
  588.  
  589. HEADERS
  590.  
  591. CODE SPCHECK    ( -- f1 f2 )           \ HEAD AND LIST SPACE CHECK
  592.                 MOV AX, YDP             \ get head DP
  593.                 SHR AX, # 1             \ convert to ssegment
  594.                 SHR AX, # 1
  595.                 SHR AX, # 1
  596.                 SHR AX, # 1
  597.                 ADD AX, # 6             \ add 6 segments for headroom
  598.                 CMP AX, ' #HEADSEGS >BODY \ are we out of space yet
  599.              >  IF      MOV AX, # ' NOHEADROOM
  600.                         JMP AX
  601.                 THEN
  602.                 MOV AX, XDPSEG          \ load up LIST segment
  603.                 SUB AX, XSEG            \ convert to size of list so far
  604.                 ADD AX, # 6             \ add 6 for headroom
  605.                 CMP AX, ' #LISTSEGS >BODY \ are we out of space yet
  606.              >  IF      MOV AX, # ' NOLISTROOM
  607.                         JMP AX
  608.                 THEN
  609.                 NEXT
  610.                 END-CODE
  611.  
  612. : %ALREADY_DEF  ( a1 -- a1 )   \ Is the word at A1 already defined?
  613.                 WARNING @
  614.                 IF      DUP FIND NIP
  615.                         IF      DUP  CR  COUNT TYPE ."  isn't unique "
  616.                         THEN
  617.                 THEN    ;       ( str )
  618.  
  619. DEFER ?ALREADY_DEF      ' %ALREADY_DEF IS ?ALREADY_DEF
  620.  
  621. : "HEADER       ( str-addr -- )
  622.                 SPCHECK
  623.                 DUP C@ 31 > ABORT" Name TOO LONG, > 31 chars!"
  624.                 ?ALREADY_DEF
  625.                 ALIGN  YHERE 2- Y@ CNHASH  HERE CNHASH  <>
  626.                 IF      YHERE HERE CNHASH DUP Y@ ROT UMIN SWAP
  627.                         Y! ( >NAME hash entry )
  628.                 THEN    ,VIEW
  629.                 YHERE OVER CURRENT @ HASH DUP @  Y,  ( link  ) ! ( current )
  630.                 YHERE LAST ! ( remember nfa )
  631.                 YHERE ?CS: ROT  DUP C@  WIDTH @  MIN 1+ >R  ( yh cs str )
  632.                 YHERE YS: R@ CMOVEL ( copy str ) R> YDP +! ALIGN ( nam )
  633.                 128 SWAP YCSET   128 YHERE 1- YCSET   ( delimiter Bits )
  634.                 HERE Y, ( CFA in header )
  635.                 YHERE HERE CNHASH 2+ Y! ( valid stopper in next n hash entry)
  636.                 ;
  637.  
  638. : ,CALL         ( -- )
  639.                 232 C, 0 HERE 2+ - , ;        \ Compiles addr 0000 !!!!
  640.  
  641. : ,JUMP         ( -- )
  642.                 233 C, 0 HERE 2+ - , ;
  643.  
  644. : <HEADER>      ( | name -- )
  645.                 BL WORD ?UPPERCASE "HEADER ;
  646.  
  647. DEFER HEADER    ' <HEADER> IS HEADER
  648.  
  649. : "CREATE       ( str-addr -- )
  650.                 "HEADER ,CALL ;USES >NEXT ,-X
  651.  
  652. : CREATE        ( | name -- )  
  653.                 HEADER ,CALL ;USES >NEXT ,-X
  654.  
  655. : !CSP          ( -- )  
  656.                 SP@ CSP !   ;
  657.  
  658. : ?CSP          ( -- )  
  659.                 SP@ CSP @ <> ABORT" Stack Changed"   ;
  660.  
  661. : HIDE          ( -- )  
  662.                 LAST @ DUP N>LINK Y@ SWAP CURRENT @ YHASH ! ;
  663.  
  664. : REVEAL        ( -- )  
  665.                 LAST @ DUP N>LINK    SWAP CURRENT @ YHASH ! ;
  666.  
  667. : (;USES)       ( -- )
  668.                 2R> @L LAST @ NAME> dup>r 3 + - R> 1+ ! ;
  669.  
  670. : (;CODE)       ( -- )
  671.                 2R> @L LAST @ NAME>
  672.                 dup>r 232 ( CALL ) R@ C!       \ Make a CALL not JUMP
  673.                 3 + - R> 1+ !  ;
  674.  
  675. : DOES>         ( -- )
  676.                 COMPILE (;CODE) HERE X, 232 ( CALL ) C,
  677.                 [ [FORTH] ASSEMBLER DODOES META ] LITERAL
  678.                 HERE 2+ - , XHERE PARAGRAPH + DUP XDPSEG !
  679.                 XSEG @ - , XDP OFF ; IMMEDIATE
  680.  
  681. VOCABULARY ASSEMBLER
  682.  
  683. DEFER SETASSEM  \ Setup for assembly stuff to follow
  684.  
  685. ' NOOP IS SETASSEM
  686.  
  687. : [             ( -- )  
  688.                 STATE OFF   ;   IMMEDIATE
  689.  
  690. : ;USES         ( -- )  
  691.                 ?CSP   COMPILE  (;USES)
  692.                 [COMPILE] [   REVEAL   ASSEMBLER   ; IMMEDIATE
  693.  
  694. : ;CODE         ( -- )  
  695.                 ?CSP   COMPILE  (;CODE) HERE X,
  696.                 [COMPILE] [   REVEAL   SETASSEM ; IMMEDIATE
  697.  
  698. : (])           ( -- )
  699.                 STATE ON
  700.                 BEGIN   ?STACK  DEFINED DUP
  701.                         IF      0>
  702.                                 IF      EXECUTE   ELSE   X,   THEN
  703.                         ELSE    DROP    NUMBER  DOUBLE?
  704.                                 IF           [COMPILE] DLITERAL
  705.                                 ELSE    DROP [COMPILE] LITERAL
  706.                                 THEN
  707.                         THEN    TRUE    DONE?
  708.                 UNTIL   ;
  709.  
  710. DEFER ]         ' (]) IS ]
  711.  
  712. : MAKEDUMMY     ( name -- )
  713.                 HEADER ,JUMP
  714.                 XHERE PARAGRAPH +       \ absolute paragraph of new def
  715.                 DUP XDPSEG !            \ set new XHERE segment
  716.                 XSEG @ - ,              \ compile relative paragraph of def
  717.                 XDP OFF
  718.                 COMPILE UNNEST
  719.                 ;USES  NEST ,-X
  720.  
  721. : ANEW          ( name -- )
  722.                 >IN @ >R DEFINED NIP  R@ >IN !
  723.                 IF      FORGET
  724.                 THEN    R> >IN !  MAKEDUMMY   ;
  725.                                                         \ Add if needed
  726. : (:)           ( -- )
  727.                 !CSP   CURRENT @ CONTEXT !
  728.                 HEADER ,JUMP
  729.                 XHERE PARAGRAPH +
  730.                 DUP XDPSEG !
  731.                 XSEG @ - ,
  732.                 XDP OFF
  733.                 HIDE
  734.                 ;USES   NEST ,-X
  735.  
  736. : :             ( -- )
  737.                 (:) ] ;
  738.  
  739. : ;             ( -- )
  740.                 STATE @ 0= ABORT" Not Compiling!"
  741.                 ?CSP   COMPILE UNNEST   REVEAL   [COMPILE] [  ; IMMEDIATE
  742.  
  743. : RECURSIVE     ( -- )   
  744.                 REVEAL ;   IMMEDIATE
  745.  
  746. : CONSTANT      ( n -- ) 
  747.                 HEADER ,JUMP ,     ;USES DOCONSTANT ,-X
  748.  
  749. : VALUE         ( n -- ) 
  750.                 HEADER ,JUMP ,     ;USES DOVALUE    ,-X
  751.  
  752. : VARIABLE      ( -- )   
  753.                 CREATE 0 ,         ;USES >NEXT      ,-X
  754.  
  755. : ARRAY         ( n1 -- )
  756.                 CREATE ALLOT       ;USES >NEXT      ,-X
  757.  
  758. : DEFER         ( -- )
  759.                 CREATE ['] CRASH , ;USES DODEFER    ,-X
  760.  
  761. DODEFER RESOLVES <DEFER>
  762.  
  763. : VOCABULARY    ( -- )  
  764.                 CREATE   #THREADS 0 DO   0 ,  LOOP
  765.                 HERE  VOC-LINK @ ,  VOC-LINK !
  766.                 DOES> CONTEXT !  ;
  767.  
  768.  RESOLVES <VOCABULARY>
  769.  
  770. : DEFINITIONS   ( -- ) 
  771.                 CONTEXT @ CURRENT !   ;
  772.  
  773. : 2CONSTANT     ( d1 | <name> -- )
  774.                 CREATE   , ,    ( d# -- )
  775.                 DOES> 2@   ;    ( -- d# )   DROP
  776.  
  777. : 2VARIABLE     ( | <name> -- )
  778.                 0 0 2CONSTANT   ( -- )
  779.                 DOES> ;         ( -- addr )   DROP
  780.  
  781. : <RUN>         ( -- )
  782.         STATE @ IF      ]
  783.                         STATE @ NOT
  784.                         IF   INTERPRET   THEN
  785.                 ELSE    INTERPRET   THEN   ;
  786.  
  787. DEFER RUN       ' <RUN> IS RUN
  788.  
  789. DEFER ERRFIX    ' NOOP IS ERRFIX
  790.  
  791. : (?ERROR)      ( adr len f -- )
  792.                 IF      ['] <RUN> IS RUN ERRFIX
  793.                         2>R SP0 @ SP!   PRINTING OFF
  794.                         2R> SPACE TYPE SPACE   QUIT
  795.                 ELSE    2DROP  THEN  ;
  796.  
  797. ' (?ERROR) IS ?ERROR
  798.  
  799.