@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:":MISC$(3)=FN$:FN$=MISC$:RETURN (2,2)=":" THEN RETURN 30716 IF LEN(FN$)>2 THEN IF FN$(3,3)=":" THEN RETURN 30718 MISC$= 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$= 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$=*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$=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.$0}!eLOC u.!eUN UNLOC y.!cRE RENAM }KIL .!eE ENTE .!eLO LOA .!eRUN!Z.!cS SAV .!cLI LIST!ZL LIS$1}%.!eBL BLOA&HEL&FORMA%.!cM MOV#WDO$D1:*.* R110HH %L# g"ѩ}$2}HH( % V |" i) ƅ˩څ˩̥HH % L Зȑˈȱ$3}ȑˠ) JJJJi0ȥ)i0JƩ L - L $hhL΢ ͙8ΨeHiH %hhL#$4}`!б#Э$Щ V%0L ЖL&J K Lt Έ)0 ȱHȱH`͈ͤ ` $L&$5} 3!ـȩ:ـ/ 1%  D  :` ͌ `Ω ЀХ$6}d00]:Y8 8 0  HH8X˥Y̠( =" =" hhL&爭)$7} ѩ ,0 3! =" -". G" ;" -"hh˩L  T" G"`e˅ː`H h`H****)h)c"` @$8}`XiYi` # `( #( ~# #( =" ~# # #L# ="8$9} #$( # /# #( ~# # # # ="$( #( # /#'X+X` D#` # D#` ~# ݀$:}0 ( #`( # ;"`˝``˭`˭`H# h,A0L@L4h$;} L - HHB8名呍 %|ɈЩIH Ω1ف.I&&  > H$$<}Ω1iHH %0HH B %0Т&  LE: $H$H %0D1:DOS.SYS`HHͩ?$=}ȩ % 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$A}REEN)OUT OF RAM ALREADY EXISTSBAD LOAD FILEDOS 2.5 Mod. by Bob DuHamelDISKIO 4.3 by B. OppenheimType HELP }DISKIO:$B} DIR Directory DIRn Dir. Drive n FORMAT Format disk WDOS Write DOS.SYS.X LI. $C} LISTD List to disk.S S. SAVE Save to disk.E E. ENTER Enter to mem..L LO. LOAD Load to mem..R RUND $D}Run disk file.K LOCK Lock file.U UN. UNLOCK Unlock file.N RE. RENAME Rename file.D DEL. DELETE Delete file.$E}B BL. BLOAD Binary load.M M. MOVE Move file.R9 runs #9 etc. To use DOS type KILL.Reboot to restore DISKIO. $F}.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=30370(H}30100 REM àŠӛ30102 DIM IO$(83)30105 DIM FN$(28)30196 LNBUF=1025:DIM BUFF$(LNBUF)30200 REM Š(I}ӛ30201 IO$="hpBhEhDhhJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`"30299 RETURN 30300 TRAP E(J}RROR:? "ERROR- ";PEEK(195);" AT LINE ";PEEK(186)+256*PEEK(187):END 30310 POKE 195,PEEK(947):CLOSE #7:? "I/O ";:GOTO ERROR(K}30360 RW=4:GP=7:REM ś30361 FN$="":? "INPUT FN:";:INPUT FN$:IF FN$="" THEN RETURN 30362 BUFF=ADR(BUFF$)+(L}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/03(M}0366 IF RW=8 THEN RETURN 30368 BUFF$(MISC+1+LEN(BUFF$))="":RETURN 30370 RW=8:GP=11:REM ś30371 FN$="":?(N} "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 Λ30010 CATLOG=3053030100 REM àŠӛ30108 DIM ,P}MISC$(40)30200 REM Šӛ30299 RETURN 30530 REM Ǜ30531 GRAPHICS 0:REM ̛30534 OPEN #7,6,0,"D:*.*"30,Q}536 INPUT #7,MISC$:? MISC$:IF MISC$(5,8)<>"FREE" THEN GOTO CATLOG+630538 CLOSE #730540 RETURN 30534 OPEN #7,6,0,"D:*.*"30,a5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30100 REM àŠӛ0S}30101 OPEN #1,4,0,"K:"30111 DIM ER$(922),ECODE$(219)30112 ECODE$="0000000010210330520720841101321421571912062282422682812890T}314331355366000000000000000366382387406417"30113 ECODE$(100)="433457473483495512527538549569594626638669694711000000000000000U}0000000000000000000711731751761"30114 ECODE$(193)="789810826850862878893908922"30200 REM Šӛ30210 ER$="INSUFFI0V}CIENT MEMORY VALUE ERROR TOO MANY VARIABLES STRING LEGNTH ERROR OUT OF DATA NUMBER GREATER THAN"30211 ER$(103)=" 32767 INPUT0W} STATEMENT ERROR DIM ERROR STACK OVERFLOW FLOATING POINT OVERFLOW/UNDERFLOW LINE NOT "30212 ER$(200)="FOUND MISSING FOR STAT0X}EMENT LINE TOO LONG GOSUB OR FOR LINE DELETED RETURN ERROR GARBAGE "30213 ER$(289)="INVALID STRING CHARACTOR PROGRAM TOO LON0Y}G DEVICE NUMBER TOO LARGE FILE ERROR BREAK KEY ABORT IOCB"30214 ER$(386)=" NONEXISTANT DEVICE WRITE ONLY INVALID COMMAND DEV0Z}ICE OR FILE NOT OPEN BAD IOCB NUMBER READ ONLY "30215 ER$(483)="END OF FILE TRUNCATED RECORD DEVICE TIMEOUT DEVICE NAK SERIA0[}L BUS CURSOR OUT OF RANGE "30216 ER$(569)="SERIAL BUS FRAME OVERRUN SERIAL BUS FRAME CHECKSUM ERROR DISK LOCKED "30217 ER$(0\}638)="READ AFTER WRITE COMPARE ERROR FUNCTION NOT IMPLEMENTED INSUFFICIENT RAM DEVICE NUMBER ERROR "30218 ER$(731)="TOO MANY0]} OPEN FILES DISK FULL FATAL SYSTEM DATA I/O ERROR FILE NUMBER MISMATCH FILE NAME ERROR "30219 ER$(826)="POINT DATA LEGNTH ER0^}ROR FILE LOCKED COMMAND INVALID DIRECTORY FULL FILE NOT FOUND POINT INVALID "30299 RETURN 30300 TRAP ERROR:ER=PEEK(195):IF0_} 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,MISC0`}):? "AT LINE ";PEEK(186)+256*PEEK(187):? :? " TO STOP"30306 GET #1,K:IF K=27 THEN STOP 30308 GOTO PEEK(186)+256*PEEK(1870a}):REM ٛ ";PEEK(186)+256*PEEK(187):? :? " TO STOP"30306 GET #1,K:IF K=27 THEN STOP 30308 GOTO PEEK(186)+256*PEEK(1870 5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30006 SCNDMP=3047030100 REM àŠӛ30107 DIM 4c}DMP$(46),SCN$(193):SCN$(193)=""30200 REM Šӛ30203 DMP$="hhhhhhhϢEϑ8(˥`"30299 R4d}ETURN 30470 OPEN #7,8,0,"P:":? #7;"A":REM Л30471 INV=0:REM 30472 SCN=PEEK(88)+256*PEEK(89)+76404e}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 54f}8:? #7:NEXT COL:? #7;"@":CLOSE #7:RETURN (ADR(DMP$),COL,ADR(SCN$),INV)30478 ? #7;"K";SCN$:NEXT COL30480 FOR COL=1 TO 54+5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30090 RDSCR=30500:WRSCR=30518:GR8h}=830100 REM àŠӛ30102 DIM IO$(83)30105 DIM FN$(28)30200 REM Šӛ30201 IO$="hpBhEhDh8i}hJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`"30299 RETURN 30300 TRAP ERROR:? "ERROR- ";PEEK(195);" 8j}AT LINE ";PEEK(186)+256*PEEK(187):END 30310 POKE 195,PEEK(947):CLOSE #7:? "I/O ";:GOTO ERROR30500 RW=4:GP=7:REM қ305018k} 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+18l},GTIA30504 FOR MISC=0 TO 8:POKE BUFF+2+MISC,PEEK(704+MISC):NEXT MISC30505 GRAPHICS GR+32:REM Πכ30506 FOR MISC=0 T8m}O 8:POKE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30507 ? FN$;:FN$="":? " FILE NAME";:INPUT FN$30509 IF FN$="D:PI8n}CTURE" THEN BUFF=BUFF+11:BFSZ=BFSZ-11:REM ҠϠԮ30510 MISC=USR(ADR(IO$),ADR(FN$),RW,GP,BUFF,BFSZ):IF PEEK(947)<>18o} THEN TRAP ERROR+10:? 0/030511 GRAPHICS GR+16+32:REM Šή30513 IF FN$="D:PICTURE" THEN RETURN :REM ҠϠ8p}қ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:8q}GP=11:REM қ30519 FN$="SAVE SCREEN:"30520 GOTO RDSCR+2KE 704+MISC,PEEK(BUFF+2+MISC):NEXT MISC30516 RETURN 30518 RW=8:8<5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30015 RDSECT=30626:WRSECT=3063230100 REM àŠHEX$(TEMP,TEMP) THEN GOTO HEXDEC+430328 DEC=DEC+((CHA-1)*N@y}UM)30330 TEMP=TEMP+1:CHA=0:NUM=NUM/16:IF TEMP<5 THEN GOTO HEXDEC+430332 RETURN 30340 REM ؛30342 TEMP=1:NUM=40963034@z}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(@{}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(@O5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30013 ALIGN=3057430100 REM àŠӛ30108 DIM MD}}ISC$(40)30200 REM Šӛ30299 RETURN 30574 MISC$=" .00":TEMP=LEN(MISC$)-3:MISC=ABS(MISC):REM Λ30576 IF MID~}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>=1D} THEN MISC$((TEMP+3)-INT(CLOG(MISC)))=STR$(MISC)30580 RETURN 78 MISC=MISC-INT(MISC):MISC=MISC*100:MISC=INT(MISC):IF MISC>=1D?5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30020 BUTTON=3066030100 REM àŠӛ30200 REM H}Šӛ30299 RETURN 30660 TEMP=53279:IF PEEK(TEMP)=7 THEN GOTO BUTTON:REM Λ30662 IF PEEK(TEMP)=3 THEN MISC=3H}30664 IF PEEK(TEMP)=5 THEN MISC=230666 IF PEEK(TEMP)=6 THEN MISC=130668 IF PEEK(TEMP)<>7 THEN GOTO BUTTON+830669 RETURN H|5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30011 RDPTA=30440:WRPTA=30444:RDPTB=30448:WRPTB=3045230100 RL}EM àŠӛ30200 REM Šӛ30299 RETURN 30440 POKE 54018,0:POKE 54016,0:REM 30442 POKE 54018,6L}0:PORTA=PEEK(54016):RETURN 30444 POKE 54018,0:POKE 54016,255:REM 30446 POKE 54018,60:POKE 54016,PORTA:RETURN 30448 POL}KE 54019,0:POKE 54017,0:REM ›30450 POKE 54019,60:PORTB=PEEK(54017):RETURN 30452 POKE 54019,0:POKE 54017,255:REM ›3L}0454 POKE 54019,60:POKE 54017,PORTB:RETURN 54019,60:PORTB=PEEK(54017):RETURN 30452 POKE 54019,0:POKE 54017,255:REM ›3L,5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30005 ETIME=3056030100 REM àŠӛ30103 DIM EP}T$(8):ET$="00:00:00"30200 REM Šӛ30299 RETURN 30560 MISC=PEEK(20)+256*PEEK(19)+65536*PEEK(18):REM ś30562 P}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 TP}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)=SP}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)=SPF5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30004 ERROR=30300:TRAP ERROR30021 LDFNT=3067030100 REM T}Šӛ30102 DIM IO$(83)30105 DIM FN$(28)30200 REM Šӛ30201 IO$="hpBhEhDhhJK VhhhT}hhh`phhBhEhDhIhH V B VHԽI`"30299 RETURN 30300 TRAP ERROR:? "ERROR- ";PEEK(195);" AT LINE ";PEEK(18T}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 10T}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 COUNT}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*T}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,PEET}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 TEMPT}+COUNT-1,ASC(FN$(COUNT,COUNT)):NEXT COUNT:RETURN 195,21:GOTO ERROR+1030682 POKE 756,CSET:FOR COUNT=1 TO LEN(FN$):POKE TEMPT25 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30016 GR12=30634:GR0=3063630100 REM àŠӛ30X}200 REM Šӛ30299 RETURN 30634 TEMP=PEEK(560)+256*PEEK(561):POKE TEMP+3,68:REM ұ30635 FOR MISC=TEMP+6 TO TEMX}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+X}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+X#5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30017 GR15=30640:GR31=3064630100 REM àŠӛ3\}0200 REM Šӛ30299 RETURN 30640 TEMP=167:IF PEEK(87)<8 THEN GRAPHICS 8+32:REM ұ30642 MISC=USR(ADR("hhhϭ0\}˭1̠ ))@ϐ`"),TEMP)30644 RETURN 30646 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM ҳ30648 GOTO GR1\}5+2̠ ))@ϐ`"),TEMP)30644 RETURN 30646 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM ҳ30648 GOTO GR1\5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30018 GR8=30650:GR24=3065830100 REM àŠӛ30`}200 REM Šӛ30299 RETURN 30650 TEMP=167:IF PEEK(87)<8 THEN GRAPHICS 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+2`}̠ ))@ϐ`"),TEMP)30654 RETURN 30656 TEMP=199:IF PEEK(87)<8 THEN GRAPHICS 8+16+32:REM Ҳ30658 GOTO GR8+2`5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30023 LAND=30700:LOR=30702:EOR=3070430100 REM àŠd}ӛ30200 REM Šӛ30299 RETURN 30700 MISC=USR(ADR("hhhhh%ԅԩ`"),X,Y):RETURN :REM ě30702 MISC=USR(Ad}DR("hhhhhԅԩ`"),X,Y):RETURN :REM қ30704 MISC=USR(ADR("hhhhhEԅԩ`"),X,Y):RETURN :REM қě30702 MISC=USR(Adh5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30002 MENU=3040030100 REM àŠӛ30101 OPEN #h}1,4,0,"K:"30200 REM Šӛ30299 RETURN 30400 POKE 752,1:? "}":REM ՛30402 ? "(PROGRAM NAME)"30404 ? "1. FIRh}ST ITEM"30406 ? "2. NEXT"30408 REM ? "3. NEXT"30410 REM ? "4. NEXT"30412 REM ? "5. NEXT"30414 REM ? "6. NEXT"30416h} 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 GOTOh} MENU30426 IF K=52 THEN GOTO MENU30428 IF K=53 THEN GOTO MENU30430 IF K=54 THEN GOTO MENU30432 IF K=55 THEN GOTO MENU304h}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 MENU304h*5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30014 NOBRK=3058430100 REM àŠӛ30200 REM l}Šӛ30299 RETURN 30584 MISC=PEEK(16):IF MISC>127 THEN MISC=MISC-128:POKE 53774,MISC:RETURN :REM ˛30200 REM lr5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30012 RENAME=30460:DELETE=30462:LOCK=30464:UNLOCK=30466:INIT=p}3046830100 REM àŠӛ30105 DIM FN$(28)30200 REM Šӛ30299 RETURN 30460 XIO 32,#7,0,0,FN$:RETURp}N :REM ś30461 REM źΤĺĬע ś30462 XIO 33,#7,0,0,FN$:RETURN :REM ś30463 REM źp}ΤĺŢ ś30464 XIO 35,#7,0,0,FN$:RETURN :REM ˛30466 XIO 36,#7,0,0,FN$:RETURN :REM ˛30468 XIO 254,#7p},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,#7p5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30014 TGR=3060030100 REM àŠӛ30108 DIM MISt}C$(40)30119 DIM TGR$(58)30200 REM Šӛ30230 TGR$="hhhhhhhhhТIAˁi(ː`"3t}0299 RETURN 30600 REM Ƞҩ30602 SCN=PEEK(88)+256*PEEK(89):COL=X:ROW=Y*320:CSET=PEEK(756)*25630604 FOR COUNT=1 TO Lt}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+t}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,INVt})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 t}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 t5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30003 WAIT=3055030100 REM àŠӛ30200 REM x}Šӛ30299 RETURN 30550 MISC=PEEK(20)+256*PEEK(19)+65536*PEEK(18):REM ԛ30552 IF PEEK(20)+256*PEEK(19)+65536*PEEx}K(18)89 THEN MISC=MISC-3230592 IF MISC<>78 AND MISC<>89 THEN MISC$="ERR":RETURN 30594 MISC$="YES":IF |}MISC=78 THEN MISC$="NO"30596 RETURN C=MISC-3230592 IF MISC<>78 AND MISC<>89 THEN MISC$="ERR":RETURN 30594 MISC$="YES":IF |&5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30022 WINDOW=30686:BLIND=3069430100 REM àŠĀ}ӛ30108 DIM MISC$(40)30200 REM Šӛ30299 RETURN 30686 MISC=48:REM כ30688 FOR COUNT=1 TO 9:MISC$(COUNT,COU}NT)=CHR$(PEEK(703+COUNT)):NEXT COUNT30690 GRAPHICS PEEK(87)+MISC30692 FOR COUNT=1 TO 9:POKE 703+COUNT,ASC(MISC$(COUNT,COUNT})):NEXT COUNT:RETURN 30694 MISC=32:GOTO WINDOW+2:REM ě+MISC30692 FOR COUNT=1 TO 9:POKE 703+COUNT,ASC(MISC$(COUNT,COUNT<5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30019 SELECT=3038230020 BUTTON=3066030100 REM àŠ}ӛ30200 REM Šӛ30299 RETURN 30382 ? "}":? " FOR NEXT ITEM OR ":? 30384 ? "FIRST ITEM } ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30386 ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30388 R}EM ? "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 SELECT30394 REM ? "NEXT } ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30396 REM ? "NEXT ":GOSUB BUTTON:IF MISC=2 THEN GOTO SELECT30}399 GOTO SELECT+230660 TEMP=53279:IF PEEK(TEMP)=7 THEN GOTO BUTTON:REM Λ30662 IF PEEK(TEMP)=3 THEN MISC=330664 IF PEE}K(TEMP)=5 THEN MISC=230666 IF PEEK(TEMP)=6 THEN MISC=130668 IF PEEK(TEMP)<>7 THEN GOTO BUTTON+830669 RETURN 30664 IF PEEp5 GOSUB 30000:REM --- 1986 Bob DuHamel30000 REM Λ30024 FNFIX=3071030100 REM àŠӛ30105 DIM F}N$(28)30108 DIM MISC$(40)30200 REM Šӛ30710 IF FN$="" THEN RETURN :REM ؛30712 IF LEN(FN$)=1 THEN GOTO FNF}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$:F}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$:FFeel free to make and distribute as many copies of this disk as you wish. A voluntary payment is requested from recipients o}f such copies. The suggested price is $10.00 for free copies and $5.00 for copies bought from software copy services. I wil}l be glad to give technical support to those who pay this fee. Please include a self-addressed, stamped envelope whenever se}nding for information.TheAtari BASIC Power PackVolume 1--- 1986 by Bob DuHamel6915 Casselberry WaySan Diego, CA 9}2119The designers of Atari BASIC had a difficult task. Cram a reasonably powerful 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. De}spite this they produced an excellent product that many serious programmers (like myself) prefer over "more powerful" BASICs.}The designers added three features which overcome the apparent weaknesses of of Atari BASIC:1. The ability to label and i}ndex GOTO and GOSUB commands;2. The ability to carry machine language routines in string variables and;3. Virtually unlim}ited string length.These features essentially give a programmer the ability to add his own commands to the Atari BASIC repe}rtoire.I have used the above features in the routines of the Atari BASIC Power Pack. The routines are written in BASIC with} machine language carried in strings. They require no special hardware or disk files to operate. They become a permanent par}t of the program which uses them. To use one of the routines all you do is give the command "GOSUB" and the routine name. No} line numbers need to be used because each routine location is labeled with the routine name.LOADING THE ROUTINESTo load }a routine use the ENTER command. For example, if you want the computer 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 DISKIO (which loads automatically with this disk) all you h}ave to do to enter the routine is type "ENTER ERROR.RUT". In fact, the first three letters of each routine name are unique s}o, ENTER ERR*.* or E. ERR*.* is enough.These routines are not designed 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 expe}cted to write your own program to "call" the routine. You can also merge the routine with an existing program by using the E}NTER command. When merging a routine you must usually enter the routine after an existing program is loaded. If a program i}s loaded using the LOAD command, anything else in memory will be erased. If you use the ENTER command to load an existing pr}ogram, it may write over parts of any other program in memory. This would happen if both programs use some of the same line }numbers.The routines are designed for complete compatibility. All of the routines can be used in one program with no inter}ference.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 numbered lines are essential to the routines. The odd numbere}d lines perform auxiliary functions and can be deleted if not needed.Lines 30000 through 30299 are common to all of the rou}tines. Each routine uses some line numbers in this range to initialize. Most of the reserved variables, those which must ne}ver be altered, are found in this line number range. Other variables used by the routines are transitional and can usually b}e 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 keyb}oard. 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 can 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, ca}rriage-returns and all, is to use a routine like the following.10 DIM BUFF$(20000)1000 REM read file1010 TRAP 10601020 O}PEN #1,4,0,"D:INSTRUCT.000"1030 GET #1;TEMP1040 BUFF$(LEN(BUFF$)+1)=CHR$(TEMP)1050 GOTO 10301060 CLOSE #11070 PRINT BUFF}$This 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 t}reated as an error so the routine jumps to line 1060. This routine works but is very slow, try it.FASTIO is probably the m}ost useful of all the routines. It allows files to be read from a disk to a string variable at full speed. To try FASTIO us}e the following command sequence. 1. NEW 2. ENTER "D:FASTIO.RUT 3. LIST 30196 Change line 30196 to read: LNB}UF=20000:DIM BUFF$(LNBUF) 4. RUN Ignore the error message 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.ROUTINE DESCRIPTIONSCATLOG.RU}TCATLOG allows viewing of the disk directory while a BASIC program is running.To view the directory with CATLOG use the c}ommand GOSUB CATLOG. Line 31743 clears the screen and is optional.Lines 31745 and 31775 should be deleted unless ERROR.R}UT is also entered into the computer.HEXDEC.RUTHEXDEC converts a 4 place hexadecimal number to decimal or a decimal numbe}r 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 command GOSUB HEXDEC. The decimal versi}on of the number will then be placed into the variable DEC.To convert a decimal number to hexadecimal, load the decimal num}ber into the variable DEC. With DEC loaded give the command GOSUB DECHEX. The hexadecimal version of the number will then b}e 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 hexadecimal number 000A.FASTIO.RUTFA}STIO contains a machine language subroutine in IO$. This subroutine allows disk and tape access much faster than BASIC norma}lly allows.FASTIO does input and output to and from the string variable BUFF$. BUFF$ may be manipulated in any way prior t}o input and output.IMPORTANT: Before using FASTIO for files larger than 1K (1,024 bytes) change the value of the variable L}NBUF in line 30196. The value of LNBUF determines the maximum length of BUFF$. LNBUF=FRE(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:1. Be sure t }hat the data to be sent is transferred to BUFF$ if it is not already there.2. Put the command GOSUB WRFILE into your pro }gram.3. When the prompt, OUTPUT FN: appears, type in the device and file name.The data in BUFF$ will then be sent to t }he specified device. The device and file name may be any valid file specification (D:TEST, C:, P:, etc.).Line 30371 is opt }ional. It will ask for the device and file name to write to. It may be deleted if your program provides a device and file n}ame in FN$ before GOSUBing to FASTIO.IMPORTANT: If your program provides a device and file name in FN$, put a carriage-retu}rn code, CHR$(155), at the end of FN$. For example: 1010 FN$=NAME$ 1020 FN$(LEN(FN$)+1)=CHR$(155) 1030 GOSUB WRFILELin}e 1020 places the carriage-return code at the end of FN$. A heart, CHR$(0) or [CTRL][,], will work too. 1010 FN$="D:WORDLI}ST(heart)" 1020 GOSUB RDFILETo get the heart character in a program, press [ESC] then press [,] (comma) while holding [CTR}L].If you don't place a carriage-return code or a heart at the end of FN$ you may get a file-not-found error with a good fi}le name. You may also get garbage in a file name on the disk. Filling FN$ with hearts before putting the file name in it, a}s in lines 30361 and 30371, is another way of solving this problem.To do input with FASTIO:1. put the command GOSUB RDFIL}E into your program.2. When the prompt, INPUT FN: appears, type in the device and file name.The file from the specifie}d device will be placed in BUFF$. If BUFF$ already has data in it the new data will be placed at the end of the existing dat}a.Line 30361 performs the same function as line 30371 above.MENU.RUTMenu will display up to 7 routine titles and go to }the routines with the touch of only one key.Place the routine titles in lines 30404 through 30416 (replacing the word "NEXT}" in each line). Place the GOTO or GOSUB commands in the same order in lines 30420 through 30434. If a menu line contains a} GOSUB command, end the line with GOTO MENU.EXAMPLE: 30404 ? "1. LOAD FILE" 30406 ? "2. SAVE FILE"AND 30420 IF K=49 }THEN GOSUB RDFILE:GOTO MENU 30422 IF K=50 THEN GOSUB WRFILE:GOTO MENUERROR.RUTThis routine displays error messages in E}nglish without stopping the program.IMPORTANT: If ERROR is used with FASTIO or SCRIO be sure to enter ERROR last. FASTIO a}nd SCRIO each have a short error handling routine using the same line numbers as ERROR. They will write over ERROR if they a}re entered afterward.Line 30308 will return to the line where the error occurred. You may need to change this line to go t}o another routine. MENU or SELECT are logical places to go to if your program use these routines.CONPORT.RUTThis routine } reads data from and writes data to the front controller ports. CONPORT does not work the same way as the BASIC command STIC!}K(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 a$}re the binary data bits for port A or port B. + and - are +5 volts and ground respectively.To read data from either port g%}ive the command GOSUB RDPTA (or RDPTB). The data at the port will be loaded into the variable PORTA (or PORTB).To write da&}ta to either port, load the variable PORTA (or PORTB) with the data. This data must be a number from 0 to 255. Give the com'}mand GOSUB WRPTA (or GOSUB WRPTB). The data will be sent to the specified port.This routine can be used for various experi(}ments involving computer control or computer monitoring of the outside environment. The ports are TTL compatible (0V=0, +5V=)}1). Be sure not to exceed +5 volts at the ports for input.SEMIDOS.RUTThis routine allows the following five DOS operatio*}ns to be executed by a BASIC program: LOCK, UNLOCK, RENAME, DELETE and FORMAT.To use one of the DOS operations first load F+}N$ with the device and name of the file to be involved, (both files for RENAME). 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 RENAME-}OR 10 FN$="D1:":GOSUB INITNOTE: There will be no warning for deleting, be careful.SCNDMP.RUTThis routine will dump a.} high resolution graphics screen to an Epson compatible printer. SCNDMP works only with graphics modes 8, 9, 10, 11 and 15. /} It works best with modes 8 and 15.Line 30470 changes the line spacing of the printer to that necessary for graphics. If t0}he variable INV equals 255 the screen will print in inverse color. Line 30471 makes INV equal 0 since other routines may cha1}nge it. This line must be deleted or changed to print inverse color. Line 30482 first tells the printer that the next 192 c2}odes are for graphics and then sends one line of graphics.To print graphics first have a screen ready then give the command3} GOSUB SCNDMP.SCNDMP uses a machine language subroutine which sends data to the printer as fast as the printer can handle i4}t. Similar routines in BASIC take several seconds to scan each line of the screen.If the graphics are using the full scree5}n, be sure not to let the program stop after it returns from the dump routine. Otherwise the graphics will be lost.l screevSCRIO.RUTThis routine will save a graphics screen or load the same from disk or tape. The variable GR in line 30090 deter7}mines the graphics mode (preset to mode 8). To enter a graphics mode use the command GRAPHICS GR or GRAPHICS GR+16 with GR c8}ontaining the mode number. To change GR to the current graphics mode, use the command GR=PEEK(87).Notice that SCRIO has a 9}several odd line numbers. Most of these lines allow SCRIO to ask for a device and file name. If these lines are deleted, th:}e calling program must provide the device and file name in FN$.IMPORTANT: FN$ must end with a carriage-return code or a hea;}rt. See FASTIO for details.Lines 30505 and 30511 open and close a text window. If WINDOW.RUT is used by your program, the<}se lines should be changed to GOSUB WINDOW and GOSUB BLIND respectively.As provided, SCRIO is used as follows:To save the=} current screen:1. Put the command GOSUB WRSCR in your program.A text window will appear at the bottom of the screen with>} the words SAVE SCREEN and the prompt: FILE NAME?.2. Type the desired device and file name then [RETURN].The screen will ?}be saved to the device specified and the text window will disappear. Be sure the program doesn't stop after the the screen i@}s saved or the screen will be lost.To load a graphics screen first be sure that the variable GR contains the graphics mode A}number of the screen to be loaded. The proper graphics mode should be entered before the call to SCRIO is made.1. Put the B}command GOSUB RDSCR in your program.A text window will appear. The words LOAD SCREEN and the prompt FILE NAME? will be in C}the window.2. Type the desired device and file name then [RETURN].The screen will be loaded from the specified device. D}FILE FORMATThe first byte of each screen file is the graphics mode of the screen. This makes it possible to write a routinE}e to determine what graphics mode to enter before loading a screen. The next byte is information for the GTIA chip. The nexF}t 9 bytes are the color information. The remaining bytes are the screen data.If the file name "D:PICTURE" is used, SCRIO wG}ill load or save in the uncompressed Micro-Illustrator (Atariartist) format. (Use the [CLEAR] and [INSERT] keys to load and sH}ave in this format with Atariartist.) SCRIO will also load Micro-Painter files if they are renamed to "D:PICTURE". However,I} it will not load the color data (the last four bytes of the file).WAIT.RUTThis routine will stop the program for the numJ}ber of seconds specified in the variable SEC. Fractions of a second may be used. The timing of this routine is not precise.K} The timer counts vertical blanking cycles of the T.V. which is slightly different from 1/60 second.To use the routine, loL}ad SEC with the number of seconds to wait then give the command GOSUB WAIT.ETIME.RUTThis routine converts the data in theM} internal clock to hours, minutes and seconds and puts the result in ET$. The result is either the time elapsed since the coN}mputer was turned on, the last time [SYSTEM RESET] was pressed or the clock was manually set to zero (by poking 18,19 and 20 O}with 0). To print the current elapsed time use the following command. GOSUB ETIME:PRINT ET$TGRAPH.RUTIt is difficult tP}o mix text and graphics on the ATARI screen. Even so, you cannot mix text and graphics on the same screen line.TGRAPH willQ} print mode 0 characters on a mode 8 screen. The text and graphics may be freely mixed and you don't have to monkey with theR} display list.To print text on a mode 8 screen load up to 40 characters into MISC$, set the position with the variables X aS}nd Y then give the command GOSUB TGR.EXAMPLE: 110 GRAPHICS 8 120 MISC$="HELLO" 130 X=2:Y=10 140 GOSUB TGRIf the vaT}riable, MIX, is 1, the text will be "Exclusive ORed" to the screen. If you then try to write the same text in the same placeU}, the text will be cleanly erased.If the variable INV is 1, the text will be printed in inverse video.GR12.RUTThis routV}ine converts a graphics 0 (text) screen to graphics 12 (ANTIC 4). Graphics 12 is otherwise not available on the 400/800. ThW}e computer still thinks it is in graphics 0. With a special character set, ANTIC_4.FNT on this disk, you can have five colorX}s in the text mode. Use the command GOSUB GR12. To return to graphics 0 use GOSUB GR0 or GRAPHICS 0.GR15.RUTThis routinY}e converts a graphics 8 screen into a graphics 15 (ANTIC 14 or mode 7.5) screen. Graphics 15 is otherwise not available on tZ}he 400/800. This is the screen mode used by Micro-Illustrator and Micro-Painter. The computer still thinks it is in graphic[}s 8. Use the command GOSUB GR15, for split screen and GOSUB GR31, for full screen.GR8.RUTConverts a graphics 15 screen b\}ack a graphics 8. Use GOSUB GR8 or GOSUB GR24.BUTTON.RUTThis routine reads the game buttons. To use BUTTON give the com]}mand GOSUB BUTTON. The program will stop and wait until one of the game buttons is pressed. After 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 the [SELECT] button was pre_}ssed and 3 means the [OPTION] button was pressed.ALIGN.RUTThis routine is used to decimal align a column of numbers. To `}use the routine, place the number to be aligned into the variable MISC. Use the command GOSUB ALIGN. The decimal aligned nua}mber will be placed into MISC$. For example: 110 MISC=12.5 120 GOSUB ALIGN 130 PRINT MISC$This will print 12.50As wrb}itten, ALIGN works with a maximum of four places left of the decimal point. However, it can be easily modified to work with c}more. Just insert more blank spaces in MISC$ in line 30574.WINDOW.RUTThe command GOSUB WINDOW, will open a text window ad}t the bottom of any mode 1 - 8 graphics screen. To close the window use the command GOSUB BLIND.LOGIC.RUTThis routine pee}rforms three logic functions: AND, OR and EXCLUSIVE OR. To use the routine, load the numbers to be operated on into the varif}ables X and Y. The numbers must be from 0 to 255. Give the command GOSUB LAND, LOR or EOR. The result is placed into the vg}ariable MISC.SECTIO.RUTWith this routine you can read or write to a single density disk, sector by sector. First place tq}6?BŠBB렣BB.ATARI B BASIC B POWER B PACK B%DOS SYSB-@diskio BGFASTIO RUTBOCATLOG RUTBRERROR RUTBbSCNDMP RUTB gSCRIO RUTBrSECTIO RUTBvHEXDEC RUTB|ALIGN RUTBBUTTON RUTBCONPORT RUTBETIME RUTB FONTLOADRUTBGR12 RUTBGR15 RUTBGR8 RUTBLOGIC RUTBMENU RUTBNOBRK RUTBSEMIDOS RUTBTGRAPH RUTBWAIT RUTBYESNO RUTBWINDOW RUTBSELECT RUTBFNFIX RUTBfINSTRUCT Bs6INSTRUCT2 C8INSTRUCT002B DISPLAY MANB+VARLIST BYALLRUT B list_P B ANTIC_4 FNTB $__read__ B60__DEMO__ fDISPLAY MANhe drive number into the variable, DRIVE and the sector number (1 - 720) into the variable, SECT. To read a sector use the cr}ommand GOSUB RDSECT. The data in the specified sector will be placed into SECT$. To write to a sector use the command GOSUBs} WRSECT, and the data in SECT$ will be sent to the specified sector. Be sure you know what you are doing when you write to at} sector. The right mistake can cause a whole disk to be lost.SELECT.RUTThis routine is similar to MENU except it is desiu}gned to use a text window at the bottom of a graphics screen.YESNO.RUTThis routine is used to get a yes/no response from v}the keyboard. Use the command GOSUB YESNO. A response of Y or YES will return the word YES in MISC$. A response of N, NO, w}[RETURN] or 0 will return the word NO in MISC$. Any other response will return the word ERR.FONTLOAD.RUTThis routine loax}ds a custom character set. First place the C-set file name into FN$ then give the command GOSUB LDFNT. The routine will movy}e the screen data area in memory and load the C-set above the screen data. If a C-set by the same name is already in memory z}the routine will detect it and do nothing.To return to the normal font use the command POKE 756,224 or GRAPHICS 0. To get {}the custom font back use POKE 756,CSET or repeat the font loading procedure above.FNFIX.RUTThis routine fixes a disk file|} name which is not preceded by "D:". Use the command GOSUB FNFIX before doing an input or output operation which might invol}}ve the disk drive. IF the device and file name in FN$ are not in the proper format, FNFIX will assume it is a disk file name~} without the "D:" and will insert the "D:". For example, FNFIX will change the file name HELLO to D:HELLO. It will leave th}e file name C: alone.One way to use FNFIX is to insert the command GOSUB FNFIX into FASTIO after the file name is put into }FN$ but before the jump to machine language is made.NOBRK.RUTThe command GOSUB NOBRK will disable the break key. This co}mmand must be reused after any input or output operation.list_PThis program will list any of the routines on an Epson com}patible graphics printer. The extensive use of special characters makes many of the routines unlistable with a conventional }printer. Just run list_P and type the routine name when prompted.ALLRUTThis is the complete set of routines merged into l}B&;KEWIDTERFIL@AU@@@$$##############################$$# TE}XT DISPLAY TO SCREEN OR #$$# PRINTER by Les Ellingham #$$############################## iA@=@}@ D:INSTRUCT]@@K:i6-@ A A-@)}@3!&@*"@2&(@)'3 @`((@>:,-"AU' @`2 <"F:@},!@!" AZ @ d(ԠΠϠn)@x(>:A%,$ F:A,A6}AP&F:A,"A6&6-%@N"@@D@@ D:INSTRUCT.2N @ }$@@$@V(0(%END OF MANUAL - PRESS TO RE-RUND(ANY KEY TO EXITVAdAUf}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$=}"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$=$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:,!@+7N0000000 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@@!}DDT (  "} (   #}(( (   12ERRORDFILWRFILIOFNLNBUBUFFRGBUFBFSMISBB`BtSSSBo N@%}@ $ B$--- 1986 Bob DuHamel `,($}INSTRUCT.000, .001, .002 & .003 and`(.VARLIS&}T Are ATARIWRITER compatible files. O(If you do not haveO(/ATARIWRITER or another word processor,use this -'}(program to read the-( instructions.(AA(9PRESS ̂ TOGETHER TO START OR STOPn  ((}5( ( (5(#Press ΂ to read another file  %0uΛ4u6-B u6-B`6-Bt)}uàŠӛu;@,u;@(,u6-B;,uŠӛu]]6.ShpBhE*}hDhhJK Vhhhhhh`phhBhEhDhIhH V B VHԽI`[v$\vM J( ERROR- F:A, AT LINE F:+}A,%AV$F:A,Mfv (I/O  v96-@6-@06.9śvE"(INPUT: FILE N,}AME TO READ&/6.D:>67@,.E6.vBBźƤ堨堳v6-C:,-}%B:,6-&B:,v6-?:C:,}28242268281289314331355366000000000000000366382387406417upp67A,.]43345747348349551252753854956959462663866969471100?}0000000000000000000000000000000711731751761u..67A,.789810826850862878893908922u+;@I,;A),+67A)@},.u6-A$;,uŠӛu]]6.ShpBhEhDhhJK Vhhhhhh`phhBhEhDhIhH V䩲A} B VHԽI`uBB67@,./hhhhhͦϡˁͥ8(˰ϥ`uDD67@,.1hhhhhhhh B}h  SS Sԭ `vpp6.fINSUFFICIENT MEMORY VALUE ERROR TOO MANY VARIABLES STRING LEGNTH ERROR OUT OF DATA NUMBEC}R GREATER THANvtt67A,.a 32767 INPUT STATEMENT ERROR DIM ERROR STACK OVERFLOW FLOATING POINT OVERFLOW/UNDERFLOW LINED} NOT vll67A,.YFOUND MISSING FOR STATEMENT LINE TOO LONG GOSUB OR FOR LINE DELETED RETURN ERROR GARBAGE vtt67AE},.aINVALID STRING CHARACTOR PROGRAM TOO LONG DEVICE NUMBER TOO LARGE FILE ERROR BREAK KEY ABORT IOCBvtt67A,.a NF}ONEXISTANT DEVICE WRITE ONLY INVALID COMMAND DEVICE OR FILE NOT OPEN BAD IOCB NUMBER READ ONLY vii67A,.VEND OF FILEG} TRUNCATED RECORD DEVICE TIMEOUT DEVICE NAK SERIAL BUS CURSOR OUT OF RANGE vXX67Ai,.ESERIAL BUS FRAME OVERRUN SERIALH} BUS FRAME CHECKSUM ERROR DEVICE DONE  vpp67A8,.]READ AFTER WRITE COMPARE ERROR FUNCTION NOT IMPLEMENTED INSUFFICIENTI} RAM DEVICE NUMBER ERROR  vrr67A1,._TOO MANY OPEN FILES DISK FULL FATAL SYSTEM DATA I/O ERROR FILE NUMBER MISMATCH FIJ}LE NAME ERROR  vtt67A&,.aPOINT DATA LEGNTH ERROR FILE LOCKED COMMAND INVALID DIRECTORY FULL FILE NOT FOUND POINT INVAK}LID [v$\v8 6-F:A,"!A06-&A8қ^vU6-@%$@?6-A:7%@<%@,,&@L}U6-A:7<%@,,`vc((7<,:(AT LINE F:A,%AV$F:A,=(P( TO MENUc( TO STOM}Pbv)@"@'&cv"AU+ dv+# F:A,%AV$F:A,+ٛfv1AF:A GN},#@-(I/O 1 v$6-@6-@$śv66.(( INPUT FN:,346$v6O}-C:,%B:,6-&B:,vO6-?:C:,+@%@%@2DҸw %@wg6-F:A,!6-F:A@,/a}&@=6-&@IAS+_6-@gԛwH6-%@$6-AV$&B:,0"@<6-b}H %@w?-@B:,/F:%&@,"@:7<,,3 ? %@wd67B:,%@,.'6-AV$36-Ac}$?6-@K6-@d6-?:C:,