Browse Source

Improve IDE Device Detection

Per issue #343, some systems could initially detect a non-existent IDE device which would cause a long time-out.  This should resolve the issue.
pull/351/head v3.3.0-dev.5
Wayne Warthen 3 years ago
parent
commit
e43a939f54
  1. 88
      Source/HBIOS/ide.asm
  2. 97
      Source/HBIOS/ppide.asm
  3. 2
      Source/ver.inc
  4. 2
      Source/ver.lib

88
Source/HBIOS/ide.asm

@ -1111,6 +1111,7 @@ IDE_PROBE:
PRTS(" PROBE$") ; LABEL FOR IO ADDRESS
#ENDIF
;
; SELECT DEVICE (MASTER/SLAVE)
LD A,(IDE_DRVHD)
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
@ -1119,21 +1120,44 @@ IDE_PROBE:
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
CALL DELAY ; DELAY ~16US
;
;LD C,IDE_IO_STAT
;IN A,(C)
; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE
; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1
; IS TO MAINTAIN CONSISTENCY WITH TGHE THE PPIDE DRIVER BECAUSE
; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE
; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE.
;
; $AA -> LBA0
LD A,$AA
CALL IDE_OUT
.DB IDE_REG_LBA0
;
; $55 => LBA1
LD A,$55
CALL IDE_OUT
.DB IDE_REG_LBA1
;
; TEST LBA0 == $AA
CALL IDE_IN
.DB IDE_REG_STAT
.DB IDE_REG_LBA0
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CP $FF
JP Z,IDE_NOMEDIA
CP $78
JP Z,IDE_NOMEDIA
CP $AA
JP NZ,IDE_NOMEDIA
;
; TEST LBA1 == $55
CALL IDE_IN
.DB IDE_REG_LBA1
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CP $55
JP NZ,IDE_NOMEDIA
;
#IF (IDETRACE >= 3)
CALL IDE_REGDUMP
@ -1159,55 +1183,9 @@ IDE_PROBE0:
#ENDIF
OR A ; SET FLAGS TO TEST FOR ZERO
JP Z,IDE_NOMEDIA
;
; CHECK SIGNATURE
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_COUNT)
CALL IDE_IN
.DB IDE_REG_COUNT
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,IDE_NOMEDIA
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_SECT)
CALL IDE_IN
.DB IDE_REG_SECT
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,IDE_NOMEDIA
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_CYLLO)
CALL IDE_IN
.DB IDE_REG_CYLLO
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,IDE_NOMEDIA
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_CYLHI)
CALL IDE_IN
.DB IDE_REG_CYLHI
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,IDE_NOMEDIA
;
IDE_PROBE1:
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS
; ASSUME ATA DEVICE FOR NOW, RECORD TYPE AND RETURN SUCCESS
LD A,IDE_TYPEATA ; TYPE = ATA
LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA
XOR A ; SIGNAL SUCCESS

97
Source/HBIOS/ppide.asm

@ -1127,6 +1127,7 @@ PPIDE_PROBE:
PRTS(" PROBE$") ; LABEL FOR IO ADDRESS
#ENDIF
;
; SELECT DEVICE (MASTER/SLAVE)
LD A,(PPIDE_DRVHD)
;OUT (IDE_IO_DRVHD),A
CALL PPIDE_OUT
@ -1135,30 +1136,44 @@ PPIDE_PROBE:
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
CALL DELAY ; DELAY ~16US
;
; BELOW TESTS FOR EXISTENCE OF AN IDE CONTROLLER ON THE
; PPIDE INTERFACE. WE WRITE A VALUE OF ZERO FIRST SO THAT
; THE PPI BUS HOLD WILL RETURN A VALUE OF ZERO IF THERE IS
; NOTHING CONNECTED TO PPI PORT A. THEN WE READ THE STATUS
; REGISTER. IF AN IDE CONTROLLER IS THERE, IT SHOULD ALWAYS
; RETURN SOMETHING OTHER THAN ZERO. IF AN IDE CONTROLLER IS
; THERE, THEN THE VALUE WRITTEN TO PPI PORT A IS IGNORED
; BECAUSE THE WRITE SIGNAL IS NEVER PULSED.
XOR A
;OUT (PPIDE_IO_DATALO),A
LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO
OUT (C),A
; IN A,(PPIDE_REG_STAT) ; GET STATUS
; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE
; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1
; IS TO MAINTAIN CONSISTENCY WITH TGHE THE PPIDE DRIVER BECAUSE
; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE
; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE.
;
; $AA -> LBA0
LD A,$AA
CALL PPIDE_OUT
.DB PPIDE_REG_LBA0
;
; $55 => LBA1
LD A,$55
CALL PPIDE_OUT
.DB PPIDE_REG_LBA1
;
; TEST LBA0 == $AA
CALL PPIDE_IN
.DB PPIDE_REG_STAT
.DB PPIDE_REG_LBA0
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR A
JP Z,PPIDE_NOMEDIA
CP $AA
JP NZ,PPIDE_NOMEDIA
;
; TEST LBA1 == $55
CALL PPIDE_IN
.DB PPIDE_REG_LBA1
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CP $55
JP NZ,PPIDE_NOMEDIA
;
#IF (PPIDETRACE >= 3)
CALL PPIDE_REGDUMP
@ -1184,55 +1199,9 @@ PPIDE_PROBE0:
#ENDIF
OR A ; SET FLAGS TO TEST FOR ZERO
JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO
;
; CHECK SIGNATURE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_COUNT)
CALL PPIDE_IN
.DB PPIDE_REG_COUNT
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,PPIDE_NOMEDIA
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_SECT)
CALL PPIDE_IN
.DB PPIDE_REG_SECT
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,PPIDE_NOMEDIA
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_CYLLO)
CALL PPIDE_IN
.DB PPIDE_REG_CYLLO
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,PPIDE_NOMEDIA
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_CYLHI)
CALL PPIDE_IN
.DB PPIDE_REG_CYLHI
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,PPIDE_NOMEDIA
;
PPIDE_PROBE1:
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS
; ASSUME ATA DEVICE FOR NOW, RECORD TYPE AND RETURN SUCCESS
LD A,PPIDE_TYPEATA ; TYPE = ATA
LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA
XOR A ; SIGNAL SUCCESS

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 3
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.3.0-dev.4"
#DEFINE BIOSVER "3.3.0-dev.5"
#define rmj RMJ
#define rmn RMN
#define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 3
rup equ 0
rtp equ 0
biosver macro
db "3.3.0-dev.4"
db "3.3.0-dev.5"
endm

Loading…
Cancel
Save