@L|4}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` CE: vC y@y@`A# *` :105L; 0L>! * 0` * : ;` 1 *` 1 *` Disk Drive Sp}eed:XXX RPM~~~Drive # X PRESS:C > check drive speedL > list error sectorsP > print error sectorsW > write al}l zeroesto error sectorsM > return to main menui0k ^ 1 :ɛL 800 퍍L5 RETRY ERROR 3 TIME(S)؆莟}R'S  `=D;EHI 1 1! @ :ɛ8A0.) ȅ 1 1i}il ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU!L; .{z:*{}.|~ 1 0 0 }JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # O 0 n&|D! 1L NOT A DISK FILE }N !B 1L " 1 !BDED:}:1BJ|DE 1DEBH }I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L } BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED007 FREE SECTORS COPYING---D1:FORT }UNE.RUN# 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#}PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%} 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C> ` 0>>  D, q; ,`COPY SECTORS`RLS ; , ,>  , , }ۢ>  ,?  , ,`= `=L :ɛ`hL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLt!}% A.= ` <0 0 .@L# .BJ 1  DEHIB V L1 = g <0,L. "} JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 = ` <0,0Lf- B V#},A#P= ` <0 0L#L ߢ) 1* 1 ~0YjC8C}mm ݭ$}}`8}``|* ? ɛ,`|:(|/ 1L `INVALID DESTINATI%}ON:DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξ&}hAΞB,0 J 1 BޝDEHI,HDE 1H$IHIDELSAVE-'}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L (}0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥ)}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{*}NAME TOO LONG B VL ` L1I H1EӝDL1|mDiE` V0`8d/8 i:"2!22 1+} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALID,} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4C-} $;CC $;C $;CC 8C Z: *DCC ,=  , lɀL +.}CCC.LE4 k:泭C0iiCLg3CL<3 Z: *DCC ,=  , /,C0 8/} l0N S0G :CC# k:浭C0iiCЪL<3 ,٢=  * q;L8 D, q; $; ,WC 0} L 4C>  :A>810CC ,/> 1C1>  :Z>810CC ,C> 1CCC , 1= 1 :Yh1}hL `=CCЍCCCCCCCCC ; ; ; , 4L3 ,\> 1 * 鈹CɛሢCɛ )CC02}CC ~* 5CCCC Co> 1 * Cɛ ~* 5ܭCCCC C˭CCLE5CCLE5`C`3}`C`~, , E5C 4L3? , E5CC 4C $;D浭CC 8CCCBC[} D  C D     )16CS S)  C)D1 p p 5}0 C9DI pCDL~CiCDiD` DD˙` d J)L !6}D L(( LL()  L| L( S LH 0p n  7} CY?  q  L L  ` )8} `A! d߰")-݆ "  $G@LLL&0") $G%9}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 A} G) *Gȩ GȽG GȌd q q G`  8   0G  `DB}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`YC}`piH n0)բY? 08`0 D}  0$L GGȽG L `8L`LE}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`F}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTEG} H8EEȱEEȩEh J E8   . m  i`LI!)E1FRH}1LJ舩9GIH`LJJ`HGHh l`I} S gL   8 rii `дCDCG W  J}C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}K} D |||DDOS DOSDOS SYS }L}}LM}B0DOC 000C4DOS SYSN} 0`BDELV !B O}`LVUQ   ]   TU J ]L!T  #      TU P} L ? .  t`GBJ V~DEHI B V0dVQ}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhR}DEL8HI   0 HI,0 0  9 .G VLOS},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHIT} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHIU} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO V}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -W}LLu DEHILV 9 .l 9 .l  `` s$B VBHX}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVLY}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2eZ}1i1232435ޥ<<8l} lɀYC :L6 : lC񠀈Ѱиi iACCC k:LX6CCCCC q\};L8= ; , ,p  , ,  ,1@  :ɛL 15))C q+L 7= , ,V@  ,u@  :ɛL H 7 ]}7Lj7 7Lj7D 8 7L7 7L7բ@ `ߢC ` ,@  * ECɛ>0$C *00C0C *0" CCL^}7`C X*`8` ,@  *0\X TCɛM ~*HC)JJJJ *6CȽC) *(CC0CC_}C`8`=8W=Wy 8W=PyL5 ON ,C` ; *nDEǍHI 1C L!9 :C `}q+L8L 9 q;L8P 9 q;L8W +L8ML 15))C g+L8 ,C&D?E BHCCC /,C\a}XCC X*C-?0  -?C0L8:8鉍C mC mCE?1?C V0*CCC LW9C? b}`CL09PC B VB DAEJNK V0 09 ,ʢ? PC D,P B V`CC mC mC?1?L9c}CC`i`i`i`i`i`P Bd} VBDAEJ VBHIL1HI B} V@`HS S ShH )Lc;Lj;h` 0)¢e})  q; ,` M;hL$; b,hL$; ,>  , ,L,=L1 :HOh:` ; 0L>!} f} ӭ 򮠲 A. DISK DIRECTORY K. BINARY SAVEB. BASIC/RUN CART L. BINARY LOADC. COPY FILE g}M. RUN AT ADDRESSD. DELETE FILE N. CREATE MEM.SAVE. RENAME FILE O. DUPLICATE FILEF. LOCK FILE P. COPY SECTORSGh}. UNLOCK FILE Q. CHECK SECTORSH. WRITE DOS/DUP R. RADIX CONVERTI. FORMAT DISK S. DRIVE SPEEDJ. DUPLICATE DISK T. WRi}ITE VERIFY:ON 9!&x#!7&p))'&5./)L''-66C76u8COPY DISK Insert source disk and Λ Insert DESTINATION j}disk and Λ IT'S DONE !'Y' to execute or for menuSource drive # ?DESTINATION drive # ?Source drive is # 1Desk}tination drive is # 2Enter first sectorEnter last sectorCHECK DRIVE # X >>>>ERROR # 144<<<24 THENPosition(10,13)Print("Sector read=======>")!}PrintCE(Sector)Position(10,14)Print("target end sector=>")PrintCE(target_sector)Sector==+1FIIF Dstats=1 THEN RETURN !}FI PutE() Print("Error in read sector. Error code=") PrintBE(Dstats) Close(1) Close(2) Break();*******!}********************************************************PROC Scroll_colors()BYTE wsync=54282, vcount=54283, clr=5! }3272, ctr, chgclr, incclr CH=$FF DO FOR ctr=1 TO 4 DO incclr=chgclr ; set base color to increment!!} DO wsync=0 ; wait for end of scan line clr=incclr ; change displayed color incclr==+1 ; change lu!"}minance UNTIL vcount&128 ; end of screen test OD OD chgclr==+1 UNTIL CH<>$FF OD RETURN;**********!#}*****************************************************PROC Print_directory()BYTE ARRAY directory(17)BYTE I,J,K,L,M,N,IIPu!$}t($7D) ; Clear screen PrintE(" <====== Directory ======>") FOR I=16 TO 23 DO Sector=I Read_Sector() FOR!%} J=1 TO 8 DO K=(J-1)*16 L=K+15 N=1 FOR M=K TO L DO directory(N)=Buffer_in(M) N!&}==+1 OD IF directory(1)<>$00 AND directory(1)<>$80 THEN Print(" ") FOR II=2 TO 12 !'} DO PrintF("%C",directory(II)) OD PrintE(" ") FI OD OD PutE() PutE() Print("!(} Push RETURN to continue") Scroll_colors() SetColor(2,9,4) ; return color to blue RETURN;********************!)}*******************************************PROC See_if_again() Put($7D) ; Clear screen PrintE("}") ; get users attenti!*}on SetColor(2,15,4) ; Color is Lt. Orange Position(1,10) PrintE(" Shall we start again?") PrintE(" Input a Y to restart")!+} CH=$FF DO UNTIL CH<>$FF OD Yes=CH RETURN;***************************************************************PROC !,}Start_screen() BYTE Do_directory Put($7D) ; Clear screen PrintE("}") ; get users attention SetColor(2,1,4) ; Color is!-} Gold Position(1,10) PrintE("Push START for directory") PrintE(" or any other key to continue") Do_directory=0 CH=$FF!.} CONSOL=$08 DO IF CONSOL=6 THEN Do_directory=1 FI UNTIL Do_directory=1 OR CH<>$FF OD IF Do_directory=1 THEN Print_dir!/}ectory() FI Put($7D) ; Clear screen CH=$FF SetColor(2,9,4) ; return color to blue RETURN;*************and conve!0t**************************************************PROC Write_Sector() dev=2 ; device number cmd=!1}$0B ; command byte aux1=0 aux2=0 IF Number_drives=1 THEN IF First_pass=0 THEN Open(2,filename!2}_out,8,0) ELSE Open(2,filename_out,9,0) FI FI WriteBlock(dev,addr,size)First_pass=1Byte_count=0IF CI!3}O_status=1 THEN IF Number_drives=1 THEN Close(2) FI RETURN FI PutE() Print("Error in write sector. Error code=") P!4}rintBE(CIO_status) Close(1) Close(2) Break();*******************************************************!5}********PROC Fill_big_buff()BYTE iFOR i=0 TO 124 DO Big_buff^=Buffer_out(i) Big_buff=$8100+Total_bytes_in_buffer+ !6} i+1 OD Total_bytes_in_buffer==+125 Byte_count=0 IF Total_bytes_in_buffer=6000 THEN size=600"M}tE("") Print(" User program starts at >") usradd=PeekC($491) PrintCE(usradd) PrintE("") PrintE("")RETURNCA 8}RD FUNC Start()CARD startadd Print("  Start address[decimal] >") startadd=InputC()RETURN(startadd)CARD FUNC End() 9}CARD endadd Print("  End address [decimal] >") endadd=InputC()RETURN(endadd)PROC Dev()BYTE key,flag device=0 :} Print("  Output: creen,rinter >") DO key=GetD(7) PrintF("%C",key) IF key='P THEN Close(5) Open(5,"P: ;}",8) device=5 flag=1 ELSEIF key='S THEN flag=1 ELSE Print("") flag=0 FI UNTIL flag=1 ODRETURN <}PROC Sl() Print("(")RETURNPROC Sr() Print(")")RETURN PROC Sx() Print(",X")RETURN PROC Sy() Print(",Y =}")RETURNCARD FUNC B3(CARD add)BYTE a,b a=Peek(add+1) b=Peek(add+2) PrintF("%H",b,a) add=add+2RETURN(add)CA >}RD FUNC B2(CARD add)BYTE a a=Peek(add+1) PrintF("%H",a) add=add+1RETURN(add)BYTE FUNC Des(BYTE n,content)BYTE A ?}RRAY Assem1="BRK0ORA1???0???0???0ORA2ASL2???0PHP0ORA1ASL0???0???0ORA6ASL6???0BPL2ORA5???0???0???0ORA3ASL3???0CLC0ORA8???0???0 @}???0ORA7ASL7???0JSR6AND4???0???0BIT2AND2ROL2???0PLP0AND0ROL0???0BIT6AND6ROL6???0",Assem2="BMI2AND5???0???0???0AND3ROL3???0SE A}C0AND8???0???0???0AND7ROL7???0RTI0EOR4???0???0???0EOR2LSR2???0PHA0EOR0LSR0???0JMP6EOR6LSR6???0BVC2EOR5???0???0???0EOR3LSR3??? B}0CLI0EOR8???0???0???0EOR7LSR7???0",Assem3="RTS0ADC4???0???0???0ADC2ROR2???0PLA0ADC1ROR0???0JMP9ADC6ROR6???0BVS2ADC5???0???0? C}??0ADC3ROR3???0SEI0ADC8???0???0???0ADC7ROR7???0???0STA4???0???0STY2STA2STX2???0DEY0???0TXA18103STY6STA6STX6???0",Assem4="BCC D}2STA5???0???0STY3STA3STX???0TYA0STA8TXS0???0???0STA7???0???0LDY1LDA4LDX1???0LDY2LDA2LDX2???0TAY0LDA1TAX0???0LDY6LDA6LDX6???0 E}BCS2LDA5???0???0LDY3LDA3LDX???0CLV0LDA8TSX0???0LDY7LDA7LDX8???0",Assem5="CPY0CMP4???0???0CPY2CMP2DEC2???0INY0CMP0DEX0???0CP F}Y6CMP6DEC6???0BNE2CMP6???0???0???0CMP3DEC3???0CLD0CMP8???0???0???0CMP7DEC7???0CPX0SBC4???0???0CPX2SBC2INC2???0INX0SBC0NOP0??? G}0CPX6SBC6INC6???0",Assem6="BEQ2SBC5???0???0???0SBC3INC3???0SED0SBC8???0???0???0SBC7INC7???0???0"BYTE x,ch,flag FOR x=1 T H}O 3 DO IF n=1 THEN ch=Assem1(content*4-4+x) flag=Assem1(content*4) ELSEIF n=2 TH I}EN ch=Assem2((content-48)*4-4+x) flag=Assem2((content-48)*4) ELSEIF n=3 THEN J} ch=Assem3((content-96)*4-4+x) flag=Assem3((content-96)*4) ELSEIF n=4 THEN K} ch=Assem4((content-144)*4-4+x) flag=Assem4((content-144)*4) ELSEIF n=5 THEN L} ch=Assem4((content-192)*4-4+x) flag=Assem4((content-192)*4) ELSEIF n=6 THEN M} ch=Assem4((content-240)*4-4+x) flag=Assem4((content-240)*4) FI PrintF("% N}C",ch) OD Print(" ")RETURN(flag)CARD FUNC Desm(CARD add)BYTE b,c,content,flagCARD cont content=Peek(add) O} IF device=5 THEN PrintF("%C",126) ELSEIF device=0 THEN PrintF("%C",content) FI Print(" ") cont=PeekC(add) Pr P}intF("%H",cont) Print(" ") content=content+1 IF content=0 THEN Print("???") flag=0 ELSEIF content<49 THEN fla Q}g=Des(1,content) ELSEIF content<96 THEN flag=Des(2,content) ELSEIF content<145 THEN flag=Des(3,content) R} ELSEIF content<193 THEN flag=Des(4,content) ELSEIF content<241 THEN flag=Des(5,content) ELS S}E flag=Des(6) FI IF flag='9 THEN Sl() add=B3(add) Sr() ELSEIF flag='8 THEN add=B3(add) Sy() ELSEIF flag='7 T}THEN add=B3(add) Sx() ELSEIF flag='6 THEN add=B3(add) ELSEIF flag='5 THEN Sl() add=B2(add) Sr() Sy() U} ELSEIF flag='4 THEN Sl() add=B2(add) Sx() Sr() ELSEIF flag='3 THEN add=B2(add) Sx() V}ELSEIF flag='2 THEN add=B2(add) ELSEIF flag='1 THEN Print("#") add=B2(add) ELSEIF fla W}g='0 THEN Print(" ") ELSEIF flag=' THEN add=B2(add) Sy() FIRETURN(add)PROC Desmbler()BYTE key, X}decadd,ctrCARD startadd,endadd,addBYTE ARRAY strdec,strdecfi=" " Close(5) device=0 Poke(82,0) Poke(766,0) Y} Menu() startadd=Start() endadd=End() Dev() IF startadd=0 THEN startadd=1 ELSEIF endadd=startadd THEN enda Z}dd=startadd+1 FI Poke(766,1) PrintE("") PrintE(" ") FOR add=startadd TO enda [}dd DO StrC(add,strdec) FOR ctr = 1 TO 5 DO strdecfi(ctr)=32 OD SAssig \}n(strdecfi,strdec,1,5) Print(" ") Print(strdecfi) Print(" ") PrintF("%H",add) Print(" ") ]} add=Desm(add) key=Peek(754) IF key=33 THEN WHILE Peek(753) DO OD E ^}LSEIF key=28 THEN Desmbler() FI PrintE("") OD Desmbler()RETURNDISASSEMBLER ; Yode nmien=64 ;stop DLI sdlstl=savdl ;restore display list dlist=savdl vvblkd=savvbd ;vertical blank intef}rrupt sdmctl=$22 ;turn on screen dmactl=$22RETURN PROC two56() ;main proc builddl() goscreen() DO g} consol=8 UNTIL consol#7 OD noscreen()RETURN ;main proc builddl() goscreen() DO KBLDUP SYSB'4DOS SYSB.wDISSASEMACTB RAMSORT ACTB}ASSEMBLRACTBAASSEMBLRDOC_GODOS ACTB'RAMSORT DOCBiDOS3TO2 ACTB qRELOC ACTREALS ACTREALS DOCB,RELGEN ACTB RELOCBINDOCBE&BINMENU ACTENDPROC ACTBxBINMENU DOCMODULE ;RELOCATE.ACT;Run-time Relocator Code.;For use with RELGEN.ACT;COPYRIGHT 1984, JS DeMar;Rev. 1.1, March 20,1984;%r}---------------------------------SET 14=$6000SET $0491=$6000;---------------------------------;The beginning of the relo%s}cator;table and code should be higher;than the expected end of the final;relocated program. But, there must;be enough spa%t}ce left for the table;and the relocator code itself!;---------------------------------;---------------------------------%u};Read the ".GEN" file above here.;---------------------------------;Compile this after reading in the;".GEN" file above. %v}Then append the;".REL" file to this code using the;DOS COPY command with "/A".;---------------------------------PROC Err%w}or(BYTE err)[$6C$A]PROC Break=*()[$BA$8E$4C1$80A0$98$4C Error]PROC ChkErr=*(BYTE r,b,eC)[$1610$88C0$8F0$98$80C0$11F0$4%x}C Error$8A$4A4A$4A4A$98AA$9D EOF$60]PROC Break1=*(BYTE err)[$1A2$1186$48$20 Break$68$A8$60]CHAR FUNC GetD=*(BYTE d)[$7A2%y}]PROC CCIO=*()[$A486$A0A$A0A$AA$A4A5$9D$342$A9$0$9D$348$9D$349$98$20$E456$A085$4C ChkErr];------------------------------%z}---PROC BootIt=*();---------------------------------PROC Relocate()BYTE offset,memlohi=$02E8,xCARD memlo=$02E7,i,j,to%{}p,entryBYTE ARRAY newplacenewplace=memlonewplace==&$FF00offset=memlohii=memlo&$00FFIF i#0 THEN newplace==+$0100 of%|}fset==+1FIFOR i=1 TO 6 DO x=GetD(1)ODj=0FOR i=start TO finish+7DO x=GetD(1) newplace(j)=x j==+1ODFOR i=0 T%}}O hits-1DO entry=otable(i) newplace(entry)==+offsetODrunaddr==+newplace[$6C runaddr]1.1, March 20,1984;$iMODULE ;RELGEN.ACT;COPYRIGHT 1984, QMI, JS DeMar;REV. 1.1, March 20, 1984;OBJECT CODE RELOCATION GENERATOR for;ACTION! 1}compiled binary-load files.;WARNING!!! This program requires;four OPEN files simultaneously.;Be sure that DOS is configur1}ed for;this. With DOS 2.0, set $709 equal;to at least 4, rewrite DOS and;reboot.;Requires the second file compiled;at a1}ny even page increment higher;than the first file, for example:;$3000 and $3100.;Generates a table of the locations;that1} require relocating and saves;it in a ".GEN" file in ACTION!.; The ".REL" file is the original;object code with an origin1} of "0". ;The actual relocator is compiled;from the generic relocator source;called "RELOC.ACT" merged with the;".GEN" fi1}le generated here. Append;".REL" file to that code and it;will load and relocate to MEMLO.DEFINE in1="1", in2="2",1} out1="3", out2="4"BYTE abrt;---------------------------------PROC MyError(BYTE a,x,y)IF y=170 THEN P1}rintE("ERROR File not found!")ELSE Print("ERROR! ") PrintBE(y)FIabrt=1RETURN;---------------------------------PROC1} Ferror()BYTE t,clock=$14PrintE("ERROR in Output filespec!")t=clock-$80DOUNTIL t=clockODRETURN;--------------------1}-------------PROC Main()CARD start1,start2,end1,end2CARD offsets,offsete,i,count,hitsCARD test1,test2,old1,old2,old3,ol1}d0BYTE x,z,j,wnum,d1,d2, sthighBYTE ARRAY fname1(18),fname2(18), fnameout1(18),fnameout2(18)DOPrintE("}1} Relocation Code Generator ")PrintE(" JS DeMar 3/84 ")PutE()PrintE(" Requires two code files compiled")Pr1}intE(" with an offset of $0100.")PutE()Print("Filespec for code A >") InputMD(device,fname1,18)PutE()Print("Filesp1}ec for code B >") InputMD(device,fname2,18)PutE()Scopy(fnameout1,fname1)SCopy(fnameout2,fnameout1)j=1IF fnameout1(1)#'1}D OR fnameout1(0)<4 THEN Ferror()ELSEIF fnameout1(2)=': THEN z=0ELSEIF fnameout1(3)=': THEN z=1FIDO x=fna1}meout1(j) j==+1 IF x=$20 THEN EXIT ELSEIF x='. THEN EXIT ELSEIF j>fnameout1(0) THEN j==+1 EXIT ELSE1}IF j>11+z THEN Ferror() FIODfnameout1(j-1)='.fnameout1(j)='Gfnameout1(j+1)='Efnameout1(j+2)='Nfnameout1(0)=j+21}j=1IF fnameout2(1)#'D OR fnameout2(0)<4 THEN Ferror()ELSEIF fnameout2(2)=': THEN z=0 EXITELSEIF fnameout2(3)=1}': THEN z=1 EXITFIODDO x=fnameout2(j) j==+1 IF x=$20 THEN EXIT ELSEIF x='. THEN EXIT ELSEIF j>fname1}out2(0) THEN j==+1 EXIT ELSEIF j>11+z THEN Ferror() EXIT FIODfnameout2(j-1)='.fnameout2(j)='Rfnameou1}t2(j+1)='Efnameout2(j+2)='Lfnameout2(0)=j+2Print("Generation file = ")PrintE(fnameout1)Print("Relocation file = ")Prin1}tE(fnameout2)Error=MyErrorabrt=0Close(in1)Close(in2)Close(out1)Close(out2)Open(in1,fname1,4)Open(in2,fname2,4)IF ab1}rt=1 THEN Close(1) Close(2) RETURNFIOpen(out1,fnameout1,8)Open(out2,fnameout2,8)x=GetD(in1) ;throw away two $FF's1}.x=GetD(in1)PutD(out2,$FF)PutD(out2,$FF)x=GetD(in1)PutD(out2,x)start1=x ;start addr of file1.x=GetD(in1)PutD(out2,1}x)start1==+(x*256)x=GetD(in1)PutD(out2,x)end1=xx=GetD(in1)PutD(out2,x)end1==+(x*256) ;end addr of file1.x=GetD(in2) 1};throw away two $FF's.x=GetD(in2)x=GetD(in2)start2=x ;start addr of file2.x=GetD(in2)start2==+(x*256)x=GetD(in2)end1}2=xx=GetD(in2)end2==+(x*256) ;end addr of file2.offsets=start2-start1sthigh=start1/256offsete=end2-end1PrintDE(out1,1}"MODULE")PrintD(out1,";For file ")PrintDE(out1,fnameout2)PrintDE(out1,"")Print("Code starts at ")PrintD(out1,"CARD start1}=[")PrintCE(start1)PrintCD(out1,start1)PrintDE(out1,"]")Print(" and ends at ")PrintD(out1,"CARD finish=[")PrintCE(end1}1)PrintCD(out1,end1)PrintDE(out1,"]")Print("Compile offset was ")PrintCE(offsets)IF offsete#offsets THEN PrintE("Dife1}rrent size files!") PrintE("ABORTED!")ELSE PrintDE(out1,"") PrintD(out1,"CARD ARRAY otable=[") wnum=0 hits=0 cou1}nt=0 WHILE EOF(in1)=0 DO d1=GetD(in1) d2=GetD(in2) IF d1#d2 THEN IF count<(end1-start1)-5 THEN 2} hits==+1 IF wnum=0 THEN PrintD(out1," ") Print(" ") ElSE PrintD(out1," ") 2} Print(" ") FI PrintCD(out1,count) Print(" ") PrintC(count) wnum==+1 I2}F wnum>4 THEN PrintDE(out1,"") PrintE("") wnum=0 FI FI old0=d1 test1=2}old0*256 test1==+old1 test2=old2*256 test2==+old3 IF test1>=start1 AND test1<=end1 THEN IF te2}st2=$02E3 OR test2=$02E1 THEN PrintDE(out1,"]") PrintE("]") PrintD(out1,"CARD hits=[") 2} PrintCD(out1,hits) PrintDE(out1,"]") PrintDE(out1,"") Print("CARD hits=[") PrintC(h2}its) PrintE("]") PrintE("") PrintD(out1,"CARD runaddr=[") Print("CARD runaddr=[") 2} test1==-start1 PrintCD(out1,test1) PrintC(test1) PrintDE(out1,"]") PrintE("]")2} wnum=0 FI FI old3=old2 old2=old1 old1=d1 d1==-sthigh ELSE old3=ol2 }d2 old2=old1 old1=d1 FI PutD(out2,d1) count==+1 ODFIPrintE("")PrintDE(out1,"")Close(in1)Close(2 }in2)Close(out1)Close(out2)PrintE("Finished!}")RETURN;OBJECT CODE RELOCATION GENERATOR for;ACTION! 0LInstructions for: RELGEN.ACT:== Relocation Generator& REOCAT.ACT:== Run-time Relocator These programs were intended t6 }ocreate a self-relocating objectfile from either an ACTION!compiled program or an Assembledprogram. The original object f6 }ilemust be a single-stage boot withonly one origin except for thetrailing run or init address. Thefollowing instructions 6}detail thesteps to make the target objectfile. This file may be appended toother binary load files and mayhave other bina6}ry files appended toit. The program will load at thenext possible page boundary(increment of 256) after MEMLO.Because REL6}GEN compares twoversions of you object file, youmay want to init all variables tozero to keep the relocation tableat a mi6}nimum. Stray data in theuninitialized variables may beinterpreted as machine code thatneeds relocating.1) Compile (or As6}semble) your code at a convenient area but not conflicting with DOS. In ACTION!, use the following commands to force 6}the program's origin to a specified value ($3000 for example): SET 14=$3000 SET $491=$30002) Re-Compile your code6} at $100 higher than the first. For the above example, this would be at $3100.3) From the ACTION! monitor, RUN thepr6}ogram RELGEN.ACT. It will promptyou for the filenames for the twoobject code files that you compiledabove. Remember to giv6}e the Dn:prefix to the filenames. The programwill compare the two object filesand note their differences as offsetsinto t6}he file. This information issaved in ACTION! form in a file withthe original name and a ".GEN"extention. This will be used6} in thenext step. Also, the program createsan object file image of the originalbut with an origin of zero. This isdone to6} make the relocation processeasier and this file, with a ".REL"extention will be used in step 5. Note: RELGEN.ACT requir6}es four openDOS files simultaneously. By default,DOS usually has buffers for only 3.You must use the command: SET $709=6}4in the ACTION! monitor and type D forDOS. Rewrite DOS to the disk andreboot. Now, DOS will allow the fourfiles to be op6}ened.4) Now, Read the program RELOC.ACTinto the ACTION! Editor. This is a"generic" run-time relocator. Thefile generated6} with the RELGEN.ACTprogram (with the ".GEN" extention)must be merged into this programwith the editor Read function.Posi6}tion the cursor where instructedand read in the file. Compile thiscode but be sure that it is SET tocompile above the expe6}cted end ofYOUR program's target location.Save this object code to disk andgo to DOS.5) Using the DOS Copy command,appe6 }nd the ".REL" file generated inRELGEN.ACT, to the merged relocatorfile saved in step 4. For example:CCopy from,to:TEST.6!}REL,AUTORUN.SYS/AThis assumes that you saved the filein Step 4 as AUTORUN.SYS.6) Finally, the appended file can beloade6"}d from DOS or named AUTORUN.SYSas above for permanent applications.If you have question, send E-Mail to: John DeMar 71066#}6,337 on Compuserveor leave a message on the ACE-BASEBBS at (315)451-7747. Good Luck!#0oeex`C!4* 4IACTION RUNTIME BIN6$}ARY FILE RELOCATORSee RELGEN.DOC for intructions. NeedsRELGEN.ACT to generate files fromyour compiled program.6%} 71066,337 These programs were intended t4[;ACTION! BINARY LOADER, APRIL 1984;WARREN K. SMALL 71076,407;NOTE!!! REQUIRES ATARI DOS 2.0SSET $E=$5000 SET $491=$:'}5000DEFINE DISPLAY_OFF="0", DISPLAY_ON="34", BOOT="1" BYTE KEY=764, COLDST=580, FILE_COUNT=[0], :(} CHOICE,ROW,COLCHAR ARRAY FILE_NAME(25), LOAD_NAME(15)BYTE ARRAY FILES(120), LOGO=[$00$00$00$00$00$:)}00$00$00$00$00$00$00$00$03$F0$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$0F$F0$00$00$00$00$00$0:*}0$00$00$00$00$00$00$00$00$00$00$00$00$00$00$07$FF$FF$FF$FF$FF$C0$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$0:+}F$FF$FF$FF$FF$FF$FF$F0$00$00$00$00$00$00$07$D9$80$00$00$00$00$00$00$00$00$F8$0F$FF$FF$FF$FF$FF$FF$FF$FE$00$00$00$00$00$03$1F:,}$80$00$00$00$00$00$00$00$0F$F8$00$00$00$0F$F8$01$FF$FF$FF$FC$00$00$00$00$03$19$80$00$00$00$00$00$00$00$7F$F0$00$00$00$3F$C0:-}$00$01$FF$FF$FF$F0$00$00$00$03$19$80$00$00$00$00$00$00$07$FF$F0$00$00$00$FF$00$7E$00$00$FF$FF$F8$00$00$00$00$00$00$00$00$00:.}$00$00$00$7F$FF$E0$00$00$03$FC$01$FF$80$00$00$3F$F0$00$00$00$00$07$E0$00$00$00$00$00$03$FF$FF$C0$7E$00$07$F8$00$FE$00$00$00$:/}00$00$00$00$00$00$3F$E0$00$00$00$00$00$0F$FF$FF$81$FF$80$1F$E0$00$00$01$F8$00$00$00$00$00$00$00$FF$C0$00$00$00$00$00$3F$F8$:0}FF$07$FF$80$7F$80$3E$00$1F$FC$03$FF$C0$00$00$00$03$FF$80$00$00$00$00$00$FF$E1$FE$1F$FF$80$FF$00$FE$00$FF$FC$7F$FF$E0$00$00$0:1}0$1F$FF$00$00$00$00$00$03$FF$87$FC$3F$1F$83$FC$01$FC$07$F0$FF$FF$FF$E7$F0$00$00$7F$FC$00$00$00$00$00$0F$FE$0F$F0$FC$06$07$F:2}8$03$F8$3F$C0$FF$FF$FF$FF$FC$00$03$FF$F0$00$00$00$00$00$3F$F8$3F$E1$F8$00$1F$F0$0F$E0$FF$03$FF$C1$FF$FF$FE$00$0F$FF$80$00$0:3}0$00$00$00$FF$FF$FF$C7$E0$00$3F$C0$3F$81$FC$0F$F8$07$FF$FF$FC$00$3F$FC$00$00$00$00$0F$FF$FF$FF$FF$8F$C0$00$7F$80$7F$03$F8$3F:4}$80$1F$FE$3F$F8$00$FF$E0$00$00$00$00$1F$FF$FF$FF$FF$1F$00$00$FF$01$FE$0F$C0$FE$00$7F$F0$7F$F0$03$FF$00$00$00$00$00$3F$FF$FF:5}$FF$FE$3E$01$C1$FE$03$F8$1F$83$F8$01$FF$C1$FF$C0$1F$FC$00$00$00$00$00$00$3F$F0$0F$F8$7C$07$C3$FC$0F$F0$3F$87$E0$03$FF$03$FF$:6}00$FF$F0$00$00$00$00$00$00$FF$C0$1F$F0$7C$3F$87$F8$1F$E0$7F$FF$80$0F$FC$0F$FE$01$FF$80$00$00$00$00$00$03$FF$00$3F$E0$7F$FE$:7}0F$F0$3F$80$FF$FC$00$3F$F0$3F$F8$0F$FE$00$00$00$00$00$00$0F$FC$00$3F$C0$7F$F8$0F$80$3F$00$FF$F0$00$7F$C0$7F$E0$1F$F8$00$00$0:8}0$00$00$00$3F$F0$00$3F$80$3F$E0$00$00$3E$00$FF$80$00$FF$00$FF$80$FF$C0$00$00$00$00$00$00$FF$C0$00$1F$00$00$00$00$00$00$00$F:9}C$00$00$7E$01$FE$00$FF$00$00$00$00$00$00$03$FF$00$00$00$00$00$00$00$00$00$00$00$00$00$00$01$F0$00$F0$00$00$00$00$00$00$0F$F::}E$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00$1C$00$00$00$00$00$00$00$1F$F8$00$00$00$00$00$00$00$00$00$00$00$00$00$00$00:;}$00$7F$00$00$00$00$00$00$00$3F$E0$00$00$00$00$01$FF$FF$FF$FF$FF$FF$C0$00$00$00$00$FF$00$00$00$00$00$00$00$7F$80$00$00$00$03:<}$FF$FF$FF$FF$FF$FF$FF$FF$F0$00$00$00$FE$00$00$00$00$00$00$00$FF$00$00$00$0F$FF$FF$FF$FF$FF$FF$FF$FF$FF$FF$FC$00$00$1C$00$00$:=}00$00$00$00$00$FC$00$00$03$FF$FF$F0$00$00$00$00$0F$FF$FF$FF$FF$FF$00$00$00$00$00$00$00$00$00$00$00$01$FF$FF$F0$00$00$00$00$:>}00$00$00$00$0F$FF$FF$F0$00$00$00$00$00$00$00$00$00$00$0F$FF$E0$00$00$00$00$00$00$00$00$00$00$00$FF$FC$00$00$00$00$00$00$00$:?}00$00$00$0F$F8$00$00$00$00$00$00$00$00$00$00$00$00$00$FF$00$00$00$00$00$00$00];--------------------------PROC PLOT_CHAR(:@}BYTE CH) ;PLOT LETTERS ON GR.8 SCREENBYTE CHBASE=756CARD OFFSET,INC,SCREEN=88BYTE POINTER BIT_MAP,CHARSET,SCR CHARSET=CH:A}BASE*256 CH==&127 ;MASK INVERSE VIDEO IF CH>31 AND CH<96 THEN OFFSET=(CH-32)*8 ELSEIF CH>=0 AND CH<32 THE:B}N OFFSET=(CH+64)*8 ELSE OFFSET=CH*8 FI BIT_MAP=CHARSET+OFFSET FOR INC=0 TO 7 DO SCR=SCREE:C}N+COL+(ROW+INC)*40 SCR^=BIT_MAP^ BIT_MAP==+1 ODRETURN ;END PLOT_CHAR() ;----------------------:D}-------- PROC CONVERT_NAME() ;INSERTS PERIOD BETWEEN FILENAME & EXTENSION BYTE INC=[14] WHILE INC>11 DO :E} LOAD_NAME(INC)=LOAD_NAME(INC-1) INC==-1 OD LOAD_NAME(11)='. LOAD_NAME(0)=14RETURN ;END CONVE:F}RT_NAME();------------------------------PROC LOAD_FILE() LOAD_NAME(0)=2 LOAD_NAME(1)='D LOAD_NAME(2)=': SASSIGN(LOA:G}D_NAME,FILES+CHOICE*12,3,13) CONVERT_NAME() CLOSE(1) OPEN(1,LOAD_NAME,4,0) [$4C $15C8] ;ATARI DOS 2.0S :H} ;BINARY LOAD ROUTINERETURN ;END LOAD_FILE();------------------------------PROC READ_DIRECTORY()BYTE LOCK,NEXT ZERO(:I}FILES,120) CLOSE(3) OPEN(3,"D:*.*",6,0) DO LOCK=GETD(3) NEXT=GETD(3) INPUTMD(3,FILE_NAME,18) :J} FILE_NAME(0)=11 IF LOCK='* THEN SCOPY(FILES+FILE_COUNT*12,FILE_NAME) FILE_COUNT==+1 :K} IF FILE_COUNT>9 THEN EXIT FI ELSEIF FILE_NAME(1)>='0 AND FILE_NAME(1)<='9 THEN :L} EXIT FI OD CLOSE(3)RETURN ;END READ_DIRECTORY();------------------------------PROC DISPLAY_:y}0 Output_disk() Write_Sector() Total_bytes_in_buffer=0 Big_buff=$8100 Input_disk() FI RETURN;***********"N}**************************************************PROC Fill_Buffer_Out()DOBuffer_out(Byte_count)=Buffer_in(I)I==+1Byte_"O}count==+1IF Byte_count=125 THEN IF Number_drives=2 THEN Write_Sector() ELSE Fill_big_buff() FI FI UNTIL I=128 OR "P}I=Stop_at_end_of_bufferODI=0 RETURN;***************************************************************PROC Read_directo"Q}ry()BYTE ARRAY directory(17),check_directory(13)BYTE I,J,K,L,M,N,IIAn_error=0FOR I=0 TO 12DOcheck_directory(I)=$20OD"R}J=filename_in(0) ; Length of stringK=1FOR I=3 TO JDOIF filename_in(I)<>$2E THEN ; Search for "." check_directory(K"S})=filename_in(I) K==+1 ELSE K=9 FIOD FOR I=16 TO 23 DO Sector=I Read_Sector() FOR J=1 TO 8 DO "T} K=(J-1)*16 L=K+15 N=1 FOR M=K TO L DO directory(N)=Buffer_in(M) N==+1 OD "U} L=0 FOR K=2 TO 12 DO IF directory(K)<>check_directory(K-1) THEN L=1 FI UNTIL L=1 OD IF L="V}0 THEN Sector=directory(14)*8+25 ; start sector Sectors_to_read=directory(16)*2+1 max_bytes_in_last_sector=di"W}rectory(15) IF max_bytes_in_last_sector>128 THEN max_bytes_in_last_sector==-128 Sectors_to_read==+1 "X}FI Put($7D) ; Clear screen Print("For file=") PrintE(filename_in) Print("Sectors to read=") Pr"Y}intCE(Sectors_to_read) Print("Bytes in last sector read=") PrintBE(max_bytes_in_last_sector) target_sector=Sec"Z}tor+Sectors_to_read-1 RETURN FI OD OD An_error=1 PrintE("Error**** file not found") Close(1) Close("[}2) RETURN;***************************************************************PROC Set_one(BYTE ARRAY filename) BYTE M "\} FOR M=1 TO 13 DO filename(15-M)=filename(13-M) OD filename(1)=$44 ; "D" filename(2)=$3"]}A ; ":" filename(0)==+2 ; increase length pointer RETURN;********************************************************"^}*******PROC Set_two(BYTE ARRAY filename) BYTE M FOR M=1 TO 12 DO filename(16-M)=filename(13-M) "_} OD filename(1)=$44 ; "D" filename(2)=$32 ; "2" filename(3)=$3A ; ":" filename(0)==+3 ; inc"`}rease length pointer RETURN;***************************************************************PROC Get_number_of_drives"a}() DOPutE()PutE()PrintE("DOS 3 to 2 Convertor")Print("Number of drives (1-2)=>")Number_drives=InputB()IF Number_driv"b}es<1 OR Number_drives>2 THEN Put($7D) PrintE("===========================") PrintE("===========================""c}) PrintE("===========================") PrintE("===========================") PrintE(" "d} ") PrintE("Incorrect number of drives ") Print(" Input a 1 or 2, not a ") PrintBE(Number_drives) "e} PrintE(" ") PrintE("===========================") PrintE("=========================="f}=") PrintE("===========================") PrintE("===========================") FI UNTIL Number_drives=1 OR"g} Number_drives=2 OD RETURN;***************************************************************PROC main()BYTE Last_byte_co"h}untYes=$2BDO ; Start of loop until Yes<>$2B "Y"Poke($779,$50) ; turn off write verifyPut($7D) ; Clear screen"i}Close(1)Close(2)SHFLOK=$40 ; Set as upper caseIF Startup=0 THEN Get_number_of_drives() FI Startup=1Yes=0"j}FOR I=0 TO 14DOfilename_in(I)=$20ODSector_count=0Total_bytes_in_buffer=0Stop_at_end_of_buffer=128First_pass=0Start"k}_screen()Print("Filename for input=D1:")InputS(filename_in)Set_one(filename_in) IF Number_drives=1 THEN Print("Filen"l}ame for output=D1:") InputS(filename_out) Set_one(filename_out) Big_buff=$8100 addr=$8100 Input_disk() ELSE"m} Print("Filename for output=D2:") InputS(filename_out) Set_two(filename_out) addr=$8080 size=125 Open(2,file"n}name_out,8,0) ; open for output FI; Find input file's first sector and; number of sectors in fileRead_directory()IF"o} An_error=0 THEN CRSINH=1 ; turn off cursorByte_count=0I=0DO Sector_count==+1Read_Sector() ; call serial I/"p}O routineFill_Buffer_Out() UNTIL Sectors_to_read-1=Sector_countODRead_Sector() ; call serial I/O routineStop_a"q}t_end_of_buffer=max_bytes_in_last_sectorFill_Buffer_Out()IF Byte_count=0 AND Number_drives=2 THEN CRSINH=0 ; turn on cu"r}rsor RETURN FI IF Total_bytes_in_buffer=0 AND Number_drives=1 AND Byte_count=0 THEN CRSINH=1 ; turn on cursor CRSINH=0"s} ; turn on cursor RETURN FIIF Number_drives=2 THENsize=Byte_countWrite_Sector() ELSELast_byte_count=Byte_countOutpu"t}t_disk()size=Total_bytes_in_bufferWrite_Sector() ; Write big buffer; write remaining in little bufferaddr=$8080size=Last"u}_byte_countWrite_Sector() FIClose(1)Close(2) FI ; End of An_error=0 loop CRSINH=0 ; turn on cursorSee_if_agai"v}n() UNTIL Yes<>$2B OD ; End of Main loop SetColor(2,9,4) ; return color to bluePut($7D) ; Clear screenCH=$FFRETU"w}RNor() dev=2 ; device number cmd= B [71076,407]ACTION.TXT 05-May-84 8780 20 Keywords: ACTION BINARY MENU Compile this and save it as B}CHOICE() BYTE POSCHAR ARRAY LOAD="loading =>" COL=2 ROW=80+CHOICE*8 FOR POS=1 TO LOAD(0) DO PLOT_:z}CHAR(LOAD(POS)) COL==+1 ODRETURN ;END DISPLAY_CHOICE() ;------------------------------ PROC DISPLAY_FI:{}LES()BYTE FILENUM,POSCHAR ARRAY TITLE="disk directory", PROMPT="select" ROW=64 COL=12 FOR POS=1 TO TITLE(0) :|} DO PLOT_CHAR(TITLE(POS)) COL==+1 OD ROW=80 FOR FILENUM=0 TO FILE_COUNT-1 :}} DO COL=13 PLOT_CHAR(FILENUM+48) COL==+2 FOR POS=FILENUM*12+1 TO FILENUM*12+11 :~} DO PLOT_CHAR(FILES(POS)) COL==+1 OD ROW==+8 :} IF ROW>152 THEN EXIT FI OD COL=16 ROW=176 FOR POS=1 TO PROMPT(0) DO :} PLOT_CHAR(PROMPT(POS)) COL==+1 ODRETURN ;END DISPLAY_FILES();------------------------------PROC :}SCROLL_COLORS() BYTE WSYNC=54282, VCOUNT=54283, COLR=53274, COUNTER,CHANGECOLR=[0:}], INCCOLR, CURSOR=752 OPEN(3,"K:",4,0) KEY=255 DO WHILE KEY=255 DO :} FOR COUNTER=1 TO 10 DO INCCOLR=CHANGECOLR DO :} WSYNC=0 COLR=INCCOLR INCCOLR==-1 UNTIL VCOUNT&128 :} OD OD CHANGECOLR==+1 OD CHOICE=GETD(3) IF CHOICE>47 AND CHOICE MOVEBLOCK($7308,A,8) ;a MOVEBLOCK($7318,CDE,24) :} ;cde MOVEBLOCK($7338,G,8) ;g MOVEBLOCK($7348,I,8) ;i MOVEBLOCK($7358,KL,16) ;kl MOVEBLOCK($737:}0,NO,16) ;no MOVEBLOCK($7390,RST,24) ;rst MOVEBLOCK($73C8,Y,8) ;yRETURN ;END CHAR_SET();----------:}--------------------PROC PLOT_LOGO()BYTE LINE,BYTCARD START,NEXTLYN,SCREEN=88BYTE POINTER SCR START=12*40+7 ;OFFSET :}TO START OF LOGO DATA NEXTLYN=40 ;INC TO NEXT LINE FOR LINE=0 TO 35 DO FOR BYT=0 TO 25 DO :} IF LOGO(LINE*26+BYT)<>0 THEN SCR=SCREEN+START+BYT SCR^=LOGO(LINE*26+BYT)&$55 :} FI OD START==+NEXTLYN ODRETURN ;END PLOT_LOGO();------------------------------PROC MAIN()BYTE DM:}A=559 DEVICE=0 POKEC($9B,$600) COLDST=BOOT ;COLDSTART ON RESET GRAPHICS(24) DMA=DISPLAY_OFF CHAR_SET() COLOR=1 SET:}COLOR(1,1,0) SETCOLOR(2,1,12) SETCOLOR(4,8,5)READ_DIRECTORY()PLOT_LOGO()DISPLAY_FILES() DMA=DISPLAY_ONDO SCROLL_COLO:}RS() DISPLAY_CHOICE() LOAD_FILE()OD $60$E0$E0$E0$E0$E0$FE$FC],8^ AUTORUN.SYS. It will read the directory and display locked files for loading. These must be binary ACTION! fileB}s. The menu screen is quite colorful with the ACTION! logo at the top as it appears on the manual. REQUIRES ATARIB} DOS 2.0S!!! (R D T): 84 8780 20 Keywords: ACTION BINARY MENU Compile this and save it as @%