* SK*DOS DISK DRIVERS FOR DC-4 - TYPE CONTROLLERS * (C) 1984 BY PETER A. STARK FOR STAR-K * EQUATES DLATCH EQU $E014 * EXPLANATION OF DLATCH OPERATION: * ON WRITE: BITS 0 AND 1 SELECT DRIVE 0-3 * BIT 6 SELECTS SIDE (0=SIDE A) * BIT 7 DISABLES DRIVE SELECT IF 1 * ON READ: BIT 6 SAME AS FDC INTRQ OUTPUT PIN * BIT 7 SAME AS FDC DRQ OUTPUT PIN 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 RESTR1 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 LDB DRIVNO CURRENT DRIVE NUMBER LDX #DENSTE DRIVE DATA TABLE ABX POINT TO DRIVE'S ENTRY IN IT STX DDATA SAVE POINTER FOR LATER CLRB TEMP ASSUME SINGLE DENSITY TSTA CHECK TRACK NUMBER BEQ USESD USE SD ON TRACK 0 LDB 0,X ELSE GET CURRENT ENTRY ASLB MOVE DENSITY BIT TO BIT 1 ANDB #2 KEEP ONLY DENSITY USESD STB DENSTY ASLB ASLB B=0 ON SD, 8 ON DD ADDB #10 B=10 ON SD, 18 ON DD CMPB SECREG COMPARE WITH DESIRED SECTOR BLO SWSIDB USE SIDE B IF >10 (SD) OR 18(DD) CLRB SIDE A BRA SIDEOK SWSIDB LDB #$40 SIDE B SIDEOK ADDB DRIVNO ADD IN DRIVE NUMBER STB DLATCH SELECT DRIVE AND SIDE CMPA TRKREG ALREADY ON DESIRED TRACK? BEQ TRKOK YES, WAIT AND EXIT LDB [DDATA] CHECK DISK PARAMETERS ANDB #2 DOUBLE STEPPING? STB DUBSTE STORE FOR LATER BEQ NODUB1 IF NOT DOUBLE STEPPING ASL TRKREG ELSE FOOL FDC TO DOUBLE-STEP ASLA NODUB1 STA DATREG AND 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 TST DUBSTE DOUBLE-STEPPING? BEQ NODUB2 NO LSR TRKREG YES, FIX UP FDC TRACK REG BSR WNBUSY CHECK FDC BITS ONCE MORE NODUB2 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 RWCOMN GO PREPARE FOR READING ADDA #$8C ADD READ COMMAND TO DENSITY BIT STA COMREG READ COMMAND LBSR WAIT WAIT FOR FDC TO SETTLE TST DENSTY SINGLE OR DOUBLE DENSITY? BNE DDREAD DOUBLE * SINGLE-DENSITY READ 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 SDFINR THEN EXIT RDBYTE LDA DATREG GET DATA BYTE STA 0,X+ SAVE IT IN MEM DECB DECREMENT COUNTER BNE RDLOOP REPEAT UNTIL DONE SDFINR LBSR WNBUSY WAIT FOR NOT BUSY BITB #$10 RNF ERROR? BEQ READEX NO, SOMETHING ELSE? INC [DDATA] YES, TRY NEXT SETTING PSHS B SAVE ERROR CODE JSR RESTR1 FORCE A RESTORE AND THEN RE-SEEK PULS B RESTORE ERROR CODE READEX PULS CC RESTORE INTERRUPTS ANDB #$9C NR, RNF, CRC, OR LOST DATA? RTS AND RETURN * DOUBLE-DENSITY READ DDREAD PSHS DP SAVE DP REGISTER LDA #$E0 TFR A,DP POINT TO I/O PAGE DRLOOP LDA