[{TableOfContents }]

! Main Kernal
{{{
PRT2C
 ok
128 0 pall    ATARIVF.FB Scr 0 Dr 0 
 0 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 ende 123
14 
15 
   ATARIVF.FB Scr 1 Dr 0 
 0 \ Atari 8bit VolksForth Kernel                        cas02jan07
 1 forth definitions
 2 : (C [compile] ( ; IMMEDIATE  \ : ) ; IMMEDIATE
 3 
 4 $2200 DISPLACE !  \ Memory Start Address = $2200
 5 TARGET DEFINITIONS $2200  HERE!
 6 
 7 HEX
 8 &01 &126  +THRU
 9 decimal
10 \ ASSEMBLER NONRELOCATE
11 
12 CR .( Unresolved: )
13 .UNRESOLVED CR CR
14 
15 CR .( SAVE-TARGET 6502-FORTH83)
   ATARIVF.FB Scr 2 Dr 0 
 0 \ FORTH PREAMBLE AND ID       10JAN85BP)              cas11aug06
 1 
 2 ASSEMBLER
 3   NOP  0 JMP  HERE 2- >LABEL >COLD
 4   NOP  0 JMP  HERE 2- >LABEL >RESTART
 5 
 6 HERE DUP ORIGIN!
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 3 Dr 0 
 0 \ USERVARIABLES AND COLDSTART VALUES                  cas10jan07
 1 
 2 0 JMP  0 JSR  HERE 2- >LABEL >WAKE  END-CODE
 3 
 4 $0D6 ALLOT
 5 
 6 | CREATE LOGO ," volksFORTH-83 Rev. 3.81.4  10jan07"
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 4 Dr 0 
 0 \ ZERO PAGE VARIABLES & NEXT  03APR85BP)              cas11aug06
 1 \ Zero Page $A0 - $C8  used
 2 A0 DUP     >LABEL RP     2+  \  RP      = $A0
 3    DUP     >LABEL UP     2+  \  UP      = $A2
 4    DUP     >LABEL PUTA   1+  \  PUTA    = $A4
 5    DUP     >LABEL SP     2+  \  SP      = $A5
 6    DUP     >LABEL NEXT       \  NEXT    = $A7
 7    DUP 5 + >LABEL IP         \  IP      = $AB
 8       13 + >LABEL W          \  W       = $BE
 9      W 8 + >LABEL N          \  N       = $C6
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 5 Dr 0 
 0 \ NEXT, MOVED INTO ZERO PAGE  08APR85BP)
 1 
 2 LABEL BOOTNEXT
 3    -1 STA              \ -1 IS DUMMY SP
 4    IP )Y LDA  W 1+  STA
 5    -1 LDA     W STA    \ -1 IS DUMMY IP
 6    CLC IP LDA  2 # ADC  IP STA
 7      CS NOT ?[ LABEL WJMP -1 ) JMP ]?
 8    IP 1+ INC  WJMP BCS END-CODE
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 6 Dr 0 
 0 \                                                     08jab07cas
 1 HERE BOOTNEXT - >LABEL BOOTNEXTLEN
 2 
 3 CODE END-TRACE  ( PATCH NEXT FOR TRACE )
 4  $A5 # LDA  NEXT $A + STA
 5   IP # LDA  NEXT $B + STA
 6  $69 # LDA  NEXT $C + STA
 7  $02 # LDA  NEXT $D + STA
 8  NEXT JMP   END-CODE
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 7 Dr 0 
 0 \ ;C:  NOOP                                           08jab07cas
 1 
 2 CREATE RECOVER  ( -- addr )  ASSEMBLER
 3  PLA  W STA  PLA  W 1+ STA
 4  W WDEC  0 JMP   END-CODE
 5 
 6 HERE 2- >LABEL >RECOVER
 7 \ HANDCRAFTED FORWARD REFERENCE FOR JMP COMMAND
 8 
 9 COMPILER ASSEMBLER ALSO DEFINITIONS
10  H : ;C:   0 T RECOVER JSR
11  END-CODE  ] H ;
12 TARGET
13 CODE NOOP   NEXT HERE 2- !  END-CODE
14 
15 
   ATARIVF.FB Scr 8 Dr 0 
 0 \ USER VARIABLES              17MAR84KS)              08jab07cas
 1 
 2 CONSTANT ORIGIN  8 UALLOT DROP
 3                  \ FOR MULTITASKER
 4 \ DATASTACK   = $7000
 5 \ RETURNSTACK = $7500
 6 USER S0      $7000 S0   !       USER R0      $7500 R0 !
 7 USER DP                         USER OFFSET  0 OFFSET !
 8 USER BASE      &10 BASE !       USER OUTPUT
 9 USER INPUT
10 USER ERRORHANDLER       \ POINTER FOR  ABORT" -CODE
11 USER VOC-LINK
12 USER UDP                \ POINTS TO NEXT FREE ADDR IN USER
13 
14 
15 
   ATARIVF.FB Scr 9 Dr 0 
 0 \ MANIPULATE SYSTEM POINTERS  29JAN85BP)
 1 
 2 CODE SP@   ( -- ADDR)
 3  SP LDA  N STA  SP 1+ LDA  N 1+ STA
 4  N # LDX
 5 LABEL XPUSH
 6  SP 2DEC  1 ,X LDA  SP )Y STA
 7  0 ,X LDA  0 # LDX  PUTA JMP   END-CODE
 8 
 9 CODE SP!   ( ADDR --)
10  SP X) LDA  TAX  SP )Y LDA
11  SP 1+ STA  SP STX   0 # LDX
12  NEXT JMP   END-CODE
13 
14 
15 
   ATARIVF.FB Scr 10 Dr 0 
 0 \
 1 CODE UP@   ( -- ADDR)
 2  UP # LDX  XPUSH JMP  END-CODE
 3 
 4 CODE UP!   ( ADDR --)      UP # LDX
 5 LABEL XPULL     SP )Y LDA  1 ,X STA
 6             DEY SP )Y LDA  0 ,X STA
 7 LABEL (XYDROP   0 # LDX  1 # LDY
 8 LABEL (DROP     SP 2INC  NEXT JMP
 9 END-CODE RESTRICT
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 11 Dr 0 
 0 \ MANIPULATE RETURNSTACK   16FEB85BP/KS)
 1 CODE RP@ ( -- ADDR )
 2  RP # LDX  XPUSH JMP  END-CODE
 3 
 4 CODE RP! ( ADDR -- )
 5  RP # LDX  XPULL JMP  END-CODE RESTRICT
 6 
 7 CODE >R  ( 16B --  )
 8  RP 2DEC  SP X) LDA   RP X) STA
 9  SP )Y LDA   RP )Y STA (DROP JMP
10 END-CODE RESTRICT
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 12 Dr 0 
 0 \
 1 CODE R>  ( -- 16B)
 2  SP 2DEC  RP X) LDA  SP X) STA
 3           RP )Y LDA  SP )Y STA
 4 LABEL (RDROP     2 # LDA
 5 
 6 LABEL (NRDROP    CLC  RP ADC  RP STA
 7     CS ?[  RP 1+ INC  ]?
 8  NEXT JMP  END-CODE  RESTRICT
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 13 Dr 0 
 0 \ R@ RDROP  EXIT UNNEST       08APR85BP)              cas10jan07
 1 CODE R@      ( -- 16B)
 2  SP 2DEC  RP )Y LDA  SP )Y STA  RP X) LDA  PUTA JMP
 3 END-CODE
 4 
 5 CODE RDROP    (RDROP HERE 2- !   END-CODE  RESTRICT
 6 
 7 CODE EXIT
 8  RP X) LDA  IP STA
 9  RP )Y LDA  IP 1+ STA
10  (RDROP JMP   END-CODE
11 
12 \ CODE UNNEST
13 \ RP X) LDA  IP STA  RP )Y LDA  IP 1+ STA  (rdrop JMP  end-code
14 
15 
   ATARIVF.FB Scr 14 Dr 0 
 0 \ ?EXIT EXECUTE  PERFORM            08APR85BP)        cas08jan07
 1 
 2 CODE ?EXIT     ( FLAG -- )
 3  SP X) LDA  SP )Y ORA
 4  PHP  SP 2INC  PLP
 5  ' EXIT @ BNE  NEXT JMP
 6 END-CODE
 7 
 8 CODE EXECUTE  ( ADDR --)
 9  SP X) LDA   W STA
10  SP )Y LDA   W 1+ STA
11  SP 2INC     W 1- JMP   END-CODE
12 
13 : PERFORM ( ADDR -- )   @ EXECUTE ;
14 
15 
   ATARIVF.FB Scr 15 Dr 0 
 0 \ C@   C!             10JAN85BP)                      cas08jan07
 1 
 2 CODE C@ ( ADDR -- 8B)
 3  SP X) LDA  N STA   SP )Y LDA  N 1+ STA
 4 LABEL (C@    0 # LDA  SP )Y STA
 5  N X)  LDA   PUTA JMP   END-CODE
 6 
 7 CODE C!  ( 16B ADDR --)
 8  SP X) LDA   N STA   SP )Y LDA  N 1+ STA
 9  INY  SP )Y LDA  N X) STA DEY
10 LABEL (2DROP
11  SP LDA  CLC  4 # ADC  SP STA
12    CS ?[  SP 1+ INC  ]?
13  NEXT JMP   END-CODE
14 
15 
   ATARIVF.FB Scr 16 Dr 0 
 0 \ @ ! +! ctoggle              08APR85BP)              cas08jan07
 1 
 2 : CTOGGLE   ( 8B ADDR --) UNDER C@ XOR SWAP C! ;
 3 
 4 CODE @  ( ADDR -- 16B)
 5  SP X) LDA  N STA  SP )Y LDA  N 1+ STA
 6  N )Y LDA  SP )Y STA
 7  N X) LDA PUTA JMP   END-CODE
 8 
 9 CODE !   ( 16B ADDR --)
10  SP X) LDA  N STA  SP )Y LDA  N 1+ STA
11  INY SP )Y LDA  N X) STA
12  INY SP )Y LDA   1 # LDY
13 LABEL (!
14  N )Y STA  (2DROP JMP   END-CODE
15 
   ATARIVF.FB Scr 17 Dr 0 
 0 \ +! DROP                    24MAY84KS)               cas08jan07
 1 
 2 CODE +!  ( N ADDR --)
 3  SP X) LDA  N STA  SP )Y LDA  N 1+ STA
 4  INY  SP )Y LDA  CLC  N X) ADC N X) STA
 5  INY  SP )Y LDA  1 # LDY  N )Y ADC
 6  (! JMP   END-CODE
 7 
 8 CODE DROP  ( 16B --)
 9  (DROP HERE 2- !  END-CODE
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 18 Dr 0 
 0 \ swap                                                cas08jan07
 1 CODE SWAP  ( 16B1 16B2 -- 16B2 16B1 )
 2  SP )Y LDA  TAX
 3  3 # LDY  SP )Y LDA  N STA
 4  TXA  SP )Y STA
 5  N LDA  1 # LDY  SP )Y STA
 6  INY  0 # LDX
 7  SP )Y LDA  N STA  SP X) LDA  SP )Y STA
 8  DEY
 9  N LDA PUTA JMP   END-CODE
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 19 Dr 0 
 0 \ DUP  ?DUP                   08MAY85BP)              cas08jan07
 1 
 2 CODE DUP   ( 16B -- 16B 16B)
 3  SP 2DEC
 4  3 # LDY  SP )Y LDA  1 # LDY  SP )Y STA
 5  INY  SP )Y LDA  DEY
 6  PUTA JMP   END-CODE
 7 
 8 CODE ?DUP     ( 16B -- 16B 16B / FALSE)
 9  SP X) LDA  SP )Y ORA
10    0= ?[  NEXT JMP  ]?
11  ' DUP @ JMP END-CODE
12 
13 \ : ?DUP   ( 16B -- 16B 16B / FALSE)  DUP IF DUP THEN ;
14 \ : DUP ( n - n n )   SP@  @  ;
15 
   ATARIVF.FB Scr 20 Dr 0 
 0 \ OVER                     13JUN84KS)                 cas08jan07
 1 
 2 CODE OVER  ( 16B1 16B2 - 16B1 16B3 16B1)
 3  SP 2DEC  4 # LDY  SP )Y LDA  SP X) STA
 4  INY  SP )Y LDA  1 # LDY  SP )Y STA
 5  NEXT JMP   END-CODE
 6 
 7 
 8 \\ : ROT   >R SWAP R> SWAP ;
 9    : OVER  >R DUP R> SWAP ;
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 21 Dr 0 
 0 \ ROT                                                 cas08jan07
 1 CODE ROT ( 16B1 16B2 16B3 -- 16B2 16B3 16B1)
 2  3 # LDY  SP )Y LDA  N 1+ STA
 3  1 # LDY  SP )Y LDA  3 # LDY  SP )Y STA
 4  5 # LDY  SP )Y LDA  N STA
 5  N 1+ LDA  SP )Y STA
 6  1 # LDY  N LDA  SP )Y STA
 7  INY  SP )Y LDA  N 1+ STA
 8  SP X) LDA  SP )Y STA
 9  4 # LDY  SP )Y LDA  SP X) STA
