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