|
|
@ -5,6 +5,8 @@ |
|
|
; |
|
|
; |
|
|
; TODO: |
|
|
; TODO: |
|
|
; - IMPLEMENT IDE_INITDEVICE |
|
|
; - IMPLEMENT IDE_INITDEVICE |
|
|
|
|
|
; - HANDLE SECONDARY INTERFACE ON DIDE |
|
|
|
|
|
; - BREAK OUT IDE_SELECT FROM UNITSEL |
|
|
; |
|
|
; |
|
|
; +-----------------------------------------------------------------------+ |
|
|
; +-----------------------------------------------------------------------+ |
|
|
; | CONTROL BLOCK REGISTERS | |
|
|
; | CONTROL BLOCK REGISTERS | |
|
|
@ -353,19 +355,13 @@ IDE_STATUS: |
|
|
; IDE_MEDIA |
|
|
; IDE_MEDIA |
|
|
; |
|
|
; |
|
|
IDE_MEDIA: |
|
|
IDE_MEDIA: |
|
|
CALL IDE_INITDEVICE ; RE-INIT SELECTED UNIT |
|
|
|
|
|
|
|
|
CALL IDE_INITDEV ; RE-INIT SELECTED UNIT |
|
|
LD A,MID_HD ; ASSUME WE ARE OK |
|
|
LD A,MID_HD ; ASSUME WE ARE OK |
|
|
RET Z ; RETURN IF GOOD INIT |
|
|
RET Z ; RETURN IF GOOD INIT |
|
|
LD A,MID_NONE ; SIGNAL NO MEDA |
|
|
LD A,MID_NONE ; SIGNAL NO MEDA |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
RET ; AND RETURN |
|
|
RET ; AND RETURN |
|
|
; |
|
|
; |
|
|
; NEED TO IMPLEMENT BELOW!!!! |
|
|
|
|
|
; |
|
|
|
|
|
IDE_INITDEVICE: |
|
|
|
|
|
XOR A |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
IDE_CAP: |
|
|
IDE_CAP: |
|
|
@ -392,50 +388,6 @@ IDE_GEOM: |
|
|
; FUNCTION SUPPORT ROUTINES |
|
|
; FUNCTION SUPPORT ROUTINES |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; |
|
|
; |
|
|
; SOFT RESET OF ALL DEVICES ON BUS |
|
|
|
|
|
; |
|
|
|
|
|
IDE_RESET: |
|
|
|
|
|
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES |
|
|
|
|
|
OUT (IDE_IO_CTRL),A |
|
|
|
|
|
LD DE,16 ; DELAY ~250US |
|
|
|
|
|
CALL VDELAY |
|
|
|
|
|
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET |
|
|
|
|
|
OUT (IDE_IO_CTRL),A |
|
|
|
|
|
CALL DELAY ; SMALL DELAY |
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
|
|
RET ; RETURN |
|
|
|
|
|
; |
|
|
|
|
|
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT |
|
|
|
|
|
; UNIT IS SPECIFIED IN A |
|
|
|
|
|
; |
|
|
|
|
|
IDE_SELUNIT: |
|
|
|
|
|
LD HL,IDE_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT |
|
|
|
|
|
CP (HL) ; SAME? |
|
|
|
|
|
RET Z ; IF SO, NOTHING MORE TO DO |
|
|
|
|
|
|
|
|
|
|
|
CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) |
|
|
|
|
|
JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT |
|
|
|
|
|
; |
|
|
|
|
|
; NEW UNIT SELECTED, IMPLEMENT IT |
|
|
|
|
|
LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER |
|
|
|
|
|
; |
|
|
|
|
|
#IF (IDEMODE == IDEMODE_DIDE) |
|
|
|
|
|
; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
AND $01 ; LS BIT DETERMINES MASTER/SLAVE |
|
|
|
|
|
LD HL,IDE_DRVSEL |
|
|
|
|
|
CALL ADDHLA |
|
|
|
|
|
LD A,(HL) ; LOAD DRIVE/HEAD VALUE |
|
|
|
|
|
; |
|
|
|
|
|
OUT (IDE_IO_DRVHD),A ; SELECT DRIVE |
|
|
|
|
|
LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER |
|
|
|
|
|
; |
|
|
|
|
|
; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER |
|
|
|
|
|
; |
|
|
|
|
|
XOR A |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; (RE)INITIALIZE DEVICE |
|
|
; (RE)INITIALIZE DEVICE |
|
|
; |
|
|
; |
|
|
IDE_INITDEV: |
|
|
IDE_INITDEV: |
|
|
@ -468,7 +420,7 @@ IDE_INITDEV: |
|
|
RET NZ ; BAIL OUT ON ERROR |
|
|
RET NZ ; BAIL OUT ON ERROR |
|
|
; |
|
|
; |
|
|
LD DE,(DIOBUF) ; POINT TO BUFFER |
|
|
LD DE,(DIOBUF) ; POINT TO BUFFER |
|
|
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING |
|
|
|
|
|
|
|
|
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING |
|
|
; |
|
|
; |
|
|
; GET DEVICE CAPACITY AND SAVE IT |
|
|
; GET DEVICE CAPACITY AND SAVE IT |
|
|
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD |
|
|
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD |
|
|
@ -489,62 +441,6 @@ IDE_INITDEV: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
IDE_PROBE: |
|
|
|
|
|
CALL IDE_SELUNIT ; SELECT UNIT |
|
|
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
|
|
CALL DELAY |
|
|
|
|
|
; |
|
|
|
|
|
; CHECK STATUS |
|
|
|
|
|
IN A,(IDE_IO_STAT) ; GET STATUS |
|
|
|
|
|
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS |
|
|
|
|
|
OR A ; SET FLAGS TO TEST FOR ZERO |
|
|
|
|
|
JR NZ,IDE_PROBE0 ; CONTINUE IF NON-ZERO |
|
|
|
|
|
DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR |
|
|
|
|
|
RET ; AND DONE |
|
|
|
|
|
; |
|
|
|
|
|
IDE_PROBE0: |
|
|
|
|
|
;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR |
|
|
|
|
|
;RET NZ ; ABORT ON TIMEOUT |
|
|
|
|
|
; |
|
|
|
|
|
;; CHECK STATUS |
|
|
|
|
|
;IN A,(IDE_IO_STAT) ; GET STATUS |
|
|
|
|
|
;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS |
|
|
|
|
|
;OR A ; SET FLAGS TO TEST FOR ZERO |
|
|
|
|
|
;JR NZ,IDE_PROBE1 ; CONTINUE IF NON-ZERO |
|
|
|
|
|
;DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR |
|
|
|
|
|
;RET ; AND DONE |
|
|
|
|
|
; |
|
|
|
|
|
IDE_PROBE1: |
|
|
|
|
|
; CHECK SIGNATURE |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_COUNT) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $01 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_SECT) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $01 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_CYLLO) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $00 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_CYLHI) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $00 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
; |
|
|
|
|
|
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS |
|
|
|
|
|
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED |
|
|
|
|
|
LD (HL),IDE_TYPEATA ; SET THE DEVICE TYPE |
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
|
|
RET ; DONE, NOTE THAT A=0 AND Z IS SET |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
IDE_SETFEAT: |
|
|
IDE_SETFEAT: |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
#IF (IDETRACE >= 3) |
|
|
#IF (IDETRACE >= 3) |
|
|
@ -624,18 +520,6 @@ IDE_WRSEC: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
IDE_CHKDEVICE: |
|
|
|
|
|
IDE_DPTR(IDE_STAT) |
|
|
|
|
|
LD A,(HL) |
|
|
|
|
|
OR A |
|
|
|
|
|
RET Z ; RETURN IF ALL IS WELL |
|
|
|
|
|
; |
|
|
|
|
|
; ATTEMPT TO REINITIALIZE HERE??? |
|
|
|
|
|
JP IDE_ERR |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
IDE_SETADDR: |
|
|
IDE_SETADDR: |
|
|
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER |
|
|
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER |
|
|
; IDE_IO_LBA3 HAS ALREADY BEEN SET BY IDE_SELECT |
|
|
; IDE_IO_LBA3 HAS ALREADY BEEN SET BY IDE_SELECT |
|
|
@ -673,7 +557,9 @@ IDE_SETADDR1: |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; |
|
|
|
|
|
|
|
|
;============================================================================= |
|
|
|
|
|
; COMMAND PROCESSING |
|
|
|
|
|
;============================================================================= |
|
|
; |
|
|
; |
|
|
IDE_RUNCMD: |
|
|
IDE_RUNCMD: |
|
|
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY |
|
|
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY |
|
|
@ -709,8 +595,20 @@ IDE_GETBUF: |
|
|
|
|
|
|
|
|
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) |
|
|
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) |
|
|
LD C,IDE_IO_DATA |
|
|
LD C,IDE_IO_DATA |
|
|
INIR |
|
|
|
|
|
INIR |
|
|
|
|
|
|
|
|
; INIR |
|
|
|
|
|
; INIR |
|
|
|
|
|
IDE_GETBUF1: |
|
|
|
|
|
;IN A,(IDE_IO_DATA) |
|
|
|
|
|
;CALL PRTHEXBYTE |
|
|
|
|
|
CALL DELAY |
|
|
|
|
|
INI |
|
|
|
|
|
JR NZ,IDE_GETBUF1 |
|
|
|
|
|
IDE_GETBUF2: |
|
|
|
|
|
;IN A,(IDE_IO_DATA) |
|
|
|
|
|
;CALL PRTHEXBYTE |
|
|
|
|
|
CALL DELAY |
|
|
|
|
|
INI |
|
|
|
|
|
JR NZ,IDE_GETBUF2 |
|
|
#ELSE |
|
|
#ELSE |
|
|
LD C,IDE_IO_DATAHI |
|
|
LD C,IDE_IO_DATAHI |
|
|
IDE_GETBUF1: |
|
|
IDE_GETBUF1: |
|
|
@ -756,6 +654,156 @@ IDE_PUTBUF1: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
|
|
|
IDE_GETRES: |
|
|
|
|
|
IN A,(IDE_IO_STAT) ; GET STATUS |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
AND %00000001 ; ERROR BIT SET? |
|
|
|
|
|
RET Z ; NOPE, RETURN WITH ZF |
|
|
|
|
|
; |
|
|
|
|
|
IN A,(IDE_IO_ERR) ; READ ERROR REGISTER |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
OR $FF ; FORCE NZ TO SIGNAL ERROR |
|
|
|
|
|
RET ; RETURN |
|
|
|
|
|
; |
|
|
|
|
|
;============================================================================= |
|
|
|
|
|
; HARDWARE INTERFACE ROUTINES |
|
|
|
|
|
;============================================================================= |
|
|
|
|
|
; |
|
|
|
|
|
; SOFT RESET OF ALL DEVICES ON BUS |
|
|
|
|
|
; |
|
|
|
|
|
IDE_RESET: |
|
|
|
|
|
; |
|
|
|
|
|
#IF (PLATFORM == PLT_MK4) |
|
|
|
|
|
LD A,$80 ; HIGH BIT OF XAR IS IDE RESET |
|
|
|
|
|
OUT (MK4_XAR),A |
|
|
|
|
|
LD DE,16 ; DELAY ~250US |
|
|
|
|
|
CALL VDELAY |
|
|
|
|
|
XOR A ; CLEAR RESET BIT |
|
|
|
|
|
OUT (MK4_XAR),A |
|
|
|
|
|
#ELSE |
|
|
|
|
|
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES |
|
|
|
|
|
OUT (IDE_IO_CTRL),A |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
LD DE,16 ; DELAY ~250US |
|
|
|
|
|
CALL VDELAY |
|
|
|
|
|
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET |
|
|
|
|
|
OUT (IDE_IO_CTRL),A |
|
|
|
|
|
LD DE,16 ; DELAY ~250US |
|
|
|
|
|
CALL VDELAY |
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
|
|
RET ; RETURN |
|
|
|
|
|
; |
|
|
|
|
|
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT |
|
|
|
|
|
; UNIT IS SPECIFIED IN A |
|
|
|
|
|
; |
|
|
|
|
|
IDE_SELUNIT: |
|
|
|
|
|
; LD HL,IDE_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT |
|
|
|
|
|
; CP (HL) ; SAME? |
|
|
|
|
|
; RET Z ; IF SO, NOTHING MORE TO DO |
|
|
|
|
|
|
|
|
|
|
|
CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) |
|
|
|
|
|
JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT |
|
|
|
|
|
; |
|
|
|
|
|
; NEW UNIT SELECTED, IMPLEMENT IT |
|
|
|
|
|
LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER |
|
|
|
|
|
; |
|
|
|
|
|
#IF (IDEMODE == IDEMODE_DIDE) |
|
|
|
|
|
; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
AND $01 ; LS BIT DETERMINES MASTER/SLAVE |
|
|
|
|
|
LD HL,IDE_DRVSEL |
|
|
|
|
|
CALL ADDHLA |
|
|
|
|
|
LD A,(HL) ; LOAD DRIVE/HEAD VALUE |
|
|
|
|
|
; |
|
|
|
|
|
OUT (IDE_IO_DRVHD),A ; SELECT DRIVE |
|
|
|
|
|
LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER |
|
|
|
|
|
; |
|
|
|
|
|
; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER |
|
|
|
|
|
; |
|
|
|
|
|
XOR A |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
IDE_PROBE: |
|
|
|
|
|
CALL IDE_SELUNIT ; SELECT UNIT |
|
|
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
|
|
; |
|
|
|
|
|
;CALL LDELAY |
|
|
|
|
|
LD DE,$2000 ; DELAY N * 16US (~128MS) |
|
|
|
|
|
CALL VDELAY |
|
|
|
|
|
; |
|
|
|
|
|
;; WAIT FOR READY... |
|
|
|
|
|
;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR |
|
|
|
|
|
;RET NZ ; ABORT ON TIMEOUT |
|
|
|
|
|
; |
|
|
|
|
|
; CHECK STATUS |
|
|
|
|
|
IN A,(IDE_IO_STAT) ; GET STATUS |
|
|
|
|
|
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS |
|
|
|
|
|
OR A ; SET FLAGS TO TEST FOR ZERO |
|
|
|
|
|
JR NZ,IDE_PROBE0 ; CONTINUE IF NON-ZERO |
|
|
|
|
|
DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR |
|
|
|
|
|
RET ; AND DONE |
|
|
|
|
|
; |
|
|
|
|
|
IDE_PROBE0: |
|
|
|
|
|
;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR |
|
|
|
|
|
;RET NZ ; ABORT ON TIMEOUT |
|
|
|
|
|
; |
|
|
|
|
|
;; CHECK STATUS |
|
|
|
|
|
;IN A,(IDE_IO_STAT) ; GET STATUS |
|
|
|
|
|
;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS |
|
|
|
|
|
;OR A ; SET FLAGS TO TEST FOR ZERO |
|
|
|
|
|
;JR NZ,IDE_PROBE1 ; CONTINUE IF NON-ZERO |
|
|
|
|
|
;DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR |
|
|
|
|
|
;RET ; AND DONE |
|
|
|
|
|
; |
|
|
|
|
|
IDE_PROBE1: |
|
|
|
|
|
; CHECK SIGNATURE |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_COUNT) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $01 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_SECT) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $01 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_CYLLO) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $00 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
IN A,(IDE_IO_CYLHI) |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
CP $00 |
|
|
|
|
|
RET NZ |
|
|
|
|
|
; |
|
|
|
|
|
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS |
|
|
|
|
|
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED |
|
|
|
|
|
LD (HL),IDE_TYPEATA ; SET THE DEVICE TYPE |
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
|
|
RET ; DONE, NOTE THAT A=0 AND Z IS SET |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
IDE_CHKDEVICE: |
|
|
|
|
|
IDE_DPTR(IDE_STAT) |
|
|
|
|
|
LD A,(HL) |
|
|
|
|
|
OR A |
|
|
|
|
|
RET Z ; RETURN IF ALL IS WELL |
|
|
|
|
|
; |
|
|
|
|
|
; ATTEMPT TO REINITIALIZE HERE??? |
|
|
|
|
|
JP IDE_ERR |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
IDE_WAITRDY: |
|
|
IDE_WAITRDY: |
|
|
LD B,15 ; ~15 SECOND TIMEOUT? |
|
|
LD B,15 ; ~15 SECOND TIMEOUT? |
|
|
IDE_WAITRDY1: |
|
|
IDE_WAITRDY1: |
|
|
@ -813,26 +861,6 @@ IDE_WAITBSY2: |
|
|
DJNZ IDE_WAITBSY1 |
|
|
DJNZ IDE_WAITBSY1 |
|
|
JP IDE_BSYTO ; EXIT WITH BSYTO ERR |
|
|
JP IDE_BSYTO ; EXIT WITH BSYTO ERR |
|
|
; |
|
|
; |
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
IDE_GETRES: |
|
|
|
|
|
IN A,(IDE_IO_STAT) ; GET STATUS |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
AND %00000001 ; ERROR BIT SET? |
|
|
|
|
|
RET Z ; NOPE, RETURN WITH ZF |
|
|
|
|
|
; |
|
|
|
|
|
IN A,(IDE_IO_ERR) ; READ ERROR REGISTER |
|
|
|
|
|
DCALL PC_SPACE |
|
|
|
|
|
DCALL PRTHEXBYTE |
|
|
|
|
|
OR $FF ; FORCE NZ TO SIGNAL ERROR |
|
|
|
|
|
RET ; RETURN |
|
|
|
|
|
; |
|
|
|
|
|
;============================================================================= |
|
|
|
|
|
; HARDWARE INTERFACE ROUTINES |
|
|
|
|
|
;============================================================================= |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; ERROR HANDLING AND DIAGNOSTICS |
|
|
; ERROR HANDLING AND DIAGNOSTICS |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
@ -940,7 +968,9 @@ IDE_REGDUMP1: |
|
|
IN A,(C) |
|
|
IN A,(C) |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
DEC C |
|
|
DEC C |
|
|
DJNZ IDE_REGDUMP1 |
|
|
|
|
|
|
|
|
DEC B |
|
|
|
|
|
CALL NZ,PC_SPACE |
|
|
|
|
|
JR NZ,IDE_REGDUMP1 |
|
|
CALL PC_RBKT |
|
|
CALL PC_RBKT |
|
|
POP BC |
|
|
POP BC |
|
|
POP AF |
|
|
POP AF |
|
|
@ -1002,9 +1032,10 @@ IDE_STR_NO .TEXT "NO$" |
|
|
IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS |
|
|
IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS |
|
|
IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK |
|
|
IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK |
|
|
; |
|
|
; |
|
|
|
|
|
IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO |
|
|
|
|
|
; |
|
|
; UNIT SPECIFIC DATA STORAGE |
|
|
; UNIT SPECIFIC DATA STORAGE |
|
|
; |
|
|
; |
|
|
IDE_UNIT .DB -1 ; ACTIVE UNIT, INIT TO -1 TO INDICATE NOTHING SELECTED |
|
|
|
|
|
IDE_UDATA .FILL IDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES |
|
|
IDE_UDATA .FILL IDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES |
|
|
IDE_DLEN .EQU $ - IDE_UDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS |
|
|
IDE_DLEN .EQU $ - IDE_UDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS |
|
|
IDE_UDLEN .EQU IDE_DLEN / IDE_UNITCNT ; LENGTH OF PER UNIT DATA |
|
|
IDE_UDLEN .EQU IDE_DLEN / IDE_UNITCNT ; LENGTH OF PER UNIT DATA |
|
|
|