Browse Source

Clean-up of ATAPI Support

- Improved media handling and error reporting.
pull/351/head v3.3.0-dev.24
Wayne Warthen 3 years ago
parent
commit
8747ec8d02
  1. 138
      Source/HBIOS/ide.asm
  2. 51
      Source/HBIOS/ppide.asm
  3. 2
      Source/ver.inc
  4. 2
      Source/ver.lib

138
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:

51
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)

2
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

2
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

Loading…
Cancel
Save