mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-07 06:53:13 -06:00
Compare commits
1 Commits
v3.3.0-dev
...
v3.3.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8747ec8d02 |
@@ -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.
|
||||
#IF (IDETRACE >= 3)
|
||||
CALL IDE_REGDUMP
|
||||
#ENDIF
|
||||
;
|
||||
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 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:
|
||||
|
||||
@@ -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.
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_REGDUMP
|
||||
#ENDIF
|
||||
;
|
||||
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 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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user