10  N 1+ LDA  SP )Y STA
11  1 # LDY  NEXT JMP   END-CODE
12 
13 
14 
15 
   ATARIVF.FB Scr 22 Dr 0 
 0 \ -ROT NIP UNDER PICK ROLL -ROLL                      cas08jan07
 1 : -ROT ( 16B1 16B2 16B3 -- 16B3 16B1 16B2)
 2         ROT ROT ;
 3 
 4 : NIP   ( 16B1 16B2 -- 16B2) SWAP DROP ;
 5 
 6 : UNDER ( 16B1 16B2 -- 16B2 16B1 16B2) SWAP OVER ;
 7 
 8 : PICK  ( N -- 16B.N )   1+ 2* SP@ + @ ;
 9 
10 : ROLL  ( N --) DUP >R PICK SP@ DUP 2+ R> 1+ 2* CMOVE>  DROP ;
11 
12 : -ROLL ( N --)
13  >R DUP SP@  DUP 2+ DUP 2+ SWAP
14  R@ 2* CMOVE R> 1+ 2* + ! ;
15 
   ATARIVF.FB Scr 23 Dr 0 
 0 \ DOUBLE WORD STACK MANIP.    21APR83KS)
 1 
 2 : 2SWAP ( 32B1 32B2 -- 32B2 32B1) ROT >R ROT R> ;
 3 
 4 CODE 2DROP ( 32B -- )
 5  (2DROP HERE 2- !   END-CODE
 6 
 7 : 2DUP  ( 32B -- 32B 32B) OVER OVER ;
 8 
 9 \  : 2DROP ( 32B -- )     DROP DROP ;
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 24 Dr 0 
 0 \ + AND OR XOR                08APR85BP)              cas08jan07
 1 COMPILER  ASSEMBLER ALSO DEFINITIONS
 2 
 3 H : DYADOP ( OPCODE --)  T
 4    INY  SP X) LDA  DUP C, SP C, SP )Y STA
 5    DEY  SP )Y LDA  3 # LDY  C, SP C, SP )Y STA
 6    (XYDROP JMP  H ;
 7 TARGET
 8 
 9 CODE +     ( N1 N2 -- N3) CLC     $71 DYADOP   END-CODE
10 CODE OR    ( 16B1 16B2 -- 16B3)   $11 DYADOP   END-CODE
11 CODE AND   ( 16B1 16B2 -- 16B3)   $31 DYADOP   END-CODE
12 CODE XOR   ( 16B1 16B2 -- 16B3)   $51 DYADOP   END-CODE
13 
14 
15 
   ATARIVF.FB Scr 25 Dr 0 
 0 \ -  NOT  NEGATE              24DEC83KS)              cas08jan07
 1 
 2 CODE -    ( N1 N2 -- N3)
 3  INY SP )Y LDA  SEC  SP X) SBC  SP )Y STA  INY  SP )Y LDA
 4  1 # LDY  SP )Y SBC  3 # LDY  SP )Y STA  (XYDROP JMP  END-CODE
 5 
 6 CODE NOT   ( 16B1 -- 16B2)   CLC
 7 LABEL (NOT TXA  SP X) SBC  SP X) STA  TXA SP )Y SBC  SP )Y STA
 8        NEXT JMP   END-CODE
 9 
10 CODE NEGATE   ( N1 -- N2 ) SEC  (NOT BCS   END-CODE
11 
12 \ : -       NEGATE + ;
13 
14 
15 
   ATARIVF.FB Scr 26 Dr 0 
 0 \ DNEGATE SETUP               14JUN84KS)              cas08jan07
 1 
 2 CODE DNEGATE ( D1 -- -D1)
 3  INY  SEC
 4  TXA  SP )Y SBC  SP )Y STA  INY
 5  TXA  SP )Y SBC  SP )Y STA
 6  TXA  SP X) SBC  SP X) STA  1 # LDY
 7  TXA  SP )Y SBC  SP )Y STA
 8  NEXT JMP  END-CODE
 9 LABEL SETUP  ( QUAN  IN A)
10  .A ASL  TAX  TAY  DEY
11     [[ SP )Y LDA  N ,Y STA  DEY  0< ?]
12  TXA  CLC  SP ADC  SP STA
13     CS ?[  SP 1+ INC  ]?
14  0 # LDX  1 # LDY   RTS   END-CODE
15 
   ATARIVF.FB Scr 27 Dr 0 
 0 \ D+                                                  cas08jan07
 1 
 2 CODE D+      ( D1 D2 -- D3)
 3  2 # LDA  SETUP JSR  INY
 4  SP )Y LDA  CLC N 2+  ADC SP )Y STA INY
 5  SP )Y LDA      N 3 + ADC SP )Y STA
 6  SP X) LDA  N    ADC SP X) STA  1 # LDY
 7  SP )Y LDA  N 1+ ADC SP )Y STA
 8  NEXT JMP   END-CODE
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 28 Dr 0 
 0 \ 1+ 2+ 3+ 4+    1- 2-           08APR85BP)           cas08jan07
 1 
 2 CODE 1+   ( N1 -- N2)   1 # LDA
 3 LABEL N+  CLC  SP X) ADC
 4  CS NOT   ?[  PUTA JMP  ]?
 5  SP X) STA  SP )Y LDA  0 # ADC SP )Y STA
 6  NEXT JMP  END-CODE
 7 
 8 CODE 2+   ( N1 -- N2) 2 # LDA   N+ BNE     END-CODE
 9 CODE 3+   ( N1 -- N2) 3 # LDA   N+ BNE     END-CODE
10 CODE 4+   ( N1 -- N2) 4 # LDA   N+ BNE     END-CODE
11 | CODE 6+ ( N1 -- N2) 6 # LDA   N+ BNE     END-CODE
12 
13 
14 
15 
   ATARIVF.FB Scr 29 Dr 0 
 0 \ 1- 2- NUMBER CONSTANTS            24DEC83KS)        cas08jan07
 1 CODE 1-   ( N1 -- N2)   SEC
 2 LABEL (1-     SP X) LDA  1 # SBC
 3    CS ?[ PUTA JMP ]?
 4  SP X) STA  SP )Y LDA  0 # SBC SP )Y STA
 5  NEXT JMP  END-CODE
 6 CODE 2-   ( N1 -- N2)  CLC (1- BCC  END-CODE
 7 
 8 -1 CONSTANT TRUE    0 CONSTANT FALSE
 9 ' TRUE ALIAS -1     ' FALSE ALIAS 0
10 
11 1 CONSTANT 1        2 CONSTANT 2
12 3 CONSTANT 3        4 CONSTANT 4
13 
14 : ON    ( ADDR -- )  TRUE  SWAP ! ;
15 : OFF   ( ADDR -- )  FALSE SWAP ! ;
   ATARIVF.FB Scr 30 Dr 0 
 0 \ WORDS FOR NUMBER LITERALS   24MAY84KS)              cas08jan07
 1 
 2 CODE CLIT  ( -- 8B)
 3  SP 2DEC  IP X) LDA  SP X) STA  TXA   SP )Y STA  IP WINC
 4  NEXT JMP   END-CODE RESTRICT
 5 
 6 CODE LIT   ( -- 16B)
 7  SP 2DEC  IP )Y LDA  SP )Y STA  IP X) LDA  SP X) STA
 8 LABEL (BUMP   IP 2INC  NEXT JMP  END-CODE RESTRICT
 9 
10 : LITERAL   ( 16B --) DUP $FF00 AND
11    IF  COMPILE LIT   , EXIT THEN COMPILE CLIT C,  ;
12                                          IMMEDIATE RESTRICT
13 
14 \\ : LIT     R> DUP 2+ >R  @  ;
15 \\ : CLIT    R> DUP 1+ >R  C@ ;
   ATARIVF.FB Scr 31 Dr 0 
 0 \ COMPARISION CODE WORDS      13JUN84KS)              cas08jan07
 1 CODE 0<   ( N -- FLAG) SP )Y LDA  0< ?[
 2      LABEL PUTTRUE    $FF # LDA  $24 C, ]?
 3      LABEL PUTFALSE   TXA  SP )Y STA
 4                       PUTA JMP   END-CODE
 5 
 6 CODE 0=   ( 16B -- FLAG)
 7  SP X) LDA  SP )Y ORA  PUTTRUE BEQ  PUTFALSE BNE  END-CODE
 8 
 9 CODE UWITHIN  ( U1 [LOW UP[  -- FLAG)
10  2 # LDA  SETUP JSR  1 # LDY  SP X) LDA  N CMP
11           SP )Y LDA  N 1+ SBC
12   CS NOT ?[ ( N>SP) SP X) LDA  N 2+ CMP
13                     SP )Y LDA  N 3 + SBC
14            PUTTRUE BCS ]?
15  PUTFALSE JMP  END-CODE
   ATARIVF.FB Scr 32 Dr 0 
 0 \ COMPARISION CODE WORDS      13JUN84KS)
 1 
 2 CODE <    ( N1 N2 -- FLAG)
 3  SP X) LDA  N STA  SP )Y LDA  N 1+ STA
 4  SP 2INC
 5  N 1+ LDA  SP )Y EOR  ' 0< @  BMI
 6  SP X) LDA  N CMP  SP )Y LDA  N 1+ SBC
 7  ' 0< @ 2+ JMP    END-CODE
 8 
 9 CODE U<   ( U1 U2 -- FLAG)
10  SP X) LDA  N STA  SP )Y LDA  N 1+ STA
11  SP 2INC
12  SP X) LDA  N CMP  SP )Y LDA  N 1+ SBC
13    CS NOT ?[  PUTTRUE JMP  ]?
14               PUTFALSE JMP  END-CODE
15 
   ATARIVF.FB Scr 33 Dr 0 
 0 \ COMPARISION WORDS           24DEC83KS)              cas08jan07
 1 
 2 \ : 0<   $8000 AND  0<> ;
 3 
 4 : >   ( N1 N2 -- FLAG)  SWAP < ;
 5 : 0>  ( N --     FLAG)  NEGATE 0<  ;
 6 : 0<> ( N --     FLAG)  0= NOT ;
 7 : U>  ( U1 U2 -- FLAG)  SWAP U< ;
 8 : =   ( N1 N2 -- FLAG)  - 0= ;
 9 : D0= ( D --     FLAG)  OR 0= ;
10 : D=  ( D1 D2 -- FLAG)  DNEGATE D+ D0= ;
11 : D<  ( D1 D2 -- FLAG)  ROT 2DUP -
12                         IF > NIP NIP  ELSE 2DROP U< THEN ;
13 
14 
15 
   ATARIVF.FB Scr 34 Dr 0 
 0 \ MIN MAX UMAX UMIN EXTEND DABS ABS  KS)
 1 
 2 | : MINIMAX  ( N1 N2 FLAG -- N3)
 3    RDROP  IF SWAP THEN DROP ;
 4 
 5 : MIN   ( N1 N2 -- N3) 2DUP  > MINIMAX ;   -2 ALLOT
 6 : MAX   ( N1 N2 -- N3) 2DUP  < MINIMAX ;   -2 ALLOT
 7 : UMAX  ( U1 U2 -- U3) 2DUP U< MINIMAX ;   -2 ALLOT
 8 : UMIN  ( U1 U2 -- U3) 2DUP U> MINIMAX ;   -2 ALLOT
 9 
