@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED256 FREE SECTORS COPYING---D8:EXAMPLE7.ACTl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 144ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8;uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8;u''xXL( LinkLine/800V.041486 (c)1986 Antic Publishing Written by Patrick Bass Receiving Working T} Transmitting READY>򡠜(|)PBJKL(E:D(E VP B D'EWHI V &U}B JKL)R1:D(E V $B JKL()R1:$D)E VP BD'E HI V F,P BlD'E HV}I V ,L5)D1:)*~):)):"`BJKzD)E V 0#`BJK}D)E V0`P BD'EHW}I V`08~):H):A`BJKzD)E VAP BD'EHI VL*`BJX}K}D)E V0A*+(` BD(EHI Vii8` B JKL*R1:D*E VY} (BJKL+R:D+E V0((( BD(EHI V( BD(EHI VZ}ii8++( BD(EHI V B V`F,A- B JKL^,R1:ZD,E V [}(BJKL,R1:D,E V+ BD'EHI V ,+'+ ΢ B V`' P BD'EH\}I V`+LL-SL-DL/ `+})0 )0 h-` BB-=. VP BvD'EHI V]} *``BD'EHI V0$'iiiiLh-`+}) - *` B V0`^}0P B`D'E HI V B JKL'.R1:#D.E V (B>.9/JKLL.R1:HD.E V_} BD'EHI V䭜'ۢ BݝD-EHI V BޝD-EHI V BD'EHI V`}'iiii8----- -Ш B V`+})0:// p/0 h-` B VPa} BvD'EHI V *`~):)):"`BJKzD)E V 0#`BJK}D)E V0`P Bb}D'EHI V`'*`~):)):"`BJKzD)E V 0#`BJK}D)E V0`P B`hN N6*O*m - ЭЭм!"ҍ¼.A// Bg?<JNA m"m -So Q m d}-SBQ(m)M*mN lHhN\X/,?,N\?<N ?<A?<NAXNuNV/ /<`?<HN \)@NNh0,gN e}$&_N^NuNuNVNHlTHlTHlTHlTN d9@2HlVHl2HlN Hl?<N \BlBl,N^NuNVHlJ?<N \9@* l*fN f}6 l*fNbHl?<N\9@" l"f9|N^NuNVHlN?<N\Bl<`Rl< lN m} X?,2N TN^NuNV?,2N TBgHl?<N nX?,2N .TN^NuNV?, n}2N DT?<NTN?,2N TN^NuNV?<?<N X9@H lHf?<?<NX9@F?<?<NX9@D0<DlF9@$Bl(` o}?<?<NX l(Rl(0,(l$m9l(&N^NuNV?<?<?<Nv\ nf?<S?<?<NZ\ nf?<L?<?<N p}>\ nf?<D?<?<N"\BlT`6ATH|\gATH??<?<N\RlTATH|nBlT`$0,T q}RlTAH??<?<N\ATH|n?< ?<?<N\N^NuNVHl?<N8\?,2N(TNN^NuNV?<NTN r}0NN^NuNV0,$H9@BlT`BlR`~0,TlR lARB, lTn(Hl0,T|??<?,2N `( s}Hl0,T||??<?,2N RlR lRm|RlT0,T2,RAAm`N^Nu)IJ)JF"/0<NB"lJ$lFNu t}  u} v}NV9n0.| A" AA-H=|` n w}R2.AH0Rn nm/,N.X0,N^NuNVA)HA)HA)HA)HA)HA)HA)H?< NXT9 x}l0,N^NuNV?<NN4X9@~g0<`0<N^NuNV?.?<LNXN^NuNV/ A {}&H`0+ |g/ N*X A"Ҽm?.NT&_N^NuNV/ &n/ NDXJ@g0<`00+ |g /+NXBk ?+ N,TJ@g |}0<`0<&_N^NuNVH&n0+ |f0<`.0+ |gV0+ |f0<`v0+ |g?<B?+ NhP?/+?+ NP @ }}f0<`@k 0Hѫ`$ k o?<0+D@H/?+ NP'@&Bk0<LN^NuNV nl <`?.?./. ?<BN ~} -@ m .`?<?.B?<BN` -@?<?.B?<BNF -@ nf .Ю -@ `$ nf .Ю -@ `0.g < }`b . oHn . /?.?<@N Bg?./. ?<BN ]|9@~g <` `Bl~ . N^NuNV/.?<IN\ }N^NuNVBn`&0.AN0nf0.ANBPRn nLmN^NuNV?>.=|0AN"HPgXHf0(>N^Nu)IJ)JF)_BNM }"lJ$lF/,BNu)IJ)JF)_BNA"lJ$lF/,BNu)IJ)JFHl)_.Hl." <sNB"lJ$lFNuNV)n2)n: .мZ)@>9|dBl9| } n 9PN n 0A)H2A)H:A)H>A)H6N^NuNV9|eBlBl9nNXN^NuNV9n 9|zBl9|9nN }0N^NuNV9|{BlBl9nNN^NuNV9n 9n Bn nR2.RnA|0f9|9|Sn0.9@9nN }N^NuNV`4 nH| f?< ?<NtX nRH??<N\X0. Sn J@fN^NuNV` nRH??<N.X0. Sn J@fN^Nu }NV` nRH??<NX0. Sn J@fN^NuNVH0&n $KA-H nf?./ N4\=n`L nf?./ N`\=n` }. nf?./ Np\=n`-KBn?.N$TJ@f`H| f |o@ H-@/./.?.?<@N* 9@~ }Hg0<`0,~n/./<?.?<@N 9@~ @g0<`tRnR -@`R ned` 6.ƼЃ$@ H-@/ }./.?.?<@N 9@~Hg0<`0,~nBl~0.L N^NuC22222222222C[1 }][ Welcome to LineLink/ST | v.0 }41286 ][ perform ]CJ[3][ Load:  } 8Bit->ST   Save:  ST->8Bit ][  }Load | Save ]C[3][ Enter the 8B }it file to load. ][ Select ]C[ }3][ Select the ST file to trans }fer. ][ Select ]C[3][ Select t }he new device:filename.ext ][ Se }lect ]C[3][ Want to transfer a }nother file?][ Yes | No ]CN[3][ } Enter the 8Bit drive and file  }mask. ][ Select ]C[3][ Thanks f }or using|LinkLine/ST|v.041286][ } Exit ])|}C"2"2 2"2"2"22"2"2" }22"2x9|NuCON:AUX:PRT:  2"2"2"22"2"2" <dX;D1:LINKDIR.M65nX;xALinkLine/800AX; NOW WITH SEND DIRECTORY X; TO STX;X; PASS>D1:SYSEQU.}M65>D1:IOMAC.LIB PASS!TOTALCODEENDCODESTARTCODEEIEK>D1:LINKDIRA.M65I ENDCODE"}, STARTCODE6EI@PASS!TOTALCODEENDCODESTARTCODEEIEK>D1:LINKDIRA.M65I ENDCODE"5#dX;D1:LINKA.M65nX;x"X; .INCLUDEd in D:LINKLINE.M65X; (C) 1986 Antic PublishingX; Written by Patrick BassX;} X; modified by James Nalewick X; 2/27/87X;X;Three MACROs."X;1) Signed, two-byte addition.X;example: BUMP COUN}TER,20X; BUMP ,Q  O>4 P  Q  O>5  P "X;,$X;2) SIGNED, TWO-BYTE SUBTRACTION6}X;EXAMPLE: DBUMP COUNTER,17@X;J DBUMP T;^Q h S>4 rP | Q  S>5  P X;#X;3) A "LOAD-W}ORD" construction. X;example: LDW LABLE,POINTERX; LDW  Q>5  P  Q>4 P X;#X;We decide wh}ere start will be.STARTCODE'&X;Rest of RAM for buffers.0TEXTBUFFERSTARTCODE :X;D X; Pointers down on page} zeroNXLENTEXTBUFF b!POINTER ;;generic pointerlTEXTPOINTER vX;X;Early ConstantsSEDITOR;;}screen editorEDITOR;;char editorDISK;;disk dirveSERIAL;;RS232KEYBOARD;;the keyboardREAD;;o}pen file for read DIRECTORY;; 6 for DOS 2.0PRINTER;;!WRITE;;open file for writeEOL;;8-Bit END OF LI}NECR ;;ST RETURNSTX;;Start of TextETX;;End of Text"BAUD ;;13=4800 baud, 14=9600 (TVEDITOR;;EDITO}R too long to writeCOLOR1;;Shadows COLOR2;:*COLOR44X;>X;The program starts here.HX;RX;\STAR}TCODEf-p=z$>B.!SUBMISSIONX;&X;---------------------------------X;Strings for the screen. AMESS} A A ALinkLine/800A=EOL AV.041486 (c)1986 A AAntic PublishingA=EOL A Written by A APatr}ick BassA=EOLAMESSLEN AMESS RMESS EOL=A Receiving A$RMESSLEN RMESS. WMESS8 EOL=A Working ABWME}SSLEN WMESSL TMESSV EOL=A Transmitting A`TMESSLEN TMESSj REMESSt EOL=A READYA=EOL=A>A~REMESSLEN }REMESS ERRMESS EOL=AAERRMESSLEN ERRMESSX;X;Small Buffers INBUFF  OUTBUFF }X;%X;--------------------------------X;Code Entry PointX;Open channel TV to screen X;New colors black on white}.X;Title to TV screen. X;MAIN:(X;Print READY message.2X;Get new command.<X;Decode, act on command.FX;loop back t}o MAINPX;ZSUBMISSIONdOPEN TV=WRITE==AE:AnQ>x PCOLOR4 PCOLOR2Q> PCOLOR1BPUT TV=AMESS=AM}ESSLENX; XIO &=SERIAL= ==AR1:A#XIO $=SERIAL=BAUD==AR1:A%X;--------------------------------MAIN} BPUT TV=REMESS=REMESSLEN GETCOMMANDX;BPUT TV=WMESS=WMESSLEN DECODEX; !MAIN"X;,%X;----------}----------------------6 DFILENAME@ AD1:AJ FILENAMET  ^X;h#X;A routine to open a disk file.rX;| OPENFILE"}X;Determine if the person typed!X;in the disk drive specifier.X;If so, branch to OPENF1X;QFILENAMER> : F}OPENF1X;QFILENAMER> : FOPENF1X;!X;Otherwise assume they didn'tX;and use the default drive.X;#O}PEN DISK=READ==DFILENAME& IOPENF20 GOPENF3: OPENF1D!X;Use the drive spec the humanN X;gave us.XX;b"OPEN DI}SK=READ==FILENAMEl OPENF2v GOPENF3X;X;Return a positive zero ifX;file opened OKX;Q>: OPENF3!}X;Otherwise print a Disk Error!X;message and return negative.X;"BPUT TV=ERRMESS=ERRMESSLENQ>:X; %X;--}------------------------------$X;A routine to write a disk file. X;* WRITEFILE4X;Point to TEXTBUFFER>!LDW TEXTBUF}FER=TEXTPOINTERHX;R X; And since we'll count down\ X;through zero, bump the filefX; count down by one.pX;zDBUMP }LENTEXTBUFF=X;!X; Check if the juman typed inX; the drive specifier."X; Branch to WRIT1 if they did.X;QFI}LENAMER> : FWRIT1QFILENAMER> : FWRIT1X;X;Otherwise use thedefault X; FileSpec supplied. X; $}OPEN DISK=WRITE==DFILENAME$ IWRIT2. "BPUT TV=ERRMESS=ERRMESSLEN8 !WRITXB WRIT1L #OPEN DISK=WRITE==FI}LENAMEV GWRITX` WRIT2j !X; Write file in TEXTBUFFER tot X; the disk char by char.~ X; %> Q@TEXTPOINTER7 POUTB}UFF BPUT DISK=OUTBUFF= BUMP TEXTPOINTER= DBUMP LENTEXTBUFF= EWRIT2 WRITX : X; "X;-----------}------------------ X; Reply to the ST X; SENDANSWER !OPEN SERIAL=BAUD==AR1:A XIO (=SERIAL===AR:A( !}LDW TEXTBUFFER=TEXTPOINTER2 X;< !X; Send the STX header and theF "X; LO, HI bytes of the file lenP X;Z Q>STXd POUTB}UFFn QLENTEXTBUFFx POUTBUFF QLENTEXTBUFF POUTBUFF BPUT SERIAL=OUTBUFF= X; SENDRS232CHAR X;S}end the file out the RS232 X;char by char. X; %> Q@TEXTPOINTER7 POUTBUFF BPUT SERIAL=OUTBUFF= BUMP }TEXTPOINTER= DBUMP LENTEXTBUFF= ESENDRS232CHAR X;" !X;When finished, send the ETX., X;6 Q>ETX@ POUTBUFFJ }BPUT SERIAL=OUTBUFF=T X;^ CLOSE SERIALh :r X;| %X;-------------------------------- COMBUFFINDEX   COM}BUFF   $X;- - - - - - - - - - - - - - - - X;Accept command from ST. X; GETCOMMAND !OPEN SERIAL=BAUD==AR}1:A XIO (=SERIAL===AR1:A $> GETL1 X; !X;Accept any character and put "X; into COMBUFF until CR found. }X;& &COMBUFFINDEX0 BGET SERIAL=INBUFF=: PCOMMANDD $COMBUFFINDEXN QINBUFFX PCOMBUFF9b 2l R>CRv HGETL1} X; CLOSE SERIAL : X; $X;- - - - - - - - - - - - - - - - PCOMMAND "X;Print alphanumeric characters X;in comm}and buffer. X; QINBUFF;;Get char R> ;;Less than 32? DPCOMX;;Branch if yes. X; BPUT TV=INBUFF= PCOMX }: X;* $X;-------------------------------4 X;Decide what the ST wants.> X;H DECODER $>\ DECO1f QCOMBUFF9p R> L;};ST want LOAD?z HDECO2;;branch if not. X; !LOAD;;Else LOAD file. DECO2 R> S;;ST want SAVE? HDECO3;;branch if n}ot. X; !SAVE;;Else SAVE file. X; DECO3 R> D;;ST want DIR? HDECO4;; branch if not X; !DIR X; DECO4 }2;;point to next (> ;;at 32 yet? DDECO1;;branch if less. X; :X;$X;-------------------------------X;Open and} load a disk file.$X;.LOAD82;;point at nameB%>;;new index.L DOLO1VX;Transfer command filename`X;into FILENAM}E buffer.jX;t QCOMBUFF9~PFILENAME823)>;;branch/error. DDOLO1X;X; Point at TEXTBUFFER....X; Rese}t file length.X;!LDW TEXTBUFFER=TEXTPOINTERLDW =LENTEXTBUFF OPENFILEGDOLO2;;branch/errorX;  RE}ADFILE DOLO2CLOSE DISK(BPUT TV=TMESS=TMESSLEN2 SENDANSWER<:FX;P$X;-------------------------------Z }READFILEdBGET DISK=INBUFF=n GRFIL2xX;%> QINBUFFP@TEXTPOINTER7BUMP TEXTPOINTER=BUMP LENT}EXTBUFF= !READFILE RFIL2:X;$X;-------------------------------X;Open/write a disk file.X;SAVE2}%> SAVE1" QCOMBUFF9,PFILENAME862@3J)>T DSAVE1^X;h GETFILEr WRITEFILE| SAVE2CLOSE DISK}LDW =LENTEXTBUFF!LDW TEXTBUFFER=TEXTPOINTER:X;$X;------------------------------- LENTRANS =$X;-} - - - - - - - - - - - - - - -X;Wait for STX,file len, getX;file, split.X; GETFILELDW =LENTEXTBUFF!LD}W TEXTBUFFER=TEXTPOINTERBPUT TV=RMESS=RMESSLEN&!OPEN SERIAL=BAUD==AR1:A0 XIO (=SERIAL===AR1:A: }GETSTXDBGET SERIAL=INBUFF=N QINBUFFX R>STXb HGETSTXlX;vBGET SERIAL=LENTRANS=!BGET SERIAL=LENTRA}NS=GETRS232CHARBGET SERIAL=INBUFF=%> QINBUFFP@TEXTPOINTER7BUMP TEXTPOINTER=BUMP L}ENTEXTBUFF=DBUMP LENTRANS= QLENTRANSLLENTRANSHGETRS232CHARX;CLOSE SERIAL :X;4$X;------}------------------------->$X; Open and load a Disk directoryHX;RDIR\2;;Point at namef%>;;NEW INDEXp DOLO3zX; }transfer command filenameX; into FILENAME buffer.X; QCOMBUFF9PFILENAME823)>;; untill 32 chars DDOL}O3X;X; Point at TEXTBUFFER...X; Reset file length.X;!LDW TEXTBUFFER=TEXTPOINTERLDW =LENTEXTBUFF }OPENDIRGDOLO4;; branch/error$X;. READFILE8 DOLO4BCLOSE DISKLBPUT TV=TMESS=TMESSLENV SENDANSWER`:}jX;!X;----------------------------X;#X; A routine to open a disk dir.X; OPENDIR#X;Determine if the persion t}yped"X; in the disk drive specifier.X; If so, branch to OPENF1X;QFILENAMER> : FOPEND1X; QFILENAME}R> : FOPEND1(X;2"X; Otherwise assume they didn't< X; and use the default drive.FX;P(OPEN DISK=DIRECTORY=}=DFILENAMEZ IOPEND2d GOPEND3n OPEND1x"X; Use the drive spec the humanX; gave us.'OPEN DISK=DIRECTORY==FIL}ENAME OPEND2 GOPEND3X;X; Return a positive zero ifX; file opened OKX;Q>: OPEND3"X; Otherwise p}rint a Disk Error"X; message and return negative.X;"BPUT TV=ERRMESS=ERRMESSLENQ>":,X;6$X;--------------}-----------------"X; message and return negative.X;"BPUT TV=ERRMESS=ERRMESSLENQ>":,X;6$X;--------------0100 ;D1:LINKDIR.M650110 ;0120 .TITLE "LinkLine/800"0130 ; NOW WITH SEND DIRECTORY0140 ; TO ST0150 ;0160 ;0170 } .IF PASS=00180 .INCLUDE #D1:SYSEQU.M650190 .INCLUDE #D1:IOMAC.LIB0200 .ENDIF 0210 PASS = 10220 TOT}ALCODE = ENDCODE-STARTCODE0230 .OPT NO LIST0240 .OPT NO MLIST0250 .PAGE 0260 .INCLUDE #D1:LINKDIRA.M6502}70 .OPT LIST0280 ENDCODE0290 *= $02E00300 .WORD STARTCODE0310 .OPT NO LIST0320 .END INKDIRA.M6502o0100 ;D1:LINKA.M650110 ;0120 ; .INCLUDEd in D:LINKLINE.M650130 ; (C) 1986 Antic Publishing0140 ; Written by Patrick Bass}0141 ;0142 ; modified by James Nalewick0143 ; 2/27/870150 ;0160 ;Three MACROs.0170 ;1) Signed, two-byte addition.0180 };example: BUMP COUNTER,200190 ;0200 .MACRO BUMP 0210 CLC 0220 LDA %10230 ADC # <%20240 STA %10250 } LDA %1+10260 ADC # >%20270 STA %1+10280 .ENDM 0290 ;0300 ;2) SIGNED, TWO-BYTE SUBTRACTION0310 ;EXAMPLE:} DBUMP COUNTER,170320 ;0330 .MACRO DBUMP 0340 SEC 0350 LDA %10360 SBC # <%20370 STA %10380 LDA} %1+10390 SBC # >%20400 STA %1+10410 .ENDM 0420 ;0430 ;3) A "LOAD-WORD" construction.0440 ;example: LDW LA}BLE,POINTER0450 ;0460 .MACRO LDW 0470 LDA # >%10480 STA %2+10490 LDA # <%10500 STA %20510 .END}M 0520 ;0530 ;We decide where start will be.0540 STARTCODE = $27000550 ;Rest of RAM for buffers.0560 TEXTBUFFER = STARTC}ODE+$09000570 ;0580 ; Pointers down on page zero0590 *= $800600 LENTEXTBUFF *= *+20610 POINTER *= *+2 ;generic poi}nter0620 TEXTPOINTER *= *+20630 ;0640 ;Early Constants0650 SEDITOR = 0 ;screen editor0660 EDITOR = 5 ;char edit}or0670 DISK = 6 ;disk dirve0680 SERIAL = 2 ;RS2320690 KEYBOARD = 1 ;the keyboard0700 READ = 4 ;open} file for read0705 DIRECTORY = 7 ; 6 for DOS 2.00710 PRINTER = 4 ;0720 WRITE = 8 ;open file for write0730 EOL} = 155 ;8-Bit END OF LINE0740 CR = 13 ;ST RETURN0750 STX = 2 ;Start of Text0760 ETX = 3 ;End} of Text0770 BAUD = 13 ;13=4800 baud, 14=96000780 TV = EDITOR ;EDITOR too long to write0790 COLOR1 = $02C5 ;Sha}dows0800 COLOR2 = $02C6 :0810 COLOR4 = $02C80820 ;0830 ;The program starts here.0840 ;0850 ;0860 *= STARTCODE08}70 CLD 0880 SEI 0890 LDX #$FC0900 TXS 0910 CLI 0920 JMP SUBMISSION0930 ;0940 ;----------------}-----------------0950 ;Strings for the screen.0960 AMESS0970 .BYTE " "0980 .BYTE "LinkLine/800",EOL099}0 .BYTE "V.041486 (c)1986 "1000 .BYTE "Antic Publishing",EOL1010 .BYTE " Written by "1020 .BYTE "Patri}ck Bass",EOL1030 AMESSLEN = *-AMESS1040 RMESS1050 .BYTE EOL," Receiving "1060 RMESSLEN = *-RMESS1070 WMESS1080 }.BYTE EOL," Working "1090 WMESSLEN = *-WMESS1100 TMESS1110 .BYTE EOL," Transmitting "1120 TMESSLEN = *-TMESS1130 REM}ESS1140 .BYTE EOL," READY",EOL,">"1150 REMESSLEN = *-REMESS1160 ERRMESS1170 .BYTE EOL,""1180 ERRMES}SLEN = *-ERRMESS1190 ;1200 ;Small Buffers1210 INBUFF1220 *= *+1281230 OUTBUFF1240 *= *+1281250 ;1260 ;-----}---------------------------1270 ;Code Entry Point1280 ;Open channel TV to screen1290 ;New colors black on white.1300 ;Tit}le to TV screen.1310 ;MAIN:1320 ;Print READY message.1330 ;Get new command.1340 ;Decode, act on command.1350 ;loop back }to MAIN1360 ;1370 SUBMISSION1380 OPEN TV,WRITE,0,"E:"1390 LDA #81400 STA COLOR41410 STA COLOR21420 } LDA #21430 STA COLOR11440 BPUT TV,AMESS,AMESSLEN1450 ;1460 XIO 38,SERIAL,32,0,"R1:"1470 XIO 36,}SERIAL,BAUD,0,"R1:"1480 ;--------------------------------1490 MAIN1500 BPUT TV,REMESS,REMESSLEN1510 JSR GETCOMM}AND1520 ;1530 BPUT TV,WMESS,WMESSLEN1540 JSR DECODE1550 ;1560 JMP MAIN1570 ;1580 ;----------------------}----------1590 DFILENAME1600 .BYTE "D1:"1610 FILENAME1620 *= *+321630 ;1640 ;A routine to open a disk file.16}50 ;1660 OPENFILE1670 ;Determine if the person typed1680 ;in the disk drive specifier.1690 ;If so, branch to OPENF11700 };1710 LDA FILENAME+11720 CMP #':1730 BEQ OPENF11740 ;1750 LDA FILENAME+21760 CMP #':1770 BEQ O}PENF11780 ;1790 ;Otherwise assume they didn't1800 ;and use the default drive.1810 ;1820 OPEN DISK,READ,0,DFILENAME}1830 BPL OPENF21840 BMI OPENF31850 OPENF11860 ;Use the drive spec the human1870 ;gave us.1880 ;1890 OPEN  } DISK,READ,0,FILENAME1900 OPENF21910 BMI OPENF31920 ;1930 ;Return a positive zero if1940 ;file opened OK1950 ;1960 } LDA #$001970 RTS 1980 OPENF31990 ;Otherwise print a Disk Error2000 ;message and return negative.2010 ;2020  } BPUT TV,ERRMESS,ERRMESSLEN2030 LDA #$FF2040 RTS 2050 ;2060 ;--------------------------------2070 ;A routine t }o write a disk file.2080 ;2090 WRITEFILE2100 ;Point to TEXTBUFFER2110 LDW TEXTBUFFER,TEXTPOINTER2120 ;2130 ; And  }since we'll count down2140 ;through zero, bump the file2150 ; count down by one.2160 ;2170 DBUMP LENTEXTBUFF,12180} ;2190 ; Check if the juman typed in2200 ; the drive specifier.2210 ; Branch to WRIT1 if they did.2220 ;2230 LDA FIL}ENAME+12240 CMP #':2250 BEQ WRIT12260 LDA FILENAME+22270 CMP #':2280 BEQ WRIT12290 ;2300 ;Otherwis}e use thedefault2310 ; FileSpec supplied.2320 ;2330 OPEN DISK,WRITE,0,DFILENAME2340 BPL WRIT22350 BPUT T}V,ERRMESS,ERRMESSLEN2360 JMP WRITX2370 WRIT12380 OPEN DISK,WRITE,0,FILENAME2390 BMI WRITX2400 WRIT22410 ;} Write file in TEXTBUFFER to2420 ; the disk char by char.2430 ;2440 LDY #02450 LDA (TEXTPOINTER),Y2460 STA O}UTBUFF2470 BPUT DISK,OUTBUFF,12480 BUMP TEXTPOINTER,12490 DBUMP LENTEXTBUFF,12500 BCS WRIT22510 WR}ITX2520 RTS 2530 ;2540 ;-----------------------------2550 ; Reply to the ST2560 ;2570 SENDANSWER2580 OPEN SE}RIAL,BAUD,0,"R1:"2590 XIO 40,SERIAL,0,0,"R:"2600 LDW TEXTBUFFER,TEXTPOINTER2610 ;2620 ; Send the STX header a}nd the2630 ; LO, HI bytes of the file len2640 ;2650 LDA #STX2660 STA OUTBUFF2670 LDA LENTEXTBUFF2680 ST}A OUTBUFF+12690 LDA LENTEXTBUFF+12700 STA OUTBUFF+22710 BPUT SERIAL,OUTBUFF,32720 ;2730 SENDRS232CHAR2740} ;Send the file out the RS2322750 ;char by char.2760 ;2770 LDY #02780 LDA (TEXTPOINTER),Y2790 STA OUTBUFF28}00 BPUT SERIAL,OUTBUFF,12810 BUMP TEXTPOINTER,12820 DBUMP LENTEXTBUFF,12830 BCS SENDRS232CHAR2840 ;}2850 ;When finished, send the ETX.2860 ;2870 LDA #ETX2880 STA OUTBUFF2890 BPUT SERIAL,OUTBUFF,12900 ;291}0 CLOSE SERIAL2920 RTS 2930 ;2940 ;--------------------------------2950 COMBUFFINDEX2960 .WORD 02970 COMB}UFF2980 *= *+1282990 ;- - - - - - - - - - - - - - - -3000 ;Accept command from ST.3010 ;3020 GETCOMMAND3030 O}PEN SERIAL,BAUD,0,"R1:"3040 XIO 40,SERIAL,0,0,"R1:"3050 LDX #03060 GETL13070 ;3080 ;Accept any character and }put3090 ; into COMBUFF until CR found.3100 ;3110 STX COMBUFFINDEX3120 BGET SERIAL,INBUFF,13130 JSR PCOMMAN}D3140 LDX COMBUFFINDEX3150 LDA INBUFF3160 STA COMBUFF,X3170 INX 3180 CMP #CR3190 BNE GETL13200 } ;3210 CLOSE SERIAL3220 RTS 3230 ;3240 ;- - - - - - - - - - - - - - - -3250 PCOMMAND3260 ;Print alphanumeric !}characters3270 ;in command buffer.3280 ;3290 LDA INBUFF ;Get char3300 CMP #$20 ;Less than 32?3310 BCC PC"}OMX ;Branch if yes.3320 ;3330 BPUT TV,INBUFF,13340 PCOMX3350 RTS 3360 ;3370 ;------------------------------#}-3380 ;Decide what the ST wants.3390 ;3400 DECODE3410 LDX #03420 DECO13430 LDA COMBUFF,X3440 CMP #'L ;$}ST want LOAD?3450 BNE DECO2 ;branch if not.3460 ;3470 JMP LOAD ;Else LOAD file.3480 DECO23490 CMP #'S %} ;ST want SAVE?3500 BNE DECO3 ;branch if not.3510 ;3520 JMP SAVE ;Else SAVE file.3521 ;3522 DECO33523 &} CMP #'D ;ST want DIR?3524 BNE DECO4 ; branch if not3525 ;3526 JMP DIR3527 ;3530 DECO43540 INX '} ;point to next3550 CPX #32 ;at 32 yet?3560 BCC DECO1 ;branch if less.3570 ;3580 RTS 3590 ;3600 ;--(}-----------------------------3610 ;Open and load a disk file.3620 ;3630 LOAD3640 INX ;point at name3650 )}LDY #0 ;new index.3660 DOLO13670 ;Transfer command filename3680 ;into FILENAME buffer.3690 ;3700 LDA COMBUFF,X*}3710 STA FILENAME,Y3720 INX 3730 INY 3740 CPY #20 ;branch/error.3750 BCC DOLO13760 ;3770 ; Poin+}t at TEXTBUFFER....3780 ; Reset file length.3790 ;3800 LDW TEXTBUFFER,TEXTPOINTER3810 LDW $00,LENTEXTBUFF382,}0 JSR OPENFILE3830 BMI DOLO2 ;branch/error3840 ;3850 JSR READFILE3860 DOLO23870 CLOSE DISK3880 -} BPUT TV,TMESS,TMESSLEN3890 JSR SENDANSWER3900 RTS 3910 ;3920 ;-------------------------------3930 READFILE394.}0 BGET DISK,INBUFF,13950 BMI RFIL23960 ;3970 LDY #03980 LDA INBUFF3990 STA (TEXTPOINTER),Y4000 /} BUMP TEXTPOINTER,14010 BUMP LENTEXTBUFF,14020 JMP READFILE4030 RFIL24040 RTS 4050 ;4060 ;------------0}-------------------4070 ;Open/write a disk file.4080 ;4090 SAVE4100 INX 4110 LDY #04120 SAVE14130 LDA COMB1}UFF,X4140 STA FILENAME,Y4150 INX 4160 INY 4170 CPY #204180 BCC SAVE14190 ;4200 JSR GETFILE4212}0 JSR WRITEFILE4220 SAVE24230 CLOSE DISK4240 LDW 0,LENTEXTBUFF4250 LDW TEXTBUFFER,TEXTPOINTER4260 3} RTS 4270 ;4280 ;-------------------------------4290 LENTRANS4300 .WORD 0,04310 ;- - - - - - - - - - - - - - - -4}4320 ;Wait for STX,file len, get4330 ;file, split.4340 ;4350 GETFILE4360 LDW 0,LENTEXTBUFF4370 LDW TEXTBUFFE5}R,TEXTPOINTER4380 BPUT TV,RMESS,RMESSLEN4390 OPEN SERIAL,BAUD,0,"R1:"4400 XIO 40,SERIAL,0,0,"R1:"4410 G6}ETSTX4420 BGET SERIAL,INBUFF,14430 LDA INBUFF4440 CMP #STX4450 BNE GETSTX4460 ;4470 BGET SERIAL7},LENTRANS,14480 BGET SERIAL,LENTRANS+1,14490 GETRS232CHAR4500 BGET SERIAL,INBUFF,14510 LDY #04520 LD8}A INBUFF4530 STA (TEXTPOINTER),Y4540 BUMP TEXTPOINTER,14550 BUMP LENTEXTBUFF,14560 DBUMP LENTRANS,19}4570 LDA LENTRANS4580 ORA LENTRANS+14590 BNE GETRS232CHAR4600 ;4610 CLOSE SERIAL4620 RTS 4630 ;:}4660 ;-------------------------------4670 ; Open and load a Disk directory4680 ;4690 DIR4700 INX ;Point at na;}me4710 LDY #0 ;NEW INDEX4720 DOLO34730 ; transfer command filename4740 ; into FILENAME buffer.4750 ;4760 L<}DA COMBUFF,X4770 STA FILENAME,Y4780 INX 4790 INY 4800 CPY #20 ; untill 32 chars4810 BCC DOLO348=}20 ;4830 ; Point at TEXTBUFFER...4840 ; Reset file length.4850 ;4860 LDW TEXTBUFFER,TEXTPOINTER4870 LDW $00,>}LENTEXTBUFF4880 JSR OPENDIR4890 BMI DOLO4 ; branch/error4900 ;4910 JSR READFILE4920 DOLO44930 CLOSE ?} DISK4940 BPUT TV,TMESS,TMESSLEN4950 JSR SENDANSWER4960 RTS 4970 ;5000 ;----------------------------5010 @};5020 ; A routine to open a disk dir.5030 ;5040 OPENDIR5050 ;Determine if the persion typed5060 ; in the disk drive specA}ifier.5070 ; If so, branch to OPENF15080 ;5090 LDA FILENAME+15100 CMP #':5110 BEQ OPEND15120 ;5130 LDAB} FILENAME+25140 CMP #':5150 BEQ OPEND15160 ;5170 ; Otherwise assume they didn't5180 ; and use the default drive.C}5190 ;5200 OPEN DISK,DIRECTORY,0,DFILENAME5210 BPL OPEND25220 BMI OPEND35230 OPEND15240 ; Use the drive sD}pec the human5250 ; gave us.5260 OPEN DISK,DIRECTORY,0,FILENAME5270 OPEND25280 BMI OPEND35290 ;5300 ; Return E}a positive zero if5310 ; file opened OK5320 ;5330 LDA #$005340 RTS 5350 OPEND35360 ; Otherwise print a Disk ErrF}or5370 ; message and return negative.5380 ;5390 BPUT TV,ERRMESS,ERRMESSLEN5400 LDA #$FF5410 RTS 5420 ;54G}30 ;-------------------------------e.5380 ;5390 BPUT TV,ERRMESS,ERRMESSLEN5400 LDA #$FF5410 RTS 5420 ;54$8<<  B JKIHiDiELV`L8 8 BLV`Lx!I}8t8l Lu8hihiHHȱȱL8c !#3`Lu8JJJJ`H 8h`H!J}ȩh Q8L8 Z8L8 8L8 8L8 8L8S:@9E:E9H '9 H9I9 8 '9h)0IC!K}9D9L8 L :::: :Lr:::IEL[::i:iIIL[:`:i::i!M}::L:`L{:w:w: C`L:L: D8:MEM.SAV: 8| 9 '9`L:L: D:DUP.SYS:̩ 8!N} x:ɀL: '9`88 |9Y:X: '9L); D8:DUP.SYS; 8::88 9 '98? :`;WL`; 9!O}Ln; ` :Y;Y;L;L;)} Setting Up ATARI 130XE Ram Disk; 9L; ; -9  !P} L;D8:; :9 :Y;L>8 ); form_alert(1, deva){}lert ); path[ 0 ]='D'; path[ 1 ]=':'; path[ 2 ]='*'; path[ 3 ]=0; fsel_input( path, filename, &button ); if( butto)|}n does_not_equal CANCEL )then begin v_hide_c( gem_handle ); send_command( SAVE ); send_file(); v_show_c( gem_)}}handle ); endif end /*-----------------------------------------------------------------*/ send_file() begin for( i=)~}0; i<10; i++ ) begin DELAY next Bconout( RS232, STX ); Bconout( RS232, lenlo ); Bconout( RS232, lenhi ); for()} file_index=0; file_index ERROR )then begin bytes_read=F)}read( file_handle, max_len, text_buffer ); endif Fclose( file_handle ); v_show_c( gem_handle); endif end )} /*--------------------------------------------------------------*/ write_the_file() begin v_hide_c( gem_handle ); file)}_handle=Fcreate( filename, 0 ); if( file_handle > ERROR )then begin Fwrite( file_handle, (long)bytes_read, text_buffe)}r ); endif Fclose( file_handle ); v_show_c( gem_handle); end /*--------------------------------------------------)}--------------*/ load_8Bit_file() begin v_hide_c( gem_handle ); send_command( LOAD ); get_file(); v_show_c( gem)}_handle ); end /*-----------------------------------------------------------------*/ get_file() begin do begin inc)}har=Bconin( RS232 ); repeat while( inchar does_not_equal STX ); lenlo=Bconin( RS232 ); lenhi=Bconin( RS232 ); by)}tes_to_read=(( 256*lenhi )+lenlo ); for( file_index=0; file_index0 ) begin if( path[ i ] does_not_equal '\\' )then begin Bconout( RS23)}2, path[ i ] ); endif i++; wend i=0; while( filename[ i ]>31 ) begin Bconout( RS232, filename[ i++ ] ); w)}end Bconout( RS232, CR ); end /*------------------------------------------------------------*/ terminate() begin fo)}rm_alert( 1, tksalert ); v_clsvwk( gem_handle ); appl_exit(); end /*-------------------------------------------------)}--------*/ load_8bit_dir() begin send_command( DIR ); get_file(); fill_dir(); end /*-----------------------------)}----------------------------*/ fill_dir() begin num_of_files=bytes_to_read/18; for(i=0;iD1:SYSEQU.M65>D1:IOMAC.LIB -}PASS!TOTALCODEENDCODESTARTCODEEIEK>D1:LINKD96A.M65I ENDCODE", STARTCODE6EI@,|''xXL( LinkLine/800V.041486 (c)1986 Antic Publishing Written by Patrick Bass Receiving Working 1} Transmitting READY>򡠜(|)PBJKL(E:D(E VP B D'EWHI V &1}B JKL)R1:D(E V $BJKL()R1:$D)E VP BD'E HI V F,P BlD'E H1}I V ,L5)D1:)*~):)):"`BJKzD)E V 0#`BJK}D)E V0`P BD'EH1}I V`08~):H):A`BJKzD)E VAP BD'EHI VL*`BJ1}K}D)E V0A*+(` BD(EHI Vii8` BJKL*R1:D*E V1} (BJKL+R:D+E V0((( BD(EHI V( BD(EHI V1}ii8++( BD(EHI V B V`F,A- BJKL^,R1:ZD,E V 1}(BJKL,R1:D,E V+ BD'EHI V ,+'+ ΢ B V`' P BD'EH1}I V`+LL-SL-DL/ `+})0 )0 h-` BB-=. VP BvD'EHI V1} *``BD'EHI V0$'iiiiLh-`+}) - *` B V0`1}0P B`D'E HI V BJKL'.R1:#D.E V (B>.9/JKLL.R1:HD.E V1} BD'EHI V䭜'ۢ BݝD-EHI V BޝD-EHI V BD'EHI V1}'iiii8----- -Ш B V`+})0:// p/0 h-` B VP1} BvD'EHI V *`~):)):"`BJKzD)E V 0#`BJK}D)E V0`P B1}D'EHI V`'*`~):)):"`BJKzD)E V 0#`BJK}D)E V0`P B0#dX;D1:LINKA.M65nX;x"X; .INCLUDEd in D:LINKLINE.M65X; (C) 1986 Antic PublishingX; Written by Patrick BassX;5}X;Three MACROs."X;1) Signed, two-byte addition.X;example: BUMP COUNTER,20X; BUMP ,Q  O>4 P 5} Q  O>5  P "X;,$X;2) SIGNED, TWO-BYTE SUBTRACTION6X;EXAMPLE: DBUMP COUNTER,17@X;J DBUMP T;^5}Q h S>4 rP | Q  S>5  P X;#X;3) A "LOAD-WORD" construction. X;example: LDW LABLE,POINTER5}X; LDW  Q>5  P  Q>4 P X;#X;We decide where start will be.STARTCODE'&X;Rest of RA5}M for buffers.0TEXTBUFFERSTARTCODE :X;D X; Pointers down on page zeroNXLENTEXTBUFF b!POINTER ;;g5}eneric pointerlTEXTPOINTER vX;X;Early ConstantsSEDITOR;;screen editorEDITOR;;char editorDISK5};;disk dirveSERIAL;;RS232KEYBOARD;;the keyboardREAD;;open file for read DIRECTORY;; 6 for DOS 2.05}PRINTER;;!WRITE;;open file for writeEOL;;8-Bit END OF LINECR ;;ST RETURNSTX;;Start of Text5}ETX;;End of Text"BAUD;;13=4800 baud, 14=9600 (TVEDITOR;;EDITOR too long to writeCOLOR1;;Shadows COLO5}R2;:*COLOR44X;>X;The program starts here.HX;RX;\STARTCODEf-p=z$>B.!SUBMISSIONX;5}&X;---------------------------------X;Strings for the screen. AMESS A A ALinkLine/800A=EOL AV.045}1486 (c)1986 A AAntic PublishingA=EOL A Written by A APatrick BassA=EOLAMESSLEN AMESS RMESS E5}OL=A Receiving A$RMESSLEN RMESS. WMESS8 EOL=A Working ABWMESSLEN WMESSL TMESSV EOL=A Transmitting A`5}TMESSLEN TMESSj REMESSt EOL=A READYA=EOL=A>A~REMESSLEN REMESS ERRMESS EOL=AAERRM5}ESSLEN ERRMESSX;X;Small Buffers INBUFF  OUTBUFF X;%X;--------------------------------X;C5}ode Entry PointX;Open channel TV to screen X;New colors black on white.X;Title to TV screen. X;MAIN:(X;Print READ5}Y message.2X;Get new command.<X;Decode, act on command.FX;loop back to MAINPX;ZSUBMISSIONdOPEN TV=WRITE==A5}E:AnQ>x PCOLOR4 PCOLOR2Q> PCOLOR1BPUT TV=AMESS=AMESSLENX; XIO &=SERIAL= ==AR1:A#XI5}O $=SERIAL=BAUD==AR1:A%X;--------------------------------MAIN BPUT TV=REMESS=REMESSLEN GETCOMMANDX;5}BPUT TV=WMESS=WMESSLEN DECODEX; !MAIN"X;,%X;--------------------------------6 DFILENAME@ AD1:AJ F5}ILENAMET  ^X;h#X;A routine to open a disk file.rX;| OPENFILE"X;Determine if the person typed!X;in the disk dr5}ive specifier.X;If so, branch to OPENF1X;QFILENAMER> : FOPENF1X;QFILENAMER> : FOPENF1X;5}!X;Otherwise assume they didn'tX;and use the default drive.X;#OPEN DISK=READ==DFILENAME& IOPENF20 GOPENF5}3: OPENF1D!X;Use the drive spec the humanN X;gave us.XX;b"OPEN DISK=READ==FILENAMEl OPENF2v GOPENF3X;5}X;Return a positive zero ifX;file opened OKX;Q>: OPENF3!X;Otherwise print a Disk Error!X;message and ret5}urn negative.X;"BPUT TV=ERRMESS=ERRMESSLENQ>:X; %X;--------------------------------$X;A routine to wr5}ite a disk file. X;* WRITEFILE4X;Point to TEXTBUFFER>!LDW TEXTBUFFER=TEXTPOINTERHX;R X; And since we'll count d5}own\ X;through zero, bump the filefX; count down by one.pX;zDBUMP LENTEXTBUFF=X;!X; Check if the juman typed5} inX; the drive specifier."X; Branch to WRIT1 if they did.X;QFILENAMER> : FWRIT1QFILENAMER> :5} FWRIT1X;X;Otherwise use thedefault X; FileSpec supplied. X; $OPEN DISK=WRITE==DFILENAME$ IWRIT2. "BP5}UT TV=ERRMESS=ERRMESSLEN8 !WRITXB WRIT1L #OPEN DISK=WRITE==FILENAMEV GWRITX` WRIT2j !X; Write file in TEXTB5}UFFER tot X; the disk char by char.~ X; %> Q@TEXTPOINTER7 POUTBUFF BPUT DISK=OUTBUFF= BUMP TEXTPOINT5}ER= DBUMP LENTEXTBUFF= EWRIT2 WRITX : X; "X;----------------------------- X; Reply to the ST X; SE5}NDANSWER !OPEN SERIAL=BAUD==AR1:A XIO (=SERIAL===AR:A( !LDW TEXTBUFFER=TEXTPOINTER2 X;< !X; Send the 5}STX header and theF "X; LO, HI bytes of the file lenP X;Z Q>STXd POUTBUFFn QLENTEXTBUFFx POUTBUFF QLENTEXTBUFF5} POUTBUFF BPUT SERIAL=OUTBUFF= X; SENDRS232CHAR X;Send the file out the RS232 X;char by char. X;5} %> Q@TEXTPOINTER7 POUTBUFF BPUT SERIAL=OUTBUFF= BUMP TEXTPOINTER= DBUMP LENTEXTBUFF= ESEND5}RS232CHAR X;" !X;When finished, send the ETX., X;6 Q>ETX@ POUTBUFFJ BPUT SERIAL=OUTBUFF=T X;^ CLOSE SERIAL5}h :r X;| %X;-------------------------------- COMBUFFINDEX   COMBUFF   $X;- - - - - - - - - - - - - - - - 5}X;Accept command from ST. X; GETCOMMAND !OPEN SERIAL=BAUD==AR1:A XIO (=SERIAL===AR1:A $> GETL5}1 X; !X;Accept any character and put "X; into COMBUFF until CR found. X;& &COMBUFFINDEX0 BGET SERIAL=INBUFF=: 5} PCOMMANDD $COMBUFFINDEXN QINBUFFX PCOMBUFF9b 2l R>CRv HGETL1 X; CLOSE SERIAL : X; $X;- - - - - - - 5}- - - - - - - - - PCOMMAND "X;Print alphanumeric characters X;in command buffer. X; QINBUFF;;Get char R> ;;Less5} than 32? DPCOMX;;Branch if yes. X; BPUT TV=INBUFF= PCOMX : X;* $X;-------------------------------4 X;De5}cide what the ST wants.> X;H DECODER $>\ DECO1f QCOMBUFF9p R> L;;ST want LOAD?z HDECO2;;branch if not. X; !5}LOAD;;Else LOAD file. DECO2 R> S;;ST want SAVE? HDECO3;;branch if not. X; !SAVE;;Else SAVE file. X; DECO3 5}R> D;;ST want DIR? HDECO4;; branch if not X; !DIR X; DECO4 2;;point to next (> ;;at 32 yet? DDECO1;;bra5}nch if less. X; :X;$X;-------------------------------X;Open and load a disk file.$X;.LOAD82;;point at name5}B%>;;new index.L DOLO1VX;Transfer command filename`X;into FILENAME buffer.jX;t QCOMBUFF9~PFILENAME8235})>;;branch/error. DDOLO1X;X; Point at TEXTBUFFER....X; Reset file length.X;!LDW TEXTBUFFER=TEXTPOINT5}ERLDW =LENTEXTBUFF OPENFILEGDOLO2;;branch/errorX;  READFILE DOLO2CLOSE DISK(BPUT TV=TMES5}S=TMESSLEN2 SENDANSWER<:FX;P$X;-------------------------------Z READFILEdBGET DISK=INBUFF=n GRFIL2xX;5}%> QINBUFFP@TEXTPOINTER7BUMP TEXTPOINTER=BUMP LENTEXTBUFF= !READFILE RFIL2:X;$X;----5}---------------------------X;Open/write a disk file.X;SAVE2%> SAVE1" QCOMBUFF9,PFILENAME862@3J5})>T DSAVE1^X;h GETFILEr WRITEFILE| SAVE2CLOSE DISKLDW =LENTEXTBUFF!LDW TEXTBUFFER=TEXTPOIN5}TER:X;$X;------------------------------- LENTRANS =$X;- - - - - - - - - - - - - - - -X;Wait for STX,fi5}le len, getX;file, split.X; GETFILELDW =LENTEXTBUFF!LDW TEXTBUFFER=TEXTPOINTERBPUT TV=RMESS=RM5}ESSLEN&!OPEN SERIAL=BAUD==AR1:A0 XIO (=SERIAL===AR1:A: GETSTXDBGET SERIAL=INBUFF=N QINBUFFX R>5}STXb HGETSTXlX;vBGET SERIAL=LENTRANS=!BGET SERIAL=LENTRANS=GETRS232CHARBGET SERIAL=INBUFF=5}%> QINBUFFP@TEXTPOINTER7BUMP TEXTPOINTER=BUMP LENTEXTBUFF=DBUMP LENTRANS= QLENTRANS5}LLENTRANSHGETRS232CHARX;CLOSE SERIAL :X;4$X;------------------------------->$X; Open and load a Dis5}k directoryHX;RDIR\2;;Point at namef%>;;NEW INDEXp DOLO3zX; transfer command filenameX; into FILENAME buffe5}r.X; QCOMBUFF9PFILENAME823)>;; untill 32 chars DDOLO3X;X; Point at TEXTBUFFER...X; Reset fil5}e length.X;!LDW TEXTBUFFER=TEXTPOINTERLDW =LENTEXTBUFF OPENDIRGDOLO4;; branch/error$X;. READFIL5}E8 DOLO4BCLOSE DISKLBPUT TV=TMESS=TMESSLENV SENDANSWER`:jX;!X;----------------------------X;#X; A5} routine to open a disk dir.X; OPENDIR#X;Determine if the persion typed"X; in the disk drive specifier.X; If so,5} branch to OPENF1X;QFILENAMER> : FOPEND1X; QFILENAMER> : FOPEND1(X;2"X; Otherwise assume th5}ey didn't< X; and use the default drive.FX;P(OPEN DISK=DIRECTORY==DFILENAMEZ IOPEND2d GOPEND3n OPEND1x"X; U5}se the drive spec the humanX; gave us.'OPEN DISK=DIRECTORY==FILENAME OPEND2 GOPEND3X;X; Return a posi5}tive zero ifX; file opened OKX;Q>: OPEND3"X; Otherwise print a Disk Error"X; message and return negative5}.X;"BPUT TV=ERRMESS=ERRMESSLENQ>":,X;6$X;-------------------------------"X; message and return negative4\