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