10 : EXTEND  ( N -- D)     DUP 0< ;
11 
12 : DABS    ( D -- UD)  EXTEND IF  DNEGATE THEN ;
13 : ABS     ( N -- U)   EXTEND IF   NEGATE THEN ;
14 
15 
   ATARIVF.FB Scr 35 Dr 0 
 0 \ LOOP PRIMITIVES          08FEB85BP/KS)              cas08jan07
 1 
 2 | : DODO  RDROP R> 2+ DUP >R ROT >R SWAP >R >R ;
 3 
 4 : (DO  ( LIMIT STAR -- ) OVER - DODO ;  -2 ALLOT RESTRICT
 5 
 6 : (?DO ( LIMIT START -- )
 7  OVER - ?DUP  IF DODO THEN R> DUP @ +  >R DROP ; RESTRICT
 8 
 9 : BOUNDS  ( START COUNT -- LIMIT START ) OVER + SWAP ;
10 
11 CODE  ENDLOOP 6 # LDA (NRDROP JMP   END-CODE RESTRICT
12 
13 \\ DODO PUTS  "INDEX \ LIMIT \
14    ADR.OF.DO"  ON RETURN-STACK
15 
   ATARIVF.FB Scr 36 Dr 0 
 0 \ (LOOP (+LOOP                08APR85BP)
 1 CODE (LOOP
 2  CLC  1 # LDA  RP X) ADC RP X) STA
 3    CS ?[  RP )Y LDA  0 # ADC RP )Y STA
 4       CS ?[ NEXT JMP ]? ]?
 5 LABEL DOLOOP  5 # LDY
 6  RP )Y LDA  IP 1+ STA  DEY
 7  RP )Y LDA  IP    STA  1 # LDY
 8  NEXT JMP    END-CODE RESTRICT
 9 
10 CODE (+LOOP
11  CLC SP X) LDA  RP X) ADC  RP X) STA
12      SP )Y LDA  RP )Y ADC  RP )Y STA
13  .A ROR  SP )Y EOR
14  PHP  SP 2INC  PLP DOLOOP BPL
15  NEXT JMP    END-CODE RESTRICT
   ATARIVF.FB Scr 37 Dr 0 
 0 \ LOOP INDICES                08APR85BP)
 1 
 2 CODE I  ( -- N)    0 # LDY
 3 LABEL LOOPINDEX    SP 2DEC   CLC
 4  RP )Y LDA  INY  INY
 5  RP )Y ADC  SP X) STA  DEY
 6  RP )Y LDA  INY  INY
 7  RP )Y ADC  1 # LDY  SP )Y STA
 8  NEXT JMP   END-CODE RESTRICT
 9 
10 CODE J  ( -- N)
11  6 # LDY  LOOPINDEX BNE
12             END-CODE  RESTRICT
13 
14 
15 
   ATARIVF.FB Scr 38 Dr 0 
 0 \ BRANCHING                   24DEC83KS)
 1 
 2 CODE BRANCH
 3  CLC  IP    LDA  IP X) ADC  N STA
 4       IP 1+ LDA  IP )Y ADC  IP 1+ STA  N LDA IP STA
 5  NEXT JMP     END-CODE RESTRICT
 6 
 7 CODE ?BRANCH
 8  SP X) LDA  SP )Y ORA PHP  SP 2INC  PLP
 9  ' BRANCH @ BEQ    (BUMP JMP  END-CODE   RESTRICT
10 
11 \\  : BRANCH   R> DUP @ + >R ; RESTRICT
12 
13     : ?BRANCH
14      0= R> OVER NOT OVER 2+  AND -ROT
15      DUP @ + AND OR >R ;       RESTRICT
   ATARIVF.FB Scr 39 Dr 0 
 0 \ RESOLVE LOOPS AND BRANCHES  03FEB85BP)              cas11aug06
 1 
 2 : >MARK     ( -- ADDR)  HERE   0 , ;
 3 : >RESOLVE  ( ADDR --)  HERE OVER -   SWAP !  ;
 4 : <MARK     ( -- ADDR)  HERE ;
 5 : <RESOLVE  ( ADDR --)  HERE - ,  ;
 6 : ?PAIRS  ( N1 N2 -- ) -  ABORT" UNSTRUCTURED" ;
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 40 Dr 0 
 0 \ CASE?                       04MAY85BP)              cas08jan07
 1 
 2 LABEL  PUSHA
 3  0 # CMP  0< ?[ PHA  0FF # LDA ][
 4 LABEL  PUSH0A   PHA   0  # LDA  ]?
 5 LABEL  PUSH     TAX   SP 2DEC
 6  TXA  1 # LDY  SP )Y STA
 7  PLA  0 # LDX   PUTA JMP
 8 
 9 CODE CASE?
10  ( 16B1 16B2 -- 16B1 FALSE / TRUE )
11  1 # LDA  SETUP JSR  N LDA  SP X) CMP
12   0= ?[ N 1+ LDA  SP )Y CMP  0= ?[ PUTTRUE JMP ]?  ]?
13  TXA  PUSH0A JMP   END-CODE
14 \\ : CASE? ( 16B1 16B2 -- 16B1 f )
15      OVER = DUP  IF  NIP  THEN ;
   ATARIVF.FB Scr 41 Dr 0 
 0 \ BRANCHING                   03FEB85BP)              cas08jan07
 1 
 2 : IF     COMPILE ?BRANCH >MARK  1 ;          IMMEDIATE RESTRICT
 3 : THEN   ABS 1   ?PAIRS  >RESOLVE ;          IMMEDIATE RESTRICT
 4 : ELSE   1 ?PAIRS  COMPILE BRANCH >MARK
 5          SWAP >RESOLVE  -1 ;                 IMMEDIATE RESTRICT
 6 : BEGIN  <MARK 2 ;                           IMMEDIATE RESTRICT
 7 : WHILE  2 ?PAIRS  2   COMPILE ?BRANCH
 8          >MARK -2  2SWAP  ;                  IMMEDIATE RESTRICT
 9 
10 | : (REPTIL   <RESOLVE   BEGIN DUP -2
11     = WHILE  DROP >RESOLVE  REPEAT  ;
12 
13 : REPEAT 2 ?PAIRS  COMPILE  BRANCH (REPTIL ; IMMEDIATE RESTRICT
14 : UNTIL  2 ?PAIRS  COMPILE ?BRANCH (REPTIL ; IMMEDIATE RESTRICT
15 
   ATARIVF.FB Scr 42 Dr 0 
 0 \ LOOPS                    29JAN85KS/BP)
 1 
 2 : DO     COMPILE (DO  >MARK  3 ;     IMMEDIATE RESTRICT
 3 
 4 : ?DO    COMPILE (?DO >MARK  3 ;     IMMEDIATE RESTRICT
 5 
 6 : LOOP   3 ?PAIRS  COMPILE (LOOP
 7          COMPILE ENDLOOP  >RESOLVE ; IMMEDIATE RESTRICT
 8 
 9 : +LOOP  3 ?PAIRS  COMPILE (+LOOP
10          COMPILE ENDLOOP  >RESOLVE ; IMMEDIATE RESTRICT
11 
12 : LEAVE  ENDLOOP R> 2- DUP @ + >R ;            RESTRICT
13 
14 \\ RETURNSTACK: CALLADR \ INDEX
15                   LIMIT \ ADR OF DO
   ATARIVF.FB Scr 43 Dr 0 
 0 \ UM*                      BP/KS13.2.85)              cas02jan07
 1 CODE UM*  ( U1 U2 -- UD)
 2  SP )Y LDA N STA  SP X) LDA  N 1+ STA
 3  INY N 2+ STX N 3+ STX  $10 # LDX
 4   [[ N 3+ ASL  N 2+ ROL  N 1+ ROL  N ROL
 5    CS ?[ CLC  SP )Y LDA  N 3+ ADC  N 3+ STA
 6              INY  SP )Y LDA DEY  N 2+ ADC   N 2+ STA
 7            CS ?[  N 1+ INC  0= ?[  N INC  ]? ]? ]?
 8     DEX  0= ?]
 9  N 3+ LDA   SP )Y STA   INY  N 2+ LDA    SP )Y STA   1 # LDY
10  N    LDA   SP )Y STA        N 1+ LDA    SP X) STA
11  NEXT JMP   END-CODE
12 
13 \\ : UM*   ( U1 U2 -- UD3) >R 0 0 0 R>  $10 0
14   DO  DUP 2/ >R  1 AND IF 2OVER D+ THEN
15       >R >R 2DUP D+ R> R> R>  LOOP DROP 2SWAP 2DROP ;
   ATARIVF.FB Scr 44 Dr 0 
 0 \ M* 2*                       04JUL84KS)              cas02jan07
 1 
 2 : M*     ( N1 N2 -- D)
 3  DUP 0< DUP >R IF NEGATE THEN
 4  SWAP DUP  0<  IF NEGATE R> NOT >R THEN
 5  UM*  R> IF DNEGATE THEN ;
 6 
 7 : *      ( N N -- PROD)   UM* DROP ;
 8 
 9 CODE 2*  ( N1 -- N2)
10  SP X) LDA  .A ASL  SP X) STA
11  SP )Y LDA  .A ROL  SP )Y STA
12  NEXT JMP    END-CODE
13 
14 \\ | : 2*   DUP + ;
15 
   ATARIVF.FB Scr 45 Dr 0 
 0 \ UM/MOD                      04JUL84KS)              cas02jan07
 1 
 2 | : DIVOVL
 3    TRUE ABORT" DIVISION OVERFLOW" ;
 4 
 5 CODE UM/MOD  ( UD U -- UREM UQUOT)
 6  SP X) LDA  N 5 + STA
 7  SP )Y LDA  N 4+  STA   SP 2INC
 8  SP X) LDA  N 1+  STA
 9  SP )Y LDA  N     STA   INY
10  SP )Y LDA  N 3+  STA   INY
11  SP )Y LDA  N 2+  STA   $11 # LDX  CLC
12   [[ N 6 + ROR  SEC  N 1+ LDA  N 5 + SBC
13      TAY  N LDA  N 4+ SBC
14     CS NOT ?[  N 6 + ROL ]?
15       CS ?[ N STA  N 1+ STY ]?
   ATARIVF.FB Scr 46 Dr 0 
 0 \  um/mod cont.                                       cas02jan07
 1 
 2      N 3 + ROL  N 2+ ROL  N 1+ ROL  N ROL
 3   DEX  0= ?]
 4  1 # LDY  N ROR  N 1+ ROR
 5    CS ?[ ;C: DIVOVL ; ASSEMBLER ]?
 6  N 2+  LDA  SP )Y STA  INY
 7  N 1+  LDA  SP )Y STA  INY
 8  N     LDA  SP )Y STA  1 # LDY
 9  N 3 + LDA
10  PUTA JMP    END-CODE
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 47 Dr 0 
 0 \ 2/ M/MOD                    24DEC83KS)
 1 
 2 : M/MOD  ( D N -- MOD QUOT)
 3  DUP >R ABS  OVER
 4    0< IF  UNDER + SWAP  THEN
 5  UM/MOD R@
 6  0< IF NEGATE OVER IF SWAP R@ + SWAP 1-
 7  THEN THEN RDROP ;
 8 
 9 CODE 2/  ( N1 -- N2)
10  SP )Y LDA  .A ASL
11  SP )Y LDA  .A ROR  SP )Y STA
12  SP X) LDA  .A ROR
13  PUTA JMP      END-CODE
14 
15 
   ATARIVF.FB Scr 48 Dr 0 
 0 \ /MOD / MOD */MOD */ U/MOD  UD/MOD  KS)              cas08jan07
 1 
 2 : /MOD   ( N1 N2 -- REM QUOT)      >R EXTEND R> M/MOD ;
 3 : /      ( N1 N2 -- QUOT)          /MOD NIP ;
 4 : MOD    ( N1 N2 -- REM)           /MOD DROP ;
 5 : */MOD  ( N1 N2 N3 -- REM QUOT)   >R M*  R> M/MOD ;
 6 : */     ( N1 N2 N3 -- QUOT)       */MOD NIP ;
 7 : U/MOD  ( U1 U2  -- UREM UQUOT)   0 SWAP UM/MOD ;
 8 : UD/MOD ( UD1 U2 -- UREM UDQUOT)
 9      >R  0  R@  UM/MOD  R> SWAP >R  UM/MOD  R>  ;
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 49 Dr 0 
 0 \ CMOVE        BP 08APR85)                            cas08jan07
 1 
 2 CODE CMOVE  ( FROM TO QUAN --)
 3  3 # LDA SETUP JSR  DEY
 4  [[ [[  N CPY  0= ?[  N 1+ DEC  0< ?[
 5                 1 # LDY  NEXT JMP  ]? ]?
 6      N 4 + )Y LDA  N 2+ )Y STA INY 0= ?]
 7      N 5 + INC N 3 + INC  ]]  END-CODE
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 50 Dr 0 
 0 \ CMOVE>  (CMOVE>                                     cas08jan07
 1 CODE CMOVE> ( FROM TO QUAN --)
 2  3 # LDA SETUP JSR
 3  CLC N 1+ LDA  N 3 + ADC  N 3 + STA
 4  CLC N 1+ LDA  N 5 + ADC  N 5 + STA
 5  N 1+ INC  N LDY  CLC CS ?[
 6 LABEL (CMOVE>
 7  DEY  N 4 + )Y LDA  N 2+ )Y STA ]?
 8  TYA  (CMOVE> BNE
 9  N 3 + DEC  N 5 + DEC  N 1+ DEC
10  (CMOVE> BNE  1 # LDY
11  NEXT JMP   END-CODE
12 
13 : MOVE   ( FROM TO QUAN --) >R 2DUP U<  IF R> CMOVE> EXIT THEN
14                             R> CMOVE ;
15 
   ATARIVF.FB Scr 51 Dr 0 
 0 \ PLACE COUNT  ERASE       16FEB85BP/KS)              cas08jan07
 1 
 2 : PLACE ( ADDR LEN TO --) OVER >R ROT OVER 1+ R> MOVE C! ;
 3 
 4 CODE COUNT ( ADDR -- ADDR+1 LEN)
 5  SP X) LDA  N STA  CLC  1 # ADC  SP X) STA
 6  SP )Y LDA  N 1+ STA    0 # ADC  SP )Y STA
 7  SP 2DEC  (C@ JMP   END-CODE
 8 
 9 \ : COUNT ( ADR -- ADR+1 LEN ) DUP 1+  SWAP C@ ;
10 
11 : ERASE ( ADDR QUAN --)      0 FILL ;
12 
13 
14 
15 
   ATARIVF.FB Scr 52 Dr 0 
 0 \ FILL                        11JUN85BP)
 1 
 2 CODE FILL  ( ADDR QUAN 8B -- )
 3  3 # LDA SETUP JSR  DEY
 4  N LDA  N 3 + LDX
 5   0<> ?[  [[ [[ N 4 + )Y STA INY 0= ?]
 6                 N 5 + INC    DEX 0= ?]
 7       ]?  N 2+ LDX
 8   0<> ?[  [[ N 4 + )Y STA INY DEX 0= ?]
 9       ]? 1 # LDY
10  NEXT JMP   END-CODE
11 
12 \\ : FILL  ( ADDR QUAN 8B --)   SWAP ?DUP
13        IF  >R OVER C! DUP 1+ R> 1- CMOVE   EXIT  THEN  2DROP  ;
14 
15 
   ATARIVF.FB Scr 53 Dr 0 
 0 \ HERE PAD ALLOT , C, COMPILE 24DEC83KS)              cas08jan07
 1 
 2 : HERE  ( -- ADDR)   DP @ ;
 3 
 4 : PAD   ( -- ADDR)   HERE $42 + ;
 5 
 6 : ALLOT ( N --)      DP +! ;
 7 
 8 : ,     ( 16B --)    HERE !  2  ALLOT ;
 9 
