|
|
@ -173,7 +173,7 @@ PPIDE1IO .EQU 20H |
|
|
PPIDE2IO .EQU 00H |
|
|
PPIDE2IO .EQU 00H |
|
|
PPIDE3IO .EQU 00H |
|
|
PPIDE3IO .EQU 00H |
|
|
; |
|
|
; |
|
|
PPIDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE |
|
|
|
|
|
|
|
|
PPIDE_DEVCNT .EQU 4 ; ASSUME ONLY PRIMARY INTERFACE |
|
|
; |
|
|
; |
|
|
; COMMAND BYTES |
|
|
; COMMAND BYTES |
|
|
; |
|
|
; |
|
|
@ -213,7 +213,7 @@ PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE |
|
|
; |
|
|
; |
|
|
; PPIDE DEVICE CONFIGURATION |
|
|
; PPIDE DEVICE CONFIGURATION |
|
|
; |
|
|
; |
|
|
PPIDE_CFGSIZ .EQU 16 ; SIZE OF CFG TBL ENTRIES |
|
|
|
|
|
|
|
|
PPIDE_CFGSIZ .EQU 15 ; SIZE OF CFG TBL ENTRIES |
|
|
; |
|
|
; |
|
|
; PER DEVICE DATA OFFSETS |
|
|
; PER DEVICE DATA OFFSETS |
|
|
; |
|
|
; |
|
|
@ -223,11 +223,9 @@ PPIDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) |
|
|
PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) |
|
|
PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) |
|
|
PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) |
|
|
PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) |
|
|
PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) |
|
|
PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) |
|
|
PPIDE_PORT .EQU 12 ; PORT ADDRESS OF THIS DEVICE (BYTE) |
|
|
|
|
|
PPIDE_DATALO .EQU 12 ; IDE DATA BUS LSB (8255 PORT A) (BYTE) |
|
|
|
|
|
PPIDE_DATAHI .EQU 13 ; IDE DATA BUS MSB (8255 PORT B)(BYTE) |
|
|
|
|
|
PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) |
|
|
|
|
|
PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) |
|
|
|
|
|
|
|
|
PPIDE_DATALO .EQU 12 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) |
|
|
|
|
|
PPIDE_CTL .EQU 13 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) |
|
|
|
|
|
PPIDE_PPI .EQU 14 ; 8255 CONTROL PORT(BYTE) |
|
|
; |
|
|
; |
|
|
PPIDE_CFGTBL: |
|
|
PPIDE_CFGTBL: |
|
|
; DEVICE 0, PRIMARY MASTER |
|
|
; DEVICE 0, PRIMARY MASTER |
|
|
@ -237,10 +235,9 @@ PPIDE_CFGTBL: |
|
|
.DB 0 ; FLAGS BYTE |
|
|
.DB 0 ; FLAGS BYTE |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
.DW 0,0 ; CURRENT LBA |
|
|
.DW 0,0 ; CURRENT LBA |
|
|
.DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT |
|
|
|
|
|
.DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) |
|
|
|
|
|
.DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) |
|
|
|
|
|
.DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT |
|
|
|
|
|
|
|
|
.DB PPIDE0IO ; DATALO |
|
|
|
|
|
.DB PPIDE0IO+2 ; CTL |
|
|
|
|
|
.DB PPIDE0IO+3 ; PPI |
|
|
; DEVICE 1, PRIMARY SLAVE |
|
|
; DEVICE 1, PRIMARY SLAVE |
|
|
.DB 1 ; DRIVER DEVICE NUMBER |
|
|
.DB 1 ; DRIVER DEVICE NUMBER |
|
|
.DB 0 ; DEVICE STATUS |
|
|
.DB 0 ; DEVICE STATUS |
|
|
@ -248,10 +245,31 @@ PPIDE_CFGTBL: |
|
|
.DB 0 ; FLAGS BYTE |
|
|
.DB 0 ; FLAGS BYTE |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
.DW 0,0 ; CURRENT LBA |
|
|
.DW 0,0 ; CURRENT LBA |
|
|
.DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT |
|
|
|
|
|
.DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) |
|
|
|
|
|
.DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) |
|
|
|
|
|
.DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT |
|
|
|
|
|
|
|
|
.DB PPIDE0IO ; DATALO |
|
|
|
|
|
.DB PPIDE0IO+2 ; CTL |
|
|
|
|
|
.DB PPIDE0IO+3 ; PPI |
|
|
|
|
|
#IF (PPIDE_DEVCNT >= 2) |
|
|
|
|
|
; DEVICE 2, PRIMARY MASTER |
|
|
|
|
|
.DB 2 ; DRIVER DEVICE NUMBER |
|
|
|
|
|
.DB 0 ; DEVICE STATUS |
|
|
|
|
|
.DB 0 ; DEVICE TYPE |
|
|
|
|
|
.DB 0 ; FLAGS BYTE |
|
|
|
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
|
|
|
.DW 0,0 ; CURRENT LBA |
|
|
|
|
|
.DB PPIDE1IO ; DATALO |
|
|
|
|
|
.DB PPIDE1IO+2 ; CTL |
|
|
|
|
|
.DB PPIDE1IO+3 ; PPI |
|
|
|
|
|
; DEVICE 3, PRIMARY SLAVE |
|
|
|
|
|
.DB 3 ; DRIVER DEVICE NUMBER |
|
|
|
|
|
.DB 0 ; DEVICE STATUS |
|
|
|
|
|
.DB 0 ; DEVICE TYPE |
|
|
|
|
|
.DB 0 ; FLAGS BYTE |
|
|
|
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
|
|
|
.DW 0,0 ; CURRENT LBA |
|
|
|
|
|
.DB PPIDE1IO ; DATALO |
|
|
|
|
|
.DB PPIDE1IO+2 ; CTL |
|
|
|
|
|
.DB PPIDE1IO+3 ; PPI |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) |
|
|
#IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) |
|
|
.ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" |
|
|
.ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" |
|
|
@ -286,15 +304,11 @@ PPIDE_INIT: |
|
|
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ |
|
|
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ |
|
|
CALL MULT8X16 ; HL := DE * A |
|
|
CALL MULT8X16 ; HL := DE * A |
|
|
LD (PPIDE_TOSCALER),HL ; SAVE IT |
|
|
LD (PPIDE_TOSCALER),HL ; SAVE IT |
|
|
; |
|
|
|
|
|
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS |
|
|
|
|
|
LD IY,PPIDE_CFGTBL |
|
|
|
|
|
LD A,PPIDE_IO_BASE |
|
|
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
; |
|
|
; |
|
|
#IF (PPIDE8BIT) |
|
|
#IF (PPIDE8BIT) |
|
|
PRTS(" 8BIT$") |
|
|
PRTS(" 8BIT$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
|
|
|
LD IY,PPIDE_CFGTBL |
|
|
CALL PPIDE_DETECT ; CHECK FOR HARDWARE |
|
|
CALL PPIDE_DETECT ; CHECK FOR HARDWARE |
|
|
JR Z,PPIDE_INIT00 ; CONTINUE IF PRESENT |
|
|
JR Z,PPIDE_INIT00 ; CONTINUE IF PRESENT |
|
|
; |
|
|
; |
|
|
@ -347,6 +361,11 @@ PPIDE_INIT2: |
|
|
; |
|
|
; |
|
|
CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
; |
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS |
|
|
|
|
|
LD A,(IY+PPIDE_DATALO) |
|
|
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
; |
|
|
#IF (PPIDE8BIT) |
|
|
#IF (PPIDE8BIT) |
|
|
PRTS(" 8BIT$") |
|
|
PRTS(" 8BIT$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -392,12 +411,17 @@ PPIDE_DETECT: |
|
|
LD C,(IY+PPIDE_PPI) |
|
|
LD C,(IY+PPIDE_PPI) |
|
|
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE |
|
|
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE |
|
|
OUT (C),A ; OUTPUT TO CONTROL WORD |
|
|
OUT (C),A ; OUTPUT TO CONTROL WORD |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
LD C,(IY+PPIDE_DATALO) ; PPI PORT A |
|
|
LD C,(IY+PPIDE_DATALO) ; PPI PORT A |
|
|
|
|
|
; |
|
|
|
|
|
#IF USEZ80OPT |
|
|
|
|
|
;; OUT (C),0 |
|
|
|
|
|
.DB $ED,$71 |
|
|
|
|
|
#ELSE |
|
|
XOR A ; VALUE ZERO |
|
|
XOR A ; VALUE ZERO |
|
|
OUT (C),A ; PUSH VALUE TO PORT |
|
|
OUT (C),A ; PUSH VALUE TO PORT |
|
|
;; OUT (C),0 |
|
|
|
|
|
;; .DB $ED,$71 |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
IN A,(C) ; GET PORT VALUE |
|
|
IN A,(C) ; GET PORT VALUE |
|
|
DCALL PC_SPACE |
|
|
DCALL PC_SPACE |
|
|
DCALL PRTHEXBYTE |
|
|
DCALL PRTHEXBYTE |
|
|
@ -908,10 +932,13 @@ PPIDE_RESET: |
|
|
LD DE,20 |
|
|
LD DE,20 |
|
|
CALL VDELAY |
|
|
CALL VDELAY |
|
|
; |
|
|
; |
|
|
XOR A |
|
|
|
|
|
OUT (C),A |
|
|
|
|
|
|
|
|
#IF USEZ80OPT |
|
|
;; OUT (C),0 |
|
|
;; OUT (C),0 |
|
|
;; .DB $ED,$71 |
|
|
|
|
|
|
|
|
.DB $ED,$71 |
|
|
|
|
|
#ELSE |
|
|
|
|
|
XOR A ; VALUE ZERO |
|
|
|
|
|
OUT (C),A ; PUSH VALUE TO PORT |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD DE,20 |
|
|
LD DE,20 |
|
|
CALL VDELAY |
|
|
CALL VDELAY |
|
|
@ -1018,10 +1045,13 @@ PPIDE_PROBE: |
|
|
; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. |
|
|
; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. |
|
|
; |
|
|
; |
|
|
LD C,(IY+PPIDE_DATALO) |
|
|
LD C,(IY+PPIDE_DATALO) |
|
|
XOR A |
|
|
|
|
|
OUT (C),A |
|
|
|
|
|
|
|
|
#IF USEZ80OPT |
|
|
;; OUT (C),0 |
|
|
;; OUT (C),0 |
|
|
;; .DB $ED,$71 |
|
|
|
|
|
|
|
|
.DB $ED,$71 |
|
|
|
|
|
#ELSE |
|
|
|
|
|
XOR A ; VALUE ZERO |
|
|
|
|
|
OUT (C),A ; PUSH VALUE TO PORT |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
CALL PPIDE_IN |
|
|
CALL PPIDE_IN |
|
|
.DB PPIDE_REG_STAT |
|
|
.DB PPIDE_REG_STAT |
|
|
@ -1240,7 +1270,7 @@ PPIDE_WAITBSY1: |
|
|
LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR |
|
|
LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR |
|
|
PPIDE_WAITBSY2: |
|
|
PPIDE_WAITBSY2: |
|
|
;IN A,(PPIDE_REG_STAT) ; READ STATUS |
|
|
;IN A,(PPIDE_REG_STAT) ; READ STATUS |
|
|
CALL PPIDE_IN ; 17TS + 170TS |
|
|
|
|
|
|
|
|
CALL PPIDE_IN ; 17TS + 204TS |
|
|
.DB PPIDE_REG_STAT ; 0TS |
|
|
.DB PPIDE_REG_STAT ; 0TS |
|
|
LD C,A ; SAVE IT ; 4TS |
|
|
LD C,A ; SAVE IT ; 4TS |
|
|
AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS |
|
|
AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS |
|
|
@ -1250,65 +1280,60 @@ PPIDE_WAITBSY2: |
|
|
OR E ; 4TS |
|
|
OR E ; 4TS |
|
|
JR NZ,PPIDE_WAITBSY2 ; 12TS |
|
|
JR NZ,PPIDE_WAITBSY2 ; 12TS |
|
|
DJNZ PPIDE_WAITBSY1 ; ----- |
|
|
DJNZ PPIDE_WAITBSY1 ; ----- |
|
|
JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 229TS |
|
|
|
|
|
; |
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 246TS |
|
|
; |
|
|
; |
|
|
|
|
|
; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A |
|
|
|
|
|
; |
|
|
PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE |
|
|
PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE |
|
|
|
|
|
EX (SP),HL ; GET PARM POINTER ; 19TS |
|
|
PUSH BC ; SAVE INCOMING BC ; 11TS |
|
|
PUSH BC ; SAVE INCOMING BC ; 11TS |
|
|
LD C,(IY+PPIDE_PPI) ; ; 19TS |
|
|
LD C,(IY+PPIDE_PPI) ; ; 19TS |
|
|
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS |
|
|
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS |
|
|
OUT (C),A ; DO IT ; 12TS |
|
|
OUT (C),A ; DO IT ; 12TS |
|
|
POP BC ; RECOVER INCOMING BC ; 10TS |
|
|
|
|
|
EX (SP),HL ; GET PARM POINTER ; 19TS |
|
|
|
|
|
; |
|
|
; |
|
|
PUSH BC ; SAVE INCOMING BC ; 11TS |
|
|
|
|
|
LD B,(HL) ; GET CTL PORT VALUE ; 7TS |
|
|
LD B,(HL) ; GET CTL PORT VALUE ; 7TS |
|
|
LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE ; 19TS |
|
|
|
|
|
|
|
|
DEC C ; LD C,(IY+PPIDE_CTL) ; 4TS |
|
|
OUT (C),B ; SET ADDRESS LINES ; 12TS |
|
|
OUT (C),B ; SET ADDRESS LINES ; 12TS |
|
|
SET 6,B ; TURN ON WRITE BIT ; 8TS |
|
|
SET 6,B ; TURN ON WRITE BIT ; 8TS |
|
|
OUT (C),B ; ASSERT WRITE LINE ; 12TS |
|
|
OUT (C),B ; ASSERT WRITE LINE ; 12TS |
|
|
;NOP |
|
|
|
|
|
;NOP |
|
|
|
|
|
LD C,(IY+PPIDE_DATALO) ; ; 19TS |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
DEC C ; 4TS |
|
|
|
|
|
DEC C ; LD C,(IY+PPIDE_DATALO) ; 4TS |
|
|
IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS |
|
|
IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS |
|
|
;NOP |
|
|
|
|
|
;NOP |
|
|
|
|
|
|
|
|
; |
|
|
RES 6,B ; CLEAR WRITE BIT ; 8TS |
|
|
RES 6,B ; CLEAR WRITE BIT ; 8TS |
|
|
LD C,(IY+PPIDE_CTL) ; 19TS |
|
|
|
|
|
|
|
|
INC C ; 4TS |
|
|
|
|
|
INC C ; LD C,(IY+PPIDE_CTL) ; 4TS |
|
|
OUT (C),B ; DEASSERT WRITE LINE ; 12TS |
|
|
OUT (C),B ; DEASSERT WRITE LINE ; 12TS |
|
|
POP BC ; RECOVER INCOMING BC ; 10TS |
|
|
POP BC ; RECOVER INCOMING BC ; 10TS |
|
|
INC HL ; POINT PAST PARM ; 6TS |
|
|
INC HL ; POINT PAST PARM ; 6TS |
|
|
EX (SP),HL ; RESTORE STACK ; 19TS |
|
|
EX (SP),HL ; RESTORE STACK ; 19TS |
|
|
RET ; 10TS |
|
|
RET ; 10TS |
|
|
; ; ----- |
|
|
; ; ----- |
|
|
; ; 243TS WAS 170TS |
|
|
|
|
|
|
|
|
; ; 204TS |
|
|
; ; ----- |
|
|
; ; ----- |
|
|
; OUTPUT A TO |
|
|
|
|
|
|
|
|
; OUTPUT A TO 3 2 0 2 |
|
|
; |
|
|
; |
|
|
PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE |
|
|
PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE |
|
|
|
|
|
EX (SP),HL ; GET PARM POINTER |
|
|
PUSH BC ; SAVE INCOMING BC |
|
|
PUSH BC ; SAVE INCOMING BC |
|
|
LD C,(IY+PPIDE_PPI) |
|
|
LD C,(IY+PPIDE_PPI) |
|
|
LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE |
|
|
LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE |
|
|
OUT (C),B ; DO IT |
|
|
OUT (C),B ; DO IT |
|
|
POP BC ;; |
|
|
|
|
|
EX (SP),HL ; GET PARM POINTER |
|
|
|
|
|
|
|
|
|
|
|
PUSH BC ; SAVE INCOMING BC |
|
|
|
|
|
LD B,(HL) ; GET IDE ADDRESS VALUE |
|
|
LD B,(HL) ; GET IDE ADDRESS VALUE |
|
|
LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE |
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
DEC C ; LD C,(IY+PPIDE_CTL) |
|
|
OUT (C),B ; SET ADDRESS LINES |
|
|
OUT (C),B ; SET ADDRESS LINES |
|
|
SET 5,B ; TURN ON WRITE BIT |
|
|
SET 5,B ; TURN ON WRITE BIT |
|
|
OUT (C),B ; ASSERT WRITE LINE |
|
|
OUT (C),B ; ASSERT WRITE LINE |
|
|
;NOP |
|
|
|
|
|
;NOP |
|
|
|
|
|
LD C,(IY+PPIDE_DATALO) ;; |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
DEC C |
|
|
|
|
|
DEC C ; LD C,(IY+PPIDE_DATALO) |
|
|
OUT (C),A ; SEND DATA VALUE TO DEVICE |
|
|
OUT (C),A ; SEND DATA VALUE TO DEVICE |
|
|
;NOP |
|
|
|
|
|
;NOP |
|
|
|
|
|
|
|
|
; |
|
|
RES 5,B ; CLEAR WRITE BIT |
|
|
RES 5,B ; CLEAR WRITE BIT |
|
|
LD C,(IY+PPIDE_CTL) |
|
|
|
|
|
|
|
|
INC C |
|
|
|
|
|
INC C ; LD C,(IY+PPIDE_CTL) |
|
|
OUT (C),B ; DEASSERT WRITE LINE |
|
|
OUT (C),B ; DEASSERT WRITE LINE |
|
|
POP BC ; RECOVER INCOMING BC |
|
|
POP BC ; RECOVER INCOMING BC |
|
|
INC HL ; POINT PAST PARM |
|
|
INC HL ; POINT PAST PARM |
|
|
|