@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( 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`  `1  ɐ     `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:@*.*N.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ 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  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } )h n# J KI  & a&$E˩̩˙iȱi5)*}` >ɛ(`HHH7ͩЍ&ud˩ [)ـȄαHȱH`"1ȱ+}iL="Щ.Ȅ̈́Ω" U˩L ܩeͅ$%"h0hh(` @ '`XXFIND/@&%/%DI6.!cDEL DELET q.,}!eLOC u.!eUN UNLOC y.!cRE RENAM }KIL .!eE ENTE .!eLO LOA .!eRUN!Z.!cS SAV .!cLI LIST!ZL LIS-}%.!eBL BLOA&HEL&FORMA%.!cM MOV#WDO$D1:*.* R110HH %L# g"ѩ}.}HH( % V |" i) ƅ˩څ˩̥HH % L Зȑˈȱ/}ȑˠ) JJJJi0ȥ)i0JƩ L - L $hhL΢ ͙8ΨeHiH %hhL#0}`!б#Э$Щ V%0L ЖL&J K Lt Έ)0 ȱHȱH`͈ͤ ` $L&1} 3!ـȩ:ـ/ 1%  D  :` ͌ `Ω ЀХ2}d00]:Y8 8 0  HH8X˥Y̠( =" =" hhL&爭)3} ѩ ,0 3! =" -". G" ;" -"hh˩L  T" G"`e˅ː`H h`H****)h)c"` @4}`XiYi` # `( #( ~# #( =" ~# # #L# ="85} #$( # /# #( ~# # # # ="$( #( # /#'X+X` D#` # D#` ~# ݀6}0 ( #`( # ;"`˝``˭`˭`H# h,A0L@L4h7} L - HHB8名呍 %|ɈЩIH Ω1ف.I&&  > H$8}Ω1iHH %0HH B %0Т&  LE: $H$H %0D1:DOS.SYS`HHͩ?9}ȩ % H%H %H%H %ЩϢ&  YФͩ `K:&˩&̠ #Р $ ~#Р $L' :}L͠,oـHDH:HH hHiHDiHE % B Vۢ&  hhh,;}`BJ IHhhhEhDHHLV eΝDiE͹~/͹NΞͩ L<} L#&  Lˆ̥˦ ȱ(ɛ(`?' a&L DISK DRIVE 1ARE YOU SURE??INSERT DISK2;HIT ANY KEY (S=TO SC=}REEN)OUT OF RAM ALREADY EXISTSBAD LOAD FILEDOS 2.5 Mod. by Bob DuHamelDISKIO 4.3 by B. OppenheimType HELP }DISKIO:>} DIR Directory DIRn Dir. Drive n FORMAT Format disk WDOS Write DOS.SYS.X LI. ?} LISTD List to disk.S S. SAVE Save to disk.E E. ENTER Enter to mem..L LO. LOAD Load to mem..R RUND @}Run disk file.K LOCK Lock file.U UN. UNLOCK Unlock file.N RE. RENAME Rename file.D DEL. DELETE Delete file.A}B BL. BLOAD Binary load.M M. MOVE Move file.R9 runs #9 etc. To use DOS type KILL.Reboot to restore DISKIO. B}.H k)йl)ѠhH hHhO&\&L 5$$%%Y&j&8## $$$%%%5)ILL.Reboot to restore DISKIO. X5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30095 RDFILE=30360:WRFILE=30370D}30100 REM àŠӛ30102 DIM IO$(83)30105 DIM FN$(28)30196 LNBUF=1025:DIM BUFF$(LNBUF)30200 REM ŠE}ӛ30201 IO$="hpBhEhDhhJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`"30299 RETURN 30300 TRAP EF}RROR:? "ERROR- ";PEEK(195);" AT LINE ";PEEK(186)+256*PEEK(187):END 30310 POKE 195,PEEK(947):CLOSE #7:? "I/O ";:GOTO ERRORG}30360 RW=4:GP=7:REM ś30361 FN$="":? "INPUT FN:";:INPUT FN$:IF FN$="" THEN RETURN 30362 BUFF=ADR(BUFF$)+H}LEN(BUFF$):BFSZ=LNBUF-LEN(BUFF$)30364 MISC=USR(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ):IF PEEK(947)<>1 THEN TRAP ERROR+10:? 0/03I}0366 IF RW=8 THEN RETURN 30368 BUFF$(MISC+1+LEN(BUFF$))="":RETURN 30370 RW=8:GP=11:REM ś30371 FN$="":?J} "OUTPUT FN:";:INPUT FN$:IF FN$="" THEN RETURN 30372 BUFF=ADR(BUFF$):BFSZ=LEN(BUFF$)30374 GOTO RDFILE+4"":?j5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30024 FNFIX=3071030100 REM àŠӛ30105 DIM Fx}5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30010 CATLOG=3053030100 REM àŠӛ30108 DIM M}MISC$(40)30200 REM Šӛ30299 RETURN 30530 REM Ǜ30531 GRAPHICS 0:REM ̛30534 OPEN #7,6,0,"D:*.*"30N}536 INPUT #7,MISC$:? MISC$:IF MISC$(5,8)<>"FREE" THEN GOTO CATLOG+630538 CLOSE #730540 RETURN 30534 OPEN #7,6,0,"D:*.*"30a5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30100 REM àŠӛ P}30101 OPEN #1,4,0,"K:"30111 DIM ER$(922),ECODE$(219)30112 ECODE$="000000001021033052072084110132142157191206228242268281289 Q}314331355366000000000000000366382387406417"30113 ECODE$(100)="43345747348349551252753854956959462663866969471100000000000000 R}0000000000000000000711731751761"30114 ECODE$(193)="789810826850862878893908922"30200 REM Šӛ30210 ER$="INSUFFI S}CIENT MEMORY VALUE ERROR TOO MANY VARIABLES STRING LEGNTH ERROR OUT OF DATA NUMBER GREATER THAN"30211 ER$(103)=" 32767 INPUT T} STATEMENT ERROR DIM ERROR STACK OVERFLOW FLOATING POINT OVERFLOW/UNDERFLOW LINE NOT "30212 ER$(200)="FOUND MISSING FOR STAT U}EMENT LINE TOO LONG GOSUB OR FOR LINE DELETED RETURN ERROR GARBAGE "30213 ER$(289)="INVALID STRING CHARACTOR PROGRAM TOO LON V}G DEVICE NUMBER TOO LARGE FILE ERROR BREAK KEY ABORT IOCB"30214 ER$(386)=" NONEXISTANT DEVICE WRITE ONLY INVALID COMMAND DEV W}ICE OR FILE NOT OPEN BAD IOCB NUMBER READ ONLY "30215 ER$(483)="END OF FILE TRUNCATED RECORD DEVICE TIMEOUT DEVICE NAK SERIA X}L BUS CURSOR OUT OF RANGE "30216 ER$(569)="SERIAL BUS FRAME OVERRUN SERIAL BUS FRAME CHECKSUM ERROR DISK LOCKED "30217 ER$( Y}638)="READ AFTER WRITE COMPARE ERROR FUNCTION NOT IMPLEMENTED INSUFFICIENT RAM DEVICE NUMBER ERROR "30218 ER$(731)="TOO MANY Z} OPEN FILES DISK FULL FATAL SYSTEM DATA I/O ERROR FILE NUMBER MISMATCH FILE NAME ERROR "30219 ER$(826)="POINT DATA LEGNTH ER [}ROR FILE LOCKED COMMAND INVALID DIRECTORY FULL FILE NOT FOUND POINT INVALID "30299 RETURN 30300 TRAP ERROR:ER=PEEK(195):IF \} ER>100 THEN ER=ER-100:REM қ30302 ER=1+ER*3:MISC=VAL(ECODE$(ER+3,ER+5))-1:ER=VAL(ECODE$(ER,ER+2))30304 ? :? ER$(ER,MISC ]}):? "AT LINE ";PEEK(186)+256*PEEK(187):? :? " TO STOP"30306 GET #1,K:IF K=27 THEN STOP 30308 GOTO PEEK(186)+256*PEEK(187 ^}):REM ٛ ";PEEK(186)+256*PEEK(187):? :? " TO STOP"30306 GET #1,K:IF K=27 THEN STOP 30308 GOTO PEEK(186)+256*PEEK(187 5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30006 SCNDMP=3047030100 REM àŠӛ30107 DIM $`}DMP$(46),SCN$(193):SCN$(193)=""30200 REM Šӛ30203 DMP$="hhhhhhhϢEϑ8(˥`"30299 R$a}ETURN 30470 OPEN #7,8,0,"P:":? #7;"A":REM Л30471 INV=0:REM 30472 SCN=PEEK(88)+256*PEEK(89)+7640$b}30474 FOR COL=SCN TO SCN+3930476 MISC=USR(ADR(DMP$),COL,ADR(SCN$),INV)30478 ? #7;"K";SCN$:NEXT COL30480 FOR COL=1 TO 5&}5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30090 RDSCR=30500:WRSCR=30518:GR(d}=830100 REM àŠӛ30102 DIM IO$(83)30105 DIM FN$(28)30200 REM Šӛ30201 IO$="hpBhEhDh(e}hJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`"30299 RETURN 30300 TRAP ERROR:? "ERROR- ";PEEK(195);" (f}AT LINE ";PEEK(186)+256*PEEK(187):END 30310 POKE 195,PEEK(947):CLOSE #7:? "I/O ";:GOTO ERROR30500 RW=4:GP=7:REM қ30501(g} FN$="LOAD SCREEN:"30502 BUFF=PEEK(88)+256*PEEK(89)-11:BFSZ=(256*PEEK(106)-160)-BUFF:GTIA=PEEK(623):POKE BUFF,GR:POKE BUFF+1(h},GTIA30504 FOR MISC=0 TO 8:POKE BUFF+2+MISC,PEEK(704+MISC):NEXT MISC30505 GRAPHICS GR+32:REM Πכ30506 FOR MISC=0 T(i}O 8:POKE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30507 ? FN$;:FN$="":? " FILE NAME";:INPUT FN$30509 IF FN$="D:PI(j}CTURE" THEN BUFF=BUFF+11:BFSZ=BFSZ-11:REM ҠϠԮ30510 MISC=USR(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ):IF PEEK(947)<>1(k} THEN TRAP ERROR+10:? 0/030511 GRAPHICS GR+16+32:REM Šή30513 IF FN$="D:PICTURE" THEN RETURN :REM ҠϠ(l}қ30514 GTIA=PEEK(BUFF+1):POKE 623,GTIA:FOR MISC=0 TO 8:POKE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30516 RETURN 30518 RW=8:(m}GP=11:REM қ30519 FN$="SAVE SCREEN:"30520 GOTO RDSCR+2KE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30516 RETURN 30518 RW=8:(<5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30015 RDSECT=30626:WRSECT=3063230100 REM àŠ,o}ӛ30115 DIM SECTIO$(49),SECT$(129):SECT$(129)=""30200 REM Šӛ30206 SECTIO$(1)="hhhhhhhh h  S,p}S Sԭ `"30299 RETURN 30626 GP=82:REM ԛ30628 MISC=USR(ADR(SECTIO$),DRIVE,GP,ADR(SECT$),SECT)30630 RETURN ,q}30632 GP=87:GOTO RDSECT+2:REM ԛ26 GP=82:REM ԛ30628 MISC=USR(ADR(SECTIO$),DRIVE,GP,ADR(SECT$),SECT)30630 RETURN ,%5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30001 HEXDEC=30320:DECHEX=3034030100 REM àŠ0s}ӛ30106 DIM HEX$(4),CHA$(16)30200 REM Šӛ30205 CHA$="0123456789ABCDEF"30299 RETURN 30320 REM Û30322 CH0t}A=0:TEMP=1:NUM=4096:DEC=030324 CHA=CHA+130326 IF CHA$(CHA,CHA)<>HEX$(TEMP,TEMP) THEN GOTO HEXDEC+430328 DEC=DEC+((CHA-1)*N0u}UM)30330 TEMP=TEMP+1:CHA=0:NUM=NUM/16:IF TEMP<5 THEN GOTO HEXDEC+430332 RETURN 30340 REM ؛30342 TEMP=1:NUM=409630340v}4 MISC=DEC/NUM:CHA=INT(MISC)30346 HEX$(TEMP,TEMP)=CHA$(CHA+1,CHA+1)30348 DEC=(MISC-CHA)*NUM:IF DEC-INT(DEC)>0 THEN DEC=INT(0w}DEC)+130350 TEMP=TEMP+1:NUM=NUM/16:IF TEMP<5 THEN GOTO DECHEX+430352 RETURN (MISC-CHA)*NUM:IF DEC-INT(DEC)>0 THEN DEC=INT(0O5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30013 ALIGN=3057430100 REM àŠӛ30108 DIM M4y}ISC$(40)30200 REM Šӛ30299 RETURN 30574 MISC$=" .00":TEMP=LEN(MISC$)-3:MISC=ABS(MISC):REM Λ30576 IF MI4z}SC>=1 THEN MISC$(TEMP-INT(CLOG(MISC)),TEMP)=STR$(INT(MISC))30578 MISC=MISC-INT(MISC):MISC=MISC*100:MISC=INT(MISC):IF MISC>=14{} THEN MISC$((TEMP+3)-INT(CLOG(MISC)))=STR$(MISC)30580 RETURN 78 MISC=MISC-INT(MISC):MISC=MISC*100:MISC=INT(MISC):IF MISC>=14?5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30020 BUTTON=3066030100 REM àŠӛ30200 REM 8}}Šӛ30299 RETURN 30660 TEMP=53279:IF PEEK(TEMP)=7 THEN GOTO BUTTON:REM Λ30662 IF PEEK(TEMP)=3 THEN MISC=38~}30664 IF PEEK(TEMP)=5 THEN MISC=230666 IF PEEK(TEMP)=6 THEN MISC=130668 IF PEEK(TEMP)<>7 THEN GOTO BUTTON+830669 RETURN 8|5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30011 RDPTA=30440:WRPTA=30444:RDPTB=30448:WRPTB=3045230100 R<}EM àŠӛ30200 REM Šӛ30299 RETURN 30440 POKE 54018,0:POKE 54016,0:REM 30442 POKE 54018,6<}0:PORTA=PEEK(54016):RETURN 30444 POKE 54018,0:POKE 54016,255:REM 30446 POKE 54018,60:POKE 54016,PORTA:RETURN 30448 PO<}KE 54019,0:POKE 54017,0:REM ›30450 POKE 54019,60:PORTB=PEEK(54017):RETURN 30452 POKE 54019,0:POKE 54017,255:REM ›3<}0454 POKE 54019,60:POKE 54017,PORTB:RETURN 54019,60:PORTB=PEEK(54017):RETURN 30452 POKE 54019,0:POKE 54017,255:REM ›3<,5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30005 ETIME=3056030100 REM àŠӛ30103 DIM E@}T$(8):ET$="00:00:00"30200 REM Šӛ30299 RETURN 30560 MISC=PEEK(20)+256*PEEK(19)+65536*PEEK(18):REM ś30562 @}HOUR=INT(MISC/216000):MIN=INT(MISC/3600)-(HOUR*60):SEC=INT(MISC/60)-(HOUR*3600+MIN*60)30564 ET$(1,2)=STR$(HOUR):IF HOUR<10 T@}HEN ET$(1,1)="0":ET$(2,2)=STR$(HOUR)30566 ET$(4,5)=STR$(MIN):IF MIN<10 THEN ET$(4,4)="0":ET$(5,5)=STR$(MIN)30568 ET$(7,8)=S@}TR$(SEC):IF SEC<10 THEN ET$(7,7)="0":ET$(8,8)=STR$(SEC)30570 RETURN 0 THEN ET$(4,4)="0":ET$(5,5)=STR$(MIN)30568 ET$(7,8)=S@F5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30021 LDFNT=3067030100 REM D}Šӛ30102 DIM IO$(83)30105 DIM FN$(28)30200 REM Šӛ30201 IO$="hpBhEhDhhJK VhhhD}hhh`phhBhEhDhIhH V B VHԽI`"30299 RETURN 30300 TRAP ERROR:? "ERROR- ";PEEK(195);" AT LINE ";PEEK(18D}6)+256*PEEK(187):END 30310 ? "I/O ";:GOTO ERROR30670 MISC=PEEK(106):TEMP=PEEK(740):IF MISC<>TEMP-5 THEN MISC=TEMP-5:POKE 10D}6,MISC:GRAPHICS 0:COLD=1:REM ԛ30672 CSET=MISC+1:TEMP=256*CSET-LEN(FN$):IF COLD=1 THEN COLD=0:GOTO LDFNT+630674 FOR COUND}T=1 TO LEN(FN$):IF PEEK(TEMP+COUNT-1)=ASC(FN$(COUNT,COUNT)) THEN NEXT COUNT:GOTO LDFNT+1230676 FN$(LEN(FN$)+1)="":BUFF=256*D}CSET:BFSZ=1024:RW=4:GP=7:MISC=USR(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ)30678 FN$(LEN(FN$))="":IF PEEK(947)<>1 THEN POKE 195,PEED}K(947):GOTO ERROR+1030680 IF MISC<>1024 THEN POKE 195,21:GOTO ERROR+1030682 POKE 756,CSET:FOR COUNT=1 TO LEN(FN$):POKE TEMPD}+COUNT-1,ASC(FN$(COUNT,COUNT)):NEXT COUNT:RETURN 195,21:GOTO ERROR+1030682 POKE 756,CSET:FOR COUNT=1 TO LEN(FN$):POKE TEMPD25 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30016 GR12=30634:GR0=3063630100 REM àŠӛ30H}200 REM Šӛ30299 RETURN 30634 TEMP=PEEK(560)+256*PEEK(561):POKE TEMP+3,68:REM ұ30635 FOR MISC=TEMP+6 TO TEMH}P+6+22:POKE MISC,4:NEXT MISC:RETURN 30636 TEMP=PEEK(560)+256*PEEK(561):POKE TEMP+3,66:REM Ұ30637 FOR MISC=TEMP+6 TO TEMP+H}6+22:POKE MISC,2:NEXT MISC:RETURN 30636 TEMP=PEEK(560)+256*PEEK(561):POKE TEMP+3,66:REM Ұ30637 FOR MISC=TEMP+6 TO TEMP+H#5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30017 GR15=30640:GR31=3064630100 REM àŠӛ3L}0200 REM Šӛ30299 RETURN 30640 TEMP=167:IF PEEK(87)<8 THEN GRAPHICS 8+32:REM ұ30642 MISC=USR(ADR("hhhϭ0L}˭1̠ ))@ϐ`"),TEMP)30644 RETURN 30646 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM ҳ30648 GOTO GR1L}5+2̠ ))@ϐ`"),TEMP)30644 RETURN 30646 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM ҳ30648 GOTO GR1L5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30018 GR8=30650:GR24=3065830100 REM àŠӛ30P}200 REM Šӛ30299 RETURN 30650 TEMP=167:IF PEEK(87)<8 THEN GRAPHICS 8+32:REM Ҹ30652 MISC=USR(ADR("hhhϭ0˭P}1̠ ))@ϐ`"),TEMP)30654 RETURN 30656 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM Ҳ30658 GOTO GR8+2R}5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30023 LAND=30700:LOR=30702:EOR=3070430100 REM àŠT}ӛ30200 REM Šӛ30299 RETURN 30700 MISC=USR(ADR("hhhhh%ԅԩ`"),X,Y):RETURN :REM ě30702 MISC=USR(AT}DR("hhhhhԅԩ`"),X,Y):RETURN :REM қ30704 MISC=USR(ADR("hhhhhEԅԩ`"),X,Y):RETURN :REM қě30702 MISC=USR(ATh5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30002 MENU=3040030100 REM àŠӛ30101 OPEN #X}1,4,0,"K:"30200 REM Šӛ30299 RETURN 30400 POKE 752,1:? "}":REM ՛30402 ? "(PROGRAM NAME)"30404 ? "1. FIRX}ST ITEM"30406 ? "2. NEXT"30408 REM ? "3. NEXT"30410 REM ? "4. NEXT"30412 REM ? "5. NEXT"30414 REM ? "6. NEXT"30416X} REM ? "7. NEXT"30418 GET #1,K:POKE 752,030420 IF K=49 THEN GOTO MENU30422 IF K=50 THEN GOTO MENU30424 IF K=51 THEN GOTOX} MENU30426 IF K=52 THEN GOTO MENU30428 IF K=53 THEN GOTO MENU30430 IF K=54 THEN GOTO MENU30432 IF K=55 THEN GOTO MENU304X}34 IF K=56 THEN GOTO MENU30436 GOTO MENUF K=53 THEN GOTO MENU30430 IF K=54 THEN GOTO MENU30432 IF K=55 THEN GOTO MENU304X*5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30014 NOBRK=3058430100 REM àŠӛ30200 REM \}Šӛ30299 RETURN 30584 MISC=PEEK(16):IF MISC>127 THEN MISC=MISC-128:POKE 53774,MISC:RETURN :REM ˛30200 REM \r5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30012 RENAME=30460:DELETE=30462:LOCK=30464:UNLOCK=30466:INIT=`}3046830100 REM àŠӛ30105 DIM FN$(28)30200 REM Šӛ30299 RETURN 30460 XIO 32,#7,0,0,FN$:RETUR`}N :REM ś30461 REM źΤĺĬע ś30462 XIO 33,#7,0,0,FN$:RETURN :REM ś30463 REM ź`}ΤĺŢ ś30464 XIO 35,#7,0,0,FN$:RETURN :REM ˛30466 XIO 36,#7,0,0,FN$:RETURN :REM ˛30468 XIO 254,#7`},0,0,FN$:RETURN :REM ԛ64 XIO 35,#7,0,0,FN$:RETURN :REM ˛30466 XIO 36,#7,0,0,FN$:RETURN :REM ˛30468 XIO 254,#7`5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30014 TGR=3060030100 REM àŠӛ30108 DIM MISd}C$(40)30119 DIM TGR$(58)30200 REM Šӛ30230 TGR$="hhhhhhhhhТIAˁi(ː`"3d}0299 RETURN 30600 REM Ƞҩ30602 SCN=PEEK(88)+256*PEEK(89):COL=X:ROW=Y*320:CSET=PEEK(756)*25630604 FOR COUNT=1 TO Ld}EN(MISC$)30606 CHA=ASC(MISC$(COUNT,COUNT)):INV=0:IF CHA>128 THEN CHA=CHA-128:INV=130608 IF CHA<32 THEN CHA=CHA+64:GOTO TGR+d}1230610 IF CHA>31 AND CHA<96 THEN CHA=CHA-3230612 TEMP=CSET+CHA*8:NUM=SCN+COL+ROW30614 MISC=USR(ADR(TGR$),NUM,TEMP,MIX,INVd})30616 COL=COL+1:X=COL:IF COL>PEEK(83) THEN COL=PEEK(82):X=COL:ROW=ROW+320:Y=ROW/32030618 IF ROW>7360 THEN ROW=0:Y=030620 d}NEXT COUNT:RETURN =COL:IF COL>PEEK(83) THEN COL=PEEK(82):X=COL:ROW=ROW+320:Y=ROW/32030618 IF ROW>7360 THEN ROW=0:Y=030620 d5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30003 WAIT=3055030100 REM àŠӛ30200 REM h}Šӛ30299 RETURN 30550 MISC=PEEK(20)+256*PEEK(19)+65536*PEEK(18):REM ԛ30552 IF PEEK(20)+256*PEEK(19)+65536*PEEh}K(18)89 THEN MISC=MISC-3230592 IF MISC<>78 AND MISC<>89 THEN MISC$="ERR":RETURN 30594 MISC$="YES":IF l}MISC=78 THEN MISC$="NO"30596 RETURN C=MISC-3230592 IF MISC<>78 AND MISC<>89 THEN MISC$="ERR":RETURN 30594 MISC$="YES":IF l&5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30022 WINDOW=30686:BLIND=3069430100 REM àŠp}ӛ30108 DIM MISC$(40)30200 REM Šӛ30299 RETURN 30686 MISC=48:REM כ30688 FOR COUNT=1 TO 9:MISC$(COUNT,COUp}NT)=CHR$(PEEK(703+COUNT)):NEXT COUNT30690 GRAPHICS PEEK(87)+MISC30692 FOR COUNT=1 TO 9:POKE 703+COUNT,ASC(MISC$(COUNT,COUNTp})):NEXT COUNT:RETURN 30694 MISC=32:GOTO WINDOW+2:REM ě+MISC30692 FOR COUNT=1 TO 9:POKE 703+COUNT,ASC(MISC$(COUNT,COUNTp<5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30019 SELECT=3038230020 BUTTON=3066030100 REM àŠt}ӛ30200 REM Šӛ30299 RETURN 30382 ? "}":? " FOR NEXT ITEM OR ":? 30384 ? "FIRST ITEM t} ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30386 ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30388 Rt}EM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30390 REM ? "NEXT ":GOSUB BUTTON:IF MISCt}=2 THEN GOTO SELECT30392 REM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30394 REM ? "NEXT t} ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30396 REM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30t}399 GOTO SELECT+230660 TEMP=53279:IF PEEK(TEMP)=7 THEN GOTO BUTTON:REM Λ30662 IF PEEK(TEMP)=3 THEN MISC=330664 IF PEEt}K(TEMP)=5 THEN MISC=230666 IF PEEK(TEMP)=6 THEN MISC=130668 IF PEEK(TEMP)<>7 THEN GOTO BUTTON+830669 RETURN 30664 IF PEEtpN$(28)30108 DIM MISC$(40)30200 REM Šӛ30710 IF FN$="" THEN RETURN :REM ؛30712 IF LEN(FN$)=1 THEN GOTO FNFx}IX+830714 IF FN$(2,2)=":" THEN RETURN 30716 IF LEN(FN$)>2 THEN IF FN$(3,3)=":" THEN RETURN 30718 MISC$="D:":MISC$(3)=FN$:Fz}12 4 1 5 1 10 70 2 12 132@Feel free to make and distribute as many copies of this disk as you wish. A voluntar|}y payment is requested from recipients of such copies. The suggested price is $10.00 for free copies and $5.00 for copies bo|}ught from software copy services. I will be glad to give technical support to those who pay this fee. Please include a self|}-addressed, stamped envelope whenever sending for information.TheAtari BASIC Power PackVolume 1--- 1986 by Bob D|}uHamel6915 Casselberry WaySan Diego, CA 92119The designers of Atari BASIC had a difficult task. Cram a reasonably po|}werful version of BASIC into 8K of memory. To do this they had to sacrifice many features. String arrays and automatic line|} numbering, among other things, had to go. Despite this they produced an excellent product that many serious programmers (li|}ke myself) prefer over "more powerful" BASICs.The designers added three features which overcome the apparent weaknesses of |}of Atari BASIC: 111. The ability to label and index GOTO and GOSUB commands;2. The ability to carry machine language rout|}ines in string variables and;3. Virtually unlimited string length. 10These features essentially give a programmer the |}ability to add his own commands to the Atari BASIC repertoire.I have used the above features in the routines of the Atari B|}ASIC Power Pack. The routines are written in BASIC with machine language carried in strings. They require no special hardwa|}re or disk files to operate. They become a permanent part of the program which uses them. To use one of the routines all yo|}u do is give the command "GOSUB" and the routine name. No line numbers need to be used because each routine location is labe|}led with the routine name.LOADING THE ROUTINESTo load a routine use the ENTER command. For example, if you want the comp|}uter to give error messages in english type... ENTER "D:ERROR.RUT" [RETURN]then run the program. Now if you try to read|} a disk file which doesn't exist, the computer will print "FILE NOT FOUND" instead of "ERROR- 170", etc. If you are using D|}ISKIO (which loads automatically with this disk) all you have to do to enter the routine is type "ENTER ERROR.RUT". In fact,|} the first three letters of each routine name are unique so, ENTER ERR*.* or E. ERR*.* is enough.These routines are not des|}igned to work alone. They are designed to become part of other programs. If you enter a routine into an empty computer and |}try to run it you will get an error message. You are expected to write your own program to "call" the routine. You can also|} merge the routine with an existing program by using the ENTER command. When merging a routine you must usually enter the ro|}utine after an existing program is loaded. If a program is loaded using the LOAD command, anything else in memory will be er|}ased. If you use the ENTER command to load an existing program, it may write over parts of any other program in memory. Thi|}s would happen if both programs use some of the same line numbers.The routines are designed for complete compatibility. Al|}l of the routines can be used in one program with no interference.All of the routines use line numbers higher than 29999 or|} lower than 10. Line 5 must be allowed to execute before the main program which uses the routine starts. Only the even numb|}ered lines are essential to the routines. The odd numbered lines perform auxiliary functions and can be deleted if not neede|}d.Lines 30000 through 30299 are common to all of the routines. Each routine uses some line numbers in this range to initia|}lize. Most of the reserved variables, those which must never be altered, are found in this line number range. Other variabl|}es used by the routines are transitional and can usually be shared with other routines and programs. Atari BASIC allows the |}use of only 128 variables. Variable sharing might become necessary in complex programs.Once a routine has been initialized|} it can be used after the program has stopped. Just type in the GOSUB command directly from the keyboard. When the routine |}is finished with it's job, control will return to the keyboard. The following demonstration is an example of using a routine|} directly from the keyboard.DEMONSTRATION:One problem with Atari BASIC is reading disk files to string variables. You ca|}n use the INPUT command but the program will stop reading the file if it finds a carriage-return code. This is not very good|} for text files. The only way to read a complete file, carriage-returns and all, is to use a routine like the following. 11|}10 DIM BUFF$(20000)1000 REM read file1010 TRAP 10601020 OPEN #1,4,0,"D:INSTRUCT.000"1030 GET #1;TEMP1040 BUFF$(LEN(BUFF|}$)+1)=CHR$(TEMP)1050 GOTO 10301060 CLOSE #11070 PRINT BUFF$ 10This routine reads the file one byte at a time and puts it|} at the present end of BUFF$. Reaching the end of the file is treated as an error so the routine jumps to line 1060. This r|}outine works but is very slow, try it.FASTIO is probably the most useful of all the routines. It allows files to be read f|}rom a disk to a string variable at full speed. To try FASTIO use the following command sequence. 1. NEW 2. ENTER "D:FAS|}TIO.RUT 3. LIST 30196 Change line 30196 to read: LNBUF=20000:DIM BUFF$(LNBUF) 4. RUN Ignore the error mess|}age 5. GOSUB RDFILE 6. D:INSTRUCT.000 7. PRINT BUFF$This will load the instruction file you are now reading into BUFF|}$, then print it on the screen.D:INSTRUCT.001INT BUFF$This will load the instruction file you are now reading into BUFF|1ROUTINE DESCRIPTIONSCATLOG.RUTCATLOG allows viewing of the disk directory while a BASIC program is running.To view }the directory with CATLOG use the command GOSUB CATLOG. Line 31743 clears the screen and is optional.Lines 31745 and 317}75 should be deleted unless ERROR.RUT is also entered into the computer.HEXDEC.RUTHEXDEC converts a 4 place hexadecimal n}umber to decimal or a decimal number less than 65535 to a 4 place hexadecimal number.To convert from hexadecimal to decimal}, load the hexadecimal number into HEX$. The number in HEX$ must be 4 places (HEX$="000A"). With HEX$ loaded give the comma}nd GOSUB HEXDEC. The decimal version of the number will then be placed into the variable DEC.To convert a decimal number t}o hexadecimal, load the decimal number into the variable DEC. With DEC loaded give the command GOSUB DECHEX. The hexadecima}l version of the number will then be placed into HEX$. EXAMPLE: 10 HEX$="000A" 20 GOSUB HEXDEC 30 PRINT DECOR 10 }DEC=10 20 GOSUB DECHEX 30 PRINT HEX$The first example will print the number 10 and the second example will print the hex}adecimal number 000A.FASTIO.RUTFASTIO contains a machine language subroutine in IO$. This subroutine allows disk and tap}e access much faster than BASIC normally allows.FASTIO does input and output to and from the string variable BUFF$. BUFF$ }may be manipulated in any way prior to input and output.IMPORTANT: Before using FASTIO for files larger than 1K (1,024 byte}s) change the value of the variable LNBUF in line 30196. The value of LNBUF determines the maximum length of BUFF$. LNBUF=F}RE(0) will cause BUFF$ to use all of the unused memory. If you do this, type CLR after stopping the program for editing.To} do output with FASTIO: 111. Be sure that the data to be sent is transferred to BUFF$ if it is not already there.2. Pu}t the command GOSUB WRFILE into your program.3. When the prompt, OUTPUT FN: appears, type in the device and file name. }10The data in BUFF$ will then be sent to the specified device. The device and file name may be any valid file specification} (D:TEST, C:, P:, etc.).Line 30371 is optional. It will ask for the device and file name to write to. It may be deleted i}f your program provides a device and file name in FN$ before GOSUBing to FASTIO.IMPORTANT: If your program provides a devic }e and file name in FN$, put a carriage-return code, CHR$(155), at the end of FN$. For example: 1010 FN$=NAME$ 1020 FN$(LE }N(FN$)+1)=CHR$(155) 1030 GOSUB WRFILELine 1020 places the carriage-return code at the end of FN$. A heart, CHR$(0) or [CT }RL][,], will work too. 1010 FN$="D:WORDLIST(heart)" 1020 GOSUB RDFILETo get the heart character in a program, press [ESC }] then press [,] (comma) while holding [CTRL].If you don't place a carriage-return code or a heart at the end of FN$ you ma }y get a file-not-found error with a good file name. You may also get garbage in a file name on the disk. Filling FN$ with h}earts before putting the file name in it, as in lines 30361 and 30371, is another way of solving this problem.To do input w}ith FASTIO: 111. put the command GOSUB RDFILE into your program.2. When the prompt, INPUT FN: appears, type in the device} and file name. 10The file from the specified device will be placed in BUFF$. If BUFF$ already has data in it the new d}ata will be placed at the end of the existing data.Line 30361 performs the same function as line 30371 above.MENU.RUTMe}nu will display up to 7 routine titles and go to the routines with the touch of only one key.Place the routine titles in li}nes 30404 through 30416 (replacing the word "NEXT" in each line). Place the GOTO or GOSUB commands in the same order in line}s 30420 through 30434. If a menu line contains a GOSUB command, end the line with GOTO MENU.EXAMPLE: 30404 ? "1. LOAD F}ILE" 30406 ? "2. SAVE FILE"AND 30420 IF K=49 THEN GOSUB RDFILE:GOTO MENU 30422 IF K=50 THEN GOSUB WRFILE:GOTO MENUE}RROR.RUTThis routine displays error messages in english without stopping the program.IMPORTANT: If ERROR is used with FAS}TIO or SCRIO be sure to enter ERROR last. FASTIO and SCRIO each have a short error handling routine using the same line numb}ers as ERROR. They will write over ERROR if they are entered afterward.Line 30308 will return to the line where the error }occurred. You may need to change this line to go to another routine. MENU or SELECT are logical places to go to if your pro}gram use these routines.CONPORT.RUTThis routine reads data from and writes data to the front controller ports. CONPORT d}oes not work the same way as the BASIC command STICK(x). It reads and writes data as 8 bit bytes. One byte to ports 1 and 2} (port A) and one byte to ports 3 and 4 (port B). (XL and XE models do not have port B.)The electronic configuration of the} controller ports is as follows. ----------- ----------- \0 1 2 3 */ \4 5 6 7 */ \* + - */ \* + - *}/ ------- ------- 0 through 7 are the binary data bits for port A or port B. + and - are +5 volts and gr}ound respectively.To read data from either port give the command GOSUB RDPTA (or RDPTB). The data at the port will be load }ed into the variable PORTA (or PORTB).To write data to either port, load the variable PORTA (or PORTB) with the data. This!} data must be a number from 0 to 255. Give the command GOSUB WRPTA (or GOSUB WRPTB). The data will be sent to the specified"} port.This routine can be used for various experiments involving computer control or computer monitoring of the outside env#}ironment. The ports are TTL compatible (0V=0, +5V=1). Be sure not to exceed +5 volts at the ports for input.SEMIDOS.RUT$}This routine allows the following five DOS operations to be executed by a BASIC program: LOCK, UNLOCK, RENAME, DELETE and FOR%}MAT.To use one of the DOS operations first load FN$ with the device and name of the file to be involved, (both files for RE&}NAME). With FN$ loaded give the command GOSUB LOCK (UNLOCK, RENAME, DELETE or INIT for format).EXAMPLE: 10 FN$="D:TEST'}":GOSUB LOCKOR 10 FN$="D:OLD,NEW":GOSUB RENAMEOR 10 FN$="D1:":GOSUB INITNOTE: There will be no warning for deleti(}ng, be careful.SCNDMP.RUTThis routine will dump a high resolution graphics screen to an Epson compatible printer. SCNDM)}P works only with graphics modes 8, 9, 10, 11 and 15. It works best with modes 8 and 15.Line 30470 changes the line spacin*}g of the printer to that necessary for graphics. If the variable INV equals 255 the screen will print in inverse color. Lin+}e 30471 makes INV equal 0 since other routines may change it. This line must be deleted or changed to print inverse color. ,}Line 30482 first tells the printer that the next 192 codes are for graphics and then sends one line of graphics.To print gr-}aphics first have a screen ready then give the command GOSUB SCNDMP.SCNDMP uses a machine language subroutine which sends d.}ata to the printer as fast as the printer can handle it. Similar routines in BASIC take several seconds to scan each line of}SCRIO.RUTThis routine will save a graphics screen or load the same from disk or tape. The variable GR in line 30090 deter0}mines the graphics mode (preset to mode 8). To enter a graphics mode use the command GRAPHICS GR or GRAPHICS GR+16 with GR c1}ontaining the mode number. To change GR to the current graphics mode, use the command GR=PEEK(87).Notice that SCRIO has a 2}several odd line numbers. Most of these lines allow SCRIO to ask for a device and file name. If these lines are deleted, th3}e calling program must provide the device and file name in FN$.IMPORTANT: FN$ must end with a carriage-return code or a hea4}rt. See FASTIO for details.Lines 30505 and 30511 open and close a text window. If WINDOW.RUT is used by your program, the5}se lines should be changed to GOSUB WINDOW and GOSUB BLIND respectively.As provided, SCRIO is used as follows:To save the6} current screen: 111. Put the command GOSUB WRSCR in your program. 14A text window will appear at the bottom of the scree7}n with the words SAVE SCREEN and the prompt: FILE NAME?. 112. Type the desired device and file name then [RETURN]. 10The 8}screen will be saved to the device specified and the text window will disappear. Be sure the program doesn't stop after the 9}the screen is saved or the screen will be lost.To load a graphics screen first be sure that the variable GR contains the gr:}aphics mode number of the screen to be loaded. The proper graphics mode should be entered before the call to SCRIO is made.;} 111. Put the command GOSUB RDSCR in your program. 14A text window will appear. The words LOAD SCREEN and the prompt FILE<} NAME? will be in the window. 112. Type the desired device and file name then [RETURN]. 10The screen will be loaded from =}the specified device. FILE FORMATThe first byte of each screen file is the graphics mode of the screen. This makes it po>}ssible to write a routine to determine what graphics mode to enter before loading a screen. The next byte is information for?} the GTIA chip. The next 9 bytes are the color information. The remaining bytes are the screen data.If the file name "D:P@}ICTURE" is used, SCRIO will load or save in the uncompressed Micro-Illustrator (Atariartist) format. (Use the [CLEAR] and [INA}SERT] keys to load and save in this format with Atariartist.) SCRIO will also load Micro-Painter files if they are renamed tB}o "D:PICTURE". However, it will not load the color data (the last four bytes of the file).WAIT.RUTThis routine will stopC} the program for the number of seconds specified in the variable SEC. Fractions of a second may be used. The timing of thisD} routine is not precise. The timer counts vertical blanking cycles of the T.V. which is slightly different from 1/60 second.E}To use the routine, load SEC with the number of seconds to wait then give the command GOSUB WAIT.ETIME.RUTThis routine F}converts the data in the internal clock to hours, minutes and seconds and puts the result in ET$. The result is either the tG}ime elapsed since the computer was turned on, the last time [SYSTEM RESET] was pressed or the clock was manually set to zero H}(by poking 18,19 and 20 with 0). To print the current elapsed time use the following command. GOSUB ETIME:PRINT ET$TGRAPI}H.RUTIt is difficult to mix text and graphics on the ATARI screen. Even so, you cannot mix text and graphics on the same sJ}creen line.TGRAPH will print mode 0 characters on a mode 8 screen. The text and graphics may be freely mixed and you don'tK} have to monkey with the display list.To print text on a mode 8 screen load up to 40 characters into MISC$, set the positioL}n with the variables X and Y then give the command GOSUB TGR.EXAMPLE: 110 GRAPHICS 8 120 MISC$="HELLO" 130 X=2:Y=10 M}140 GOSUB TGRIf the variable, MIX, is 1, the text will be "Exclusive ORed" to the screen. If you then try to write the saN}me text in the same place, the text will be cleanly erased.If the variable INV is 1, the text will be printed in inverse viO}deo.GR12.RUTThis routine converts a graphics 0 (text) screen to graphics 12 (ANTIC 4). Graphics 12 is otherwise not avaiP}lable on the 400/800. The computer still thinks it is in graphics 0. With a special character set, ANTIC_4.FNT on this diskQ}, you can have five colors in the text mode. Use the command GOSUB GR12. To return to graphics 0 use GOSUB GR0 or GRAPHICS R}0.GR15.RUTThis routine converts a graphics 8 screen into a graphics 15 (ANTIC 14 or mode 7.5) screen. Graphics 15 is othS}erwise not available on the 400/800. This is the screen mode used by Micro-Illustrator and Micro-Painter. The computer stilT}l thinks it is in graphics 8. Use the command GOSUB GR15, for split screen and GOSUB GR31, for full screen.GR8.RUTConverU}ts a graphics 15 screen back a graphics 8. Use GOSUB GR8 or GOSUB GR24.BUTTON.RUTThis routine reads the game buttons. TV}o use BUTTON give the command GOSUB BUTTON. The program will stop and wait until one of the game buttons is pressed. After W}a button is pressed, the variable MISC will have either 1, 2 ore 3 in it. 1 means the [START] button was pressed, 2 means thX}e [SELECT] button was pressed and 3 means the [OPTION] button was pressed.ALIGN.RUTThis routine is used to decimal align Y}a column of numbers. To use the routine, place the number to be aligned into the variable MISC. Use the command GOSUB ALIGNZ}. The decimal aligned number will be placed into MISC$. For example: 110 MISC=12.5 120 GOSUB ALIGN 130 PRINT MISC$Thi[}s will print 12.50As written, ALIGN works with a maximum of four places left of the decimal point. However, it can be easi\}ly modified to work with more. Just insert more blank spaces in MISC$ in line 30574.WINDOW.RUTThe command GOSUB WINDOW, ]}will open a text window at the bottom of any mode 1 - 8 graphics screen. To close the window use the command GOSUB BLIND.L^}OGIC.RUTThis routine performs three logic functions: AND, OR and EXCLUSIVE OR. To use the routine, load the numbers to be _}operated on into the variables X and Y. The numbers must be from 0 to 255. Give the command GOSUB LAND, LOR or EOR. The re`}sult is placed into the variable MISC.SECTIO.RUTWith this routine you can read or write to a single density disk, sector a}by sector. First place the drive number into the variable, DRIVE and the sector number (1 - 720) into the variable, SECT. Tb}o read a sector use the command GOSUB RDSECT. The data in the specified sector will be placed into SECT$. To write to a secc}tor use the command GOSUB WRSECT, and the data in SECT$ will be sent to the specified sector. Be sure you know what you are d}doing when you write to a sector. The right mistake can cause a whole disk to be lost.SELECT.RUTThis routine is similar e}to MENU except it is designed to use a text window at the bottom of a graphics screen.YESNO.RUTThis routine is used to gef}t a yes/no response from the keyboard. Use the command GOSUB YESNO. A response of Y or YES will return the word YES in MISCg}$. A response of N, NO, [RETURN] or 0 will return the word NO in MISC$. Any other response will return the word ERR.FONTLq}nB.Atari B BASIC B Power B Pack b%DOS SYSb)@diskio bCFASTIO RUTbLCATLOG RUTbOERROR RUTb_SCNDMP RUTb cSCRIO RUTbnSECTIO RUTbrHEXDEC RUTbxALIGN RUTb|BUTTON RUTbCONPORT RUTbETIME RUTb FONTLOADRUTbGR12 RUTbGR15 RUTbGR8 RUTbLOGIC RUTbMENU RUTbNOBRK RUTbSEMIDOS RUTbTGRAPH RUTbWAIT RUTbYESNO RUTbWINDOW RUTbSELECT RUTbKFNFIX RUTb-INSTRUCT000b;INSTRUCT001bC/INSTRUCT002b{INSTRUCT003b+VARLIST bYALLRUT b list_P b ;ANTIC_4 FNTb D__read__ b6P__DEMO__ >PICTURE CGAME TMPOAD.RUTThis routine loads a custom character set. First place the C-set file name into FN$ then give the command GOSUB LDFr}NT. The routine will move the screen data area in memory and load the C-set above the screen data. If a C-set by the same ns}ame is already in memory the routine will detect it and do nothing.To return to the normal font use the command POKE 756,22t}4 or GRAPHICS 0. To get the custom font back use POKE 756,CSET or repeat the font loading procedure above.FNFIX.RUTThis u}routine fixes a disk file name which is not preceded by "D:". Use the command GOSUB FNFIX before doing an input or output opv}eration which might involve the disk drive. IF the device and file name in FN$ are not in the proper format, FNFIX will assuw}me it is a disk file name without the "D:" and will insert the "D:". For example, FNFIX will change the file name HELLO to Dx}:HELLO. It will leave the file name C: alone.One way to use FNFIX is to insert the command GOSUB FNFIX into FASTIO after ty}he file name is put into FN$ but before the jump to machine language is made.NOBRK.RUTThe command GOSUB NOBRK will disablz}e the break key. This command must be reused after any input or output operation.D:INSTRUCT.003d GOSUB NOBRK will disabldlist_PThis program will list any of the routines on an Epson compatible graphics printer. The extensive use of special ch|}aracters makes many of the routines unlistable with a conventional printer. Just run list_P and type the routine name when p}}rompted.ALLRUTThis is the complete set of routines merged into one big routine for listing purposes.DOS.SYSThis is a ~}modified version of DOS 2.5. It allows the use of upper-case and lower-case letters as well as @,[,\,],^ and _. It also use}s the prefix "@" in place of the name "AUTORUN.SYS" for autorun programs.@diskioThis "AUTORUN.SYS" program allows easy di}sk access from the BASIC editor. Type "HELP" to see a list of commands. For more details, see Antic Magazine, January 1985.}D:VARLISTom the BASIC editor. Type "HELP" to see a list of commands. For more details, see Antic Magazine, January 1985. 12 4 1 5 0 10 70 2 12 132ROUTINE VARIABLES* The variable MISC can be substituted if you are out of varia}ble names (only 128 are allowed).! Used temporarily. May be used freely by other routines.!BFSZ Holds the amount of s}pace in BUFF$ available for I/O read operations. If BUFF$ already contains data, BFSZ is adjusted to reflect the remaining s}pace. For I/O write operations BFSZ holds the length of BUFF$.!BUFF Holds the address of BUFF$ for I/O write operations. } For I/O read operations BUFF is adjusted to point to the first free byte beyond any data Which is already in BUFF$.!CHA }Used to point to characters in CHA$ in HEXDEC. Holds the ATASCII code for printing characters in TGRAPH.CHA$ Contains al}l of the hexadecimal characters for indexing in HEXDEC.!COL Loaded with the address of the first byte of a column of scre}en data to be read into SCN$ in SCNDMP. Holds the horizontal position to print in TGRAPH.COLD Used by FONTLOAD to determi}ne if a custom font has been loaded.!DEC Holds a decimal number for conversion to hexadecimal or the result of a hex to d}ec conversion.DMP$ Contains a machine language routine to scan one column of the screen.!DRIVE Drive number for sector} I/O.ECODE$ Holds pointers to english error messages in ER$.ER Loaded with the error code when an error occurs. E}R$ Contains the english versions of all error codes.ET$ Loaded with the result (hours:minutes:seconds) of ETIME!FN$} Loaded with the device and file name for input and output.GR Contains the current graphics mode.!GP Holds the c}ode which tells IO$ whether to use the get or the put operation.HEX$ Used to hold four hexadecimal digits for conversion }to decimal or holds the result of a dec to hex conversion.!HOUR Temporary holds the hours in ETIME.IO$ contains a mac}hine language routine which opens an I/O channel, either reads to or writes from a specified range of memory (BUFF$ in FASTIO}, the screen data in SCRIO) and then closes the channel.*K Loaded with the ATASCII code when a key is pressed using the} GET command. MISC may be substituted if necessary and the key code need not be saved.LNBUF Contains the maximum length f}or BUFF$.!MIN Temporarily hold the number of minutes in ETIME.MISC Used various places where a variable is needed tem}porarily.MISC$ A 40 place string for general purposes. Holds the characters to be printed by TGRAPH.!NAME Points to th}e memory address where the device name is stored for input or output with IO$.!ROW Holds the vertical position to print i}n TGRAPH.!RW Holds the code which tells IO$ whether to open a channel to read or to write.!SCN Loaded with the addre}ss of the screen data.SCN$ Used to hold one column of screen data just prior to printing.!SEC Loaded with the number }of seconds to delay in WAIT. Also temporarily holds the number of seconds in ETIME.!SECT Sector number for SECTIOSECT$ }Sector data for SECTIO!X Loaded with various horizontal positions. Holds one operand for LOGIC.RUT!Y Loaded with} various vertical positions. Holds the other operand for LOGIC.RUTROUTINE NAME VARIABLESALIGN Decimal aligns numbe}rs for decimal aligned printing.BLIND Closes a text window in a graphics screen.BUTTON Reads the game control buttons }(console switches).DECHEX Converts a decimal number to a hexadecimal number.DELETE Erases the disk file named in FN$.}ERROR Prints an english error message when an error occurs.ETIME Converts the elapsed time in the internal clock to H:M}:S and puts the result in ET$.FNFIX Inserts "D:" at the beginning of FN$ if the device and file name are not in the corre}ct format.GR0 Converts a graphics 12 (ANTIC mode 4) screen to graphics 0 by changing the display list.GR8 Convert}s a graphics 15 screen to graphics 8.GR12 Converts a graphics 0 screen to graphics 12 (ANTIC mode 4).GR15 Converts }a graphics 8 screen into graphics 15 (mode 7.5 or ANTIC mode E).GR24 Full screen GR8.GR32 Full screen GR15.HEXDEC} Converts a hexadecimal number in HEX$ to a decimal number and places it in DEC.INIT Formats the disk in the drive name}d in FN$.LDFNT Loads a custom character set.LOCK Locks the disk file named in FN$.MENU Displays a menu of progr}am functions to select from.RDFILE Reads the data from the device named in FN$ into BUFF$.RDPTx Reads data from contro}ller port x (A or B).RDSCR Reads data from the device named in FN$ to a graphics screen.RDSECT Reads data from a disk }sector.RENAME Renames the disk file named in FN$ with the name following a comma in FN$ (FN$ = "D:OLD,NEW").SCNDMP Dump}s graphics mode 8 screen to an EPSON printer.TGR Prints contents of MISC$ to a mode 8 graphics screen as mode 0 charact}ers.UNLOCK Unlocks the disk file named in FN$.WAIT Waits for the number of seconds specified by SEC in to the nearest} 1/60 Second.WINDOW Opens a text window for graphics screens.WRFILE Writes data in BUFF$ to the device named in FN$.W}RPTx Writes data to controller port x (A or B).WRSCR Writes data from a graphics screen to the device named in FN$.WR}SECT Writes the data in SECT$ to a disk sector.YESNO Gets a yes/no user response.creen to the device named in FN$.WRX5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30001 HEXDEC=30320:DECHEX=3034030002 MENU=3040030003 WAIT=3}055030004 ERROR=30300:TRAP ERROR30005 ETIME=3056030006 SCNDMP=3047030007 YESNO=3058830010 CATLOG=3053030011 RDPTA=30440}:WRPTA=30444:RDPTB=30448:WRPTB=3045230012 RENAME=30460:DELETE=30462:LOCK=30464:UNLOCK=30466:INIT=3046830013 ALIGN=30574300}14 TGR=3060030015 RDSECT=30626:WRSECT=3063230016 GR12=30634:GR0=3063630017 GR15=30640:GR31=3064630018 GR8=30650:GR24=3065}830019 SELECT=3038230020 BUTTON=3066030021 LDFNT=3067030022 WINDOW=30686:BLIND=3069430023 LAND=30700:LOR=30702:EOR=30704}30024 FNFIX=3071030090 RDSCR=30500:WRSCR=30518:GR=830095 RDFILE=30360:WRFILE=3037030100 REM àŠӛ30101 O}PEN #1,4,0,"K:"30102 DIM IO$(83)30103 DIM ET$(8):ET$="00:00:00"30105 DIM FN$(28)30106 DIM HEX$(4),CHA$(16)30107 DIM DMP$}(46),SCN$(193):SCN$(193)=""30108 DIM MISC$(40)30111 DIM ER$(922),ECODE$(219)30112 ECODE$="00000000102103305207208411013214}2157191206228242268281289314331355366000000000000000366382387406417"30113 ECODE$(100)="4334574734834955125275385495695946266}38669694711000000000000000000000000000000000711731751761"30114 ECODE$(193)="789810826850862878893908922"30115 DIM SECTIO$(4}9),SECT$(129):SECT$(129)=""30119 DIM TGR$(58)30196 LNBUF=1024:DIM BUFF$(LNBUF)30200 REM Šӛ30201 IO$="hpB}hEhDhhJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`"30203 DMP$="hhhhhhhϢEϑ8(˥}`"30205 CHA$="0123456789ABCDEF"30206 SECTIO$(1)="hhhhhhhh h  SS Sԭ `"30210 ER$="IN}SUFFICIENT MEMORY VALUE ERROR TOO MANY VARIABLES STRING LEGNTH ERROR OUT OF DATA NUMBER GREATER THAN"30211 ER$(103)=" 32767 }INPUT STATEMENT ERROR DIM ERROR STACK OVERFLOW FLOATING POINT OVERFLOW/UNDERFLOW LINE NOT "30212 ER$(200)="FOUND MISSING FOR} STATEMENT LINE TOO LONG GOSUB OR FOR LINE DELETED RETURN ERROR GARBAGE "30213 ER$(289)="INVALID STRING CHARACTOR PROGRAM TO}O LONG DEVICE NUMBER TOO LARGE FILE ERROR BREAK KEY ABORT IOCB"30214 ER$(386)=" NONEXISTANT DEVICE WRITE ONLY INVALID COMMAN}D DEVICE OR FILE NOT OPEN BAD IOCB NUMBER READ ONLY "30215 ER$(483)="END OF FILE TRUNCATED RECORD DEVICE TIMEOUT DEVICE NAK }SERIAL BUS CURSOR OUT OF RANGE "30216 ER$(569)="SERIAL BUS FRAME OVERRUN SERIAL BUS FRAME CHECKSUM ERROR DISK LOCKED "30217} ER$(638)="READ AFTER WRITE COMPARE ERROR FUNCTION NOT IMPLEMENTED INSUFFICIENT RAM DEVICE NUMBER ERROR "30218 ER$(731)="TOO} MANY OPEN FILES DISK FULL FATAL SYSTEM DATA I/O ERROR FILE NUMBER MISMATCH FILE NAME ERROR "30219 ER$(826)="POINT DATA LEGN}TH ERROR FILE LOCKED COMMAND INVALID DIRECTORY FULL FILE NOT FOUND POINT INVALID "30230 TGR$="hhhhhhhhhТБ}IAˁi(ː`"30299 RETURN 30300 TRAP ERROR:ER=PEEK(195):IF ER>100 THEN ER=ER-100:REM қ30302 ER=1+ER*3}:MISC=VAL(ECODE$(ER+3,ER+5))-1:ER=VAL(ECODE$(ER,ER+2))30304 ? :? ER$(ER,MISC):? "AT LINE ";PEEK(186)+256*PEEK(187):? :? "Ñ} TO STOP"30306 GET #1,K:IF K=27 THEN STOP 30308 GOTO PEEK(186)+256*PEEK(187):REM ٛ30310 ? "I/O ";:GOTO ERROR30320 REM} Û30322 CHA=0:TEMP=1:NUM=4096:DEC=030324 CHA=CHA+130326 IF CHA$(CHA,CHA)<>HEX$(TEMP,TEMP) THEN GOTO HEXDEC+430328 DE}C=DEC+((CHA-1)*NUM)30330 TEMP=TEMP+1:CHA=0:NUM=NUM/16:IF TEMP<5 THEN GOTO HEXDEC+430332 RETURN 30340 REM ؛30342 TEMP}=1:NUM=409630344 MISC=DEC/NUM:CHA=INT(MISC)30346 HEX$(TEMP,TEMP)=CHA$(CHA+1,CHA+1)30348 DEC=(MISC-CHA)*NUM:IF DEC-INT(DEC)}>0 THEN DEC=INT(DEC)+130350 TEMP=TEMP+1:NUM=NUM/16:IF TEMP<5 THEN GOTO DECHEX+430352 RETURN 30360 RW=4:GP=7:REM ś303}61 FN$="":? "INPUT FN:";:INPUT FN$:IF FN$="" THEN RETURN 30362 BUFF=ADR(BUFF$)+LEN(BUFF$):BFSZ=LNBUF-LEN(BUFF}$)30364 MISC=USR(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ):IF PEEK(947)<>1 THEN TRAP ERROR+10:? 0/030366 IF RW=8 THEN RETURN 3036}8 BUFF$(MISC+1+LEN(BUFF$))="":RETURN 30370 RW=8:GP=11:REM ś30371 FN$="":? "OUTPUT FN:";:INPUT FN$:IF FN}$="" THEN RETURN 30372 BUFF=ADR(BUFF$):BFSZ=LEN(BUFF$)30374 GOTO RDFILE+430382 ? "}":? " FOR NEXT ITEM OR ":? }30384 ? "FIRST ITEM ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30386 ? "NEXT ":GOSUB BUTTON:IF MISC}=2 THEN GOTO SELECT30388 REM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30390 REM ? "NEXT } ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30392 REM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30}394 REM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30396 REM ? "NEXT ":GOSUB BUTTON:IF} MISC=2 THEN GOTO SELECT30399 GOTO SELECT+230400 POKE 752,1:? "}":REM ՛30402 ? "(PROGRAM NAME)"30404 ? "1. FIRST ITE}M"30406 ? "2. NEXT"30408 REM ? "3. NEXT"30410 REM ? "4. NEXT"30412 REM ? "5. NEXT"30414 REM ? "6. NEXT"30416 REM ?} "7. NEXT"30418 GET #1,K:POKE 752,030420 IF K=49 THEN GOTO MENU30422 IF K=50 THEN GOTO MENU30424 IF K=51 THEN GOTO MENU}30426 IF K=52 THEN GOTO MENU30428 IF K=53 THEN GOTO MENU30430 IF K=54 THEN GOTO MENU30432 IF K=55 THEN GOTO MENU30434 IF }K=56 THEN GOTO MENU30436 GOTO MENU30440 POKE 54018,0:POKE 54016,0:REM 30442 POKE 54018,60:PORTA=PEEK(54016):RETURN 3}0444 POKE 54018,0:POKE 54016,255:REM 30446 POKE 54018,60:POKE 54016,PORTA:RETURN 30448 POKE 54019,0:POKE 54017,0:REM ґ}›30450 POKE 54019,60:PORTB=PEEK(54017):RETURN 30452 POKE 54019,0:POKE 54017,255:REM ›30454 POKE 54019,60:POKE 54017},PORTB:RETURN 30460 XIO 32,#7,0,0,FN$:RETURN :REM ś30461 REM źΤĺĬע ś30462 XIO 33,#7,0,0},FN$:RETURN :REM ś30463 REM źΤĺŢ ś30464 XIO 35,#7,0,0,FN$:RETURN :REM ˛30466 XIO 36,#7},0,0,FN$:RETURN :REM ˛30468 XIO 254,#7,0,0,FN$:RETURN :REM ԛ30470 OPEN #7,8,0,"P:":? #7;"A":REM Л30471 IN}V=0:REM 30472 SCN=PEEK(88)+256*PEEK(89)+764030474 FOR COL=SCN TO SCN+3930476 MISC=USR(ADR(DMP$),COL,AD}R(SCN$),INV)30478 ? #7;"K";SCN$:NEXT COL30480 FOR COL=1 TO 58:? #7:NEXT COL:? #7;"@":CLOSE #7:RETURN 30500 RW=4:GP=7:R}EM қ30501 FN$="LOAD SCREEN:"30502 BUFF=PEEK(88)+256*PEEK(89)-11:BFSZ=(256*PEEK(106)-160)-BUFF:GTIA=PEEK(623):POKE BUFF,}GR:POKE BUFF+1,GTIA30504 FOR MISC=0 TO 8:POKE BUFF+2+MISC,PEEK(704+MISC):NEXT MISC30505 GRAPHICS GR+32:REM Πכ3050}6 FOR MISC=0 TO 8:POKE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30507 ? FN$;:FN$="":? " FILE NAME";:INPUT FN$3050}9 IF FN$="D:PICTURE" THEN BUFF=BUFF+11:BFSZ=BFSZ-11:REM ҠϠԮ30510 MISC=USR(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ):I}F PEEK(947)<>1 THEN TRAP ERROR+10:? 0/030511 GRAPHICS GR+16+32:REM Šή30513 IF FN$="D:PICTURE" THEN RETURN :REM Ҡ}Ϡқ30514 GTIA=PEEK(BUFF+1):POKE 623,GTIA:FOR MISC=0 TO 8:POKE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30516 RETUR}N 30518 RW=8:GP=11:REM қ30519 FN$="SAVE SCREEN:"30520 GOTO RDSCR+230530 REM Ǜ30531 GRAPHICS 0:REM ̛3053}4 OPEN #7,6,0,"D:*.*"30536 INPUT #7,MISC$:? MISC$:IF MISC$(5,8)<>"FREE" THEN GOTO CATLOG+630538 CLOSE #730540 RETURN 3055}0 MISC=PEEK(20)+256*PEEK(19)+65536*PEEK(18):REM ԛ30552 IF PEEK(20)+256*PEEK(19)+65536*PEEK(18)=1 THEN MISC$(TEMP-I}NT(CLOG(MISC)),TEMP)=STR$(INT(MISC))30578 MISC=MISC-INT(MISC):MISC=MISC*100:MISC=INT(MISC):IF MISC>=1 THEN MISC$((TEMP+3)-IN}T(CLOG(MISC)))=STR$(MISC)30580 RETURN 30584 MISC=PEEK(16):IF MISC>127 THEN MISC=MISC-128:POKE 53774,MISC:RETURN :REM ˛}30588 INPUT MISC$:IF LEN(MISC$)=0 THEN MISC$="NO":RETURN :REM ϛ30590 MISC=ASC(MISC$(1,1)):IF MISC>89 THEN MISC=MISC-323}0592 IF MISC<>78 AND MISC<>89 THEN MISC$="ERR":RETURN 30594 MISC$="YES":IF MISC=78 THEN MISC$="NO"30596 RETURN 30600 REM ԑ}Ƞҩ30602 SCN=PEEK(88)+256*PEEK(89):COL=X:ROW=Y*320:CSET=PEEK(756)*25630604 FOR COUNT=1 TO LEN(MISC$)30606 CHA=ASC(}MISC$(COUNT,COUNT)):INV=0:IF CHA>128 THEN CHA=CHA-128:INV=130608 IF CHA<32 THEN CHA=CHA+64:GOTO TGR+1230610 IF CHA>31 AND C}HA<96 THEN CHA=CHA-3230612 TEMP=CSET+CHA*8:NUM=SCN+COL+ROW30614 MISC=USR(ADR(TGR$),NUM,TEMP,MIX,INV)30616 COL=COL+1:X=COL:}IF COL>PEEK(83) THEN COL=PEEK(82):X=COL:ROW=ROW+320:Y=ROW/32030618 IF ROW>7360 THEN ROW=0:Y=030620 NEXT COUNT:RETURN 30626} GP=82:REM ԛ30628 MISC=USR(ADR(SECTIO$),DRIVE,GP,ADR(SECT$),SECT)30630 RETURN 30632 GP=87:GOTO RDSECT+2:REM ԛ30}634 TEMP=PEEK(560)+256*PEEK(561):POKE TEMP+3,68:REM ұ30635 FOR MISC=TEMP+6 TO TEMP+6+22:POKE MISC,4:NEXT MISC:RETURN 306}36 TEMP=PEEK(560)+256*PEEK(561):POKE TEMP+3,66:REM Ұ30637 FOR MISC=TEMP+6 TO TEMP+6+22:POKE MISC,2:NEXT MISC:RETURN 30640} TEMP=167:IF PEEK(87)<8 THEN GRAPHICS 8+32:REM ұ30642 MISC=USR(ADR("hhhϭ0˭1̠ ))@ϐ`"),TEMP)30644 R}ETURN 30646 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM ҳ30648 GOTO GR15+230650 TEMP=167:IF PEEK(87)<8 THEN GRAPHI}CS 8+32:REM Ҹ30652 MISC=USR(ADR("hhhϭ0˭1̠ ))@ϐ`"),TEMP)30654 RETURN 30656 TEMP=199:IF PEEK(87)<8 }THEN GRAPHICS 8+16+32:REM Ҳ30658 GOTO GR8+230660 TEMP=53279:IF PEEK(TEMP)=7 THEN GOTO BUTTON:REM Λ30662 IF PEEK(TE}MP)=3 THEN MISC=330664 IF PEEK(TEMP)=5 THEN MISC=230666 IF PEEK(TEMP)=6 THEN MISC=130668 IF PEEK(TEMP)<>7 THEN GOTO BUTTON}+830669 RETURN 30670 MISC=PEEK(106):TEMP=PEEK(740):IF MISC<>TEMP-5 THEN MISC=TEMP-5:POKE 106,MISC:GRAPHICS 0:COLD=1:REM Ƒ}ԛ30672 CSET=MISC+1:TEMP=256*CSET-LEN(FN$):IF COLD=1 THEN COLD=0:GOTO LDFNT+630674 FOR COUNT=1 TO LEN(FN$):IF PEEK(TEMP+COU}NT-1)=ASC(FN$(COUNT,COUNT)) THEN NEXT COUNT:GOTO LDFNT+1230676 FN$(LEN(FN$)+1)="":BUFF=256*CSET:BFSZ=1024:RW=4:GP=7:MISC=US}R(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ)30678 FN$(LEN(FN$))="":IF PEEK(947)<>1 THEN POKE 195,PEEK(947):GOTO ERROR+1030680 IF MI}SC<>1024 THEN POKE 195,21:GOTO ERROR+1030682 POKE 756,CSET:FOR COUNT=1 TO LEN(FN$):POKE TEMP+COUNT-1,ASC(FN$(COUNT,COUNT)):N}EXT COUNT:RETURN 30686 MISC=48:REM כ30688 FOR COUNT=1 TO 9:MISC$(COUNT,COUNT)=CHR$(PEEK(703+COUNT)):NEXT COUNT30690 G}RAPHICS PEEK(87)+MISC30692 FOR COUNT=1 TO 9:POKE 703+COUNT,ASC(MISC$(COUNT,COUNT)):NEXT COUNT:RETURN 30694 MISC=32:GOTO WIN}DOW+2:REM ě30700 MISC=USR(ADR("hhhhh%ԅԩ`"),X,Y):RETURN :REM ě30702 MISC=USR(ADR("hhhhhԅԩ`"),X,Y):RETU}RN :REM қ30704 MISC=USR(ADR("hhhhhEԅԩ`"),X,Y):RETURN :REM қ30710 IF FN$="" THEN RETURN :REM ؛30712 IF LEN(F}N$)=1 THEN GOTO FNFIX+830714 IF FN$(2,2)=":" THEN RETURN 30716 IF LEN(FN$)>2 THEN IF FN$(3,3)=":" THEN RETURN 30718 MISC$=}IJASMOUTCSEMISCCOUNCHINBLOCBUMISHLFNINFNFIROTATECONFROTTBsD(@}@i B#v @  @BDHHBxB&}$ B$--- 1986 Bob DuHamel &&;@r,;A,;A, RR6.Hhhhhhhh-8n}M N` ##67@T<@T,.>:AU,6-AV$F:AV,dԠŠśn2 A.( }}Enter file name to print2x ( Printing @ @@@@@P: }ԠŠƠԛ@"-@B:,"(7<,6-@:7<,,,Šӛ656- }!A()6-&A(56-@@' @26-%@d' A0B'!@1* @'6-&@2J6-%+ }@$,T 6-C:,%@$+&@,^6-?:C:,<<<,h$ $67@%B:,$@,.Ԡś- 6-B: },6-P:'AV,-6-&AV$(@L>:,>:,(@( Aě@}@W A0uΛHu6-BuàŠӛu;@(,u;@@,uҖ}Šӛ[v$w 4 $؛wB:,"@ %@w7@<@,4:$w.B:,!@+7}@<@,4:.$w$ 6.D:67@,.!6.$$ D1:list_P.7@<@,4:$w.B:,!@+7N8:? #7:NEXT COL:? #7;"@":CLOSE #7:RETURN (ADR(DMP$),COL,ADR(SCN$),INV)30478 ? #7;"K";SCN$:NEXT COL30480 FOR COL=1 TO 5$+"D:":MISC$(3)=FN$:FN$=MISC$:RETURN (2,2)=":" THEN RETURN 30716 IF LEN(FN$)>2 THEN IF FN$(3,3)=":" THEN RETURN 30718 MISC$=$ the screen.If the graphics are using the full screen, be sure not to let the program stop after it returns from the dump r}N$=MISC$:RETURN (2,2)=":" THEN RETURN 30716 IF LEN(FN$)>2 THEN IF FN$(3,3)=":" THEN RETURN 30718 MISC$="D:":MISC$(3)=FN$:Fxoutine. Otherwise the graphics will be lost.D:INSTRUCT.002e not to let the program stop after it returns from the dump r?̠ ))@ϐ`"),TEMP)30654 RETURN 30656 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM Ҳ30658 GOTO GR8+2P0000000 0 00000000 0000 0 00000000000 00<}0000000 0 0 0 <0 000000< 00000000 00 0 00=} 000000<00000 0̚>}00 <0 000000000000 0000 < <00̚?}UUUUUUUUDDTDPDPDDPD@@DPDDDDPT@T@@TT@P@@@@@DDDDTDDDTTDDDPPDD@@@@@TDTTDDD@}PDDDDDTDDDDTPDDP@@DDDDPDDPDD@PTDDDDDTDDDDDDDDTDDDDDDDDT@TP@@@@P@@A}DDT (  B} (   C}(( (   12ERRORDFILWRFILIOFNLNBUBUFFRGBUFBFSMISBB`BtSSSBo N@E}@ $ B$--- 1986 Bob DuHamel `,($}INSTRUCT.000, .001, .002 & .003 and`(.VARLISF}T Are ATARIWRITER compatible files. O(If you do not haveO(/ATARIWRITER or another word processor,use this -G}(program to read the-( instructions.(AA(9PRESS ̂ TOGETHER TO START OR STOPn  (H}5( ( (5(#Press ΂ to read another file  %0uΛ4u6-B u6-B`6-BtI}uàŠӛu;@,u;@(,u6-B;,uŠӛu]]6.ShpBhEJ}hDhhJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`[v$\vM J( ERROR- F:A, AT LINE F:K}A,%AV$F:A,Mfv (I/O  v96-@6-@06.9śvE"(INPUT: FILE NL}AME TO READ&/6.D:>67@,.E6.vBBźƤ堨堳v6-C:,M}%B:,6-&B:,v6-?:C:,+@%@%@2DҸw %@wg6-F:A,!6-F:A@,/}&@=6-&@IAS+_6-@gԛwH6-%@$6-AV$&B:,0"@<6-}H %@w?-@B:,/F:%&@,"@:7<,,3 ? %@wd67B:,%@,.'6-AV$36-A}$?6-@K6-@d6-?:C:,