* SK*DOS DISK DRIVERS FOR DC-2 - TYPE CONTROLLERS * (C) 1984 BY PETER A. STARK FOR STAR-K * EQUATES DLATCH EQU $E014 COMREG EQU $E018 STAREG EQU COMREG TRKREG EQU $E019 SECREG EQU $E01A DATREG EQU $E01B ORG $DE00 * DISK DRIVER VECTORS DREAD JMP READ DWRITE JMP WRITE DVERIF JMP VERIFY DREST JMP RESTOR DDRIVE JMP DRIVE DCHK JMP CHKRDY DQUICK JMP QUICK DINIT JMP RTS DWARM JMP RTS DSEEK JMP SEEK LASTDR FCB 3 LAST DRIVE ON SYSTEM STPRAT FCB 3 STEPRATE (DEFAULT TO 30 MS) * DRIVE - SELECT DRIVE SPECIFIED BY FCB+3 DRIVE PSHS A,X,Y LDA 3,X GET DRIVE NUMBER FROM FCB CMPA LASTDR CHECK IT BHI DRIVNG IF DRIVE NUMBER NG LDX #TRTABL POINT TO DRIVE DATA TABLE LDB DRIVNO GET OLD DRIVE NUMBER ABX POINT TO DRIVE'S ENTRY LDB TRKREG LAST TRACK USED STB 0,X SAVE IN TABLE STA DLATCH SWITCH TO NEW DRIVE CMPA DRIVNO SAME AS BEFORE? BEQ SAMDRV YES BIGWAI LEAX -1,X COUNT DOWN FROM ABOUT $DFXX TO.. BNE BIGWAI WAIT FOR CONTROLLER TO SWITCH STA DRIVNO SAVE NEW DRIVE NUMBER LDX #TRTABL POINT TO TABLE LDA A,X GET LAST TRACK ON NEW DRIVE STA TRKREG GIVE TO FDC SAMDRV CLRB MEANS THERE WAS NO ERROR ASRB CLEAR CARRY WITH 1-BYTE INSTR PULS A,X,Y,PC AND RETURN DRIVNG LDB #15 ERROR 15 SEC SET CARRY PULS A,X,Y,PC AND RETURN ON ERROR * CHKRDY - CHECK IF DRIVE SPEC BY FCB IS READY CHKRDY LDB 3,X GET DRIVE NUMBER CMPB LASTDR CHECK FOR LAST DRIVE BHI CHKNG CLRB NO ERROR ASRB CLEAR CARRY WITH 1-BYTE INSTR RTS CHKNG LDB #$80 NOT READY BIT SEC RTS * QUICK - QUICK CHECK QUICK EQU CHKRDY SAME AS CHECK READY * RESTORE - SELECT DRIVE SPEC BY FCB AND RESTORE IT TO 0 RESTOR BSR DRIVE SELECT DRIVE BNE RTS ON ERROR LDB #$08 ADDB STPRAT PLUS STEP RATE BITS STB COMREG RESTORE, LOAD HEAD, SLOW STEP BSR WNBUSY WAIT UNTIL NOT BUSY ANDB #$98 CHECK NR, SK, CRC ERRORS ANDCC #$FE CLEAR CARRY RTS RTS AND RETURN * WAIT - WAIT ROUTINE TO WAIT A WHILE WAIT LBSR WAIT4 WAIT4 LBSR WAIT2 WAIT2 LBSR WAIT1 WAIT1 RTS * WNBUSY - WAIT FOR NOT BUSY WNBUSY BSR WAIT FOR COMMAND TO SETTLE LDB STAREG CHECK STATUS BITB #1 CHECK BUSY FLAG BNE WNBUSY WAIT IF STILL BUSY RTS ELSE RETURN WITH B=STATUS * SEEK - SEEK TO TR-SEC C(D) AND RETURN Z FLAG SEEK PSHS A,X STB SECREG GIVE SECTOR NUMBER TO FDC CMPA TRKREG ALREADY ON DESIRED TRACK? BEQ TRKOK YES, WAIT AND EXIT STA DATREG ELSE GIVE NEW TRACK TO FDC BSR WAIT LDA #$18 ADDA STPRAT ADD STEP RATE STA COMREG SEEK, LOAD, SLOW COMMAND BSR WNBUSY WAIT FOR COMPLETION ANDB #$98 CHECK NR,SK,CRC ERRORS PULS A,X,PC AND RETURN TRKOK BSR WAIT WAIT FOR COMPLETION CLRB IF NO ERROR PULS A,X,PC AND RETURN * READ - READ SECTOR ROUTINE - READ TR-SEC C(D) * INTO C(X) AND RETURN Z ERROR FLAG READ PSHS CC BSR SEEK SEEK IF NEEDED BNE READEX IMM EXIT ON ERROR ORCC #$50 DISABLE IRQ AND FIRQ LDA #$8C STA COMREG READ COMMAND BSR WAIT WAIT FOR FDC TO SETTLE CLRB COUNTER = 256 BYTES RDLOOP LDA STAREG CHECK STATUS BITA #2 DRQ? BNE RDBYTE YES BITA #1 BUSY? BNE RDLOOP YES, SO WAIT TFR A,B MOVE STATUS TO B BRA READEX THEN EXIT RDBYTE LDA DATREG GET DATA BYTE STA 0,X+ SAVE IT IN MEM DECB DECREMENT COUNTER BNE RDLOOP REPEAT UNTIL DONE BSR WNBUSY WAIT FOR NOT BUSY READEX PULS CC RESTORE INTERRUPTS ANDB #$9C NR, RNF, CRC, OR LOST DATA? RTS AND RETURN * WRITE - WRITE SECTOR ROUTINE - WRITE TR-SEC C(D) * FROM C(X) AND RETURN Z ERROR FLAG WRITE PSHS CC BSR SEEK SEEK IF NEEDED BNE WRITEX IMM EXIT ON ERROR ORCC #$50 DISABLE IRQ AND FIRQ LDA #$AC STA COMREG WRITE COMMAND BSR WAIT WAIT FOR FDC TO SETTLE CLRB COUNTER = 256 BYTES WRLOOP LDA STAREG CHECK STATUS BITA #2 DRQ? BNE WRBYTE YES BITA #1 BUSY? BNE WRLOOP YES, SO WAIT TFR A,B MOVE STATUS TO B BRA WRITEX THEN EXIT WRBYTE LDA 0,X+ GET DATA BYTE STA DATREG SAVE IT IN MEM DECB DECREMENT COUNTER BNE WRLOOP REPEAT UNTIL DONE JSR WNBUSY WAIT FOR NOT BUSY WRITEX PULS CC RESTORE INTERRUPTS ANDB #$DC NR, WP, RNF, CRC, OR LOST DATA? RTS AND RETURN * VERIFY - VERIFY TR-SEC JUST WRITTEN VERIFY PSHS CC ORCC #$50 DISABLE IRQ AND FIRQ LDA #$8C STA COMREG READ COMMAND LBSR WNBUSY WAIT FOR NOT BUSY PULS CC RESTORE INTERRUPTS ANDB #$98 NR, RNF, OR CRC (NOT LD!) RTS AND RETURN DRIVNO FCB 0 CURRENT DRIVE NUMBER TRTABL FCB $FF,$FF,$FF,$FF TRACK TABLE