From e43a939f54c87927e78b95f73648324234db0234 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 21 Apr 2023 17:08:18 -0700 Subject: [PATCH] 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. --- Source/HBIOS/ide.asm | 88 ++++++++++++++------------------------ Source/HBIOS/ppide.asm | 97 ++++++++++++++---------------------------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 4 files changed, 68 insertions(+), 121 deletions(-) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index ea823fc4..afd3869e 100644 --- a/Source/HBIOS/ide.asm +++ b/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 diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 9fc40047..271b1d72 100644 --- a/Source/HBIOS/ppide.asm +++ b/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 diff --git a/Source/ver.inc b/Source/ver.inc index 390fc590..d5e9990c 100644 --- a/Source/ver.inc +++ b/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 diff --git a/Source/ver.lib b/Source/ver.lib index f5a6b1f8..845f0f6b 100644 --- a/Source/ver.lib +++ b/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