NAM FLEX-IO FOR SWTPC 6800 MF-68 OPT PAG PAG * FLEX 2 I/O DRIVERS FOR SWTP 6800 * COMMENTS FROM FLEX 6809 GUIDE * 28 NOV 1981 MICHAEL HOLLEY * 26 JUN 2001 Double Sided * EQUATES DRQ EQU $02 DRQ BIT MASK BUSY EQU $01 BUSY MASK RDMSK EQU $1C READ ERROR MASK VERMSK EQU $18 VERIFY ERROR MASK WTMSK EQU $5C WRITE ERROR MASK RDCMND EQU $8C READ COMMAND WTCMND EQU $AC WRITE COMMAND RSCMND EQU $0B RESTORE COMMAND SKCMND EQU $1B SEEK COMMAND DRVREG EQU $8014 FDC DRIVE SELECT REG COMREG EQU $8018 FDC COMMAND REG TRKREG EQU $8019 FDC TRACK REG SECREG EQU $801A FDC SECTOR REG DATREG EQU $801B FDC DATA REG PRCNT EQU $AC34 SWI FLAG NON ZERO FOR SWI ORG $BE80 JMP READ READ SECTOR JMP WRITE WRITE SECTOR JMP VERIFY VERIFY JMP RESTOR RESTORE JMP DRVSEL DRIVE SELECT JMP CHECK DRIVE READY JMP CHECK QUICK DRIVE READY CURDRV RMB 1 LAST DRIVE RMB 1 XTEMP RMB 2 LSTTRK RMB 1 LAST TRACK ORG $BEA3 INVEC FDB $E1AC INPUT CHARACTER ROUTINE OUTVEC FDB $E1D1 OUTPUT CHARACTER ROUTINE ACIA FDB $8004 BASE OF ACIA TIMER FDB $8012 TIMER BOARD BASE IRQ FDB $A000 IRQ VECTOR SWI FDB $A012 SWI VECTOR MON FDB $E0D0 MONITOR ENTRY ADDRESS PCV FDB $A048 MONITOR PC LOCATION PAG ****************************************** * READ * Entry - (X) = FCB Sector Buffer Address * (A) = Track Number * (B) = Sector Number * The sector referenced by the track and sector * number is to be read into the Sector Buffer * area of the indicated FCB. READ BSR SEEK SET TRACK AND SECTOR LDA A #RDCMND TST PRCNT ARE WE SPOOLING BEQ READ1 SWI READ1 NOP SCALL NUMBER SEI DISABLE INTERRUPTS STA A COMREG ISSUE READ COMMAND JSR DELAY LDA B #00 SET SECTOR LENGTH 256 READ2 LDA A COMREG SET STATUS BIT A #DRQ DATA REG FULL BNE READ3 BRANCH IF DATA PRESENT BIT A #BUSY BNE READ2 LOOP IF BUSY TAB ERROR IF NOT BRA READ4 REPORT ERROR READ3 LDA A DATREG READ SECTOR LOOP STA A 0,X INX DEC B BYTE COUNT (256) BNE READ2 BSR WAIT WAIT UNTIL 1771 IS DONE READ4 BIT B #RDMSK MASK ERRORS NOP CLI ENABLE INTURRUPTS RTS WAIT TST PRCNT ARE WE SPOOLING BEQ WAIT1 SWI * NOP SCALL NUMBER WAIT1 LDA B COMREG GET STATUS BIT B #BUSY BNE WAIT RTS PAG * SEEK THE SPECIFIED TRACK SEEK CMP A TRKREG BEQ SEEK4 TRACK IS CORRECT STA A DATREG CHANGE TRACK JSR DELAY LDA A #SKCMND STA A COMREG ISSUE SEEK COMMAND JSR DELAY PSH B SAVE SECTOR NUMBER BSR WAIT PUL B SEEK4 STA B SECREG SET SECTOR CMP B #10 Check Which Side BHI SIDE1 LDA B CURDRV BRA SEEK2 SIDE1 LDA B CURDRV ORA B #$40 SIDE 1 SEEK2 STA B DRVREG JMP DELAY JUMP AND RETURN ****************************************** * WRITE * Entry - (X) = FCB Sector Buffer Address * (A) = Track Number * (B) = Sector Number * The content of the Sector Buffer area of the * indicated FCB is to be written to the sector * reference by the track and sector number. WRITE BSR SEEK SEEK TO TRACK LDA A #WTCMND TST PRCNT ARE WE SPOOLING BEQ WRITE2 SWI WRITE2 NOP SCALL NUMBER SEI DISABLE INTERRUPTS STA A COMREG ISSUE WRITE COMMAND JSR DELAY LDA B #00 SET SECTOR LENGTH 256 WRITE3 LDA A COMREG GET 1771 STATUS BIT A #DRQ READY FOR DATA BNE WRITE5 SKIP IF READY BIT A #BUSY BNE WRITE3 LOOP IS SO TAB ERROR IF NOT BRA WRITE6 WRITE5 LDA A 0,X GET A DATA BYTE STA A DATREG SEND TO DISK INX DEC B BNE WRITE3 FINISHED? BSR WAIT WAIT TILL 1771 IS FINISHED WRITE6 BIT B #WTMSK MASK ERRORS NOP CLI RTS PAG ****************************************** * VERIFY * Entry - (No parameters) * The sector just written is to be verified to * determine if there are CRC errors. VERIFY LDA A #RDCMND TST PRCNT ARE WE SPOOLING BEQ VERIF2 SWI VERIF2 NOP SCALL NUMBER SEI DISABLE INTERRUPTS STA A COMREG ISSUE VERIFY COMMAND JSR DELAY BSR WAIT NOP CLI BIT B #VERMSK RTS ****************************************** * RESTORE * Entry - (X) = FCB Address * Exit - CC, NE, &B=$B if write protected * CS, NE, &B=$F if no drive * A Restore Operation (also known as a Seek * to Track 00) is to be performed on the * drive whose number is in the FCB. RESTOR STX XTEMP SAVE INDEX BSR DRVSEL DO SELECT LDA A #RSCMND STA A COMREG ISSUE RESTORE BSR DELAY JSR WAIT LDX XTEMP BIT B #$40 MASK FOR ERROR BNE RES1 CLC RTS RES1 LDA B #RSCMND RES2 CLC RTS PAG ****************************************** * DRIVE SELECT * Entry - (X) = FCB Address * The drive whose number is in the FCB is * to be selected DRVSEL LDA A 3,X GET DRIVE NUMBER FROM FCB CMP A #$03 BLS DRV1 ONLY DRIVES 0 TO 3 ALLOWED CLR A DRV1 BSR FNDTRK GET TRACK STORAGE LOCATION LDA B TRKREG STA B 0,X SAVE TRACK NUMBER STA A DRVREG CHANGE DRIVE STA A CURDRV BSR FNDTRK GET TRACK STORAGE LOCATION LDA A 0,X GET TRACK STA A TRKREG CLC BRA DELAY * FIND THE TRACK FOR CURRENT DRIVE FNDTRK LDX #LSTTRK TRACK STORAGE LDA B CURDRV GET LAST USED DRIVE BEQ DRV4 IS IT DRIVE 0 DRV3 INX MOVE TRACK STORAGE POINTER DEC B BNE DRV3 DRV4 RTS DELAY JSR DELAY1 DELAY1 JSR DELAY2 DELAY2 RTS ****************************************** * CHECK DRIVE READY * Entry - (X) = FCB Address * Exit - NE & CS if drive not ready * EQ & CS if drive ready * 2 second delay CHECK LDA A 3,X GET DRIVE NUMBER FROM FCB CMP A #$01 DRIVE 0 OR 1 ONLY BLS RES2 BRANCH IF OK LDA B #$80 ELSE SHOW NOT READY SEC RTS END