|
|
|
@ -122,12 +122,6 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) |
|
|
|
; SRST: SOFTWARE RESET |
|
|
|
; ~IEN: INTERRUPT ENABLE |
|
|
|
; |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
#DEFINE DCALL CALL |
|
|
|
#ELSE |
|
|
|
#DEFINE DCALL \; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS |
|
|
|
; |
|
|
|
PPIDE_REG_DATA .EQU PPIDE_CTL_CS1 | $00 ; DATA INPUT/OUTPUT (R/W) |
|
|
|
@ -445,8 +439,10 @@ PPIDE_DETECT: |
|
|
|
XOR A ; VALUE ZERO |
|
|
|
OUT (C),A ; PUSH VALUE TO PORT |
|
|
|
IN A,(C) ; GET PORT VALUE |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
@ -643,14 +639,18 @@ PPIDE_SETFEAT: |
|
|
|
;OUT (PPIDE_REG_DRVHD),A |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_DRVHD |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
POP AF |
|
|
|
;OUT (PPIDE_REG_FEAT),A ; SET THE FEATURE VALUE |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_FEAT |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
LD A,PPIDE_CMD_SETFEAT ; CMD = SETFEAT |
|
|
|
LD (PPIDE_CMD),A ; SAVE IT |
|
|
|
JP PPIDE_RUNCMD ; RUN COMMAND AND EXIT |
|
|
|
@ -666,8 +666,10 @@ PPIDE_IDENTIFY: |
|
|
|
;OUT (PPIDE_REG_DRVHD),A |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_DRVHD |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
LD A,PPIDE_CMD_IDDEV |
|
|
|
LD (PPIDE_CMD),A |
|
|
|
CALL PPIDE_RUNCMD |
|
|
|
@ -687,8 +689,10 @@ PPIDE_RDSEC: |
|
|
|
;OUT (PPIDE_REG_DRVHD),A |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_DRVHD |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD |
|
|
|
LD A,PPIDE_CMD_READ |
|
|
|
LD (PPIDE_CMD),A |
|
|
|
@ -709,8 +713,10 @@ PPIDE_WRSEC: |
|
|
|
;OUT (PPIDE_REG_DRVHD),A |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_DRVHD |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD |
|
|
|
LD A,PPIDE_CMD_WRITE |
|
|
|
LD (PPIDE_CMD),A |
|
|
|
@ -726,26 +732,34 @@ PPIDE_SETADDR: |
|
|
|
; IDE_IO_LBA3 HAS ALREADY BEEN SET |
|
|
|
; HSTLBA2-0 --> IDE_IO_LBA2-0 |
|
|
|
LD A,(IY+PPIDE_LBA+2) |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_LBA2 |
|
|
|
; |
|
|
|
LD A,(IY+PPIDE_LBA+1) |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_LBA1 |
|
|
|
; |
|
|
|
LD A,(IY+PPIDE_LBA+0) |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_LBA0 |
|
|
|
; |
|
|
|
LD A,1 |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_COUNT |
|
|
|
; |
|
|
|
@ -764,8 +778,10 @@ PPIDE_RUNCMD: |
|
|
|
RET NZ ; BAIL OUT ON TIMEOUT |
|
|
|
; |
|
|
|
LD A,(PPIDE_CMD) ; GET THE COMMAND |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
;OUT (PPIDE_REG_CMD),A ; SEND IT (STARTS EXECUTION) |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_CMD |
|
|
|
@ -930,16 +946,20 @@ PPIDE_GETRES: |
|
|
|
;IN A,(PPIDE_REG_STAT) ; READ STATUS |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_STAT |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
AND %00000001 ; ERROR BIT SET? |
|
|
|
RET Z ; NOPE, RETURN WITH ZF |
|
|
|
; |
|
|
|
;IN A,(PPIDE_REG_ERR) ; READ ERROR REGISTER |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_ERR |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
OR $FF ; FORCE NZ TO SIGNAL ERROR |
|
|
|
RET ; RETURN |
|
|
|
; |
|
|
|
@ -1048,8 +1068,10 @@ PPIDE_PROBE: |
|
|
|
;OUT (IDE_IO_DRVHD),A |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_DRVHD |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
CALL DELAY ; DELAY ~16US |
|
|
|
; |
|
|
|
@ -1068,12 +1090,16 @@ PPIDE_PROBE: |
|
|
|
; IN A,(PPIDE_REG_STAT) ; GET STATUS |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_STAT |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
OR A |
|
|
|
JP Z,PPIDE_NOMEDIA |
|
|
|
; |
|
|
|
DCALL PPIDE_REGDUMP |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PPIDE_REGDUMP |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;JR PPIDE_PROBE1 ; *DEBUG* |
|
|
|
; |
|
|
|
@ -1081,44 +1107,64 @@ PPIDE_PROBE0: |
|
|
|
CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR |
|
|
|
JP NZ,PPIDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN |
|
|
|
; |
|
|
|
DCALL PPIDE_REGDUMP |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PPIDE_REGDUMP |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; CHECK STATUS |
|
|
|
; IN A,(PPIDE_REG_STAT) ; GET STATUS |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_STAT |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS |
|
|
|
#ENDIF |
|
|
|
OR A ; SET FLAGS TO TEST FOR ZERO |
|
|
|
JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO |
|
|
|
; |
|
|
|
; CHECK SIGNATURE |
|
|
|
DCALL PC_SPACE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
#ENDIF |
|
|
|
;IN A,(PPIDE_REG_COUNT) |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_COUNT |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CP $01 |
|
|
|
JP NZ,PPIDE_NOMEDIA |
|
|
|
DCALL PC_SPACE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
#ENDIF |
|
|
|
;IN A,(PPIDE_REG_SECT) |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_SECT |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CP $01 |
|
|
|
JP NZ,PPIDE_NOMEDIA |
|
|
|
DCALL PC_SPACE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
#ENDIF |
|
|
|
;IN A,(PPIDE_REG_CYLLO) |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_CYLLO |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CP $00 |
|
|
|
JP NZ,PPIDE_NOMEDIA |
|
|
|
DCALL PC_SPACE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
#ENDIF |
|
|
|
;IN A,(PPIDE_REG_CYLHI) |
|
|
|
CALL PPIDE_IN |
|
|
|
.DB PPIDE_REG_CYLHI |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CP $00 |
|
|
|
JP NZ,PPIDE_NOMEDIA |
|
|
|
; |
|
|
|
@ -1157,7 +1203,9 @@ PPIDE_INITDEV00: |
|
|
|
RET NZ ; BAIL OUT ON ERROR |
|
|
|
; |
|
|
|
LD DE,HB_WRKBUF ; POINT TO BUFFER |
|
|
|
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD (IY+PPIDE_MED),0 ; CLEAR MEDIA FLAGS |
|
|
|
; |
|
|
|
|