10 : C,    ( 8B --)     HERE C! 1  ALLOT ;
11 
12 : COMPILE            R> DUP 2+ >R @ , ; RESTRICT
13 
14 
15 
   ATARIVF.FB Scr 54 Dr 0 
 0 \ INPUT STRINGS               24DEC83KS)              cas09jan07
 1 
 2 VARIABLE #TIB   0 #TIB !
 3 VARIABLE >TIB   $100 >TIB ! \ $80 ALLOT
 4 VARIABLE >IN    0 >IN !
 5 VARIABLE SPAN   0 SPAN !
 6 
 7 : TIB   ( -- ADDR )    >TIB @ ;
 8 
 9 : QUERY TIB  $80 EXPECT SPAN @ #TIB !  >IN OFF ;
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 55 Dr 0 
 0 \ SCAN SKIP /STRING           12OCT84BP)              cas08jan07
 1 \ todo: combine scan and skip!
 2 
 3 : SCAN  ( ADDR0 LEN0 CHAR -- ADDR1 LEN1)  >R
 4      BEGIN  DUP  WHILE  OVER C@ R@ -
 5      WHILE  1- SWAP 1+ SWAP  REPEAT RDROP ;
 6 
 7 : SKIP  ( ADDR LEN DEL -- ADDR1 LEN1)  >R
 8      BEGIN  DUP  WHILE  OVER C@ R@ =
 9      WHILE  1- SWAP 1+ SWAP  REPEAT     RDROP ;
10 
11 
12 : /STRING  ( ADDR0 LEN0 +N - ADDR1 LEN1)
13      OVER UMIN ROT OVER + -ROT - ;
14 
15 
   ATARIVF.FB Scr 56 Dr 0 
 0 \ CAPITAL                     03APR85BP)              cas08jan07
 1 
 2 LABEL (CAPITAL  \ FOR ASCII ONLY
 3  ASCII a # CMP
 4  CS ?[  ASCII z  1+ # CMP
 5     CC ?[      SEC  ASCII a ASCII A - # SBC
 6   ]? ]?  RTS  END-CODE
 7 
 8 CODE CAPITAL  ( CHAR -- CHAR' )
 9  SP X) LDA  (CAPITAL JSR  SP X) STA NEXT JMP    END-CODE
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 57 Dr 0 
 0 \ CAPITALIZE                  03APR85BP)              cas08jan07
 1 
 2 CODE CAPITALIZE  ( STRING -- STRING )
 3  SP X) LDA   N STA  SP )Y LDA  N 1+ STA
 4   N X) LDA   N 2+ STA   DEY
 5  [[ N 2+ CPY  0= ?[ 1 # LDY  NEXT JMP ]?
 6    INY N )Y LDA  (CAPITAL JSR  N )Y STA
 7  ]]   END-CODE
 8 
 9 \\ : CAPITALIZE  ( STRING -- STRING )
10       DUP  COUNT  BOUNDS ?DO  I C@  CAPITAL  I C!  THEN  LOOP ;
11 
12 \\ CAPITAL ( CHAR -- CHAR )
13    ASCII A  ASCII Z 1+  UWITHIN
14    IF  I C@  [ ASCII A  ASCII A - ]  LITERAL -  ;
15 
   ATARIVF.FB Scr 58 Dr 0 
 0 \ (WORD                       08APR85BP)
 1 
 2 | CODE (WORD   ( CHAR ADR0 LEN0 -- ADR)
 3        \ N   : LENGTH OF SOURCE
 4        \ N+2 : PTR IN SOURCE / NEXT CHAR
 5        \ N+4 : STRING START ADRESS
 6        \ N+6 : STRING LENGTH
 7  N 6 + STX        \ 0 =: STRING_LENGTH
 8  3 # LDY [[ SP )Y LDA  N ,Y STA DEY  0< ?]
 9  1 # LDY  CLC  >IN    LDA  N 2+  ADC  N 2+  STA
10                   \ >IN+ADR0 =: N+2
11  >IN 1+ LDA  N 3 + ADC  N 3 + STA SEC  N LDA  >IN  SBC  N  STA
12                  \ LEN0->IN =: N
13    N 1+ LDA  >IN 1+ SBC  N 1+ STA
14   CC ?[ SP X) LDA  >IN    STA  \ STREAM EXHAUSTED
15         SP )Y LDA  >IN 1+ STA
   ATARIVF.FB Scr 59 Dr 0 
 0 \ (WORD                       08APR85BP)
 1 
 2 ][ 4 # LDY  [[  N LDA  N 1+ ORA         \ SKIP CHAR'S
 3        0= NOT ?[[ N 2+ X) LDA SP )Y CMP \ WHILE COUNT <>0
 4        0=     ?[[ N 2+ WINC  N WDEC ]]?
 5     N 2+  LDA  N 4 + STA       \ SAVE STRING_START_ADRESS
 6     N 3 + LDA  N 5 + STA
 7     [[  N 2+ X) LDA  SP )Y CMP PHP      \ SCAN FOR CHAR
 8         N 2+ WINC  N WDEC PLP
 9     0= NOT ?[[ N 6 + INC     \ COUNT STRING_LENGTH
10        N LDA N 1+ ORA
11     0= ?]  ]? ]?              \ FROM COUNT = 0 IN SKIP)
12  SEC 2 # LDY
13        \ ADR_AFTER_STRING - ADR0 =: >IN)
14  N 2+  LDA  SP )Y SBC  >IN    STA  INY
15  N 3 + LDA  SP )Y SBC  >IN 1+ STA
   ATARIVF.FB Scr 60 Dr 0 
 0 \ (WORD                       08APR85BP)              cas08jan07
 1 
 2 ]? \ FROM 1ST ][, STREAM WAS EXHAUSTED
 3    \ WHEN WORD CALLED)
 4  CLC  4 # LDA  SP ADC  SP STA
 5   CS ?[ SP 1+ INC ]?  \ 2DROP
 6  USER' DP # LDY  UP )Y LDA
 7  SP X) STA N    STA  INY
 8  UP )Y LDA 1 # LDY
 9  SP )Y STA N 1+ STA        \ DP @
10  DEY N 6 + LDA  \ STORE COUNT BYTE FIRST
11  [[  N )Y STA  N 4 + )Y LDA  INY
12      N 6 + DEC  0< ?]
13  $20 # LDA  N )Y STA       \ ADD A BLANK
14  1 # LDY   NEXT JMP   END-CODE
15 
   ATARIVF.FB Scr 61 Dr 0 
 0 \ SOURCE WORD PARSE NAME      08APR85BP)              cas21dec05
 1 
 2 : SOURCE   ( -- ADDR LEN)
 3     TIB #TIB @  ;
 4 
 5 : WORD  ( CHAR -- ADDR)   SOURCE (WORD ;
 6 
 7 : PARSE ( CHAR -- ADDR LEN) >R SOURCE  >IN @  /STRING OVER SWAP
 8                   R> SCAN >R OVER - DUP R> 0<> - >IN +! ;
 9 
10 : NAME   ( -- ADDR)  BL WORD  CAPITALIZE  EXIT  ;
11 
12 \\ : WORD  ( CHAR -- ADDR)        >R
13  SOURCE  OVER SWAP  >IN @  /STRING  R@ SKIP  OVER  SWAP  R>
14  SCAN >R  ROT OVER SWAP  - R> 0<> -  >IN !
15  OVER - HERE PLACE  BL HERE COUNT + C! HERE ;
   ATARIVF.FB Scr 62 Dr 0 
 0 \ STATE ASCII ,"  ("  "       24DEC83KS)
 1 
 2 VARIABLE STATE    0 STATE !
 3 
 4 : ASCII   BL WORD 1+ C@ STATE @
 5           IF [COMPILE] LITERAL THEN ; IMMEDIATE
 6 
 7 : ,"      ASCII "  PARSE  HERE OVER 1+  ALLOT PLACE  ;
 8 
 9 : "LIT    R> R> UNDER COUNT + >R >R ;  RESTRICT
10 
11 : ("      "LIT ; RESTRICT
12 
13 : "       COMPILE ("  ,"  ; IMMEDIATE RESTRICT
14 
15 
   ATARIVF.FB Scr 63 Dr 0 
 0 \ ." ( .( \ \\ HEX DECIMAL    08SEP84KS)              cas08jan07
 1 
 2 : (."    "LIT COUNT TYPE ; RESTRICT
 3 : ."     COMPILE (." ," ;  IMMEDIATE RESTRICT
 4 : (      ASCII )  PARSE 2DROP ;          IMMEDIATE
 5 : .(     ASCII )  PARSE TYPE ;           IMMEDIATE
 6 : \      >IN @  C/L /  1+ C/L *  >IN ! ; IMMEDIATE
 7 ' \ ALIAS \\
 8 
 9 : \NEEDS    NAME FIND NIP  IF  [COMPILE] \  THEN ;
10 
11 : HEX       $10 BASE ! ;        : DECIMAL    $0A BASE ! ;
12 
13 
14 
15 
   ATARIVF.FB Scr 64 Dr 0 
 0 \ NUMBER CONV.:  DIGIT?  ACCUMULATE  KS)              cas08jan07
 1 : DIGIT?  ( CHAR -- DIGIT TRUE/ FALSE )
 2  ASCII 0 -   DUP 9 U>
 3  IF [ ASCII A ASCII 9 - 1- ] LITERAL -  DUP 9 U>
 4      IF [ 2SWAP ( UNSTRUKTURIERT) ] THEN
 5    BASE @  OVER  U>  ?DUP  ?EXIT    THEN DROP  FALSE ;
 6 
 7 : ACCUMULATE ( +D0 ADR DIGIT - +D1 ADR)
 8  SWAP >R SWAP  BASE @ UM*  DROP  ROT  BASE @ UM*  D+  R>  ;
 9 
10 : CONVERT  ( +D1 ADDR0 -- +D2 ADDR2)
11     1+  BEGIN  COUNT DIGIT? WHILE  ACCUMULATE    REPEAT  1- ;
12 
13 | : END?      ( -- FLAG )               PTR @  0= ;
14 | : CHAR      ( ADDR0 -- ADDR1 CHAR )   COUNT   -1 PTR +!  ;
15 | : PREVIOUS  ( ADDR0 -- ADDR0 CHAR)    1-  COUNT ;
   ATARIVF.FB Scr 65 Dr 0 
 0 \ ?NONUM ?NUM FIXBASE?        13FEB85KS)              cas08jan07
 1 
 2 VARIABLE DPL   -1 DPL !
 3 
 4 | : ?NONUM   ( FLAG -- EXIT IF TRUE )
 5      IF RDROP 2DROP DROP RDROP FALSE THEN ;
 6 
 7 | : ?NUM     ( FLAG -- EXIT IF TRUE )
 8      IF RDROP DROP R> IF  DNEGATE  THEN
 9      ROT DROP  DPL @ 1+  ?DUP ?EXIT DROP TRUE THEN ;
10 | : FIXBASE? ( CHAR - CHAR FALSE /  NEWBASE TRUE )
11      ASCII & CASE?  IF $0A TRUE EXIT THEN
12      ASCII $ CASE?  IF $10 TRUE EXIT THEN
13      ASCII H CASE?  IF $10 TRUE EXIT THEN
14      ASCII % CASE?  IF $02 TRUE EXIT THEN FALSE  ;
15 
   ATARIVF.FB Scr 66 Dr 0 
 0 \ PUNCTUATION ?DPL PTR        13FEB85KS)              cas08jan07
 1 
 2 | : PUNCTUATION?   ( CHAR -- FLAG)
 3      ASCII , OVER = SWAP ASCII . =  OR ;
 4 
 5 | : ?DPL   DPL @ -1 = ?EXIT  1 DPL +! ;
 6 
 7 | VARIABLE PTR      \ POINTS INTO STRING
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 67 Dr 0 
 0 \ (NUMBER  NUMBER             13FEB85KS)              cas09jan07
 1 : NUMBER?   ( STRING - STRING FALSE / N 0< / D 0> )
 2      BASE PUSH  DUP COUNT  PTR !  DPL ON
 3      0 >R  ( +SIGN)
 4      0.0 ROT           END? ?NONUM CHAR
 5      ASCII - CASE?
 6      IF RDROP TRUE >R  END? ?NONUM CHAR THEN FIXBASE?
 7      IF  BASE !        END? ?NONUM CHAR THEN
 8      BEGIN   DIGIT?  0= ?NONUM
 9        BEGIN  ACCUMULATE  ?DPL  END? ?NUM
