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