7/<ө :`L/L/^:~::/LI, HʱʕhɅ͈ɅiɐLCLI$ f H `EXECUT] ̵LBRANC} eHȱeʅhLF 0BRANCȖ iɐLD (LOOP к hhhhL (+LOOP !еHH}h}hL (DO!H!HHHHLD ?!#DIGI[!k!800 08 0  HL? HL? (FINDa!! l РQ)?-ȱQ #iee•HL= ȱȱȱ†еЩHL= ENCLOSő!" l 8ȱLD LD EMI!3KE8"4?TERMINAA"84CI"D4CMOVW"h" l LD őLm"U^""”666uuuLD U"" *66866LV!ANľ"#5H5L? O"#HL? XO#-#UHUL? SP%#C#HL= SP;#R#ΪLD RPJ#b#РΪLD ;Z#v#hhLD LEAVo##кLD >##HHLD R##hhLD ү##кHL= 0##ȔLD 0##*LD #$uuLD D#$uuuuLT!MINU$B$8LD DMINU8$[$8LC$OVEP$r$HL= DROi$V!SWAz$$HL? DUЃ$$HL= +$$uuLT!TOGGLŬ$$ULT!$$HL? C$$LD $%LT!C%%LT!%>%(c(&$&%-()w)HHiɘeͅLD &%>%()t#<))t#CONSTANS%>%-<)>'w)HȱL= VARIABLe%>%p%w)iHeL= USE҅%>%p%w)eHeL= %z%%z%%z%%z%B%z% C/%z%@FIRS%z%0LIMI%z%B/BU%z%B/SC &z%+ORIGI&>%* $t#TI!&% WIDT5&% WARNIN>&%FENCI&%DV&%VOC-LINa&%BLi&%Iw&%OUԀ&%SC҈&%OFFSEԑ&%CONTEXԚ&% CURRENԦ&%"STATų&%$BAS&%&DP&%(FL&%*CS&%,R&%.HL&%01&>%%$t#2'>%%$t#HER'>%f&$t#ALLO'>%f&$t#*'>%"'%%2't#C:'>%"'%%2't#J'>%@$$t#['>%_'#t#Ug'>%_'#t#s''8PIȔLV!'>%$'t#ROԝ'>%#$#$t#SPACũ'>%%?"t#-DUл'>%$ $t#TRAVERS'>%$p$$d p$$' $$t#LATES'>%&$$t#LF(>%d _'t#CF(>%%_'t#NF&(>%d _'* 't#PF4(>%%'d $t#!CSI(>%A#&%t#?ERRO\(>%$ 8- $t#?COMm(>%&$#d v(t#?EXEÈ(>%&$d v(t#?PAIRӟ(>%_'d v(t#?CSд(>%A#&$_'d v(t#?LOADIN(>%}&$#d v(t#COMPIL(>%(#$'#$>'t#(>%%&%t#)>%d &%t#SMUDG$)>% (d $t#HE3)>%d &%t#DECIMAG)>%d &%t#(;CODEX)>%# (O(,(%t#;CODm)>%()w))<)t#%%p%t#DOES)>%# (O(%w)HH̅ȱ̅iHiL= COUNԭ)>%$'$$t#TYP)>%' p$$$F!_!$d #?" $t#-TRAILIN)>%$%F!p$p$$%_'$%_' # %_' t#(."!*>%#)$'#$#)t#.Y*>%d "&$ )`* ,"'$'2' ,"'))t#QUERt*>%;&$d Pc4%&%t#*>%}&$ *%}&$%&%}&$%&"$# (#$ #$t#FIL̽*>%$#p$%$'#%_'f"t#ERAS*>%%+t#BLANK+>%%+t#HOL(+>%* &$&$%t#PA9+>%"'d $t#NEXR+z%D PUSc+z%= PUn+z%? PUSH0y+z%D#POЃ+z%V!POPTWϐ+z%T!BINARٚ+z% #IЧ+z%״+z%ν+z%XSAV+z%U+z%SETU+z%l PFLA+%GFLA+%WOR+>%}&$ }&$t2 ;&$&$$$""'d "1+&$p$_'##"'%$"''#f"t#(NUMBER,>%'$#$&$i! ,$&$"$'&$"$&$' %&$# #t#NUMBER,>%%%'$'$d -k'$#$* &%],$$%_' $$d ._'%v(% $# Y$t#-FINğ,>%% ,"'&$$!$# $"' (!t#(ABORT,>%/t#ERRO ->%S&$# *-"'))`* ? 3P#$$&$}&$l/t#ID0->%X+d d _+$O((p$_'X+$f"X+)d #)'t#CREATg->%, $:(m-d  3'"'$$F&$q0'2'f&$d k'2'$d $"'%_'d $ (>'&$%"''>'t#[COMPILEݘ->%,#%v($,(>'t#LITERA->%&$ )* >'t#DLITERA.>%&$ $..t#?STAC/.>%d A#x'%v(A#d x'd v(t#INTERPREL.>%, &$' ,(>' ,( U. "',&$' :. $.U. t#IMMEDIATp.>% (d @$t#VOCABULAR.>%)* >'&$,(>'"'t&$>'t&%)'&%t#FORT.)/:DEFINITION />%&$&%t#PROMP/>%+$%+%`*ok+%t#8/>%d ) ,t#QUIX/>%%}&%)`#\"*|.&$# A/ t#ABORe/>%P#b)2\"`*s*p*a*c*e fig4th 1.1/,/l/`COLĐ// : 3 / / έ Ϲ Έ/ʩةlLb#S->/>%$#@$t#+0>%# @$t#D++0>%# Y$t#AB<0>%$00t#DABN0>%$B0t#MI\0>%p$p$' $$t#MAk0>%p$p$' $$t#M0>%p$p$+##T0$T0"#B0t#M0>%p$##c0#T0"##+#00$#00$t#0>%"$t#/MO0>%#!0#0t#0>%0$$t#MO0>%0$t#*/MO 1>%#0#0t#*1>%"1$$t#M/MO.1>%#%#"#$#"#t#US=1%PRE[1%p+BUe1>%* $$&k' $%$l1$_'t#UPDATp1>%l1$$* #l1$%t#FLUSȗ1>%&%_'&d $1'%F!* ,2$ t#EMPTY-BUFFERӶ1>%%&p$_' +t#DR1>%%&%t#DR2>%* &%t#BUFFE2>%a1$$#w1 a1%#$# #'#$* #%/5#%#l1%#'t#BLOC#2>%&$$#l1$$$#_'$$ 4w1# $#,2$#%/5%_'$$#_'$$# $l1%#$'t#(LINEl2>%#%&"1#&0$t2$%t#.LIN2>%2-*)t#MESSAG2>%S&$ ' d &$&1_'2 `*MSG # 7\"t#LOA3>%}&$#&$#%&%&0}&%|.#&%#}&%t#--=3>%(%&%&}&$p$1_'}&$t#םD3E 3 ؝D3E 3`ٝD3E 3`JKB V`KEP8qΑȩqΑε 3+ Т` 4LV!Т H BHIh V`ТBHI VLD#ILD# 3+ Т` 4LD EXPECp3e4 BHIDE†â VLe4H8,mSSeRRΐeUSSeRURT 3àLT!-DISZ44RW   S0LT!R/4>%$'* 0'$d 'd v('4' 7d v(t#)5>%,#%v($.t#FORGE\5>%`5:($^&$x'd v(#t&$#p$x' /,/$$t&% $d _'O(($$#x' p$%_'%$'# #f&%t#BACp5>%"'_'>'t#BEGI5>%("'%t#ENDI5>%(%("'p$_'$%t#THE6>%6t#D6>%)F!"'%t#LOO)6>%%() 5t#+LOO:6>%%()!5t#UNTIO6>%%() 5t#ENe6>%m6t#AGAI{6>%%() 5t#REPEAԇ6>%##6##%_'6t#IƝ6>%) "'%>'%t#ELSź6>%%() "'%>'$%6%t#WHIL6>%6't#SPACE6>%%0' %F!' t#<7>%X+&%t##!7>%$$&$X+p$_'t#SIG07>%'# d -@+t#G7>%&$E1'd p$' d $d 0$@+t##_7>%c7p$p$## t#D.҆7>%#$p$c0&77N757#p$_' 7)t#D7>%%7't#.7>%#!0#7t#7>%!07t#7>%$7t#U7>%%7t#C7>%$7t#D8>%$$$'$$t#D8>%$#%#'%t#2DU(8>%p$p$t#2DRO=8>%$$t#2SWAL8>%'#'#t#2OVE\8>%d8D8##d8##t#op8>%d ~$?"$?"?"t#U8>%$7t#LISԠ8>%b)\"$&%`*SCR # 7d %F!\"_!%7'_!&$2 \"t#MATCȭ88 l ʔ*ť°դũuHuL? INDE8>%\"'$F!\"_!%7'%_!2U" # t#TRIAF9>%%1%0%p$$$F!\"_!8 \"d  3\"t#VLISv9>%d &%&$$&$%' \"%&%$m-''O(($$#U"# $t#SAVŧ9>%/,/ (d +&%"'d +&%"'d +&%t&$d +&%"'d $* +&_'d $d 1H:t#DSAV9J:е:W   S0$ii  Κ:ݦLV!L/PO@:>%%+%t#POFƞ:>%%+%t#SAVE XT t#LIN:>%$* #* v(&$3$t#MAR;>%* %F!_! ;1$ t#EDITO#;)9/;>Q/WHERB;>%$&11$&%`*SCR # b)8$%!1%1'2$\"%-*)\""'_'87* ^?"K;/t##LOCATM/>%&$%!1t##LEAĤ;>%; ;$t##LAǺ;>%;$#$%#_'t#-MOV;>% ;%f"1t#;>% ;X+'%$X+%f"t#;>% ;%1+1t#<>%$%_'* F!_! ;_!';* !%$;* $'F!_!' ;_!; %&$\"';)* ?";);8$t#o<>%$%1&%$;%s%&$8%s%X+'$;t#п<>%%:%$%<%%&%t#CLEA<>%&%* %F!_!< t#COP<>%&1&$$$&1&p$$$F!$_!2%_'%'1 $1t#1LIN=>%;X+)#9&$t#FINX=>%* &$' %#;$#_';#@$&$;$$f"#1+1t#Ο=>%w=%s%%:=t#=>%X+$@$s%%:w=X+$=%s%;$%:`=#%v(;$$_'=%s>%%:X+);'p$0##&$#_'#$"'#f""';$#f"#f"1%s>%$* #* v(&$3$t#MAR?>%* %F!_!?1$ t#EDITO4?)9/MBQ/WHERS?>%$&11$&%`*SCR # b)8$%!1%1'2$\"%-*)\""'_'87* ^?"\?/t##LOCATM/>%&$%!1t##LEAĵ?>%??$t##LA?>%?$#$%#_'t#-MOV?>%?%f"1t#?>%?X+'%$X+%f"t# @>%?%1+1t#"@>%$%_'* F!_!?_!'?* !&@t#2@>%$@* $'F!_!'?_!? &@t#Z@>%&$\"'?)* ?"?)?8$t#Ԁ@>%$%1&%$@%@t#̤@>%&$8%@t#Ҿ@>%X+'$?t#@>%%>@t#@>%$6@@t#TO@>%%&%t#CLEA@>%&%* %F!_!&@ t#COP A>%&1&$$$&1&p$$$F!$_!2%_'%'1 $1t#1LIN,A>%?X+)#9&$t#FINiA>%* &$' AX+"'%'f"%^-qA t#DELETŁA>%#?$#_'?#@$&$?$$f"#1+1t#ΰA>%A%@t#A>%%>At#BA>%X+$@$@t#A>%%>AX+$A%@t#TIL B>%?$%>qA#%v(?$$_'A%@t#$B>%%>X+)?'p$0##&$#_'#$"'#f""'?$#f"#f"1%@t#ASSEMBLEf?)9/Hd?CODŏB>%B-<)t#SM/>%)O')$O't#BRKB)BCLCB)BCLDB)B؄CLIB)BXCLVB)BDEXB)BʄDEYC)BINXC)BINYC)BȄNOP)C)BPHA5C)BHPHPAC)BPLAMC)BhPLPYC)B(RTIeC)B@RTSqC)B`SEC}C)B8SEDC)BSEIC)BxTAXC)BTSXC)BTXAC)BTXSC)BTYAC)BASL.AC)B ROL.AC)B*LSR.AC)BJROR.AD)BjNOD>%#t#0!D>%%t#3B-D>%)O')$O'>'t#JMP8D)FDLJMP()ND)FDlJSRZD)FD ?ERhD>%* v(t#IFtD>%)O')$O'%O'"'t#THEND>%$"'$_'$* '{D$* '{D$* $%t#ENDIFD>%Dt#IFPLD)DIFMID)D0IFVCD)DPIFVSD)DpIFCCE)DIFCSE)DIFNE!E)DЅIFEQ.E)DBEGIN;E>%"'t#ENDHE>% * * O'"''_'$* '{DO't#UNTILWE>%^Et#MODņE% MODEE>%E$k't#256E>%$* 't#MODEFIزE>%E * E$t#CKMODE>%E Et#ME>%)O')$* E* E$$E$#O'E O' >'* E%t#XE>%* E%t#5F>%* E%t#)FF>%* E%t#,VF>%* E%t#,gF>%* E%t#ORAxF)FANDF)F EORF)F@ADCF)F`STAF)FLDAF)FCMPF)FSBCF)FBITF>%E * $O'O' * ,O'>'t#STOREADF>%O'E O' >'* E%t#ZPAGG>%p$* ' * #t#XYMOD5G>%E$* k'E$* k'#t#MSG>%)O')$E$* k' *  %#=GGt#ASLvG)GROLG)G.LSRG)GNRORG)GnDECG)G΄INCG)GOPCODG>%$=G\G * #t#MG>%)O')GE$* k' * _'Gt#LDY H)HLDX1H)HCPY=H)H̄CPXIH)HMUH>%)O')GGt#STYaH)nHSTXtH)nHSAVE 515B_____________________________ ( ERROR MESSAGES ) STACK EMPTY DICTIONARY FULL WRONG ADDRESS MODE ISN'T UNIQUE VALUE ERROR DISK RANGE? STACK FULL DISK ERROR! END OF TRIAD ( ERROR MESSAGES ) USE ONLY IN DEFINITIONS EXECUTION ONLY CONDITIONALS NOT PAIRED DEFINITION NOT FINISHED IN PROTECTED DICTIONARY USE ONLY WHEN LOADING OFF CURRENT SCREEN DECLARE VOCABULARY ( FORMAT ROUTINE ) HEX ( Lloyd Ollman Aug 81 ) ( DEVICE CONTROL BLOCK ) E453 CONSTANT DSKINV 301 CONSTANT DUNIT ( DEVICE # ) 302 CONSTANT DCOMND ( COMMAND ) 304 CONSTANT DBUFLO ( BUFF ADD ) 305 CONSTANT DBUFHI 308 CONSTANT DBYTLO ( BUFF LEN ) 309 CONSTANT DBYTHI 30A CONSTANT DAUX1 ( AUX 1 BYTE ) --> ( FORMAT CONTINUED ) HEX CODE FORMAT-DISK XSAVE STX, PHP, # 21 LDA, # 0 LDX, # E4 LDY, DCOMND STA, DBUFLO STX, DBUFHI STY, DSKINV JSR, PLP, XSAVE LDX, # 0 LDY, POP JMP, FORTH DECIMAL ;S ( FULL LOAD ) : %SIZE HERE SWAP LOAD HERE SWAP - CR ." SIZE: " U. ." BYTES" CR ; : LMSG CR ." LOADING " ; LMSG ." DEBUG " 21 %SIZE LMSG ." EDITOR " 27 %SIZE LMSG ." ASSEMBLER " 39 %SIZE ;S ( SHOW ALL SCREENS ON PRINTER ) : ?EX ?TERMINAL IF QUIT THEN ; : DOLIST PON 1+ SWAP DO ?EX I LIST LOOP CR POFF ; : SHOW 20 79 DOLIST ; ( ATARI FORTH DEFS ) BASE @ HEX : PON 1 PFLAG ! ; ( PRT ON ) : POFF 0 PFLAG ! ; ( PRT OFF ) BASE ! ;S ( DEBUGGER AIDS -- DUMP , CDUMP ) BASE @ HEX 02FE CONSTANT DSPFLG : DSP.ON 0 DSPFLG ! ; : DSP.OFF 1 DSPFLG ! ; ( USED BY "DUMP" ) : H. BASE @ HEX U. BASE ! ; : B? BASE @ DECIMAL . BASE ! ; --> ( DEBUGGER AIDS -- DUMP , CDUMP ) DECIMAL : ?EXIT ?TERMINAL IF LEAVE ENDIF ; : U.R 0 SWAP D.R ; : LDMP DUP 8 + SWAP DO I C@ 4 .R LOOP ; : DUMP OVER + SWAP DO CR I 5 U.R I LDMP ?EXIT 8 +LOOP CR ; : CDMP DUP 16 + SWAP DO I C@ EMIT LOOP ; : CDUMP OVER + SWAP DO CR I 5 U.R I SPACE DSP.OFF CDMP DSP.ON ?EXIT 16 +LOOP CR ; --> ( STACK PRINTER ) HEX : DEPTH SP@ 12 +ORIGIN @ SWAP - 2 / ; : S. ( PRINTS THE STACK ) DEPTH -DUP IF 0 DO CR ." TOP+" I . SP@ I 2 * + @ U. LOOP ELSE ." Stack Empty" THEN CR ; BASE ! --> ( DEFINITION TRACER ) BASE @ HEX 0 VARIABLE .WORD ' CLIT CFA CONSTANT .CLIT ' 0BRANCH CFA CONSTANT ZBRAN ' BRANCH CFA CONSTANT BRAN ' ;S CFA CONSTANT SEMIS ' (LOOP) CFA CONSTANT PLOOP ' (+LOOP) CFA CONSTANT PPLOOP ' (.") CFA CONSTANT PDOTQ : PWORD 2+ NFA ID. ; : 1BYTE PWORD .WORD @ C@ . 1 .WORD +! ; : 1WORD PWORD .WORD @ @ . 2 .WORD +! ; : NP DUP SEMIS = IF PWORD CR CR PROMPT QUIT THEN ?TERMINAL IF PROMPT QUIT THEN ; --> ( DEFINITION TRACER ) : BRNCH PWORD ." to " .WORD @ .WORD @ @ + . 2 .WORD +! ; : STG PWORD 22 EMIT .WORD @ DUP COUNT TYPE 22 EMIT C@ .WORD @ + 1+ .WORD ! ; ' LIT CFA CONSTANT .LIT : CKIT DUP ZBRAN = OVER BRAN = OR OVER PLOOP = OR OVER PPLOOP = OR IF BRNCH ELSE DUP .LIT = IF 1WORD ELSE DUP .CLIT = IF 1BYTE ELSE DUP PDOTQ = IF STG ELSE PWORD THEN THEN THEN THEN ; --> ( DEFINITION TRACER ) ' : 12 + CONSTANT DOCOL : T?PR CR CR ." Primitive" CR CR ; : ?DOCOL DUP 2 - @ DOCOL - IF T?PR PROMPT QUIT THEN ; : SETUP [COMPILE] ' ?DOCOL .WORD ! ; : NXT1 .WORD @ U. 2 SPACES .WORD @ @ 2 .WORD +! ; : DECOMP SETUP CR CR BEGIN NXT1 NP CKIT CR AGAIN ; BASE ! ;S ( ** EDITOR ** ) BASE @ HEX ( THIS EDITOR IS PATTERNED AFTER ( THE EXAMPLE EDITOR IN THE fig ( "INSTALLATION MANUAL" 8/80 WFR : TEXT HERE C/L 1+ BLANKS WORD HERE PAD C/L 1+ CMOVE ; : LINE DUP FFF0 AND 17 ?ERROR SCR @ (LINE) DROP ; : MARK 10 0 DO I LINE UPDATE DROP LOOP ; --> ( LINE EDITOR DEFS ) VOCABULARY EDITOR IMMEDIATE : WHERE DUP B/SCR / DUP SCR ! ." SCR # " DECIMAL . SWAP C/L /MOD C/L * ROT BLOCK + CR C/L -TRAILING TYPE CR HERE - SPACES 5E EMIT [COMPILE] EDITOR QUIT ; EDITOR DEFINITIONS : #LOCATE R# @ C/L /MOD ; : #LEAD #LOCATE LINE SWAP ; : #LAG #LEAD DUP >R + C/L R> - ; : -MOVE LINE C/L CMOVE UPDATE ; --> ( LINE EDITING COMMANDS ) : H LINE PAD 1+ C/L DUP PAD C! CMOVE ; : E LINE C/L BLANKS UPDATE ; : S DUP 1 - 0E DO I LINE I 1+ -MOVE -1 +LOOP E ; : D DUP H 0F DUP ROT DO I 1+ LINE I -MOVE LOOP E ; --> ( LINE EDITING COMMANDS ) : M R# +! CR SPACE #LEAD TYPE 17 EMIT #LAG TYPE #LOCATE . DROP ; : T DUP C/L * R# ! DUP H 0 M ; : L SCR @ LIST 0 M ; : R PAD 1+ SWAP -MOVE ; : P 1 TEXT R ; : I DUP S R ; : TOP 0 R# ! ; --> ( SCREEN EDITOR COMMANDS ) : CLEAR SCR ! 10 0 DO FORTH I EDITOR E LOOP ; : COPY B/SCR * OFFSET @ + SWAP B/SCR * B/SCR OVER + SWAP DO DUP FORTH I BLOCK 2 - ! 1+ UPDATE LOOP DROP FLUSH ; --> ( STRING EDITING COMMANDS ) : 1LINE #LAG PAD COUNT MATCH R# +! ; : FIND BEGIN 3FF R# @ < IF TOP PAD HERE C/L 1+ CMOVE 0 ERROR ENDIF 1LINE UNTIL ; : DELETE >R #LAG + FORTH R - #LAG R MINUS R# +! #LEAD + SWAP CMOVE R> BLANKS UPDATE ; --> ( SCREEN EDITING COMMANDS ) : N FIND 0 M ; : F 1 TEXT N ; : B PAD C@ MINUS M ; : X 1 TEXT FIND PAD C@ DELETE 0 M ; : TILL #LEAD + 1 TEXT 1LINE 0= 0 ?ERROR #LEAD + SWAP - DELETE 0 M ; --> ( SCREEN EDITING COMMANDS ) : C 1 TEXT PAD COUNT #LAG ROT OVER MIN >R FORTH R R# +! R - >R DUP HERE R CMOVE HERE #LEAD + R> CMOVE R> CMOVE UPDATE 0 M ; FORTH DEFINITIONS DECIMAL LATEST 12 +ORIGIN ! HERE 28 +ORIGIN ! HERE 30 +ORIGIN ! ' EDITOR 6 + 32 +ORIGIN ! HERE FENCE ! BASE ! ;S ( ATARI-850 DOWNLOAD ) BASE @ HEX CODE DO-SIO XSAVE STX, 0 # LDA, E459 JSR, XSAVE LDX, NEXT JMP, : SET-DCB 50 300 C! 1 301 C! 3F 302 C! 40 303 C! 500 304 ! 5 306 C! 0 307 C! C 308 C! 0 309 ! 0 30B C! ; CODE RELOCATE XSAVE STX, 506 JSR, HERE 8 + JSR, XSAVE LDX, NEXT JMP, 0C JMP(), : BOOT850 HERE 2E7 ! SET-DCB DO-SIO 500 300 0C CMOVE DO-SIO RELOCATE 2E7 @ HERE - ALLOT HERE FENCE ! ; BASE ! ;S ( DISK COPY ROUTINE 40K RAM ) ( 40 K RAM AND DRIVES #1 AND #2 ) 24576 CONSTANT BUFHEAD 0 VARIABLE BLK# 0 VARIABLE ADRS : GET ADRS @ BLK# @ ; : RD GET DUP 718 = IF LEAVE THEN 1 R/W ; : WRT GET 720 + DUP 1438 = IF LEAVE THEN 0 R/W ; : +BLK 1 BLK# +! 128 ADRS +! ; : SETUP BLK# ! BUFHEAD ADRS ! ; : RDIN SETUP 90 0 DO RD +BLK LOOP ; : WRTO SETUP 90 0 DO WRT +BLK LOOP ; --> ( DISK COPY ROUTINE ) ( INSERT SOURCE DISK IN DRIVE #1 ( AND NEW DISK IN DRIVE #2. THEN, ( SIMPLY TYPE "DISKCOPY" ! : MS1 CR CR ." INSERT SOURCE IN DRIVE #1 AND" CR ." NEW DISK IN DRIVE #2" CR ." HIT ANY KEY WHEN READY..." KEY DROP ; : %COPY 0 DO I 90 * DUP DUP RDIN WRTO 90 + . LOOP ; --> ( DISK COPY ROUTINE ) : DISKCOPY CR MS1 CR 8 %COPY ; : FORTHCOPY CR MS1 CR 5 %COPY ; ;S ( ** ASSEMBLER ** IN FORTH ) ( ASSEMBLER COMFORMS TO THE ( fig "INSTALLATION GUIDE" WITH ( THE FOLLOWING EXCEPTIONS: ( SHIFTS ARE: "XXX.A" FOR A-REG. ( SHIFTS. ( CONDITIONAL BRANCHES ARE ( PATTERNED AFTER THE BRANCH OP- ( CODES: "IFEQ," IS USED IN- ( STEAD OF "0= IF," FOR BETTER ( CLARITY. SEE SCREEN 43. --> ( ASSEMBLER VOCABULARY ) VOCABULARY ASSEMBLER IMMEDIATE BASE @ HEX : CODE [COMPILE] ASSEMBLER CREATE SMUDGE ; ASSEMBLER DEFINITIONS : SB @ C, ; ( SINGLE BYTE OPERATORS) --> ( SINGLE-BYTE OPERANDS ) 00 SB BRK, 18 SB CLC, D8 SB CLD, 58 SB CLI, B8 SB CLV, CA SB DEX, 88 SB DEY, E8 SB INX, C8 SB INY, EA SB NOP, 48 SB PHA, 08 SB PHP, 68 SB PLA, 28 SB PLP, 40 SB RTI, 60 SB RTS, 38 SB SEC, F8 SB SED, 78 SB SEI, A8 SB TAX, BA SB TSX, 8A SB TXA, 9A SB TXS, 98 SB TYA, 0A SB ASL.A, 2A SB ROL.A, 4A SB LSR.A, 6A SB ROR.A, : NOT 0= ; ( REVERSE LOGICAL ) : 0= 1 ; ( PUSH A TRUE ) --> ( JMP, JSR, BRANCH CODES ) : 3BY @ C, , ; 4C 3BY JMP, 6C 3BY JMP(), 20 3BY JSR, : ?ER5 5 ?ERROR ; : IF. C@ C, 0 C, HERE ; : THEN, DUP HERE SWAP - DUP 7F > ?ER5 DUP -80 < ?ER5 SWAP -1 + C! ; IMMEDIATE : ENDIF, [COMPILE] THEN, ; IMMEDIATE --> ( CONDITIONAL BRANCH CODES ) 10 IF. IFPL, ( BPL ) 30 IF. IFMI, ( BMI ) 50 IF. IFVC, ( BVC ) 70 IF. IFVS, ( BVS ) 90 IF. IFCC, ( BCC ) B0 IF. IFCS, ( BCS ) D0 IF. IFNE, ( BNE ) F0 IF. IFEQ, ( BEQ ) : BEGIN, HERE ; IMMEDIATE : END, IF D0 ELSE F0 THEN C, HERE 1+ - DUP -80 < ?ER5 C, ; IMMEDIATE : UNTIL, [COMPILE] END, ; IMMEDIATE --> ( MEMORY-REFERENCE INST. ) 0D VARIABLE MODE ( ABS. MODE ) : MODE= MODE @ = ; ( CK MODE ) : 256< DUP 100 ( HEX) < ; : MODEFIX 256< IF -08 MODE +! THEN ; ( MODE=MODE-8 IF ADR<256 ) : CKMODE MODE= IF MODEFIX THEN ; : M0 SWAP 0D CKMODE 1D CKMODE SWAP C@ MODE @ OR C, 256< IF C, ELSE , THEN 0D MODE ! ; --> ( MEMORY REF. INST. ) : X) 01 MODE ! ; ( [ADDR,X] ) : # 09 MODE ! ; ( IMMEDIATE ) : )Y 11 MODE ! ; ( [ADDR],Y ) : ,X 1D MODE ! ; ( ADDR,X ) : ,Y 19 MODE ! ; ( ADDR,Y ) 00 M0 ORA, 20 M0 AND, 40 M0 EOR, 60 M0 ADC, 80 M0 STA, A0 M0 LDA, C0 M0 CMP, E0 M0 SBC, : BIT, 256< IF 24 C, C, ELSE 2C C, , THEN ; --> ( MEMORY REF. INC, CPX, ETC. ) : STOREADD C, 256< IF C, ELSE , THEN 0D MODE ! ; : ZPAGE OVER 100 < IF F7 AND THEN ; : XYMODE MODE @ 19 = MODE @ 1D = OR ; : M1 C@ MODE @ 1D = IF 10 ELSE 0 THEN OR ZPAGE STOREADD ; 0E M1 ASL, 2E M1 ROL, 4E M1 LSR, 6E M1 ROR, CE M1 DEC, EE M1 INC, --> ( MEMORY REF. INST. ) : OPCODE C@ ZPAGE XYMODE IF 10 OR THEN ; : M2 OPCODE MODE @ 9 = IF 4 - THEN STOREADD ; AC M2 LDY, AE M2 LDX, CC M2 CPY, EC M2 CPX, : M3 OPCODE STOREADD ; 8C M3 STY, 8E M3 STX, --> ( END OF ASSEMBLER ) FORTH DEFINITIONS LATEST 0C +ORIGIN ! ( NTOP ) HERE 1C +ORIGIN ! ( FENCE ) HERE 1E +ORIGIN ! ( DP ) ' ASSEMBLER 6 + 20 +ORIGIN ! BASE ! ;S ( CHARACTER FONT MOVE ) HEX ( TO USE IN BASIC USE THE FORM X=USR(ROUTINE,FONT_TO ) CODE MOVEFONT ( Mark DeForest Aug 81 ) PLA, PLA, PLA, ( MOVE TO ) CF STA, 0 # LDA, CE STA, D0 STA, TAY, E0 # LDA, D1 STA, BEGIN, BEGIN, D0 )Y LDA, CE )Y STA, CE INC, D0 INC, 0= UNTIL, CF INC, D1 INC, D1 LDA, E5 # CMP, 0= UNTIL, RTS, FORTH ;S ( COLOR COMMANDS ) BASE @ HEX : SETCOLOR 2 * SWAP 10 * OR SWAP 02C4 ( COLPF0 ) + C! ; : SE. SETCOLOR ; ( ALIAS ) ( REGISTER#-3, COLOR-2, LUM-1 ( 0-3 0-F 0-7 --> ( GRAPHICS COMMANDS ) E456 CONSTANT CIO 1C VARIABLE MASK 340 CONSTANT IOCB 53 VARIABLE SNAME CODE GR. 1 # LDA, GFLAG STA, XSAVE STX, 0 ,X LDA, # 30 LDX, IOCB 0B + ,X STA, # 3 LDA, IOCB 2 + ,X STA, SNAME FF AND # LDA, IOCB 4 + ,X STA, SNAME 100 / # LDA, IOCB 5 + ,X STA, MASK LDA, IOCB 0A + ,X STA, CIO JSR, XSAVE LDX, 0 # LDY, POP JMP, --> ( GRAPHICS COMMANDS ) CODE &GR XSAVE STX, # 30 LDX, # C LDA, IOCB 2 + ,X STA, CIO JSR, XSAVE LDX, 0 # LDA, GFLAG STA, NEXT JMP, : XGR &GR 0 GR. &GR ; ( EXIT GRAPHICS MODE ) --> ( GRAPHICS I/O ) CODE CPUT 0 ,X LDA, PHA, XSAVE STX, # 30 LDX, # B LDA, IOCB 2 + ,X STA, TYA, IOCB 8 + ,X STA, IOCB 9 + ,X STA, PLA, CIO JSR, XSAVE LDX, POP JMP, 54 CONSTANT ROWCRS 55 CONSTANT COLCRS : POS ROWCRS C! COLCRS ! ; : PLOT POS CPUT ; --> ( GRAPHICS I/O ) : GTYPE -DUP IF OVER + SWAP DO I C@ CPUT LOOP ELSE DROP ENDIF ; : (G") R COUNT DUP 1+ R> + >R GTYPE ; : G" 22 STATE @ IF COMPILE (G") WORD HERE C@ 1+ ALLOT ELSE WORD HERE COUNT GTYPE ENDIF ; IMMEDIATE --> ( DRAW, FIL ) 2FB CONSTANT ATACHR 2FD CONSTANT FILDAT CODE GCOM XSAVE STX, 0 ,X LDA, # 30 LDX, IOCB 2 + ,X STA, CIO JSR, XSAVE LDX, POP JMP, : DRAW POS ATACHR C! 11 GCOM ; : FIL FILDAT C! 12 GCOM ; BASE ! ;S ( GRAPHICS TESTS ) : BOX 0 10 10 PLOT 1 50 10 DRAW 1 50 25 DRAW 1 10 25 DRAW 1 10 10 DRAW ; : FBOX XGR 5 GR. BOX 10 25 POS 2 FIL ; ( SMART FORGET ) ( FORTH DIMENSIONS V.II/N.6 P154 ) : FORGET [COMPILE] ' NFA DUP FENCE @ U< 15 ?ERROR >R VOC-LINK @ BEGIN R OVER U< WHILE [COMPILE] FORTH DEFINITIONS @ REPEAT DUP VOC-LINK ! BEGIN DUP 4 - BEGIN PFA LFA @ DUP R U< UNTIL OVER 2 - ! @ -DUP 0= UNTIL R> DP ! ; ( FLOATING POINT WORDS ) BASE @ HEX : FDROP DROP DROP DROP ; : FDUP >R >R DUP R> DUP ROT SWAP R ROT ROT R> ; CODE FSWAP XSAVE STX, # 6 LDY, BEGIN, 0 ,X LDA, PHA, INX, DEY, 0= END, XSAVE LDX, # 6 LDY, BEGIN, 6 ,X LDA, 0 ,X STA, INX, DEY, 0= END, XSAVE LDX, # 6 LDY, BEGIN, PLA, 0B ,X STA, DEX, DEY, 0= END, XSAVE LDX, NEXT JMP, XSAVE 100 * 86 + CONSTANT XSAV : XS, XSAV , ; --> ( FLOATING POINT WORDS ) CODE FOVER DEX, DEX, DEX, DEX, DEX, DEX, XSAVE STX, # 6 LDY, BEGIN, 0C ,X LDA, 0 ,X STA, INX, DEY, 0= END, XSAVE LDX, NEXT JMP, XSAVE 100 * A6 + CONSTANT XLD : XL, XLD , ; CODE AFP XS, D800 JSR, XL, NEXT JMP, CODE FASC XS, D8E6 JSR, XL, NEXT JMP, CODE IFP XS, D9AA JSR, XL, NEXT JMP, --> ( FLOATING POINT WORDS ) CODE FPI XS, D9D2 JSR, XL, NEXT JMP, CODE FADD XS, DA66 JSR, XL, NEXT JMP, CODE FSUB XS, DA60 JSR, XL, NEXT JMP, CODE FMUL XS, DADB JSR, XL, NEXT JMP, CODE FDIV XS, DB28 JSR, XL, NEXT JMP, CODE FLG XS, DECD JSR, XL, NEXT JMP, CODE FLG10 XS, DED1 JSR, XL, NEXT JMP, CODE FEX XS, DDC0 JSR, XL, NEXT JMP, CODE FEX10 XS, DDCC JSR, XL, NEXT JMP, CODE FPOLY XS, DD40 JSR, XL, NEXT JMP, --> ( FLOATING POINT WORDS ) D4 CONSTANT FR0 E0 CONSTANT FR1 FC CONSTANT FLPTR F3 CONSTANT INBUF F2 CONSTANT CIX --> ( FLOATING POINT ) : F@ >R R @ R 2+ @ R> 4 + @ ; : F! >R R 4 + ! R 2+ ! R> ! ; : F.TY BEGIN INBUF @ C@ DUP 7F AND EMIT 1 INBUF +! 80 > UNTIL ; : F. FR0 F@ FSWAP FR0 F! FASC F.TY SPACE FR0 F! ; : F? F@ F. ; --> ( FLOATING POINT ) : FR0 F@ ; : FS FR0 F! ; : F+ ; : F- ; : F* ; : F/ ; : FLOAT FR0 ! IFP F> ; : FIX FS FPI FR0 @ ; : FLOG FS FLG F> ; : FLOG10 FS FLG10 F> ; : FEXP FS FEX F> ; : FEXP10 FS FEX10 F> ; --> ( FLOATING POINT ) : ASCF 0 CIX ! INBUF ! AFP F> ; : FLIT R> DUP 6 + >R F@ ; : FLITERAL STATE @ IF COMPILE FLIT HERE F! 6 ALLOT ENDIF ; : FLOATING ( FLOAT FOLLOWING CONSTANT ) BL WORD HERE 1+ ASCF FLITERAL ; IMMEDIATE ( EX: FLOATING 1.2345 ) ( OR FLOATING -1.67E-13 ) : FP [COMPILE] FLOATING ; IMMEDIATE --> ( FLOATING POINT ) : FVARIABLE ; : FCONSTANT F@ ; : F0= OR OR 0= ; : F= F- F0= ; : F< F- DROP DROP 80 AND 0 > ; BASE ! ;S ( ONE-DRIVE DISK COPY ) DECIMAL ( Harvey Price Sep 81 ) 24576 CONSTANT BUFHEAD 0 VARIABLE BLK# 0 VARIABLE ADRS : GET ADRS @ BLK# @ ; : RD GET DUP 718 = IF LEAVE THEN 1 R/W ; : WRT GET DUP 718 = IF LEAVE THEN 0 R/W ; : SETUP BLK# ! BUFHEAD ADRS ! ; : +BLK 1 BLK# +! 128 ADRS +! ; : RDIN SETUP 180 0 DO RD +BLK LOOP ; : WRTO SETUP 180 0 DO WRT +BLK LOOP ; : %COPY 0 DO I 180 * DUP DUP RDIN ." DEST,KEY " KEY DROP WRTO 180 + . ." SOURCE,KEY " KEY DROP LOOP ; : DISCPY 4 %COPY ." DONE " ; ;S ( FORTH INC.'S EDITOR ) ( This editor was written by S.H. Daniel, in FORTH DIMENSIONS, ( Volume III, number 3. ( The only change was to make the cursor a "block" for higher ( visibility. P. Mullarky 9/29/81 --> ( FORTH INC.'S EDITOR ) BASE @ FORTH DEFINITIONS HEX : TEXT HERE C/L 1+ BLANKS WORD HERE PAD C/L 1+ CMOVE ; : LINE DUP FFF0 AND 17 ?ERROR SCR @ (LINE) DROP ; VOCABULARY EDITOR IMMEDIATE : WHERE DUP B/SCR / DUP SCR ! ." SCR # " DECIMAL . SWAP C/L /MOD C/L * ROT BLOCK + CR C/L TYPE [COMPILE] EDITOR QUIT ; EDITOR DEFINITIONS : #LOCATE R# @ C/L /MOD ; : #LEAD #LOCATE LINE SWAP ; : #LAG #LEAD DUP >R + C/L R> - ; : -MOVE LINE C/L CMOVE UPDATE ; : BUF-MOVE PAD 1+ C@ IF PAD SWAP C/L 1+ CMOVE ELSE DROP THEN ; : >LINE# #LOCATE SWAP DROP ; --> ( FORTH INC.'S EDITOR ) : FIND-BUF PAD 50 + ; : INSERT-BUF FIND-BUF 50 + ; : (HOLD) LINE INSERT-BUF 1+ C/L DUP INSERT-BUF C! CMOVE ; : (KILL) LINE C/L BLANKS UPDATE ; : (SPREAD) >LINE# DUP 1 - E DO I LINE I 1+ -MOVE -1 +LOOP (KILL) ; : X >LINE# DUP (HOLD) F DUP ROT DO I 1+ LINE I -MOVE LOOP (KILL) ; : DISPLAY-CURSOR CR SPACE #LEAD TYPE A0 EMIT #LAG TYPE #LOCATE . DROP ; : T C/L * R# ! 0 DISPLAY-CURSOR ; : L SCR @ LIST ; : N 1 SCR +! ; : B -1 SCR +! ; --> ( FORTH INC.'S EDITOR ) : (TOP) 0 R# ! ; : SEEK-ERROR (TOP) FIND-BUF HERE C/L 1+ CMOVE HERE COUNT TYPE ." None" QUIT ; : (R) >LINE# INSERT-BUF 1+ SWAP -MOVE ; : P 5E TEXT INSERT-BUF BUF-MOVE (R) ; : WIPE 10 0 DO I (KILL) LOOP ; : COPY B/SCR * OFFSET @ + SWAP B/SCR * B/SCR OVER + SWAP DO DUP FORTH I BLOCK 2 - ! 1+ UPDATE LOOP DROP FLUSH ; : 1LINE #LAG FIND-BUF COUNT MATCH R# +! ; : (SEEK) BEGIN 3FF R# @ < IF SEEK-ERROR THEN 1LINE UNTIL ; : (DELETE) >R #LAG + R - #LAG R MINUS R# +! #LEAD + SWAP CMOVE R> BLANKS UPDATE ; : (F) 5E TEXT FIND-BUF BUF-MOVE (SEEK) ; : F (F) DISPLAY-CURSOR ; --> ( FORTH INC.'S EDITOR ) : (E) FIND-BUF C@ (DELETE) ; : E (E) DISPLAY-CURSOR ; : D (F) E ; : TILL #LEAD + 5E TEXT FIND-BUF BUF-MOVE 1LINE 0= IF SEEK-ERROR THEN #LEAD + SWAP - (DELETE) DISPLAY-CURSOR ; 0 VARIABLE COUNTER : BUMP 1 COUNTER 1+ COUNTER @ 38 > IF 0 COUNTER ! CR CR F MESSAGE C EMIT THEN ; : S C EMIT 5E TEXT 0 COUNTER ! FIND-BUF BUF-MOVE SCR @ DUP >R DO I SCR ! (TOP) BEGIN 1LINE IF DISPLAY-CURSOR SCR ? BUMP THEN 3FF R# @ < UNTIL LOOP R> SCR ! ; : I 5E TEXT INSERT-BUF BUF-MOVE INSERT-BUF COUNT #LAG ROT OVER MIN >R R R# +! R - >R DUP HERE R CMOVE HERE #LEAD + R> CMOVE R> CMOVE UPDATE DISPLAY-CURSOR ; --> ( FORTH INC.'S EDITOR ) : U C/L R# +! (SPREAD) P ; : R (E) I ; : M SCR @ >R R# @ >R >LINE# (HOLD) SWAP SCR ! 1+ C/L * R# (SPREAD) (R) R> C/L + R# R> SCR ! ; DECIMAL LATEST 12 +ORIGIN ! HERE 28 +ORIGIN ! HERE 30 +ORIGIN ! ' EDITOR 6 + 32 +ORIGIN ! HERE FENCE ! FORTH DEFINITIONS BASE ! FORTH ;S ( RAGSDALE ASSEMBLER ) ( This assembler was published in Dr. Dobbs Journal V.6 N.9 ( Sept. '81 ) ( ... and is the assembler used in the fig "Installation Guide." --> ( RAGSDALE ASSEMBLER ) VOCABULARY ASSEMBLER IMMEDIATE ASSEMBLER DEFINITIONS BASE @ HEX ' EXECUTE NFA 11 - CONSTANT SETUP 0 VARIABLE INDEX -2 ALLOT 0909 , 1505 , 0115 , 8011 , 8009 , 1D0D , 8019 , 8080 , 0080 , 1404 , 8014 , 8080 , 8080 , 1C0C , 801C , 2C80 , 2 VARIABLE MODE : .A 0 MODE ! ; : # 1 MODE ! ; : MEM 2 MODE ! ; : ,X 3 MODE ! ; : ,Y 4 MODE ! ; : X) 5 MODE ! ; : )Y 6 MODE ! ; : ) F MODE ! ; : BOT ,X 0 ; : SEC ,X 2 ; : RP) ,X 101 ; : UPMODE IF MODE @ 8 AND 0= IF 8 MODE +! THEN THEN 1 MODE @ F AND -DUP IF 0 DO DUP + LOOP THEN OVER 1+ @ AND 0= ; : CPU C@ C, MEM ; 00 CPU BRK, 18 CPU CLC, D8 CPU CLD, 58 CPU CLI, B8 CPU CLV, CA CPU DEX, 88 CPU DEY, E8 CPU INX, C8 CPU INY, EA CPU NOP, 48 CPU PHA, 08 CPU PHP, 68 CPU PLA, 28 CPU PLP, 40 CPU RTI, 60 CPU RTS, 38 CPU SEC, F8 CPU SED, 78 CPU SEI, AA CPU TAX, --> ( RAGSDALE ASSEMBLER ) A8 CPU TAY, BA CPU TSX, 8A CPU TXA, 9A CPU TXS, 98 CPU TYA, : MCP DUP 1+ @ 80 AND IF 10 MODE +! THEN OVER FF00 AND UPMODE UPMODE IF MEM CR LATEST ID. 3 ERROR THEN C@ MODE C@ INDEX + C@ + C, MODE C@ 7 AND IF MODE C@ F AND 7 < IF C, ELSE , THEN THEN MEM ; 1C6E 60 MCP ADC, 1C6E 20 MCP AND, 1C6E C0 MCP CMP, 1C6E 40 MCP EOR, 1C6E A0 MCP LDA, 1C6E 00 MCP ORA, 1C6E E0 MCP SBC, 1C6C 80 MCP STA, 0D0D 01 MCP ASL, 0C0C C1 MCP DEC, 0C0C E1 MCP INC, 0D0D 41 MCP LSR, 0D0D 21 MCP ROL, 0D0D 61 MCP ROR, 0414 81 MCP STX, 0486 E0 MCP CPX, 0486 C0 MCP CPY, 1496 A2 MCP LDX, 0C8E A0 MCP LDY, 048C 80 MCP STY, 0480 14 MCP JSR, 8480 40 MCP JMP, 0484 20 MCP BIT, : BEGIN, HERE 1 ; IMMEDIATE : UNTIL, ?EXEC >R 1 ?PAIRS R> C, HERE 1+ - C, ; IMMEDIATE --> ( RAGSDALE ASSEMBLER ) : IF, C, HERE 0 C, 2 ; IMMEDIATE : THEN, ?EXEC 2 ?PAIRS HERE OVER C@ IF SWAP ! ELSE OVER 1+ - SWAP C! THEN ; IMMEDIATE : ELSE, 2 ?PAIRS HERE 1+ 1 JMP, SWAP HERE OVER 1+ - SWAP C! 2 ; IMMEDIATE : NOT 20 + ; 90 CONSTANT CS D0 CONSTANT 0= 10 CONSTANT 0< 90 CONSTANT >= : END-CODE CURRENT @ CONTEXT ! ?EXEC ?CSP SMUDGE ; IMMEDIATE FORTH DEFINITIONS DECIMAL : CODE ?EXEC CREATE [COMPILE] ASSEMBLER ASSEMBLER MEM !CSP ; IMMEDIATE ' ASSEMBLER CFA ' ;CODE 8 + ! LATEST 12 +ORIGIN ! HERE 28 +ORIGIN ! HERE 30 +ORIGIN ! HERE FENCE ! ' ASSEMBLER 6 + 32 +ORIGIN ! BASE ! FORTH ;S ( ATARI CONSTANTS ) ( P-M GRAPHICS WRITE REGISTERS ) D000 EQU P0XPOS D001 EQU P1XPOS D002 EQU P2XPOS D003 EQU P3XPOS D004 EQU M0XPOS D005 EQU M1XPOS D006 EQU M2XPOS D007 EQU M3XPOS D008 EQU P0SIZE D009 EQU P1SIZE D00A EQU P2SIZE D00B EQU P3SIZE 02C0 EQU P0COLR 02C1 EQU P1COLR 02C2 EQU P2COLR 02C3 EQU P3COLR D00C EQU MSIZE D10E EQU HITCLR ( P-M GRAPHICS READ REGISTERS ) D000 EQU M0PF D001 EQU M1PF D002 EQU M2PF D003 EQU M3PF D004 EQU P0PF D005 EQU P1PF D006 EQU P2PF D007 EQU P3PF --> ( ATARI CONSTANTS ) D008 EQU M0PL D009 EQU M1PL D00A EQU M2PL D00B EQU M3PL D00C EQU P0PL D00D EQU P1PL D00E EQU P2PL D00F EQU P3PL ( FRONT PORT REGISTERS ) D300 EQU PORTA D301 EQU PORTB D302 EQU PACTL D303 EQU PBCTL D010 EQU FIRE0 D011 EQU FIRE1 D012 EQU FIRE2 D013 EQU FIRE3 D40C EQU PENH D40D EQU PENV ( SOUND REGISTERS ) D200 EQU AUDF0 D201 EQU AUDC0 D202 EQU AUDF1 D203 EQU AUDC1 D204 EQU AUDF2 D205 EQU AUDC2 D206 EQU AUDF3 D207 EQU AUDC3 ;S ( UTILITIES BOOT, MEMO-PAD ) ( Lloyd Ollman Sep 81 ) HEX CODE BOOT E477 JMP, ( COLD START ) CODE MEMO-PAD E471 JMP, FORTH ;S