10           CHAR DIGIT?  0= UNTIL
11        PREVIOUS  PUNCTUATION?  0= ?NONUM
12        DPL OFF   END? ?NUM CHAR REPEAT ;
13 DEFER 'NUMBER?    ' NUMBER?  IS  'NUMBER?
14 : NUMBER  ( STRING -- D )
15      'NUMBER?  ?DUP 0= ABORT" ?" 0< IF EXTEND THEN ;
   ATARIVF.FB Scr 68 Dr 0 
 0 \ HIDE REVEAL IMMEDIATE RESTRICT     KS)              cas08jan07
 1 VARIABLE LAST     0 LAST !
 2 
 3 | : LAST?   ( -- FALSE / ACF TRUE) LAST @ ?DUP ;
 4 
 5 : HIDE    LAST?  IF 2- @ CURRENT @ ! THEN ;
 6 
 7 : REVEAL  LAST?  IF 2-   CURRENT @ ! THEN ;
 8 
 9 : RECURSIVE   REVEAL  ;   IMMEDIATE RESTRICT
10 
11 | : FLAG!  ( 8B --) LAST? IF UNDER C@ OR OVER C! THEN   DROP ;
12 
13 : IMMEDIATE  $40 FLAG! ;
14 : RESTRICT   $80 FLAG! ;
15 
   ATARIVF.FB Scr 69 Dr 0 
 0 \ CLEARSTACK HALLOT HEAP HEAP?11FEB85BP)              cas08jan07
 1 
 2 CODE CLEARSTACK USER' S0 # LDY
 3      UP )Y LDA  SP STA  INY  UP )Y LDA  SP 1+ STA
 4      1 # LDY  NEXT JMP   END-CODE
 5 
 6 : HALLOT ( QUAN -- )  S0 @ OVER - SWAP
 7      SP@ 2+  DUP ROT -  DUP S0 !
 8      2 PICK OVER -  MOVE  CLEARSTACK  S0 ! ;
 9 
10 : HEAP   ( -- ADDR)        S0 @  6+ ;
11 
12 : HEAP?  ( ADDR -- FLAG)   HEAP UP@ UWITHIN ;
13 
14 | : HEAPMOVE   ( FROM -- FROM) DUP HERE  OVER -
15       DUP HALLOT  HEAP SWAP CMOVE HEAP OVER - LAST +!  REVEAL ;
   ATARIVF.FB Scr 70 Dr 0 
 0 \ DOES>  ;                 30DEC84KS/BP)              cas08jan07
 1 
 2 LABEL (DODOES>   RP 2DEC
 3       IP 1+ LDA  RP )Y STA  IP LDA  RP X) STA  \ PUT IP ON RP
 4       CLC  W X) LDA  3 # ADC  IP STA
 5       TXA  W )Y ADC  IP 1+ STA  \ W@ + 3 -> IP
 6 LABEL DOCREATE
 7       2 # LDA  CLC  W ADC  PHA  TXA  W 1+ ADC  PUSH JMP END-CODE
 8 
 9 | : (;CODE    R> LAST @  NAME>  ! ;
10 
11 : DOES> COMPILE (;CODE  $4C C,
12     COMPILE (DODOES> ;  IMMEDIATE RESTRICT
13 
14 
15 
   ATARIVF.FB Scr 71 Dr 0 
 0 \ 6502-ALIGN  ?HEAD  \        08SEP84BP)              cas08jan07
 1 
 2 | : 6502-ALIGN/1   ( ADR -- ADR' ) DUP  $FF AND  $FF =  - ;
 3 
 4 | : 6502-ALIGN/2   ( LFA -- LFA )
 5    HERE  $FF AND $FF =
 6    IF  DUP DUP 1+  HERE OVER - 1+ CMOVE>  \ LFA NOW INVALID
 7        1 LAST +! 1 ALLOT  THEN  ;
 8 
 9 VARIABLE ?HEAD    0 ?HEAD !
10 
11 : | ?HEAD @  ?EXIT -1 ?HEAD  ! ;
12 
13 
14 
15 
   ATARIVF.FB Scr 72 Dr 0 
 0 \ WARNING   CREATE            30DEC84BP)              cas10jan07
 1 
 2 VARIABLE WARNING  0 WARNING !
 3 
 4 | : EXISTS?
 5     WARNING @ 0= ?EXIT
 6     LAST @  CURRENT @  (FIND  NIP
 7     IF SPACE  LAST @ .NAME ." EXISTS " ?CR THEN  ;
 8 
 9 : CREATE  HERE 0 ,  CURRENT @ @ ,
10     NAME  C@ DUP 1 $20  UWITHIN NOT  ABORT" INVALID NAME"
11     HERE  LAST ! 1+ ALLOT  EXISTS? ?HEAD @
12     IF 1 ?HEAD +!  DUP  6502-ALIGN/1 , \ POINTER TO CODE
13        HEAPMOVE $20 FLAG! 6502-ALIGN/1 DP !
14     ELSE  6502-ALIGN/2  DROP THEN  REVEAL  0 ,
15     ;CODE  DOCREATE JMP END-CODE
   ATARIVF.FB Scr 73 Dr 0 
 0 \ NFA?                        30DEC84BP)
 1 | CODE NFA?  ( VOCABTHREAD  CFA -- NFA / FALSE)
 2     SP X) LDA  N 4 + STA  SP )Y LDA  N 5 + STA   SP 2INC
 3     [[ [[ SP X) LDA  N 2+  STA  SP )Y LDA  N 3 + STA
 4         N 2+ ORA  0= ?[ PUTFALSE JMP ]?
 5         N 2+ )Y LDA SP )Y STA  N 1+ STA
 6         N 2+ X) LDA SP X) STA  N STA
 7         N 1+ ORA  0= ?[  NEXT JMP  ]?  \ N=LINK
 8         N 2INC N X) LDA PHA SEC 01F # AND
 9         N ADC  N STA  CS ?[ N 1+ INC ]?
10          PLA  020 # AND  0= NOT
11          ?[ N )Y LDA  PHA
12             N X) LDA N STA PLA N 1+ STA ]?
13         N LDA     N 4 + CMP  0= ?]  \ VOCABTHREAD=0
14         N 1+ LDA  N 5 + CMP  0= ?]  \ D.H. LEERES VOCABULARY
15     ' 2+ @ JMP       END-CODE       \  IN NFA? IST ERLAUBT
   ATARIVF.FB Scr 74 Dr 0 
 0 \ >NAME NAME> >BODY .NAME     03FEB85BP)              cas08jan07
 1 
 2 : >NAME   ( CFA -- NFA / FALSE)  VOC-LINK
 3     BEGIN @ DUP WHILE 2DUP 4 - SWAP
 4         NFA? ?DUP IF -ROT 2DROP EXIT THEN REPEAT NIP ;
 5 
 6 | : (NAME>  ( NFA -- CFA) COUNT $1F AND + ;
 7 
 8 : NAME> ( NFA -- CFA)  DUP (NAME> SWAP C@ $20 AND IF @ THEN ;
 9 
10 : >BODY   ( CFA -- PFA)   2+ ;
11 
12 : .NAME   ( NFA --)
13     ?DUP IF DUP HEAP?  IF ." |" THEN COUNT $1F AND TYPE
14          ELSE  ." ???" THEN  SPACE  ;
15 
   ATARIVF.FB Scr 75 Dr 0 
 0 \ CREATE: : ; CONSTANT VARIABLE    09JAN85KS/BP)      cas10jan07
 1 
 2 : CREATE: CREATE HIDE 0 ] ;
 3 : : CREATE:  ;CODE HERE >RECOVER ! \ RESOLVE FWD. REFERENCE
 4        RP 2DEC IP    LDA  RP X) STA IP 1+ LDA  RP )Y STA
 5        W LDA  CLC  2 # ADC  IP STA  TXA   W 1+ ADC  IP 1+ STA
 6        NEXT JMP   END-CODE
 7 
 8 : ;        0 ?PAIRS  COMPILE EXIT  \ exit was unnest
 9  [COMPILE] [ REVEAL ; IMMEDIATE RESTRICT
10 
11 : CONSTANT  ( 16B --)  CREATE ,
12      ;CODE  SP 2DEC  2 # LDY  W )Y LDA  SP X) STA  INY
13      W )Y LDA   1 # LDY   SP )Y STA  NEXT JMP  END-CODE
14 
15 : VARIABLE   CREATE  2 ALLOT ;
   ATARIVF.FB Scr 76 Dr 0 
 0 \ UALLOT USER ALIAS        10JAN85KS/BP)              cas08jan07
 1 
 2 : UALLOT ( QUAN -- OFFSET)
 3     DUP UDP @ +  $FF U> ABORT" USERAREA FULL"
 4     UDP  @ SWAP UDP +! ;
 5 
 6 : USER  CREATE   2 UALLOT C,
 7    ;CODE  SP 2DEC  2 # LDY W )Y LDA  CLC UP    ADC  SP X) STA
 8    TXA  INY UP 1+ ADC  1 # LDY  SP )Y STA   NEXT JMP   END-CODE
 9 
10 : ALIAS  ( CFA --)
11    CREATE LAST @ DUP C@ $20 AND
12    IF   -2 ALLOT  ELSE  $20 FLAG! THEN  (NAME> ! ;
13 
14 
15 
   ATARIVF.FB Scr 77 Dr 0 
 0 \ VOC-LINK VP CURRENT CONTEXT ALSO   BP)              cas08jan07
 1 CREATE   VP       $10 ALLOT
 2 
 3 VARIABLE CURRENT
 4 
 5 : CONTEXT ( -- ADR  )  VP DUP @ + 2+ ;
 6 
 7 | : THRU.VOCSTACK  ( -- FROM TO ) VP 2+ CONTEXT ;
 8 \ "ONLY FORTH ALSO ASSEMBLER" GIVES VP :
 9 \  COUNTWORD = 6 \ONLY\FORTH\ASSEMBLER
10 
11 : ALSO     VP @
12  $A > ERROR" VOCABULARY STACK FULL"
13  CONTEXT @   2 VP +!  CONTEXT ! ;
14 
15 : TOSS   -2 VP +! ;
   ATARIVF.FB Scr 78 Dr 0 
 0 \  VOCABULARY FORTH ONLY FORTH-83 KS/BP)
 1 
 2 : VOCABULARY CREATE  0 , 0 ,
 3     HERE VOC-LINK @ ,  VOC-LINK ! DOES>  CONTEXT ! ;
 4 
 5 \ NAME \ CODE \ THREAD \ COLDTHREAD \ VOC-LINK
 6 
 7 VOCABULARY FORTH
 8 
 9 VOCABULARY ONLY
10 ] DOES>  [ ONLYPATCH ]  0 VP ! CONTEXT !  ALSO  ;  ' ONLY !
11 
12 : ONLYFORTH  ONLY FORTH ALSO DEFINITIONS ;
13 
14 
15 
   ATARIVF.FB Scr 79 Dr 0 
 0 \ DEFINITIONS ORDER WORDS  13JAN84BP/KS)
 1 
 2 : DEFINITIONS   CONTEXT @ CURRENT ! ;
 3 
 4 | : .VOC  ( ADR -- ) @ 2- >NAME .NAME ;
 5 
 6 : ORDER
 7  THRU.VOCSTACK  DO  I .VOC  -2  +LOOP  2 SPACES  CURRENT .VOC ;
 8 
 9 : WORDS      CONTEXT @
