NAM XIBEC I/O ROUTINES OPT PAG * 22 APR 82 MICHAEL HOLLEY * LATEST REVISION 11 SEPT 1982 DATA EQU $E010 STAT EQU $E011 MODE EQU $E011 DATACK EQU $E012 * MODE BITS CLMODE EQU %0000 RESET EQU %0001 SEL EQU %0010 ACK EQU %0100 ACKENA EQU %1000 * STATUS POSITIONS REQ EQU %00000001 MSG EQU %00001000 CD EQU %00010000 BUSY EQU %00100000 IO EQU %01000000 REQMEM EQU %10000000 UNIT EQU 1 XIBEC IS UNIT 1 * CONTROLLLER COMMANDS TSTDRV EQU $00 TEST DRIVE RSCMND EQU $01 RECALIBRATE RQCMND EQU $03 REQUEST SENSE STATUS FMCMND EQU $04 FORMAT DISK CHFMAT EQU $05 CHECK TRACK FORMAT FMATRK EQU $06 FORMAT TRACK FMTBAD EQU $07 FORMAT BAD TRACK RDCMND EQU $08 READ SECTOR WDCMND EQU $0A WRITE SECTOR SKCMND EQU $0B SEEK INTDR EQU $0C INIT DRIVE CHARACTERISTICS RAMDIA EQU $E0 RAM DIAGNOSTIC DRVDIA EQU $E3 DRIVE DIAGNOSTIC CRTDIA EQU $E4 CONTROLLER DIAGNOSTIC * WD ERROR CODES WDRDY EQU $80 NOT READY WDPROT EQU $40 WRITE PROTECT WDRNF EQU $10 RECORD NOT FOUND WDCRC EQU $08 CRC ERROR WDBUSY EQU $01 BUSY PAG * EXTERNAL ENTRY POINTS HREAD JMP READSC READ SECTOR HWRITE JMP WRITES WRITE SECTOR HVERFY JMP VERIFY VERIFY LAST SECTOR HRST JMP RST RESTORE TO TRACK 0000 HDRV JMP DRV SELECT DRIVE HCHECK JMP CHECK CHECK DRIVE READY HQUICK JMP CHECK QUICK CHECK DRIVE READY HINIT JMP RETURN INITIALIZATE CONTROLLER HWARM JMP RETURN FINISH WITH CONTROLLER HSEEK JMP RETURN SEEK A SECTOR HCMMD JMP CMMD ISSUE COMMAND TO XIBEC HSENSE JMP REQSEN READ STATUS SENSE ******************************** * DEVICE CONTROL BLOCK CMDOP RMB 1 COMMAND CLASS & OP CODE LUN RMB 1 DRIVE NUMBER TRACK RMB 1 SECTOR RMB 1 BLKCNT RMB 1 BLOCK COUNT CTRFLD RMB 1 CONTROL FIELD STBUF RMB 6 ERROR STATUS BUFFER RETURN RTS PAG **************************************** * READ ONE SECTOR * Entry - (X) = FCB Sector Buffer Address * (A) = Track Number * (B) = Sector Number * Exit (Z) = 0 if error * (B) = WD1797 Error condition * (X) and (A) may be destroyed * * The sector referenced by the track and sector * number is to be read into the Sector Buffer * area of the indicated FCB * READSC STD TRACK ;PCR LDA #RDCMND CLRB LUN 0 STD CMDOP ;PCR LDA #1 SINGLE SECTOR STD BLKCNT ;PCR LBSR ISSUE ISSUE READ COMMAND LDB #0 256 BYTES RDSC2 LDA STAT WAIT UNTIL REQ BITA #BUSY BEQ RDCSB ERROR NOT BUSY BITA #REQ BEQ RDSC2 WAIT UNTIL REQ BITA #CD CMMD/DATA BNE RDCSB ERROR - NO DATA LDA DATA GET FIRST BYTE OF SECTOR STA 0,X+ LDA #ACKENA AUTO ACK ENABLE STA MODE RDSC4 LDA STAT BPL RDSC4 WAIT UNTIL REQ LDA DATACK GET BYTE, RESET ACK STA 0,X+ DECB BNE RDSC4 IS SECTOR COMPLETE *************************************** * READ COMPLETION STATUS BYTES RDCSB LDA STAT BITA #BUSY BEQ RDCSB8 RDCSB2 TST STAT BPL RDCSB2 LDA DATACK NEXT TO LAST BYTE RDCSB4 TST STAT BPL RDCSB4 LDB DATACK LAST BYTE BNE RDCSB8 SHOULD NEVER HAPPEN CMPA #00 BEQ RDCSB9 RDCSB8 LDB #WDCRC+WDRNF WD1797 CRC & RNF BITS RDCSB9 NOP DELAY BSR DEL28 DEL28 BSR DEL14 DEL14 BSR DEL DEL RTS PAG **************************************** * WRITE ONE SECTOR * Entry - (X) = FCB Sector Buffer Address * (A) = Track Number * (B) = Sector Number * Exit (Z) = 0 if error * (B) = WD1797 Error condition * (X) and (A) may be destroyed * * The contents of the Sector Buffer area of the * indicated FCB is to be written to the sector * referenced by the track and sector number. * WRITES STD TRACK ;PCR LDA #WDCMND CLRB STD CMDOP ;PCR LDA #1 SINGLE SECTOR STD BLKCNT ;PCR LBSR ISSUE ISSUE WRITE COMMAND LDB #0 256 BYTES WRSC2 LDA STAT WAIT UNTIL REQ BITA #BUSY BEQ WRSC6 ERROR NOT BUSY BITA #REQ BEQ WRSC2 WAIT UNTIL REQ BITA #CD CMMD/DATA BNE WRSC6 ERROR - NO DATA LDA 0,X+ GET FIRST BYTE OF SECTOR STA DATA LDA #ACKENA AUTO ACK ENABLE STA MODE WRSC4 LDA STAT BPL WRSC4 WAIT UNTIL REQ LDA 0,X+ STA DATACK GET BYTE, RESET ACK DECB BNE WRSC4 IS SECTOR COMPLETE WRSC6 BRA RDCSB PAG **************************************** * ISSUE COMMAND TO XIBEC * * Entry - command in DCB * ISSUE LDA STAT BEQ ISS1 ISS0 CLR MODE IF BUSY THEN RESET LDA #RESET STA MODE LDA #CLMODE STA MODE ISS1 LDA DATACK CLEAR REQ MEMORY LDA #UNIT STA DATA LDA #SEL STA MODE SELECT LINE LOW ISS2 LDA STAT BITA #BUSY BEQ ISS2 LOOP UNTIL BUSY LOW PSHS X LDX #CMDOP ;PCR LDB #5 NUMBER OF BYTES-1 TO SEND LDA 0,X+ STA DATA FIRST BYTE OF COMMAND LDA #ACKENA STA MODE ENABLE AUTO ACK & CLEAR SELECT ISS3 TST STAT WAIT UNTIL ACK BPL ISS3 LDA 0,X+ STA DATACK DECB BNE ISS3 LDA #CLMODE STA MODE TURNOFF AUTOACK PULS X RTS PAG **************************************** * CHECK DRIVE READY * Entry - (X) = FCB (3,X contains drive number) * Exit - (B) = Error condition * (Z) = 1 if ready * (C) = 0 if ready * (X) & (A) may be destroyed CHECK TST STAT BEQ CHK2 CLR MODE LDA #RESET STA MODE LDA #CLMODE STA MODE LDA DATACK CLR REQ MEM CHK2 TST STAT BNE CMMD7 WILL NOT RESET LDA #TSTDRV CLRB LUN 0 STD CMDOP ;PCR *********************************************** * ISSUE COMMAND AND GET COMPLETION BYTES CMMD LBSR ISS0 CMMD2 LDA A STAT BITA #BUSY BEQ CMMD7 BITA #REQ BEQ CMMD2 WAIT UNTIL REQ LDA DATA GET NEXT TO LAST BYTE LDB #ACKENA STB MODE CMMD4 TST STAT BPL CMMD4 LDB DATACK LAST BYTE CMPA #0 BEQ CMMD8 LBSR REQSEN CMMD7 SEC ERROR BRA CMMD9 CMMD8 CLC OK CMMD9 RTS *************************************** * REQUEST SENSE STATUS REQSEN LDA #RQCMND REQ SENSE COMMAND STA CMDOP ;PCR LBSR ISSUE ISSUE COMMAND REQS1 LDA A STAT BITA #BUSY BEQ REQS6 BITA #REQ BEQ REQS1 LOOP UNTIL REQ LDX #STBUF ;PCR LDB #4 NUMBER OF BYTES-1 TO GET LDA DATA GET FIRST SENSE BYTE STA 0,X+ LDA #ACKENA AUTO ACK ENABLE STA MODE REQS3 TST STAT BPL REQS3 WAIT UNTIL REQ LDA DATACK STA 0,X+ DECB BNE REQS3 REQS6 LBRA RDCSB ************************************* * RESTORE TO TRACK 000 * Entry - (X) = FCB (3,X contains drive number) * Exit (B) = Error condition * (Z) = 1 if no error * (X) & (A) may be destroyed * * A restore operation is to be performed on the * specified drive. * RST CLR B SHOW NO ERROR RTS ***************************************************** * SELECT THE SPECIFIED DRIVE * Entry - (X) = FCB (3,X contains drive number) * Exit - (B) = Error condition * = $0F if non-existant drive * (Z) = 1 if no error * (C) = 0 if no error * (X) & (A) may be destroyed * DRV CLR B SHOW NO ERRORS RTS ****************************************************** * VERIFY * Entry - No entry parameters * Exit - (B) = Error condition * (Z) = 1 if no error * * The sector just written to the disk is to be * verified to determine if there are any CRC errors. * VERIFY CLR B SHOW NO ERRORS RTS END