þþE'd6X* ATARI 1050 DISK DRIVE OPERATING SYSTEM -- part 4nX*xX* execute floppy test‚+X* fist format diskette enhanced densityŒX*–5†FPTESTQ†SEKBUF;mark first 12 bytes from sector  P„HZ9DªQ†SEKBUF´ P„HZ9E¾$> ȆFPTST1Q†SEKBUF9Ò P†BUFFER9Ü0æ I†FPTST1ð ƒDDF;format nowú.G…TFAIL;error, motor on/off every 2 seconds †VERIFO;ok, verify *…ERRORG…TFAIL;error?"5 †WS13AT;write pattern to sector 1,3 of each track,/†FPTST2 …M6DB6;fill sector buffer with $6DB66# „TWR1;write it to other sectors@ ‡MOTONOF;short delayJ …TVER1;verify test 1T ‡MOTONOF;delay^! …MDB66;fill sector with $DB66h# „TWR2;write it to other sectorsr ‡MOTONOF;delay| …TVER2;verify† ‡MOTONOF;delay …M6DB6;pattern 6DB6 againš ‡WALTER1;write alternately¤ ‡MOTONOF;delay® ‡VALTER1;verify alternately¸ ‡MOTONOF;delay …MDB66;pattern DB66Ì ‡WALTER2;write alternatelyÖ ‡MOTONOF;delayà ‡VALTER2;verify alternatelyê ‡MOTONOF;delayôQ>;SEEK on track 0þ P…TRACK „SEEKQ>;sector 1 P†SEKTOR&P†SEKREG;to controller0 …TREAD;read sector 1:'#†SEKBUF ;number of o.k. tests + 1D H„TST1N#†SEKBUF X'„TST1 „WOSV;write one sector, verifyb""„HZ9D;number of test loops - 1lH†FPTST2;more to dov Q„HZ9E€ F„TST2Š "„HZ9E” !†FPTST2žX*¨„TST2Q†FCNTRL;test loop done²P…CSTAT;mark status¼$>ÿ;reset stackÆBÐ ‡RESTORE;to track 0Ú!„DRDY;back to main loopäX*îX* fatal error during testø+X* turn motor on and off every 2 secondsX* …TFAILQ>;invert motor bitNƒDRA PƒDRA*$>;2 seconds delay4 †DELAY2>!…TFAIL;loop foreverHX*R=X* read alternately from track 39 down and from track 0 up\X*f‡VALTER2Q>';track 39p P„SBUFzQ>;and track 0„ P„SBUFŽQ>˜P„SBUF;read 20 tracks¢%…VALT1 †SR2TRK;SEEK, read 2 tracks¬"#„SBUF;next track from begin¶"„SBUF;next track from endÀ"„SBUF;read 20 tracks?ÊH…VALT1;no, continueÔ:ÞX*è1X* read tracks alternately, 0 - 19 and 39 - 20òX*ü"‡VALTER1Q>;start with track 0 P„SBUFQ>';and track 39 P„SBUF$Q>;20 tracks each. P„SBUF8%…VALT2 †SR2TRK;SEEK, read 2 tracksB #„SBUFL "„SBUFV"„SBUF;all done?` H…VALT2j:tX*~2X* write tracks alternately, 39 - 20 and 0 - 19ˆX*’#‡WALTER1Q>';start with track 39œ P„SBUF¦Q>;and track 0° P„SBUFºQ>;20 tracks eachÄ P„SBUFÎ)…WALT1 †SW2TRK;SEEK and write 2 tracksØ #„SBUFâ "„SBUFì"„SBUF;all done?ö H…WALT1: X*2X* write tracks alternately, 0 - 19 and 39 - 20X*(‡WALTER2Q>;start with 02 P„SBUF<Q>';and 39F P„SBUFPQ>;20 tracks eachZ P„SBUFd …WALT2 †SW2TRK;write 2 tracksn #„SBUFx "„SBUF‚"„SBUF;all done?Œ H…WALT2–: X*ªX* test SEEK on track´X*¾@…TSEEKQ†SEKBUF;intended track in second byte after commandÈR>(ÒI†TSEEK1;only 39 tracksÜ P…TRACKæ „SEEK;execute SEEKð,ú:†TSEEK1;;wrong track:X*"X* read two tracks,X*6†SR2TRKQ„SBUF;tracknumber 1@ P…TRACKJ †TRKVER;verifyTQ„SBUF;tracknumber 2^ P…TRACKh †TRKVER;read alsor:|X*†&X* write test pattern to two tracksX*š†SW2TRKQ„SBUF;tracknumber 1¤ P…TRACK® †TRKWRT;write to track¸Q„SBUF;tracknumber 2 P…TRACKÌ †TRKWRT;alsoÖ:àX*êX* do step for testingôX*þ3…TSTEPQ†SEKBUF;do test step, direction in $01PƒDIR „STEP:&X*0#X* fill sector with test pattern:X*D†WS13ATQ>N P…TRACKXQ>;pattern byte #1b?;pattern byte #2l †SEKPATv‡WS13AT1Q>;fill sector 1€ P†SEKTORŠ „WOSV;write + verify sector”G…TWERR;write test erroržQ>;sector 3 also¨ P†SEKTOR² „WOSV;write¼G…TWERR;on error to TWERRÆ#…TRACK;next trackÐ Q…TRACKÚR>(;until track 39ä H‡WS13AT1îQ>øP…TRACK;track 0$> $‡WS13AT2Q†BUFFER9;move test bytes P†SEKBUF9 0* I‡WS13AT24Q„HZ9D;move counter for test>P†SEKBUF H Q„HZ9ERP†SEKBUF \Q>f P†SEKTORp „WOSV;write to sector 1z G…TWERR„:ŽX*˜9X* pattern $6DB6 or $DB66, depending on choice ($009C)¢X*¬…MWAHLQˆMUSTERNR¶H†MWAHL1;pattern $DB66?À!…M6DB6;no, $6DB6ʆMWAHL1!…MDB66ÔX*ÞX* test readè;sector number <16? I†TREAD1 %>;yes, read sector 1$ !†TREAD2. 1†TREAD1;;otherwise subtract 16 & read sector 38 S>B %>L †TREAD2'†SEKREGV '†SEKTOR` T?j T?t &T?;calculate address of status byte~ O>;for error (0 - $80)ˆ (P…KOMND;move address to KOMND & JUMPL’ Q>œ P…JUMPL¦ Q>;number of retries° P…COUNTº †TREAD3 ˆRDSEKTOR;read sectorÄ F†TREAD5Î "…COUNT;error, retryØ F…TWERRâ Q†FCNTRL;get error typeì M> ö F†TREAD4;lost data? !†TREAD3;if so, another try …TWERR!„TST2;end of test †TREAD4Q…CSTAT M>;RECORD NOT FOUND?( F†TREAD3;no, other error2 ! ‡RESTORE;otherwise to track 0<  „SEEK;goto track, againF  ˆRDSEKTOR;read, againP H…TWERR;no good to nobodyZ Q>@;mark SEEK ERRORd P‡SEEKERRn Q>ÿx P…FMERK;error occured‚ †TREAD5:;end of testŒ X*– X* fill sector with pattern  X*ª …M6DB6Q>´ PˆMUSTERNR;indicate pattern 1¾ Q>m;first pattern byteÈ %>¶;second pattern byteÒ !†SEKPAT;fill sectorÜ X*æ …MDB66Q>ÿð PˆMUSTERNR;indicate pattern 2ú Q>Û;first pattern byte %>f;second pattern byte X* X* fill sector with pattern" X*, †SEKPAT$>6 "†SEKPA1P†SEKBUF9;put first byte@ 2J '†SEKBUF9;put second byteT 2^ I†SEKPA1;until sector filledh :r X*| X* check error† X* (…FAUSWQ†FCNTRL;move controller statusš P…CSTAT¤ '…JUMPH;to aux. cell® Q…CSTAT¸ M>;RNF error? F†FAUSW1Ì !Q…FMERK;yes, indicated by now?Ö F†FAUSW2;no, do ità Q…FMERK;write track error?ê F†FAUSW3;no, only readô Q>€;indicate write errorþ H†FAUSW4 "†FAUSW3Q>;indicate read error †FAUSW4!†FAUSW5;mark †FAUSW2Q>ÿ;indicate error& P…FMERK0 P…FMERK: Q…FMERK;write error?D H†FAUSW6;br if soN $ ˆWRSEKTOR;otherwise, write againX H†FAUSW3;wrong, againb †FAUSW6!†FAUSW7l #†FAUSW1Q…CSTAT;controller statusv M>;CRC error bit€ F†FAUSW8;no CRC errorŠ Q>;yes, indicate it” H†FAUSW5ž †FAUSW8Q…CSTAT¨ M>;lost data?² F†FAUSW9;br if not¼ Q>;yes, indicate itÆ H†FAUSW5Ð .†FAUSW9Q†TRKERR;impossible to verify track?Ú F‡FAUSW10;yes, only errorsä Q>;error, but not fatalî H†FAUSW5ø (‡FAUSW10Q>;track verify FATAL ERROR †FAUSW5%> '…FMERK;reset error mark P‡SEEKERR;indicate error code 9 …TREAD;try another read, look after address for error* Q‡SEEKERR;mark for test error4 %>> L@…KOMND7;in command byte orH P@…KOMND7R Q‡SEEKERR\ R>;lost data error?f F‡FAUSW11;br if sop #%>;change error code to binaryz ,R>;on $10 error 7, non fatal read error„ F‡FAUSW12Ž 1˜ #R>€;on $80 error 6, write error¢ F‡FAUSW13¬ 1¶ "R>@;on $40 error 5, SEEK errorÀ F‡FAUSW13Ê 1Ô "R>;on $04 error 4, read errorÞ F‡FAUSW13è 1ò !R>;on $02 error 3, CRC errorü F‡FAUSW131$‡FAUSW12'„HZA4;otherwise, error 2%>$Q†ERRADR;move error address.P@…KOMND7;to sector buffer8 %„HZA4B5‡FAUSW13Q@…KOMND7;get byte, error number as offsetL,VO>` P@…KOMND7j I‡FAUSW11t+~*‡FAUSW11 „WOSV;write sector with verifyˆ I†FAUSW7’!„TST2;errorœ†FAUSW7 …MWAHL;other pattern¦ %…JUMPH°:ºX*Ä"X* write one sector with verifyÎX*Ø „WOSVQ>€âP…ERROR;assume errorìQ>öP…COUNT;try two times †WRITE2;write *…ERROR;error?G…WOSV1;br if soQ>€;assume error, again( P…ERROR2Q>;try two times< P…COUNTF †VERIFY;for verifyP*…ERROR;error?Z …WOSV1:dX*n:X* test if step to next track is done in a certain timex2X* a step to the start of sector 1 is indicated‚/X* at the end, the number of sectors is readŒ5X* and compared with a maximum in the test command–X* "†TSTPRT …WSONE;go read sector 1ªE‡TSTPRT1;br if no sector 1´#…TRACK;step to next track¾ „SEEKÈQ>À;read addressÒ P†FCNTRLÜQ>Ò;with timeoutæ ‡TIMEOUTð&$>z;from sector buffer address $7Aú‡TSTPRT2*ƒDRA!J‡TSTPRT1;IRQ from controller?I‡TSTPRT2;DRQ?Q†DATREG;yes, read data byte"P†SEKBUF9;and store it,2;six bytes6 I‡TSTPRT2@Q…TIM64;reset timerJQ>T‡TSTPRT3*†FCNTRL^&H‡TSTPRT3;wait for controller readyh Q†FCNTRLrH‡TSTPRT1;error?|#Q„ASEK;test if sector <= maximum† R†SEKTORF‡TSTPRT4;br if soš G‡TSTPRT4¤ ‡TSTPRT1;;step takes too long®:¸X*‡TSTPRT4,;no errorÌ:ÖX*à#X* test step rate for all tracksêX*ô†TSTEPR †TSTPRTþ E‡TSTEPR1Q…TRACK;already on track 39R>'H†TSTEPR;no, continue&,;yes, no error0 ‡TSTEPR1::X*D X* verify all tracks (0 - 39)NX*X …TVER2Q>bP…TRACK;from track 0lQ>(;to track 39v P„SBUF€†TVER21 †TRKVERŠ #…TRACK” "„SBUFž H†TVER21¨:²X*¼ X* verify all tracks (39 - 0)ÆX*Ð…TVER1Q>';read from 39ÚP…TRACK;down to 0ä†TVER11 †TRKVERî "…TRACKø I†TVER11: X*"X* write to all tracks (0 - 39) X**„TWR1Q>;from track 04 P…TRACK> Q>(;to 39H P„SBUFR…TWR11 †TRKWRT;write\ #…TRACKf "„SBUFp H…TWR11z:„X*Ž"X* write to all tracks (39 - 0)˜X*¢„TWR2Q>';write from 39¬P…TRACK;down to 0¶…TWR21 †TRKWRTÀ "…TRACKÊ I…TWR21Ô:ÞX*èX* verify trackòX*ü†TRKVER „SEEK;goto trackQ>P…FMERK;mark verify track%>;read from sector 3$‡TRKVER1Q>.P…FMERK;no error8‡TRKVER2Q†SKEWTB8BG‡TRKVER3;end of table?L3V P†SEKREG;read & verify sector` †VERSEKj F‡TRKVER1t Q†FCNTRL~M>;error?ˆH‡TRKVER4;br if so’Q>œP…COUNT;read 6 times¦‡TRKVER5"…COUNT° F‡TRKVER6º †VERSEK;read another timeÄ F‡TRKVER5Î Q†FCNTRLØM>;mask error bitsâ H‡TRKVER5ì2Q>ÿ;mark error, other than CRC, LOST DATA, RNFö P†TRKERR !‡TRKVER4 .‡TRKVER6Q>;no error, drive not ready etc. P†TRKERR‡TRKVER4 …FAUSW;check error(Q…FMERK;again?2F‡TRKVER1;no, continue<1;same sector againF !‡TRKVER2P ‡TRKVER3:ZX*dX* write tracknX*x#†TRKWRT „SEEK;move head to track‚Q>ÿŒP…FMERK;mark write track–%>;from sector 3 ‡TRKWRT1Q>ªP…FMERK;no error, now´‡TRKWRT2Q†SKEWTB8¾G†TRKVER;end of table?È3Ò#P†SEKREG;select sector and writeÜ ˆWRSEKTORæF‡TRKWRT1;o.k.?ð …FAUSW;check errorúQ…FMERK;again?F‡TRKWRT1;repeat 1;continue !‡TRKWRT2