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