0100 * ATARI 1050 DISK DRIVE OPERATING SYSTEM -- part 3 0110 * 0120 * verify a sector 0130 * 0140 VERIFY LDA #$80 assume error 0150 STA ERROR 0160 JSR VERSEK verify sector 0170 BNE VERIFY1 br on error 0180 LDA #0 otherwise, indicate 'no error' 0190 STA ERROR 0200 RTS done 0210 VERIFY1 DEC COUNT another retry? 0220 BNE VERIFY br if so 0230 RTS otherwise error 0240 * 0250 * verify 0260 * 0270 VERSEK LDX #0 set timeout 0280 LDA #$E6 0290 JSR TIMEOUT 0300 LDA #$82 'READ SECTOR' command for controller 0310 STA FCNTRL 0320 VERSE1 BIT DRA IRQ from controller? 0330 BVC VERSE2 error 0340 BPL VERSE1 DRQ from controller? 0350 LDA DATREG yes, read byte 0360 EOR #$FF invert 0370 CMP SEKBUF,X and check 0380 BNE VERSE3 br on error 0390 LDA TIM64 othersine, reset timer 0400 INX next byte 0410 BPL VERSE1 until end of buffer 0420 LDA #1 0430 VERSE4 BIT FCNTRL wait for controller ready 0440 BNE VERSE4 0450 LDA FCNTRL mask status bits 0460 AND #$2C 0470 RTS done 0480 VERSE2 LDA FCNTRL error 0490 AND #1 controller ready? 0500 BEQ VERSE5 br if so 0510 LDA #$E6 otherwise, another timeout 0520 JSR TIMEOUT 0530 BNE VERSE1 and continue 0540 VERSE3 LDA TIM64 reset timer 0550 STX ERRADR mark error address 0560 JSR FORCE interrupt controller 0570 LDA DATREG reset IRQ 0580 VERSE5 LDA TIM64 reset timer 0590 LDA FCNTRL read status 0600 AND #4 lost data? 0610 BNE VERSEK try again, if so 0620 LDA #1 otherwise, return error 0630 RTS 0640 * 0650 * read status -- command 'S' 0660 * 0670 RSTAT JSR FORCE stop controller 0680 LDA DRA 0690 AND #$20 enhanced density? 0700 BEQ RSTAT1 br if so 0710 LDA #$1F otherwise, reset bit 7,6,5 0720 AND STATUS 0730 JMP RSTAT2 0740 RSTAT1 LDA #$80 set bit 7 for enhanced 0750 ORA STATUS 0760 RSTAT2 BIT FCNTRL test for 'write protected' disk 0770 BVC RSTAT3 0780 ORA #8 set bit 3 if so 0790 BNE RSTAT4 br always 0800 RSTAT3 AND #$F7 otherwise, reset bit 3 0810 RSTAT4 LDX #0 put diskette status 0820 STA BUFFER,X to send buffer 0830 INX 0840 LDA CSTAT controller status 0850 EOR #$FF invert 0860 STA BUFFER,X put also 0870 INX 0880 LDA #$E0 3.byte E0 0890 STA BUFFER,X 0900 INX 0910 LDA #0 4.byte 00 0920 STA BUFFER,X 0930 STA ERROR indicate 'no error' 0940 JSR SCONT send 'C' 0950 LDX #4 and also 4 status bytes 0960 STX COUNT 0970 LDX #BUFFER from address BUFFER 0980 JSR SEND 0990 LDA FCNTRL update status 1000 STA CSTAT 1010 RTS done 1020 * 1030 * format single density -- command $21 1040 * 1050 SFORM JSR SDF do formatting 1060 FORMVER BIT ERROR error? 1070 BMI SFORM1 br if so 1080 JSR VERIFO verify formatting 1090 SFORM1 LDA TIM64 reset timer 1100 JSR QUITT return result 1110 LDA #$FF write FF to format buffer 1120 LDX #0 1130 SFORM2 STA SEKBUF,X write FF 1140 INX 1150 BPL SFORM2 until end of buffer 1160 BIT ERROR formatted without error? 1170 BPL SFORM3 br if so 1180 LDA #0 otherwise, reset 1190 STA SEKBUF first 2 bytes in buffer 1200 STA SEKBUF+1 1210 SFORM3 JMP SNDSEK sector to CPU 1220 * 1230 * single density formatting 1240 * 1250 SDF JSR BSEKT build up a sector 1260 LDA #0 start with track 0 1270 STA SEKBUF+1 set address info 1280 LDA DRA set for single density 1290 ORA #$20 1300 STA DRA 1310 SDF1 BIT FCNTRL drive ready? 1320 BMI SDF2 br if not 1330 BVS SDF2 br if 'write protect' 1340 BPL SDF3 br always 1350 SDF2 LDA #$80 indicate error 1360 STA ERROR 1370 RTS done 1380 SDF3 JSR SEEK goto track to format 1390 LDA #2 try always 2 times 1400 STA COUNT 1410 JSR F1T format one track 1420 LDX #$D2 1430 STX T1024I set timer 1440 BIT ERROR error? 1450 BPL SDF4 no, next track 1460 RTS yes, break 1470 SDF4 INC TRACK incr track 1480 INC FTNR 1490 LDA #$28 all 40 tracks? 1500 CMP TRACK 1510 BNE SDF1 no, continue 1520 RTS yes, formatting done 1530 * 1540 * write a track 1550 * 1560 F1T LDY #0 1570 LDA SKEWTB,Y mark first sector from SKEW table 1580 STA FSNR 1590 LDA #$F0 'write track' command to controller 1600 STA FCNTRL 1610 LDA #$D2 for timeout 1620 F1T1 BIT DRA write 1 byte 00 at DRQ 1630 BPL F1T1 1640 STY DATREG 1650 F1T2 BIT DRA another byte 00 1660 BPL F1T2 1670 STY DATREG 1680 STA T1024I start timer 1690 LDA #0 write 00 1700 LDX #$AC 172 times 1710 F1T3 BIT DRA wait for DRQ 1720 BVC F1T4 error, IRQ 1730 BPL F1T3 1740 STA DATREG write data byte 1750 DEX zero? 1760 BNE F1T3 no, continue 1770 LDA #$FC write FC 1780 F1T5 BIT DRA 1790 BVC F1T4 1800 BPL F1T5 1810 STA DATREG 1820 LDA #0 1830 LDX #$10 16 times 00 1840 F1T6 BIT DRA 1850 BVC F1T4 1860 BPL F1T6 1870 STA DATREG 1880 DEX 1890 BNE F1T6 1900 BEQ F1T7 br always 1910 F1T4 JMP F1T8 error 1920 F1T7 LDA #0 1930 LDX #6 write 6 times 00 1940 F1T9 BIT DRA 1950 BVC F1T4 1960 BPL F1T9 1970 STA DATREG 1980 DEX 1990 BNE F1T9 2000 LDX #5 write 5 bytes from address $85 down 2010 F1T10 LDA FDATA,X 2020 F1T11 BIT DRA 2030 BVC F1T4 2040 BPL F1T11 2050 STA DATREG 2060 DEX 2070 BPL F1T10 2080 LDA #0 2090 LDX #$11 write 17 times 00 2100 F1T12 BIT DRA 2110 BVC F1T4 2120 BPL F1T12 2130 STA DATREG 2140 DEX 2150 BNE F1T12 2160 LDX #$83 write sector, including track & sector addr 2170 F1T13 LDA SEKBUF,X 2180 F1T14 BIT DRA 2190 BVC F1T4 2200 BPL F1T14 2210 STA DATREG 2220 DEX 2230 BNE F1T13 2240 INY SKEW table ends at 9 2250 CPY #9 for single density 2260 BNE F1T15 2270 LDY #$0D now the even sectors 2280 F1T15 CPY #$16 ends at 16 2290 BEQ F1T16 2300 LDA SKEWTB,Y otherwise, continue formatting 2310 STA FSNR 2320 LDA #0 write 11 times 00 2330 LDX #$0B 2340 F1T17 BIT DRA 2350 BVC F1T4 2360 BPL F1T17 2370 STA DATREG 2380 DEX 2390 BNE F1T17 2400 JMP F1T7 2410 F1T16 LDA #1 all tracks formatted 2420 LDX #0 wait for controller ready 2430 F1T18 AND FCNTRL 2440 BEQ F1T19 IRQ from controller 2450 BIT DRA 2460 BPL F1T18 2470 STX DATREG continue to write 00 2480 JMP F1T18 2490 F1T19 LDA FCNTRL controller ready 2500 AND #4 lost data? 2510 BNE F1T8 br if error 2520 LDA #0 o.k. 2530 F1T20 STA ERROR set error status 2540 LDA TIM64 reset timer 2550 LDA FCNTRL indicate status 2560 STA CSTAT 2570 RTS done 2580 F1T8 JSR FORCE interrupt command 2590 DEC COUNT another try? 2600 BMI F1T21 br if not 2610 LDA #1 yes, set timer 2620 STA T1024I 2630 JMP F1T try again 2640 F1T21 LDA #$80 indicate error 2650 JMP F1T20 2660 * 2670 * format enhanced density -- command $22 2680 * 2690 DFORM JSR DDF build up a track in enhanced density 2700 JMP FORMVER and format 2710 * 2720 * enhanced density formatting 2730 * 2740 DDF JSR BSEKT build up sector 2750 LDA #0 2760 STA SEKBUF+1 2770 LDA DRA 2780 AND #$DF set to enhanced density 2790 STA DRA 2800 DDF1 BIT FCNTRL 2810 BMI DDF2 IRQ? 2820 BVS DDF2 or DRQ? 2830 BPL DDF3 no, everything fine 2840 DDF2 LDA #$80 indicate error 2850 STA ERROR 2860 RTS 2870 DDF3 JSR SEEK goto track without verify 2880 LDA #2 two tries 2890 STA COUNT 2900 JSR F1TD write one track 2910 LDX #$D2 2920 STX T1024I set timeout 2930 BIT ERROR error? 2940 BPL DDF4 2950 RTS 2960 DDF4 INC TRACK next track 2970 INC FTNR 2980 LDA #$28 all tracks done? 2990 CMP TRACK 3000 BNE DDF1 no, continue 3010 RTS 3020 * 3030 * format a track in enhanced density 3040 * 3050 F1TD LDY #0 3060 LDA SKEWTB,Y to start of SKEW table 3070 STA FSNR first sector number 3080 LDX #$4E write 4E 3090 LDA #$F0 but first 'write track' command 3100 STA FCNTRL 3110 F1TD1 BIT DRA wait for controller ready 3120 BPL F1TD1 3130 STX DATREG 3140 TXA write another 4E 3150 LDX #$D2 timeout value 3160 F1TD2 BIT DRA 3170 BPL F1TD2 3180 STA DATREG 3190 STX T1024I start timer 3200 LDX #$90 write another 144 times 4E 3210 F1TD3 BIT DRA 3220 BVC F1TD4 3230 BPL F1TD3 3240 STA DATREG 3250 DEX 3260 BNE F1TD3 3270 F1TD5 BIT DRA write another 256 times 4E 3280 BVC F1TD4 3290 BPL F1TD5 3300 STA DATREG 3310 DEX 3320 BNE F1TD5 3330 LDA #0 3340 LDX #$0C write 12 times 00 3350 F1TD6 BIT DRA 3360 BVC F1TD4 3370 BPL F1TD6 3380 STA DATREG 3390 DEX 3400 BNE F1TD6 3410 LDA #$F6 3420 LDX #3 write 3 times F6 3430 F1TD7 BIT DRA 3440 BVC F1TD4 3450 BPL F1TD7 3460 STA DATREG 3470 DEX 3480 BNE F1TD7 3490 LDA #$FC write FC 3500 F1TD8 BIT DRA 3510 BVC F1TD4 3520 BPL F1TD8 3530 STA DATREG 3540 LDA #$4E 3550 LDX #$32 write 50 times 4E 3560 F1TD9 BIT DRA 3570 BVC F1TD4 3580 BPL F1TD9 3590 STA DATREG 3600 DEX 3610 BNE F1TD9 3620 BEQ F1TD10 3630 F1TD4 JMP F1TD11 3640 F1TD10 LDA #0 3650 LDX #$0C write 12 times 00 3660 F1TD12 BIT DRA 3670 BVC F1TD4 3680 BPL F1TD12 3690 STA DATREG 3700 DEX 3710 BNE F1TD12 3720 LDA #$F5 3730 LDX #3 write 3 times F5 3740 F1TD13 BIT DRA 3750 BVC F1TD4 3760 BPL F1TD13 3770 STA DATREG 3780 DEX 3790 BNE F1TD13 3800 LDX #5 write 5 bytes from address $85 3810 F1TD14 LDA FDATA,X 3820 F1TD15 BIT DRA 3830 BVC F1TD4 3840 BPL F1TD15 3850 STA DATREG 3860 DEX 3870 BPL F1TD14 3880 LDA #$4E 3890 LDX #$16 write 22 times 4E 3900 F1TD16 BIT DRA 3910 BVC F1TD4 3920 BPL F1TD16 3930 STA DATREG 3940 DEX 3950 BNE F1TD16 3960 LDA #$00 3970 LDX #$0C write 12 times 00 3980 F1TD17 BIT DRA 3990 BVC F1TD4 4000 BPL F1TD17 4010 STA DATREG 4020 DEX 4030 BNE F1TD17 4040 LDA #$F5 4050 LDX #3 write 3 times F5 4060 F1TD18 BIT DRA 4070 BVC F1TD4 4080 BPL F1TD18 4090 STA DATREG 4100 DEX 4110 BNE F1TD18 4120 LDX #$83 write sector + track§or number 4130 F1TD19 LDA SEKBUF,X 4140 F1TD20 BIT DRA 4150 BVC F1TD4 4160 BPL F1TD20 4170 STA DATREG 4180 DEX 4190 BNE F1TD19 4200 INY next sector from table 4210 LDA SKEWTB,Y 4220 BMI F1TD21 end of table? 4230 STA FSNR no 4240 LDA #0 continue formatting 4250 LDX #$11 write 17 times 00 4260 F1TD22 BIT DRA 4270 BVC F1TD11 4280 BPL F1TD22 4290 STA DATREG 4300 DEX 4310 BNE F1TD22 4320 LDA #$4E 4330 LDX #$20 write 32 times 4E 4340 F1TD23 BIT DRA 4350 BVC F1TD11 4360 BPL F1TD23 4370 STA DATREG 4380 DEX 4390 BNE F1TD23 4400 JMP F1TD10 4410 * 4420 F1TD21 LDX #$4E 4430 LDA #1 4440 F1TD24 AND FCNTRL 4450 BEQ F1TD25 4460 BIT DRA 4470 BPL F1TD24 4480 STX DATREG write 4E 4490 JMP F1TD24 4500 F1TD25 LDA FCNTRL 4510 AND #4 lost data? 4520 BNE F1TD11 4530 LDA #0 no 4540 F1TD26 STA ERROR no error 4550 LDA TIM64 reset timer 4560 LDA FCNTRL 4570 STA CSTAT indicate controller status 4580 RTS done 4590 F1TD11 JSR FORCE interrupt command 4600 DEC COUNT another try? 4610 BMI F1TD27 no, formatting error 4620 LDA #1 yes, set timer 4630 STA T1024I 4640 JMP F1TD try again 4650 * 4660 F1TD27 LDA #$80 indicate error 4670 JMP F1TD26 4680 * 4690 * sector skew table 4700 * this table contains the sector numbers in the order 4710 * they are written to the diskette 4720 * 4730 SKEWTB .BYTE 1,3,5,7,9,11,13,15,17,19,21,23,25 4740 .BYTE 2,4,6,8,10,12,14,16,18,20,22,24,26 4750 .BYTE $FF end of table 4760 * 4770 * build up a sector incl. addr info & SYNCBYTES 4780 * 4790 BSEKT JSR MOTON start motor 4800 JSR RESTORE to track 0 4810 LDA #0 4820 STA TRACK start with track 0 4830 LDX #0 clear sector buffer 4840 LDA #$FF 4850 BSEKT1 STA SEKBUF+3,X 4860 INX 4870 BPL BSEKT1 4880 LDA #$FB set SYNCBYTES, address marks etc. 4890 STA RSEKH 4900 LDA #$F7 4910 STA SEKBUF+2 4920 STA FDATA 4930 LDA #0 4940 LDX #4 4950 BSEKT2 STA FDATA,X 4960 DEX 4970 BNE BSEKT2 4980 LDA #$FE 4990 STA FTNR+1 5000 LDA #2 5010 STA T1024I set timer 5020 RTS 5030 * 5040 * read tracks from 39 down to check formatting 5050 * 5060 VERIFO LDA #$27 track 39 is the last one 5070 STA TRACK 5080 LDA DRA 5090 AND #$20 single density? 5100 ASL A 5110 STA SBUF if so, $40 to SBUF 5120 VERIFO1 LDA #0 read until track 0 5130 STA SBUF+1 5140 STA ERROR no error, up to now 5150 LDA #2 two tries 5160 STA COUNT 5170 JSR SEEK goto track 5180 VERIFO2 LDY SBUF+1 5190 BIT SBUF 5200 BVC VERIFO3 single density? 5210 CPY #9 yes, go until sector 9 in SKEW table 5220 BNE VERIFO4 more to do 5230 LDY #$0D otherwise, continue with number 13 5240 STY SBUF+1 the even sector numbers 5250 VERIFO4 CPY #$16 whole table for enhanced density 5260 BEQ VERIFO5 5270 VERIFO3 LDA SKEWTB,Y get sector number 5280 BMI VERIFO5 end of table? 5290 STA SEKTOR put sector number 5300 STA SEKREG also to controller 5310 JSR RDSEKTOR and read sector 5320 BNE VERIFO6 read error? 5330 INC SBUF+1 no, incr. pointer to SKEW table 5340 BPL VERIFO2 br always 5350 VERIFO6 DEC COUNT error, retry? 5360 BEQ VERIFO7 no more retries 5370 JSR RDSEKTOR otherwise, read one more time 5380 BNE VERIFO6 another error? 5390 LDA #2 no, set 2 retries for next sector 5400 STA COUNT 5410 INC SBUF+1 next sector 5420 BPL VERIFO2 br always 5430 VERIFO7 LDA #$80 error 5440 VERIFO8 STA ERROR indicate error status 5450 LDA FCNTRL indicate controller status 5460 STA CSTAT 5470 RTS verify done 5480 VERIFO5 DEC TRACK next track 5490 BPL VERIFO1 until track 0 5500 LDA #0 done, no error 5510 BEQ VERIFO8 5520 * 5530 * motor off, wait, motor on 5540 * 5550 MOTONOF JSR MOTOFF motor off 5560 LDX #$F0 5570 JSR DELAY2 5580 LDX #$6E 5590 JSR DELAY2 5600 JSR TMOTON 5610 RTS 5620 * 5630 * command $23, floppy test, does several tests 5640 * the command byte is followed by the test number, <2,2,3,4,5 5650 * 5660 TEST JSR TMOTON motor on 5670 LDA SEKBUF get test number 5680 CMP #2 test number 2? 5690 BNE TEST1 5700 JSR RESTORE yes, to track 0 5710 LDA #0 5720 STA TRACK mark track 0 5730 LDA SEKBUF+1 second byte after command is sector number 5740 STA SEKTOR mark sector 5750 JSR TSTEPR test step rate for all tracks 5760 BCS TEST2 error? 5770 BCC TESTE no, done & return 'C' 5780 TEST1 BMI TEST3 test number <2? 5790 CMP #3 5800 BNE TEST4 if not 5810 JSR TSTEP yes, make a step 5820 JMP TESTE direction in second byte after command 5830 TEST4 CMP #4 test number 4? 5840 BNE TEST5 if not 5850 JSR TESTE otherwise return 'C' 5860 JMP FPTEST and do floppy test 5870 TEST5 CMP #5 test number 5? 5880 BNE TEST2 no, error 5890 JSR TSEEK SEEK on track 5900 BCC TESTE track number in second byte after command 5910 TEST2 LDA ERROR wrong test number 5920 ORA #$80 or test error 5930 BNE TEST6 br always 5940 TEST3 STA FLAG store test number <2 in FLAG 5950 TESTE LDA ERROR 5960 AND #$7F clear error 5970 TEST6 STA ERROR test done 5980 JMP QUITT return 'C' or 'E' to CPU