@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&0") $G% }H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 })8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}}D = |||DDOS DOSDOS SYS }}} }y}:\MM}CDOS SYS} 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI   0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DELV䌚 !B y`Lʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -'}LLu DEHILV 9 .l 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*}1i1232435ޥ<<8} 3E:}DISK OPERATING SYSTEM II VERSION 2.0SCOPYRIGHT 1980 ATARIA. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGE J. D,}UPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESSF. LOCK F-}ILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES9!&x#!7&p))'&X*./)L''-؆莟.}R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ 1 1i/}il ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~ 1 0 00}JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! 1L NOT A DISK FILE1}N !B 1L " 1 !BDED:}:1BJ|DE 1DEBH2}I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L 3} BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED PREPARE BAS 019 COPYING---D2:PREP4}ARE.BAS# 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B5} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#6}PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%7} 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C}//3Hu ξL/L DRIVE TO WRITE DOS FILES TO?WRITING NEW DOS FILESTYPE "Y" TO WRITE DOS TO DRIVE 2.?}D2:DOS.SYSERROR - NOT VERSION 2 FORMAT. , &* բ( 1L `[) 0NΞ 0 L1M) 1@} L BAD LOAD FILELOAD FROM WHAT FILE?) 0 0#B 1L WHAT FILE TO LOCK?) 0 0$B 1L WHAT FILE TO UNLOCK?DUA}P DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO USE PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV. h  ,B}  `)  <0 2 2 0  ,   ,,ޢ* 1L ,K* 1 ~0 0C}FINSERT BOTH DISKS, TYPE RETURNERROR - DRIVES INCOMPATIBLE., 1 ~038  , 1L D}, &*  Lz+, 0 , 1 ~0 + Y,0!,0 ,L+ ,mm  v,"ǭE}0Ξ, 05,Lt+L +,Hh` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNF}INSERT DESTINATION DISK,TYPE RETURN`    `L,8,0( rG}L1(`ߢ) 1* 1 ~0Y`hhL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLtH}% A., 1 <0 0 .@L# .BJ 1  DEHIB V L1 ,5 1 <0,L. I} JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 , 1 <0,0Lf- B VJ},A#P, 1 <0 0L#L ߢ) 1* 1 ~0Yj383}mm ݭK}}`8}``|* ? ɛ,`|:(|/ 1L `DESTINATION CANT L}BE DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξM}hAΞB,0 J 1 BޝDEHI,HDE 1HIHIDELSAVE-N}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L O}0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥP}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{Q}NAME TOO LONG B VL ` L1I H1EӝDL1|mDiE` V0`8d/8 i:"2!22 1R} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALIDS} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4euT} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4eu,   9 :L   <  ,; M,`hإˍ͍̍΍DEHIV};"'` B VR'SBƝDE JK VLS: m m m m m m m ,W}  mL1ɛAK mL8A Y,Z- m LH##$&()K++?,E,X}9" B#HI "D"E V'P B V'H mhLt(`INPUT/OUTPUT ERROY}RITEM MUST BE A-JBAD VARIABLE NAMENOT USED IN PROGRAMTYPES DO NOT MATCHNUMBER OUT OF RANGELINE TOO LONGBAD NUMBERCAN'Z}T RENUMBERNOT ENOUGH MEMORYINPUT BY ITSELF IN LINE CAN'T OPEN FILECHANGE NAME--OLD VARIABLE NAME?NEW NAME (MUST BE SAME T[}YPE)?DELETE--START, END LINES?}EXTENDED ATARI BASIC VERSION 1.1 COPYRIGHT 1982 THOMAS NEWTONA. LIST VARIABLES F. RENUM\}BERB. VARIABLE VALUES G. CHECK PROGRAMC. CHANGE NAME H. NEW OUTPUT FILED. CROSS REFERENCE I. RETURN TO BASICE. DELET]}E LINES J. GO TO DOS MENUSELECT ITEM OR FOR MENURENUMBER--NEW STARTING LINE, SPACING?EXPRESSION FOUND IN LINE^} LINE #, FOUND IN LINE DOES NOT EXISTSYNTAX ERROR IN LINE VARIABLE NAME TABLEVARIABLE VALUESVARIABLE CROSS-REFERENCE_} TABLE = ...)(...)SECOND LINE # MUST BE LARGER,NEW OUTPUT FILE ( FOR SCREEN)?NAME ALREADY EXISTSSPACING CA`}N'T BE ZERO VARIABLES USEDBAD LINE NUMBER IN LINE #6JXcra} E e !C!\!b!r!!!!!!!!!!!!""7"K"a"q"  A %&&&!&!%H!! mh`Z##b}# m [#`˥̩##0)%) =#ȊH he˅ː̠ =##ҩ =##ԩ s$+ m`### m [#`#ͩc}&&&eͥeΠii ة" m v$`@$ m`A>8ȱ s$ȱ, =#8ȱ sd}$) =#`ɀ% m`( =#ͅȱͅ s$) =#` إ""0)Ȍ0# m` m M%&I% % m` m M%&J%e}HH %hh˰) m`J%I%ɰI%ɰ m`8名K%呍L%K%m&K%L%K%K%L%L%8K%&K%L%L% m` f}& &`( ,  m8`1ɛA$[ 1[($0:A  m8`ȹ1ɛ0 0`&&ͥΠ&0Pg}L&͆˦Ά̱0&i͐L%&&1&`i͐&L%8` )&8&օ`8&&&˅h}̅ά&͇ͥ͠&͆&i͐LA&8&֋8&`ͥΠͬ&ͥ8ͰL& mi}&m&1&`T1''2'#'# m' [#`ͥΠ͍P'ȱ͍Q'04ȱ͍R'N'N'͍O'ȌS' O'j}N'R'mR'͐L '` 'q)ͮ#' '# mL'P'' Q''`'' # m'P'ԭQ' s$ =#0#0#k}'#'P''Q''`(O'`8`Ȯ(S'`qͨȩ` m ()) ))& m`˥l}ˍP'ȱˍQ'ȱˍR')Q'mR'ːL1()P'Q') P') R'& )&L1(`( ,  m8`1ɛ1 m}ذ ذ ԍ)Ս) m8` m8`1 ,L( ذ ذӥԍ)Ս)0` m (1ɛ` ))))n}) )* m`˥̭)ͭ)Π0&m)ͥm)0ȱe˅ːLJ) m`ɍ1')2'* '˥̭)ͭ)Π0(Αˈ͑o}m)ͥm)q˅ːL)` '*1 - ) % !# '` ' '*`E62H mP'p}I+ԭQ'J+,*0 *" s$"h m`, *L*(** '**Сm*i ذ * вPԍI+q}ՍJ+ *& mI+ԭJ+թ" s$' * mL*,*0 *eͅi ج**L*`˥̭)ԭ)ՠJ+`r}I+``m)ԥm)ՠe˅ːL+*ɍ1')2' 'k1'+2' '`+ '7 ` '  +L|++)` s}*`P B V'( m( ,  m`1>,ɛiEeC#ҩ(ҩҍҩ ҢPB1DEJK V m`t}>,C<өҍҍҍҩP '`hh M,`hh M,l9P B V'"˭̭ͭέDEHEu};H(`HIB1DE VHH'1ɛ )a{)ߝ1hh(`i BMHIDE V`}*** v}EXTENDED ATARI BASIC *** Version 1.1*** Copyright 1982 Thomas Newtoniw}XKXP?@     Y` x} Y0 l `X:L   <  ,; M,`hإˍ͍̍΍DEHI ASTARADENFLAADDBYT z} d##*****************************n##** EXTENDED ATARI BASIC **x##** Version 1.1 **## {}** **##** Program: PREPARE.BAS **##** Thomas Newton, 7/1982 **##******************* |}**********;@,2 +2  EXTENDED ATARI BASIC VERSION 1.1$$ Copyright 1982 Thomas Newton }}- - "This program removes the code that)) !checks for the ATARI 850 from any AUTORUN.SYS file., , !Inse ~}rt your diskette in drive one-- %and press any key to remove the ATARI  850 code.AdAU" F:Ad },"AUA,AdAU6   Working... @JRename AUTORUN.SYS fileTN6@6@ } D:AUTORUN.SYSNunlock file if locked^BB@2@D:AUTORUN.SYS,AUTORUN.TMPh }r""Copy program to AUTORUN.SYS,|""except for ATARI 850 program..@@ D:AUTORUN.TMP..@ }@ D:AUTORUN.SYS A@ End-of-file trapS)@*@*)@7*@SC }opy header bytes to fileBlock copy loop-)@)@-6-AV$%"BU5AP-) }@)@-6-AV$%##Check for ATARI 850 INIT addr!!A8)A9A@U)@ })@=+AV$%,"BC6A@USkip 850 INIT address*@*@**@7*@ }D*@Q*@[ A@Regular INIT--copy all bytes to outputCheck START and ADEND&16-@ }%"BC6*"BD16-0N*@!*@.*@;*@Nwrite block addr:D }Loop for all bytesN -X!)@!*@b l A@vError trap--EOF%6-F:A },%get error numberq@@L@3@ D:AUTORUN.TMPqClose files and delete }old programKA6K  Disk ERROR  in line F:A,%AV$F:A,"A6 Through. D:P }REPARE.BAS ASTARADENFLAADDBYT `**PRALH dBASIC/XA v}ersion 1.1nx2&;A@r,;A ,;@,26-@ A@ AP5 +2  EXTENDED ATARI BAS}IC VERSION 1.15$$$ Copyright 1982 Thomas Newton3  3 %This program relocates EXTENDED ATARI BASIC for you}r system.. . #Please hold on while I get ready...kk67@<@,.P   9 :L   <  },; M,`hإkk67@<A`,.Pˍ͍̍΍DEHI;'}` B VR'Skk67Aa<A@,.PBƝDE JK VLS: m m m m m m m}kk67AA<A ,.P ,  mL1AK mL8A Y,Z- m Lkk67A!<}A,.PH##$&()K++?,E,9 B#Hkk67A<A,.PI }DE V'P B V'H mhLt(`INPkk67A<A`,.PUT/OUTPUT ERRORITEM MUST }BE A-JBAD VARIABLE NAMENOT USED IN PROGRAMTYPES DO kk67Aa<A@,.PNOT MATCHNUMBER OUT OF RANGELINE TOO LONG}BAD NUMBERCAN'T RENUMBERNOT ENOUGHkk67AA<A ,.P MEMORYINPUT BY ITSELF IN LINE CAN'T OPEN FILECHANGE NAME--O}LD VARIABLE NAME?kk67A!<A,.PNEW NAME (MUST BE SAME TYPE)?DELETE--START, END LINES?}EXTENDED ATARI BASIC VE}"kk67A<A,.PRSION 1.1 COPYRIGHT 1982 THOMAS NEWTONA. LIST VARIABLES F. RENUMBERB. VARI,kk67A<A} `,.PABLE VALUES G. CHECK PROGRAMC. CHANGE NAME H. NEW OUTPUT FILED. CROSS REF6kk67A a<A@,.PERENCE I}. RETURN TO BASICE. DELETE LINES J. GO TO DOS MENUSELECT ITEM OR@kk67AA<A ,.P FOR MENURENUMBER--}NEW STARTING LINE, SPACING?EXPRESSION FOUND IN LINE Jkk67A!<A,.PLINE #, FOUND IN LINE DOES NOT EXISTSYNTAX }ERROR IN LINE VARIABLE NAME TABLETkk67A<A,.PVARIABLE VALUESVARIABLE CROSS-REFERENCE TABLE = .}..)(...)SECOND LI^kk67A<A`,.PNE # MUST BE LARGER,NEW OUTPUT FILE ( FOR SCREEN)?NAME ALREADY EXISTSS}hkk67Aa<A@,.PPACING CAN'T BE ZERO VARIABLES USEDBAD LINE NUMBER IN LINE rkk67AA<A} ,.P#6JXcr E e !C!\!b!r!|kk67A!<A,.P!!!!!}!!!!!!7Kaq  A %&&&!&!%kk67A<A,.PH!! mh`Z### m }[#`˥̩##0)%) =#ȊH he˅ː̠kk67A<A`,.P =##ҩ =##ԩ s$+ m`###} m [#`#ͩ&&&ekk67Aa<A@,.PͥeΠii ة m v$`@$ m`A>8} s$kk67AA<A ,.Pȱ, =#8ȱ s$) =#`ɀ% m`( =#ͅȱͅ s$) =#` إ}kk67A!<A ,.P0)Ȍ0# m` m M%&I% % m` m M%&J%HHkk67A <A },.P %hh˰) m`J%I%ɰI%ɰ m`8名K%呍L%K%m&K%L%K%kk67A <A!`,.PK%L%L%}8K%&K%L%L% m` & &`( ,  m8`1A$[kk67A!a<A"@,.P 1[($0:A}  m8`ȹ10 0`&&ͥΠ&kk67A"A<A# ,.P0PL&͆˦Ά̱0&i͐L%&&}1&`i͐&Lkk67A#!<A$,.P%8` )&8&օ`8&&&˅ͥ̅ά&ͥ͠}&͆&ikk67A$<A$,.P͐LA&8&֋8&`ͥΠͬ&ͥ8}kk67A$<A%`,.PL& m&m&1&`T1''2'#'# mkk67A%a<A&@},.P' [#`ͥΠ͍P'ȱ͍Q'04ȱ͍R'N'N'͍O'ȌS' O'N'R'mR'͐L kk67A&A<A' ,.P'` '}q)ͮ#' '# mL'P'' Q''`'' # m'P'kk67A'!<A(,.PԭQ' s$ =#0#0#'}#'P''Q''`(O'`8`Ȯ(S'kk67A(<A(,.P`qͨȩ` m ()) )})& m`˥̠ˍP'ȱˍ&kk67A(<A)`,.PQ'ȱˍR')Q'mR'ːL1()P'Q') P') R'}& )&L1(`( 0kk67A)a<A0@,.P,  m8`11 ذ ذ ԍ)Ս) m8` m8`1 :k}k67A0A<A1 ,.P,L( ذ ذӥԍ)Ս)0` m (1` ))))Dkk67A1!<A2},.P) )* m`˥̭)ͭ)Π0&m)ͥm)0ȱe˅ːLJ) m`ɍ1'Nkk67A2<A2,.P)2'* '}˥̭)ͭ)Π0(Αˈ͑m)ͥm)q˅ːL)` 'Xkk67A2<A3`,.P*1 - ) % !# } '` ' '*`E62bkk67A3a<A4@,.PH mP'I+ԭQ'J+,*0 * s$h m`}, *L*(** '**lkk67A4A<A5 ,.PСm*i ذ * вPԍI+ՍJ+ *& m}I+ԭJ+թvkk67A5!<A6,.P s$' * mL*,*0 *eͅi ج**L*`˥̭)kk}67A6<A6,.P)ՠJ+`I+``m)ԥm)ՠe˅ːL+*ɍ1')2' kk67A6<A7`},.P'k1'+2' '`+ '7 ` '  +L|++)` *`P B Vkk67A7a<A8@,.P'( m}( ,  m`1>,iEeC#ҩ(ҩҍҩ ҢPB1kk67A8A<A9 ,.PDEJK V m`>,}C<өҍҍҍҩP '`hh M,`hh M,l9kk67A9!<A@,.PP B V'˭̭ͭέ}DEHE;cc67A@<A@r,.HH(`HIB1DE VHH'1 )a{)ߝ1h}h(`#-@"67<,.>:@4, -@S"67<,.>:AU,  1}31,386,409,415,1546,1548 1550,1552,1554,1556,1793*1923,1928,3395,3403,35234 3946> (155)H263,354,496,51}3,531,551R570,590,604,615,630,648\688,720,750,776,811,840f841,873,910,1024,1025p1026,1057,1095,1157,1158}z1180,1200,1201,1202,12181219,1220,1251,1252,12571300,1302,1339,1359,13811397,1683,1693,2152,2207}2979,3095,3099,3798,4047kk67@<@,.P 16=@CHNSX]ciouz}}!kk67@<A`,.P$)/Y[]_acegikoruy|kk67Aa}<A@,.P##### # ##?#D#K#P#U#kk67AA<A ,.PX#f}#j#v#############$ $#$5$H$M$W$]$k$p$}$$$$$$$$$$$$$$kk67A!<A,.P$$$$$$$% % %}%%%%%$%*%-%0%3%8%?%C%F%P%[%`%q%%%%%%%%%%%%%kk67A<A,.P%% & &&&-&0&7&B&M&T&d&l&|&&&&&}&&&&&&&&&''''%'*'.'4'7':'B'K'kk67A<A`,.PU'`'e'l'q't'w'z'''''''''''''''''''''}'''( (((((&(6(<(kk67Aa<A@,.PB(E(H(R([(^(a(h(k(r(u(|((((((((((((((() ))) )%)()+).)5)A)F})T)[)kk67AA<A ,.Pn)s)y)~))))))))))))** *#*&*+*.*3*8*=*@*E*I*Q*T*W*Z*]*`*c*j*|****kk67A!}<A,.P**************+ ++!+.+5+G+N+S+X+[+`+e+h+n+q+}++++++++++kk67A<A,.P++},,6,;,B,H,K,Z,_,d,g,l,q,v,{,,,,,,,,,,,#',I#N###&9967A<A ,.&&&((w)|)Q+V+^+c+}+,,,$-ADA@.67<,.>:@4,8 B##67Ac<Ac,.>:@4,L##67A<A},.>:AU,V##67AE<AE,.>:AU,` A j6-At tA . #Do you want to relocate the programA}  (type Y or N)~4N)4nA30Y*0y) Please type Y or N.3 A@ ApH ) Wher}e should the program startH (give address in decimal)4 P:,* Please use whole numbers!4 A/ }Ag% That's too low!!!/ A0!B `& That's too high!!!0 A/ / $Hold on while I relocate the} program-AS@I;6-@:7<,,%AV$@:7%@<%@,,&AtI6-%@##6-@:7<,,%}AV$@:7<,,6-&At %67<,.>:P:'AV,, &&67<,.>:&AV$P:'AV,, -AU}A @(;;6-@:7<,,%AV$@:7%@<%@,,&At2KK6-@:7%@<%@,,%AV$@:7%@}<%@,,&At<##6-@:7<,,%AV$@:7<,,F6-&At %P67<,.>:P:'AV,,Z&&67<,.>:&A}V$P:'AV,,d n Ax> +  Do you have an 80 column printer>  (type Y or N)B!0Y*0y*0}N*0n8 Please type Y or NB A14Y)4y167A9<A9,.>:@,14N)4n167A9<A9},.>:@, A@/ / $Do you want the program to check for,, $an ATARI 850 interface included with** }"EXTENDED ATARI BASIC (Type Y or N)C!0Y*0y*0N*0n9 Please type Y or N.C AP B A@}$$ Copyright 1982 Thomas Newton    Program loads at: $$ Program ends at : %A@q00 Colum}ns per line: @:7A9<A9,,   "-- %Place a system diskette (one that has,-- %a copy of DOS) in drive one }and press6-- % to write the AUTORUN.SYS file.@++ #Press any other key to quit withoutJ%% writing the AUTORUN.}SYS file.TAdAU^&6-F:Ad,&"AUA0hAdAU r@ Bye.| }A6-%A@q((@ D:AUTORUN.SYS*AU*AU26-P:'AV,$6-&AV}$+*2*26-P:'AV,$6-&AV$+*2* @ --INITK*A&*@}**A'7*@Kload at $2E2-$2E326-P:'AV,$6-&AV$+*2*22 i B}MHIDE V`e& }*** EXTENDED ATARI BASIC = *** Version 1.1e( *** Copyright 1982 Thomas Newton}; i'-A7 @; --RS-2324N)4nA bb VXKXP?}@     Y`  Y0 l `X&+ +  Your disk now contains a copy of0))} !EXTENDED ATARI BASIC. To use the:,, $program, place the disk in drive oneD%% when you turn your system on.NX}7  7 There was an ERROR F:A,when theb,, $program tried to use the disk drive. D:CUSTOM.BASIC/XA vv1000 .TITLE "BASIC/XA REVISION 1.1 (C) 1982 Thomas D. Newton"1005 .PAGE "Operating System and BASIC equates"1010 ;1015 ;}BASIC/XA revision 1.11020 ;1025 ;1030 ;(c) 1982 by Thomas D. Newton1035 ;1040 ;This program provides the ATARI1045 ;BAS}IC user with an easy method1050 ;to list variable names and1055 ;values, change names, cross-1060 ;reference variables, de}lete1065 ;multiple lines, and renumber1070 ;the BASIC program in memory.1075 ;1080 ;1085 ;Operating System equates1090 };1095 CIOV = $E4561100 ICCMD = $03421105 ICBAL = $03441110 ICBAH = $03451115 ICBLL = $03481120 ICBLH = $03491125 ICAX}1 = $034A1130 ICAX2 = $034B1135 OPEN = $031140 CLOSE = $0C1145 GETREC= $051150 PUT = $0B1155 FR0 = $00D41160 FLPT}R = $00FC1165 INBUFF= $00F31170 CIX = $00F21175 LBUFF = $05801180 AFP = $D8001185 FASC = $D8E61190 IFP = $D9AA1}195 FPI = $D9D21200 FLD0P = $DD8D1205 FST0P = $DDAB1210 DOSVEC= $000A1215 DOSINI= $000C1220 APPMHI= $000E1225 HIMEM =} $02E51230 MEMLO = $02E71235 LMARG = $521240 RMARG = $531245 ;1250 ;BASIC equates1255 ;1260 LOMEM = $801265 VNTP = $}821270 VNTD = $841275 VVTP = $861280 STMTAB= $881285 STMCUR= $8A1290 STARP = $8C1295 RUNSTK= $8E1300 MEMTOP= $90130}5 ;1310 ;Program equates1315 ;1320 PTR = $CB1325 PTR2 = $CD1330 R = 155 ;End-of-line1335 ;1340 ;*** END OF EQ}UATES ***1345 ;1350 *= $1CFC ;Start of prog.1355 .PAGE "Initialization routines"1360 ;***************************}***1365 ;** INIT **1370 ;******************************1375 ;1380 LOAD1385 LDA DOSINI ;Save old} DOSINI1390 STA OLDINI1395 LDA DOSINI+11400 STA OLDINI+11405 ;1410 LDA DOSVEC ;Save old DOSVEC1415 STA OLDDOS}1420 LDA DOSVEC+11425 STA OLDDOS+11430 JMP INIT21435 ;1440 ;Entry point for SYSTEM RESET1445 ;1450 INIT1455 OLDINI }= *+11460 JSR *-* ;Call old DOSINI1465 ;1470 INIT21475 LDA #INIT&$FF ;Reset DOSINI1480 STA DOSINI1485 LDA #}INIT/2561490 STA DOSINI+11495 ;1500 LDA #NEWDOS&$FF ;Reset DOSVEC1505 STA DOSVEC1510 LDA #NEWDOS/2561515 STA DOSVE}C+11520 ;1525 LDA #END&$FF ;Reserve memory1530 STA MEMLO ; for program1535 LDA #END/2561540 STA MEMLO+11545} ;1550 LDA INUSE ;If computer was1555 BEQ INITR ; in utility,1560 JSR RESTORE ; call RESTORE1565 ;1570} INITR1575 RTS1580 ;1585 OLDDOS .WORD $001590 INUSE .BYTE $001595 .PAGE "New DOS menu code--display utility menu"160}0 ;******************************1605 ;** NEWDOS **1610 ;******************************1615 ;1620 NEWDO}S1625 STA SA ;Save registers1630 STX SX1635 STY SY1640 PHP1645 PLA1650 STA SFLAGS1655 ;1660 CLD1665 ;}1670 LDA PTR ;Save contents1675 STA SPTR ; of pointers1680 LDA PTR+1 ; PTR & PTR21685 STA SPTR+1}1690 LDA PTR21695 STA SPTR21700 LDA PTR2+11705 STA SPTR2+11710 ;1715 LDA ICBAL ;Save Editor1720 STA SADDR } ; buffer addr1725 LDA ICBAH ; and length1730 STA SADDR+11735 LDA ICBLL1740 STA SLEN1745 LDA ICBLL+11750 } STA SLEN+11755 ;1760 LDA #$FF ;Set INUSE flag1765 STA INUSE ; and send #s1770 STA NUMIOCB ; to file I}OCB1775 ;1780 LDA #0 ;Print to screen1785 STA IOCB1790 ;1795 LDA #4 ;Set 4 columns/1800 STA XMAX } ; print line1805 ;1810 ;1815 ;Do a GRAPHICS 01820 ;1825 LDX #$60 ;Close screen1830 LDA #CLOSE1835 STA IC}CMD,X1840 JSR CIOV1845 ;1850 LDA #2 ;Reset margins1855 STA LMARG ; to 2 and 391860 LDA #391865 STA R}MARG1870 ;1875 LDA #OPEN ;Reopen screen1880 STA ICCMD,X1885 LDA #SC&$FF ;Tell CIO where1890 STA ICBAL,X ;} name of the1895 LDA #SC/256 ; screen starts1900 STA ICBAH,X1905 LDA #121910 STA ICAX1,X1915 LDA #01920 STA }ICAX2,X1925 JSR CIOV1930 JMP MENU ;Display menu1935 ;1940 SA .BYTE $001945 SX .BYTE $001950 SY .BYTE $001955 S}FLAGS .BYTE $001960 SPTR .WORD $001965 SPTR2 .WORD $001970 SADDR .WORD $001975 SLEN .WORD $001980 SC .BYTE 'S,':1985 } .PAGE "Main menu--display choices and get selection"1990 ;*****************************1995 ;** MAIN MENU **}2000 ;*****************************2005 ;2010 MENU2015 LDA #15 ;Print title2020 JSR PRINT2025 LDA #16 };First line2030 JSR PRINT2035 LDA #17 ;Second line2040 JSR PRINT2045 LDA #18 ;Third line2050 JSR PRIN}T2055 LDA #19 ;Fourth line2060 JSR PRINT2065 LDA #20 ;Last line2070 JSR PRINT2075 ;2080 ;Ask which it}em the user wants2085 ;2090 SELECT2095 LDA #21 ;SELECT ITEM2100 JSR PRINT2105 ;2110 ;Get user response2115 ;}2120 LDA #22125 JSR INPUT2130 BPL RESPONSE2135 ;2140 ;Error happened--which one??2145 ;2150 CPY #$89 ;Loop fo }r BREAK2155 BNE SELECT ; or EOF keys2160 ;2165 ;If not BREAK, must be truncated2170 ;2175 LDA #6 ;Print L }INE TOO2180 JSR PRINT ; LONG message2185 JMP SELECT2190 ;2195 ;Got user response--check it2200 ;2205 RESPONSE2 }210 LDA BUF ;Display menu2215 CMP #155 ; on Λ2220 BEQ MENU2225 CMP #'A ;Error if choice2230 } BCC ERROR ; is below "A"2235 CMP #'K ;Error if choice2240 BCC OK ; is above "J"2245 ;2250 ;User } picked an item not on menu2255 ;2260 ERROR2265 LDA #12270 JSR PRINT2275 JMP SELECT2280 ;2285 ;Turn selection into }index2290 ;2295 OK2300 SEC2305 SBC #'A2310 ASL A2315 TAX2320 ;2325 LDA SUBS,X ;Set up call to2330 STA CALL} ; selection2335 LDA SUBS+1,X2340 STA CALL+12345 ;2350 LDA #27 ;Print blank2355 JSR PRINT ; line}2360 ;2365 CALL = *+12370 JSR *-*2375 JMP SELECT2380 ;2385 BUF *=*+402390 SUBS .WORD LISTV,VALUE,CHANGE2395 .WORD }XREF,DELLIN,RENUM,CHECK2400 .WORD OUTPUT,BASIC,DOS2405 .PAGE "PRINT routine--prints messages to screen or output file"24}10 ;******************************2415 ;** PRINT **2420 ;******************************2425 ;2430 PRIN}T2435 PHP ;Save flags and2440 STX TEMPX ; index regs.2445 STY TEMPY2450 PLOOP2455 STA TEMPA ;S}ave message #2460 TAY ;Get IOCB index2465 LDA IOCB ; in X register2470 AND PRIOCB,Y2475 TAX2480 L}DA #PUT2485 STA ICCMD,X2490 LDA PRLEN,Y ;Message length2495 STA ICBLL,X2500 LDA #02505 STA ICBLH,X2510 TYA } ;Compute offset2515 ASL A ; to address2520 TAY2525 LDA PRADDR,Y ;Message start2530 STA ICBAL,X25}35 LDA PRADDR+1,Y2540 STA ICBAH,X2545 JSR CIOV ;Print message2550 BPL PRET2555 ;2560 ;Error--close #5 and use }screen2565 ;2570 LDX #$502575 LDA #CLOSE2580 STA ICCMD,X2585 JSR CIOV2590 ;2595 LDA #02600 STA IOCB2605 ;2610} LDA #42615 STA XMAX2620 ;2625 ;2630 ;Now print error message2635 ;2640 LDA TEMPA ;Restore 65022645 LDX TEMPX} ; registers2650 LDY TEMPY ; temporarily2655 PHA ;Save message #2660 LDA #0 ;Print I/O E}RROR2665 JSR PRINT ; message2670 PLA ;Restore message2675 JMP PLOOP ; and print it2680 ;2685 ;}Normal printing--return2690 ;2695 PRET2700 LDA TEMPA ;Old value or 02705 LDX TEMPX ;Restore index2710 LDY T}EMPY ; registers and2715 PLP ; status flags2720 RTS2725 ;2730 ;Data for PRINT2735 ;2740 TEMPA .BYTE} 02745 TEMPX .BYTE 02750 TEMPY .BYTE 02755 IOCB .BYTE 02760 M0 .BYTE "INPUT/OUTPUT ERROR",R2765 M1 .BYTE "ITEM MUST BE }A-J",R2770 M2 .BYTE "BAD VARIABLE NAME",R2775 M3 .BYTE "NOT USED IN PROGRAM",R2780 M4 .BYTE "TYPES DO NOT MATCH",R2785 M5 } .BYTE "NUMBER OUT OF RANGE",R2790 M6 .BYTE "LINE TOO LONG",R2795 M7 .BYTE "BAD NUMBER",R2800 M8 .BYTE "CAN'T RENUMBER",R!}2805 M9 .BYTE "NOT ENOUGH MEMORY",R2810 M10 .BYTE "INPUT BY ITSELF IN LINE "2815 M11 .BYTE "CAN'T OPEN FILE",R2820 M12 .BY"}TE "CHANGE NAME--OLD VARIABLE NAME?",R2825 M13 .BYTE "NEW NAME (MUST BE SAME TYPE)?",R2830 M14 .BYTE "DELETE--START, END LI#}NES?",R2835 M15 .BYTE "}EXTENDED ATARI BASIC VERSION 1.1 ",R2840 .BYTE "COPYRIGHT 1982 THOMAS NEWTON",R,R2845 M16 .BYT$}E "A. LIST VARIABLES F. RENUMBER",R2850 M17 .BYTE "B. VARIABLE VALUES G. CHECK PROGRAM",R2855 M18 .BYTE "C. CHANGE NAME %} H. NEW OUTPUT FILE"2860 M19 .BYTE "D. CROSS REFERENCE I. RETURN TO BASIC"2865 M20 .BYTE "E. DELETE LINES J. GO TO&} DOS MENU",R2870 M21 .BYTE R,R,"SELECT ITEM OR FOR MENU",R2875 M22 .BYTE "RENUMBER--NEW STARTING LINE, SPACING?",R2'}880 M23 .BYTE "EXPRESSION FOUND IN LINE "2885 M24 .BYTE "LINE #"2890 M25 .BYTE ", FOUND IN LINE "2895 M26 .BYTE "DOES NOT (}EXIST",R2900 M27 .BYTE R2905 M28 .BYTE "SYNTAX ERROR IN LINE "2910 M29 .BYTE R,"VARIABLE NAME TABLE",R,R2915 M30 .BYTE R,)}"VARIABLE VALUES",R,R2920 M31 .BYTE R,"VARIABLE CROSS-REFERENCE TABLE",R,R2925 ; #32 reserved for numbers2930 ; #33 reserv*}ed for OUTCHR2935 PCHAR .BYTE 02940 M34 .BYTE " = "2945 M35 .BYTE R," "2950 M36 .BYTE "...)"2955 M37 .BYTE "(...)"2+}960 M38 .BYTE "SECOND LINE # MUST BE LARGER",R2965 M39 .BYTE ",",R2970 M40 .BYTE "NEW OUTPUT FILE ( FOR SCREEN)?",R2,}975 M41 .BYTE "NAME ALREADY EXISTS",R2980 M42 .BYTE "SPACING CAN'T BE ZERO",R2985 M43 .BYTE " VARIABLES USED",R2990 M44 .B-}YTE "BAD LINE NUMBER IN LINE "2995 ;PRIOCB table--0=screen,$FF=file3000 ;3005 PRIOCB3010 .BYTE 0,0,0,0,0,0,0,0,0,03015 .} .BYTE 0,0,0,0,0,0,0,0,0,03020 .BYTE 0,0,0,0,0,0,0,0,03025 .BYTE $FF,$FF,$FF3030 NUMIOCB .BYTE $FF3035 .BYTE $FF,$FF,$/}FF,$FF,$FF3040 .BYTE 0,0,0,0,0,$FF,03045 ;3050 ;PRADDR table--message addresses3055 ;3060 PRADDR3065 .WORD M0,M1,M2,M0}3,M4,M5,M6,M73070 .WORD M8,M9,M10,M11,M12,M133075 .WORD M14,M15,M16,M17,M18,M193080 .WORD M20,M21,M22,M23,M24,M253085 1} .WORD M26,M27,M28,M29,M30,M313090 MNUM .WORD $00 ;numeric printing3095 .WORD PCHAR,M34,M35,M36,M373100 .WORD M38,M39,M42}0,M41,M42,M433105 .WORD M443110 ;3115 ;PRLEN table--length of messages3120 ;3125 PRLEN3130 .BYTE M1-M0,M2-M1,M3-M2,M43}-M33135 .BYTE M5-M4,M6-M5,M7-M6,M8-M73140 .BYTE M9-M8,M10-M9,M11-M103145 .BYTE M12-M11,M13-M12,M14-M133150 .BYTE M15-4}M14,M16-M15,M17-M163155 .BYTE M18-M17,M19-M18,M20-M193160 .BYTE M21-M20,M22-M21,M23-M223165 .BYTE M24-M23,M25-M24,M26-M5}253170 .BYTE M27-M26,M28-M27,M29-M283175 .BYTE M30-M29,M31-M30,PCHAR-M313180 MLEN .BYTE 0,13185 .BYTE M35-M34,M36-M35,6}M37-M363190 .BYTE M38-M37,M39-M38,M40-M393195 .BYTE M41-M40,M42-M41,M43-M423200 .BYTE M44-M43,PRIOCB-M443205 .PAGE "O7}UTCHR--print character"3210 ;******************************3215 ;** OUTCHR **3220 ;*********************8}*********3225 ;3230 OUTCHR3235 PHA3240 STA PCHAR3245 LDA #333250 JSR PRINT3255 PLA3260 RTS3265 .PAGE "LISTV--9}list variable names"3270 ;******************************3275 ;** LISTV **3280 ;************************:}******3285 ;3290 LISTV3295 LDA #LRET&$FF ;Change DUMP ptr3300 STA DUMPPTR ; to point to3305 LDA #LRET/256 ; RT;}S (null)3310 STA DUMPPTR+13315 ;3320 LDA #29 ;Print heading3325 JSR PRINT3330 ;3335 JSR DUMP3340 LRET3345 <} RTS3350 .PAGE "DUMP--dump variable names and call subroutine for each name"3355 ;******************************3360 ;** =} DUMP **3365 ;******************************3370 ;3375 DUMP3380 LDA VNTP ;Start of names3385 >}STA PTR3390 LDA VNTP+13395 STA PTR+13400 ;3405 LDA #0 ;First variable3410 STA VNUM3415 ;3420 TAY3425 ;3?}430 ;While (VNUM<>128 and ^PTR<>0)3435 ;3440 DLOOP3445 LDA VNUM3450 BMI DEND3455 LDA (PTR),Y3460 BEQ DEND3465 ;34@}70 TAX3475 AND #$7F3480 JSR OUTCHR ;Print character3485 INY ;Length of name3490 TXA3495 BPL DLOOP3A}500 ;3505 ;Found end of name3510 ;3515 TYA3520 PHA3525 DUMPPTR=*+13530 JSR *-*3535 PLA3540 ;3545 CLC3550 ADC B}PTR ;Set PTR to next3555 STA PTR ; variable name3560 BCC DADD ;Saves 2 bytes3565 INC PTR+1 ; C} on addition3570 ;3575 DADD3580 LDY #03585 LDA #155 ;End-of-line3590 JSR OUTCHR3595 INC VNUM ;Bump variD}able #3600 BNE DLOOP ; and loop3605 ;3610 ;Get here when through3615 ;3620 DEND3625 LDA #155 ;Print a blaE}nk3630 JSR OUTCHR ; line, then3635 LDA VNUM ; the number3640 STA FR0 ; of variables3645 LDA #0 F} ; in the table3650 STA FR0+13655 JSR PINT3660 LDA #433665 JSR PRINT3670 RTS3675 ;3680 VNUM .BYTE 0 ;VarG}iable number3685 .PAGE "VALUE--dump variable names and attributes"3690 ;******************************3695 ;** VH}ALUE **3700 ;******************************3705 ;3710 VALUE3715 LDA #VALSUB&$FF3720 STA DUMPPTR3725 LDA #VI}ALSUB/2563730 STA DUMPPTR+13735 ;3740 LDA #30 ;Print heading3745 JSR PRINT3750 ;3755 JSR DUMP3760 RTS3765J} .PAGE "VALSUB--print attributes for variable VNUM"3770 ;******************************3775 ;** VALSUB *K}*3780 ;******************************3785 ;3790 VALSUB3795 LDA VNUM ;PTR2 = 8*VNUM3800 STA PTR2 ; + VVTPL}3805 LDA #03810 STA PTR2+13815 ;3820 ASL PTR23825 ROL PTR2+13830 ;3835 ASL PTR23840 ROL PTR2+13845 ;3850 ASL M}PTR23855 ROL PTR2+13860 ;3865 CLC3870 LDA PTR23875 ADC VVTP3880 STA PTR23885 LDA PTR2+13890 ADC VVTP+13895 SN}TA PTR2+13900 ;3905 ;PTR2 now holds address of table entry--check type3910 ;3915 LDY #0 ;Offset to type3920 LDO}A (PTR2),Y ;Jump if not3925 BNE VT2 ; scalar3930 ;3935 ;Scalar #--print value and return3940 ;3945 CLC P} ;Load floating3950 LDA PTR2 ; point number3955 ADC #2 ; into FR03960 STA FLPTR3965 LDA PTR2+13Q}970 ADC #03975 STA FLPTR+13980 JSR FLD0P3985 CLD3990 ;3995 LDA #34 ;Print blanks,4000 JSR PRINT ; thR}en number4005 JSR PFLT4010 RTS4015 ;4020 ;Check for undimensioned array4025 ;4030 VT24035 CMP #$404040 BNE VT340S}45 LDA #364050 JSR PRINT4055 RTS4060 ;4065 ;Check for array or matrix4070 ;4075 VT34080 CMP #$414085 BNE VT4409T}0 SEC4095 LDY #44100 LDA (PTR2),Y ;Print first4105 SBC #1 ; dimension, 14110 STA FR0 ; less than U}in4115 INY ; the table4120 LDA (PTR2),Y4125 SBC #04130 STA FR0+14135 JSR PINT4140 ;4145 ;Check for seV}cond DIM--if 0, there is not one4150 ;4155 LDY #6 ;DIM A(100) and4160 LDA (PTR2),Y ; DIM B(100,0)4165 CMP #W}1 ; have the same4170 BNE DIM2 ; table entry,4175 INY ; which is 14180 LDA (PTR2),Y4185 BX}EQ VT3R4190 ;4195 ;Print second DIM4200 ;4205 DIM24210 LDA #',4215 JSR OUTCHR4220 SEC4225 LDY #64230 LDA (PTR2)Y},Y4235 SBC #14240 STA FR04245 INY4250 LDA (PTR2),Y4255 SBC #04260 STA FR0+14265 JSR PINT4270 ;4275 ;Return frZ}om array/matrix printing4280 ;4285 VT3R4290 LDA #')4295 JSR OUTCHR4300 RTS4305 ;4310 ;Check for undimensioned strin[}g4315 ;4320 VT44325 CMP #$804330 BNE VT54335 LDA #374340 JSR PRINT4345 RTS4350 ;4355 ;Must be DIMed string--pri\}nt DIM4360 ;4365 VT54370 LDA #'(4375 JSR OUTCHR4380 LDY #64385 LDA (PTR2),Y4390 STA FR04395 INY4400 LDA (PTR2]}),Y4405 STA FR0+14410 JSR PINT4415 LDA #')4420 JSR OUTCHR4425 RTS4430 .PAGE "PINT and PFLT--print integer and flo^}ating-point numbers"4435 ;******************************4440 ;** PNUM **4445 ;************************_}******4450 ;4455 PINT4460 JSR IFP4465 PFLT4470 JSR FASC4475 CLD4480 LDA INBUFF4485 STA MNUM4490 LDA INBUFF+14`}495 STA MNUM+14500 ;4505 ;Now loop to find last digit, which has high bit set4510 ;4515 LDY #04520 PNLOOP4525 LDA (Ia}NBUFF),Y ;Get ASCII byte4530 BMI PNOUT ;Exit if inverse4535 INY ;Else increment4540 BNE PNLOOP ; lb}ength & loop4545 ;4550 PNOUT4555 AND #$7F ;Mask inverse4560 STA (INBUFF),Y4565 INY4570 STY MLEN ;Save lc}ength4575 ;4580 ;Now call PRINT4585 ;4590 LDA #324595 JSR PRINT4600 RTS4605 .PAGE "CHANGE--change variable names"d}4610 ;******************************4615 ;** CHANGE **4620 ;******************************4625 ;4630 CHe}ANGE4635 LDA #12 ;Prompt for old4640 JSR PRINT ; variable name4645 JSR GETVAR ;Get name in BUF4650 Bf}CS CRET ;Branch on error4655 STY LEND ;Save length4660 STA TYPE1 ; and type4665 ;4670 ;See if old namg}e is in table4675 ;4680 JSR FINDVAR4685 BCC CCONT4690 ;4695 ;Error--name not found4700 ;4705 LDA #34710 JSR PRINTq}a'DOS SYS*+DUP SYSB$UAUTORUN SYSByPREPARE BASBVCUSTOM BASBUTILITY SRCBUTILITY2SRCBDISKNAMEDAT4715 CRET4720 RTS4725 ;4730 ;Found it--now get new name4735 ;4740 CCONT4745 LDA #13 ;Prompt for new4750 JSRr} PRINT ; variable name4755 JSR GETVAR4760 BCS CRET4765 STY LENI4770 STA TYPE24775 ;4780 ;Make sure new name is}s not already in use4785 ;4790 LDA PTR ;Save pointer to4795 PHA ; old name's4800 LDA PTR+1 ; t}table entry4805 PHA4810 JSR FINDVAR4815 PLA ;Restore pointer4820 STA PTR+14825 PLA4830 STA PTR4835 Bu}CS CHTYPE ;OK if not found4840 ;4845 ;Error--new name already in use4850 ;4855 LDA #414860 JSR PRINT4865 RTS487v}0 ;4875 ;Check to make sure both names are same type4880 ;4885 CHTYPE4890 LDA TYPE2 ;Types are same4895 CMP TYPE1w} ; if last char4900 BEQ CHOK ; matches or if4905 CMP #' ; both are4910 BCC CHERR ; alphanumx}eric4915 LDA TYPE14920 CMP #'4925 BCS CHOK4930 ;4935 ;Type mismatch error4940 ;4945 CHERR4950 LDA #44955 JSR Py}RINT4960 RTS4965 ;4970 ;Now check available memory4975 ;4980 CHOK4985 SEC4990 LDA HIMEM ;TEMP = FRE(0)4995 Sz}BC MEMTOP5000 STA TEMP5005 LDA HIMEM+15010 SBC MEMTOP+15015 STA TEMP+15020 ;5025 CLC ;Add space taken5{}030 LDA TEMP ; by old name5035 ADC LEND ; to free space5040 STA TEMP5045 BCC CADD ;Saves 3 bytes5|}050 INC TEMP+1 ; on addition5055 CADD5060 ;5065 LDA TEMP ;Leave at least5070 SBC #20 ; twenty bytes}}5075 STA TEMP ; for commands5080 LDA TEMP+1 ;Don't use BCS/5085 SBC #0 ; DEC because5090 STA TEMP~}+1 ; a BCC follows5095 BCC NOMEM ;Not enough room5100 ;5105 SEC ;Subtract space5110 LDA TEMP } ; for new name5115 SBC LENI5120 STA TEMP5125 LDA TEMP+1 ;Don't use BCS/5130 SBC #0 ; DEC because a51}35 STA TEMP+1 ; BCS follows5140 ;5145 BCS CHOK2 ;Enough memory5150 ;5155 ;Not enough memory5160 ;5165 NOMEM}5170 LDA #95175 JSR PRINT5180 RTS5185 ;5190 ;Now do substitution5195 ;5200 CHOK25205 JSR DELETE25210 JSR INSERT}5215 RTS5220 ;5225 ;Data for CHANGE5230 ;5235 ;LEND holds length of 1st name5240 ;LENI holds length of 2nd name5245 T}YPE1 .BYTE 0 ;Type--old name5250 TYPE2 .BYTE 0 ;Type--new name5255 TEMP .WORD 05260 .PAGE "GETVAR--get variable name"}5265 ;*******************************5270 ;** GETVAR **5275 ;*******************************5280 ;528}5 GETVAR5290 LDA #40 ;Get name in BUF5295 JSR INPUT5300 BPL GVTEST5305 ;5310 ;Error happened--which one?5315 };5320 CPY #$89 ;Return if BREAK5325 BNE GVERR ; or CTRL-35330 LDA #6 ;Line too long5335 JSR PRINT}5340 GVERR5345 SEC ;Error flag5350 RTS5355 ;5360 ;Got record--now check for error5365 ;5370 GVTEST5375 }LDA BUF ;If empty line,5380 CMP #155 ; return5385 BEQ GVERR ;First character5390 CMP #'A ; m}ust be upper5395 BCC GVERR2 ; case letter5400 CMP #'Z+15405 BCS GVERR25410 ;5415 LDY #1 ;Length = 1542}0 ;5425 ;Now loop until character can't be part of name5430 ;5435 GVLOOP5440 LDA BUF,Y ;Get character5445 CMP #'Z}+1 ;End if > "Z"5450 BCS GVRET5455 CMP #'( ;End if array5460 BEQ GVRET25465 CMP #'$ ;End if string}5470 BEQ GVRET25475 CMP #'0 ;End if < "0"5480 BCC GVRET5485 CMP #'9+1 ;OK if numeric5490 BCC GVLEND549}5 CMP #'A ;OK if alpha5500 BCC GVRET5505 GVLEND5510 INY ;Bump length5515 BNE GVLOOP ; and cont}inue5520 ;5525 ;Error--bad variable name5530 ;5535 GVERR25540 LDA #25545 JSR PRINT5550 SEC5555 RTS5560 ;5565 ;E}nd of variable name--return5570 ;5575 GVRET25580 INY ;Include ( or $5585 ;5590 GVRET5595 LDA BUF,Y ;I}f next char is5600 CMP #155 ; not EOL, error5605 BNE GVERR25610 ;5615 LDA BUF-1,Y ;Set high bit on5620 ORA }#$80 ; last character5625 STA BUF-1,Y5630 ;5635 CLC ;No error5640 RTS5645 .PAGE "FINDVAR--find star}t of variable name"5650 ;******************************5655 ;** FINDVAR **5660 ;*************************}*****5665 ;5670 FINDVAR5675 STY LEN ;Save length5680 LDA #0 ;No names found5685 STA COUNT5690 ;5695 } LDA VNTP ;Start of names5700 STA PTR25705 LDA VNTP+15710 STA PTR2+15715 ;5720 ;While (^PTR2<>0 and COUNT<>128)}5725 ;5730 FVL5735 LDY #05740 LDA COUNT5745 BMI FVLEND5750 LDA (PTR2),Y5755 BEQ FVLEND5760 ;5765 ; TLEN=1; PT}R=PTR25770 ;5775 LDX #15780 STX TLEN5785 LDX PTR25790 STX PTR5795 LDX PTR2+15800 STX PTR+15805 ;5810 ; While} (^PTR2 < 128) do5815 ;5820 FVL25825 LDA (PTR2),Y5830 BMI FVL2END5835 ;5840 ; TLEN=TLEN+1; PTR2=PTR2+15845 ;58}50 INC TLEN5855 CLC5860 LDA PTR25865 ADC #15870 STA PTR25875 BCC FVADD ;Saves 2 bytes5880 INC PTR2+1 ; } on addition5885 FVADD5890 JMP FVL25895 ;5900 ; Endwhile5905 ; If TLEN = LEN then5910 ;5915 FVL2END5920 LDA LEN} ;If lengths not5925 CMP TLEN ; equal, names5930 BNE FVNOTYET ; are not same5935 ;5940 LDY #05945 FV}L35950 LDA (PTR),Y ;Check names5955 CMP BUF,Y ; byte by byte5960 BNE FVNOTYET5965 INY5970 CPY LEN5975 BN}E FVL35980 ;5985 ;Got it!! Clear carry as a flag and return5990 ;5995 CLC6000 RTS6005 ;6010 ;Not found yet...6015 };6020 FVNOTYET6025 CLC6030 LDA PTR26035 ADC #16040 STA PTR26045 BCC FVADD2 ;Saves 2 bytes6050 INC PTR2+1 } ; on addition6055 FVADD26060 INC COUNT6065 JMP FVL6070 ;6075 ;Endwhile6080 ;6085 FVLEND6090 SEC ;Name not fou}nd6095 RTS6100 ;6105 ;Data for FINDVAR6110 ;6115 LEN .BYTE 06120 TLEN .BYTE 06125 COUNT .BYTE 06130 .PAGE "DELETE2-}-delete variable name at PTR"6135 ;******************************6140 ;** DELETE2 **6145 ;***************}***************6150 ;6155 DELETE26160 JSR DELETE6165 LDX #46170 D2LOOP6175 SEC ;Adjust VNTD,6180 LDA VN}TD,X ; VVTP, and6185 SBC LEND ; STMTAB6190 STA VNTD,X6195 BCS D2SUB ;Saves 3 bytes6200 DEC VNTD+1,X } ; on subtract6205 D2SUB6210 DEX6215 DEX6220 BPL D2LOOP6225 RTS6230 .PAGE "DELETE--delete variable name or line }at PTR"6235 ;******************************6240 ;** DELETE **6245 ;******************************6250 ;}6255 DELETE6260 SEC ;Calculate addr6265 LDA APPMHI ; of top byte6270 SBC LEND6275 STA DTEMP6280 LD}A APPMHI+16285 SBC #06290 STA DTEMP+16295 ;6300 LDA PTR ;Set pointer to6305 STA PTR2 ; delete area631}0 LDA PTR+16315 STA PTR2+16320 ;6325 ;Now copy bytes (from left end)6330 ;6335 DLLOOP6340 LDY LEND6345 LDA (PTR2),}Y6350 LDY #06355 STA (PTR2),Y6360 ;6365 LDA PTR2+1 ;See if it is6370 CMP DTEMP+1 ; time to end6375 BNE DLE}ND ; the loop6380 LDA PTR26385 CMP DTEMP6390 BEQ DTHRU6395 ;6400 DLEND6405 CLC6410 LDA PTR26415 ADC #164}20 STA PTR26425 BCC DLADD ;Saves 2 bytes6430 INC PTR2+1 ; on addition6435 DLADD6440 JMP DLLOOP6445 ;6450 };End of loop--adjust pointers6455 ;6460 DTHRU6465 LDX #66470 DLLOOP26475 SEC ;Adjusts STMCUR,6480 LDA STM}CUR,X ; STARP,RUNSTK,6485 SBC LEND ; and MEMTOP6490 STA STMCUR,X6495 BCS DLSUB ;Saves 3 bytes6500 DEC }STMCUR+1,X ; on subtract6505 DLSUB6510 DEX6515 DEX6520 BPL DLLOOP26525 ;6530 SEC ;Also adjust6535 LDA} APPMHI ; APPMHI6540 SBC LEND6545 STA APPMHI6550 BCS DLSUB2 ;Saves 2 bytes6555 DEC APPMHI+1 ; on subtract}6560 DLSUB26565 RTS6570 ;6575 ;Data for DELETE6580 ;6585 LEND .BYTE 06590 DTEMP .WORD 06595 .PAGE "INSERT--insert v}ariable name at PTR"6600 ;******************************6605 ;** INSERT **6610 ;************************}******6615 ;6620 INSERT6625 LDA MEMTOP ;Start at high6630 STA PTR2 ; end of memory6635 LDA MEMTOP+16640 }STA PTR2+16645 ;6650 ;Now copy bytes6655 ;6660 ILOOP6665 LDY #06670 LDA (PTR2),Y6675 LDY LENI6680 STA (PTR2),Y66}85 ;6690 LDA PTR2+16695 CMP PTR+16700 BNE ILEND6705 LDA PTR26710 CMP PTR6715 BEQ ITHRU6720 ;6725 ILEND6730 SE}C6735 LDA PTR26740 SBC #16745 STA PTR26750 BCS ISUB ;Saves 2 bytes6755 DEC PTR2+1 ; on subtract6760 ISU}B6765 JMP ILOOP6770 ;6775 ;End of loop--adjust pointers6780 ;6785 ITHRU6790 LDX #126795 ILOOP26800 CLC };Adjust VNTD,6805 LDA VNTD,X ; VVTP, STMTAB,6810 ADC LENI ; STMCUR,STARP,6815 STA VNTD,X ; RUNSTK, and}6820 BCC IADD ; MEMTOP6825 INC VNTD+1,X ;Saves 3 bytes6830 IADD6835 DEX6840 DEX6845 BPL ILOOP26850 ;685}5 CLC6860 LDA APPMHI ;Adjust APPMHI6865 ADC LENI6870 STA APPMHI6875 BCC IADD2 ;Saves 2 bytes6880 INC APPM}HI+1 ; on addition6885 IADD26890 ;6895 LDY #06900 ILOOP36905 LDA BUF,Y ;Copy new name6910 STA (PTR),Y ; }from buffer6915 INY ; to table6920 CPY LENI6925 BCC ILOOP36930 ;6935 RTS6940 ;6945 LENI .BYTE 06950 }.PAGE "CROSS REFERENCE--variables and line numbers"6955 ;******************************6960 ;** CROSS REFERENCE **}6965 ;******************************6970 ;6975 XREF6980 ;6985 ;Change LINES pointer to XREF6990 ;6995 LDA #XREFSUB&$F}F7000 STA LINEPTR7005 LDA #XREFSUB/2567010 STA LINEPTR+17015 ;7020 ;Change DUMP pointer to LINES7025 ;7030 LDA #LI}NES&$FF7035 STA DUMPPTR7040 LDA #LINES/2567045 STA DUMPPTR+17050 ;7055 ;Print heading and call DUMP7060 ;7065 LDA }#31 ;XREF heading7070 JSR PRINT7075 ;7080 LDA #$FF ;No variables7085 STA OLDVAR ; checked yet7090 ;}7095 JSR DUMP7100 RTS7105 .PAGE "LINES--call subroutine for each statement"7110 ;******************************7115 ;}** LINES **7120 ;******************************7125 ;7130 LINES7135 LDA STMTAB ;Start of token71}40 STA PTR2 ; program7145 LDA STMTAB+17150 STA PTR2+17155 ;7160 ;While line #<32768 do7165 ;7170 LLOOP7175 }LDY #0 ;LINENO=current7180 LDA (PTR2),Y ; line number7185 STA LINENO7190 INY7195 LDA (PTR2),Y7200 STA LI}NENO+17205 BMI LINERET ;Exit if >=327687210 ;7215 INY ;LINELEN=length7220 LDA (PTR2),Y ; of line7225} STA LINELEN7230 ;7235 LDA #3 ;Set INDEX to7240 STA INDEX ; first stmt7245 ;7250 ;Loop for each stateme}nt in the line7255 ;7260 LLOOP27265 LDY INDEX ;Get offset to7270 LDA (PTR2),Y ; end of stmt7275 STA LIMIT728}0 INY ;Get offset to7285 STY CMDBYT ; command byte7290 ;7295 LINEPTR = *+17300 JSR *-* ;XREF or} RENSUB7305 ;7310 ;7315 ;Bump index and check for end of loop7320 ;7325 LDA LIMIT ;Loop while7330 STA INDEX } ; there are7335 CMP LINELEN ; statements7340 BNE LLOOP2 ; left in line7345 ;7350 ;End of line--advance to ne}xt line7355 ;7360 CLC ;Add length of7365 LDA PTR2 ; line to PTR27370 ADC LINELEN7375 STA PTR27380} BCC LINEADD ;Saves 2 bytes7385 INC PTR2+1 ; on addition7390 LINEADD7395 JMP LLOOP7400 ;7405 ;End of main loo}p--return7410 ;7415 LINERET7420 RTS7425 ;7430 ;Data for LINES7435 ;7440 INDEX .BYTE 07445 LIMIT .BYTE 07450 LINENO }.WORD 07455 LINELEN .BYTE 07460 CMDBYT .BYTE 07465 .PAGE "LINK--equates to link D:UTILITY.SRC and D:UTILITY2.SRC"7470 ;}7475 ;This program is continued in7480 ;the file D:UTILITY2.SRC. The7485 ;equates below help link the7490 ;two files.749}5 ;7500 XREFSUB = * ;XREF routine7505 OLDVAR = $27CB ;XREF variable7510 XMAX = $27CF ;Columns/line7515 DELLIN = $}2803 ;Delete lines7520 RENUM = $2904 ;Renumber prog7525 CHECK = $2B4B ;Check program7530 OUTPUT = $2BA0 ;New output }file7535 BASIC = $2C3F ;Return to BASIC7540 DOS = $2C45 ;Go to DOS menu7545 RESTORE = $2C4D ;Restore machine7550 IN}PUT = $2CA6 ;Get input line7555 ;7560 ;7565 END = $2CE47570 ;7575 .END LINES7135 LDA STMTAB ;Start of token71O1000 .TITLE "BASIC/XA REVISION 1.1 (C) 1982 Thomas D. Newton1005 .PAGE "Operating System and BASIC equates"1010 ;1015 ;B}ASIC/XA revision 1.11020 ;1025 ;1030 ;(c) 1982 by Thomas D. Newton1035 ;1040 ;This program provides the ATARI1045 ;BASI}C user with an easy method1050 ;to list variable names and1055 ;values, change names, cross-1060 ;reference variables, del}ete1065 ;multiple lines, and renumber1070 ;the BASIC program in memory.1075 ;1080 ;PART II--D:UTILITY2.SRC1085 ;Assemble} after D:UTLITY.SRC1090 ;1095 ;1100 ;Operating System equates1105 ;1110 CIOV = $E4561115 ICCMD = $03421120 ICSTA = $0}3431125 ICBAL = $03441130 ICBAH = $03451135 ICBLL = $03481140 ICBLH = $03491145 ICAX1 = $034A1150 ICAX2 = $034B1155 OP}EN = $031160 CLOSE = $0C1165 GETREC= $051170 GET = $071175 PUT = $0B1180 FR0 = $00D41185 FLPTR = $00FC1190 INBU}FF= $00F31195 CIX = $00F21200 LBUFF = $05801205 AFP = $D8001210 FASC = $D8E61215 IFP = $D9AA1220 FPI = $D9D21}225 FLD0P = $DD8D1230 FST0P = $DDAB1235 DOSVEC= $000A1240 DOSINI= $000C1245 APPMHI= $000E1250 HIMEM = $02E51255 MEMLO =} $02E71260 ;1265 ;BASIC equates1270 ;1275 LOMEM = $801280 VNTP = $821285 VNTD = $841290 VVTP = $861295 STMTAB= $88}1300 STMCUR= $8A1305 STARP = $8C1310 RUNSTK= $8E1315 MEMTOP= $901320 ;1325 ;Program equates1330 ;1335 PTR = $CB1340} PTR2 = $CD1345 R = 155 ;End-of-line1350 ;1355 DUMP = $235B ;Name subroutine1360 LINES = $2702 ;Stmt subrout}ine1365 DUMPPTR = $237F ;GOSUB in DUMP1370 LINEPTR = $2731 ;GOSUB in LINES1375 PRINT = $1E6D ;Prints messages1380 OUTCH}R = $233D ;Print character1385 PINT = $2473 ;Prints integers1390 PFLT = $2476 ;Prints f.p. #s1395 NUMIOCB = $22A9 ;}Print #s here1400 INDEX = $274E ;Start of stmt1405 LIMIT = $274F ;End of stmt1410 LINENO = $2750 ;Current line #1415} LINELEN = $2752 ; " line length1420 CMDBYT = $2753 ;Offs to command1425 BUF = $1E31 ;Editor buffer1430 IOCB = $1ED8} ;Output file #1435 OLDDOS = $1D39 ;DOS vector1440 SA = $1DBA ;Holds registers1445 SX = $1DBB1450 SY = $1DBC145}5 SFLAGS = $1DBD1460 SPTR = $1DBE1465 SPTR2 = $1DC01470 SADDR = $1DC21475 SLEN = $1DC41480 INUSE = $1D3B1485 VNUM = $23}AE ;Current var #1490 DELETE = $2629 ;Delete line/var1495 LEND = $2685 ;Delete this amt1500 MLEN = $2330 ;Length} of #s1505 ;1510 ;*** END OF EQUATES ***1515 ;1520 *= $2754 ;Start 2nd half1525 .PAGE "XREFSUB--Check statement }for use of variable VNUM"1530 ;******************************1535 ;** XREFSUB **1540 ;*******************}***********1545 ;1550 XREFSUB1555 JSR TOKEN ;Get next token1560 BCS XRET ;End of stmt?1565 CMP #0 };Loop if not1570 BPL XREFSUB ; variable name1575 AND #$7F ;Loop if not1580 CMP VNUM ; variable VNUM15}85 BNE XREFSUB1590 ;1595 ;Found variable in line--now check to avoid repeats1600 ;1605 CMP OLDVAR ;Start new line1}610 BEQ XTEST ; if different1615 LDA #0 ; from last1620 STA XCNT ; variable1625 LDA #35 ;} referenced1630 JSR PRINT1635 JMP XPRINT1640 ;1645 ;This variable referenced before--check line #1650 ;1655 XTEST16}60 LDA LINENO ;Return if this1665 CMP OLDLIN ; reference has1670 BNE XPRINT ; been printed1675 LDA LINEN}O+11680 CMP OLDLIN+11685 BNE XPRINT1690 RTS1695 ;1700 ;Now print line #1705 ;1710 XPRINT1715 LDA XCNT ;Star}t new line1720 CMP XMAX ; on printer1725 BCC XPRINT2 ; every tenth1730 LDA #35 ; reference1735 JSR} PRINT ; per variable1740 LDA #01745 STA XCNT1750 ;1755 XPRINT21760 LDA LINENO ;Print line #1765 STA FR0}1770 LDA LINENO+11775 STA FR0+11780 JSR PINT1785 ;1790 XPRINT31795 LDA #32 ;Print spaces to1800 JSR OUTCHR } ; fill out the1805 INC MLEN ; space between1810 LDA MLEN ; end of line #1815 CMP #7 ; and b}eginning1820 BNE XPRINT3 ; of next one1825 ;1830 INC XCNT ;Count line #s1835 ;1840 LDA VNUM ;Set OLDL}IN and1845 STA OLDVAR ; OLDVAR to the1850 LDA LINENO ; current line1855 STA OLDLIN ; and variable1860 }LDA LINENO+11865 STA OLDLIN+11870 ;1875 XRET1880 RTS1885 ;1890 OLDVAR .BYTE 0 ;Last reference1895 OLDLIN .WORD 0 ;} printed1900 XCNT .BYTE 0 ;Format counter1905 XMAX .BYTE 4 ;Numbers/line1910 .PAGE "TOKEN--get next token in state}ment"1915 ;******************************1920 ;** TOKEN **1925 ;******************************1930 ;1}935 TOKEN1940 ;1945 ;Return next token in Acc1950 ; Y holds index on entry/exit1955 ; to first byte of next token196}0 ; OLDY holds previous index1965 ; Carry flag: set if past end1970 ; of statement1975 ;1980 ;A REM statement is tr}eated as1985 ;the end of the statement since1990 ;the following text looks just1995 ;like commands and variables!!2000 ;}2005 STY OLDY ;Save old index2010 CPY LIMIT ;Return with2015 BCC TCONT ; carry set if2020 RTS } ; past stmt end2025 TCONT2030 LDA (PTR2),Y ;Get next token2035 BNE NOTREM ;OK if not REM2040 SEC } ;Fake an end-of-2045 RTS ; statement2050 NOTREM2055 INY ;Bump index2060 LDX OLDY ;Return} if first2065 CPX CMDBYT ; byte of stmt2070 BEQ TRET ; (command)2075 CMP #14 ;Numeric const?2080 B}NE TCONT22085 INY ;Skip over the2090 INY ; six BCD bytes2095 INY2100 INY2105 INY2110 INY2}115 CLC ;Not end-of-stmt2120 RTS ;Return2125 ;2130 ;Not command or # constant2135 ;2140 TCONT22}145 CMP #15 ;Return if not2150 BNE TRET ; string const2155 CLC ;Add length of2160 TYA } ; string to2165 ADC (PTR2),Y ; index, then2170 TAY ; add one for2175 INY ; the len byte}2180 LDA #15 ;Reload token2185 TRET2190 CLC ;Not end-of-stmt2195 RTS2200 ;2205 OLDY .BYTE 02210 }.PAGE "DELLIN--delete a range of lines from the BASIC program"2215 ;******************************2220 ;** DELLIN } **2225 ;******************************2230 ;2235 DELLIN2240 LDA #14 ;Ask for range2245 JSR PRINT }; of lines to2250 JSR GETTWO ; delete2255 BCS DELRET1 ;Return on error2260 ;2265 ;Now check line #s--second mu}st be larger2270 ;2275 LDA NUM1+12280 CMP NUM2+12285 BCC DELOK2290 BEQ DELTEST2295 BCS DELERR2300 ;2305 DELTEST}2310 LDA NUM12315 CMP NUM22320 BCC DELOK2325 BEQ DELOK2330 ;2335 ;Error--second line # is smaller2340 ;2345 DELERR }2350 LDA #38 ;Error message2355 JSR PRINT2360 DELRET12365 RTS2370 ;2375 ;Line #s ok--now delete lines2380 ;U }se PTR to point to lines2385 ;2390 DELOK2395 LDA STMTAB ;PTR := start of2400 STA PTR ; token program2405  }LDA STMTAB+12410 STA PTR+12415 ;2420 ;Loop until line # is greater than NUM22425 ;2430 DELLOOP2435 LDY #0 ;Ge }t line number2440 LDA (PTR),Y ; and put it in2445 STA LINENO ; LINENO2450 INY2455 LDA (PTR),Y2460 STA LINE }NO+12465 INY ;Also get line2470 LDA (PTR),Y ; length2475 STA LINELEN2480 ;2485 ;If line # is less than} NUM1,2490 ; move to next line and loop2495 ;2500 LDA NUM1+1 ;Check MSB first2505 CMP LINENO+12510 BCC DELTEST2}2515 BEQ DELTEST12520 ;2525 ;Move to next line2530 ;2535 DELNEXT2540 CLC2545 LDA PTR2550 ADC LINELEN2555 STA PTR}2560 BCC DLADD ;Saves 2 bytes2565 INC PTR+12570 DLADD2575 JMP DELLOOP2580 ;2585 ;Checked MSBs (equal), so test }LSBs of NUM1 and LINENO2590 ;2595 DELTEST12600 LDA NUM12605 CMP LINENO2610 BEQ DELTEST22615 BCS DELNEXT2620 ;2625} ;LINENO is greater than NUM1--check against NUM22630 ;2635 DELTEST22640 LDA LINENO+1 ;Exit if LINENO2645 CMP NUM2+1 } ; is greater2650 BCC DELGO ; than NUM22655 BNE DELRET22660 ;2665 DELTEST32670 LDA LINENO2675 CMP NUM226}80 BEQ DELGO2685 BCS DELRET22690 ;2695 ;Delete line and loop for more2700 ;2705 DELGO2710 LDA LINELEN2715 STA LEND}2720 JSR DELETE2725 JMP DELLOOP2730 ;2735 ;Return when done2740 ;2745 DELRET22750 RTS2755 .PAGE "GETTWO--input tw}o numbers in range 0 to 32767"2760 ;******************************2765 ;** GETTWO **2770 ;**************}****************2775 ;2780 GETTWO2785 LDA #40 ;Get a line of2790 JSR INPUT ; input in BUF2795 ;2800 ;Che}ck to see if numbers are OK2805 ;If OK, put them in NUM1 & NUM22810 ;2815 BPL GETCONT ;If no CIO error2820 LDA #628}25 CPY #137 ;Check for line2830 BNE GETRET1 ; too long --2835 JSR PRINT ; if so, print2840 ;2845 ;On e}rror return, A=155 if the2850 ;error was due to an empty line.2855 ;2860 GETRET12865 SEC ;Set error flag2870} RTS ; and return2875 ;2880 ;No Screen Editor errors--now try to process line2885 ;2890 GETCONT2895 LDA BU}F ;Return with2900 CMP #155 ; error for2905 BEQ GETRET1 ; empty line2910 ;2915 LDA #BUF&$FF ;Tell }AFP the2920 STA INBUFF ; address of2925 LDA #BUF/256 ; the buffer2930 STA INBUFF+12935 ;2940 ;Get first numbe}r2945 ;2950 LDA #0 ;Start of line2955 STA CIX2960 JSR AFP ;Convert first2965 CLD ; number} to BCD2970 BCS GETERR ;Check for error2975 JSR FPI ;Convert number2980 CLD ; to integer2985 B }CS GETERR2 ;Check for error2990 LDA FR0 ;Save number in2995 STA NUM1 ; NUM13000 LDA FR0+13005 STA NU!}M1+13010 BPL GET2 ;Jump if <=327673015 ;3020 ;Error--number out of range3025 ;3030 GETERR23035 LDA #5 ;"}Message about3040 JSR PRINT ; line # out3045 SEC ; of range3050 RTS3055 ;3060 ;Error--can't convert#} number3065 ;3070 GETERR3075 LDA #73080 JSR PRINT3085 SEC3090 RTS3095 ;3100 ;Get second number3105 ;3110 GET23$}115 LDY CIX3120 GETL3125 LDA BUF,Y ;Skip commas3130 CMP #32 ; and blanks3135 BEQ GETEL3140 CMP #',314%}5 BNE GETGO3150 GETEL3155 INY3160 JMP GETL3165 ;3170 ;Now call f.p. routines again3175 ;3180 GETGO3185 STY CIX &} ;Convert second3190 JSR AFP ; number to fp3195 CLD3200 BCS GETERR ;Return on error3205 JSR FPI '} ;Convert number3210 CLD ; to integer3215 BCS GETERR23220 ;3225 ;Now store and test number3230 ;3235 LD(}A FR0 ;Store second3240 STA NUM2 ; number in3245 LDA FR0+1 ; NUM23250 STA NUM2+1 ;Error if numb)}er3255 BMI GETERR2 ; >= 327683260 CLC ;Clear error3265 RTS ; flag & return3270 ;3275 ;Data*} section for GETTWO3280 ;3285 NUM1 .WORD $003290 NUM2 .WORD $003295 .PAGE "RENUM--renumber BASIC program in memory"3300+} ;******************************3305 ;** RENUM **3310 ;******************************3315 ;3320 RENUM,}3325 LDA #22 ;RENUM prompt3330 JSR PRINT3335 JSR GETTWO ;Get start,incr3340 BCC RENCONT ;Go if #s are OK-}3345 LDX BUF ;If 'error',3350 CPX #155 ; check for3355 BNE RENRET ; RETURN, or3360 CMP #155 .}; empty line3365 BEQ RENDEF3370 RENRET3375 RTS3380 ;3385 ;Use default paramters if RETURN was pressed3390 ;3395 REN/}DEF3400 LDA #10 ;Use 10, 10 for3405 STA NUM1 ; new starting3410 STA NUM2 ; line and the3415 LDA 0}#0 ; increment3420 STA NUM1+1 ; between lines3425 STA NUM2+13430 ;3435 ;Check to make sure increment is n1}ot zero3440 ;3445 RENCONT3450 LDA NUM2 ;Continue if3455 ORA NUM2+1 ; increment3460 BNE RENCONT2 ; is no2}t zero3465 ;3470 LDA #42 ;Print message3475 JSR PRINT ; 'Increment3480 RTS ; must be +'34853} ;3490 ;Check if renumbering is possible or not3495 ;3500 RENCONT23505 LDA STMTAB ;Set pointer to3510 STA PTR 4} ; start of the3515 LDA STMTAB+1 ; token program3520 STA PTR+13525 LDA NUM1 ;New line # for3530 STA PTR2 5} ; first line3535 LDA NUM1+13540 STA PTR2+13545 ;3550 ;Loop while line # is less than 327683555 ;3560 RENLOOP36}565 LDY #1 ;Check high bit3570 LDA (PTR),Y ; of MSB of3575 BMI RENCONT3 ; line number3580 CLC3585 LDA7} PTR2 ;Add INCR to3590 ADC NUM2 ; PTR2 to find3595 STA PTR2 ; the line #3600 LDA PTR2+1 ; of t8}he next3605 ADC NUM2+1 ; line3610 STA PTR2+13615 BMI RENNOT ;Error if >327673620 INY ;Bump pointe9}r to3625 LDA (PTR),Y ; the next line3630 CLC ; and loop back3635 ADC PTR ; for more.3640 STA :}PTR3645 BCC RNADD ;Saves 2 bytes3650 INC PTR+13655 RNADD3660 JMP RENLOOP3665 ;3670 ;End of loop--can't renumber;}3675 ;The way the program is written,3680 ;this error can happen if the3685 ;new ending line number is more3690 ;than 327<}67 - INCR; i.e. if the3695 ;increment is 10, the maximum3700 ;permissible end line is 327573705 ;3710 RENNOT3715 LDA #8=} ;Can't renumber3720 JSR PRINT3725 RTS3730 ;3735 ;End of loop--can renumber3740 ;3745 RENCONT33750 LDA #REN>}SUB&$FF ;Tell LINES3755 STA LINEPTR ; routine to3760 LDA #RENSUB/256 ; use RENSUB3765 STA LINEPTR+1 ; for stmt?}s3770 ;3775 LDA #0 ;Set RENSUB for3780 STA RFLAG ; renumber use3785 ;3790 ;Change references in GOTO,@}3795 ;GO TO, GOSUB, TRAP, RESTORE,3800 ;LIST, ON..GOTO, ON..GOSUB,3805 ;and IF..THEN statements3810 ;3815 JSR LINES3820A} ;3825 ;Statement references have been3830 ;changed--now change the line3835 ;numbers that start each line3840 ;3845 LDB}A STMTAB ;Set PTR to the3850 STA PTR ; start of the3855 LDA STMTAB+1 ; token program3860 STA PTR+13865 C};3870 LDA NUM1 ;Set new line #3875 STA PTR2 ; to the new3880 LDA NUM1+1 ; starting line3885 STA PTRD}2+1 ; number3890 ;3895 RENLOOP23900 LDY #13905 LDA (PTR),Y ;Exit if line #3910 BMI RENTHRU ; is > 327673E}915 LDA PTR2+1 ;Else store new3920 STA (PTR),Y ; line number -3925 DEY ; MSB goes 13930 LDA PTR2 F} ; byte from3935 STA (PTR),Y ; start of line3940 ;3945 CLC ;Add increment3950 LDA PTR2 ; toG} PTR2 to3955 ADC NUM2 ; get the new3960 STA PTR2 ; line number3965 LDA PTR2+1 ; for the next3970 AH}DC NUM2+1 ; line3975 STA PTR2+13980 ;3985 CLC ;Bump PTR to the3990 LDY #2 ; start of the3995I} LDA PTR ; next line by4000 ADC (PTR),Y ; adding the4005 STA PTR ; line length4010 BCC RNADD2 J};Saves 2 bytes4015 INC PTR+14020 RNADD24025 ;4030 JMP RENLOOP2 ;Branch back...4035 ;4040 ;Job through--return4045 K};4050 RENTHRU4055 RTS4060 .PAGE "RENSUB--change line references in statement"4065 ;******************************4070 L};** RENSUB **4075 ;******************************4080 ;4085 RENSUB4090 JSR TOKEN ;Get command409M}5 STA RTOKN ; and save it4100 CMP #4 ;Check for LIST4105 BEQ RENGO4110 CMP #10 ;Check for GOTO41N}15 BEQ RENGO4120 CMP #11 ;Check for GO TO4125 BEQ RENGO4130 CMP #12 ;Check for GOSUB4135 BEQ RENGO414O}0 CMP #13 ;Check for TRAP4145 BEQ RENGO4150 CMP #35 ; " for RESTORE4155 BEQ RENGO4160 ;4165 ;Check forP} IF..THEN--it needs more scanning4170 ;4175 CMP #7 ;IF statement4180 BNE RENTEST ;Jump if not IF4185 RENL14Q}190 JSR TOKEN ;Loop until THEN4195 CMP #27 ; statement is4200 BNE RENL1 ; found, then4205 BEQ RENGOR} ; process it.4210 ;4215 ;Check for ON..GOSUB or ON..GOTO--they require more scanning4220 ;4225 RENTEST4230 CMP #S}30 ;No renumbering4235 BEQ RENL2 ; needed if not4240 RTS ; an ON command4245 ;4250 RENL24255 T} JSR TOKEN ;Loop until4260 CMP #23 ; GOTO4265 BEQ RENGO ; or4270 CMP #24 ; GOSUB4275 BU}NE RENL2 ; is found4280 ;4285 ;Loop to change line #s separated by commas4290 ;4295 RENGO4300 JSR TOKEN ;GetV} next token4305 STY RENY ;Save line index4310 BCC RENC ;Return if end4315 RTS ; of line hit432W}0 RENC4325 CMP #14 ;Check for a4330 BEQ RENC2 ; BCD constant4335 CMP #20 ;If end of stmt4340 BEQ X}RENR1 ; or4345 CMP #22 ; end of line4350 BEQ RENR1 ; then return4355 RENEXP4360 LDX #23 Y} ;Expr. ERROR4365 LDA #27 ;Just plain EOL4370 RENERR4375 PHA ;Save message #24380 TXA ;GeZ}t current one4385 JSR PRINT ;Print message4390 LDA LINENO ;Find new line #4395 STA FLIN ; for this line[}4400 STA FR04405 LDA LINENO+14410 STA FLIN+14415 STA FR0+14420 BIT RFLAG ;Use old line #4425 BMI RENPRT \}; for CHECK use4430 JSR GETNEW4435 RENPRT4440 LDA #$00 ;Send to screen4445 STA NUMIOCB4450 JSR PINT4455 LDA]} #$FF ;Restore output4460 STA NUMIOCB ; file IOCB4465 PLA ;Print EOL on4470 JSR PRINT ; scre^}en4475 RENR14480 RTS ; and return4485 ;4490 ;Bad line #--outside range of 04495 ;to 32767, or 0 to 65535 (T_}RAP)4500 ;4505 RENERR24510 LDX #44 ;BAD LINE #...4515 LDA #27 ;End of line4520 JSR RENERR ;Print me`}ssage4525 JMP RENCHK ; and continue4530 ;4535 ;Check possible line number4540 ;4545 RENC24550 LDA OLDY ;Saa}ve offset to4555 STA RENOFF ; line # for4560 INC RENOFF ; future use4565 JSR TOKEN ;Get next token4570 b} STY RENY ;Save line index4575 BCC RENC3 ;If end-of-stmt,4580 LDA #20 ; use false :4585 RENC34590 Sc}TA RENTMP ;Save token4595 CMP #20 ;Not expression4600 BEQ RENGO2 ; if end of4605 CMP #22 ; statd}ement,4610 BEQ RENGO2 ; end of line,4615 CMP #18 ; or comma4620 BNE RENEXP ;Else EXPRESSION4625 ;463e}0 ;Have found single line number--try to convert it4635 ;4640 RENGO24645 CLC ;Load floating4650 LDA PTR2 f} ; point number4655 ADC RENOFF ; to FR04660 STA FLPTR4665 LDA PTR2+14670 ADC #04675 STA FLPTR+14680 JSR Fg}LD0P4685 ;4690 JSR FPI ;F.P.==>integer4695 CLD ;Not integer;4700 BCS RENERR2 ; signal error4705h} LDA FR0+1 ;Go if line no.4710 BPL RENC5 ; is 0..327674715 LDA RTOKN ;TRAP 32767...4720 CMP #13 i} ; 40000 allowed4725 BNE RENERR2 ; but GOSUB,4730 BEQ RENCHK ; etc. not OK4735 ;4740 ;Line # is in range 0-32j}767--find new line number4745 ;4750 RENC54755 LDA FR0 ;Tell GETNEW4760 STA FLIN ; which line to4765 LDAk} FR0+1 ; search for4770 STA FLIN+14775 JSR GETNEW ;Get new line #4780 BCC RENC4 ;Successful??4785 ;479l}0 ;Line not found--print error message4795 ;4800 LDA #24 ;LINE #4805 JSR PRINT4810 LDA FLIN4815 STA FR04820 m} LDA FLIN+14825 STA FR0+14830 LDA #$004835 STA NUMIOCB ; (line # that4840 JSR PINT ; wasn't found)4845 Ln}DA #39 ;[use , and EOL]4850 LDX #25 ;REFERENCED IN4855 JSR RENERR ;(current line)4860 LDA #26 o};DOES NOT EXIST4865 JSR PRINT4870 JMP RENCHK ;See if more #s4875 ;4880 ;Line found--replace old line # with new linp}e #4885 ;4890 RENC44895 BIT RFLAG ;Don't store #4900 BMI RENCHK ; if CHECK use4905 JSR IFP ;Convert q}to BCD4910 CLD4915 CLC ;Specify where4920 LDA RENOFF ; to store the4925 ADC PTR2 ; f.p. numberr}4930 STA FLPTR4935 LDA PTR2+14940 ADC #04945 STA FLPTR+14950 JSR FST0P ;Store f.p. #4955 CLD4960 ;4965 ;Los}op if comma, exit otherwise4970 ;4975 RENCHK4980 LDY RENY ;Restore index4985 LDA RENTMP ;Return if not4990 t}CMP #18 ; comma4995 BNE RENR25000 JMP RENGO ;else continue5005 RENR25010 RTS5015 ;5020 ;Data section fou}r RENSUB5025 ;5030 RENY .BYTE 05035 RENTMP .BYTE 05040 RENOFF .BYTE 05045 RFLAG .BYTE 05050 RTOKN .BYTE 05055 .PAGE "v}GETNEW--get new line number for FLIN"5060 ;******************************5065 ;** GETNEW **5070 ;*******w}***********************5075 ;5080 GETNEW5085 LDA STMTAB ;Set PTR to5090 STA PTR ; start of5095 LDA STMTABx}+1 ; program5100 STA PTR+15105 ;5110 LDA NUM1 ;Set new line #5115 STA FR0 ; to the new5120 LDA NUM1y}+1 ; starting line5125 STA FR0+15130 ;5135 GETL15140 LDY #1 ;Loop if line #5145 LDA (PTR),Y ; is lesz}s than5150 CMP FLIN+1 ; FLIN, return5155 BCC GETL1END ; with carry5160 BEQ GETC1 ; flag set if5165 RTS {} ; greater5170 ;5175 GETC15180 DEY ;If line # and5185 LDA (PTR),Y ; FLIN equal,5190 CMP FLI|}N ; return new5195 BCC GETL1END ; line number5200 BEQ GETFOUND5205 RTS5210 ;5215 ;Found line--return with c}}arry clear and line # in FR05220 ;5225 GETFOUND5230 CLC5235 RTS5240 ;5245 ;Loop for next line5250 ;5255 GETL1END52~}60 CLC ;Bump new line #5265 LDA FR0 ; by adding the5270 ADC NUM2 ; increment in5275 STA FR0 } ; NUM2 to FR05280 LDA FR0+15285 ADC NUM2+15290 STA FR0+15295 ;5300 LDY #2 ;Bump PTR to5305 LDA (PT}R),Y ; next line5310 CLC5315 ADC PTR5320 STA PTR5325 BCC GETADD ;Saves 2 bytes5330 INC PTR+15335 GETADD53}40 JMP GETL15345 ;5350 ;Data section for GETNEW5355 ;5360 FLIN .WORD 05365 .PAGE "CHECK--check program for line #s and} syntax errors"5370 ;******************************5375 ;** CHECK **5380 ;*****************************}*5385 ;5390 CHECK5395 LDA #$FF ;Set RENSUB flag5400 STA RFLAG ; for checking5405 ;5410 LDA #RENSUB&$FF ;}Check for line5415 STA LINEPTR ; numbers that5420 LDA #RENSUB/256 ; do not exist5425 STA LINEPTR+1 ; and line }no.5430 JSR LINES ; expressions5435 ;5440 LDA #CHSUB&$FF ;Check for lines5445 STA LINEPTR ; which start545}0 LDA #CHSUB/256 ; with ERROR -5455 STA LINEPTR+1 ; and INPUT by5460 JSR LINES ; itself5465 ;5470 RTS5475 }.PAGE "CHSUB--check statement for syntax errors"5480 ;******************************5485 ;** CHSUB **54}90 ;******************************5495 ;5500 CHSUB5505 LDA #0 ;Reset last5510 STA CHSYM ; token to 05515} JSR TOKEN ;Get command5520 CMP #55 ;Go if syntax5525 BEQ GARBAGE ; error in line5530 CMP #2 ;}Check further5535 BEQ CINPUT ; if INPUT stmt5540 RTS ;Else return5545 ;5550 ;Check INPUT statement for }variable name5555 ;5560 CINPUT5565 JSR TOKEN ;Loop to get the5570 LDX #10 ; last symbol5575 CMP #20 } ; after the5580 BEQ CHTEST ; INPUT command5585 CMP #22 ; & before the5590 BEQ CHTEST ; end of stm}t.5595 STA CHSYM5600 JMP CINPUT5605 CHTEST5610 LDA CHSYM ;If last token5615 AND #$80 ; not variable,562}0 BEQ CHERR ; signal error5625 RTS ;Else return5630 GARBAGE5635 LDX #28 ;SYNTAX ERROR...5640 C}HERR5645 LDA #27 ;Print message5650 JSR RENERR ; and line no.5655 CHRET5660 RTS5665 ;5670 CHSYM .BYTE 0}5675 .PAGE "OUTPUT--determine which file receives printing"5680 ;******************************5685 ;** OUTPUT } **5690 ;******************************5695 ;5700 OUTPUT5705 LDX #$50 ;Close IOCB #55710 LDA #CLOSE ; } in case it5715 STA ICCMD,X ; was open5720 JSR CIOV5725 LDA #0 ;Printing will5730 STA IOCB ; go to} screen5735 LDA #4 ;Print 4 columns5740 STA XMAX ; per line5745 ;5750 LDA #40 ;Ask for new5755 } JSR PRINT ; output file5760 ;5765 LDA #40 ;Get a line of5770 JSR INPUT ; input in BUF5775 BPL OUTC}1 ;Go if no error5780 ;5785 ;Screen Editor error--check for truncated record5790 ;5795 CPY #137 ;Check for li}ne5800 BNE OUTR1 ; too long --5805 LDA #6 ; print message5810 JSR PRINT ; if so5815 OUTR15820 R}TS ;Return to menu5825 ;5830 ;No Editor errors--check for RETURN or E:5835 ;5840 OUTC15845 LDA BUF ;G}et first char5850 STA FILE ;Save device5855 CMP #155 ;Default to the5860 BEQ OUTCONT ; screen for5865 } CMP #'E ; empty line5870 BEQ OUTCONT ; or E:5875 ;5880 ;Must be file other than Editor5885 ;5890 CMP #'C } ;Check for tape5895 BNE OUTGO ; recorder5900 LDA #35 ;If tape, use5905 STA 53775 ; these POKE}s5910 LDA #40 ; to avoid the5915 STA 53768 ; wrong tone on5920 LDA #0 ; the header5925 STA 537}645930 STA 537665935 LDA #2555940 STA 537735945 ;5950 OUTGO5955 LDX #$50 ;Use IOCB #55960 LDA #OPEN ;C}ommand = OPEN5965 STA ICCMD,X5970 LDA #BUF&$FF ;Address of the5975 STA ICBAL,X ; filename is5980 LDA #BUF/256 } ; BUF--length5985 STA ICBAH,X ; is not needed5990 LDA #8 ;Open for output5995 STA ICAX1,X6000 LDA #060}05 STA ICAX2,X6010 JSR CIOV ;Open file--and6015 BPL OUTCONT2 ; check errors6020 ;6025 ;Can't open file--print} message6030 ;6035 LDA #11 ;Return with6040 JSR PRINT ; output sent6045 RTS ; to screen6050 };6055 ;Return6060 ;6065 OUTCONT26070 LDA FILE ;If cassette,6075 CMP #'C ; stop motor6080 BNE OUTCONT3}6085 LDA #60 ;Turn cassette6090 STA 54018 ; motor OFF6095 LDA #$A0 ;Turn sound off6100 STA $D201 } ; without6105 STA $D203 ; changing6110 STA $D205 ; FSK tones6115 STA $D2076120 ;6125 OUTCONT36130 L}DA #$50 ;Successful6135 STA IOCB ; attempt!!6140 LDA #10 ;Set 10 columns6145 STA XMAX ; per }line6150 OUTCONT6155 RTS6160 ;6165 FILE .BYTE 0 ;Device name6170 .PAGE "BASIC and DOS--go to BASIC or the DOS menu"}6175 ;******************************6180 ;** BASIC and DOS **6185 ;******************************6190 ;6195 B}ASIC6200 PLA ;Remove menu6205 PLA ; return addr6210 JSR RESTORE ;Restore machine6215 RTS } ;Return to BASIC6220 ;6225 ;6230 ;6235 DOS6240 PLA ;Remove menu6245 PLA ; return addr}6250 JSR RESTORE ;Restore machine6255 JMP (OLDDOS) ;Go to DOS menu6260 .PAGE "RESTORE--restore registers and point}ers"6265 ;******************************6270 ;** RESTORE **6275 ;******************************6280 ;62}85 RESTORE6290 LDX #$50 ;Close IOCB #56295 LDA #CLOSE6300 STA ICCMD,X6305 JSR CIOV6310 ;6315 LDA #$00 };Reset printing6320 STA IOCB ; file6325 ;6330 LDA #4 ;Reset columns6335 STA XMAX ; per line to 4}6340 ;6345 LDA #$FF ;Reset numeric6350 STA NUMIOCB ; printing file6355 ;6360 LDA SPTR ;Restore zero-}6365 STA PTR ; page pointers6370 LDA SPTR+1 ; PTR and PTR26375 STA PTR+16380 LDA SPTR26385 STA PTR2639}0 LDA SPTR2+16395 STA PTR2+16400 ;6405 LDA SADDR ;Restore Screen6410 STA ICBAL ; Editor buffer6415 LDA S}ADDR+1 ; address and6420 STA ICBAH ; length6425 LDA SLEN6430 STA ICBLL6435 LDA SLEN+16440 STA ICBAH6445 };6450 LDX SX ;Restore index6455 LDY SY ; registers6460 ;6465 LDA #$00 ;Reset INUSE6470 STA IN}USE ; flag6475 ;6480 LDA SFLAGS ;Restore the6485 PHA ; accumulator6490 LDA SA ; and fla}gs6495 PLP6500 RTS ; and return6505 .PAGE "INPUT--call Screen Editor for input line"6510 ;****************}**************6515 ;** INPUT **6520 ;******************************6525 ;6530 INPUT6535 LDX #$00 } ;Screen Editor6540 STA ICBLL ;Maximum length6545 STX ICBLH ; of input line6550 LDA #GETREC ;Command = }GET6555 STA ICCMD ; RECORD6560 LDA #BUF&$FF ;Address of6565 STA ICBAL ; data buffer6570 LDA #BUF/25665}75 STA ICBAH6580 JSR CIOV ;Call Editor6585 ;6590 ;Now mask inverse video and6595 ; lower case input6600 ;6605 } PHP ;Save registers6610 PHA ; altered by6615 TXA ; routine6620 PHA6625 LDX #3966}30 MLOOP6635 LDA BUF,X ;Get character6640 CMP #155 ;Leave alone if6645 BEQ MSTOR ; RETURN char.6650 }AND #$7F ;Mask inverse6655 CMP #'a ;If lower case,6660 BCC MSTOR ; change to6665 CMP #'z+1 ; u}pper case6670 BCS MSTOR ; by setting6675 AND #$FF-$20 ; bit 5 to 06680 MSTOR6685 STA BUF,X ;Store charac}ter6690 DEX ;Loop for buffer6695 BPL MLOOP6700 PLA ;Restore the6705 TAX ; contents }of6710 PLA ; registers6715 PLP ; altered6720 RTS ; and return6725 ;6730 ;6735 EN}D = *6740 .ENDE ;Restore machine6255 JMP (OLDDOS) ;Go to DOS menu6260 .PAGE "RESTORE--restore registers and pointAPX-20177BASIC/XATHOMAS D. NEWTON12/07/820 " NAMING PROCESS COMPLETEDD2:TITLE! INPUT MASTER DISK TO N/