|
|
|
@ -4,8 +4,8 @@ |
|
|
|
;============================================================================= |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET |
|
|
|
; - FIX SCALER CONSTANT |
|
|
|
; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION |
|
|
|
; |
|
|
|
; NOTES: |
|
|
|
; - WELL KNOWN PPIDE PORT ADDRESSES: |
|
|
|
@ -30,8 +30,8 @@ PPIDE_DIR_WRITE .EQU %10000000 ; IDE BUS DATA OUTPUT MODE |
|
|
|
PPIDE_CTL_DA0 .EQU %00000001 ; DRIVE ADDRESS BUS - BIT 0 (DA0) |
|
|
|
PPIDE_CTL_DA1 .EQU %00000010 ; DRIVE ADDRESS BUS - BIT 1 (DA1) |
|
|
|
PPIDE_CTL_DA2 .EQU %00000100 ; DRIVE ADDRESS BUS - BIT 2 (DA2) |
|
|
|
PPIDE_CTL_CS1FX .EQU %00001000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW, INVERTED) |
|
|
|
PPIDE_CTL_CS3FX .EQU %00010000 ; DRIVE CHIP SELECT 1 (ACTIVE LOW, INVERTED) |
|
|
|
PPIDE_CTL_CS1 .EQU %00001000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW, INVERTED) |
|
|
|
PPIDE_CTL_CS3 .EQU %00010000 ; DRIVE CHIP SELECT 1 (ACTIVE LOW, INVERTED) |
|
|
|
PPIDE_CTL_DIOW .EQU %00100000 ; DRIVE I/O WRITE (ACTIVE LOW, INVERTED) |
|
|
|
PPIDE_CTL_DIOR .EQU %01000000 ; DRIVE I/O READ (ACTIVE LOW, INVERTED) |
|
|
|
PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) |
|
|
|
@ -66,7 +66,7 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) |
|
|
|
; | PPIDE_REG_STAT | 0x07 | R | STATUS REGISTER | |
|
|
|
; | PPIDE_REG_CMD | 0x07 | W | COMMAND REGISTER (EXECUTE) | |
|
|
|
; +-----------------------+-------+-------+-------------------------------+ |
|
|
|
; * LBA0-4 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS |
|
|
|
; * LBA0-3 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS |
|
|
|
; |
|
|
|
; === STATUS REGISTER === |
|
|
|
; |
|
|
|
@ -122,33 +122,31 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) |
|
|
|
; SRST: SOFTWARE RESET |
|
|
|
; ~IEN: INTERRUPT ENABLE |
|
|
|
; |
|
|
|
; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS |
|
|
|
; |
|
|
|
PPIDE_REG_DATA .EQU PPIDE_CTL_CS1FX | $00 ; DATA INPUT/OUTPUT (R/W) |
|
|
|
PPIDE_REG_ERR .EQU PPIDE_CTL_CS1FX | $01 ; ERROR REGISTER (R) |
|
|
|
PPIDE_REG_FEAT .EQU PPIDE_CTL_CS1FX | $01 ; FEATURES REGISTER (W) |
|
|
|
PPIDE_REG_COUNT .EQU PPIDE_CTL_CS1FX | $02 ; SECTOR COUNT REGISTER (R/W) |
|
|
|
PPIDE_REG_SECT .EQU PPIDE_CTL_CS1FX | $03 ; SECTOR NUMBER REGISTER (R/W) |
|
|
|
PPIDE_REG_CYLLO .EQU PPIDE_CTL_CS1FX | $04 ; CYLINDER NUM REGISTER (LSB) (R/W) |
|
|
|
PPIDE_REG_CYLHI .EQU PPIDE_CTL_CS1FX | $05 ; CYLINDER NUM REGISTER (MSB) (R/W) |
|
|
|
PPIDE_REG_DRVHD .EQU PPIDE_CTL_CS1FX | $06 ; DRIVE/HEAD REGISTER (R/W) |
|
|
|
PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1FX | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) |
|
|
|
PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1FX | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) |
|
|
|
PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1FX | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) |
|
|
|
PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1FX | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) |
|
|
|
PPIDE_REG_STAT .EQU PPIDE_CTL_CS1FX | $07 ; STATUS REGISTER (R) |
|
|
|
PPIDE_REG_CMD .EQU PPIDE_CTL_CS1FX | $07 ; COMMAND REGISTER (EXECUTE) (W) |
|
|
|
PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3FX | $06 ; ALTERNATE STATUS REGISTER (R) |
|
|
|
PPIDE_REG_CTRL .EQU PPIDE_CTL_CS3FX | $06 ; DEVICE CONTROL REGISTER (W) |
|
|
|
PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) |
|
|
|
; |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
#DEFINE DCALL CALL |
|
|
|
#ELSE |
|
|
|
#DEFINE DCALL \; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPIDE_DEVCNT .EQU PPIDECNT * 2 ; ASSUME ONLY PRIMARY INTERFACE |
|
|
|
; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS |
|
|
|
; |
|
|
|
PPIDE_REG_DATA .EQU PPIDE_CTL_CS1 | $00 ; DATA INPUT/OUTPUT (R/W) |
|
|
|
PPIDE_REG_ERR .EQU PPIDE_CTL_CS1 | $01 ; ERROR REGISTER (R) |
|
|
|
PPIDE_REG_FEAT .EQU PPIDE_CTL_CS1 | $01 ; FEATURES REGISTER (W) |
|
|
|
PPIDE_REG_COUNT .EQU PPIDE_CTL_CS1 | $02 ; SECTOR COUNT REGISTER (R/W) |
|
|
|
PPIDE_REG_SECT .EQU PPIDE_CTL_CS1 | $03 ; SECTOR NUMBER REGISTER (R/W) |
|
|
|
PPIDE_REG_CYLLO .EQU PPIDE_CTL_CS1 | $04 ; CYLINDER NUM REGISTER (LSB) (R/W) |
|
|
|
PPIDE_REG_CYLHI .EQU PPIDE_CTL_CS1 | $05 ; CYLINDER NUM REGISTER (MSB) (R/W) |
|
|
|
PPIDE_REG_DRVHD .EQU PPIDE_CTL_CS1 | $06 ; DRIVE/HEAD REGISTER (R/W) |
|
|
|
PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1 | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) |
|
|
|
PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1 | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) |
|
|
|
PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1 | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) |
|
|
|
PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1 | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) |
|
|
|
PPIDE_REG_STAT .EQU PPIDE_CTL_CS1 | $07 ; STATUS REGISTER (R) |
|
|
|
PPIDE_REG_CMD .EQU PPIDE_CTL_CS1 | $07 ; COMMAND REGISTER (EXECUTE) (W) |
|
|
|
PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3 | $06 ; ALTERNATE STATUS REGISTER (R) |
|
|
|
PPIDE_REG_CTRL .EQU PPIDE_CTL_CS3 | $06 ; DEVICE CONTROL REGISTER (W) |
|
|
|
PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3 | $07 ; DRIVE ADDRESS REGISTER (R) |
|
|
|
; |
|
|
|
; COMMAND BYTES |
|
|
|
; |
|
|
|
@ -202,7 +200,7 @@ PPIDE_LBA .EQU 9 ; OFFSET OF LBA (DWORD) |
|
|
|
PPIDE_DATALO .EQU 13 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) |
|
|
|
PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) |
|
|
|
PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) |
|
|
|
PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) |
|
|
|
PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) (WORD) |
|
|
|
; |
|
|
|
PPIDE_ACC_MAS .EQU %00000001 ; UNIT IS MASTER (ELSE SLAVE) |
|
|
|
PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) |
|
|
|
@ -210,6 +208,8 @@ PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) |
|
|
|
PPIDE_MED_CF .EQU %00000001 ; MEDIA IS CF CARD |
|
|
|
PPIDE_MED_LBA .EQU %00000010 ; MEDIA HAS LBA CAPABILITY |
|
|
|
; |
|
|
|
PPIDE_DEVCNT .EQU PPIDECNT * 2 |
|
|
|
; |
|
|
|
PPIDE_CFGTBL: |
|
|
|
; |
|
|
|
#IF (PPIDECNT >= 1) |
|
|
|
@ -722,7 +722,6 @@ PPIDE_WRSEC: |
|
|
|
; |
|
|
|
; |
|
|
|
PPIDE_SETADDR: |
|
|
|
; XXX |
|
|
|
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER |
|
|
|
; IDE_IO_LBA3 HAS ALREADY BEEN SET |
|
|
|
; HSTLBA2-0 --> IDE_IO_LBA2-0 |
|
|
|
@ -731,19 +730,19 @@ PPIDE_SETADDR: |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_LBA2 |
|
|
|
|
|
|
|
; |
|
|
|
LD A,(IY+PPIDE_LBA+1) |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_LBA1 |
|
|
|
|
|
|
|
; |
|
|
|
LD A,(IY+PPIDE_LBA+0) |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
CALL PPIDE_OUT |
|
|
|
.DB PPIDE_REG_LBA0 |
|
|
|
|
|
|
|
; |
|
|
|
LD A,1 |
|
|
|
DCALL PC_SPACE |
|
|
|
DCALL PRTHEXBYTE |
|
|
|
@ -1000,7 +999,9 @@ PPIDE_RESET: |
|
|
|
CALL PPIDE_GOPARTNER ; POINT TO SLAVE |
|
|
|
CALL PPIDE_INITUNIT ; INIT PARTNER UNIT |
|
|
|
POP IY ; RECOVER ORIG CFG PTR |
|
|
|
RET |
|
|
|
; |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; AND DONE |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
@ -1015,9 +1016,7 @@ PPIDE_INITUNIT: |
|
|
|
RET NZ ; JUST RETURN IF NOTHING THERE |
|
|
|
|
|
|
|
CALL PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE |
|
|
|
RET NZ ; IF FAILED, ALL DONE |
|
|
|
|
|
|
|
RET |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT |
|
|
|
; |
|
|
|
@ -1026,15 +1025,15 @@ PPIDE_SELUNIT: |
|
|
|
CALL PPIDE_PRTPREFIX |
|
|
|
PRTS(" SELUNIT$") |
|
|
|
#ENDIF |
|
|
|
BIT 0,(IY+PPIDE_ACC) ; MASTER? |
|
|
|
JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE |
|
|
|
LD A,PPIDE_DRVMASTER ; MASTER |
|
|
|
JR PPIDE_SELUNIT2 |
|
|
|
PPIDE_SELUNIT1: |
|
|
|
LD A,PPIDE_DRVSLAVE ; SLAVE |
|
|
|
PPIDE_SELUNIT2: |
|
|
|
LD (PPIDE_DRVHD),A ; SAVE IT |
|
|
|
XOR A ; SUCCESS |
|
|
|
BIT 0,(IY+PPIDE_ACC) ; MASTER? |
|
|
|
JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE |
|
|
|
LD A,PPIDE_DRVMASTER ; MASTER |
|
|
|
JR PPIDE_SELUNIT2 |
|
|
|
PPIDE_SELUNIT1: |
|
|
|
LD A,PPIDE_DRVSLAVE ; SLAVE |
|
|
|
PPIDE_SELUNIT2: |
|
|
|
LD (PPIDE_DRVHD),A ; SAVE IT |
|
|
|
XOR A ; SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
|