0100 * ATARI 1050 DISK DRIVE OPERATING SYSTEM -- part 5
0110 *
0120 * command $24
0130 * on flag = 0 check rotation time of diskette
0140 * otherwise, check motor speed
0150 *
0160 TTRK201 JSR TMOTON motor on, if needed
0170     LDA #0
0180     STA SEKBUF
0190     STA SEKBUF+1
0200     LDA TSTRNG  move test bytes
0210     STA ALEN    to address length
0220     LDA TSTRNG+1
0230     STA ACRC1   and CRC
0240     LDA TSTRNG+2
0250     STA ACRC2
0260     LDA FLAG
0270     BEQ TTRK2011 check on 0 actual track
0280     CMP #1
0290     BNE TTRK2012
0300     JMP MOTHL   on 1 motor speed
0310 *
0320 TTRK2012 LDA ERROR
0330     ORA #$80    indicate error
0340     STA ERROR
0350     BNE TTRK2013 br always
0360 TTRK2014 LDA ERROR
0370     AND #$7F    indicate no error
0380     STA ERROR
0390 TTRK2013 LDA #$D0 interrupt command
0400     STA FCNTRL
0410     JSR QUITT   return 'C' or 'E'
0420     JMP SNDSEK  return sector with error table
0430 *
0440 TTRK2011 JSR WSONE read sector 1
0450     BCS TTRK2012 br if not present
0460     JSR SPEED   check rotation time
0470     BCS TTRK2012 error
0480     JMP TTRK2014 no error
0490 *
0500 * check motor speed
0510 *
0520 MOTHL LDA #$14  goto track 20
0530     STA TRACK
0540     JSR SEEK
0550     JSR MOTOFF  motor off
0560     LDX #$32
0570     JSR DELAY2  wait until quiet
0580     LDA DRA
0590     AND #$7F    motor on
0600     STA DRA
0610     LDA #$C0    'read address' to controller
0620     STA FCNTRL
0630     LDX #ATRACK destination address for data
0640 MOTHL1 LDA #1
0650     STA TIM1024 set timer
0660 MOTHL2 BIT DRA
0670     BMI MOTHL3  DRQ from controller?
0680     BIT T1024I  timeout?
0690     BPL MOTHL2
0700     INC SEKBUF  incr. time counter
0710     BNE MOTHL1
0720     INC SEKBUF+1
0730     BNE MOTHL1
0740     LDA TIM64   reset timer
0750     JMP TTRK2012 overflow, takes too long
0760 MOTHL4 BIT DRA  DRQ?
0770     BPL MOTHL4
0780 MOTHL3 LDA DATREG read data byte
0790     STA SEKBUF,X and store it
0800     INX 
0810     BPL MOTHL4
0820     LDA #1
0830 MOTHL5 BIT FCNTRL wait for controller ready
0840     BNE MOTHL5
0850     LDA ATRACK
0860     CMP #$14    track 20?
0870     BEQ MOTHL6  br if so
0880 MOTHL7 LDA #$C0 'read address' again, motor not on speed
0890     STA FCNTRL
0900     LDX #ATRACK dest. addr., again
0910     BNE MOTHL2  do it again
0920 *
0930 MOTHL6 LDA FCNTRL
0940     BNE MOTHL7  error, try again
0950 MOTTHL8 BIT T1024I
0960     BPL MOTTHL8 wait for timeout
0970     LDA TIM64   reset timer
0980     JMP TTRK2014 done
0990 *
1000 * wait for sector 1
1010 *
1020 WSONE LDA #1    sector 1
1030     STA SEKREG
1040     LDA DATREG
1050     LDA #$82    READ SECTOR
1060     STA FCNTRL
1070     LDA #$E6    set timeout
1080     JSR TIMEOUT
1090 SWONE1 BIT DRA  wait for DRQ
1100     BVC WSONE2  IRQ, error
1110     BPL SWONE1
1120     LDA TIM64   reset timer
1130     LDA DATREG  get data byte
1140     JSR FORCE   interrupt command
1150     LDA DATREG
1160     CLC         done
1170     RTS 
1180 WSONE2 SEC      error
1190     RTS 
1200 *
1210 * check time of one rotation
1220 *
1230 SPEED LDA #1    sector 1
1240     STA SEKREG
1250     LDA #$82    read
1260     STA FCNTRL
1270     LDY #1
1280     JSR DELAY3  delay
1290 SPEED1 BIT DRA  data?
1300     BMI SPEED2
1310     LDY #$0D    no, delay
1320     JSR DELAY3
1330     NOP 
1340     NOP 
1350     NOP 
1360     NOP 
1370     INC SEKBUF  time count + 1
1380     BNE SPEED1
1390     INC SEKBUF+1
1400     BNE SPEED1
1410     SEC         error, overflow, diskette jams
1420     RTS 
1430 SPEED2 CLC      ok
1440 SPEED3 RTS 
1450 *
1460 * break routine
1470 * fatal errors of floppy comes here
1480 *
1490 BREAK JSR FORCE interrupt command
1500     LDA #$3C
1510     ORA DRB     reset PORT B
1520     STA DRB
1530     JMP TFAIL   motor on/off
1540 *
1550     .BYTE $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA fillers
1560 *
1570 * jump table for commands
1580 * -- R, P, W, S, $21, $22, $23, $24
1590 *
1600 JMPTBL .BYTE  <READ, <WRITE, <VWRITE, <RSTAT
1610     .BYTE  <SFORM, <DFORM, <TEST, <TTRK201
1620 JMPTBH .BYTE  >READ, >WRITE, >VWRITE, >RSTAT
1630     .BYTE  >SFORM, >DFORM, >TEST, >TTRK201
1640     .BYTE $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA fillers
1650 TSTRNG .BYTE $4B,$04,$1A test bytes
1660 *
1670 * vectors
1680 *
1690     .WORD START reset vector
1700     .WORD BREAK
