NAM XIBEC I/O ROUTINES OPT PAG * 22 APR 82 MICHAEL HOLLEY DATA EQU $8010 STAT EQU $8011 MODE EQU $8011 DATACK EQU $8012 * 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 ORG $7000 ******************************** * 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 XTEMP1 RMB 2 XTEMP2 RMB 2 ORG $7C00 BUFF1 RMB $100 READ BUFFER BUFF2 RMB $100 WRITE BUFFER ORG $7100 * EXTERNAL ENTRY POINTS DREAD JMP READSC READ SECTOR DWRITE JMP WRITES WRITE SECTOR DVERFY JMP RETURN VERIFY LAST SECTOR DRESTR JMP RETURN RESTORE TO TRACK 0000 DRIVE JMP RETURN SELECT DRIVE DCHECK JMP RETURN CHECK DRIVE READY DQUICK JMP RETURN QUICK CHECK DRIVE READY DINIT JMP RETURN INITIALIZATE CONTROLLER DWARM JMP RETURN FINISH WITH CONTROLLER DSEEK JMP RETURN SEEK A SECTOR DCMMD JMP CMMD ISSUE COMMAND TO XIBEC DSENSE JMP REQSEN READ STATUS SENSE RETURN RTS * DUMMY READ CALL LDAB #0 LDAA #0 LDX #BUFF1 **************************************** * READ ONE SECTOR * Entry - (X) = FCB Sector Buffer Address * (A) = Track Number * (B) = Sector Number * Exit (Z) = 0 if error * (B) = WD1797 Error condition * * The sector referenced by the track and sector * number is to be read into the Sector Buffer * area of the indicated FCB * READSC STAA TRACK STAB SECTOR LDAA #8 STAA CMDOP CLR LUN CLR CTRFLD LDAA #1 STAA BLKCNT JSR ISSUE ISSUE READ COMMAND LDAB #0 256 BYTES RDSC2 LDAA STAT WAIT UNTIL REQ BITA #BUSY BEQ RDSC6 ERROR NOT BUSY BITA #REQ BEQ RDSC2 WAIT UNTIL REQ BITA #CD CMMD/DATA BNE RDSC6 ERROR - NO DATA LDAA DATA GET FIRST BYTE OF SECTOR STAA 0,X LDAA #ACKENA AUTO ACK ENABLE STAA MODE RDSC4 LDAA STAT BPL RDSC4 WAIT UNTIL REQ LDAA DATACK GET BYTE, RESET ACK INX STAA 0,X DECB BNE RDSC4 IS SECTOR COMPLETE RDSC6 LDAA STAT BITA #BUSY BEQ RDSC9 RDSC62 TST STAT BPL RDSC62 LDAA DATACK NEXT TO LAST BYTE RDSC64 TST STAT BPL RDSC64 LDAB DATACK LAST BYTE CMPA #00 BEQ RDSC9 LDAB #$08 WD1797 CRC BIT RDSC9 RTS **************************************** * WRITE ONE SECTOR * Entry - (X) = FCB Sector Buffer Address * (A) = Track Number * (B) = Sector Number * Exit (Z) = 0 if error * (B) = WD1797 Error condition * * 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 STAA TRACK STAB SECTOR LDAA #$A STAA CMDOP CLR LUN CLR CTRFLD LDAA #1 STAA BLKCNT JSR ISSUE ISSUE WRITE COMMAND LDAB #0 256 BYTES WRSC2 LDAA 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 LDAA 0,X GET FIRST BYTE OF SECTOR STAA DATA LDAA #ACKENA AUTO ACK ENABLE STAA MODE WRSC4 LDAA STAT BPL WRSC4 WAIT UNTIL REQ INX LDAA 0,X STAA DATACK GET BYTE, RESET ACK DECB BNE WRSC4 IS SECTOR COMPLETE WRSC6 LDAA STAT BITA #BUSY BEQ WRSC9 WRSC62 TST STAT BPL WRSC62 LDAA DATACK NEXT TO LAST BYTE WRSC64 TST STAT BPL WRSC64 LDAB DATACK LAST BYTE CMPA #00 BEQ WRSC9 LDAB #$08 WD1797 CRC BIT WRSC9 RTS **************************************** * ISSUE COMMAND TO XIBEC * * Entry - command in DCB * ISSUE LDAA STAT BITA #BUSY BEQ ISS1 ISS0 CLR MODE IF BUSY THEN RESET LDAA #RESET STAA MODE LDAA #CLMODE STAA MODE ISS1 LDAA DATACK CLEAR REQ MEMORY LDAA #UNIT STAA DATA LDAA #SEL STAA MODE SELECT LINE LOW ISS2 LDAA STAT BITA #BUSY BEQ ISS2 LOOP UNTIL BUSY LOW STX XTEMP2 LDX #CMDOP LDAB #5 NUMBER OF BYTES-1 TO SEND LDAA 0,X STAA DATA FIRST BYTE OF COMMAND LDAA #ACKENA STAA MODE ENABLE AUTO ACK & CLEAR SELECT ISS3 TST STAT WAIT UNTIL ACK BPL ISS3 INX LDAA 0,X STAA DATACK DECB BNE ISS3 LDAA #CLMODE STAA MODE TURNOFF AUTOACK LDX XTEMP2 RTS *************************************** * REQUEST SENSE STATUS REQSEN LDAA #3 OP CODE STAA CMDOP JSR ISSUE ISSUE COMMAND REQS1 LDA A STAT BITA #BUSY BEQ REQS6 BITA #REQ BEQ REQS1 LOOP UNTIL REQ LDX #STBUF LDAB #4 LDAA DATA GET FIRST SENSE BYTE STAA 0,X LDAA #ACKENA AUTO ACK ENABLE STAA MODE REQS3 TST STAT BPL REQS3 WAIT UNTIL REQ LDAA DATACK INX STAA 0,X DECB BNE REQS3 REQS6 JMP RDSC6 *********************************************** * ISSUE COMMAND AND GET COMPLETION BYTES CMMD JSR ISS0 CMMD2 LDA A STAT BITA #BUSY BEQ CMMD7 BITA #REQ BEQ CMMD2 WAIT UNTIL REQ LDAA DATA GET NEXT TO LAST BYTE LDAB #ACKENA STAB MODE CMMD4 TST STAT BPL CMMD4 LDAB DATACK LAST BYTE CMPA #0 BEQ CMMD8 JSR REQSEN CMMD7 SEC BRA CMMD9 CMMD8 CLC CMMD9 RTS **************************************** * TEST DRIVE READY TEST LDAA #$E3 STAA CMDOP CLR LUN CLR CTRFLD JMP CMMD END