diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index c7689099..5b944de6 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -1369,12 +1369,13 @@ IDE_PROBE: #ENDIF CALL DELAY ; DELAY ~16US ; -; THE RC2014 SD PICO TAKES A FEW SECONDS TO INITIALIZE. DURING THIS -; TIME IT APPEARS TO RETURN $00. BELOW IS A SPECIAL CASE FOR RC2014 -; TO WAIT FOR THIS DEVICE TO INITIALIZE. WE ONLY DO THIS IF THE -; MASTER DEVICE IS BEING PROBED. WHEN THE SLAVE DEVICE IS -; SELECTED, THE SD PICO WILL ALWAYS RETURN ZERO AND CAUSE AN -; UNNECESSARY DELAY. +; THE RC2014 SD PICO TAKES A FEW SECONDS TO INITIALIZE. ATEMPTING TO +; ACCESS IT DURING THIS TIME WILL FAIL. THE DATA LINES ALL HAVE +; PULL-DOWN RESISTORS, SO WHILE IT IS INITIALIZING, READING ANY +; REGISTER WILL CONSISTENTLY RETURN $00. THE FOLLOWING BIT OF CODE +; WILL SCAN THE IDE REGISTER BLOCK. WHILE ALL REGISTERS REMAIN ZERO, +; WE WAIT (UNTIL TIMEOUT). IN MY TESTING, IT SEEMS VERY UNLIKELY +; THAT ANY OTHER DEVICE WILL RETURN $00 FOR ALL REGISTERS. ; LD A,(IY+IDE_MODE) ; GET MODE BITS CP IDEMODE_RC ; RCBUS? @@ -1394,15 +1395,28 @@ IDE_PROBE: JR NZ,IDE_PROBE0 ; SKIP IF NOT $00 ; #IF (IDETRACE >= 3) - PRTS(" WAIT$") + PRTS(" PICO$") #ENDIF - LD HL,(IDE_TIMEOUT) ; GET CURRENT TIMEOUT - PUSH HL ; SAVE IT - LD HL,IDE_TOPICO ; SLOW TIMEOUT FOR THIS - LD (IDE_TIMEOUT),HL ; SET IT - CALL IDE_WAIT00 ; WAIT FOR $00 TO CLEAR - POP HL ; RECOVER TIMEOUT - LD (IDE_TIMEOUT),HL ; SET IT + LD HL,500 ; 5 SECONDS +IDE_WAIT001: + ;CALL NEWLINE + LD C,(IY+IDE_IOBASE) + LD B,8 ; NUMBER OF REGISTERS TO CHECK +IDE_WAIT002: + IN A,(C) ; GET REGISTER VALUE + ;CALL PC_SPACE + ;CALL PRTHEXBYTE + OR A ; SET FLAGS + JR NZ,IDE_PROBE0 ; IF NOT ZERO, MOVE ON + INC C ; NEXT REGISTER + DJNZ IDE_WAIT002 ; CHECK ALL 8 REGS + LD DE,10000/16 ; .01 SECONDS + CALL VDELAY + DEC HL + LD A,H + OR L + JR NZ,IDE_WAIT001 ; LOOP + ;JP IDE_NOMEDIA ; GIVE UP? ; ; IF WE GET HERE AND THE DRIVE IS STILL INITIALIZING, WE NEED TO ; WAIT UNTIL THE DRIVE IS READY. IN THIS CASE BUSY *WILL* BE HIGH. @@ -1498,28 +1512,22 @@ IDE_INITDEV: PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS #ENDIF ; -; WE NOW USE AN IDENTIFY DEVICE COMMAND TO ENSURE WE HAVE A WORKING -; DEVICE. NO DATA IS RETRIEVED BECAUSE WE HAVE NOT YET ESTABLISHED -; 8/16 BIT I/O MODE. IF THE DEVICE IS ATAPI, IT WILL RETURN A -; COMMAND ABORTED ERROR BY DESIGN. IF THAT HAPPENS, WE GO TO THE -; ATAPI INITIALIZATION AND TRY THAT. IDEALLY, WE WOULD CHECK FOR -; THE PACKET DEVICE SIGNATURE. -; - LD A,IDE_CMD_IDDEV ; IDENTIFY DEVICE CMD - LD (IDE_CMD),A ; SAVE IT - CALL IDE_RUNCMD_ND ; RUN COMMAND - JR NZ,IDE_INITPDEV ; ON ERROR, TRY PACKET DEVICE +#IF (IDETRACE >= 3) + CALL IDE_REGDUMP +#ENDIF ; -; IF THE SLAVE DEVICE IS SELECTED, BUT DOES NOT EXIST, THEN THE MASTER -; DEVICE WILL FORCE THE STATUS BYTE TO BE ZERO. AS SUCH, THE IDENTIFY -; DEVICE COMMAND ABOVE WILL APPEAR TO SUCCEED. AT THIS POINT, WE -; EXPLICITLY CHECK FOR A STATUS OF ZERO. IF SO, WE CONVERT THIS TO -; A NO MEDIA ERROR. +; ON ENTRY, WE HAVE ALREADY CHECKED THAT THE BUSY BIT IS CLEARED AND +; DRDY SHOULD BE SET. IF DRDY IS NOT SET, IF COULD MEAN EITHER A +; NON-EXISTENT SLAVE DEVICE OR AN ATAPI DEVICE. TO AVOID UNNECESSARY +; TIMEOUTS, WE CHECK FOR DRDY. IF IT IS NOT SET, THEN WE ASSUME THIS +; MUST BE AN ATAPI DEVICE AND GO TRY TO DO THE ATAPI INITIALIZATION. +; IF THIS WAS ACTUALLY A NON-EXISTENT SLAVE, THE ATAPI INITIALIZATION +; WILL HANDLE THIS PRETTY WELL. ; CALL IDE_IN .DB IDE_REG_STAT - OR A - JP Z,IDE_NOMEDIA + BIT 6,A ; DRDY? + JR Z,IDE_INITPDEV ; ODD, MIGHT BE ATAPI ; ; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE ; @@ -1539,8 +1547,12 @@ IDE_INITDEV0: ; IDE_INITDEV00: ; + ; WE NOW USE AN IDENTIFY DEVICE COMMAND TO CONFIRM THE + ; DEVICE IS REALLY THERE AND GET SOME ATTRIBUTES. IF THE + ; COMMAND FAILS, IT MAY BE THAT WE HAVE AN ATAPI DEVICE AND + ; SO WE GO TO THE ATAPI INITIALIZATION ON FAILURE. CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND - RET NZ ; BAIL OUT ON ERROR + JR NZ,IDE_INITPDEV ; TRY ATAPI ON FAILURE ; ; DECLARE WE ARE ATA LD A,IDE_TYPEATA ; OTHERWISE TYPE=ATA @@ -1594,6 +1606,12 @@ IDE_INITDEV2: ; (RE)INITIALIZE PACKET DEVICE ; IDE_INITPDEV: +; +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" INITPDEV$") ; LABEL FOR IO ADDRESS +#ENDIF + ; CALL IDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND RET NZ ; BAIL OUT ON ERROR ; @@ -1626,10 +1644,14 @@ IDE_INITPDEV1: CP IDE_STNOMEDIA ; EXPLICIT NO MEDIA RESULT? RET Z ; EXIT REPORTING NO MEDIA CP IDE_STNOTRDY ; BECOMING READY? - JR Z,IDE_INITPDEV1 ; IF SO, NOT AN ERROR, LOOP + JR Z,IDE_INITDEVP1A ; IF SO, NOT AN ERROR, LOOP DEC C ; DEC ERROR LIMIT - RET Z ; BAIL OUT LIMIT EXCEEDED + RET Z ; BAIL OUT, ERR LIMIT EXCEEDED JR IDE_INITPDEV1 ; LOOP +IDE_INITDEVP1A: + LD DE,100000/16 ; WAIT 1/10 SECOND + CALL VDELAY ; DO IT + JR IDE_INITPDEV1 ; AND LOOP ; IDE_INITPDEV2: #IF (IDETRACE >= 3) @@ -1674,21 +1696,21 @@ IDE_INITPDEV2: POP BC ; RECOVER SAVE LOCATION CALL ST32 ; STORE VALUE ; - ; CHECK BLOCK LENGTH. WE CAN'T CURRENTLY HANDLE ANYTHING - ; MORE THAN 512 BYTES. THIS PRECLUDES CD-ROM FOR NOW. + ; CHECK BLOCK LENGTH. WE CURRENTLY ONLY SUPPORT 512 BYTE + ; BLOCKS. CD-ROM DEVICES (WHICH USE 2k BLOCKS) WILL FAIL + ; HERE AS NOT SUPPORTED. LD HL,HB_WRKBUF+4 ; POINT TO BLK SIZE IN RESULT CALL LD32 ; LOAD IT TO DE:HL - LD A,D ; TEST FOR ANYTHING IN - OR E ; ... HIGH WORD - JP NZ,IDE_NOTSUP ; IF SO, BLK SIZE TOO BIG - OR A ; CLEAR CARRY - LD BC,512 ; COMPARE LOW WORD - CALL PC_SPACE - CALL PRTHEXWORDHL - SBC HL,BC ; ... TO 512 - CALL PC_SPACE - CALL PRTHEXWORDHL - JP C,IDE_NOTSUP ; IF OVER, BLK SIZE TOO BIG + ; VALUE IS BIG ENDIAN, SO LH:ED MUST BE EXACTLY 0000:0200 + LD A,L ; CHECK THAT LH + OR H ; ... IS ZERO + JP NZ,IDE_NOTSUP ; IF NOT, FAIL AS NOT SUP + LD A,D ; LOAD D + OR A ; SET FLAGS + JP NZ,IDE_NOTSUP ; IF NOT ZERO, FAIL AS NOT SUP + LD A,E ; LOAD E + CP 2 ; CHECK IT IF IS 2 + JP NZ,IDE_NOTSUP ; IF NOT, FAIL AS NOT SUP ; ; CHECK BLOCK LENGTH. WE CURRENTLY ONLY SUPPORT 512 BYTE ; BLOCKS. CD-ROM DEVICES (WHICH USE 2k BLOCKS) WILL FAIL @@ -1796,26 +1818,6 @@ IDE_WAITBSY2: DJNZ IDE_WAITBSY1 ; ----- JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; 180 ; -; -; -IDE_WAIT00: - LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS - LD B,A ; PUT IN OUTER LOOP VAR -IDE_WAIT001: - LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR -IDE_WAIT002: - ;IN A,(IDE_REG_STAT) ; READ STATUS - CALL IDE_IN - .DB IDE_REG_STAT - OR A ; SET FLAGS - RET NZ ; DONE IF NOT ZERO - DEC DE - LD A,D - OR E - JR NZ,IDE_WAIT002 - DJNZ IDE_WAIT001 - RET ; DONE -; ; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A ; IDE_IN: diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 9d38bacf..f37cac09 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -1533,28 +1533,23 @@ PPIDE_INITDEV: PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS #ENDIF ; -; WE NOW USE AN IDENTIFY DEVICE COMMAND TO ENSURE WE HAVE A WORKING -; DEVICE. NO DATA IS RETRIEVED BECAUSE WE HAVE NOT YET ESTABLISHED -; 8/16 BIT I/O MODE. IF THE DEVICE IS ATAPI, IT WILL RETURN A -; COMMAND ABORTED ERROR BY DESIGN. IF THAT HAPPENS, WE GO TO THE -; ATAPI INITIALIZATION AND TRY THAT. IDEALLY, WE WOULD CHECK FOR -; THE PACKET DEVICE SIGNATURE. -; - LD A,PPIDE_CMD_IDDEV ; IDENTIFY DEVICE CMD - LD (PPIDE_CMD),A ; SAVE IT - CALL PPIDE_RUNCMD_ND ; RUN COMMAND - JR NZ,PPIDE_INITPDEV ; ON ERROR, TRY PACKET DEVICE +#IF (PPIDETRACE >= 3) + CALL PPIDE_REGDUMP +#ENDIF ; -; IF THE SLAVE DEVICE IS SELECTED, BUT DOES NOT EXIST, THEN THE MASTER -; DEVICE WILL FORCE THE STATUS BYTE TO BE ZERO. AS SUCH, THE IDENTIFY -; DEVICE COMMAND ABOVE WILL APPEAR TO SUCCEED. AT THIS POINT, WE -; EXPLICITLY CHECK FOR A STATUS OF ZERO. IF SO, WE CONVERT THIS TO -; A NO MEDIA ERROR. +; ON ENTRY, WE HAVE ALREADY CHECKED THAT THE BUSY BIT IS CLEARED AND +; DRDY SHOULD BE SET. IF DRDY IS NOT SET, IF COULD MEAN EITHER A +; NON-EXISTENT SLAVE DEVICE OR AN ATAPI DEVICE. TO AVOID UNNECESSARY +; TIMEOUTS, WE CHECK FOR DRDY. IF IT IS NOT SET, THEN WE ASSUME THIS +; MUST BE AN ATAPI DEVICE AND GO TRY TO DO THE ATAPI INITIALIZATION. +; IF THIS WAS ACTUALLY A NON-EXISTENT SLAVE, THE ATAPI INITIALIZATION +; WILL HANDLE THIS PRETTY WELL. ; CALL PPIDE_IN .DB PPIDE_REG_STAT - OR A - JP Z,PPIDE_NOMEDIA + BIT 6,A ; DRDY? + JR Z,PPIDE_INITPDEV ; ODD, MIGHT BE ATAPI + ; ; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE ; @@ -1574,8 +1569,12 @@ PPIDE_INITDEV0: ; PPIDE_INITDEV00: ; + ; WE NOW USE AN IDENTIFY DEVICE COMMAND TO CONFIRM THE + ; DEVICE IS REALLY THERE AND GET SOME ATTRIBUTES. IF THE + ; COMMAND FAILS, IT MAY BE THAT WE HAVE AN ATAPI DEVICE AND + ; SO WE GO TO THE ATAPI INITIALIZATION ON FAILURE. CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND - RET NZ ; BAIL OUT ON ERROR + JR NZ,PPIDE_INITPDEV ; TRY ATAPI ON FAILURE ; ; DECLARE WE ARE ATA LD A,PPIDE_TYPEATA ; OTHERWISE TYPE=ATA @@ -1629,6 +1628,12 @@ PPIDE_INITDEV2: ; (RE)INITIALIZE PACKET DEVICE ; PPIDE_INITPDEV: +; +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" INITPDEV$") ; LABEL FOR IO ADDRESS +#ENDIF +; CALL PPIDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND RET NZ ; BAIL OUT ON ERROR ; @@ -1661,10 +1666,14 @@ PPIDE_INITPDEV1: CP PPIDE_STNOMEDIA ; EXPLICIT NO MEDIA RESULT? RET Z ; EXIT REPORTING NO MEDIA CP PPIDE_STNOTRDY ; BECOMING READY? - JR Z,PPIDE_INITPDEV1 ; IF SO, NOT AN ERROR, LOOP + JR Z,PPIDE_INITDEVP1A ; IF SO, NOT AN ERROR, LOOP DEC C ; DEC ERROR LIMIT - RET Z ; BAIL OUT LIMIT EXCEEDED + RET Z ; BAIL OUT, ERR LIMIT EXCEEDED JR PPIDE_INITPDEV1 ; LOOP +PPIDE_INITDEVP1A: + LD DE,100000/16 ; WAIT 1/10 SECOND + CALL VDELAY ; DO IT + JR PPIDE_INITPDEV1 ; AND LOOP ; PPIDE_INITPDEV2: #IF (PPIDETRACE >= 3) diff --git a/Source/ver.inc b/Source/ver.inc index e270861d..de854ae9 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.23" +#DEFINE BIOSVER "3.3.0-dev.24" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 10bbdb8d..47f27fc5 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.23" + db "3.3.0-dev.24" endm