10    BEGIN  @ DUP STOP? 0= AND
11    WHILE  ?CR DUP 2+ .NAME SPACE REPEAT DROP ;
12 
13 
14 
15 
   ATARIVF.FB Scr 80 Dr 0 
 0 \ (FIND                       08APR85BP)
 1 
 2 CODE (FIND  ( STRING THREAD
 3        -- STRING FALSE / NAMEFIELD TRUE)
 4  3 # LDY [[ SP )Y LDA N ,Y STA DEY 0< ?]
 5  N 2+ X) LDA 01F # AND N 4 + STA
 6 LABEL FINDLOOP   0 # LDY
 7  N )Y LDA   TAX   INY
 8  N )Y LDA  N 1+ STA  N STX  N ORA
 9   0= ?[ 1 # LDY 0 # LDX PUTFALSE JMP ]?
10  INY N )Y LDA  01F # AND  N 4 + CMP
11   FINDLOOP BNE       \ COUNTBYTE MATCH
12  CLC 2 # LDA N    ADC N 5 + STA
13      0 # LDA N 1+ ADC N 6 + STA
14  N 4  + LDY
15   [[ N 2+ )Y LDA N 5 + )Y CMP
   ATARIVF.FB Scr 81 Dr 0 
 0 \ FIND (cont.)                                        cas08jan07
 1      FINDLOOP BNE   DEY  0= ?]
 2  3 # LDY N 6 + LDA  SP )Y STA   DEY
 3          N 5 + LDA  SP )Y STA
 4  DEY  0 # LDX    PUTTRUE JMP   END-CODE
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 82 Dr 0 
 0 \ FOUND                       29JAN85BP)              cas08jan07
 1 
 2 | CODE FOUND  ( NFA -- CFA N )
 3  SP X) LDA N STA  SP )Y LDA N 1+ STA
 4   N X) LDA N 2+ STA  $1F # AND  SEC N ADC N STA
 5   CS ?[ N 1+ INC ]?
 6  N 2+ LDA $20 # AND
 7  0= ?[ N    LDA  SP X) STA N 1+ LDA
 8     ][ N X) LDA  SP X) STA N )Y LDA   ]?  SP )Y STA
 9   SP 2DEC   N 2+ LDA   0< ?[  INY  ]?
10  .A ASL
11   0< NOT ?[ TYA $FF # EOR TAY INY  ]?
12   TYA SP X) STA
13   0< ?[ $FF # LDA  24 C, ]?
14  TXA  1 # LDY  SP )YSTA
15  NEXT JMP  END-CODE
   ATARIVF.FB Scr 83 Dr 0 
 0 \\                                                    cas08jan07
 1 
 2 | : FOUND  ( NFA -- CFA N )
 3       DUP   C@ >R   (NAME>
 4             R@ $20 AND  IF @ THEN
 5         -1  R@ $80 AND  IF 1- THEN
 6             R> $40 AND  IF NEGATE THEN ;
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 84 Dr 0 
 0 \ FIND  ' [']                 13JAN85BP)              cas21dec05
 1 
 2 : FIND ( STRING -- CFA N / STRING FALSE)
 3    CONTEXT DUP @ OVER 2- @ = IF 2- THEN
 4    BEGIN  UNDER @ (FIND IF NIP FOUND EXIT THEN
 5      OVER VP 2+ U>
 6    WHILE  SWAP 2-  REPEAT NIP FALSE ;
 7 
 8 : '  ( -- CFA ) NAME FIND 0= ABORT" WHAT?"  ;
 9 
10 : [COMPILE]   ' , ;             IMMEDIATE RESTRICT
11 
12 : [']     ' [COMPILE] LITERAL ; IMMEDIATE RESTRICT
13 
14 : NULLSTRING? ( STRING -- STRING FALSE  / TRUE)
15     DUP C@ 0=  DUP  IF NIP THEN ;
   ATARIVF.FB Scr 85 Dr 0 
 0 \ >INTERPRET                  28FEB85BP)              cas08jan07
 1 
 2 LABEL JUMP
 3  INY  CLC  W )Y LDA  2 # ADC  IP    STA
 4  INY       W )Y LDA  0 # ADC  IP 1+ STA
 5  1 # LDY  NEXT JMP   END-CODE
 6 VARIABLE >INTERPRET
 7 
 8 JUMP  ' >INTERPRET !
 9 
10 \\ MAKE VARIABLE >INTERPRET TO SPECIAL
11    DEFER
12 
13 
14 
15 
   ATARIVF.FB Scr 86 Dr 0 
 0 \ INTERPRET INTERACTIVE    31DEC84KS/BP)              cas21dec05
 1 
 2 DEFER  NOTFOUND
 3 
 4 : NO.EXTENSIONS ( STRING -- ) ERROR" WHAT?"   ;  \ STRING NOT 0
 5 
 6 ' NO.EXTENSIONS  IS  NOTFOUND
 7 
 8 : INTERPRET     >INTERPRET ;  -2 ALLOT
 9 
10 | : INTERACTIVE  ?STACK  NAME FIND  ?DUP
11      IF 1 AND IF EXECUTE >INTERPRET THEN
12       ABORT" COMPILE ONLY"  THEN  NULLSTRING? ?EXIT    NUMBER?
13   0= IF  NOTFOUND  THEN  >INTERPRET ;  -2 ALLOT
14 
15 ' INTERACTIVE  >INTERPRET !
   ATARIVF.FB Scr 87 Dr 0 
 0 \ COMPILING [ ]               20DEC84BP)              cas08jan07
 1 
 2 | : COMPILING
 3  ?STACK  NAME FIND   ?DUP
 4  IF   0> IF  EXECUTE >INTERPRET  THEN
 5   , >INTERPRET THEN
 6  NULLSTRING? ?EXIT  'NUMBER?   ?DUP
 7    IF 0> IF SWAP [COMPILE] LITERAL THEN
 8     [COMPILE] LITERAL
 9    ELSE  NOTFOUND THEN    >INTERPRET ; -2 ALLOT
10 
11 : [    ['] INTERACTIVE  IS >INTERPRET STATE OFF ;  IMMEDIATE
12 
13 : ]    ['] COMPILING    IS >INTERPRET STATE ON ;
14 
15 
   ATARIVF.FB Scr 88 Dr 0 
 0 \ PERFOM  DEFER IS            03FEB85BP)              cas08jan07
 1 
 2 | : CRASH   TRUE ABORT" CRASH" ;
 3 
 4 : DEFER   CREATE  ['] CRASH ,
 5     ;CODE  2 # LDY  W )Y LDA  PHA INY W )Y LDA
 6     W 1+ STA  PLA W STA  1 # LDY W 1- JMP  END-CODE
 7 
 8 : (IS            R>  DUP  2+ >R @ ! ;
 9 
10 | : DEF?  ( CFA -- ) @ ['] NOTFOUND   @ OVER =
11      SWAP ['] >INTERPRET @ = OR NOT  ABORT" NOT DEFERRED" ;
12 
13 : IS ( ADR -- )  ' DUP  DEF?  >BODY
14      STATE  @  IF  COMPILE (IS , EXIT  THEN !  ; IMMEDIATE
15 
   ATARIVF.FB Scr 89 Dr 0 
 0 \ ?STACK                      08SEP84KS)              cas08jan07
 1 | CREATE ALARM  1 ALLOT   0 ALARM C!
 2 | : STACKFULL   ( -- )
 3  DEPTH $20 > ABORT" TIGHT STACK"
 4  ALARM C@ 0= IF -1 ALARM C! TRUE ABORT" DICTIONARY FULL" THEN
 5        ." STILL FULL" ;
 6 
 7 CODE ?STACK USER' DP # LDY
 8       SEC  SP LDA  UP )Y SBC  N STA  INY  SP 1+ LDA  UP )Y SBC
 9   0= ?[ 1 # LDY ;C: STACKFULL ; ASSEMBLER ]?  alarm stx
10      USER' S0 # LDY  UP )Y LDA  SP CMP  INY
11      UP )Y LDA  SP 1+ SBC  1 # LDY  CS ?[  NEXT JMP ]?
12      ;C: TRUE ABORT" STACK EMPTY" ; -2 ALLOT
13 
14 \\  : ?STACK  SP@  HERE - 100 U< IF STACKFULL THEN
15          SP@  S0 @ U> ABORT" STACK EMPTY" ;
   ATARIVF.FB Scr 90 Dr 0 
 0 \ .STATUS PUSH LOAD           08SEP84KS)              cas08jan07
 1 
 2 DEFER .STATUS    ' NOOP IS .STATUS
 3 
 4 | CREATE PULL  0  ] R> R> ! ;
 5 
 6 : PUSH ( ADDR -- )
 7     R> SWAP DUP >R @ >R  PULL >R >R  ;  RESTRICT
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 91 Dr 0 
 0 \ RDEPTH DEPTH                                        cas08jan07
 1 
 2 : RDEPTH  ( -- +N)  R0 @  RP@ 2+ - 2/ ;
 3 
 4 : DEPTH   ( -- +N)  SP@ S0 @ SWAP - 2/ ;
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 92 Dr 0 
 0 \ QUIT (QUIT ABORT            07JUN85BP)              cas08jab07
 1 
 2 | : PROMPT  STATE @  IF ." ] "  EXIT  THEN  ."  OK" ;
 3 
 4 : (QUIT
 5     BEGIN .STATUS CR QUERY INTERPRET PROMPT  REPEAT ;  -2 ALLOT
 6 
 7 DEFER 'QUIT    ' (QUIT  IS 'QUIT
 8 
 9 : QUIT     R0 @ RP! [COMPILE] [ 'QUIT ;  -2 ALLOT
10 
11 : STANDARDI/O   [ OUTPUT ] LITERAL OUTPUT 4 CMOVE ;
12 
13 DEFER 'ABORT   ' NOOP IS 'ABORT
14 
15 : ABORT CLEARSTACK END-TRACE 'ABORT STANDARDI/O QUIT ; -2 ALLOT
   ATARIVF.FB Scr 93 Dr 0 
 0 \ (ERROR ABORT" ERROR"        20MAR85BP)              cas08jan07
 1 
 2 VARIABLE R#     0 R#  !
 3 
 4 : (ERROR  ( STRING -- )
 5     STANDARDI/O SPACE HERE .NAME COUNT TYPE  SPACE ?CR
 6     QUIT ; -2 ALLOT
 7 
 8 ' (ERROR  ERRORHANDLER  !
 9 
10 : (ABORT"    "LIT SWAP IF
11      >R CLEARSTACK R> ERRORHANDLER PERFORM
12      EXIT THEN  DROP ;  RESTRICT
13 
14 
15 
   ATARIVF.FB Scr 94 Dr 0 
 0 \ ABORT" ERROR"                                       cas08jan07
 1 
 2 | : (ERR"  "LIT SWAP
 3       IF ERRORHANDLER  PERFORM EXIT THEN DROP ;    RESTRICT
 4 
 5 : ABORT"  COMPILE (ABORT" ," ;   IMMEDIATE  RESTRICT
 6 
 7 : ERROR"  COMPILE (ERR"   ," ;    IMMEDIATE  RESTRICT
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 95 Dr 0 
 0 \ -TRAILING                   08APR85BP)              cas08jan07
 1 
 2 $20 CONSTANT BL
 3 
 4 CODE -TRAILING  ( ADDR N1 -- ADR  N2 )
 5  TYA   SETUP JSR
 6  SP X) LDA  N 2+ STA   CLC
 7  SP )Y LDA  N 1+ ADC  N 3 + STA
 8  N LDY  CLC   CS ?[
 9 LABEL (-TRAIL
10  DEY  N 2+ )Y LDA  BL # CMP
11   0<> ?[ INY  0= ?[ N 1+ INC ]?
12          TYA PHA  N 1+ LDA PUSH JMP ]?
13  ]?   TYA   (-TRAIL BNE
14  N 3 + DEC N 1 + DEC  (-TRAIL BPL
15  TYA PUSH0A JMP   END-CODE
   ATARIVF.FB Scr 96 Dr 0 
 0 \ SPACE SPACES             29JAN85KS/BP)
 1 
 2 : SPACE            BL EMIT ;
 3 
 4 : SPACES  ( U --)  0  ?DO SPACE LOOP ;
 5 
 6 \\
 7 : -TRAILING  ( ADDR N1 -- ADDR N2)
 8  2DUP  BOUNDS
 9     ?DO 2DUP + 1- C@ BL -
10       IF LEAVE THEN  1- LOOP  ;
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 97 Dr 0 
 0 \ HOLD <# #> SIGN # #S        24DEC83KS)              cas08jan07
 1 | : HLD  ( -- ADDR)    PAD 2- ;
 2 
 3 : HOLD  ( CHAR -- )     -1 HLD +! HLD @ C! ;
 4 
 5 : <#                   HLD HLD ! ;
 6 
 7 : #> ( 32B -- ADDR +N ) 2DROP HLD @  HLD OVER - ;
 8 
 9 : SIGN  ( N -- )  0< IF ASCII - HOLD THEN ;
10 
11 : #     ( +D1 -- +D2) BASE @ UD/MOD ROT $9 OVER <
12    IF [ ASCII A ASCII 9 - 1- ] LITERAL +
13    THEN  ASCII 0  +  HOLD ;
14 
15 : #S    ( +D -- 0 0 ) BEGIN # 2DUP  D0= UNTIL ;
   ATARIVF.FB Scr 98 Dr 0 
 0 \ PRINT NUMBERS               24DEC83KS)
 1 
 2 : D.R  -ROT UNDER DABS <# #S ROT SIGN #>
 3         ROT OVER MAX OVER - SPACES TYPE  ;
 4 
 5 : .R    SWAP EXTEND ROT D.R ;
 6 
 7 : U.R   0 SWAP D.R ;
 8 
 9 : D.    0 D.R SPACE ;
10 
11 : .     EXTEND D. ;
12 
13 : U.    0 D. ;
14 
15 
   ATARIVF.FB Scr 99 Dr 0 
 0 \ .S C/L L/S             24DEC83KS)              cas21cas08jan07
 1 
 2 : .S   SP@  S0 @  OVER - $20 UMIN BOUNDS ?DO I @ U.  2 +LOOP ;
 3 
 4 &40 CONSTANT C/L    \ SCREEN LINE LENGTH
 5 &24 CONSTANT L/S    \ LINES PER SCREEN
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 100 Dr 0 
 0 \ MULTITASKER PRIMITIVES      BP03NOV85)              cas08jan07
 1 CODE PAUSE   NEXT HERE 2- !  END-CODE
 2 
 3 : LOCK  ( ADDR --)
 4  DUP @  UP@ =  IF  DROP EXIT  THEN
 5  BEGIN  DUP @  WHILE  PAUSE  REPEAT UP@ SWAP ! ;
 6 
 7 : UNLOCK  ( ADDR --)   DUP LOCK OFF ;
 8 
 9 LABEL WAKE    WAKE >WAKE !
10  PLA  SEC  5 # SBC  UP STA  PLA  0 # SBC  UP 1+ STA
11  $4C # LDA  UP X) STA  6 # LDY  UP )Y LDA  SP STA
12  INY  UP )Y LDA  SP 1+ STA  1 # LDY
13  SP X) LDA  RP STA  SP )Y LDA  RP 1+ STA   SP 2INC
14  IP  # LDX  XPULL JMP  END-CODE
15 
   ATARIVF.FB Scr 101 Dr 0 
 0 \ BUFFER MECHANISM            15DEC83KS)              cas08jan07
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 102 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 103 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 104 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 105 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 106 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 107 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 108 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 109 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 110 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 111 Dr 0 
 0 \\                                                    cas11aug06
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 112 Dr 0 
 0 \ LIMIT  FIRST                                        cas08jan07
 1 
 2 $BC00 CONSTANT LIMIT
 3 VARIABLE FIRST
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 113 Dr 0 
 0 \ ENDPOINTS OF FORGET      04JAN85BP/KS)              cas08jan07
 1 | : \? ( NFA -- FLAG )   C@  $20  AND ;
 2 
 3 | : FORGET?  ( ADR NFA -- FLAG ) \ CODE IN HEAP OR ABOVE ADR ?
 4      NAME> UNDER 1+ U< SWAP  HEAP?  OR ;
 5 
 6 |  : ENDPOINTS  ( ADDR -- ADDR SYMB)
 7   HEAP VOC-LINK @ >R
 8   BEGIN R> @ ?DUP    \ THROUGH ALL VOCABS
 9   WHILE DUP >R 4 - >R \ LINK ON RETURNST.
