home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / FFA.ZIP / KERNEL1.SEQ < prev    next >
Encoding:
Text File  |  1988-01-11  |  25.9 KB  |  825 lines

  1. \ KERNEL86.SEQ  Source code for SKERNEL.COM,   modified by Tom Zimmer
  2.  
  3. ONLY FORTH   META ALSO FORTH
  4.  
  5. FALSE   CONSTANT INLINE_NEXT    \ Enable Inline NEXT
  6.  
  7. : ?.INLINE      ( --- )         \ Print state of INLINE_NEXT
  8.                 CR ." NEXT is currently " INLINE_NEXT >REV
  9.                 IF      [ASSEMBLER] INLINEON  [FORTH]
  10.                         ."  INLINE. "
  11.                 ELSE    [ASSEMBLER] INLINEOFF [FORTH]
  12.                         ."  NOT " >NORM ."  INLINE. "
  13.                 THEN    >NORM CR ;
  14. ?.INLINE
  15.  
  16. 256 DP-T !      \ Set Dictionary pointer
  17.   0 DP-X !      \ Set LIST DP
  18.  
  19. HERE   6000 + ' TARGET-ORIGIN >BODY !
  20.  
  21. IN-META
  22.  
  23. : ]]   ]   ;
  24. : [[   [COMPILE] [   ; FORTH IMMEDIATE META
  25.  
  26. FORWARD: DEFINITIONS
  27. FORWARD: [
  28.  
  29. LABEL ORIGIN    JMP HERE 8000 + \ jump to cold start: will be patched
  30.                 JMP HERE 8000 + \ jump to warm start: will be patched
  31.                 END-CODE
  32.  
  33. LABEL DPUSH     PUSH DX         END-CODE
  34. LABEL APUSH     PUSH AX         END-CODE
  35. LABEL >NEXT     LODSW ES:
  36.                 JMP AX          END-CODE
  37.  
  38. \ Create the FORTH vocabulary as the first definition in dictionary.
  39.  
  40. HERE-T ,-Y                      \ valid "previous" CFA for "CREATE
  41.  
  42. HERE-Y HERE-T CNHASH !-Y        \ first entry in >NAME hash table
  43.  
  44. HERE-T DUP 100 + CURRENT-T !    \ harmless
  45.  
  46. HERE-Y VOCABULARY FORTH   FORTH DEFINITIONS
  47.  
  48.                                 \ #THREADS - 1 = 127 the mask.
  49. 0 OVER 2+ !-Y ( link )          \ ASCII F     15 AND = 6
  50.                                 \ ASCII F 5 + 127 AND = 75
  51. 2+ SWAP  >BODY-T
  52. ASCII F 5 +                     \ hash is first char + length
  53. #TTHREADS 1- AND 2*             \ Determine which thread FORTH goes in.
  54. \ ( 12 ) 150
  55. + !-T ( thread 75 )  IN-META
  56.  
  57. VOCABULARY FILES
  58.  
  59. FILES DEFINITIONS
  60.  
  61. \ Create the linked list of files that have been loaded.
  62.  
  63. VARIABLE KERNEL1.SEQ
  64.  
  65. FORTH DEFINITIONS
  66.  
  67. LABEL NEST              \ JMP = 15 cycles  CALL = 19 cycles
  68.         DEC RP          \ DEC =  3 cycles
  69.         DEC RP          \        3 cycles
  70.         MOV 0 [RP], IP  \ MOV = 14 cycles
  71.         MOV DI, AX      \ * POP =  8 cycles
  72.         MOV IP, 3 [DI]  \ *
  73.         NEXT
  74.         END-CODE
  75. META
  76.  
  77. CODE EXIT     ( -- )
  78.         MOV IP, 0 [RP]  \ MOV = 13 cycles
  79.         INC RP          \ INC =  3 cycles
  80.         INC RP          \        3 cycles
  81.         NEXT
  82.         END-CODE
  83.  
  84. CODE UNNEST   ( --- )
  85.         MOV IP, 0 [RP]  INC RP          INC RP
  86.         NEXT            END-CODE
  87.  
  88. LABEL DODOES
  89.         DEC RP
  90.         DEC RP
  91.         MOV 0 [RP], IP
  92.         POP DI
  93.         MOV IP, 0 [DI]
  94.         NEXT            END-CODE
  95.  
  96. VARIABLE UP
  97.  
  98. LABEL DOCONSTANT
  99.         POP BX          PUSH 0 [BX]
  100.         NEXT            END-CODE
  101.  
  102. LABEL DOUSER-VARIABLE
  103.         POP BX          MOV AX, 0 [BX]  ADD AX, UP
  104.         1PUSH           END-CODE
  105.  
  106. CODE (LIT)      ( -- n )
  107.                 LODSW ES:       1PUSH           END-CODE
  108.  
  109. T: LITERAL      ( n -- ) [TARGET] (LIT)   ,-X   T;
  110. T: DLITERAL     ( d -- ) [TARGET] (LIT) ,-X   [TARGET] (LIT) ,-X   T;
  111. T: ASCII        ( -- )   [COMPILE] ASCII [[ TRANSITION ]] LITERAL [META]  T;
  112. T: [']          ( -- )   'T >BODY @
  113.                          [[ TRANSITION ]] LITERAL  [META]   T;
  114. : CONSTANT      ( n -- )
  115.                 RECREATE   232 C,-T
  116.                 [[ ASSEMBLER DOCONSTANT ]] LITERAL HERE 2+ - ,-T
  117.                 DUP ,-T   CONSTANT   ;
  118.  
  119. FORWARD: <(;CODE)>
  120. T: DOES>        ( -- )
  121.                 [FORWARD] <(;CODE)> HERE-T ,-X
  122.                 HERE-T  ( DOES-OP ) 232 C,-T
  123.                 [[ ASSEMBLER DODOES ]] LITERAL HERE 2+ - ,-T
  124.                 HERE-X ,-T T;
  125.  
  126. : NUMERIC   ( -- )
  127.                 [FORTH] HERE [META] NUMBER   DPL @ 1+
  128.                 IF      [[ TRANSITION ]] DLITERAL [META]
  129.                 ELSE    DROP   [[ TRANSITION ]] LITERAL [META]   THEN  ;
  130.  
  131. : UNDEFINED     ( -- )
  132.                 HERE-X   0 ,-X
  133.                 IN-FORWARD  [FORTH] CREATE [META] TRANSITION
  134.                 [FORTH] ,   FALSE ,   [META]
  135.                 DOES>   FORWARD-CODE   ;
  136.  
  137. [FORTH] VARIABLE T-IN      META
  138.  
  139. : ]             ( -- )
  140.                 STATE-T ON   IN-TRANSITION
  141.         BEGIN   >IN @ T-IN !
  142.                 BEGIN   BL WORD DUP C@ 0=       \ If nothing in line
  143.                         ?FILLBUFF               \ Optionally refill buffer
  144.                         INLEN @ 0> AND          \ and input buf not empty
  145.                 WHILE   DROP FILLTIB            \ refill the buffer
  146.                 REPEAT  ?UPPERCASE FIND
  147.                 IF      EXECUTE
  148.                 ELSE    COUNT NUMERIC?
  149.                         IF      NUMERIC
  150.                         ELSE    T-IN @ >IN !   UNDEFINED
  151.                         THEN
  152.                 THEN    STATE-T @ 0=
  153.         UNTIL ;
  154.  
  155. T: [   ( -- )   IN-META   STATE-T OFF   T;
  156. T: ;   ( -- )   [TARGET] UNNEST   [[ TRANSITION ]] [   T;
  157.  
  158.  : :   ( -- )   TARGET-CREATE   233 C,-T        \ a JUMP instruction
  159.                 [[ ASSEMBLER NEST ]] LITERAL HERE 2+ - ,-T
  160.                 HERE-X ,-T ] ;                  \ Compile body address
  161.  
  162. ASSEMBLER CLEAR_LABELS META
  163.  
  164. CODE DOBEGIN    ( -- )  \ REALLY A NOOP
  165.                 NEXT    END-CODE
  166.  
  167. CODE DOTHEN     ( -- )  \ REALLY A NOOP
  168.                 NEXT    END-CODE
  169.  
  170. CODE DOAGAIN    ( -- )
  171.                 MOV ES: IP, 0 [IP]
  172.                 NEXT           END-CODE
  173.  
  174. CODE DOREPEAT   ( -- )
  175. LABEL DOREP1    MOV ES: IP, 0 [IP]
  176.                 NEXT           END-CODE
  177.  
  178. CODE ?WHILE     ( f -- )
  179.                 POP AX          OR AX, AX
  180.                 JE DOREP1
  181.                 INC IP          INC IP
  182.                 NEXT            END-CODE
  183.  
  184. CODE ?UNTIL     ( f -- )
  185.                 POP AX          OR AX, AX
  186.                 JE DOREP1
  187.                 INC IP          INC IP
  188.                 NEXT            END-CODE
  189.  
  190. CODE BRANCH     ( -- )
  191. LABEL BRAN1     MOV ES: IP, 0 [IP]
  192.                 NEXT            END-CODE
  193.  
  194. CODE ?BRANCH    ( f -- )
  195.                 POP AX          OR AX, AX
  196.                 JE BRAN1
  197.                 INC IP          INC IP
  198.                 NEXT            END-CODE
  199.  
  200. T: BEGIN        [TARGET] DOBEGIN X?<MARK   T;
  201. T: AGAIN        [TARGET] DOAGAIN X?<RESOLVE   T;
  202. T: UNTIL        [TARGET] ?UNTIL  X?<RESOLVE   T;
  203. T: IF           [TARGET] ?BRANCH X?>MARK      T;
  204. T: THEN         [TARGET] DOTHEN  X?>RESOLVE    T;
  205. T: ELSE         [TARGET] BRANCH  X?>MARK   2SWAP X?>RESOLVE   T;
  206. T: WHILE        [TARGET] ?WHILE  X?>MARK   T;
  207. T: REPEAT       2SWAP [TARGET] DOREPEAT X?<RESOLVE X?>RESOLVE T;
  208.  
  209. LABEL LOOPEXIT  ( --- )
  210.                 ADD RP, # 6     INC IP          INC IP
  211.                 NEXT            END-CODE
  212.  
  213. CODE (LOOP)     ( -- )
  214.                 INC 0 [RP] WORD
  215.                 JO LOOPEXIT
  216.                 MOV ES: IP, 0 [IP]
  217.                 NEXT            END-CODE
  218.  
  219. CODE (+LOOP)    ( n -- )
  220.                 AX POP          ADD 0 [RP], AX
  221.                 JO LOOPEXIT     MOV ES: IP, 0 [IP]
  222.                 NEXT            END-CODE
  223.  
  224. HEX
  225. CODE (DO)       ( l i -- )
  226.                 POP AX          POP BX
  227. LABEL PDO1      DEC RP          DEC RP
  228.                 MOV ES: DX, 0 [IP]
  229.                 MOV 0 [RP], DX
  230.                 INC IP          INC IP
  231.                 ADD BX, # 8000
  232.                 DEC RP          DEC RP
  233.                 MOV 0 [RP], BX  SUB AX, BX
  234.                 DEC RP          DEC RP
  235.                 MOV 0 [RP], AX
  236.                 NEXT            END-CODE
  237. DECIMAL
  238.  
  239. CODE (?DO)      ( l i -- )
  240.                 POP AX          POP BX
  241.                 CMP BX, AX
  242.                 JNE PDO1        MOV ES: IP, 0 [IP]
  243.                 NEXT            END-CODE
  244.  
  245.  
  246. CODE (OF)       ( n1 n2 -- n1 )  ( or )  ( n1 n1 -- )
  247.                 POP AX          XCHG SP, RP     CMP AX, 0 [RP]
  248.         0= IF
  249.                 XCHG RP, SP     POP AX
  250.                 INC IP          INC IP          NEXT
  251.         ELSE
  252.                 XCHG RP, SP     MOV ES: IP, 0 [IP]
  253.                 NEXT
  254.         THEN
  255.                 END-CODE
  256.  
  257. CODE BOUNDS     ( n1 n2 --- n3 n4 )
  258.                 POP DX          POP AX          ADD DX, AX
  259.                 2PUSH           END-CODE
  260.  
  261. T: ?DO          [TARGET] (?DO)   X?>MARK   T;
  262. T: DO           [TARGET] (DO)    X?>MARK   T;
  263. T: LOOP         [TARGET] (LOOP)    2DUP 2+   X?<RESOLVE   X?>RESOLVE   T;
  264. T: +LOOP        [TARGET] (+LOOP)   2DUP 2+   X?<RESOLVE   X?>RESOLVE   T;
  265.  
  266. ASSEMBLER >NEXT META CONSTANT >NEXT
  267.  
  268. CODE EXECUTE    ( cfa -- )
  269.                 POP AX          JMP AX          END-CODE
  270.  
  271. CODE PERFORM    ( addr-of-cfa -- )
  272. LABEL DODEFER   POP BX          MOV AX, 0 [BX]
  273.                 JMP AX          END-CODE
  274.  
  275. CODE XPERFORM   ( Xaddr-of-cfa -- )
  276.                 POP BX          MOV ES: AX, 0 [BX]
  277.                 JMP AX          END-CODE
  278.  
  279. LABEL DOUSER-DEFER
  280.                 POP BX          MOV BX, 0 [BX]
  281.                 ADD BX, UP      MOV AX, 0 [BX]
  282.                 JMP AX          END-CODE
  283.  
  284. CODE GO         RET             END-CODE        ( ADDR --- )
  285. CODE NOOP       NEXT            END-CODE
  286. CODE PAUSE      NEXT            END-CODE
  287.  
  288. CODE I ( -- n ) MOV AX, 0 [RP]  ADD AX, 2 [RP]
  289.                 1PUSH           END-CODE
  290.  
  291. CODE J ( -- n ) MOV AX, 6 [RP]  ADD AX, 8 [RP]
  292.                 1PUSH           END-CODE
  293.  
  294. DECIMAL
  295.  
  296. CODE (LEAVE)    ( -- )
  297. LABEL PLEAVE    ADD RP, # 4     MOV IP, 0 [RP]
  298.                 INC RP          INC RP
  299.                 NEXT            END-CODE
  300.  
  301. CODE (?LEAVE)   ( f -- )
  302.                 POP AX          OR AX, AX       JNE PLEAVE
  303.                 NEXT            END-CODE
  304.  
  305. T: LEAVE        [TARGET] (LEAVE)   T;
  306. T: ?LEAVE       [TARGET] (?LEAVE)  T;
  307.  
  308. CODE @  ( addr -- n )
  309.                 POP BX          PUSH 0 [BX]
  310.                 NEXT            END-CODE
  311.  
  312. CODE !  ( n addr -- )
  313.                 POP BX          POP 0 [BX]
  314.                 NEXT            END-CODE
  315.  
  316. CODE C@ ( addr -- char )
  317.                 POP BX          SUB AX, AX      MOV AL, 0 [BX]
  318.                 1PUSH           END-CODE
  319.  
  320. CODE C! ( char addr -- )
  321.                 POP BX          POP AX          MOV 0 [BX], AL
  322.                 NEXT            END-CODE
  323.  
  324. CODE CMOVE      (  from to count -- )
  325.                 CLD             MOV BX, IP      MOV AX, DS
  326.                 POP CX          POP DI          POP IP
  327.                 PUSH ES         MOV ES, AX
  328.                 REPNZ           MOVSB
  329.                 MOV IP, BX      POP ES
  330.                 NEXT            END-CODE
  331.  
  332. CODE CMOVE>     ( from to count -- )
  333.                 STD             MOV BX, IP      MOV AX, DS
  334.                 POP CX          DEC CX
  335.                 POP DI          POP IP
  336.                 ADD DI, CX      ADD IP, CX      INC CX
  337.                 PUSH ES         MOV ES, AX
  338.                 REPNZ           MOVSB
  339.                 MOV IP, BX      CLD             POP ES
  340.                 NEXT            END-CODE
  341.  
  342. CODE PLACE      ( from cnt to -- )
  343.                 POP BX          POP AX          MOV 0 [BX], AL
  344.                 INC BX          PUSH BX         PUSH AX
  345.                 CLD             MOV BX, IP      MOV AX, DS
  346.                 POP CX          POP DI          POP IP
  347.                 PUSH ES         MOV ES, AX
  348.                 REPNZ           MOVSB
  349.                 MOV IP, BX      POP ES
  350.                 NEXT            END-CODE
  351.  
  352. DECIMAL
  353.  
  354. CODE SP@        ( -- n )
  355.                 MOV AX, SP      1PUSH           END-CODE
  356.  
  357. CODE SP!        ( n -- )
  358.                 POP SP          NEXT            END-CODE
  359.  
  360. CODE RP@        ( -- addr )
  361.                 MOV AX, RP      1PUSH           END-CODE
  362.  
  363. CODE RP!        ( n -- )
  364.                 POP RP          NEXT            END-CODE
  365.  
  366. CODE DROP       ( n1 -- )
  367.                 POP AX          NEXT            END-CODE
  368.  
  369. CODE DUP        ( n1 -- n1 n1 )
  370.                 POP AX          PUSH AX
  371.                 1PUSH           END-CODE
  372.  
  373. CODE SWAP       ( n1 n2 -- n2 n1 )
  374.                 POP DX          POP AX
  375.                 2PUSH           END-CODE
  376.  
  377. CODE OVER       ( n1 n2 -- n1 n2 n1 )
  378.                 POP DX          POP AX
  379.                 PUSH AX         2PUSH           END-CODE
  380.  
  381. CODE TUCK       ( n1 n2 -- n2 n1 n2 )
  382.                 POP AX          POP DX
  383.                 PUSH AX         2PUSH           END-CODE
  384.  
  385. CODE NIP        ( n1 n2 -- n2 )
  386.                 POP AX          POP DX
  387.                 1PUSH           END-CODE
  388.  
  389. CODE ROT        ( n1 n2 n3 --- n2 n3 n1 )
  390.                 POP DX          POP BX          POP AX
  391.                 PUSH BX         2PUSH           END-CODE
  392.  
  393. CODE -ROT       ( n1 n2 n3 --- n3 n1 n2 )
  394.                 POP BX          POP AX          POP DX
  395.                 PUSH BX         2PUSH           END-CODE
  396.  
  397. CODE FLIP       ( n1 -- n2 )
  398.                 POP AX          XCHG AL, AH
  399.                 1PUSH           END-CODE
  400.  
  401. CODE ?DUP       ( n1 -- [n1] n1 )
  402.                 POP AX          CMP AX, # 0
  403.             0<> IF
  404.                 PUSH AX
  405.             THEN
  406.                 1PUSH           END-CODE
  407.  
  408. CODE R>         ( -- n )
  409.                 MOV AX, 0 [RP]  INC RP          INC RP
  410.                 1PUSH           END-CODE
  411.  
  412. CODE >R         ( n -- )
  413.                 POP AX          DEC RP          DEC RP
  414.                 MOV 0 [RP], AX  NEXT            END-CODE
  415.  
  416. CODE R@         ( -- n )
  417.                 MOV AX, 0 [RP]  1PUSH           END-CODE
  418.  
  419. CODE PICK       ( nm ... n2 n1 k -- nm ... n2 n1 nk )
  420.                 POP BX          SHL BX, # 1     ADD BX, SP
  421.                 MOV AX, 0 [BX]  1PUSH           END-CODE
  422.  
  423. CODE AND        ( n1 n2 -- n3 )
  424.                 POP BX          POP AX          AND AX, BX
  425.                 1PUSH           END-CODE
  426.  
  427. CODE OR         ( n1 n2 -- n3 )
  428.                 POP BX          POP AX          OR AX, BX
  429.                 1PUSH           END-CODE
  430.  
  431. CODE XOR        ( n1 n2 -- n3 )
  432.                 POP BX          POP AX          XOR AX, BX
  433.                 1PUSH           END-CODE
  434.  
  435. CODE NOT        ( n -- n' )
  436.                 POP AX          NOT AX
  437.                 1PUSH           END-CODE
  438.  
  439. -1 CONSTANT TRUE
  440.  0 CONSTANT FALSE
  441.  
  442. CODE CSET       ( b addr -- )
  443.                 POP BX          POP AX          OR 0 [BX], AL
  444.                 NEXT            END-CODE
  445.  
  446. CODE CRESET     ( b addr -- )
  447.                 POP BX          POP AX
  448.                 NOT AX          AND 0 [BX], AL
  449.                 NEXT            END-CODE
  450.  
  451. CODE CTOGGLE    ( b addr -- )
  452.                 POP BX          POP AX          XOR 0 [BX], AL
  453.                 NEXT            END-CODE
  454.  
  455. CODE ON         ( addr -- )
  456.                 POP BX          MOV 0 [BX], # TRUE WORD
  457.                 NEXT            END-CODE
  458.  
  459. CODE OFF        ( addr -- )
  460.                 POP BX          MOV 0 [BX], # FALSE WORD
  461.                 NEXT            END-CODE
  462.  
  463. CODE -1!        ( addr -- )
  464.                 POP BX          MOV 0 [BX], # TRUE WORD
  465.                 NEXT            END-CODE
  466.  
  467. CODE 0!         ( addr -- )
  468.                 POP BX          MOV 0 [BX], # FALSE WORD
  469.                 NEXT            END-CODE
  470.  
  471. CODE INCR       ( A1 --- )
  472.                 POP BX          INC 0 [BX] WORD
  473.                 NEXT            END-CODE
  474.  
  475. CODE DECR       ( A1 --- )
  476.                 POP BX          DEC 0 [BX] WORD
  477.                 NEXT            END-CODE
  478.  
  479. CODE +          ( n1 n2 -- sum )
  480.                 POP BX          POP AX          ADD AX, BX
  481.                 1PUSH           END-CODE
  482.  
  483. CODE NEGATE     ( n -- n' )
  484.                 POP AX          NEG AX
  485.                 1PUSH           END-CODE
  486.  
  487. CODE -          ( n1 n2 -- n1-n2 )
  488.                 POP BX          POP AX          SUB AX, BX
  489.                 1PUSH           END-CODE
  490.  
  491. CODE ABS        ( n -- n )
  492.                 POP AX          OR AX, AX
  493.              0< IF
  494.                 NEG AX
  495.              THEN
  496.                 1PUSH           END-CODE
  497.  
  498. CODE 2+!        ( d addr -- )
  499.                 POP BX          POP AX          POP DX
  500.                 ADD 0 [BX], DX  ADC 2 [BX], AX
  501.                 NEXT            END-CODE
  502.  
  503. CODE +!         ( n addr -- )
  504.                 POP BX          POP AX          ADD 0 [BX], AX
  505.                 NEXT            END-CODE
  506.  
  507. CODE C+!        ( n addr -- )
  508.                 POP BX          POP AX          ADD 0 [BX], AL
  509.                 NEXT            END-CODE
  510.  
  511.  
  512. \ Since the 8086 has a seperate IO path, we define a Forth
  513. \ interface to it.  Use P@ and P! to read or write directly to
  514. \ the 8086 IO ports.
  515.  
  516. CODE PC@        ( port# -- n )
  517.                 POP DX          IN DX, AL       SUB AH, AH
  518.                 PUSH AX         NEXT            END-CODE
  519.  
  520. CODE P@         ( port# -- n )
  521.                 POP DX          IN DX, AX       PUSH AX
  522.                 NEXT            END-CODE
  523.  
  524. CODE PC!        ( n port# -- )
  525.                 POP DX          POP AX          OUT AL, DX
  526.                 NEXT            END-CODE
  527.  
  528. CODE P!         ( n port# -- )
  529.                 POP DX          POP AX          OUT AX, DX
  530.                 NEXT            END-CODE
  531.  
  532.                 \ read drive path into addr, null terminated.
  533. CODE PDOS       ( addr drive --- f1 ) \ RETURN PATH OF DRIVE
  534.                 pop dx          pop ax
  535.                 push si         mov si, ax
  536.                 mov ah, # 71    int 33
  537.              u< if
  538.                 mov al, # 1
  539.              else
  540.                 mov al, # 0
  541.              then
  542.                 sub ah, ah      pop si
  543.                 1push           end-code
  544.  
  545.  0 CONSTANT 0
  546.  1 CONSTANT 1
  547.  2 CONSTANT 2
  548.  3 CONSTANT 3
  549. 64 CONSTANT 64
  550.  
  551. #TTHREADS CONSTANT #THREADS
  552.  
  553. CODE 2*         ( n -- 2*n )
  554.                 POP AX          SHL AX, # 1
  555.                 1PUSH           END-CODE
  556.  
  557. CODE 2/         ( n -- n/2 )
  558.                 POP AX          SAR AX, # 1
  559.                 1PUSH           END-CODE
  560.  
  561. CODE U2/        ( u -- u/2 )
  562.                 POP AX          SHR AX, # 1
  563.                 1PUSH           END-CODE
  564.  
  565. CODE 8*         ( n -- 8*n )
  566.                 POP AX          SHL AX, # 1
  567.                 SHL AX, # 1     SHL AX, # 1
  568.                 1PUSH           END-CODE
  569.  
  570.                 ( n1 --- n2 )
  571. CODE 1+         POP AX          INC AX
  572.                 1PUSH           END-CODE
  573.  
  574. CODE 2+         POP AX          INC AX
  575.                 INC AX          1PUSH           END-CODE
  576.  
  577. CODE 1-         POP AX          DEC AX
  578.                 1PUSH           END-CODE
  579.  
  580. CODE 2-         POP AX          DEC AX          DEC AX
  581.                 1PUSH           END-CODE
  582.  
  583. CODE UM*        ( n1 n2 -- d )
  584.                 POP AX          POP BX          MUL BX
  585.                 XCHG DX, AX     2PUSH           END-CODE
  586.  
  587. CODE *          ( N1 N2 -- N3 )
  588.                 POP AX          POP BX          MUL BX
  589.                 1PUSH           END-CODE
  590.  
  591. : U*D           ( n1 n2 -- d )  UM*   ;
  592.  
  593. CODE UM/MOD     ( d1 n1 -- Remainder Quotient )
  594.                 POP BX          POP DX          POP AX
  595.                 CMP DX, BX
  596.             U>=  ( divide by zero? )
  597.             IF
  598.                 MOV AX, # -1    MOV DX, AX      2PUSH
  599.             THEN
  600.                 DIV BX          2PUSH           END-CODE
  601.  
  602. LABEL YES       MOV AX, # TRUE  1PUSH           END-CODE
  603.  
  604. CODE 0=         ( n -- f )
  605.                 POP AX          OR AX, AX
  606.                 JE YES
  607.                 SUB AX, AX      1PUSH           END-CODE
  608.  
  609. CODE 0<         ( n -- f )
  610.                 POP AX          OR AX, AX
  611.                 JS YES
  612.                 SUB AX, AX      1PUSH           END-CODE
  613.  
  614. CODE 0>         ( n -- f )
  615.                 POP AX          OR AX, AX
  616.                 JG YES
  617.                 SUB AX, AX      1PUSH           END-CODE
  618.  
  619. CODE 0<>        ( n -- f )
  620.                 POP AX          OR AX, AX
  621.                 JNE YES
  622.                 SUB AX, AX      1PUSH           END-CODE
  623.  
  624. CODE =          ( n1 n2 -- f )
  625.                 POP AX          POP BX          CMP BX, AX
  626.                 JE YES
  627.                 SUB AX, AX      1PUSH           END-CODE
  628.  
  629. : <>            ( n1 n2 -- f )  = NOT   ;
  630.  
  631. : ?NEGATE       ( n1 n2 -- n3 ) 0< IF    NEGATE   THEN   ;
  632.  
  633. CODE   U<       ( n1 n2 -- f )
  634.                 POP AX          POP BX          CMP BX, AX
  635.                 JB YES
  636.                 SUB AX, AX      1PUSH           END-CODE
  637.  
  638. CODE   U>       ( n1 n2 -- f )
  639.                 POP AX          POP BX          CMP AX, BX
  640.                 JB YES
  641.                 SUB AX, AX      1PUSH           END-CODE
  642.  
  643. CODE <          ( n1 n2 -- f )
  644.                 POP AX          POP BX          CMP BX, AX
  645.                 JL YES
  646.                 SUB AX, AX      1PUSH           END-CODE
  647.  
  648. CODE >          ( n1 n2 -- f )
  649.                 POP AX          POP BX          CMP BX, AX
  650.                 JG YES
  651.                 SUB AX, AX
  652. LABEL PUSH1     1PUSH           END-CODE
  653.  
  654. CODE MIN        POP AX          POP BX          CMP BX, AX
  655.                 JG PUSH1
  656. LABEL MIN1      PUSH BX         NEXT            END-CODE
  657.  
  658. CODE MAX        POP AX          POP BX          CMP BX, AX
  659.                 JG MIN1
  660.                 1PUSH           END-CODE
  661.  
  662. : BETWEEN       ( n1 min max -- f )     >R  OVER > SWAP R> > OR NOT ;
  663. : WITHIN        ( n1 min max -- f )     1- BETWEEN  ;
  664.  
  665. CODE 2@         ( addr -- d )
  666.                 POP BX          MOV AX, 0 [BX]  MOV DX, 2 [BX]
  667.                 2PUSH           END-CODE
  668.  
  669. CODE 2!         ( d addr -- )
  670.                 POP BX          POP 0 [BX]      POP 2 [BX]
  671.                 NEXT            END-CODE
  672.  
  673. CODE 2DROP      ( d -- )
  674.                 POP AX          POP AX
  675.                 NEXT            END-CODE
  676.  
  677. CODE 3DROP      ( d -- )
  678.                 POP AX          POP AX          POP AX
  679.                 NEXT            END-CODE
  680.  
  681. CODE 2DUP       ( d -- d d )
  682.                 POP AX          POP DX
  683.                 PUSH DX         PUSH AX
  684.                 2PUSH           END-CODE
  685.  
  686. CODE 3DUP       ( d -- d d )
  687.                 POP AX          POP DX          POP BX
  688.                 PUSH BX         PUSH DX         PUSH AX
  689.                 PUSH BX         PUSH DX         PUSH AX
  690.                 NEXT            END-CODE
  691.  
  692. CODE 2SWAP      ( d1 d2 -- d2 d1 )
  693.                 POP CX          POP BX
  694.                 POP AX          POP DX
  695.                 PUSH BX         PUSH CX
  696.                 2PUSH           END-CODE
  697.  
  698. CODE 2OVER      ( d2 d2 -- d1 d2 d1 )
  699.                 POP CX          POP BX
  700.                 POP AX          POP DX
  701.                 PUSH DX         PUSH AX
  702.                 PUSH BX         PUSH CX
  703.                 2PUSH           END-CODE
  704.  
  705. CODE D+         ( d1 d2 -- dsum )
  706.                 POP AX          POP DX
  707.                 POP BX          POP CX
  708.                 ADD DX, CX      ADC AX, BX
  709.                 2PUSH           END-CODE
  710.  
  711. CODE DNEGATE    ( d# -- d#' )
  712. LABEL DNEG1     POP BX          POP CX
  713.                 SUB AX, AX      MOV DX, AX
  714.                 SUB DX, CX      SBB AX, BX
  715.                 2PUSH           END-CODE
  716.  
  717. CODE   S>D      ( n -- d )
  718.                 POP AX          CWD             XCHG DX, AX
  719.                 2PUSH           END-CODE
  720.  
  721. CODE DABS       ( d# -- d# )
  722.                 POP DX          PUSH DX         OR DX, DX
  723.                 JS DNEG1
  724.                 NEXT            END-CODE
  725.  
  726. CODE D2*        ( d -- d*2 )
  727.                 POP AX          POP DX
  728.                 SHL DX, # 1     RCL AX, # 1
  729.                 2PUSH           END-CODE
  730.  
  731. CODE D2/        ( d -- d/2 )
  732.                 POP AX          POP DX
  733.                 SAR AX, # 1     RCR DX, # 1
  734.                 2PUSH           END-CODE
  735.  
  736. : D-            ( d1 d2 -- d3 ) DNEGATE D+   ;
  737.  
  738. : ?DNEGATE      ( d1 n -- d2 )  0< IF   DNEGATE   THEN   ;
  739.  
  740. : D0=           ( d -- f )      OR 0= ;
  741.  
  742. : D=            ( d1 d2 -- f )  D-  D0=  ;
  743.  
  744. : DU<           ( ud1 ud2 -- f )
  745.                 ROT SWAP 2DUP U<
  746.                 IF      2DROP 2DROP TRUE
  747.                 ELSE    <> IF   2DROP FALSE  ELSE  U<  THEN
  748.                 THEN  ;
  749.  
  750. : D<            ( d1 d2 -- f )
  751.                 2 PICK OVER =
  752.                 IF      DU<
  753.                 ELSE  NIP ROT DROP <  THEN  ;
  754.  
  755. : D>            ( d1 d2 -- f )  2SWAP D<   ;
  756.  
  757. : 4DUP          ( a b c d -- a b c d a b c d )  2OVER 2OVER   ;
  758.  
  759. : DMIN          ( d1 d2 -- d3 ) 4DUP D> IF  2SWAP  THEN 2DROP ;
  760.  
  761. : DMAX          ( d1 d2 -- d3 ) 4DUP D< IF  2SWAP  THEN  2DROP ;
  762.  
  763. : *D            ( n1 n2 -- d# )
  764.                 2DUP  XOR  >R  ABS  SWAP  ABS  UM*  R>  ?DNEGATE  ;
  765.  
  766. : M/MOD         ( d# n1 -- rem quot )
  767.                 ?DUP
  768.                 IF  DUP >R  2DUP XOR >R  >R DABS R@ ABS  UM/MOD
  769.                         SWAP R> ?NEGATE
  770.                         SWAP R> 0<
  771.                         IF  NEGATE OVER
  772.                                 IF  1- R@ ROT - SWAP  THEN
  773.                         THEN    R> DROP
  774.                 THEN  ;
  775.  
  776. : MU/MOD        ( d# n1 -- rem d#quot )
  777.                 >R  0  R@  UM/MOD  R>  SWAP  >R  UM/MOD  R>   ;
  778.  
  779. CODE /          ( NUM DEN --- QUOT )
  780.                 POP BX          POP AX          CWD
  781.                 MOV CX, BX      XOR CX, DX
  782.             0>= IF                              \ POSITIVE QUOTIENT CASE
  783.                 IDIV BX         1PUSH
  784.             THEN
  785.                 IDIV BX         OR DX, DX
  786.             0<> IF
  787.                 DEC AX
  788.             THEN
  789.                 1PUSH           END-CODE
  790.  
  791. CODE /MOD       ( NUM DEN --- REM QUOT )
  792.                 POP BX          POP AX          CWD
  793.                 MOV CX, BX      XOR CX, DX
  794.             0>= IF
  795.                 IDIV BX         2PUSH
  796.             THEN
  797.                 IDIV BX         OR DX, DX
  798.             0<> IF
  799.                 ADD DX, BX      DEC AX
  800.            THEN
  801.                 2PUSH           END-CODE
  802.  
  803. : MOD           ( n1 n2 -- rem ) /MOD  DROP  ;
  804.  
  805. CODE */MOD      ( N1 N2 N3 --- REM QUOT )
  806.                 POP BX          POP AX          POP CX
  807.                 IMUL CX         MOV CX, BX      XOR CX, DX
  808.             0>= IF
  809.                 IDIV BX         2PUSH
  810.             THEN
  811.                 IDIV BX         OR DX, DX
  812.             0<> IF
  813.                 ADD DX, BX      DEC AX
  814.             THEN
  815.                 2PUSH           END-CODE
  816.  
  817. : */            ( n1 n2 n3 -- n1*n2/n3 ) */MOD  NIP  ;
  818.  
  819. : ROLL          ( n1 n2 .. nk n -- wierd )
  820.                 >R R@ PICK   SP@ DUP 2+   R> 1+ 2* CMOVE>  DROP  ;
  821.  
  822. : 2ROT          ( a b c d e f - c d e f a b )   5 ROLL  5 ROLL  ;
  823.  
  824.  
  825.