URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [Flex9/] [f9-dkfdc.asm] - Rev 99
Go to most recent revision | Compare with Previous | Blame | View Log
*** FLEX 9 DISK DRIVERS** FOR SINGLE/DOUBLE SIDED 5" DRIVES ONLY.** USING FD1771.** SIDES MAY BE TREATED AS SEPERATE DISKS.**** BY J.E.KENT 1 JAN 1982**** F.D. CONTROLLER*DRVREG EQU $E014MOTOR EQU %10000000SIDESL EQU %01000000DRIVSL EQU %00000001CMDREG EQU $E018TRKREG EQU $E019SECREG EQU $E01ADATREG EQU $E01B*** FD1771 DISK CONTROLLER INSTRUCTIONS*** TYPE I INSTRUCTIONS:*IREST EQU $00 RESTORE (SEEK TRACK 0)ISEEK EQU $10 SEEK TRACKISTEP EQU $20 STEP ONE TRACK (IN/OUT)ISTIN EQU $40 STEP IN ONE TRACKISTOUT EQU $60 STEP OUT ONE TRACK*** BIT FIELDS FOR TYPE I INSTRUCTIONS*SMR6 EQU $00 6MSEC STEPPING RATESMR12 EQU $01 12 MSEC STEPPING RATESMR20 EQU $02 20 MSECSMR40 EQU $03 40 MSEC*BVERIF EQU $04 VERIFY BIT (1=ON)BHDLD EQU $08 HEAD LOAD (1=LOAD HEAD AT BEGINING)BUPDAT EQU $10 UPDATE TRACK REGISTER (1=TRUE)*** TYPE II INSTRUCTIONS*IREAD EQU $80 READ SECTORIWRITE EQU $A0 WRITE SECTOR*** BIT FIELD FOR TYPE II*BDAMFB EQU $00 $FB DATA ADDRESS MARKBDAMFA EQU $01 $FA DATA ADDREES MARKBDAMF9 EQU $02 $F9 DATA ADDRESS MARKBDAMF8 EQU $03 $F8 DATA ADDRESS MARKBEHLD EQU $04 ENABLE HLD & 10 MSEC DELAY (1=ACTIVE)BBLEN EQU $08 BLOCK LENGTH (1=IBM FORMAT 128 - 1024 BYTES)BMREC EQU $10 MULTIPLE RECORD (0=SINGLE, 1=MULTIPLE)*** TYPE III INSTRUCTIONS*IRDADD EQU $C4 READ ADDRESSIRDTRK EQU $E4 READ TRACKIWRTRK EQU $F4 WRITE TRACK*** BIT FIELD TYPE III (READ TRACK ONLY)*BSYNC EQU $01 SYNCRONIZE FLAG (0=SYNC TO AM)*** TYPE IV NSTRUCTION*IFINTR EQU $D0 FORCE INTERRUPT*** FORCED INTERRUPT BITS (TYPE IV INSTRUCTION)*FI0 EQU $01 NOT READY TO READY TRANSITIONFI1 EQU $02 READY TO NOT READY TRANSITIONFI2 EQU $04 INDEX PULSEFI3 EQU $08 EVERY 10 MSEC*** DISK DRIVER PATCHES*ORG $DE00*** JUMP TABLE TO DISK DRIVERS*READ JMP READSCWRITE JMP WRITSCVERIFY JMP VERIF1RESTOR JMP RESTR1DRIVE JMP DRVSELDRVRDY JMP CHKDRVQUICK JMP CHKDRVCOLDDR JMP INITDRWARMDR JMP WARMD1SEEK JMP SEEK1*** CURRNT DRIVE NUMBER ($DE1E)*CURDRV FCB $00*** HEAD POSITION TABLE ($DE1F)*TRKTBL FCB $00 DRIVE 0FCB $00 DRIVE 1FCB $00 DRIVE 2FCB $00 DRIVE 3*** ??? ($DE23)*FCB 0*** DENSITY TABLE: ($DE24)** HOLDS SECTORS/TRACK FOR DRIVE** 5" SINGLE DENSITY => 10 SECTORS/TRACK*DNSTBL FCB 10,10,10,10 ALL MINIS*** DRIVE & DISK CHARACTERISTICS** BITS 1,0 STEPPING RATES* BIT 2 TRACKS/DISK (0=40 TRACK, 1=80 TRACK)* BIT 3 TRACKS/DRIVE (0=40 TRACK, 1=80 TRACK)*BDVTPI EQU $08BDKTPI EQU $04DDCTBL EQU *FCB BDVTPI+BDKTPI+SMR6FCB BDVTPI+BDKTPI+SMR6FCB SMR40FCB SMR40*** DISK DRIVERS** DRIVER INITIATION*INITDR LDX #CURDRVLDB #5INITD2 CLR ,X+DECBBNE INITD2WARMD1 RTS** READ ONE SECTOR*READSC BSR SEEK1LDA #IREAD+BBLEN+BEHLDREAD2 ORCC #$10* SEI DISABLE INTERRUPTSSTA CMDREGLBSR DLY47LDB #$00RDLOOP LDA CMDREGBITA #$02BNE RDBYTEBITA #$01BNE RDLOOPTFR A,BBRA RDEXIT*RDBYTE LDA DATREGSTA ,X+DECBBNE RDLOOPBSR WAITRDEXIT BITB #$1CANDCC #$EF* CLIRTS*** WAIT UNTIL CONTROLLER READY*WAIT LDB CMDREGBITB #$01BNE WAITRTS*** SEEK1 TRACK AND SECTOR** ACCA = TRACK NUMBER** ACCB = SECTOR NUMBER*SEEK1 STB SECREG SET SECTORCMPB #10 DOUBLE-SIDED ?BHI SEEK2 DOUBLE SIDED, FLIPLDB CURDRV BACK SIDE OF DISK ?CMPB #1 DRIVE 2-3 BACK SIDEBHI SEEK3ANDB #$FF-SIDESL SELECT SIDE 0BRA SEEK4*SEEK2 LDB CURDRV SELECT SIDE 1SEEK3 ANDB #DRIVSLORB #SIDESLSEEK4 STB DRVREG*CMPA TRKREG DIFFERENT TO LAST ?BEQ FOUNDPSHS A SAVE TRACK NO. ON STACK** IF 80 TRACK DRIVE, & 40 TRACK DISK, FIRST SEEK* SHOULD NOT UPDATE TRACK REGISTER NOR VERIFY.*SUBA TRKREG CALC. DIFFERENCETFR A,BPSHS Y*** GET STEPPING RATE FROM TABLE*LDY #DDCTBLLDA CURDRVANDA #$01LDA A,YPULS Y*** CHECK DRIVE AND DISK TYPE*BITA #BDVTPI DRIVE TRACK DENSITY = 48 TPI ?BEQ SEEKVU YES, SKIPBITA #BDKTPI DISK TRACK DENSITY = 96 TPI ?BNE SEEKVU YES, SKIP (DRIVE & DISK MATCH)*** HERE IF 40TRACK DISK IN 80 TRACK DRIVE** USE STEP INSTRUCTIONS TO PREVENT UPDATE OF TRACK REG.*ANDA #$03 LEAVE STEPPING RATE BITSTSTBBPL STEPINNEGBORA #ISTOUTBRA STEPLPSTEPIN ORA #ISTINSTEPLP PSHS BBSR SEEK5PULS BDECBBNE STEPLP*** SEEK TRACK WITH VERIFY & UPDATE*SEEKVU ANDA #$03 RETAIN STEPPING RATEORA #ISEEK+BHDLD ($18)PULS B RESTORE DEST TRACK NO.STB DATREG YES, SEEK1 NEW TRACKLBSR DLY47SEEK5 STA CMDREGLBSR DLY47BSR WAITBITB #$10 CHECK FOR SEEK1 ERRORFOUND JMP DLY47*** WRITE SECTOR TO DISK*WRITSC BSR SEEK1LDA #IWRITE+BBLEN+BEHLD ($AC)WRITE2 ORCC #$10* SEISTA CMDREGLBSR DLY47LDB #$00WRLOOP LDA CMDREGBITA #$02BNE WRBYTEBITA #$01BNE WRLOOPTFR A,BBRA WREXIT*WRBYTE LDA ,X+STA DATREGDECBBNE WRLOOPLBSR WAITWREXIT BITB #$5CANDCC #$EF* CLIRTS*** VERIFY SECTOR WRITTEN*VERIF1 LDA #IREAD+BBLEN+BEHLD ($8C)VERIF2 ORCC #$10* SEISTA CMDREGLBSR DLY47LBSR WAITANDCC #$EF* CLIBITB #$18RTS*** SEEK TRACK ZERO*RESTR1 PSHS XBSR DRVSELLDX #DDCTBLLDA CURDRVANDA #1LDA A,XANDA #$03ORA #IREST+BHDLDSTA CMDREGBSR DLY47LBSR WAITBITB #$D8 CHECK FOR ERRORPULS X,PC*** SELECT DRIVE** IX -> FCB** ACCA = NEW DRIVE NUMBER** SAVE OLD TRACK NUMBER IN TABLE* AND SET UP TRACK FOR NEW DRIVE**DRVSEL LDA 3,XCMPA #3BLS DRSEL1LDB #$0F SET ERROR VALUE* SECORCC #$01RTS** SAVE TRACK POSITION OF PREVIOUS DRIVE*DRSEL1 BSR PNTDRVLDB TRKREGSTB ,X** SELECT NEW DRIVE*DRSEL3 STA CURDRV MAY BE 0 - 3CMPA #1BLS DRSEL4 ONE DIRECTORY ?ANDA #DRIVSL ROUND OFFORA #SIDESL SELECT SIDE 1DRSEL4 STA DRVREG** RESTORE LAST TRACK POSITION FOR THIS DRIVE*BSR PNTDRVLDA ,XSTA TRKREGBSR DLY47BRA OK*** CHECK IF DRIVE READY*CHKDRV LDA 3,XCMPA #3BLS OKLDB #$80* SECORCC #$01RTSOK CLRB* CLCANDCC #$FERTS** POINT TO TRACK TABLE ENTRY FOR THIS DRIVE*PNTDRV LDX #TRKTBLLDB CURDRVANDB #DRIVSLABXRTS*** DELAY ROUTINE*DLY47 LBSR DLY19DLY19 LBSR DLY5USDLY5US RTSEND
Go to most recent revision | Compare with Previous | Blame | View Log