10    BEGIN R> @ >R OVER 1- DUP R@  U<    \ UNTIL LINK  OR
11               SWAP  R@ 2+ NAME> U< AND \ CODE UNDER ADR
12    WHILE  R@ HEAP?  [ 2DUP ] UNTIL  \ SEARCH FOR A NAME IN HEAP
13     R@ 2+ \?  IF  OVER R@ 2+ FORGET?
14                IF R@ 2+ (NAME> 2+ UMAX THEN \ THEN UPDATE SYMB
15               THEN REPEAT RDROP   REPEAT  ;
   ATARIVF.FB Scr 114 Dr 0 
 0 \ REMOVE                       23JUL85WE
 1 
 2 | CODE REMOVE ( DIC SYMB THR - DIC SYMB)
 3    5 # LDY [[ SP )Y LDA N ,Y STA DEY 0< ?] USER' S0 # LDY
 4    CLC UP )Y LDA 6 # ADC N 6 + STA
 5    INY UP )Y LDA 0 # ADC N 7 + STA  1 # LDY
 6    [[ N X) LDA N 8 + STA N )Y LDA N 9 + STA N 8 + ORA  0<>
 7    ?[[ N 8 + LDA N 6 + CMP N 9 + LDA N 7 + SBC CS
 8      ?[ N 8 + LDA N 2 + CMP N 9 + LDA N 3 + SBC
 9      ][ N 4 + LDA N 8 + CMP N 5 + LDA N 9 + SBC
10      ]? CC
11      ?[ N 8 + X) LDA N X) STA N 8 + )Y LDA N )Y STA
12      ][ N 8 + LDA    N    STA N 9 + LDA N 1+ STA ]?
13    ]]? (DROP JMP   END-CODE
14 
15 
   ATARIVF.FB Scr 115 Dr 0 
 0 \ REMOVE-     FORGET-WORDS    29APR85BP)
 1 
 2 | : REMOVE-WORDS ( DIC SYMB -- DIC SYMB)
 3      VOC-LINK BEGIN @ ?DUP WHILE DUP >R 4 - REMOVE R> REPEAT  ;
 4 
 5 | : REMOVE-TASKS  ( DIC --)
 6      UP@  BEGIN  1+ DUP @ UP@ - WHILE  2DUP @ SWAP HERE UWITHIN
 7      IF DUP @ 1+ @ OVER ! 1-  ELSE  @ THEN REPEAT  2DROP ;
 8 
 9 | : REMOVE-VOCS  ( DIC SYMB -- DIC SYMB)
