@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `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:AUTORUN.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 } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED A2 009 COPYING---D1:A2RM1.DB1l# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uA"!`7"`RUN"D:DISKGVWwI JLAQXYSMENUSCINDEXDDISKIOTACHARM2SENOERROFSCXERROGG  U}6F@ FF ## s 66@ JJ  V}B !" W}#&&ŠR;A(,;@,;@,;A,;A(,;A@,; X}A6,Z6.k67A(,.z67@,.6-@s;A,s6.\hhhhhhhhхԅhhhh Y}h ѱ ˥ύR S0 ֩ xx67@,.eё *ЍWP S0Iѱ)$i(ː Z}i$͐΄   )Т ) 67A,. В``];@p,]6.FhhhhԅՅШhhhΥ [}΅б ԅ`ۄ` t;Au,t6.]hXiԥYiբhhˊHJJJJ 0ih) 0i \}ԥiԐ֥eԅԐթ ee67@,.RXiԥYiբ֊H)_ 0h8 H8hi@Hh֑Ȅ(eԅԐ ]}ՠ`:;@5,:6.#hhhhhhhh h  S`n;AP,n6.WhRhhhhh h  ^} S0] S0X Ԅ Մ΅} S0< Ԧ RR67@,.?}18̰eʅԆF˰ eͅԥe΅&` _}`88+ 6. 67A@,. +67@,.(M;@T,M6.6!`7 `}`)c#67@<@,.>:@4,C67@E<@E,.>:@4,c67@H<@H,.>:AU,<BB6.8 LOAD SECTO a}R SAVE SECTOR EDIT SECTOR Fss67@W,.` ZERO BUFFER DOS FILE TRACE DOS SECTOR MAP SE b}CTOR SEARCH DISK MAP Pqq67AS,.^ CHECK SPEED FILL SECTORS DISK DIRECTORY MAKE AUTORUN c} BASE CONVERSION Zss67AG,.` SWITCH DRIVES SECTOR COPY TOGGLE QUIET I/O BOOT ANALYSIS CREDIT d}S \N-@@;67$@8<$@8,.>:AU,? N67AC,._a;@t,a6.Jhhhhh e}֩ѢԆձ ϐ թ.*0``r;AG,r6.[hhhh͍ hhhhhϥXiT f}˥YihhR hh э i˥i Saww67@,.d0 C ?ۆڥ3ڱϤ ۥ g}*` ͩ ͑ $bKK67A,.8i(ː̥i$ԐՄ   )Э ) Н`c h} Abd$$ՠe^6-^(}7$@8%@<+%@,$@8&@ , S i}CROLL MENUn F:B2y,@A0x6-+%@,$+ @,(7+%@,$@8&@ j} <+%@,$@8&@ , SCROLL MENUDA@d'ADF:Ad,"AUA k}h@.@@K:;)@F@h6-&@d&A($+!A',%A$+  l}@,AAAAAAAAAAAAA0A1A2 m}A7A8A@96-%@d&@H/@*@9 A A$$ĠҠ n}Y&(}ENTER SECTOR NUMBER (1-1040)*4 AQYP:,) @)!A@A3 6-6-@ AP o}) AS3 A,$$ŠҠ-N(}CURRENT SECTOR IS #J(&TYPE TO SAVE OR TO CHANGE SE p}CTOR #N60Y*0*A@4YAPJT!(}ENTER NEW SECTOR NUMBER.%/ AQTP:,) @)! q}A@AT 6- AS A^#6-@ AP# A$$ԠҠ`A r}@'( }WHICH BYTE +5 AQ;6-`P:,) )!A'A_A@:(}BYTE # I s}S @:7%@,,_( ENTER NEW INFORMATION (333=QUIT)8 AQ6-$"6@86-@:7%@,,((P:,) t} )!AUAM!67%@<%@,.>:,+ AS96-%@M A(A A$$ u}ϠҠ@$(}ZERO SECTOR: ARE YOU SURE?(@0Y*0YESA? 6.67A(,.+67 v}@,.5 AS? AX$$ӠŠŠYS!(}ENTER FILE NUMBER (0-63)%/ AQ56-S&O: w}P:,,)!@cAb6-@(6-Aa%P:'@,C6-&@$P:'@,M APx6.7$@%@< x}$@%@, ASl+6-AV$@:7@,,%@:7@,,S6-AV$@:7@,,%@:7@,,i") y}"|(BAD FILE ENTRY Av3(}FILE # 7@, SCTRS LEFT: ;6..L67A@,..[67@ z},.i6-&@w-@67<,.*,%@,( SKIP TO p 6- AP AS/6-@: {}7A&,,@6-P:'@,F&f(FILE # READS  (164)p AO6-&$@/@:7A(,, A%*O( |} SECTOR  IS NOT FULL:@:7A(,,"A%*":(LAST SECTOR IS FULLA6-$AV%@:7A',,.( }}~~~~&2 A( FILE OK--2(PRESS ANY KEY FOR MAP( AT2 A`$$ӠҠРL 6.,6 ~}-?:C:,<@<!@*(PRESS ANY KEY FOR MENU4 AT> A;6-;6-@:7A#,,%AV$@:7A }$,,z@(}SECTORS POSSIBLE: @:7A),,%AV$@:7A0,,z(SECTORS FREE: @:7A1,,%AV$@:7A2 },,%A 6. 67A@,. +67@,.A6-?:C:,00('HIT E FOR ENHANCED OR ANY KEY TO ABORH--6-?:C }:,:@0%+!A,,\-@%@2$+!A,@f AZP+-++&Ay,$@,%@@2( }P-+&Ay,$@@d`(-@@+( LASTRPM = C(AVERAGE RPM = '`F:Ad,"AUA0 }n5!( Ӡ٠٠Ҡ+ AT5 Abx##ŠήӠyY +1( CREATE AUT }ORUN.SYS FILEY(#This routine creates an AUTORUN.SYSee(]that will, at boot, execute the commands you select, as i }f you had just typed them.ll(dYou are limited to 195 characters in your command space, although, it may be several }lines long.VL(DENTER A DISK TO CREATE AUTORUN.SYS ON AND PRESS ANY KEY (N TO ABORT)V AT"@5Ab }v 6.6.D :AUTORUN.SYS967@<@,.=:,C ApN@k@@v@c.($AU }TORUN.SYS ALREADY EXISTS ON DRIVE E(TYPE TO ERASE ITO ATc@CAbU-(%ENTER A COMMAND LINE ( } IF DONE)18B:,U67B:,%@,.>:AU,67B:,%@,.0ApZ6.7@:@U%B:,,TTTRAP 1530:CLOSE #1:OPEN }#1,8,0,Q$:? #1;AR$;X$;"";"";:CLOSE #1:GOTO 1540g A0@5@@R(@ }]@g A@&(ERROR IN WRITING...&@(PRESS ANY KEY FOR MENU AT Ab }@##̠ӠA] 6.6."67A(,.167@,.]('REPLACING ALL BLANK SECTORS WITH BUFF }ERJY( SECTOR: (-@A 3(~~~? AF( R @Y( TO6-@ AP# AS })4/6.9 ASE6-@O AP^  Al##ˠ٠m 6- @ 6- }ql +Ab@+6-Aa76-@C6-l($FN) FILENAME.EXT SEC STRT STATUSvc AP!- }@L6.7$@%@<$@%@,c@:,"A! @(055() 7@ }<@,.7@, y+6-AV$@:7@,,%@:7@,,S6-AV$@:7@,,%@:7@,,_ A }f( r @y(  ( < A( " A)( 5 @<(  ( 3 6-@:, }!A'&6-&A(3(DELETED, 6.!@c$6-&@d,6.A.!@16-&@2.( * }3!@6-&@367B:,%@,.B3!@6-&@367B:,%@,.C3!@6 }-&@367B:,%@,.D3!@6-&@367B:,%@,.E3!6-&@367B:,%@ },.F " 4AE(NORMAL" A!# 4AEF(OPENED# A! # 4EF(DOS 2.5# A!*(4< }(6-%@ $ @`26-%@< A>6-A` AP36-@:7@,,!A;6.L67A@ },.[67@,.67@<@,.7@<A,67A)<A2,.7@<@,Hm6-A$  }APE67@<A(,.7@<A",m6-@:7A#,,%AV$@:7A$,,\y?(SECTORS POSSIBLE: @:7A) },,%AV$@:7A0,,y(SECTORS FREE: @:7A1,,%AV$@:7A2,,%fA 6. 67A@,. +67@,. }A6-?:C:,:,$6-&$>6-'AV&+"@,R!A0  ( A0 ## }ȠӠ A@1(}ENTER NEW DRIVE NUMBER5? AQ{6-@%++&@,$+ @ ,$++& }P:O:,,,",, A ##Ҡ٠ u Aa%6-@%+"@,u( HIT TO COPY D }: TO D&: OR PRESS FOR 1040 SECTOR COP - AT#@*@B- Ab -@@"6( } PRESS ANY KEY TO ABORX6-F:@,%F:@,$AV`6. q67A9,. 67@,. E/6-?:C:, #"@! A4# A3p? + 6.67A',.+67@,.A 4 }"@P6. 6-@:.,* A54 A3pB 4"@"6. 6-@:-,* A54 A3pG AbH ## }ŭĠĠӛI ,)?:C:,* A%H AdT6-O /"*!A # }Ae/6-@R ia-@%&P:+&@,'@6,$@6@%P:+&@,'@6,&@ $+,i( }\ /6-@ AP%@/ A4`e #67<,.*4#67<,..f @@:7<,,&@2p 4F:Ad },AU*AdAU4 Abz 87<,4*6-@"6-(6-2 AP86-  A@A4 $ } ##ŠϯĠӛ '$?:C:,* A%H AdT6- /"*!A # Ae/6-@ ia-@%&P:+&@,'@6 },$@6@%P:+&@,'@6,&@ $+,i( 4F:Ad,AU*AdAU4 Ab }+6-@6-6-% AP+6-  A@A5 $t##ŠԠŠ~B6-F:@e,$ }@e0"B@e@ Ab##ԠӠ%6-@6-@% A }PO +,( ANALYSIS OF BOOT SECTOR/(O( BOOT FLAG: @:7@,,57@<@,05( *** N }OT ZERO ***^(((SECTOR COUNT: @:7@,,^( LOAD AT: @:7@,,$AV%@:7@,, 99( INITIALIZE: } @:7@,,$AV%@:7@,,99( CONTINUE AT: @:7@ ,,$AV%@:7@,,?@:7@,,@v?( } *** CONTINUE ISN'T A JMP ***(''(MAX OPEN FILES: @:7@,,2Z( DRIVES: $6-@:7@,,8-@@ }Q'@P:'@,Z( <6-P:'@, (F5(DOS.SYS EXISTS: -@:7@,,5(YESP"@: }7@,,""(NOZ@@(DOS.SYS AT SECTOR: @:7@,,$AV%@:7@,,2($(PRESS RETURN TO CONTINUE }(2 Ab##Ӡ` +( ( DISK3( VERSION 4.06(](" A COMPLETE PAC }KAGE OF DISK TOOLS`(=)(! COPYRIGHT (C) 1985, 2005, 2006=( PRESTON CROWJ( ((DISTRIBUTE FREELY"(J(#IF Y }OU WANT TO THANK ME, SEND EMAIL`5(TO ATARI-DISK-GUY>:@d,CROWCASTLE.NET`(&(I'LL ACCEPT DONATIONS OF ATARI STUF }F);( ( ((((;( PRESS ANY KEY TO CONTINU AT Ab##ºˠӠ36 }-?:C:,<< @E(  }(  $8##Π٠9~@@+1AR@~(G} }| |0 1 2 3 4 5 6 7 |0Bpp(g1234567|| 0|||| 8 }|||| 16|||| 24|||| 3Lpp(g2|||| 40|||| 48|||| 56|||| 64|||| 72|||| 8 }0|||| 88|||| V::(196|||| 104|||| 112|||| 120|||`h0(' }B@@L AS^A@h A$$ĠˠР/-@/( }2-A A@@6+ A2(  ( $##̠ˠàЛ }$-@$( E-@A$@6+ A2( > @E( 4(7<%@5, } 1-@"4$d""̠РΠӤn--@-(x<-A! }A @6<( 7<%@5, (  (7,$""̠àРӤ66F:F:@,%F }I AB @@@& @ h +%;A,;@ ,@(ENTER OBJECT }FILE NAMEDa@@h6.:$(ENTER THE NAME OF THE STRING(7B:,":4&(ENTER THE }STARTING LINE NUMBER*4 @@(-@@$)@( #?-@A$)@;67B:,%@},.>:,? (@6-@(-33( DIM $(B:,):$=>:@4,/I76-A &@"&@$B}:,&P:L:,,&P:L:B:,,,@!B:,I6-B:,0+ A(>:@4,+"B:,@16.7%@,6-%236-%@}3( $()=>:@4,<>,6-A &@&B:,&P:L:,,&P:L:,,5!B:,>6-B:,F+ A(>:@4,}+"B:,@P @IZi-@B:,:@:7<,,"@4)@:7<,,"AUi( $(,)=CHR$(@:}7<,,)d   (  ԠӛO-@7@:7<,,AU*@:7<,,@4E(7<,}O A0 (   $ D:OBJ2BASԅ`8օԆ`h@7@:7<,,AU*@:7<,,@4E(7<,@ !`qATACH[;@,[6.Dhhhhhhhh h I SII SI}ե` ++@@ D:TACH.OBJ)*@AU)*@AU)*@)*@}@(.*@B:,&@.*@@2+-@B:,'*@@:7,,+ <@ D:}BAS2OBJ(.*@B:,&@.*@@2+-@B:,'*@@:7,,+ <@ D:  2 4EHEXA6@A@ ';@,'6.0123456789ABCDEFO%6-F:A,%AV}$F:A,+6-B(E: HANDLER TABLE L AO(m-@@'6-%1 A:( = \6-F:%,}%AV$F:%%@,f Ai(m '$$(PAGE 6 COPY OF HANDLER TABLE(y6-A6+-@@36-}%= AF( = h6-F:%,%AV$F:%%@,r Au(y 2)(COMMAND FROM AUTORUN:)6-A<- F:,}(>:F:,,#6-%@- @`PRINT HEX ADDR IN 'A' ($N6-P:'@'AV,6(7%@<%@},N6-&$@$AV>6-P:'AV,.(7%@<%@,>6-&$AV>6-P:'@,.(7%@}<%@,>6-&$@(7%@<%@,$$ D2:ARREV.BASAV>6-P:'@,.(7%@T:@,$AV%@,Ad Ae-@A D:DISK̠àРӤ66F:F:@,%F Y0 REM Š1 DIM L$(128),A$(10),Q$(16),X$(284),Y$(128),S$(1040),MENU$(436):L$="":L$(128)="":L$(}2)=L$:G=13 DIM SC$(203):SC$="hhhhhhhhхԅhhhh h ѱ ˥ύR S0 ֩ "4} SC$(93)="ё *ЍWP S0Iѱ)$i(ːi$͐΄   )Т ) "5 SC$(194)="}10 ; X=USR(RELOCATABLE,BUFFERADR(128),SAVEADR(720),SRCDRIVE,DESTDRIVE,SCREENADR,STARTSEC)20 *= $600 ; Relocata!}ble, so irrelevant30 DM = $58 ; Display memory40 DUNIT = $301 ; Drive number50 DCOMND = $302 !} ; Drive command: 'R' or 'W'60 SECTOR = $030A ; Next sector to copy70 DSKINV = $E453 ; JSR here to run disk c!}ommand80 SCREEN = $CB ; Where we are in screen memory90 SAVE = $CD ; Array to save results0100 SRC !} = $CF ; Source drive0110 DEST = $D0 ; Destination drive (also FR1)0120 OFFSET = $D1 ; Offset into curr!}ent line0130 FR0 = $D4 ; 2-byte USR return code0140 BUFFER = $D6 ; Should equal $304 and BUFADR ($15)0150!} PLA ; ??? What's this for?0160 PLA0170 STA $3050180 STA BUFFER+10190 !} PLA0200 STA $3040210 STA BUFFER0220 PLA0230 STA SAVE+10240 PLA0250 ! } STA SAVE0260 PLA0270 PLA0280 STA SRC0290 PLA0300 STA OFFSET ; must be ze! }ro0310 STA FR0 ; return 0 by default0320 STA FR0+1 ;0330 PLA0340 STA DEST0350 ! } PLA0360 STA SCREEN+10370 PLA0380 STA SCREEN0390 PLA0400 STA SECTOR+1! }0410 PLA0420 STA SECTOR0430 ; Algorithm:0440 ; OFFSET=00450 ; SECLOOP:0460 ; Set SCREEN to inverse vi! }deo (cursor)0470 ; Read SECTOR to BUFFER0480 ; Determine sector status (*,-,.)0490 ; Save status in SAVE0500 ; Set SCREEN!} to inverse of status0510 ; If status is '*', write sector0520 ; Set SCREEN to regular video0530 ; Increment SCREEN0540 ;!} Increment OFFSET0550 ; If > 36, add 4 to screen and set OFFSET to zero0560 ; Increment SECTOR0570 ; If SECTOR=721 or SECT!}OR=1041 then POP and RTS0580 ; Next SECLOOP0590 SECLOOP LDY OFFSET0600 LDA (SCREEN),Y0610 ORA #$80062!}0 STA (SCREEN),Y ; Current sector is in inverse video0630 ; Read SECTOR to BUFFER0640 LDA SRC0650 !} STA DUNIT0660 LDA #$52 ; 'R'0670 STA DCOMND0680 JSR DSKINV0690 BMI BAD0700 !} LDY #$000710 CHECK LDA (BUFFER),Y0720 BNE DATA0730 INY0740 BPL CHECK0750 LDA #!}$0E ;.0760 BNE PRINT ; always true0770 DATA LDA #$0A ;*0780 BNE PRINT0790 SECLOOPB!} BNE SECLOOP ; Keep branches relative0800 BAD LDA #$0D ;-0810 PRINT LDY OFFSET0820 STA (SCREEN),!}Y0830 ORA #$20 ; convert to ASCII0840 STA (SAVE),Y0850 CMP #$2A ; '*'0860 BN!}E NOWRITE0870 LDA DEST0880 STA DUNIT0890 LDA #$57 ; 'W'0900 STA DCOMND0910 !}LDA 7640920 CMP #$FF0930 BNE ABORT0940 JSR DSKINV0950 BMI BADWRITE0960 NOWRITE LDY !}OFFSET0970 LDA (SCREEN),Y0980 AND #$7F0990 STA (SCREEN),Y ; Current sector is in regular video!}1000 INY1010 CPY #$241020 BNE SAVESEC1030 LDY #$001040 CLC1050 LDA!} SCREEN1060 ADC #$281070 STA SCREEN1080 BCC NCA1090 INC SCREEN+11100 NCA CLC11!}10 LDA SAVE1120 ADC #$241130 STA SAVE1140 BCC SAVESEC1150 INC SAVE+11160 SA!}VESEC STY OFFSET1170 INC SECTOR1180 BNE CHECKSEC1190 INC SECTOR+11200 ; Stop if SECTOR is 2d1!} or 4111210 CHECKSEC LDA SECTOR1220 AND #$1F1230 CMP #$111240 BNE SECLOOPB1250 LDA S!}ECTOR1260 AND #$F01270 ORA SECTOR+1 ; now stop if D2 or 141280 CMP #$D21290 BEQ DONE! }1300 CMP #$141310 BNE SECLOOPB1320 DONE RTS ; Success1330 BADWRITE INC FR0 ; Error 2: Bad write1340!!} ABORT INC FR0 ; Error 1: User abort1350 RTSE RTS ; Success1330 BADWRITE INC FR0 ; Error 2: Bad write1340 :hhhhhhhhхԅhhhh h ѱ ˥ύR S0 ֩ ё *ЍW%#}P S0Iѱ)$i(ːi$͐΄   )Т ) В`` ֩ ё *ЍW$T3 DIM SC$(203):SC$="hhhhhhhhхԅhhhh h ѱ ˥ύR S0 ֩ "4 SC$(93)=")%}ё *ЍWP S0Iѱ)$i(ːi$͐΄   )Т ) "5 SC$(194)="В``)&}" *ЍWP S0Iѱ)$i(ːi$͐΄   )Т ) "5 SC$(194)="В``(10 ; X=USR(RELOCATABLE,STRADR(),CHR,END)20 ; X is index into STR$ of first occurance of CHR30 ; X=0 if not found. X is nev-(}er > END40 *= $600 ; Relocatable, so irrelevant50 CHR = $CB ; Character we're looking for60 CURPTR -)} = $CC ; current string pointer (index 'y' off of it)70 END = $CE ; Maximum index80 MAXY = $D0 ; ma-*}x Y (or zero if > 255)90 FR0 = $D4 ; 2-byte USR return code0100 PLA ; Arg count, always 30110 -+} PLA0120 STA CURPTR+10130 PLA0140 STA CURPTR0150 PLA ; must be zero0160 -,} STA FR00170 STA FR0+10180 STA MAXY0190 TAY0200 PLA0210 STA CHR0220 --} PLA0230 STA END+10240 PLA0250 STA END0260 AGAIN LDA END+10270 BNE TEST ; At -.}least 256 bytes0280 LDA END0290 STA MAXY0300 TEST LDA (CURPTR),Y0310 CMP CHR0320 -/} BEQ FOUND0330 INY0340 BEQ MORE0350 CPY MAXY0360 BNE TEST0370 NOTFOUND LDA #$000380-0} STA FR00390 STA FR0+10400 RTS0410 MORE INC CURPTR+10420 INC FR0+10430 -1}DEC END+10440 CLC0450 BCC AGAIN0460 FOUND STY FR00470 INC FR00480 BNE RETURN0490-2} INC FR0+10500 RETURN RTS BCC AGAIN0460 FOUND STY FR00470 INC FR00480 BNE RETURN0490,&EhhhhԅՅШhhhΥ΅б ԅ`ۄ`70 INC FR00480 BNE RETURN04900L7 DIM INDEX$(70):INDEX$="hhhhԅՅШhhhΥ΅б ԅ`ۄ`"480 BNE RETURN04904a10 ; SEARCH.ASM20 ;30 ; Copyright (c) 1985,200540 ; Preston Crow50 ;60 ; Usage:70 ; X=USR(RELOCATABLE,STRING,LEN,SAVEAD96}R(1040),BUFFERADR(128),DRIVENO,CONT(0=NO))80 ;90 ; This will read through the disk from sectors 1-7200100 ; or 721 to 104097} (depending on CONT). For each sector,0110 ; the display is:0120 ; - Bad sector0130 ; . Blank sector0140 ; * Data 98}sector, no match0150 ; ! Data sector with full match0160 ; ? Data sector, last bytes match start of string0170 ;0180 99}; For a regular disk map, use this with LEN of zero0190 ;0200 *= $6000210 SCREEN = $CB ; next char to displ9:}ay0220 DM = $580230 SECTOR = $30A ; was $CD0240 LINEOFF = $CD ; offset into current line0250 BUFFER =9;} $CF ; buffer address for indirect0260 SAVE = $D40270 STRING = $D60280 STRINGLEN = $D80290 TEMP = $D909<}300 Y1 = $DA0310 Y2 = $DB0320 ;TEMPLEN = $DC0330 PLA0340 PLA0350 STA STRIN9=}G+10360 PLA0370 STA STRING0380 PLA0390 ; STRINGLEN is < 256, so A is zero0400 STA LI9>}NEOFF0410 STA SECTOR+10420 PLA0430 STA STRINGLEN0440 PLA0450 STA SAVE+10469?}0 PLA0470 STA SAVE0480 PLA0490 STA $3050500 STA BUFFER+10510 PLA09@}520 STA $3040530 STA BUFFER0540 LDA DM ;0550 CLC ;0560 AD9A}C #$54 ;SET0570 STA SCREEN ;CURSOR0580 LDA DM+1 ;0590 ADC #$00 ;0600 9B} STA SCREEN+1 ;0610 PLA0620 PLA0630 STA $301 ; DUNIT0640 LDA #$52 ; 9C}'R'0650 STA $302 ; DCOMND0660 LDA #$010670 STA SECTOR0680 PLA0690 PLA9D}0700 BEQ GET0710 ;0720 ; Continuation:0730 ; Starting sector 7210740 ; Move cursor down 11 lines0750 ;0760 9E} LDA #$020770 STA SECTOR+10780 LDA #$D10790 STA SECTOR0800 LDA SCREEN0810 9F} CLC0820 ADC #$B80830 STA SCREEN0840 LDA SCREEN+10850 ADC #$010860 STA S9G}CREEN+10870 ;Ԡқ0880 GET0890 JSR $E453 DSKINV0900 BMI BAD0910 LDY #$000920 CHECK 9H} LDA (BUFFER),Y0930 BNE DATA0940 INY0950 BPL CHECK0960 LDA #$0E ; '.'0970 9I} BNE PRINT0980 BAD LDA #$0D ; '-'0990 BNE PRINT1000 DATA1010 ; We have a data sector, scan it fo9J}r the string1020 ; X is the offset into the buffer that we're checking1030 ; Y1 is X + Y21040 ; Y2 is the offset into the 9K}match string being tested1050 LDX #$001060 STX Y21070 STX Y11080 LDA STRINGLEN1090 9L} BEQ NOMATCH ; zero-length search never matches1100 BYTE LDY Y11110 LDA (BUFFER),Y1120 LDY Y29M}1130 CMP (STRING),Y1140 BNE MISS1150 INC Y21160 LDA Y21170 CMP STRINGLEN119N}80 BEQ MATCH ; Full match1190 INC Y11200 BPL BYTE1210 PARTIAL LDA #$1F ; '?'1220 9O} BNE PRINT1230 ; KEY is stuck here in the middle1240 ; to make branches short1250 KEY LDA 764 1260 9P} CMP #$FF |1270 BEQ GET |ABORT?1280 CMP #42 |1290 BEQ GET |19Q}300 RTS 1310 MATCH LDA #$01 ; '!'1320 BNE PRINT1330 MISS LDA #$001340 9R} STA Y21350 INX1360 STX Y11370 BPL BYTE1380 NOMATCH1390 LDA #$0A ; '*'1400 9S}PRINT LDY LINEOFF1410 STA (SCREEN),Y1420 ORA #$201430 STA (SAVE),Y1440 INY1450 9T} CPY #$241460 BNE NEXT1470 LDY #$001480 LDA SCREEN1490 CLC1500 ADC #$9U}281510 STA SCREEN1520 BCC NS11530 INC SCREEN+11540 NS11550 LDA SAVE1560 CL9V}C1570 ADC #$241580 STA SAVE1590 BCC NEXT1600 INC SAVE+11610 NEXT STY LINEOFF1629W}0 INC SECTOR1630 BNE NS21640 INC SECTOR+11650 NS21660 ; Stop if sector is 721 $2D11670 ; 9X} or 1041 $4111680 LDA SECTOR1690 AND #$1F1700 CMP #$111710 BNE KEY ; secto9Y}r number isn't $xx11720 LDA SECTOR1730 AND #$F01740 ORA SECTOR+1 ; now stop if D2 or 141750 9Z} CMP #$D21760 BEQ DONE1770 CMP #$141780 BNE KEY1790 DONE RTStop if D2 or 141750 8fhhhh͍ hhhhhϥXiT˥YihhR hh э i˥i S0 C ?ۆڥ=\}3ڱϤ ۥ*` ͩ ͑ $i(ː̥i$ԐՄ   )Э ) =]}Н`ڱϤ ۥ*` ͩ ͑ $i(ː̥i$ԐՄ   )Э ) <96 DIM SE$(247):SE$="hhhh͍ hhhhhϥXiT˥YihhR hh э i˥i S"97 SE$(92)=A_}"0 C ?ۆڥ3ڱϤ ۥ*` ͩ ͑ $"98 SE$(192)="i(ːA`}i$ԐՄ   )Э ) Н`"*` ͩ ͑ $"98 SE$(192)="i(ː@110 ; SCREEN.ASM20 ;30 ; Copyright (c) 1985,200540 ; Preston Crow50 ;60 ; Usage:70 ; X=USR(RELOCATABLE,SECBUF(128))80 ;Eb}90 ; Display a sector on the screen in both hex and ATASCII0100 ; Values for 0-F are $10-$19,$21-$260110 ;0120 *Ec}= $6000130 BUFFER = $CB ; buffer address0140 SAVMSC = $58 ; start of display memory0150 SCREEN = $D4 ; Where weEd}'re working on the screen0160 LINEOFF = $D6 ; Bytes this line (0-7)0170 PLA ; num args (1)0180 LDA SAVMSCEe}0190 CLC0200 ADC #127 ; 3 lines, 2 characters0210 STA SCREEN 0220 LDA SAVMSC+10230 Ef} ADC #$000240 STA SCREEN+10250 ;0260 LDX #$000270 STX LINEOFF0280 PLA ; SETEg}0290 STA BUFFER+1 ;| BUFFER0300 PLA ;| POINTER0310 STA BUFFER ;0320 ;0330 ; First Eq}"B%DOS SYSB*)DUP SYSBSAUTORUN SYSBTDISK B OBJ2BAS BBAS2OBJ BARREV B-}TACH2 ASMB!SECCOPY ASMB"SECCOPY OBJB$SECCOPY BASB 'STRINDEXASMB3STRINDEXOBJB4STRINDEXBASB&5SEARCH ASMB[SEARCH OBJB^SEARCH BASB aSCREEN ASMBSCREEN OBJBSCREEN BASBDISKIO ASMBDISKIO OBJBDISKIO BASBTACH2 OBJBTACH2 BASTACH BASBAR ASMBAR OBJBAR BAS DOSMAP ASMDOSMAP OBJDOSMAP BASB DOSMAP ASMBDOSMAP OBJBDOSMAP BASB)TACH ASMBTACH OBJBTACH BASB VC ASMBVC OBJBVC BASBDISK LSTdisplay the hex dump0340 ;0350 ; X is the byte offset into the buffer0360 ; Y is used for various indexing0370 ;0380 STAEr}RT1 TXA ;0390 TAY ;|0400 LDA (BUFFER),Y ;| GET BYTE0410 PHA Es} ;0420 LSR A ; GET0430 LSR A ;| UPPER0440 LSR A ;| NYBBLE0450 Et} LSR A ;0460 ORA #$10 ; 0-9 are $10-$190470 CMP #$1A0480 BMI NONALPHA10490 Eu} CLC0500 ADC #$07 ; 7 characters between 9 and A0510 NONALPHA10520 LDY #$000530 STA (SCREEN),Y0Ev}540 PLA ; get byte0550 AND #$0F0560 ORA #$10 ; 0-9 are $10-$190570 CMP #$1A0580 Ew} BMI NONALPHA20590 CLC0600 ADC #$07 ; 7 characters between 9 and A0610 NONALPHA20620 LDY #$Ex}010630 STA (SCREEN),Y0640 ; Update screen pointer:0650 LDA SCREEN0660 CLC0670 ADC #$0306Ey}80 STA SCREEN0690 BCC NOUPPER10700 INC SCREEN+10710 NOUPPER10720 INC LINEOFF0730 Ez}LDA LINEOFF0740 CMP #$08 ; end of line?0750 BNE END1 ; no, next char0760 LDA #$10E{} ; 0770 CLC ; |0780 ADC SCREEN ; | MOVE0790 STA SCREEN ; |0800 E|} BCC NOUPPER2 ; |0810 INC SCREEN+1 ; | CURSOR0820 NOUPPER2 ; |0830 LDA #$00E}} ; |0840 STA LINEOFF ; 0850 END1 INX 0860 BPL START1 ; next byte0870 ;0880E~} ; Now do the ATASCII display0890 ;0900 LDA SAVMSC0910 CLC0920 ADC #151 ; 3 lines, 31 characters0E}930 STA SCREEN 0940 LDA SAVMSC+10950 ADC #$000960 STA SCREEN+10970 LDX #$00 E}; buffer offset0980 STX LINEOFF0990 START21000 TXA1010 TAY1020 LDA (BUFFER),Y1030 ; ConveE}rt ATASCII to internal1040 ; $00-$1F: Add $401050 ; $20-$5F: Subtract $201060 ; $60-$7F: Unchanged1070 PHA1080 E} AND #$7F ;1090 CMP #$5F ;|1100 BPL PRINT ;| CHANGE1110 CMP #$20 ;| FROME}1120 BMI AD40 ;| ATASCII1130 PLA ;| TO1140 SEC ;| INTERNAL1150 SBCE} #$20 ;|1160 PHA ;|1170 SEC ;|1180 BCS PRINT ;|1190 AD40 PLA E} ;|1200 CLC ;|1210 ADC #$40 ;|1220 PHA ;1230 PRINT PLA1240 E} LDY LINEOFF1250 STA (SCREEN),Y1260 INY1270 STY LINEOFF1280 CPY #$081290 BNE EE}ND21300 LDA #$281310 CLC1320 ADC SCREEN1330 STA SCREEN1340 BCC NOUPPER31350 E} INC SCREEN+11360 NOUPPER31370 LDY #$001380 STY LINEOFF1390 END2 INX1400 BPL START21410 E} RTSCREEN+11360 NOUPPER31370 LDY #$001380 STY LINEOFF1390 END2 INX1400 BPL START21410 D hXiԥYiբhhˊHJJJJ 0ih) 0iԥiԐ֥eԅԐթXiԥYiբ֊I}H)_ 0h8 H8hi@Hh֑Ȅ(eԅԐՠ`0iԥiԐ֥eԅԐթXiԥYiբ֊H810 DIM D$(175):D$="hXiԥYiբhhˊHJJJJ 0ih) 0iԥiԐ֥eԅԐթ"11 D$(94)="M}XiԥYiբ֊H)_ 0h8 H8hi@Hh֑Ȅ(eԅԐՠ`"iԐ֥eԅԐթ"11 D$(94)="LT10 ; DISKIO.ASM220 ;30 ; Copyright (c) 1985,200540 ; Preston Crow50 ;60 ; Usage:70 ; X=USR(RELOCATABLE,CMD,DRIVE,BUFFERQ}ADR(128),SECTOR)80 ;90 *= $6000100 DUNIT = $301 ; Drive number0110 DCOMND = $302 ; Drive command: Q}'R' or 'W'0120 DBUF = $304 ; Disk buffer0130 SECTOR = $30A0140 DSKINV = $E453 ; JSR here to run disk commQ}and0150 FR0 = $D4 ; 2-byte USR return code0160 PLA ; num args0170 PLA ; cmd high byte--alwayQ}s zero0180 STA FR0+1 ; high-byte of return is zero0190 PLA0200 STA DCOMND0210 Q} PLA0220 PLA0230 STA DUNIT0240 PLA0250 STA DBUF+10260 PLA0270 Q} STA DBUF0280 PLA0290 STA SECTOR+10300 PLA0310 STA SECTOR0320 Q} JSR DSKINV0330 STY FR00340 RTS+10300 PLA0310 STA SECTOR0320 PDhhhhhhhh h  S` FR00340 RTS+10300 PLA0310 STA SECTOR0320 T)20 DIM DISKIO$(35):DISKIO$="hhhhhhhh h  S`"TS+10300 PLA0310 STA SECTOR0320 XAВ``"7 DIM INDEX$(70):INDEX$="hhhhԅՅШhhhΥ΅б ԅ`ۄ`"10 DIM D$(175):D}$="hXiԥYiբhhˊHJJJJ 0ih) 0iԥiԐ֥eԅԐթ"11 D$(94)="XiԥYi}բ֊H)_ 0h8 H8hi@Hh֑Ȅ(eԅԐՠ`"20 DIM DISKIO$(35):DISKIO$="hhhhhhhh h } S`"25 DIM TACH$(118):TACH$="hRhhhhh h  S0G S0B Ԅ Յ} S0( Ԧ }8̰ "26 }TACH$(88)="iЈiʅԆ`ԅ`8̅Ԇ`"30 S$=" ":S$(1040)=" ":S$(2)=S$40 DIM AR$(54):AR$="!}`7`"41 AR$(12,12)=CHR$(34):AR$(45,45)=CHR$(34):AR$(48,48)=CHR$(155)60 MENU$=" LOAD SECTOR SAVE} SECTOR EDIT SECTOR "70 MENU$(57)=" ZERO BUFFER DOS FILE TRACE DOS SECTOR MAP SECTOR SEARCH ȥ} DISK MAP "80 MENU$(153)=" CHECK SPEED FILL SECTORS DISK DIRECTORY MAKE AUTORUN BASE CONVER}SION "90 MENU$(247)=" SWITCH DRIVES SECTOR COPY TOGGLE QUIET I/O BOOT ANALYSIS CREDITS "92 FO}R A=1 TO 11:MENU$(A*38,A*38)=CHR$(155):NEXT A:MENU$(343)=MENU$95 DIM M2$(74):M2$="hhhhh֩ѢԆձ ϐ }թ.*0`"96 DIM SE$(247):SE$="hhhh͍ hhhhhϥXiT˥YihhR hh }э i˥i S"97 SE$(92)="0 C ?ۆڥ3ڱϤ ۥ*` ͩ ͑ }$"98 SE$(192)="i(ː̥i$ԐՄ   )Э ) Н`"99 GOTO 6200100 REM ՠ}101 NOERROR=0:? "}";MENU$(M*38+1,(M+4)*38-20);" SCROLL MENU";110 IF PEEK(53279)<>3 THEN 130120 M=(M+1)*(M}<8):? "";MENU$((M+3)*38-20,(M+4)*38-20);" SCROLL MENU";130 POKE 702,64:POKE 694,0:IF PEEK(764)=25}5 THEN 110140 CLOSE #1:OPEN #1,4,0,"K:":GET #1,A:CLOSE #1:A=A-64-128*(A>127)150 ON A+100*(A<1) GOTO 200,300,400,500,600,700},800,1000,1300,1600,1900,1400,3000,3100,3200,3700,3800,4000160 A=A+64-48:IF A>=1 AND A<=8 THEN GOTO 1900170 GOTO 100200 RE}M ĠҠ201 ? "}ENTER SECTOR NUMBER (1-1040)":INPUT Y$:GOSUB 5100:IF V<>INT(V) OR V<1 OR V>1040 THE}N 100210 S=V:Q=82:GOSUB 5000:GOSUB 5300:GOTO 100300 REM ŠҠ301 ? "}CURRENT SECTOR IS #";S:? "TY}PE TO SAVE OR TO CHANGE SECTOR #";:INPUT A$310 IF A$<>"Y" AND A$<>"*" THEN 100320 IF A$="Y" THEN 350330 ? "}ENTER NEW }SECTOR NUMBER.":INPUT Y$:GOSUB 5100:IF V<>INT(V) OR V<1 OR V>1040 THEN 100340 S=V:GOSUB 5300:GOTO 300350 Q=87:GOSUB 5000:GO}TO 100400 REM ԠҠ401 POKE 703,4:? "}WHICH BYTE ";:TRAP 20:INPUT C:IF C<>INT(C) OR C<0 OR C>127 T}10 ; AR.ASM20 ;30 ; I'm not sure where I found this code in the early 80s,40 ; but I've mostly re-written it. The originai}l had a50 ; hard-coded vector table that wasn't XL-compatible. It60 ; also put the command string in backwards; instead iti}70 ; just needs to have a zero at the end.80 ;90 ; The original version initialized by putting an address0100 ; directly i}into the stack at $1FC-$1FD to hijack the return,0110 ; and then called $F369 after initializing. Presumably this0120 ; isi} where the return value would have been. Cool hack,0130 ; but unnecessary.0140 ;0150 ; The only thing I don't get is why i}the vector table0160 ; points to the byte before the start of the routine.0170 ;0180 ; Modifications and comments Copyrighi}t (c) 20050190 ; Preston Crow0200 ;0210 ; Be careful in converting this to a BASIC string, as0220 ; it contains several 'i}"' characters and one enter0230 ;0240 MYEHAND = $6000250 EHANDLER = $320 ; 'E' followed by handler vector0260 SAVEY i} = $60F ; Index of next character0270 EDITRV = $E4000280 FR0 = $D4 ; Scratch for us0290 *= $60i}70300 ;0310 ; Copy the E: handler vector table, and0320 ; patch it with our GET routine.0330 LDY #$0E ; Don't ci}lobber the $00 at $60F0340 LDX #$060350 STX EHANDLER+20360 NOPZERO LDA #$00 ; $00 in SAVEY0370 ; Abi}ove is $10 bytes from $600, which will be overwritten0380 COPY LDA EDITRV,Y0390 STA MYEHAND,Y0400 i} DEY0410 BPL COPY0420 STX MYEHAND+50430 LDA #$21; #EGETBYTE-1&$00FF0440 STA MYEHAi}ND+40450 RTS0460 EGETBYTE0470 LDY SAVEY0480 LDA $637,Y ; COMMAND,Y0490 BNEi} MORE0500 ; Restore the handler0510 ; Return with an enter to complete the command0520 LDA #$E40530 i} STA EHANDLER+20540 LDA #$9B ; ATASCII ENTER0550 MORE INC SAVEY0560 EXIT LDY #$010570i} RTS0580 COMMAND LDA #$9B ; ATASCII ENTER0550 MORE INC SAVEY0560 EXIT LDY #$010570h6"!`7"`ASCII ENTER0550 MORE INC SAVEY0560 EXIT LDY #$010570l640 DIM AR$(54):AR$="!`7`"41 AR$(12,12)=CHR$(34):AR$(45,45)=CHR$(34):AR$(48q},48)=CHR$(155)AR$="!`7`"41 AR$(12,12)=CHR$(34):AR$(45,45)=CHR$(34):AR$(48pHEN 100410 POKE 703,4:? "}BYTE #";C;" IS ";ASC(L$(C+1)):? "ENTER NEW INFORMATION (333=QUIT)"420 INPUT Y$:GOSUB 5100:D=V:IF }D=-1 THEN D=ASC(L$(C+1))430 IF D<>INT(D) OR D<0 OR D>255 THEN 100440 L$(C+1,C+1)=CHR$(D):GOSUB 5300:C=C+1:IF C<128 THEN 410}450 GOTO 100500 REM ϠҠ501 ? "}ZERO SECTOR: ARE YOU SURE?":INPUT A$:IF A$<>"Y" THEN 100510 L$}="":L$(128)="":L$(2)=L$:GOSUB 5300:GOTO 100600 REM ӠŠŠ601 ? "}ENTER FILE NUMBER (0-63)":INPUT }Y$:GOSUB 5100:F=V:IF F-ABS(INT(F)) OR F>63 THEN 100610 Q=82:S=361+INT(F/8):F1=F-8*INT(F/8):GOSUB 5000:Q$=L$(F1*16+1,F1*16+16}):GOSUB 5300620 S1=256*ASC(Q$(5))+ASC(Q$(4)):CO=256*ASC(Q$(3))+ASC(Q$(2)):IF S1=0 OR CO=0 THEN ? "BAD FILE ENTRY":GOTO 6906}30 ? "}FILE #";F;" ";Q$(6);" SCTRS LEFT: ";CO:S$=".":S$(1040)=".":S$(2)=S$:S=S1-1:FOR Z=1 TO CO:S$(S1,S1)="*"640 IF S1<>S+1} THEN ? "";S;" SKIP TO ";S1;""650 S=S1:GOSUB 5000:GOSUB 5300:S1=ASC(L$(126)):X2=INT(S1/4):IF X2-F THEN ? "FILE # READS }";X;" (164)":GOTO 690660 S1=S1-X2*4:IF ASC(L$(128))<125 AND Z<>CO THEN ? "SECTOR ";S;" IS NOT FULL"670 IF ASC(L$(128))=}125 AND Z=CO THEN ? "LAST SECTOR IS FULL"680 S1=S1*256+ASC(L$(127)):? "~~~~";CO-Z:NEXT Z:? "FILE OK--";690 ? "PRESS AN}Y KEY FOR MAP";:GOSUB 5400:GOTO 6000700 REM ӠҠР701 Y$=L$:ERROR=USR(ADR(DISKIO$),82,G,ADR(Y$),360}):A=0:IF ERROR>1 THEN 730710 A=ASC(Y$(2))>208:X$="":X$(140)="":X$(2)=X$:X$(1,90)=Y$(11,100):X$(129,132)=Y$(2,5)720 IF A T}HEN ERROR=USR(ADR(DISKIO$),82,G,ADR(Y$),1024):X$(91,128)=Y$(85,122)730 IF ERROR>1 THEN ? "}ERROR- ";ERROR;" READING SECTOR} ";360*(A=0)+1024*(A=1)740 IF ERROR>1 THEN ? "PRESS ANY KEY FOR MENU":GOSUB 5400:GOTO 100750 X=0:IF A THEN X=ASC(Y$(123))+2}56*ASC(Y$(124))760 ? "}SECTORS POSSIBLE: ";ASC(X$(129))+256*ASC(X$(130)):? "SECTORS FREE: ";ASC(X$(131))+256*ASC(X$(132))+}10 ; DOSMAP.ASM20 ;30 ; Copyright (c) 1985, 2005, 2006 Preston Crow40 ;50 ; Usage:60 ; X=USR(RELOCATABLE,SOURCEADR(128),}SAVEADR(1024))70 ;80 ; The SOURCEADR is a string containing the DOS 2.0 or DOS 2.590 ; free sector bitmaps, starting with }byte 0. The BASIC code0100 ; has to manipulate the strings first.0110 ;0120 ; Include in DISK as M2$ at line 950130 ;01}40 *= $6000150 BUFFER = $CF0160 SAVE = $D60170 FREE = $D40180 SRCBIT = $D10190 } PLA0200 PLA0210 STA BUFFER+10220 PLA0230 STA BUFFER0240 PLA0250 } STA SAVE+10260 PLA0270 STA SAVE0280 LDA #$070290 STA SRCBIT0300 LDX #$00}0310 LDY #$000320 STX SRCBYTE0330 STX FREE0340 STX FREE+10350 LDA (BUFFER),Y}0360 ASL A ; sector 00370 SHIFT LDA (BUFFER),Y0380 ASL A0390 STA (BUFFER),Y0400 } BCC DATA ; bit set if free0410 INC FREE0420 BNE N10430 STA (BUFFER),Y0440 } INC FREE+10450 N1 LDA #$2E ;'.'0460 BNE PRINT0470 DATA LDA #$2A ;'*'0480 PRINT STA (}SAVE,X)0490 DEC SRCBIT0500 BNE N20510 LDA #$080520 STA SRCBIT0530 INY0540 } BMI END0550 N2 INC SAVE0560 BNE SHIFT0570 INC SAVE+10580 BNE SHIFT0590 END }Ihhhhh֩ѢԆձ ϐ թ.*0`0 END RTS BMI END0550 N2 INC SP95 DIM M2$(74):M2$="hhhhh֩ѢԆձ ϐ թ.*0`" BMI END0550 N2 INC S` RTS BMI END0550 N2 INC SAVE0560 BNE SHIFT0570 INC SAVE+10580 BNE SHIFT0590 END 10 ; TACH.ASM20 ;30 ; Copyright (c) 2005,200640 ; Preston Crow50 ;60 ; Usage:70 ; X=USR(RELOCATABLE,CMD,DRIVE,BUFFERADR}(128),SECTOR)80 ;90 ; We can determine how fast the disk is spinning by0100 ; re-reading the same sector. The time from t}he end of0110 ; the first read to the end of the second read should be0120 ; exactly one revolution.0130 ;0140 ; There ar}e several timers in the Atari:0150 ; RTCLOCK, incremented every vertical blank.0160 ; The VCOUNT register, incremented ever}y second scanline (228*2 cycles)0170 ;0180 ; VCOUNT in seconds: 1/(clock speed)*228*20190 ; RTCLOCK per second: 1/(vc_in_s}ecs * lines/2)0200 ;0210 ; NTSC: 3.579545MHz crystal0220 ; NTSC: VCOUNT: 127.39us (456/3579545)0230 ; NTSC: 59.92 RTCLOC}K updates/second (1/(456/3579545 * 262/2))0240 ; NTSC: RTCLOCK: 16.841ms (59736/3546894)0250 ; NTSC: Add RTCLOCK*131 to VCO}UNT0260 ;0270 ; PAL: 3.546894MHz crystal0280 ; PAL: VCOUNT: 128.56us (456/3546894)0290 ; PAL: 49.86 RTCLOCK updates/seco}nd (1/(456/3546894 * 312/2))0300 ; PAL: RTCLOCK: 20.056ms (71136/3546894)0310 ; PAL: Add RTCLOCK*156 to VCOUNT0320 ;0330 }; This determines the time it takes to read a sector,0340 ; returning the time in VCOUNT.0350 ;0360 ; Defined as TACH$ at }line 25 of DISK0370 ;0380 ; Usage:0390 ; V=USR():V=V+PEEK(203)*131:IF PEEK(53268)=1 THEN V=PEEK(203)*25+V0400 ;0410 ; V }is the number of VCOUNT increments, with is the time for one revolution.0420 ;0430 ; NTSC: Seconds elapsed is V*(456/357954}5)0440 ; PAL: Seconds elapsed is V*(456/3546894)0450 ;0460 ; We have S/R, want R/M0470 ; Invert to get R/S0480 ; Times }60 to get RPM0490 ;0500 ; NTSC: 3579545*60/(456*V)0510 ; PAL: 3546894*60/(456*V)0520 ;0530 ; NTSC: 3579545*5/(38*V)}0540 ; PAL: 3546894*5/(38*V)0550 ;0560 ; Making it yet more complicated, the RTC isn't0570 ; update exactly when the VCO}UNT cycles to zero.0580 ; RTC is updated during the VBI, which starts when0590 ; VCOUNT is 124 and ends when VCOUNT is 125.}0600 ; (Normally it runs until VCOUNT is 128, but not0610 ; during I/O.)0620 ; Deal with this by adjusting RTCLOCK if eith}er VCOUNT0630 ; is >=1250640 ;0650 *= $6000660 DUNIT = $301 ; Drive number0670 DCOMND = $302 ; Dr}ive command: 'R' or 'W'0680 DBUF = $304 ; Disk buffer0690 SECTOR = $30A0700 DSKINV = $E453 ; JSR here to }run disk command0710 FR0 = $D4 ; 2-byte USR return code0720 RTCLOK = $12 ; 3-byte 60th of a second timer0}730 VCOUNT = $D40B ; 1-byte vertical line counter0740 VCSAVE = $CC0750 PAL = $D014 ; PAL is 1, NTSC is 15}0760 RTDIFF = $CB0770 PLA0780 LDA #$52 ; 'R'0790 STA DCOMND0800 PLA081}0 PLA0820 STA DUNIT0830 PLA0840 STA DBUF+10850 PLA0860 } STA DBUF0870 PLA0880 STA SECTOR+10890 PLA0900 STA SECTOR0910 ; Extra r}ead to stabilize things0920 JSR DSKINV ; extra read 10930 BMI BADSEC0940 SEC1 JSR DSKINV}0950 BMI BADSEC0960 LDA VCOUNT ; save screen position0970 STY RTCLOK+2 ; Reset cloc}k to 10980 CMP VCOUNT0990 BNE SEC1 ; Changed too soon1000 DEY ; LDY #$001010 } STY FR0+11020 STA VCSAVE ; Where we started1030 CMP #125 ; seems to mess up here1040 } BCC POSTVBI11050 INC RTCLOK+2 ; need that INC1060 POSTVBI11070 ; We've seeked to the right track, a}uhRhhhhh h  S0G S0B Ԅ Յ} S0( Ԧ }8̰ iЈiʅԆ`ԅ`8̅Ԇ`8|25 DIM TACH$(118):TACH$="hRhhhhh h  S0G S0B Ԅ Յ} S0( Ԧ }8̰ "26 TACH$(88}X770 S$=" ":S$(1040)=" ":S$(2)=S$:X=USR(ADR(M2$),ADR(X$),ADR(S$))780 IF NOT A THEN S$(720)=" ":S$(1040)=" ":S$(721)=S$(720}nd the sector is1080 ; just past the head.1090 ; Now read the sector again and return the elapsed time1100 ; We can't wait} for the next jiffy, as the disk is already1110 ; spinning towards the sector.1120 AGAIN JSR DSKINV1130 B}MI BADSEC1140 LDA VCOUNT1150 LDX RTCLOK+21160 CMP VCOUNT1170 BNE S}EC1 ; Changed too soon1180 CMP #125 ; seems to mess up here1190 BCC POSTVBI21200 DEX } ; undo VBI1210 POSTVBI21220 DEX ; started at 11230 BEQ EMUL1240 ; If PAL, return X*156+A-VSAV})="iЈiʅԆ`ԅ`8̅Ԇ`"hhh h  S0G S0B Ԅ Յ} S0( Ԧ }8̰ "26 TACH$(88$E1250 ; If NTSC, return X*131+A-VSAVE1260 ; Always move one RTC tick into VCLOCKS1270 ; since it will fit and avoid negati}ve time1280 SEC1290 SBC VCSAVE1300 BCS ADJDONE1310 CLC1320 ADC } #131 ; 1 RTC tick1330 LDY PAL1340 DEY1350 BNE NOTPAL1360 ADC #25 ; 156}10 ; VC.ASM20 ;30 ; Copyright (c) 200640 ; Preston Crow50 ;60 ; Usage:70 ; X=USR(ADDR,...)80 ;90 ; What is VCOUNT whe }n RTCLOCK is updated?0100 ;0110 ; Return is 256*last pre-VBI VCOUNT + first post-VBI0120 ;0130 ; Results:0140 ; VBI alwa }ys completes with VCOUNT of 1280150 ; VBI starts at 124, but sometimes we miss0160 ; it and record 128.0170 ;0180 ; Inter }esting: We can return to user space from0190 ; DSKINV in the middle of a VBI!0200 ; Apparently during I/O, the VBI is abbre }viated,0210 ; so we can return much earlier than expected.0220 ;0230 *= $6000240 FR0 = $D4 ; 2-byte U}SR return code0250 RTCLOK = $12 ; 3-byte 60th of a second timer0260 VCOUNT = $D40B ; 1-byte vertical line count}er0270 PLA0280 TAY0290 BEQ NOPARMS0300 PARM PLA0310 PLA0320 DEY}hhh  ԅԆ`UNT0280 STA FR00290 LDA #$000300 STA FR0+10310 VC 1;@&,16.hhh  ԅԆ`56-?:C:,,5(P:'AV,&AV$P} for PAL1370 NOTPAL1380 DEX1390 ADJDONE STA FR0 1400 STX RTDIFF1410 RTS1420 BADSE}C LDA #$FF ; Bad sector -- abort1430 STA FR01440 STA FR0+11450 RTS1460 EMUL } SEC ; Less than one jiffy--probably an emulator1470 SBC VCSAVE1480 STA FR01490 STX })790 ? "PRESS ANY KEY FOR THE MAP":GOSUB 5400:GOTO 6000800 REM ҠȠ810 ? "}ENTER A STRING TO SEA} RTDIFF1500 RTS-probably an emulator1470 SBC VCSAVE1480 STA FR01490 STX 0330 BNE PARM0340 NOPARMS0350 LDA RTCLOK+20360 AGAIN LDX VCOUNT0370 CMP RTCLOK}+20380 BEQ AGAIN0390 LDA VCOUNT0400 STA FR00410 STX FR0+10420 }:'AV, @ D:VC.BAS;@&,16.hhh  ԅԆ`56-?:C:,,5(P:'AV,&AV$P) RTS BEQ AGAIN0390 LDA VCOUNT0400 STA FR00410 STX FR0+10420 RCH FOR":INPUT Y$:S$(1040)=" ":IF Y$="" THEN 100820 GOSUB 6100:X$=L$830 ? "HIT E FOR ENHANCED OR ANY KEY TO ABOR";840 X=}USR(ADR(SE$),ADR(Y$),LEN(Y$),ADR(S$),ADR(X$),G,0)850 ? " ~~~~~~~~FOR MEN";:GOSUB 5400:IF A<>42 THEN 6200860 ? "";:GOSUB }6300:? "HIT ANY KEY TO ABOR";880 X=USR(ADR(SE$),ADR(Y$),LEN(Y$),ADR(S$(721)),ADR(X$),G,1)885 ? " TO SCROLL ٦} MEN";890 IF PEEK(53279)=3 THEN GOSUB 6600:GOTO 885891 A=PEEK(764):IF A=255 THEN 890892 POKE 764,255:GOTO 62001000 }REM ˠР1001 S$=" ":S$(1040)=" ":S$(2)=S$:Y$="":GOTO 8201300 REM ˠˠĠ130 }1 GRAPHICS 0:POKE 752,1:? :? " **************":? " *ˠŠ*":? " *Ҡ*"1310 ? " *********!}*****":? " (PRESS ANY KEY TO END)":A=0:B=0:POSITION 3,7:? " ":? " "1320 ? " | 282 284 286 | 290 292 294 "} |":? " || || || || |":? " "1330 S=S+720*(S=0):Y$=L$:D=USR(ADR(TACH$),G,ADR(Y$)#},S):D=D+(D=0):REM POKE 203,12:D=631333 IF D=65535 THEN ? "ERROR READING SECTOR ";S:GOTO 13901336 D=PEEK(203)*131+D:IF PEEK($}53268)=1 THEN D=PEEK(203)*25+D:D=8867235/(19*D):GOTO 13401337 D=17897725/(38*D)1340 A=A+D:C=INT(D+0.5):B=B+1:POSITION 3,12%}1350 ? "  ":POSITION 2+32*(C>296),121360 IF C<280 OR C>2&}96 THEN ? "";CHR$(30+(C>296)):POSITION 2+32*(C>296),13:GOTO 13801370 POSITION ((C-279)*2)+1,12:? "":POSITION (C-279)*2,13'}1380 ? C:POSITION 7,17:? "LASTRPM = ";D:? "AVERAGE RPM = ";A/B:IF PEEK(764)=255 THEN 13301390 ? " Ӡ٠٠ҠΦ(}":GOSUB 5400:GOTO 62001400 REM ŠήӠ1401 GRAPHICS 0:? " CREATE AUTORUN.SYS FILE":? "This ro)}utine creates an AUTORUN.SYS"1410 ? "that will, at boot, execute the commands you select, as if you had just typed *}them."1420 ? "You are limited to 195 characters in your command space, although, it may be several lines long."1430 ? +}"ENTER A DISK TO CREATE AUTORUN.SYS ON AND PRESS ANY KEY (N TO ABORT)":GOSUB 54001440 IF A=35 THEN 62001450 X$="":Q$="D :AU,}TORUN.SYS":Q$(2,2)=STR$(G):TRAP 1470:CLOSE #1:OPEN #1,4,0,Q$:CLOSE #11460 ? "AUTORUN.SYS ALREADY EXISTS ON DRIVE ";G:? "TYPE-} TO ERASE IT":GOSUB 5400:IF A<>43 THEN 62001470 ? "ENTER A COMMAND LINE ( IF DONE)":INPUT Y$:IF LEN(X$) THEN X$(LEN(.}X$)+1)=CHR$(155)1475 X$(LEN(X$)+1)=Y$1480 IF Y$<>"" THEN 14701490 X$=X$(1,LEN(X$)-1):IF LEN(X$)>195 THEN ? "ERROR--COMMAND/} SPACE OVERFLOW":GOTO 15501500 AR$(5,5)=CHR$(55+LEN(X$))1510 REM TRAP 1530:CLOSE #1:OPEN #1,8,0,Q$:? #1;AR$;X$;"";""0};:CLOSE #1:GOTO 15401520 TRAP 1530:CLOSE #1:OPEN #1,8,0,Q$:? #1;AR$;X$;"";"";:CLOSE #1:GOTO 15401530 ? "ERROR IN WRI1}TING...":CLOSE #11540 ? "PRESS ANY KEY FOR MENU";1550 GOSUB 5400:GOTO 62001600 REM ̠Ӡ1601 Y$=L2}$:X$="":X$(128)="":X$(2)=X$:? "REPLACING ALL BLANK SECTORS WITH BUFFER"1610 ? "SECTOR: ":FOR S=1 TO 720:? "~~~";S;:IF 3}S<100 THEN ? " ";:IF S<10 THEN ? " ";1620 Q=82:GOSUB 5000:GOSUB 5300:IF L$=X$ THEN L$=Y$:GOSUB 5300:Q=87:GOSUB 50001630 NEX4}T S:GOTO 1001900 REM ˠ٠1901 G2=G:IF A<9 THEN G=A1905 GRAPHICS 0:POKE 762,1:S=361:Q=82:E=0:? "FN5}) FILENAME.EXT SEC STRT STATUS"1910 GOSUB 5000:FOR A=0 TO 7:Q$=L$(A*16+1,A*16+16):IF ASC(Q$)=0 THEN 21101920 IF E<10 TH6}EN ? "0";1930 ? E;") ";Q$(6,13);".";Q$(14);" ";1940 C=256*ASC(Q$(3))+ASC(Q$(2)):D=256*ASC(Q$(5))+ASC(Q$(4)):IF C<100 THEN7} ? " ";:IF C<10 THEN ? " ";1950 ? C;" ";1960 IF D<1000 THEN ? " ";:IF D<100 THEN ? " ";:IF D<10 THEN ? " ";1970 ? D;" ";8}1980 C=ASC(Q$):IF C>127 THEN C=C-128:? "DELETED";1990 Y$="":IF C>63 THEN C=C-64:Y$="A"2000 IF C>31 THEN C=C-32:? "*9}";2010 IF C>15 THEN C=C-16:Y$(LEN(Y$)+1)="B"2020 IF C>7 THEN C=C-8:Y$(LEN(Y$)+1)="C"2030 IF C>3 THEN C=C-4:Y$(LEN(Y$)+1:})="D"2040 IF C>1 THEN C=C-2:Y$(LEN(Y$)+1)="E"2050 IF C>0 THEN C=C-1:Y$(LEN(Y$)+1)="F"2060 IF Y$="AE" THEN ? "NORMAL";:GOTO;} 21002070 IF Y$="AEF" THEN ? "OPENED";:GOTO 21002080 IF Y$="EF" THEN ? "DOS 2.5";:GOTO 21002090 ? Y$;2100 ? :E=E+1:NEXT A<}:IF E<60 THEN S=S+1:GOTO 19102110 S=360:GOSUB 5000:A=ASC(L$(2))>208:X$="":X$(140)="":X$(2)=X$:X$(1,90)=L$(11,100):X$(129,1=}32)=L$(2,5)2120 IF A THEN S=1024:GOSUB 5000:X$(91,128)=L$(85,122):A=ASC(L$(123))+256*ASC(L$(124))2140 ? "SECTORS POSSIBLE: >} ";ASC(X$(129))+256*ASC(X$(130)):? "SECTORS FREE: ";ASC(X$(131))+256*ASC(X$(132))+A2150 S$=" ":S$(1040)=" ":S$(2)=S$:X=USR(?}ADR(M2$),ADR(X$),ADR(S$))2160 ? "SECTORS ACTUALLY AVAILABLE: ";X2170 G=G2:? "PRESS ANY KEY FOR MENU";:GOSUB 5400:GOTO 6200@}3000 REM ŠΠ3001 ? "}"3010 ? "TYPE NUMBER (-1 TO QUIT)";:INPUT Y$:GOSUB 5100:TRAP 40000:A=1:D=V:A}Y$="0123456789ABCDEF"3020 IF V<0 THEN 1003030 ? "";V,"$";3040 IF A*16<=V THEN A=A*16:GOTO 30403050 B=INT(D/A):? Y$(B+1,B}B+1);:D=D-B*A:A=A/16-(A=1):IF A>0 THEN 30503060 ? "";:D=V:A=13070 IF A*256<=V THEN A=A*256:GOTO 30703080 B=INT(D/A):? "C}";CHR$(B);:D=D-B*A:A=A/256-(A=1):IF A>0 THEN 30803090 ? "";:GOTO 30103100 REM ȠӠ3101 POKE 702D},4:? "}ENTER NEW DRIVE NUMBER":INPUT Y$:GOSUB 5100:G=1+((V-1)*(V<9)*((V-INT(ABS(V)))=0)):GOTO 1003200 REM ҠæE}٠3210 GOSUB 6100:G2=1+(G=1):? " HIT TO COPY D";G;": TO D";G2;": OR PRESS FOR 1040 SECTOR COP";3220 F}GOSUB 5400:IF A<>18 AND A<>42 THEN GOTO 62003230 POSITION 6,22:? " PRESS ANY KEY TO ABOR";:GR=PEEK(88)+PEEK(89)*256:S$=G}" ":S$(1039)=" ":S$(2)=S$3240 ERROR=USR(ADR(SC$),ADR(L$),ADR(S$),G,G2,GR+84,1):IF ERROR=0 THEN GOTO 32803250 IF ERROR=1 THEH}N ? "ABORTED"3260 IF ERROR=2 THEN ? " WRITE ERROR"3270 ? "PRESS ANY KEY FOR MENU";:GOSUB 5400:GOTO 62003280 IF I}A<>42 THEN 33703300 ? "";:GOSUB 6300:POSITION 2,22:? " PRESS ANY KEY TO ABOR";3310 ERROR=USR(ADR(SC$),ADR(L$),ADR(SJ}$(721)),G,G2,GR+524,721):IF ERROR<>0 THEN GOTO 32503370 POSITION 1,22:? "";:IF S$(721,721)<>" " THEN ? " SCROLL "K};3371 IF USR(ADR(INDEX$),ADR(S$),ASC("-"),1040) THEN ? " RE-READ BAD SECS WRITE BAD SECS ";3373 IF USR(ADR(INDEX$),AL}DR(S$),ASC("."),1040) THEN ? " WRITE ZERO SECS";3380 ? "";3381 IF PEEK(53279)=3 THEN GOSUB 6600:GOTO 33703382 A=PEEK(76M}4):IF A=255 THEN 33813383 POKE 764,2553390 IF A=21 THEN GOSUB 3400:GOTO 33703391 Y$="":Y$(127)="":Y$(2)=Y$3393 IF A=50 N}THEN L$=Y$:A=ASC("."):GOSUB 3500:GOTO 33703394 IF A=22 THEN L$=Y$:A=ASC("-"):GOSUB 3500:GOTO 33703399 GOTO 62003400 REM O}ŭĠĠӛ3401 IF USR(ADR(INDEX$),ADR(S$),ASC("-"),1040)=0 THEN RETURN 3402 Y$="":Y$(128)="":Y$(2)=Y$:NOP}ERROR=13403 POSITION 6,22:? " PRESS ANY KEY TO ABORT";:S=03405 Q=USR(ADR(INDEX$),ADR(S$(S+1)),ASC("-"),1040-S):S=S+Q}Q:IF Q=0 THEN RETURN 3406 GR=PEEK(PEEK(88)+PEEK(89)*256+81):IF GR AND S<325 THEN GOSUB 6400:GR=03407 IF GR=0 AND S>720 THENR} GOSUB 6500:GR=13410 POSITION 3+S-INT((S-1)/36)*36,2+INT((S-1)/36)-9*(GR<>0):? "";3420 Q=82:GOSUB 5000:IF ERROR<>1 THEN GS}OTO 34603429 S$(S,S)="*":IF L$=Y$ THEN S$(S,S)="."3430 POKE 93,ASC(S$(S,S))-323440 IF PEEK(764)<>255 THEN POKE 764,255:GOTT}O 62003450 IF S$(S,S)="*" THEN Q=87:V=G:G=G2:GOSUB 5000:G=V3460 IF S<1040 THEN 34053470 RETURN 3500 REM ŠڦU}ϯĠӛ3501 IF USR(ADR(INDEX$),ADR(S$),A,1040)=0 THEN RETURN 3503 POSITION 6,22:? " PRESS ANY KEY TO ABORT";:SV}=03505 Q=USR(ADR(INDEX$),ADR(S$(S+1)),A,1040-S):S=S+Q:IF Q=0 THEN RETURN 3506 GR=PEEK(PEEK(88)+PEEK(89)*256+81):IF GR AND SW}<325 THEN GOSUB 6400:GR=03507 IF GR=0 AND S>720 THEN GOSUB 6500:GR=13510 POSITION 3+S-INT((S-1)/36)*36,2+INT((S-1)/36)-9*(GX}R<>0):? "";3540 IF PEEK(764)<>255 THEN POKE 764,255:GOTO 62003550 Q=87:V=G:G=G2:GOSUB 5000:G=V3560 IF S<1040 THEN 35053Y}570 RETURN 3700 REM ŠԠŠ3710 A=PEEK(65):POKE 65,0:IF A=0 THEN POKE 65,13720 GOTO 62003800 REM Z}ԠӠ3810 S=1:Q=82:GOSUB 50003820 GRAPHICS 0:? " ANALYSIS OF BOOT SECTOR":? :? "BOOT FLAG: ";ASC(L[}$(1));3830 IF L$(1,1)<>"" THEN ? " *** NOT ZERO ***";3840 ? :? "SECTOR COUNT: ";ASC(L$(2)):? "LOAD AT: ";ASC(L$(4))\}*256+ASC(L$(3))3850 ? "INITIALIZE: ";ASC(L$(6))*256+ASC(L$(5))3860 ? "CONTINUE AT: ";ASC(L$(9))*256+ASC(L$(8))3870 IF ASC]}(L$(7))<>76 THEN ? " *** CONTINUE ISN'T A JMP ***"3880 ? "MAX OPEN FILES: ";ASC(L$(10))3890 ? "DRIVES: ";:A=ASC(L$(11))^}:FOR V=1 TO 8:IF A/2<>INT(A/2) THEN ? V;" ";3900 A=INT(A/2):NEXT V:? 3910 ? "DOS.SYS EXISTS: ";:IF ASC(L$(15)) THEN ? "_}YES"3920 IF ASC(L$(15))=0 THEN ? "NO"3930 ? "DOS.SYS AT SECTOR: ";ASC(L$(17))*256+ASC(L$(16))3990 ? :? "PRESS RETURN TO C`}ONTINUE";:INPUT Y$:GOTO 62004000 REM Ӡ4010 GRAPHICS 0:? :? ," DISK":? ," VERSION 4.0":? :a}? " A COMPLETE PACKAGE OF DISK TOOLS":? 4020 ? " COPYRIGHT (C) 1985, 2005, 2006":? ," PRESTON CROW"4030 ? :? :? "DISTRIb}BUTE FREELY":? :? "IF YOU WANT TO THANK ME, SEND EMAIL"4040 ? "TO ATARI-DISK-GUY";CHR$(64);"CROWCASTLE.NET":? "(I'LL ACCEPT c}DONATIONS OF ATARI STUFF)"4050 ? :? :? :? :? :? :? " PRESS ANY KEY TO CONTINU";4090 GOSUB 5400:GOTO 62005000 REM d}ºˠӠ5010 ERROR=USR(ADR(DISKIO$),Q,G,ADR(L$),S):IF ERROR=1 OR NOERROR>0 THEN RETURN 5020 ? "ERROR- "e};ERROR;" WHILE ";:IF Q=82 THEN ? "READING";5030 IF Q=87 THEN ? "WRITING";5040 ? " D";G;": SECTOR ";S:POP :? "PRESS ANY KEY f}FOR MENU":GOSUB 5400:POKE 764,255:GOTO 62005100 REM ºԠԠ5101 REM κ٤Ժ֠5102g} V=-1:IF Y$="" THEN RETURN 5110 TRAP 5120:V=VAL(Y$):RETURN 5120 TRAP 5210:IF Y$(1,1)<>"$" THEN 51605130 Y$=Y$(2)5140 V=ASh}C(Y$)-48-7*(ASC(Y$)>64)5150 Y$=Y$(2):V=16*V+ASC(Y$)-48-7*(ASC(Y$)>64):GOTO 51505160 IF Y$(1,1)<>"'" AND LEN(Y$)<>1 THEN 520i}05170 IF Y$(1,1)="'" THEN Y$=Y$(2)5180 V=05190 V=V+ASC(Y$):Y$=Y$(2):V=V*256:GOTO 51905200 IF LEN(Y$)=2 THEN 51405210 RETj}URN 5300 REM ٠Ҡ5301 POKE 703,24:POSITION 2,1:IF S<1000 THEN ? " ";:IF S<100 THEN ? " ";:IF S<10 k}THEN ? " ";5310 ? S;:X=USR(ADR(D$),ADR(L$)):POKE 703,4:RETURN 5400 REM ԠҠ٠5401 POKE 764,2555410l} IF PEEK(764)=255 THEN 54105420 A=PEEK(764):POKE 764,255:RETURN 6000 REM ҠР6001 GRAPHICS 0:POKEm} 752,1:POKE 82,4:? "}012345678911111111112222222222333333 01234567890123456789012345"6010 POKE 82,0:POSITION 0,2:FOn}R X=1 TO 756 STEP 36:IF X<100 THEN ? " ";:IF X<10 THEN ? " ";6020 ? " ";X;S$(X,X+35);:NEXT X:X$=" ":X$(284)=" ":X$(2)=X$603o}0 IF S$(757)=X$ THEN 60806040 ? " PRESS ANY KEY FOR MORE";:GOSUB 54006060 ? "";:FOR X=757 TO 1009 STEP p}36:IF X<1000 THEN ? " ";6070 ? X;S$(X,X+(X<1009)*4+31);:NEXT X:? 6080 ? " PRESS ANY KEY FOR MENU";6090 POKE 82,2:GOSUB 54q}00:GOTO 62006100 REM ˠҠР6110 GRAPHICS 0:POKE 82,0:? "} 012345678911111111112222222222333333 r} 01234567890123456789012354"6120 FOR X=1 TO 720 STEP 36:IF X<100 THEN ? " ";:IF X<10 THEN ? " ";6130 ? " ";X:NEXs}T X6140 RETURN 6200 REM Π٠6201 POKE 82,1:GRAPHICS 0:POKE 752,1:? "}t}| |0 1 2 3 4 5 6 7 |0";6210 ? "1234567|| 0|||| 8||u}|| 16|||| 24|||| 3";6220 ? "2|||| 40|||| 48|||| 56|||| 64|||| 72|||| 80|v}||| 88|||| ";6230 ? "96|||| 104|||| 112|||| 120|||";6240 ? "w}";:POKE 82,2:GOSUB 5300:POKE 703,4:GOTO 1006300 REM ĠˠР6310 POSITION 0,2:? "x}"6320 FOR X=720 TO 1040 STEP 36:IF X<1000 THEN ? " ";6330 ? X:NEXT X6340 RETURN 6400 REM ̠ˠày}Л6410 POSITION 0,2:? "";6420 FOR X=1 TO 324 STEP 36:IF X<100 THEN ? " ";:IF X<10 THEN ? " ";6430 ? X;S$(X,X+35)z};"":NEXT X:POSITION 0,22:RETURN 6500 REM ̠РΠӤ6510 POSITION 0,2:? ""6520 FOR X{}=721 TO 999 STEP 36:? " ";S$(X,X+35);"";6530 ? " ";X:NEXT X:? X;S$(X):RETURN 6600 REM ̠àРӤ6610|} IF PEEK(PEEK(88)+PEEK(89)*256+81) THEN 64006620 GOTO 650032767 FOR A=1 TO 1000:NEXT AEM ̠àРӤ6610Y10 ; TACH.ASM20 ;30 ; Copyright (c) 2005,200640 ; Preston Crow50 ;60 ; Usage:70 ; X=USR(RELOCATABLE,CMD,DRIVE,BUFFERADR~}(128),SECTOR)80 ;90 ; We can determine how fast the disk is spinning by0100 ; re-reading the same sector. The time from t}he end of0110 ; the first read to the end of the second read should be0120 ; exactly one revolution.0130 ;0140 ; There ar}e several timers in the Atari:0150 ; RTCLOCK, incremented every vertical blank.0160 ; The VCOUNT register, incremented ever}y second scanline (228*2 cycles)0170 ;0180 ; VCOUNT in seconds: 1/(clock speed)*228*20190 ; RTCLOCK per second: 1/(vc_in_s}ecs * lines/2)0200 ;0210 ; NTSC: 3.579545MHz crystal0220 ; NTSC: VCOUNT: 127.39us (456/3579545)0230 ; NTSC: 59.92 RTCLOC}K updates/second (1/(456/3579545 * 262/2))0240 ; NTSC: RTCLOCK: 16.841ms (59736/3546894)0250 ; NTSC: Add RTCLOCK*131 to VCO}UNT0260 ;0270 ; PAL: 3.546894MHz crystal0280 ; PAL: VCOUNT: 128.56us (456/3546894)0290 ; PAL: 49.86 RTCLOCK updates/seco}nd (1/(456/3546894 * 312/2))0300 ; PAL: RTCLOCK: 20.056ms (71136/3546894)0310 ; PAL: Add RTCLOCK*156 to VCOUNT0320 ;0330 }; This determines the time it takes to read a sector,0340 ; returning the time in VCOUNT.0350 ;0360 ; Defined as TACH$ at }line 25 of DISK0370 ;0380 ; Usage:0390 ; V=USR():V=V+PEEK(203)*131:IF PEEK(53268)=1 THEN V=PEEK(203)*25+V0400 ;0410 ; V }is the number of VCOUNT increments, with is the time for one revolution.0420 ;0430 ; NTSC: Seconds elapsed is V*(456/357954}5)0440 ; PAL: Seconds elapsed is V*(456/3546894)0450 ;0460 ; We have S/R, want R/M0470 ; Invert to get R/S0480 ; Times }60 to get RPM0490 ;0500 ; NTSC: 3579545*60/(456*V)0510 ; PAL: 3546894*60/(456*V)0520 ;0530 ; NTSC: 3579545*5/(38*V)}0540 ; PAL: 3546894*5/(38*V)0550 ;0560 ; Making it yet more complicated, the RTC isn't0570 ; update exactly when the VCO}UNT cycles to zero.0580 ; RTC is updated during the VBI, which starts when0590 ; VCOUNT is 124 and ends when VCOUNT is 125.}0600 ; (Normally it runs until VCOUNT is 128, but not0610 ; during I/O.)0620 ; Deal with this by adjusting RTCLOCK if eith}er VCOUNT0630 ; is >=1250640 ;0650 *= $6000660 DUNIT = $301 ; Drive number0670 DCOMND = $302 ; Dr}ive command: 'R' or 'W'0680 DBUF = $304 ; Disk buffer0690 SECTOR = $30A0700 DSKINV = $E453 ; JSR here to }run disk command0710 FR0 = $D4 ; 2-byte USR return code0720 RTCLOK = $12 ; 3-byte 60th of a second timer0}730 VCOUNT = $D40B ; 1-byte vertical line counter0740 VCSAVE = $CC0750 VCMAX = $CD ; 131 for NTSC, 156 for} PAL0760 PAL = $D014 ; PAL is 1, NTSC is 150770 RTDIFF = $CB0780 PLA0790 LDA #$52 ; 'R}'0800 STA DCOMND0810 PLA0820 PLA0830 STA DUNIT0840 PLA0850 } STA DBUF+10860 PLA0870 STA DBUF0880 PLA0890 STA SECTOR+10900 } PLA0910 STA SECTOR0920 ; NTSC or PAL? Set VCMAX0930 LDA #1310940 LDX PAL09}50 DEX0960 BNE NOTPAL0970 LDA #1560980 NOTPAL STA VCMAX0990 ; Extra read to sta}bilize things1000 JSR DSKINV ; extra read 11010 BMI BADSEC1020 SEC1 JSR DSKINV1030 } BMI BADSEC1040 LDA VCOUNT ; save screen position1050 STY RTCLOK+2 ; Reset clock to 1106}0 CMP VCOUNT1070 BNE SEC1 ; Changed too soon1080 DEY ; LDY #$001090 STY } FR0+11100 STY VCMAX+11110 STA VCSAVE ; Where we started1120 CMP #125 ; seems to m}ess up here1130 BCC POSTVBI11140 INC RTCLOK+2 ; need that INC1150 POSTVBI11160 ; We've seeked t}o the right track, and the sector is1170 ; just past the head.1180 ; Now read the sector again and return the elapsed time}1190 ; We can't wait for the next jiffy, as the disk is already1200 ; spinning towards the sector.1210 AGAIN JSR DSK}INV1220 BMI BADSEC1230 LDA VCOUNT1240 LDX RTCLOK+21250 CMP VCOUNT126}0 BNE SEC1 ; Changed too soon1270 CMP #125 ; seems to mess up here1280 BCC POSTVBI2}1290 DEX ; undo VBI1300 POSTVBI21310 DEX ; started at 11320 BEQ EMUL1330 ; We want} X*VCMAX+A-VSAVE1340 SEC1350 SBC VCSAVE1360 BCS ADJDONE1370 CLC1380 } ADC VCMAX ; 1 RTC tick1390 DEX1400 ADJDONE1410 STA FR0 1420 STX RTDIFF1430 ; }We now want RTDIFF*VCMAX+FR01440 MSTART LSR RTDIFF1450 BCS MADD1460 BEQ MDONE1470 BCC MS}HIFT1480 MADD1490 ; FR0(2) = FR0(2) + VCMAX(2)1500 CLC1510 LDA FR01520 ADC VCMAX1530 } STA FR01540 LDA FR0+11550 ADC VCMAX+11560 STA FR0+11570 MSHIFT1580 ; VCMAX(2)=VCMAX(}2)*2 (shift/roll left)1590 ASL VCMAX1600 ROL VCMAX+11610 CLC ; should be a NOP1620 } BCC MSTART1630 MDONE1640 RTS1650 BADSEC LDA #$FF ; Bad sector -- abort1660 STA FR01670 } STA FR0+11680 RTS1690 EMUL SEC ; Less than one jiffy--probably an emulator1700 SBC } VCSAVE1710 SEC ; Should be a NOP1720 BCS ADJDONE jiffy--probably an emulator1700 SBC KhRhhhhh h  S0] S0X Ԅ Մ΅} S0< Ԧ }18̰eʅԆF˰ ^}eͅԥe΅&`ԅ`88  S0] S0X Ԅ Մ΅} S0< Ԧ }18̰eʅԆF˰ \25 DIM TACH$(150):TACH$="hRhhhhh h  S0] S0X Ԅ Մ΅} S0< Ԧ "26 TACH$(88b})="}18̰eʅԆF˰ eͅԥe΅&`ԅ`88"] S0X Ԅ Մ΅} S0< Ԧ "26 TACH$(88`D/