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&sector 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