10      VOC-LINK REMOVE THRU.VOCSTACK
11       DO  2DUP I @  -ROT  UWITHIN
12         IF   [ ' FORTH 2+ ] LITERAL I ! THEN -2 +LOOP
13       2DUP   CURRENT @  -ROT   UWITHIN
14      IF [ ' FORTH 2+ ] LITERAL CURRENT ! THEN ;
15 
   ATARIVF.FB Scr 116 Dr 0 
 0 \ FORGET-WORDS                                        cas08jan07
 1 
 2 DEFER CUSTOM-REMOVE
 3 ' NOOP IS CUSTOM-REMOVE
 4 
 5 
 6 | : FORGET-WORDS    ( DIC SYMB --)
 7      OVER REMOVE-TASKS REMOVE-VOCS
 8           REMOVE-WORDS CUSTOM-REMOVE
 9      HEAP SWAP - HALLOT DP !  0 LAST ! ;
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 117 Dr 0 
 0 \ DELETING WORDS FROM DICT.   13JAN83KS)
 1 
 2 : CLEAR HERE   DUP UP@ FORGET-WORDS   DP ! ;
 3 
 4 : (FORGET ( ADR --) DUP  HEAP? ABORT" IS SYMBOL"
 5     ENDPOINTS FORGET-WORDS ;
 6 
 7 : FORGET  ' DUP [ DP ] LITERAL @ U<  ABORT" PROTECTED"
 8    >NAME DUP HEAP? IF  NAME>  ELSE  2- 2-  THEN (FORGET ;
 9 
10 : EMPTY  [ DP ] LITERAL @
11    UP@ FORGET-WORDS [ UDP ] LITERAL @  UDP ! ;
12 
13 
14 
15 
   ATARIVF.FB Scr 118 Dr 0 
 0 \ SAVE BYE STOP? ?CR       20OCT84KS/BP)              cas08jan07
 1 
 2 : SAVE
 3    HERE UP@ FORGET-WORDS VOC-LINK @
 4    BEGIN  DUP 2- 2-  @  OVER 2- !  @ ?DUP 0=  UNTIL
 5    UP@ ORIGIN $100 CMOVE ;
 6 
 7 : BYE (BYE ;
 8 
 9 | : END?    KEY #CR = IF TRUE RDROP THEN ;
10 
11 : STOP?   ( -- FLAG) KEY? IF END? END? THEN FALSE ;
12 
13 : ?CR   COL C/L $A - U> IF CR THEN ;
14 
15 
   ATARIVF.FB Scr 119 Dr 0 
 0 \ IN/OUTPUT STRUCTURE         02MAR85BP)              cas08jan07
 1 | : OUT:  CREATE DUP C,  2+ DOES> C@ OUTPUT @ +  PERFORM ;
 2 
 3   : OUTPUT:  CREATE: DOES>  OUTPUT ! ;
 4 0  OUT: EMIT   OUT: CR     OUT: TYPE
 5    OUT: DEL    OUT: PAGE   OUT: AT    OUT: AT?  DROP
 6 
 7 : ROW   ( -- ROW)  AT? DROP ;
 8 : COL   ( -- COL)  AT? NIP ;
 9 
10 | : IN:    CREATE DUP C, 2+ DOES> C@ INPUT @ + PERFORM ;
11 
12   : INPUT:  CREATE: DOES> INPUT ! ;
13 
14 0  IN: KEY   IN: KEY?   IN: DECODE  IN: EXPECT   DROP
15 
   ATARIVF.FB Scr 120 Dr 0 
 0 \ ALIAS  ONLY DEFINITIONEN    29JAN85BP)
 1 
 2 ONLY DEFINITIONS FORTH
 3 
 4 : SEAL  0 ['] ONLY  >BODY  ! ;  \ KILL ALL WORDS IN ONLY)
 5 
 6       ' ONLY  ALIAS ONLY
 7       ' FORTH ALIAS FORTH
 8       ' WORDS ALIAS WORDS
 9       ' ALSO  ALIAS ALSO
10 ' DEFINITIONS ALIAS DEFINITIONS
11 HOST TARGET
12 
13 
14 
15 
   ATARIVF.FB Scr 121 Dr 0 
 0 \ 'COLD                                               cas08jan07
 1 | : INIT-VOCABULARYS   VOC-LINK @
 2      BEGIN  DUP  2- @  OVER 4 - ! @ ?DUP 0= UNTIL ;
 3 
 4 DEFER  'COLD    ' NOOP IS 'COLD
 5 
 6 | : (COLD INIT-VOCABULARYS ONLYFORTH 'COLD PAGE LOGO COUNT TYPE
 7     CR (RESTART ; -2 ALLOT
 8 
 9 DEFER 'RESTART  ' NOOP IS 'RESTART
10 
11 | : (RESTART ['] (QUIT IS 'QUIT
12     'RESTART  [ ERRORHANDLER ] LITERAL @ ERRORHANDLER !
13     [']  NOOP IS 'ABORT ABORT  ;  -2 ALLOT
14 
15 
   ATARIVF.FB Scr 122 Dr 0 
 0 \ COLD BOOTSYSTEM RESTART     09JUL85WE)              cas08jan07
 1 CODE COLD        HERE >COLD !
 2  ' (COLD >BODY $100 U/MOD # LDA PHA  # LDA PHA
 3 LABEL BOOTSYSTEM  CLI 0 # LDY
 4  CLC S0 LDA 6 # ADC N STA S0 1+ LDA 0 # ADC N 1+ STA
 5  [[ ORIGIN ,Y LDA N )Y STA INY 0= ?]
 6  $C lda  HERE 9 + sta  $D lda HERE 5 + sta
 7 LABEL WARMBOOT  $e474 jsr BOOTNEXTLEN 1- # LDY
 8  [[ BOOTNEXT ,Y LDA PUTA ,Y STA DEY 0< ?]
 9  CLC S0 LDA 6 # ADC UP STA S0 1+ LDA 0 # ADC UP 1+ STA
10  USER' S0 # LDY  UP )Y LDA SP STA INY  UP )Y LDA SP 1+ STA
11  USER' R0 # LDY  UP )Y LDA RP STA INY  UP )Y LDA RP 1+ STA
12  0 # LDX 1 # LDY TXA RP X) STA RP )Y STA
13  PLA IP STA PLA IP 1+ STA
14 LABEL DOSINI 0 # lda $D sta 0 # lda $C sta
15 LABEL XYNEXT 0 # LDX 1 # LDY NEXT JMP END-CODE
   ATARIVF.FB Scr 123 Dr 0 
 0 \ ( RESTART  PARAM.-PASSING TO FORTH   BP)            cas08jan07
 1 
 2 CODE RESTART       HERE >RESTART !
 3  ' (RESTART >BODY $100 U/MOD
 4  # LDA  PHA  # LDA PHA WARMBOOT JMP   END-CODE
 5 
 6  >RESTART @ $100 U/MOD DOSINI 1+ C! DOSINI 5 + C!
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 124 Dr 0 
 0 \ CODE FOR PARAMETER-PASSING TO FORTH                 cas11aug06
 1 CR .( Include Atari 8bit IO definitions )
 2 include atariio.fb  CR
 3 
 4 HOST  ' TRANSIENT 8 + @
 5 TRANSIENT  FORTH  CONTEXT @ 6 + !
 6 TARGET
 7 
 8 FORTH ALSO DEFINITIONS
 9 
10 : FORTH-83 ;  \ LAST WORD IN DICTIONARY
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 125 Dr 0 
 0 \ SYSTEM DEPENDENT CONSTANTS      BP/KS)
 1 
 2 VOCABULARY ASSEMBLER
 3 ASSEMBLER DEFINITIONS
 4 TRANSIENT  ASSEMBLER
 5 PUSHA  CONSTANT PUSHA           \ PUT A SIGN-EXTENDED ON STACK
 6 PUSH0A CONSTANT PUSH0A          \ PUT A ON STACK
 7 PUSH   CONSTANT PUSH            \ MSB IN A AND LSB ON JSR-STACK
 8 RP     CONSTANT RP
 9 UP     CONSTANT UP
10 SP     CONSTANT SP
11 IP     CONSTANT IP
12 N      CONSTANT N
13 PUTA   CONSTANT PUTA
14 W      CONSTANT W
15 SETUP  CONSTANT SETUP
   ATARIVF.FB Scr 126 Dr 0 
 0 \ NEXT XYNEXT   LABELS                                cas11aug06
 1 NEXT   CONSTANT NEXT
 2 XYNEXT CONSTANT XYNEXT
 3 (2DROP CONSTANT POPTWO
 4 (DROP  CONSTANT POP
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIVF.FB Scr 127 Dr 0 
 0 \ SYSTEM PATCHUP                                      cas11aug06
 1 
 2 FORTH DEFINITIONS
 3 
 4 $BC00 ' LIMIT >BODY !   $BC00 FIRST !
 5 $BA00 S0 !  $BB80 R0 !
 6 
 7 S0 @ DUP S0 2- !      6 + S0 7 - !
 8 HERE DP !
 9 
10 HOST  TUDP @          TARGET  UDP !
11 HOST  TVOC-LINK @     TARGET  VOC-LINK !
12 HOST  MOVE-THREADS
13 
14 
15 
 ok
}}}

! I/O Definitions

{{{
PRT2C
 ok
14 0 pall    ATARIIO.FB Scr 0 Dr 0 
 0 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIIO.FB Scr 1 Dr 0 
 0 \ loadscreen fuer ATARI 8bit                          cas11aug06
 1 \ 800 / 600 XL / 800 XL / 1200 XL / 130 XE / 65 XE / 800 XE
 2 
 3  1  &14 +thru
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIIO.FB Scr 2 Dr 0 
 0 \ 65KEY? GETKEY                                       cas09jan07
 1 
 2 | $02FC Constant CH
 3 | CODE 65KEY? ( -- FLAG) CH lda clc 1 # adc push0a jmp end-code
 4 
 5  LABEL GETCHK $E425 lda pha $E424 lda pha rts
 6 | CODE GETKEY  ( -- 8B) $FF sty $FE stx GETCHK jsr
 7                         $FE ldx $FF ldy  push0a jmp end-code
 8 
 9 | $02F0 Constant CRSINH
10 | CODE CURON   ( --) 01 # lda
11      LABEL CRS01    CRSINH sta NEXT JMP END-CODE
12 | CODE CUROFF  ( --) 00 # lda CRS01 JMP END-CODE
13 
14 | : 65KEY  ( -- 8B)
15     CURON BEGIN PAUSE 65KEY?  UNTIL CUROFF GETKEY ;
   ATARIIO.FB Scr 3 Dr 0 
 0 \ DECODE EXPECT KEYBOARD      BP28MAY85)              cas09jan07
 1 $7E CONSTANT #BS   $9B CONSTANT #CR  &27 CONSTANT #ESC
 2 
 3 | : 65DECODE  ( ADDR CNT1 KEY -- ADDR CNT2)
 4    #BS CASE?  IF  DUP  IF DEL 1- THEN EXIT  THEN
 5    #CR CASE?  IF  DUP SPAN ! EXIT THEN
 6    >R  2DUP +  R@ SWAP C!  R> EMIT  1+ ;
 7 
 8 | : 65EXPECT ( ADDR LEN1 -- )  SPAN !  0
 9    BEGIN  DUP SPAN @  U<
10    WHILE  KEY  DECODE
11    REPEAT 2DROP SPACE ;
12 
13 INPUT: KEYBOARD   [ HERE INPUT ! ]
14  65KEY 65KEY? 65DECODE 65EXPECT [
15 
   ATARIIO.FB Scr 4 Dr 0 
 0 \ (emit 65emit        )                               cas09jan07
 1 
 2 LABEL OUTCHK
 3   $E407 lda pha $E406 lda pha txa rts
 4 
 5 | Code (emit ( 8b -- ) $FF sty $FE stx
 6                      SP X) lda tax OUTCHK jsr
 7                      $FE ldx $FF ldy (drop jmp end-code
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIIO.FB Scr 5 Dr 0 
 0 \ EMIT CR DEL PAGE AT AT?     25JAN85RE)              cas09jan07
 1 
 2 | &40 Constant c/row
 3 
 4 | : 65emit   ( 8b -- ) (emit ;
 5 
 6 | : 65CR     #CR 65emit ;
 7 
 8 | : 65DEL    #bs 65emit  SPACE  #bs 65emit ;
 9 
10 | : 65PAGE   &125 EMIT ;
11 
12 | : 65at ( row col -- ) $55 ! $54 C! ;
13 
14 | : 65AT?  ( -- ROW COL ) $54 C@ $55 @ ;
15 
   ATARIIO.FB Scr 6 Dr 0 
 0 \                                                     cas09jan07
 1 
 2 | : 65type ( adr len -- ) bounds ?DO I c@ emit LOOP ;
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIIO.FB Scr 7 Dr 0 
 0 \ TYPE DISPLAY (BYE       BP  28MAY85RE)              cas09dec05
 1 
 2 OUTPUT: DISPLAY   [ HERE OUTPUT ! ]
 3  65EMIT 65CR 65TYPE 65DEL 65PAGE 65AT 65AT? [
 4 
 5 \ fix dosini vector and jump through dosvec
 6 | code (bye warmboot 1+ lda  $0C sta  warmboot 2+ lda
 7             $0D sta $000A ) jmp end-code
 8 
 9 
10 
11 
12 
13 
14 
15 
   ATARIIO.FB Scr 8 Dr 0 
 0 \ FileInterface                                       cas09jan07
 1 
 2 
 3 \  definitions for fileinterface
 4 
 5 &4 CONSTANT R/O   &8 CONSTANT W/O   &12 CONSTANT R/W
 6 3 CONSTANT IO-OPEN    5 CONSTANT IO-GETREC 7 CONSTANT IO-GETCHR
 7 9 CONSTANT IO-PUTREC $B CONSTANT IO-PUTCHR $C CONSTANT IO-CLOSE
 8 
 9 $340 CONSTANT ICFLG  $342 CONSTANT ICCOM  $343 CONSTANT ICSTA
10 $344 CONSTANT ICBAL  $345 CONSTANT ICBAH  $348 CONSTANT ICBLL
11 $349 CONSTANT ICBLH  $34A CONSTANT ICAX1  $34B CONSTANT ICAX2
12 $E456 CONSTANT CIOV
13 
14 
15 
   ATARIIO.FB Scr 9 Dr 0 
 0 \  definitions for fileinterface                      cas09jan07
 1 
 2 label freeiocb0  70 # lda label freeiocb2 tay ICFLG ,y lda
 3       $FF # cmp 0<> ?[ tya sec $10 # sbc freeiocb2 bne ]?
 4       tya rts
 5 
 6 | code freeiocb freeiocb0 jsr .a lsr .a lsr .a lsr .a lsr pha
 7               push0a jmp end-code
 8 
 9 label getfileid sp x) lda .a ASL .a ASL .a ASL .a ASL tay rts
10 
11 label getparam 2 # ldy  sp )y lda  ICBLL ,x sta
12                    iny  sp )y lda  ICBLH ,x sta
13                    iny  sp )y lda  ICBAL ,x sta
14                    iny  sp )y lda  ICBAH ,x sta
15                    rts
   ATARIIO.FB Scr 10 Dr 0 
 0 \  definitions for fileinterface                      cas13dec05
 1 
 2 code close-file  getfileid jsr tax IO-CLOSE # lda ICCOM ,x sta
 3          CIOV jsr  sp 2inc ICSTA ,x lda  0>= ?[ 0 # lda ]? pha
 4                  PUSH0A jmp end-code
 5 
 6 code open-file   freeiocb0 jsr tax  IO-OPEN # lda ICCOM ,y sta
 7                  4 # ldy  sp )y lda  ICBAL ,x sta
 8                      iny  sp )y lda  ICBAH ,x sta
 9                  0 # ldy  sp )y lda  ICAX1 ,x sta
10                      tya             ICAX2 ,x sta
11      CIOV jsr sp 2inc 0 # ldy ICSTA ,x lda  sp )y sta
12           0>= ?[ 0 # lda sp )y sta ]? 0 # lda tay iny sp )y sta
13                  iny iny sp )y sta txa clc .a lsr .a lsr .a lsr
14                  .a lsr dey sp )y sta xynext jmp end-code
15 
   ATARIIO.FB Scr 11 Dr 0 
 0 \  definitions for fileinterface                      cas11aug06
 1 
 2 code read-file ( caddr u fileid -- u2 ior )
 3      getfileid jsr  tax  getparam jsr
 4         IO-GETCHR # lda  ICCOM ,x sta
 5         CIOV jsr   sp 2inc  0 # ldy
 6         ICSTA ,x lda  sp )y sta
 7         0>= ?[ 0 # lda  sp )y sta ]?  tya iny sp )y sta
 8         clc  iny  ICBLL ,x lda  sp )y sta
 9              iny  ICBLH ,x lda  sp )y sta  xynext jmp end-code
10 
11 
12 
13 
14 
15 
   ATARIIO.FB Scr 12 Dr 0 
 0 \  definitions for fileinterface                      cas11aug06
 1 
 2 code read-line ( caddr u fileid -- u2 flag ior )
 3    getfileid jsr  tax  getparam jsr
 4       IO-GETREC # lda  ICCOM ,x sta
 5       CIOV jsr 0 # ldy
 6       ICSTA ,x lda
 7        0>= ?[ tya ]? sp )y sta
 8    4 # ldy ICBLL ,x lda  sp )y sta
 9    ICBAL ,x adc  tay dey n sty  5 # ldy ICBLH ,x lda sp )y sta
10    ICBAH ,x adc  n 1+ sta  0 # lda  tay  n )y sta iny
11    sp )y sta iny sp )y sta iny sp )y sta xynext jmp end-code
12 
13 
14 
15 
   ATARIIO.FB Scr 13 Dr 0 
 0 \  definitions for fileinterface                      cas11aug06
 1 
 2 code write-file ( caddr u fileid -- ior )
 3      getfileid jsr  tax  getparam jsr
 4         IO-PUTCHR # lda  ICCOM ,x sta
 5         CIOV jsr   sp 2inc sp 2inc  0 # ldy
 6         ICSTA ,x lda  sp )y sta
 7         0>= ?[ 0 # lda  sp )y sta ]?
 8         xynext jmp end-code
 9 
10 
11 
12 
13 
14 
15 
 ok
display PRT2C
   ATARIIO.FB Scr 14 Dr 0 
 0 \  definitions for fileinterface                      cas09jan07
 1 VARIABLE SOURCE-ID  0 SOURCE-ID !
 2 | $580 CONSTANT FNBUF
 3 : REFILL tib $50 erase tib $50 SOURCE-ID @ READ-LINE
 4          ROT 1 - #tib ! >in off nip ;
 5 : INCLUDE-FILE ( fileid -- )
 6   SOURCE-ID ! BEGIN REFILL $80 < WHILE INTERPRET .STATUS REPEAT
 7   SOURCE-ID @ CLOSE-FILE ABORT" File Error" ;
 8 : INCLUDED ( caddr u -- )
 9   SOURCE-ID @  >R   R/O OPEN-FILE DUP $80 < IF DROP
10   INCLUDE-FILE HERE $50 ERASE #TIB @ >IN ! ELSE
11   ." FileError:" . ABORT THEN R> SOURCE-ID ! ;
12 : FILE" FNBUF $50 BL FILL HERE $50 BL FILL ASCII " WORD
13         COUNT FNBUF SWAP CMOVE FNBUF 0 ;
14 : INCLUDE" ( FNAME ) FILE" INCLUDED ; IMMEDIATE
15 

}}}