VolksForth/sources/Apple1/6502f83.fth
Carsten Strotmann 91dfad1112 Apple 1 sources
2020-08-25 18:55:03 +02:00

2245 lines
138 KiB
Forth

\ *** Block No. 0 Hexblock 0
ende 123
\ *** Block No. 1 Hexblock 1
\ volksFORTH Loadscreen cas2013apr05
forth definitions
: (C [compile] ( ; IMMEDIATE \ : ) ; IMMEDIATE
$0300 CONSTANT BASEADDR \ base address of forth image
$7F00 CONSTANT TOPADDR
BASEADDR DISPLACE !
TARGET DEFINITIONS BASEADDR HERE!
hex &01 &126 +THRU
decimal
\ ASSEMBLER NONRELOCATE
.UNRESOLVED \ if this prints unresolved
\ definitions, check code
CR .( SAVE-TARGET 6502-FORTH83)
\ *** Block No. 2 Hexblock 2
\ FORTH PREAMBLE AND ID cas20130405
ASSEMBLER
NOP 0 JMP HERE 2- >LABEL >COLD
NOP 0 JMP HERE 2- >LABEL >RESTART
HERE DUP ORIGIN!
\ *** Block No. 3 Hexblock 3
\ Coldstartvalues and user variables cas2013apr05
\
0 JMP 0 JSR HERE 2- >LABEL >WAKE
END-CODE
0D6 ALLOT
\ Bootlabel
," VolksForth-83 3.8 COMPILED 05apr13CS"
\ *** Block No. 4 Hexblock 4
\ ZERO PAGE VARIABLES & NEXT cas 26jan06
\ adjust this to match your architecture
20 DUP >LABEL RP 2+
DUP >LABEL UP 2+
DUP >LABEL PUTA 1+
DUP >LABEL SP 2+
DUP >LABEL NEXT
DUP 5 + >LABEL IP
13 + >LABEL W
W 8 + >LABEL N
\ *** Block No. 5 Hexblock 5
\ NEXT, MOVED INTO ZERO PAGE 08APR85BP)
LABEL BOOTNEXT
-1 STA \ -1 IS DUMMY SP
IP )Y LDA W 1+ STA
-1 LDA W STA \ -1 IS DUMMY IP
CLC IP LDA 2 # ADC IP STA
CS NOT ?[ LABEL WJMP -1 ) JMP ]?
IP 1+ INC WJMP BCS END-CODE
\ *** Block No. 6 Hexblock 6
\ Bootnext and Endtrace cas 26jan06
HERE BOOTNEXT - >LABEL BOOTNEXTLEN
CODE END-TRACE ( PATCH NEXT FOR TRACE )
0A5 # LDA NEXT 0A + STA
IP # LDA NEXT 0B + STA
069 # LDA NEXT 0C + STA
02 # LDA NEXT 0D + STA
NEXT JMP END-CODE
\ *** Block No. 7 Hexblock 7
\ ;C: NOOP cas 26jan06
CREATE RECOVER ASSEMBLER
PLA W STA PLA W 1+ STA
W WDEC 0 JMP END-CODE
HERE 2- >LABEL >RECOVER
\ manual forward reference for JMP command
COMPILER ASSEMBLER ALSO DEFINITIONS
H : ;C: 0 T RECOVER JSR
END-CODE ] H ;
TARGET
CODE NOOP NEXT HERE 2- ! END-CODE
\ *** Block No. 8 Hexblock 8
\ USER VARIABLES cas2013apr05
CONSTANT ORIGIN 8 UALLOT DROP
\ FOR MULTITASKER
\ Adjust memory values for data stack and return stack here
USER S0 TOPADDR $F00 - S0 ! USER R0 TOPADDR $480 - R0 !
USER DP USER OFFSET 0 OFFSET !
USER BASE &10 BASE ! USER OUTPUT
USER INPUT
USER ERRORHANDLER \ POINTER FOR ABORT" -CODE
USER VOC-LINK
USER UDP \ POINTS TO NEXT FREE ADDR IN USER
\ *** Block No. 9 Hexblock 9
\ MANIPULATE SYSTEM POINTERS 29JAN85BP)
CODE SP@ ( -- ADDR)
SP LDA N STA SP 1+ LDA N 1+ STA
N # LDX
LABEL XPUSH
SP 2DEC 1 ,X LDA SP )Y STA
0 ,X LDA 0 # LDX PUTA JMP END-CODE
CODE SP! ( ADDR --)
SP X) LDA TAX SP )Y LDA
SP 1+ STA SP STX 0 # LDX
NEXT JMP END-CODE
\ *** Block No. 10 Hexblock A
\ UP@ UP! XPULL (XYDROP (DROP cas 26jan06
CODE UP@ ( -- ADDR)
UP # LDX XPUSH JMP END-CODE
CODE UP! ( ADDR --) UP # LDX
LABEL XPULL SP )Y LDA 1 ,X STA
DEY SP )Y LDA 0 ,X STA
LABEL (XYDROP 0 # LDX 1 # LDY
LABEL (DROP SP 2INC NEXT JMP
END-CODE RESTRICT
\ *** Block No. 11 Hexblock B
\ MANIPULATE RETURNSTACK 16FEB85BP/KS)
CODE RP@ ( -- ADDR )
RP # LDX XPUSH JMP END-CODE
CODE RP! ( ADDR -- )
RP # LDX XPULL JMP END-CODE RESTRICT
CODE >R ( 16B -- )
RP 2DEC SP X) LDA RP X) STA
SP )Y LDA RP )Y STA (DROP JMP
END-CODE RESTRICT
\ *** Block No. 12 Hexblock C
\ R> (RDROP (NRDROP cas 26jan06
CODE R> ( -- 16B)
SP 2DEC RP X) LDA SP X) STA
RP )Y LDA SP )Y STA
LABEL (RDROP 2 # LDA
LABEL (NRDROP CLC RP ADC RP STA
CS ?[ RP 1+ INC ]?
NEXT JMP END-CODE RESTRICT
\ *** Block No. 13 Hexblock D
\ R@ RDROP EXIT ?EXIT 08APR85BP)
CODE R@ ( -- 16B)
SP 2DEC RP )Y LDA SP )Y STA
RP X) LDA PUTA JMP
END-CODE
CODE RDROP (RDROP HERE 2- !
END-CODE RESTRICT
CODE EXIT
RP X) LDA IP STA
RP )Y LDA IP 1+ STA
(RDROP JMP END-CODE
\ *** Block No. 14 Hexblock E
\ EXECUTE PERFORM 08APR85BP)
CODE ?EXIT ( FLAG -- )
SP X) LDA SP )Y ORA
PHP SP 2INC PLP
' EXIT @ BNE NEXT JMP
END-CODE
CODE EXECUTE ( ADDR --)
SP X) LDA W STA
SP )Y LDA W 1+ STA
SP 2INC W 1- JMP END-CODE
: PERFORM ( ADDR -- ) @ EXECUTE ;
\ *** Block No. 15 Hexblock F
\ C@ C! CTOGGLE 10JAN85BP)
CODE C@ ( ADDR -- 8B)
SP X) LDA N STA SP )Y LDA N 1+ STA
LABEL (C@ 0 # LDA SP )Y STA
N X) LDA PUTA JMP END-CODE
CODE C! ( 16B ADDR --)
SP X) LDA N STA SP )Y LDA N 1+ STA
INY SP )Y LDA N X) STA DEY
LABEL (2DROP
SP LDA CLC 4 # ADC SP STA
CS ?[ SP 1+ INC ]?
NEXT JMP END-CODE
\ *** Block No. 16 Hexblock 10
\ @ ! +! 08APR85BP) er14dez88
: CTOGGLE ( 8B ADDR --) UNDER C@ XOR SWAP C! ;
CODE @ ( ADDR -- 16B)
SP X) LDA N STA SP )Y LDA N 1+ STA
N )Y LDA SP )Y STA
N X) LDA PUTA JMP END-CODE
CODE ! ( 16B ADDR --)
SP X) LDA N STA SP )Y LDA N 1+ STA
INY SP )Y LDA N X) STA
INY SP )Y LDA 1 # LDY
LABEL (!
N )Y STA (2DROP JMP END-CODE
\ *** Block No. 17 Hexblock 11
\ +! DROP cas 26jan06
CODE +! ( N ADDR --)
SP X) LDA N STA SP )Y LDA N 1+ STA
INY SP )Y LDA CLC N X) ADC N X) STA
INY SP )Y LDA 1 # LDY N )Y ADC
(! JMP END-CODE
CODE DROP ( 16B --)
(DROP HERE 2- ! END-CODE
\ *** Block No. 18 Hexblock 12
\ SWAP cas 26jan06
CODE SWAP ( 16B1 16B2 -- 16B2 16B1 )
SP )Y LDA TAX
3 # LDY SP )Y LDA N STA
TXA SP )Y STA
N LDA 1 # LDY SP )Y STA
INY 0 # LDX
SP )Y LDA N STA SP X) LDA SP )Y STA
DEY
N LDA PUTA JMP END-CODE
\ *** Block No. 19 Hexblock 13
\ DUP ?DUP 08MAY85BP) cas 26jan06
CODE DUP ( 16B -- 16B 16B)
SP 2DEC
3 # LDY SP )Y LDA 1 # LDY SP )Y STA
INY SP )Y LDA DEY
PUTA JMP END-CODE
CODE ?DUP ( 16B -- 16B 16B / FALSE)
SP X) LDA SP )Y ORA
0= ?[ NEXT JMP ]?
' DUP @ JMP END-CODE
\\ ?DUP and DUP in FORTH
\ : ?DUP ( 16B -- 16B 16B / FALSE)
\ DUP IF DUP THEN ;
\ : DUP SP@ @ ;
\ *** Block No. 20 Hexblock 14
\ OVER ROT 13JUN84KS) cas 26jan06
CODE OVER ( 16B1 16B2 - 16B1 16B3 16B1)
SP 2DEC 4 # LDY SP )Y LDA SP X) STA
INY SP )Y LDA 1 # LDY SP )Y STA
NEXT JMP END-CODE
\\ ROT OVER in FORTH
\ : ROT >R SWAP R> SWAP ;
\ : OVER >R DUP R> SWAP ;
\ *** Block No. 21 Hexblock 15
\ ROT cas 26jan06
CODE ROT ( 16B1 16B2 16B3 -- 16B2 16B3 16B1)
3 # LDY SP )Y LDA N 1+ STA
1 # LDY SP )Y LDA 3 # LDY SP )Y STA
5 # LDY SP )Y LDA N STA
N 1+ LDA SP )Y STA
1 # LDY N LDA SP )Y STA
INY SP )Y LDA N 1+ STA
SP X) LDA SP )Y STA
4 # LDY SP )Y LDA SP X) STA
N 1+ LDA SP )Y STA
1 # LDY NEXT JMP END-CODE
\ *** Block No. 22 Hexblock 16
\ -ROT NIP UNDER PICK ROLL 24DEC83KS) cas 26jan06
: -ROT ( 16B1 16B2 16B3 -- 16B3 16B1 16B2)
ROT ROT ;
: NIP ( 16B1 16B2 -- 16B2) SWAP DROP ;
: UNDER ( 16B1 16B2 -- 16B2 16B1 16B2) SWAP OVER ;
: PICK ( N -- 16B.N ) 1+ 2* SP@ + @ ;
: ROLL ( N --) DUP >R PICK SP@ DUP 2+ R> 1+ 2* CMOVE> DROP ;
\\ : -ROLL ( N --)
>R DUP SP@ DUP 2+ DUP 2+ SWAP
R@ 2* CMOVE R> 1+ 2* + ! ;
\ *** Block No. 23 Hexblock 17
\ DOUBLE WORD STACK MANIP. 21APR83KS)
: 2SWAP ( 32B1 32B2 -- 32B2 32B1) ROT >R ROT R> ;
CODE 2DROP ( 32B -- )
(2DROP HERE 2- ! END-CODE
: 2DUP ( 32B -- 32B 32B) OVER OVER ;
\ : 2DROP ( 32B -- ) DROP DROP ;
\ *** Block No. 24 Hexblock 18
\ + AND OR XOR 08APR85BP)
COMPILER ASSEMBLER ALSO DEFINITIONS
H : DYADOP ( OPCODE --) T
INY SP X) LDA DUP C, SP C, SP )Y STA
DEY SP )Y LDA 3 # LDY C, SP C, SP )Y STA
(XYDROP JMP H ;
TARGET
CODE + ( N1 N2 -- N3) CLC 071 DYADOP END-CODE
CODE OR ( 16B1 16B2 -- 16B3) 011 DYADOP END-CODE
CODE AND ( 16B1 16B2 -- 16B3) 031 DYADOP END-CODE
CODE XOR ( 16B1 16B2 -- 16B3) 051 DYADOP END-CODE
\ *** Block No. 25 Hexblock 19
\ - NOT NEGATE 24DEC83KS)
CODE - ( N1 N2 -- N3)
INY SP )Y LDA SEC SP X) SBC SP )Y STA INY SP )Y LDA
1 # LDY SP )Y SBC 3 # LDY SP )Y STA (XYDROP JMP END-CODE
CODE NOT ( 16B1 -- 16B2) CLC
LABEL (NOT TXA SP X) SBC SP X) STA TXA SP )Y SBC SP )Y STA
NEXT JMP END-CODE
CODE NEGATE ( N1 -- N2 ) SEC (NOT BCS END-CODE
\ : - NEGATE + ;
\ *** Block No. 26 Hexblock 1A
\ DNEGATE SETUP D+ 14JUN84KS)
CODE DNEGATE ( D1 -- -D1)
INY SEC
TXA SP )Y SBC SP )Y STA INY
TXA SP )Y SBC SP )Y STA
TXA SP X) SBC SP X) STA 1 # LDY
TXA SP )Y SBC SP )Y STA
NEXT JMP END-CODE
LABEL SETUP ( QUAN IN A)
.A ASL TAX TAY DEY
[[ SP )Y LDA N ,Y STA DEY 0< ?]
TXA CLC SP ADC SP STA
CS ?[ SP 1+ INC ]?
0 # LDX 1 # LDY RTS END-CODE
\ *** Block No. 27 Hexblock 1B
\ D+ cas 26jan06
CODE D+ ( D1 D2 -- D3)
2 # LDA SETUP JSR INY
SP )Y LDA CLC N 2+ ADC SP )Y STA INY
SP )Y LDA N 3 + ADC SP )Y STA
SP X) LDA N ADC SP X) STA 1 # LDY
SP )Y LDA N 1+ ADC SP )Y STA
NEXT JMP END-CODE
\ *** Block No. 28 Hexblock 1C
\ 1+ 2+ 3+ 1- 2- 08APR85BP)
CODE 1+ ( N1 -- N2) 1 # LDA
LABEL N+ CLC SP X) ADC
CS NOT ?[ PUTA JMP ]?
SP X) STA SP )Y LDA 0 # ADC SP )Y STA
NEXT JMP END-CODE
CODE 2+ ( N1 -- N2) 2 # LDA N+ BNE END-CODE
CODE 3+ ( N1 -- N2) 3 # LDA N+ BNE END-CODE
| CODE 4+ ( N1 -- N2) 4 # LDA N+ BNE END-CODE
| CODE 6+ ( N1 -- N2) 6 # LDA N+ BNE END-CODE
\ *** Block No. 29 Hexblock 1D
\ NUMBER CONSTANTS 24DEC83KS)
CODE 1- ( N1 -- N2) SEC
LABEL (1- SP X) LDA 1 # SBC
CS ?[ PUTA JMP ]?
SP X) STA SP )Y LDA 0 # SBC SP )Y STA
NEXT JMP END-CODE
CODE 2- ( N1 -- N2) CLC (1- BCC END-CODE
-1 CONSTANT TRUE 0 CONSTANT FALSE
' TRUE ALIAS -1 ' FALSE ALIAS 0
1 CONSTANT 1 2 CONSTANT 2
3 CONSTANT 3 4 CONSTANT 4
: ON ( ADDR -- ) TRUE SWAP ! ;
: OFF ( ADDR -- ) FALSE SWAP ! ;
\ *** Block No. 30 Hexblock 1E
\ WORDS FOR NUMBER LITERALS 24MAY84KS) cs08aug05
CODE CLIT ( -- 8B)
SP 2DEC IP X) LDA SP X) STA TXA SP )Y STA IP WINC
NEXT JMP END-CODE RESTRICT
CODE LIT ( -- 16B)
SP 2DEC IP )Y LDA SP )Y STA IP X) LDA SP X) STA
LABEL (BUMP IP 2INC NEXT JMP END-CODE RESTRICT
: LITERAL ( 16B --) DUP 0FF00 AND
IF COMPILE LIT , EXIT THEN COMPILE CLIT C, ;
IMMEDIATE RESTRICT
\\ : LIT R> DUP 2+ >R @ ;
: CLIT R> DUP 1+ >R C@ ;
\ *** Block No. 31 Hexblock 1F
\ COMPARISION CODE WORDS 13JUN84KS)
CODE 0< ( N -- FLAG) SP )Y LDA 0< ?[
LABEL PUTTRUE 0FF # LDA 024 C, ]?
LABEL PUTFALSE TXA SP )Y STA
PUTA JMP END-CODE
CODE 0= ( 16B -- FLAG)
SP X) LDA SP )Y ORA PUTTRUE BEQ PUTFALSE BNE END-CODE
CODE UWITHIN ( U1 [LOW UP[ -- FLAG)
2 # LDA SETUP JSR 1 # LDY SP X) LDA N CMP
SP )Y LDA N 1+ SBC
CS NOT ?[ ( N>SP) SP X) LDA N 2+ CMP
SP )Y LDA N 3 + SBC
PUTTRUE BCS ]?
PUTFALSE JMP END-CODE
\ *** Block No. 32 Hexblock 20
\ COMPARISION CODE WORDS 13JUN84KS)
CODE < ( N1 N2 -- FLAG)
SP X) LDA N STA SP )Y LDA N 1+ STA
SP 2INC
N 1+ LDA SP )Y EOR ' 0< @ BMI
SP X) LDA N CMP SP )Y LDA N 1+ SBC
' 0< @ 2+ JMP END-CODE
CODE U< ( U1 U2 -- FLAG)
SP X) LDA N STA SP )Y LDA N 1+ STA
SP 2INC
SP X) LDA N CMP SP )Y LDA N 1+ SBC
CS NOT ?[ PUTTRUE JMP ]?
PUTFALSE JMP END-CODE
\ *** Block No. 33 Hexblock 21
\ COMPARISION WORDS 24DEC83KS)
| : 0< 8000 AND 0<> ;
: > ( N1 N2 -- FLAG) SWAP < ;
: 0> ( N -- FLAG) NEGATE 0< ;
: 0<> ( N -- FLAG) 0= NOT ;
: U> ( U1 U2 -- FLAG) SWAP U< ;
: = ( N1 N2 -- FLAG) - 0= ;
: D0= ( D -- FLAG) OR 0= ;
: D= ( D1 D2 -- FLAG) DNEGATE D+ D0= ;
: D< ( D1 D2 -- FLAG) ROT 2DUP -
IF > NIP NIP ELSE 2DROP U< THEN ;
\ *** Block No. 34 Hexblock 22
\ MIN MAX UMAX UMIN EXTEND DABS ABS cas 26jan06
| : MINIMAX ( N1 N2 FLAG -- N3)
RDROP IF SWAP THEN DROP ;
: MIN ( N1 N2 -- N3) 2DUP > MINIMAX ; -2 ALLOT
: MAX ( N1 N2 -- N3) 2DUP < MINIMAX ; -2 ALLOT
: UMAX ( U1 U2 -- U3) 2DUP U< MINIMAX ; -2 ALLOT
: UMIN ( U1 U2 -- U3) 2DUP U> MINIMAX ; -2 ALLOT
: EXTEND ( N -- D) DUP 0< ;
: DABS ( D -- UD) EXTEND IF DNEGATE THEN ;
: ABS ( N -- U) EXTEND IF NEGATE THEN ;
\ *** Block No. 35 Hexblock 23
\ LOOP PRIMITIVES 08FEB85BP/KS)
| : DODO RDROP R> 2+ DUP >R ROT >R SWAP >R >R ;
: (DO ( LIMIT STAR -- ) OVER - DODO ; -2 ALLOT RESTRICT
: (?DO ( LIMIT START -- )
OVER - ?DUP IF DODO THEN R> DUP @ + >R DROP ; RESTRICT
: BOUNDS ( START COUNT -- LIMIT START ) OVER + SWAP ;
CODE ENDLOOP 6 # LDA (NRDROP JMP END-CODE RESTRICT
\\ DODO PUTS "INDEX \ LIMIT \
ADR.OF.DO" ON RETURN-STACK
\ *** Block No. 36 Hexblock 24
\ (LOOP (+LOOP 08APR85BP)
CODE (LOOP
CLC 1 # LDA RP X) ADC RP X) STA
CS ?[ RP )Y LDA 0 # ADC RP )Y STA
CS ?[ NEXT JMP ]? ]?
LABEL DOLOOP 5 # LDY
RP )Y LDA IP 1+ STA DEY
RP )Y LDA IP STA 1 # LDY
NEXT JMP END-CODE RESTRICT
CODE (+LOOP
CLC SP X) LDA RP X) ADC RP X) STA
SP )Y LDA RP )Y ADC RP )Y STA
.A ROR SP )Y EOR
PHP SP 2INC PLP DOLOOP BPL
NEXT JMP END-CODE RESTRICT
\ *** Block No. 37 Hexblock 25
\ LOOP INDICES 08APR85BP)
CODE I ( -- N) 0 # LDY
LABEL LOOPINDEX SP 2DEC CLC
RP )Y LDA INY INY
RP )Y ADC SP X) STA DEY
RP )Y LDA INY INY
RP )Y ADC 1 # LDY SP )Y STA
NEXT JMP END-CODE RESTRICT
CODE J ( -- N)
6 # LDY LOOPINDEX BNE
END-CODE RESTRICT
\ *** Block No. 38 Hexblock 26
\ BRANCHING 24DEC83KS)
CODE BRANCH
CLC IP LDA IP X) ADC N STA
IP 1+ LDA IP )Y ADC IP 1+ STA N LDA IP STA
NEXT JMP END-CODE RESTRICT
CODE ?BRANCH
SP X) LDA SP )Y ORA PHP SP 2INC PLP
' BRANCH @ BEQ (BUMP JMP END-CODE RESTRICT
\\ : BRANCH R> DUP @ + >R ; RESTRICT
: ?BRANCH
0= R> OVER NOT OVER 2+ AND -ROT
DUP @ + AND OR >R ; RESTRICT
\ *** Block No. 39 Hexblock 27
\ RESOLVE LOOPS AND BRANCHES 03FEB85BP)
: >MARK ( -- ADDR) HERE 0 , ;
: >RESOLVE ( ADDR --) HERE OVER - SWAP ! ;
: <MARK ( -- ADDR) HERE ;
: <RESOLVE ( ADDR --) HERE - , ;
: ?PAIRS ( N1 N2 -- ) - ABORT" UNSTRUCTURED" ;
\ *** Block No. 40 Hexblock 28
\ CASE? 04MAY85BP)
LABEL PUSHA
0 # CMP 0< ?[ PHA 0FF # LDA ][
LABEL PUSH0A PHA 0 # LDA ]?
LABEL PUSH TAX SP 2DEC
TXA 1 # LDY SP )Y STA
PLA 0 # LDX PUTA JMP
CODE CASE?
( 16B1 16B2 -- 16B1 FALSE / TRUE )
1 # LDA SETUP JSR N LDA SP X) CMP
0= ?[ N 1+ LDA SP )Y CMP 0= ?[ PUTTRUE JMP ]? ]?
TXA PUSH0A JMP END-CODE
\\ : CASE?
( 16B1 16B2 -- 16B1 FALSE / TRUE ) OVER = DUP IF NIP THEN ;
\ *** Block No. 41 Hexblock 29
\ BRANCHING 03FEB85BP)
: IF COMPILE ?BRANCH >MARK 1 ; IMMEDIATE RESTRICT
: THEN ABS 1 ?PAIRS >RESOLVE ; IMMEDIATE RESTRICT
: ELSE 1 ?PAIRS COMPILE BRANCH >MARK
SWAP >RESOLVE -1 ; IMMEDIATE RESTRICT
: BEGIN <MARK 2 ; IMMEDIATE RESTRICT
: WHILE 2 ?PAIRS 2 COMPILE ?BRANCH
>MARK -2 2SWAP ; IMMEDIATE RESTRICT
| : (REPTIL <RESOLVE BEGIN DUP -2
= WHILE DROP >RESOLVE REPEAT ;
: REPEAT 2 ?PAIRS COMPILE BRANCH (REPTIL ; IMMEDIATE RESTRICT
: UNTIL 2 ?PAIRS COMPILE ?BRANCH (REPTIL ; IMMEDIATE RESTRICT
\ *** Block No. 42 Hexblock 2A
\ LOOPS 29JAN85KS/BP)
: DO COMPILE (DO >MARK 3 ; IMMEDIATE RESTRICT
: ?DO COMPILE (?DO >MARK 3 ; IMMEDIATE RESTRICT
: LOOP 3 ?PAIRS COMPILE (LOOP
COMPILE ENDLOOP >RESOLVE ; IMMEDIATE RESTRICT
: +LOOP 3 ?PAIRS COMPILE (+LOOP
COMPILE ENDLOOP >RESOLVE ; IMMEDIATE RESTRICT
: LEAVE ENDLOOP R> 2- DUP @ + >R ; RESTRICT
\\ RETURNSTACK: CALLADR \ INDEX
LIMIT \ ADR OF DO
\ *** Block No. 43 Hexblock 2B
\ UM* BP/KS13.2.85)
CODE UM* ( U1 U2 -- UD)
SP )Y LDA N STA SP X) LDA N 1+ STA
INY N 2 + STX N 3 + STX 010 # LDX
[[ N 3 + ASL N 2+ ROL N 1+ ROL N ROL
CS ?[ CLC SP )Y LDA N 3 + ADC N 3 + STA
INY SP )Y LDA DEY N 2 + ADC N 2 + STA
CS ?[ N 1+ INC 0= ?[ N INC ]? ]? ]?
DEX 0= ?]
N 3 + LDA SP )Y STA INY N 2 + LDA SP )Y STA 1 # LDY
N LDA SP )Y STA N 1+ LDA SP X) STA
NEXT JMP END-CODE
\\ : UM* ( U1 U2 -- UD3) >R 0 0 0 R> 010 0
DO DUP 2/ >R 1 AND IF 2OVER D+ THEN
>R >R 2DUP D+ R> R> R> LOOP DROP 2SWAP 2DROP ;
\ *** Block No. 44 Hexblock 2C
\ M* 2* 04JUL84KS)
: M* ( N1 N2 -- D)
DUP 0< DUP >R IF NEGATE THEN
SWAP DUP 0< IF NEGATE R> NOT >R THEN
UM* R> IF DNEGATE THEN ;
: * ( N N -- PROD) UM* DROP ;
CODE 2* ( N1 -- N2)
SP X) LDA .A ASL SP X) STA
SP )Y LDA .A ROL SP )Y STA
NEXT JMP END-CODE
| : 2* DUP + ;
\ *** Block No. 45 Hexblock 2D
\ UM/MOD 04JUL84KS)
| : DIVOVL
TRUE ABORT" DIVISION OVERFLOW" ;
CODE UM/MOD ( UD U -- UREM UQUOT)
SP X) LDA N 5 + STA
SP )Y LDA N 4 + STA SP 2INC
SP X) LDA N 1+ STA
SP )Y LDA N STA INY
SP )Y LDA N 3 + STA INY
SP )Y LDA N 2+ STA 011 # LDX CLC
[[ N 6 + ROR SEC N 1+ LDA N 5 + SBC
TAY N LDA N 4 + SBC
CS NOT ?[ N 6 + ROL ]?
CS ?[ N STA N 1+ STY ]?
\ *** Block No. 46 Hexblock 2E
\
N 3 + ROL N 2+ ROL N 1+ ROL N ROL
DEX 0= ?]
1 # LDY N ROR N 1+ ROR
CS ?[ ;C: DIVOVL ; ASSEMBLER ]?
N 2+ LDA SP )Y STA INY
N 1+ LDA SP )Y STA INY
N LDA SP )Y STA 1 # LDY
N 3 + LDA
PUTA JMP END-CODE
\ *** Block No. 47 Hexblock 2F
\ 2/ M/MOD 24DEC83KS)
: M/MOD ( D N -- MOD QUOT)
DUP >R ABS OVER
0< IF UNDER + SWAP THEN
UM/MOD R@
0< IF NEGATE OVER IF SWAP R@ + SWAP 1-
THEN THEN RDROP ;
CODE 2/ ( N1 -- N2)
SP )Y LDA .A ASL
SP )Y LDA .A ROR SP )Y STA
SP X) LDA .A ROR
PUTA JMP END-CODE
\ *** Block No. 48 Hexblock 30
\ /MOD / MOD */MOD */ U/MOD UD/MOD KS)
: /MOD ( N1 N2 -- REM QUOT) >R EXTEND R> M/MOD ;
: / ( N1 N2 -- QUOT) /MOD NIP ;
: MOD ( N1 N2 -- REM) /MOD DROP ;
: */MOD ( N1 N2 N3 -- REM QUOT) >R M* R> M/MOD ;
: */ ( N1 N2 N3 -- QUOT) */MOD NIP ;
: U/MOD ( U1 U2 -- UREM UQUOT) 0 SWAP UM/MOD ;
: UD/MOD ( UD1 U2 -- UREM UDQUOT)
>R 0 R@ UM/MOD R> SWAP >R UM/MOD R> ;
\ *** Block No. 49 Hexblock 31
\ CMOVE CMOVE> (CMOVE> BP 08APR85)
CODE CMOVE ( FROM TO QUAN --)
3 # LDA SETUP JSR DEY
[[ [[ N CPY 0= ?[ N 1+ DEC 0< ?[
1 # LDY NEXT JMP ]? ]?
N 4 + )Y LDA N 2+ )Y STA INY 0= ?]
N 5 + INC N 3 + INC ]] END-CODE
\ *** Block No. 50 Hexblock 32
\ CMOVE> MOVE cas 26jan06
CODE CMOVE> ( FROM TO QUAN --)
3 # LDA SETUP JSR
CLC N 1+ LDA N 3 + ADC N 3 + STA
CLC N 1+ LDA N 5 + ADC N 5 + STA
N 1+ INC N LDY CLC CS ?[
LABEL (CMOVE>
DEY N 4 + )Y LDA N 2+ )Y STA ]?
TYA (CMOVE> BNE
N 3 + DEC N 5 + DEC N 1+ DEC
(CMOVE> BNE 1 # LDY
NEXT JMP END-CODE
: MOVE ( FROM TO QUAN --) >R 2DUP U< IF R> CMOVE> EXIT THEN
R> CMOVE ;
\ *** Block No. 51 Hexblock 33
\ PLACE COUNT ERASE 16FEB85BP/KS)
: PLACE ( ADDR LEN TO --) OVER >R ROT OVER 1+ R> MOVE C! ;
CODE COUNT ( ADDR -- ADDR+1 LEN)
SP X) LDA N STA CLC 1 # ADC SP X) STA
SP )Y LDA N 1+ STA 0 # ADC SP )Y STA
SP 2DEC (C@ JMP END-CODE
\ : COUNT ( ADR -- ADR+1 LEN ) DUP 1+ SWAP C@ ;
: ERASE ( ADDR QUAN --) 0 FILL ;
\ *** Block No. 52 Hexblock 34
\ FILL 11JUN85BP)
CODE FILL ( ADDR QUAN 8B -- )
3 # LDA SETUP JSR DEY
N LDA N 3 + LDX
0<> ?[ [[ [[ N 4 + )Y STA INY 0= ?]
N 5 + INC DEX 0= ?]
]? N 2+ LDX
0<> ?[ [[ N 4 + )Y STA INY DEX 0= ?]
]? 1 # LDY
NEXT JMP END-CODE
\\ : FILL ( ADDR QUAN 8B --) SWAP ?DUP
IF >R OVER C! DUP 1+ R> 1- CMOVE EXIT THEN 2DROP ;
\ *** Block No. 53 Hexblock 35
\ HERE PAD ALLOT , C, COMPILE 24DEC83KS)
: HERE ( -- ADDR) DP @ ;
: PAD ( -- ADDR) HERE 042 + ;
: ALLOT ( N --) DP +! ;
: , ( 16B --) HERE ! 2 ALLOT ;
: C, ( 8B --) HERE C! 1 ALLOT ;
: COMPILE R> DUP 2+ >R @ , ; RESTRICT
\ *** Block No. 54 Hexblock 36
\ INPUT STRINGS 24DEC83KS)
VARIABLE #TIB 0 #TIB !
VARIABLE >TIB $100 >TIB ! \ 050 ALLOT
VARIABLE >IN 0 >IN !
VARIABLE BLK 0 BLK !
VARIABLE SPAN 0 SPAN !
: TIB ( -- ADDR ) >TIB @ ;
: QUERY TIB 050 EXPECT SPAN @ #TIB ! >IN OFF BLK OFF ;
\ *** Block No. 55 Hexblock 37
\ SCAN SKIP /STRING 12OCT84BP)
: SCAN ( ADDR0 LEN0 CHAR -- ADDR1 LEN1) >R
BEGIN DUP WHILE OVER C@ R@ -
WHILE 1- SWAP 1+ SWAP REPEAT RDROP ;
: SKIP ( ADDR LEN DEL -- ADDR1 LEN1) >R
BEGIN DUP WHILE OVER C@ R@ =
WHILE 1- SWAP 1+ SWAP REPEAT RDROP ;
: /STRING ( ADDR0 LEN0 +N - ADDR1 LEN1)
OVER UMIN ROT OVER + -ROT - ;
\ *** Block No. 56 Hexblock 38
\ CAPITAL 03APR85BP)
(C LABEL (CAPITAL \ FOR COMMODORE ONLY
PHA 0DF # AND \ 2ND UPPER TO LOWER
ASCII A # CMP
CS ?[ ASCII Z 1+ # CMP
CC ?[ PLA CLC ASCII A ASCII A - # ADC RTS
]? ]? PLA RTS END-CODE )
LABEL (CAPITAL \ FOR ASCII ONLY
ASCII a # CMP
CS ?[ ASCII z 1+ # CMP
CC ?[ SEC ASCII a ASCII A - # SBC
]? ]? RTS END-CODE
CODE CAPITAL ( CHAR -- CHAR' )
SP X) LDA (CAPITAL JSR SP X) STA NEXT JMP END-CODE
\ *** Block No. 57 Hexblock 39
\ CAPITALIZE 03APR85BP)
CODE CAPITALIZE ( STRING -- STRING )
SP X) LDA N STA SP )Y LDA N 1+ STA
N X) LDA N 2+ STA DEY
[[ N 2+ CPY 0= ?[ 1 # LDY NEXT JMP ]?
INY N )Y LDA (CAPITAL JSR N )Y STA
]] END-CODE
\\ : CAPITALIZE ( STRING -- STRING )
DUP COUNT BOUNDS ?DO I C@ CAPITAL I C! THEN LOOP ;
\\ CAPITAL ( CHAR -- CHAR )
ASCII A ASCII Z 1+ UWITHIN
IF I C@ [ ASCII A ASCII A - ] LITERAL - ;
\ *** Block No. 58 Hexblock 3A
\ (WORD 08APR85BP)
| CODE (WORD ( CHAR ADR0 LEN0 -- ADR)
\ N : LENGTH OF SOURCE
\ N+2 : PTR IN SOURCE / NEXT CHAR
\ N+4 : STRING START ADRESS
\ N+6 : STRING LENGTH
N 6 + STX \ 0 =: STRING_LENGTH
3 # LDY [[ SP )Y LDA N ,Y STA DEY 0< ?]
1 # LDY CLC >IN LDA N 2+ ADC N 2+ STA
\ >IN+ADR0 =: N+2
>IN 1+ LDA N 3 + ADC N 3 + STA SEC N LDA >IN SBC N STA
\ LEN0->IN =: N
N 1+ LDA >IN 1+ SBC N 1+ STA
CC ?[ SP X) LDA >IN STA \ STREAM EXHAUSTED
SP )Y LDA >IN 1+ STA
\ *** Block No. 59 Hexblock 3B
\ (WORD 08APR85BP)
][ 4 # LDY [[ N LDA N 1+ ORA \ SKIP CHAR'S
0= NOT ?[[ N 2+ X) LDA SP )Y CMP \ WHILE COUNT <>0
0= ?[[ N 2+ WINC N WDEC ]]?
N 2+ LDA N 4 + STA \ SAVE STRING_START_ADRESS
N 3 + LDA N 5 + STA
[[ N 2+ X) LDA SP )Y CMP PHP \ SCAN FOR CHAR
N 2+ WINC N WDEC PLP
0= NOT ?[[ N 6 + INC \ COUNT STRING_LENGTH
N LDA N 1+ ORA
0= ?] ]? ]? \ FROM COUNT = 0 IN SKIP)
SEC 2 # LDY
\ ADR_AFTER_STRING - ADR0 =: >IN)
N 2+ LDA SP )Y SBC >IN STA INY
N 3 + LDA SP )Y SBC >IN 1+ STA
\ *** Block No. 60 Hexblock 3C
\ (WORD 08APR85BP)
]? \ FROM 1ST ][, STREAM WAS EXHAUSTED
\ WHEN WORD CALLED)
CLC 4 # LDA SP ADC SP STA
CS ?[ SP 1+ INC ]? \ 2DROP
USER' DP # LDY UP )Y LDA
SP X) STA N STA INY
UP )Y LDA 1 # LDY
SP )Y STA N 1+ STA \ DP @
DEY N 6 + LDA \ STORE COUNT BYTE FIRST
[[ N )Y STA N 4 + )Y LDA INY
N 6 + DEC 0< ?]
020 # LDA N )Y STA \ ADD A BLANK
1 # LDY NEXT JMP END-CODE
\ *** Block No. 61 Hexblock 3D
\ SOURCE WORD PARSE NAME 08APR85BP)
: SOURCE ( -- ADDR LEN)
BLK @ ?DUP IF BLOCK B/BLK EXIT THEN TIB #TIB @ ;
: WORD ( CHAR -- ADDR) SOURCE (WORD ;
: PARSE ( CHAR -- ADDR LEN) >R SOURCE >IN @ /STRING OVER SWAP
R> SCAN >R OVER - DUP R> 0<> - >IN +! ;
: NAME ( -- ADDR) BL WORD CAPITALIZE EXIT ;
\\ : WORD ( CHAR -- ADDR) >R
SOURCE OVER SWAP >IN @ /STRING R@ SKIP OVER SWAP R>
SCAN >R ROT OVER SWAP - R> 0<> - >IN !
OVER - HERE PLACE BL HERE COUNT + C! HERE ;
\ *** Block No. 62 Hexblock 3E
\ STATE ASCII ," (" " 24DEC83KS)
VARIABLE STATE 0 STATE !
: ASCII BL WORD 1+ C@ STATE @
IF [COMPILE] LITERAL THEN ; IMMEDIATE
: ," ASCII " PARSE HERE OVER 1+ ALLOT PLACE ;
: "LIT R> R> UNDER COUNT + >R >R ; RESTRICT
: (" "LIT ; RESTRICT
: " COMPILE (" ," ; IMMEDIATE RESTRICT
\ *** Block No. 63 Hexblock 3F
\ ." ( .( \ \\ HEX DECIMAL 08SEP84KS)
: (." "LIT COUNT TYPE ; RESTRICT
: ." COMPILE (." ," ; IMMEDIATE RESTRICT
: ( ASCII ) PARSE 2DROP ; IMMEDIATE
: .( ASCII ) PARSE TYPE ; IMMEDIATE
: \ >IN @ C/L / 1+ C/L * >IN ! ; IMMEDIATE
: \\ B/BLK >IN ! ; IMMEDIATE
: \NEEDS NAME FIND NIP IF [COMPILE] \ THEN ;
: HEX 010 BASE ! ; : DECIMAL 0A BASE ! ;
\ *** Block No. 64 Hexblock 40
\ NUMBER CONV.: DIGIT? ACCUMULATE KS)
: DIGIT? ( CHAR -- DIGIT TRUE/ FALSE )
ASCII 0 - DUP 9 U>
IF [ ASCII A ASCII 9 - 1- ] LITERAL - DUP 9 U>
IF [ 2SWAP ( UNSTRUKTURIERT) ] THEN
BASE @ OVER U> ?DUP ?EXIT THEN DROP FALSE ;
: ACCUMULATE ( +D0 ADR DIGIT - +D1 ADR)
SWAP >R SWAP BASE @ UM* DROP ROT BASE @ UM* D+ R> ;
: CONVERT ( +D1 ADDR0 -- +D2 ADDR2)
1+ BEGIN COUNT DIGIT? WHILE ACCUMULATE REPEAT 1- ;
| : END? ( -- FLAG ) PTR @ 0= ;
| : CHAR ( ADDR0 -- ADDR1 CHAR ) COUNT -1 PTR +! ;
| : PREVIOUS ( ADDR0 -- ADDR0 CHAR) 1- COUNT ;
\ *** Block No. 65 Hexblock 41
\ ?NONUM ?NUM FIXBASE? 13FEB85KS)
VARIABLE DPL -1 DPL !
| : ?NONUM ( FLAG -- EXIT IF TRUE )
IF RDROP 2DROP DROP RDROP FALSE THEN ;
| : ?NUM ( FLAG -- EXIT IF TRUE )
IF RDROP DROP R> IF DNEGATE THEN
ROT DROP DPL @ 1+ ?DUP ?EXIT DROP TRUE THEN ;
| : FIXBASE? ( CHAR - CHAR FALSE / NEWBASE TRUE )
ASCII & CASE? IF 0A TRUE EXIT THEN
ASCII $ CASE? IF 10 TRUE EXIT THEN
ASCII H CASE? IF 10 TRUE EXIT THEN
ASCII % CASE? IF 2 TRUE EXIT THEN FALSE ;
\ *** Block No. 66 Hexblock 42
\ 13FEB85KS)
| : PUNCTUATION? ( CHAR -- FLAG)
ASCII , OVER = SWAP ASCII . = OR ;
| : ?DPL DPL @ -1 = ?EXIT 1 DPL +! ;
| VARIABLE PTR \ POINTS INTO STRING
\ *** Block No. 67 Hexblock 43
\ (NUMBER NUMBER 13FEB85KS)
: NUMBER? ( STRING - STRING FALSE / N 0< / D 0> )
BASE PUSH DUP COUNT PTR ! DPL ON
0 >R ( +SIGN)
0.0 ROT END? ?NONUM CHAR
ASCII - CASE?
IF RDROP TRUE >R END? ?NONUM CHAR THEN FIXBASE?
IF BASE ! END? ?NONUM CHAR THEN
BEGIN DIGIT? 0= ?NONUM
BEGIN ACCUMULATE ?DPL END? ?NUM
CHAR DIGIT? 0= UNTIL
PREVIOUS PUNCTUATION? 0= ?NONUM
DPL OFF END? ?NUM CHAR
REPEAT ;
: NUMBER ( STRING -- D )
NUMBER? ?DUP 0= ABORT" ?" 0< IF EXTEND THEN ;
\ *** Block No. 68 Hexblock 44
\ HIDE REVEAL IMMEDIATE RESTRICT KS)
VARIABLE LAST 0 LAST !
| : LAST? ( -- FALSE / ACF TRUE) LAST @ ?DUP ;
: HIDE LAST? IF 2- @ CURRENT @ ! THEN ;
: REVEAL LAST? IF 2- CURRENT @ ! THEN ;
: RECURSIVE REVEAL ; IMMEDIATE RESTRICT
| : FLAG! ( 8B --) LAST? IF UNDER C@ OR OVER C! THEN DROP ;
: IMMEDIATE 040 FLAG! ;
: RESTRICT 080 FLAG! ;
\ *** Block No. 69 Hexblock 45
\ CLEARSTACK HALLOT HEAP HEAP? cas 26jan06
CODE CLEARSTACK USER' S0 # LDY
UP )Y LDA SP STA INY UP )Y LDA SP 1+ STA
1 # LDY NEXT JMP END-CODE
: HALLOT ( QUAN -- ) S0 @ OVER - SWAP
SP@ 2+ DUP ROT - DUP S0 !
2 PICK OVER - MOVE CLEARSTACK S0 ! ;
: HEAP ( -- ADDR) S0 @ 6+ ;
: HEAP? ( ADDR -- FLAG) HEAP UP@ UWITHIN ;
| : HEAPMOVE ( FROM -- FROM) DUP HERE OVER -
DUP HALLOT HEAP SWAP CMOVE HEAP OVER - LAST +! REVEAL ;
\ *** Block No. 70 Hexblock 46
\ DOES> ; 30DEC84KS/BP)
LABEL (DODOES> RP 2DEC
IP 1+ LDA RP )Y STA IP LDA RP X) STA \ PUT IP ON RP
CLC W X) LDA 3 # ADC IP STA
TXA W )Y ADC IP 1+ STA \ W@ + 3 -> IP
LABEL DOCREATE
2 # LDA CLC W ADC PHA TXA W 1+ ADC PUSH JMP END-CODE
| : (;CODE R> LAST @ NAME> ! ;
: DOES> COMPILE (;CODE 04C C,
COMPILE (DODOES> ; IMMEDIATE RESTRICT
\ *** Block No. 71 Hexblock 47
\ 6502-ALIGN ?HEAD \ 08SEP84BP)
| : 6502-ALIGN/1 ( ADR -- ADR' ) DUP 0FF AND 0FF = - ;
| : 6502-ALIGN/2 ( LFA -- LFA )
HERE 0FF AND 0FF =
IF DUP DUP 1+ HERE OVER - 1+ CMOVE> \ LFA NOW INVALID
1 LAST +! 1 ALLOT THEN ;
VARIABLE ?HEAD 0 ?HEAD !
: | ?HEAD @ ?EXIT -1 ?HEAD ! ;
\ *** Block No. 72 Hexblock 48
\ WARNING CREATE 30DEC84BP)
VARIABLE WARNING 0 WARNING !
| : EXISTS?
WARNING @ ?EXIT
LAST @ CURRENT @ (FIND NIP
IF SPACE LAST @ .NAME ." EXISTS " ?CR THEN ;
: CREATE HERE BLK @ , CURRENT @ @ ,
NAME C@ DUP 1 020 UWITHIN NOT ABORT" INVALID NAME"
HERE LAST ! 1+ ALLOT EXISTS? ?HEAD @
IF 1 ?HEAD +! DUP 6502-ALIGN/1 , \ POINTER TO CODE
HEAPMOVE 020 FLAG! 6502-ALIGN/1 DP !
ELSE 6502-ALIGN/2 DROP THEN REVEAL 0 ,
;CODE DOCREATE JMP END-CODE
\ *** Block No. 73 Hexblock 49
\ NFA? 30DEC84BP)
| CODE NFA? ( VOCABTHREAD CFA -- NFA / FALSE)
SP X) LDA N 4 + STA SP )Y LDA N 5 + STA SP 2INC
[[ [[ SP X) LDA N 2+ STA SP )Y LDA N 3 + STA
N 2+ ORA 0= ?[ PUTFALSE JMP ]?
N 2+ )Y LDA SP )Y STA N 1+ STA
N 2+ X) LDA SP X) STA N STA
N 1+ ORA 0= ?[ NEXT JMP ]? \ N=LINK
N 2INC N X) LDA PHA SEC 01F # AND
N ADC N STA CS ?[ N 1+ INC ]?
PLA 020 # AND 0= NOT
?[ N )Y LDA PHA
N X) LDA N STA PLA N 1+ STA ]?
N LDA N 4 + CMP 0= ?] \ VOCABTHREAD=0
N 1+ LDA N 5 + CMP 0= ?] \ D.H. LEERES VOCABULARY
' 2+ @ JMP END-CODE \ IN NFA? IST ERLAUBT
\ *** Block No. 74 Hexblock 4A
\ >NAME NAME> >BODY .NAME 03FEB85BP)
: >NAME ( CFA -- NFA / FALSE) VOC-LINK
BEGIN @ DUP WHILE 2DUP 4 - SWAP
NFA? ?DUP IF -ROT 2DROP EXIT THEN REPEAT NIP ;
| : (NAME> ( NFA -- CFA) COUNT 01F AND + ;
: NAME> ( NFA -- CFA) DUP (NAME> SWAP C@ 020 AND IF @ THEN ;
: >BODY ( CFA -- PFA) 2+ ;
: .NAME ( NFA --)
?DUP IF DUP HEAP? IF ." |" THEN COUNT 01F AND TYPE
ELSE ." ???" THEN SPACE ;
\ *** Block No. 75 Hexblock 4B
\ : ; CONSTANT VARIABLE 09JAN85KS/BP)
: : CREATE HIDE CURRENT @ CONTEXT ! ] 0
;CODE HERE >RECOVER ! \ RESOLVE FWD. REFERENCE
RP 2DEC IP LDA RP X) STA IP 1+ LDA RP )Y STA
W LDA CLC 2 # ADC IP STA TXA W 1+ ADC IP 1+ STA
NEXT JMP END-CODE
: ; 0 ?PAIRS COMPILE EXIT
[COMPILE] [ REVEAL ; IMMEDIATE RESTRICT
: CONSTANT ( 16B --) CREATE ,
;CODE SP 2DEC 2 # LDY W )Y LDA SP X) STA INY
W )Y LDA 1 # LDY SP )Y STA NEXT JMP END-CODE
: VARIABLE CREATE 2 ALLOT ;
\ *** Block No. 76 Hexblock 4C
\ UALLOT USER ALIAS 10JAN85KS/BP)
: UALLOT ( QUAN -- OFFSET)
DUP UDP @ + 0FF U> ABORT" USERAREA FULL"
UDP @ SWAP UDP +! ;
: USER CREATE 2 UALLOT C,
;CODE SP 2DEC 2 # LDY W )Y LDA CLC UP ADC SP X) STA
TXA INY UP 1+ ADC 1 # LDY SP )Y STA NEXT JMP END-CODE
: ALIAS ( CFA --)
CREATE LAST @ DUP C@ 020 AND
IF -2 ALLOT ELSE 020 FLAG! THEN (NAME> ! ;
\ *** Block No. 77 Hexblock 4D
\ VOC-LINK VP CURRENT CONTEXT ALSO BP)
CREATE VP 10 ALLOT
VARIABLE CURRENT
: CONTEXT ( -- ADR ) VP DUP @ + 2+ ;
| : THRU.VOCSTACK ( -- FROM TO ) VP 2+ CONTEXT ;
\ "ONLY FORTH ALSO ASSEMBLER" GIVES VP :
\ COUNTWORD = 6 \ONLY\FORTH\ASSEMBLER
: ALSO VP @
0A > ERROR" VOCABULARY STACK FULL"
CONTEXT @ 2 VP +! CONTEXT ! ;
: TOSS -2 VP +! ;
\ *** Block No. 78 Hexblock 4E
\ VOCABULARY FORTH ONLY FORTH-83 KS/BP)
: VOCABULARY CREATE 0 , 0 ,
HERE VOC-LINK @ , VOC-LINK ! DOES> CONTEXT ! ;
\ NAME \ CODE \ THREAD \ COLDTHREAD \ VOC-LINK
VOCABULARY FORTH
VOCABULARY ONLY
] DOES> [ ONLYPATCH ] 0 VP ! CONTEXT ! ALSO ; ' ONLY !
: ONLYFORTH ONLY FORTH ALSO DEFINITIONS ;
\ *** Block No. 79 Hexblock 4F
\ DEFINITIONS ORDER WORDS 13JAN84BP/KS)
: DEFINITIONS CONTEXT @ CURRENT ! ;
| : .VOC ( ADR -- ) @ 2- >NAME .NAME ;
: ORDER
THRU.VOCSTACK DO I .VOC -2 +LOOP 2 SPACES CURRENT .VOC ;
: WORDS CONTEXT @
BEGIN @ DUP STOP? 0= AND
WHILE ?CR DUP 2+ .NAME SPACE REPEAT DROP ;
\ *** Block No. 80 Hexblock 50
\ (FIND 08APR85BP)
CODE (FIND ( STRING THREAD
-- STRING FALSE / NAMEFIELD TRUE)
3 # LDY [[ SP )Y LDA N ,Y STA DEY 0< ?]
N 2+ X) LDA 01F # AND N 4 + STA
LABEL FINDLOOP 0 # LDY
N )Y LDA TAX INY
N )Y LDA N 1+ STA N STX N ORA
0= ?[ 1 # LDY 0 # LDX PUTFALSE JMP ]?
INY N )Y LDA 01F # AND N 4 + CMP
FINDLOOP BNE \ COUNTBYTE MATCH
CLC 2 # LDA N ADC N 5 + STA
0 # LDA N 1+ ADC N 6 + STA
N 4 + LDY
[[ N 2+ )Y LDA N 5 + )Y CMP
\ *** Block No. 81 Hexblock 51
\
FINDLOOP BNE DEY 0= ?]
3 # LDY N 6 + LDA SP )Y STA DEY
N 5 + LDA SP )Y STA
DEY 0 # LDX PUTTRUE JMP END-CODE
\ *** Block No. 82 Hexblock 52
\ FOUND 29JAN85BP)
| CODE FOUND ( NFA -- CFA N )
SP X) LDA N STA SP )Y LDA N 1+ STA
N X) LDA N 2+ STA 01F # AND SEC N ADC N STA
CS ?[ N 1+ INC ]?
N 2+ LDA 020 # AND
0= ?[ N LDA SP X) STA N 1+ LDA
][ N X) LDA SP X) STA N )Y LDA ]? SP )Y STA
SP 2DEC N 2+ LDA 0< ?[ INY ]?
.A ASL
0< NOT ?[ TYA 0FF # EOR TAY INY ]?
TYA SP X) STA
0< ?[ 0FF # LDA 24 C, ]?
TXA 1 # LDY SP )Y STA
NEXT JMP END-CODE
\ *** Block No. 83 Hexblock 53
\\
| : FOUND ( NFA -- CFA N )
DUP C@ >R (NAME>
R@ 020 AND IF @ THEN
-1 R@ 080 AND IF 1- THEN
R> 040 AND IF NEGATE THEN ;
\ *** Block No. 84 Hexblock 54
\ FIND ' ['] 13JAN85BP) cas2013apr05
: FIND ( STRING -- CFA N / STRING FALSE)
CONTEXT DUP @ OVER 2- @ = IF 2- THEN
BEGIN UNDER @ (FIND IF NIP FOUND EXIT THEN
OVER VP 2+ U>
WHILE SWAP 2- REPEAT NIP FALSE ;
: ' ( -- CFA ) NAME FIND 0= ABORT" WHAT?" ;
: [COMPILE] ' , ; IMMEDIATE RESTRICT
: ['] ' [COMPILE] LITERAL ; IMMEDIATE RESTRICT
: NULLSTRING? ( STRING -- STRING FALSE / TRUE)
DUP C@ 0= DUP IF NIP THEN ;
\ *** Block No. 85 Hexblock 55
\ >INTERPRET 28FEB85BP)
LABEL JUMP
INY CLC W )Y LDA 2 # ADC IP STA
INY W )Y LDA 0 # ADC IP 1+ STA
1 # LDY NEXT JMP END-CODE
VARIABLE >INTERPRET
JUMP ' >INTERPRET !
\\ MAKE VARIABLE >INTERPRET TO SPECIAL
DEFER
\ *** Block No. 86 Hexblock 56
\ INTERPRET INTERACTIVE 31DEC84KS/BP) cas 26jan06
DEFER NOTFOUND
: NO.EXTENSIONS ( STRING -- ) ERROR" WHAT?" ; \ STRING NOT 0
' NO.EXTENSIONS IS NOTFOUND
: INTERPRET >INTERPRET ; -2 ALLOT
| : INTERACTIVE ?STACK NAME FIND ?DUP
IF 1 AND IF EXECUTE >INTERPRET THEN
ABORT" COMPILE ONLY" THEN NULLSTRING? ?EXIT NUMBER?
0= IF NOTFOUND THEN >INTERPRET ; -2 ALLOT
' INTERACTIVE >INTERPRET !
\ *** Block No. 87 Hexblock 57
\ COMPILING [ ] 20DEC84BP)
| : COMPILING
?STACK NAME FIND ?DUP
IF 0> IF EXECUTE >INTERPRET THEN
, >INTERPRET THEN
NULLSTRING? ?EXIT NUMBER? ?DUP
IF 0> IF SWAP [COMPILE] LITERAL THEN
[COMPILE] LITERAL
ELSE NOTFOUND THEN >INTERPRET ; -2 ALLOT
: [ ['] INTERACTIVE IS >INTERPRET STATE OFF ; IMMEDIATE
: ] ['] COMPILING IS >INTERPRET STATE ON ;
\ *** Block No. 88 Hexblock 58
\ PERFOM DEFER IS 03FEB85BP)
| : CRASH TRUE ABORT" CRASH" ;
: DEFER CREATE ['] CRASH ,
;CODE 2 # LDY W )Y LDA PHA INY W )Y LDA
W 1+ STA PLA W STA 1 # LDY W 1- JMP END-CODE
: (IS R> DUP 2+ >R @ ! ;
| : DEF? ( CFA -- ) @ ['] NOTFOUND @ OVER =
SWAP ['] >INTERPRET @ = OR NOT ABORT" NOT DEFERRED" ;
: IS ( ADR -- ) ' DUP DEF? >BODY
STATE @ IF COMPILE (IS , EXIT THEN ! ; IMMEDIATE
\ *** Block No. 89 Hexblock 59
\ ?STACK 08SEP84KS)
| : STACKFULL ( -- )
DEPTH 20 > ABORT" TIGHT STACK"
REVEAL LAST? IF DUP HEAP? IF NAME> ELSE 4 - THEN
(FORGET THEN TRUE ABORT" DICTIONARY FULL" ;
CODE ?STACK USER' DP # LDY
SEC SP LDA UP )Y SBC N STA INY SP 1+ LDA UP )Y SBC
0= ?[ 1 # LDY ;C: STACKFULL ; ASSEMBLER ]?
USER' S0 # LDY UP )Y LDA SP CMP INY
UP )Y LDA SP 1+ SBC 1 # LDY CS ?[ NEXT JMP ]?
;C: TRUE ABORT" STACK EMPTY" ; -2 ALLOT
\\ : ?STACK SP@ HERE - 100 U< IF STACKFULL THEN
SP@ S0 @ U> ABORT" STACK EMPTY" ;
\ *** Block No. 90 Hexblock 5A
\ .STATUS PUSH LOAD 08SEP84KS)
DEFER .STATUS ' NOOP IS .STATUS
| CREATE PULL 0 ] R> R> ! ;
: PUSH ( ADDR -- )
R> SWAP DUP >R @ >R PULL >R >R ; RESTRICT
: LOAD ( BLK --)
?DUP 0= ?EXIT BLK PUSH BLK !
>IN PUSH >IN OFF .STATUS INTERPRET ;
\ *** Block No. 91 Hexblock 5B
\ +LOAD THRU +THRU --> RDEPTH DEPTH KS)
: +LOAD ( OFFSET --) BLK @ + LOAD ;
: THRU ( FROM TO --) 1+ SWAP DO I LOAD LOOP ;
: +THRU ( OFF0 OFF1 --) 1+ SWAP DO I +LOAD LOOP ;
: --> 1 BLK +! >IN OFF .STATUS ; IMMEDIATE
: RDEPTH ( -- +N) R0 @ RP@ 2+ - 2/ ;
: DEPTH ( -- +N) SP@ S0 @ SWAP - 2/ ;
\ *** Block No. 92 Hexblock 5C
\ QUIT (QUIT ABORT 07JUN85BP)
| : PROMPT STATE @ IF ." COMPILING" EXIT THEN ." OK" ;
: (QUIT
BEGIN .STATUS CR QUERY INTERPRET PROMPT REPEAT ; -2 ALLOT
DEFER 'QUIT ' (QUIT IS 'QUIT
: QUIT R0 @ RP! [COMPILE] [ 'QUIT ; -2 ALLOT
: STANDARDI/O [ OUTPUT ] LITERAL OUTPUT 4 CMOVE ;
DEFER 'ABORT ' NOOP IS 'ABORT
: ABORT CLEARSTACK END-TRACE 'ABORT STANDARDI/O QUIT ; -2 ALLOT
\ *** Block No. 93 Hexblock 5D
\ (ERROR ABORT" ERROR" 20MAR85BP)
VARIABLE SCR 1 SCR !
VARIABLE R# 0 R# !
: (ERROR ( STRING -- )
STANDARDI/O SPACE HERE .NAME COUNT TYPE SPACE ?CR
BLK @ ?DUP IF SCR ! >IN @ R# ! THEN QUIT ; -2 ALLOT
' (ERROR ERRORHANDLER !
: (ABORT" "LIT SWAP IF
>R CLEARSTACK R> ERRORHANDLER PERFORM
EXIT THEN DROP ; RESTRICT
\ *** Block No. 94 Hexblock 5E
\
| : (ERR" "LIT SWAP
IF ERRORHANDLER PERFORM EXIT THEN DROP ; RESTRICT
: ABORT" COMPILE (ABORT" ," ; IMMEDIATE RESTRICT
: ERROR" COMPILE (ERR" ," ; IMMEDIATE RESTRICT
\ *** Block No. 95 Hexblock 5F
\ -TRAILING 08APR85BP)
020 CONSTANT BL
CODE -TRAILING ( ADDR N1 -- ADR N2 )
TYA SETUP JSR
SP X) LDA N 2+ STA CLC
SP )Y LDA N 1+ ADC N 3 + STA
N LDY CLC CS ?[
LABEL (-TRAIL
DEY N 2+ )Y LDA BL # CMP
0<> ?[ INY 0= ?[ N 1+ INC ]?
TYA PHA N 1+ LDA PUSH JMP ]?
]? TYA (-TRAIL BNE
N 3 + DEC N 1 + DEC (-TRAIL BPL
TYA PUSH0A JMP END-CODE
\ *** Block No. 96 Hexblock 60
\ SPACE SPACES 29JAN85KS/BP)
: SPACE BL EMIT ;
: SPACES ( U --) 0 ?DO SPACE LOOP ;
\\
: -TRAILING ( ADDR N1 -- ADDR N2)
2DUP BOUNDS
?DO 2DUP + 1- C@ BL -
IF LEAVE THEN 1- LOOP ;
\ *** Block No. 97 Hexblock 61
\ HOLD <# #> SIGN # #S 24DEC83KS)
| : HLD ( -- ADDR) PAD 2- ;
: HOLD ( CHAR -- ) -1 HLD +! HLD @ C! ;
: <# HLD HLD ! ;
: #> ( 32B -- ADDR +N ) 2DROP HLD @ HLD OVER - ;
: SIGN ( N -- ) 0< IF ASCII - HOLD THEN ;
: # ( +D1 -- +D2) BASE @ UD/MOD ROT 09 OVER <
IF [ ASCII A ASCII 9 - 1- ] LITERAL +
THEN ASCII 0 + HOLD ;
: #S ( +D -- 0 0 ) BEGIN # 2DUP D0= UNTIL ;
\ *** Block No. 98 Hexblock 62
\ PRINT NUMBERS 24DEC83KS)
: D.R -ROT UNDER DABS <# #S ROT SIGN #>
ROT OVER MAX OVER - SPACES TYPE ;
: .R SWAP EXTEND ROT D.R ;
: U.R 0 SWAP D.R ;
: D. 0 D.R SPACE ;
: . EXTEND D. ;
: U. 0 D. ;
\ *** Block No. 99 Hexblock 63
\ .S LIST C/L L/S 24DEC83KS)
: .S SP@ S0 @ OVER - 020 UMIN BOUNDS ?DO I @ U. 2 +LOOP ;
40 CONSTANT C/L \ SCREEN LINE LENGTH
10 CONSTANT L/S \ LINES PER SCREEN
: LIST ( BLK --)
SCR ! ." SCR " SCR @ DUP U.
." DR " DRV? .
L/S 0 DO CR I 2 .R SPACE SCR @ BLOCK
I C/L * + C/L -TRAILING TYPE LOOP CR ;
\ *** Block No. 100 Hexblock 64
\ MULTITASKER PRIMITIVES BP03NOV85)
CODE PAUSE NEXT HERE 2- ! END-CODE
: LOCK ( ADDR --)
DUP @ UP@ = IF DROP EXIT THEN
BEGIN DUP @ WHILE PAUSE REPEAT UP@ SWAP ! ;
: UNLOCK ( ADDR --) DUP LOCK OFF ;
LABEL WAKE WAKE >WAKE !
PLA SEC 5 # SBC UP STA PLA 0 # SBC UP 1+ STA
04C # LDA UP X) STA 6 # LDY UP )Y LDA SP STA
INY UP )Y LDA SP 1+ STA 1 # LDY
SP X) LDA RP STA SP )Y LDA RP 1+ STA SP 2INC
IP # LDX XPULL JMP END-CODE
\ *** Block No. 101 Hexblock 65
\ BUFFER MECHANISM 15DEC83KS) cas 26jan06
USER FILE 0 FILE ! \ ADR OF FILE CONTROL BLOCK
VARIABLE PREV 0 PREV ! \ LISTHEAD
| VARIABLE BUFFERS 0 BUFFERS ! \ SEMAPHOR
0408 CONSTANT B/BUF \ size of buffer
\ *** Block No. 102 Hexblock 66
\\ structure of buffer (same for all volksFORTH ) cas 26jan06
0 : LINK
2 : FILE
6 : BLOCKNR
8 : STATUSFLAGS
0A : DATA .. 1 KB ..
STATUSFLAG BITS: 15 1 -> UPDATED
FILE = -1 EMPTY BUFFER
= 0 NO FCB , DIRECT ACCESS
= ELSE ADR OF FCB
( SYSTEM DEPENDENT )
\ *** Block No. 103 Hexblock 67
\ SEARCH FOR BLOCKS IN MEMORY 11JUN85BP)
LABEL THISBUFFER? 2 # LDY
[[ N 4 + )Y LDA N 2- ,Y CMP
0= ?[[ INY 6 # CPY 0= ?] ]? RTS \ ZERO IF THIS BUFFER )
| CODE (CORE? ( BLK FILE -- ADDR / BLK FILE )
\ N-AREA : 0 BLK 2 FILE 4 BUFFER
\ 6 PREDECESSOR
3 # LDY
[[ SP )Y LDA N ,Y STA DEY 0< ?]
USER' OFFSET # LDY CLC UP )Y LDA N 2+ ADC N 2+ STA
INY UP )Y LDA N 3 + ADC N 3 + STA PREV LDA N 4 + STA
PREV 1+ LDA N 5 + STA THISBUFFER? JSR 0= ?[
\ *** Block No. 104 Hexblock 68
\ " 11JUN85BP)
LABEL BLOCKFOUND SP 2INC 1 # LDY
8 # LDA CLC N 4 + ADC SP X) STA
N 5 + LDA 0 # ADC SP )Y STA
' EXIT @ JMP ]?
[[ N 4 + LDA N 6 + STA N 5 + LDA N 7 + STA
N 6 + X) LDA N 4 + STA 1 # LDY
N 6 + )Y LDA N 5 + STA N 4 + ORA
0= ?[ ( LIST EMPTY ) NEXT JMP ]?
THISBUFFER? JSR 0= ?] \ FOUND, RELINK
N 4 + X) LDA N 6 + X) STA 1 # LDY N 4 + )Y LDA N 6 + )Y STA
PREV LDA N 4 + X) STA PREV 1+ LDA N 4 + )Y STA
N 4 + LDA PREV STA N 5 + LDA PREV 1+ STA
BLOCKFOUND JMP END-CODE
\ *** Block No. 105 Hexblock 69
\\ (CORE? 23SEP85BP
| : this? ( blk file bufadr -- flag )
DUP 4+ @ SWAP 2+ @ D= ;
| : (CORE? ( BLK FILE -- DATAADDR / BLK FILE )
BEGIN OVER OFFSET @ + OVER PREV @
THIS? IF RDROP 2DROP PREV @ 8 + EXIT THEN
2DUP >R OFFSET @ + >R PREV @
BEGIN DUP @ ?DUP
0= IF RDROP RDROP DROP EXIT THEN
DUP R> R> 2DUP >R >R ROT THIS? 0=
WHILE NIP REPEAT DUP @ ROT ! PREV @ OVER ! PREV !
RDROP RDROP REPEAT ; -2 ALLOT
\ *** Block No. 106 Hexblock 6A
\ (DISKERR 11JUN85BP)
: (DISKERR ." ERROR ! R TO RETRY "
KEY DUP ASCII R = SWAP ASCII R =
OR NOT ABORT" ABORTED" ;
DEFER DISKERR ' (DISKERR IS DISKERR
DEFER R/W
\ *** Block No. 107 Hexblock 6B
\ BACKUP EMPTYBUF READBLK 11JUN85BP)
| : BACKUP ( BUFADDR --)
DUP 6+ @ 0<
IF 2+ DUP @ 1+ \ BUFFER EMPTY IF FILE = -1
IF INPUT PUSH OUTPUT PUSH STANDARDI/O
BEGIN DUP 6+ OVER 2+ @ 2 PICK @ 0 R/W
WHILE ." WRITE " DISKERR
REPEAT THEN
080 OVER 4+ 1+ CTOGGLE THEN DROP ;
| : EMPTYBUF ( BUFADDR --) 2+ DUP ON 4+ OFF ;
| : READBLK ( BLK FILE ADDR -- BLK FILE ADDR)
DUP EMPTYBUF INPUT PUSH OUTPUT PUSH STANDARDI/O >R
BEGIN OVER OFFSET @ + OVER R@ 8 + -ROT 1 R/W
WHILE ." READ " DISKERR REPEAT R> ;
\ *** Block No. 108 Hexblock 6C
\ TAKE MARK UPDATES? FULL? CORE? BP)
| : TAKE ( -- BUFADDR) PREV
BEGIN DUP @ WHILE @ DUP 2+ @ -1 = UNTIL
BUFFERS LOCK DUP BACKUP ;
| : MARK ( BLK FILE BUFADDR -- BLK FILE )
2+ >R 2DUP R@ ! OFFSET @ + R@ 2+ !
R> 4+ OFF BUFFERS UNLOCK ;
| : UPDATES? ( -- BUFADDR / FLAG)
PREV BEGIN @ DUP WHILE DUP 6+ @ 0< UNTIL ;
| : FULL? ( -- FLAG) PREV BEGIN @ DUP @ 0= UNTIL 6+ @ 0< ;
: CORE? ( BLK FILE -- ADDR /FALSE) (CORE? 2DROP FALSE ;
\ *** Block No. 109 Hexblock 6D
\ BLOCK & BUFFER MANIPULATION 11JUN85BP)
: (BUFFER ( BLK FILE -- ADDR)
BEGIN (CORE? TAKE MARK REPEAT ; -2 ALLOT
: (BLOCK ( BLK FILE -- ADDR)
BEGIN (CORE? TAKE READBLK MARK REPEAT ; -2 ALLOT
| CODE FILE@ ( -- N ) USER' FILE # LDY
UP )Y LDA PHA INY UP )Y LDA PUSH JMP END-CODE
: BUFFER ( BLK -- ADDR ) FILE@ (BUFFER ;
: BLOCK ( BLK -- ADDR ) FILE@ (BLOCK ;
\ *** Block No. 110 Hexblock 6E
\ BLOCK & BUFFER MANIPULATION 09SEP84KS)
: UPDATE 080 PREV @ 6+ 1+ C! ;
: SAVE-BUFFERS
BUFFERS LOCK BEGIN UPDATES? ?DUP WHILE BACKUP REPEAT
BUFFERS UNLOCK ;
: EMPTY-BUFFERS
BUFFERS LOCK PREV
BEGIN @ ?DUP
WHILE DUP EMPTYBUF
REPEAT BUFFERS UNLOCK ;
: FLUSH SAVE-BUFFERS EMPTY-BUFFERS ;
\ *** Block No. 111 Hexblock 6F
\ MOVING BLOCKS 15DEC83KS) cas 26jan06
| : (COPY ( FROM TO --) DUP FILE@
CORE? IF PREV @ EMPTYBUF THEN
FULL? IF SAVE-BUFFERS THEN
OFFSET @ + SWAP BLOCK 2- 2- ! UPDATE ;
| : BLKMOVE ( FROM TO QUAN --) SAVE-BUFFERS >R
OVER R@ + OVER U> >R 2DUP U< R> AND
IF R@ R@ D+ R> 0 ?DO -1 -2 D+ 2DUP (COPY LOOP
ELSE R> 0 ?DO 2DUP (COPY 1 1 D+ LOOP
THEN SAVE-BUFFERS 2DROP ;
: COPY ( FROM TO --) 1 BLKMOVE ;
: CONVEY ( [BLK1 BLK2] [TO.BLK --)
SWAP 1+ 2 PICK - DUP 0> NOT ABORT" NO!!" BLKMOVE ;
\ *** Block No. 112 Hexblock 70
\ ALLOCATING BUFFERS 23SEP83KS) cas2013apr04
7F00 CONSTANT LIMIT VARIABLE FIRST
: ALLOTBUFFER ( -- )
FIRST @ R0 @ - B/BUF 2+ U< ?EXIT
B/BUF NEGATE FIRST +! FIRST @ DUP EMPTYBUF
PREV @ OVER ! PREV ! ;
: FREEBUFFER ( -- )
FIRST @ LIMIT B/BUF - U<
IF SAVE-BUFFERS BEGIN DUP @ FIRST @ - WHILE @ REPEAT
FIRST @ @ SWAP ! B/BUF FIRST +! THEN ;
: ALL-BUFFERS BEGIN FIRST @ ALLOTBUFFER FIRST @ = UNTIL ;
\ *** Block No. 113 Hexblock 71
\ ENDPOINTS OF FORGET 04JAN85BP/KS)
| : \? ( NFA -- FLAG ) C@ 020 AND ;
| : FORGET? ( ADR NFA -- FLAG ) \ CODE IN HEAP OR ABOVE ADR ?
NAME> UNDER 1+ U< SWAP HEAP? OR ;
| : ENDPOINTS ( ADDR -- ADDR SYMB)
HEAP VOC-LINK @ >R
BEGIN R> @ ?DUP \ THROUGH ALL VOCABS
WHILE DUP >R 4 - >R \ LINK ON RETURNST.
BEGIN R> @ >R OVER 1- DUP R@ U< \ UNTIL LINK OR
SWAP R@ 2+ NAME> U< AND \ CODE UNDER ADR
WHILE R@ HEAP? [ 2DUP ] UNTIL \ SEARCH FOR A NAME IN HEAP
R@ 2+ \? IF OVER R@ 2+ FORGET?
IF R@ 2+ (NAME> 2+ UMAX THEN \ THEN UPDATE SYMB
THEN REPEAT RDROP REPEAT ;
\ *** Block No. 114 Hexblock 72
\ REMOVE 23JUL85WE
| CODE REMOVE ( DIC SYMB THR - DIC SYMB)
5 # LDY [[ SP )Y LDA N ,Y STA DEY 0< ?] USER' S0 # LDY
CLC UP )Y LDA 6 # ADC N 6 + STA
INY UP )Y LDA 0 # ADC N 7 + STA 1 # LDY
[[ N X) LDA N 8 + STA N )Y LDA N 9 + STA N 8 + ORA 0<>
?[[ N 8 + LDA N 6 + CMP N 9 + LDA N 7 + SBC CS
?[ N 8 + LDA N 2 + CMP N 9 + LDA N 3 + SBC
][ N 4 + LDA N 8 + CMP N 5 + LDA N 9 + SBC
]? CC
?[ N 8 + X) LDA N X) STA N 8 + )Y LDA N )Y STA
][ N 8 + LDA N STA N 9 + LDA N 1+ STA ]?
]]? (DROP JMP END-CODE
\ *** Block No. 115 Hexblock 73
\ REMOVE- FORGET-WORDS 29APR85BP)
| : REMOVE-WORDS ( DIC SYMB -- DIC SYMB)
VOC-LINK BEGIN @ ?DUP WHILE DUP >R 4 - REMOVE R> REPEAT ;
| : REMOVE-TASKS ( DIC --)
UP@ BEGIN 1+ DUP @ UP@ - WHILE 2DUP @ SWAP HERE UWITHIN
IF DUP @ 1+ @ OVER ! 1- ELSE @ THEN REPEAT 2DROP ;
| : REMOVE-VOCS ( DIC SYMB -- DIC SYMB)
VOC-LINK REMOVE THRU.VOCSTACK
DO 2DUP I @ -ROT UWITHIN
IF [ ' FORTH 2+ ] LITERAL I ! THEN -2 +LOOP
2DUP CURRENT @ -ROT UWITHIN
IF [ ' FORTH 2+ ] LITERAL CURRENT ! THEN ;
\ *** Block No. 116 Hexblock 74
\ FORGET-WORDS cas 26jan06
| : FORGET-WORDS ( DIC SYMB --)
OVER REMOVE-TASKS REMOVE-VOCS
REMOVE-WORDS
HEAP SWAP - HALLOT DP ! 0 LAST ! ;
\ *** Block No. 117 Hexblock 75
\ DELETING WORDS FROM DICT. 13JAN83KS)
: CLEAR HERE DUP UP@ FORGET-WORDS DP ! ;
: (FORGET ( ADR --) DUP HEAP? ABORT" IS SYMBOL"
ENDPOINTS FORGET-WORDS ;
: FORGET ' DUP [ DP ] LITERAL @ U< ABORT" PROTECTED"
>NAME DUP HEAP? IF NAME> ELSE 2- 2- THEN (FORGET ;
: EMPTY [ DP ] LITERAL @
UP@ FORGET-WORDS [ UDP ] LITERAL @ UDP ! ;
\ *** Block No. 118 Hexblock 76
\ SAVE BYE STOP? ?CR 20OCT84KS/BP)
: SAVE
HERE UP@ FORGET-WORDS VOC-LINK @
BEGIN DUP 2- 2- @ OVER 2- ! @ ?DUP 0= UNTIL
UP@ ORIGIN 0100 CMOVE ;
: BYE FLUSH EMPTY (BYE ;
| : END? KEY #CR (C 3 ) = IF TRUE RDROP THEN ;
: STOP? ( -- FLAG) KEY? IF END? END? THEN FALSE ;
: ?CR COL C/L 0A - U> IF CR THEN ;
\ *** Block No. 119 Hexblock 77
\ IN/OUTPUT STRUCTURE 02MAR85BP)
| : OUT: CREATE DUP C, 2+ DOES> C@ OUTPUT @ + PERFORM ;
: OUTPUT: CREATE ] DOES> OUTPUT ! ;
0 OUT: EMIT OUT: CR OUT: TYPE
OUT: DEL OUT: PAGE OUT: AT OUT: AT? DROP
: ROW ( -- ROW) AT? DROP ;
: COL ( -- COL) AT? NIP ;
| : IN: CREATE DUP C, 2+ DOES> C@ INPUT @ + PERFORM ;
: INPUT: CREATE ] DOES> INPUT ! ;
0 IN: KEY IN: KEY? IN: DECODE IN: EXPECT DROP
\ *** Block No. 120 Hexblock 78
\ ALIAS ONLY DEFINITIONEN 29JAN85BP)
ONLY DEFINITIONS FORTH
: SEAL 0 ['] ONLY >BODY ! ; \ KILL ALL WORDS IN ONLY)
' ONLY ALIAS ONLY
' FORTH ALIAS FORTH
' WORDS ALIAS WORDS
' ALSO ALIAS ALSO
' DEFINITIONS ALIAS DEFINITIONS
HOST TARGET
\ *** Block No. 121 Hexblock 79
\ 'COLD 07JUN85BP) cas2013apr05
| : INIT-VOCABULARYS VOC-LINK @
BEGIN DUP 2- @ OVER 4 - ! @ ?DUP 0= UNTIL ;
| : INIT-BUFFERS 0 PREV ! LIMIT FIRST ! ALL-BUFFERS ;
DEFER 'COLD ' NOOP IS 'COLD
| : (COLD INIT-VOCABULARYS INIT-BUFFERS PAGE 'COLD ONLYFORTH
." volksFORTH-83 3.8.7 05apr13 CS" CR RESTART ; -2 ALLOT
DEFER 'RESTART ' NOOP IS 'RESTART
| : (RESTART ['] (QUIT IS 'QUIT
DRVINIT 'RESTART [ ERRORHANDLER ] LITERAL @ ERRORHANDLER !
['] NOOP IS 'ABORT ABORT ; -2 ALLOT
\ *** Block No. 122 Hexblock 7A
\ COLD BOOTSYSTEM RESTART 09JUL85WE)
CODE COLD HERE >COLD !
' (COLD >BODY 100 U/MOD # LDA PHA # LDA PHA
LABEL BOOTSYSTEM CLI 0 # LDY
CLC S0 LDA 6 # ADC N STA S0 1+ LDA 0 # ADC N 1+ STA
[[ ORIGIN ,Y LDA N )Y STA INY 0= ?]
LABEL WARMBOOT BOOTNEXTLEN 1- # LDY
[[ BOOTNEXT ,Y LDA PUTA ,Y STA DEY 0< ?]
CLC S0 LDA 6 # ADC UP STA S0 1+ LDA 0 # ADC UP 1+ STA
USER' S0 # LDY UP )Y LDA SP STA INY UP )Y LDA SP 1+ STA
USER' R0 # LDY UP )Y LDA RP STA INY UP )Y LDA RP 1+ STA
0 # LDX 1 # LDY TXA RP X) STA RP )Y STA
PLA IP STA PLA IP 1+ STA
LABEL XYNEXT 0 # LDX 1 # LDY NEXT JMP END-CODE
\ *** Block No. 123 Hexblock 7B
\ ( RESTART PARAM.-PASSING TO FORTH BP)
CODE RESTART HERE >RESTART !
' (RESTART >BODY 100 U/MOD
# LDA PHA # LDA PHA WARMBOOT JMP END-CODE
\ *** Block No. 124 Hexblock 7C
\ CODE FOR PARAMETER-PASSING TO FORTH cas 26jan06
\ Include system dependent Input / Output code
\ (Keyboard and Screen)
include systemio.fb
HOST ' TRANSIENT 8 + @
TRANSIENT FORTH CONTEXT @ 6 + !
TARGET
FORTH ALSO DEFINITIONS
: FORTH-83 ; \ LAST WORD IN DICTIONARY
\ *** Block No. 125 Hexblock 7D
\ SYSTEM DEPENDENT CONSTANTS BP/KS)
VOCABULARY ASSEMBLER
ASSEMBLER DEFINITIONS
TRANSIENT ASSEMBLER
PUSHA CONSTANT PUSHA \ PUT A SIGN-EXTENDED ON STACK
PUSH0A CONSTANT PUSH0A \ PUT A ON STACK
PUSH CONSTANT PUSH \ MSB IN A AND LSB ON JSR-STACK
RP CONSTANT RP
UP CONSTANT UP
SP CONSTANT SP
IP CONSTANT IP
N CONSTANT N
PUTA CONSTANT PUTA
W CONSTANT W
SETUP CONSTANT SETUP
\ *** Block No. 126 Hexblock 7E
\
NEXT CONSTANT NEXT
XYNEXT CONSTANT XYNEXT
(2DROP CONSTANT POPTWO
(DROP CONSTANT POP
\ *** Block No. 127 Hexblock 7F
\ SYSTEM PATCHUP 05JAN85BP) cas2013apr05
FORTH DEFINITIONS
\ change memory layout for stacks and buffers here
TOPADDR ' LIMIT >BODY !
TOPADDR $F00 - S0 ! TOPADDR $480 - R0 !
S0 @ DUP S0 2- ! 6 + S0 7 - !
HERE DP !
HOST TUDP @ TARGET UDP !
HOST TVOC-LINK @ TARGET VOC-LINK !
HOST MOVE-THREADS
)
\ *** Block No. 128 Hexblock 80
\ *** Block No. 129 Hexblock 81
\ *** Block No. 130 Hexblock 82
\ *** Block No. 131 Hexblock 83