|
|
|
@ -30,11 +30,32 @@ 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) |
|
|
|
; |
|
|
|
; MSX_NOTE: |
|
|
|
; CONTROL SIGNALS ARE NOT INVERTED, CS3 and DRIVE RESET SIGNALS NOT IMPLEMENTED |
|
|
|
; SETTING THE DIRECTION OF THE PORTS WILL RESET THE OUTPUT PORTS I.E. CONTROL SIGNALS |
|
|
|
; PPI IDE CONTROL BIT: |
|
|
|
; 0 IDE REGISTER BIT 0 |
|
|
|
; 1 IDE REGISTER BIT 1 |
|
|
|
; 2 IDE REGISTER BIT 2 |
|
|
|
; 3 NOT USED |
|
|
|
; 4 NOT USED |
|
|
|
; 5 /CS SELECT |
|
|
|
; 6 /WR WRITE DATA |
|
|
|
; 7 /RD READ DATA |
|
|
|
; |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
PPIDE_CTL_CS1 .EQU %11000000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW) |
|
|
|
PPIDE_CTL_DIOW .EQU %01000000 ; DRIVE I/O WRITE (ACTIVE LOW) |
|
|
|
PPIDE_CTL_DIOR .EQU %10000000 ; DRIVE I/O READ (ACTIVE LOW) |
|
|
|
PPIDE_IDLE .EQU %11100111 ; SET DRIVE IN IDLE STATE |
|
|
|
#ELSE |
|
|
|
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) |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; +-----------------------------------------------------------------------+ |
|
|
|
; | CONTROL BLOCK REGISTERS (CS3FX) | |
|
|
|
@ -140,9 +161,11 @@ PPIDE_REG_BCL .EQU PPIDE_CTL_CS1 | $04 ; PKT BYTE COUNT LOW (BITS 0-7) (R/W) |
|
|
|
PPIDE_REG_BCH .EQU PPIDE_CTL_CS1 | $05 ; PKT BYTE COUNT HIGH (BITS 8-15) (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) |
|
|
|
#IF (PPIDE0MODE != PPIDEMODE_MSX) |
|
|
|
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) |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; COMMAND BYTES |
|
|
|
; |
|
|
|
@ -244,6 +267,9 @@ PPIDE_DEV0M: ; DEVICE 0, MASTER |
|
|
|
#ENDIF |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_S100B) |
|
|
|
DEVECHO "S100B" |
|
|
|
#ENDIF |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
DEVECHO "MSX_BEER" |
|
|
|
#ENDIF |
|
|
|
DEVECHO ", IO=" |
|
|
|
DEVECHO PPIDE0BASE |
|
|
|
@ -253,7 +279,11 @@ PPIDE_DEV0M: ; DEVICE 0, MASTER |
|
|
|
PPIDE_DEV0S: ; DEVICE 0, SLAVE |
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
|
.DB PPIDE0MODE ; DRIVER DEVICE MODE |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
.DB PPIDE_STNOMEDIA ; SLAVE UNIT NOT SUPPORTED |
|
|
|
#ELSE |
|
|
|
.DB 0 ; DEVICE STATUS |
|
|
|
#ENDIF |
|
|
|
.DB 0 ; DEVICE TYPE |
|
|
|
.DB (PPIDE0B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS |
|
|
|
.DB 0 ; MEDIA FLAGS |
|
|
|
@ -277,14 +307,18 @@ PPIDE_DEV0S: ; DEVICE 0, SLAVE |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_S100B) |
|
|
|
DEVECHO "S100B" |
|
|
|
#ENDIF |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
DEVECHO "MSX_BEER, NO SLAVE\n" |
|
|
|
#ELSE |
|
|
|
DEVECHO ", IO=" |
|
|
|
DEVECHO PPIDE0BASE |
|
|
|
DEVECHO ", SLAVE" |
|
|
|
DEVECHO "\n" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PPIDECNT >= 2) |
|
|
|
#IF (PPIDECNT >= 2) & (PPIDE1MODE != PPIDEMODE_MSX) |
|
|
|
; |
|
|
|
PPIDE_DEV1M: ; DEVICE 1, MASTER |
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
|
@ -352,7 +386,7 @@ PPIDE_DEV1S: ; DEVICE 1, SLAVE |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PPIDECNT >= 3) |
|
|
|
#IF (PPIDECNT >= 3) & (PPIDE2MODE != PPIDEMODE_MSX) |
|
|
|
; |
|
|
|
PPIDE_DEV2M: ; DEVICE 2, MASTER |
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
|
@ -500,10 +534,13 @@ PPIDE_INIT2B: |
|
|
|
PPIDE_INIT3: |
|
|
|
CALL PPIDE_RESET ; RESET THE BUS |
|
|
|
CALL PPIDE_INIT5 ; DETECT/INIT MASTER |
|
|
|
; MSX_NOTE: SLAVE UNIT NOT SUPPORTED |
|
|
|
#IF (PPIDE0MODE != PPIDEMODE_MSX) |
|
|
|
PUSH IY ; SAVE CFG PTR |
|
|
|
CALL PPIDE_GOPARTNER ; SWITCH IY TO PARTNER CFG |
|
|
|
CALL PPIDE_INIT5 ; DETECT/INIT SLAVE |
|
|
|
POP IY ; RESTORE CFG PTR |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPIDE_INIT4: |
|
|
|
LD DE,PPIDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY |
|
|
|
@ -584,6 +621,13 @@ PPIDE_DETECT: |
|
|
|
; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO |
|
|
|
; INTERFERE WITH THE VALUE BEING READ. |
|
|
|
; |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
; SETTING THE DIRECTION WILL RESET THE CONTROL SIGNALS |
|
|
|
LD A,$A5 |
|
|
|
CALL PPIDE_OUT ; USE THE CORRECT SIGNAL SEQUENCE |
|
|
|
.DB PPIDE_REG_DATA |
|
|
|
LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO |
|
|
|
#ELSE |
|
|
|
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE |
|
|
|
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD |
|
|
|
EZ80_IO |
|
|
|
@ -593,6 +637,7 @@ PPIDE_DETECT: |
|
|
|
LD A,$A5 ; TEST VALUE |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; PUSH VALUE TO PORT |
|
|
|
#ENDIF |
|
|
|
EZ80_IO |
|
|
|
IN A,(C) ; GET PORT VALUE |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
@ -1221,6 +1266,23 @@ PPIDE_GET: |
|
|
|
PRTS(" GET$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
; FIRST SETUP THE PPI TO READ THEN WAIT FOR BUFFER |
|
|
|
; |
|
|
|
; SETUP PPI TO READ |
|
|
|
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ |
|
|
|
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; WRITE IT |
|
|
|
; |
|
|
|
; WAIT FOR BUFFER |
|
|
|
PUSH BC |
|
|
|
PUSH HL |
|
|
|
CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY |
|
|
|
POP HL |
|
|
|
POP BC |
|
|
|
RET NZ ; BAIL OUT IF TIMEOUT |
|
|
|
#ELSE |
|
|
|
; WAIT FOR BUFFER |
|
|
|
PUSH BC |
|
|
|
PUSH HL |
|
|
|
@ -1235,6 +1297,7 @@ PPIDE_GET: |
|
|
|
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; WRITE IT |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SELECT READ/WRITE IDE REGISTER |
|
|
|
LD A,PPIDE_REG_DATA ; DATA REGISTER |
|
|
|
@ -1319,6 +1382,25 @@ PPIDE_PUT: |
|
|
|
PRTS(" PUT$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
; SETTING THE DIRECTION WILL RESET THE CONTROL SIGNALS |
|
|
|
; THE WORKAROUND FOR WRITE IS TO USE A SMALL DELAY INSTEAD OF WAITING FOR BUFFER READY |
|
|
|
; |
|
|
|
; SETUP PPI TO WRITE |
|
|
|
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE |
|
|
|
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; WRITE IT |
|
|
|
; |
|
|
|
; SMALL DELAY FOR BUFFER READY |
|
|
|
PUSH BC |
|
|
|
LD B,$30 |
|
|
|
WR_WAIT: |
|
|
|
EX (SP),HL |
|
|
|
EX (SP),HL |
|
|
|
DJNZ WR_WAIT |
|
|
|
POP BC |
|
|
|
#ELSE |
|
|
|
; WAIT FOR BUFFER |
|
|
|
PUSH BC |
|
|
|
PUSH HL |
|
|
|
@ -1333,6 +1415,7 @@ PPIDE_PUT: |
|
|
|
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; WRITE IT |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SELECT READ/WRITE IDE REGISTER |
|
|
|
LD A,PPIDE_REG_DATA ; DATA REGISTER |
|
|
|
@ -1341,7 +1424,7 @@ PPIDE_PUT: |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; DO IT |
|
|
|
LD E,A ; E := WRITE UNASSERTED |
|
|
|
XOR PPIDE_CTL_DIOW ; SWAP THE READ LINE BIT |
|
|
|
XOR PPIDE_CTL_DIOW ; SWAP THE WRITE LINE BIT |
|
|
|
LD D,A ; D := WRITE ASSERTED |
|
|
|
; |
|
|
|
; LOOP SETUP |
|
|
|
@ -1448,6 +1531,12 @@ PPIDE_RESET: |
|
|
|
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; WRITE IT |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
; SET DRIVE TO IDLE |
|
|
|
LD A,PPIDE_IDLE |
|
|
|
DEC C |
|
|
|
OUT (C),A |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; IF A DSKYNG IS ACTIVE AND IS ON THE SAME PPI PORT AS THE PPIDE BEING |
|
|
|
; RESET, THEN THE DSKYNG WILL ALSO BE RESET. SO, THE RESET CODE IS |
|
|
|
@ -1473,6 +1562,9 @@ PPIDE_RESET_PKD1: |
|
|
|
#IF (PPIDETRACE >= 3) |
|
|
|
PRTS(" HARD$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; MSX_NOTE: RESET SIGNAL NOT IMPLEMENTED, /RESET OF PPI 8255 IS CONNECTED TO Z80 BUS /RESET |
|
|
|
#IF (PPIDE0MODE != PPIDEMODE_MSX) |
|
|
|
LD A,PPIDE_CTL_RESET |
|
|
|
;OUT (PPIDE_REG_CTL),A |
|
|
|
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS |
|
|
|
@ -1543,6 +1635,8 @@ PPIDE_RESET3: |
|
|
|
LD DE,20 ; DELAY 320US (SPEC IS >= 25US) |
|
|
|
CALL VDELAY |
|
|
|
; |
|
|
|
#ENDIF ; PPIDEMODE_MSX |
|
|
|
; |
|
|
|
PPIDE_RESET5: |
|
|
|
LD HL,PPIDE_TONORM ; NORMAL TIMEOUT NOW |
|
|
|
LD (PPIDE_TIMEOUT),HL ; AND RESTORE IT |
|
|
|
@ -1555,8 +1649,11 @@ PPIDE_RESET5: |
|
|
|
BIT 0,(IY+PPIDE_ACC) ; MASTER? |
|
|
|
CALL Z,PPIDE_GOPARTNER ; IF NOT, SWITCH TO MASTER |
|
|
|
CALL PPIDE_INITUNIT ; INIT CURRENT UNIT |
|
|
|
; MSX_NOTE: SLAVE UNIT NOT SUPPORTED |
|
|
|
#IF (PPIDE0MODE != PPIDEMODE_MSX) |
|
|
|
CALL PPIDE_GOPARTNER ; POINT TO SLAVE |
|
|
|
CALL PPIDE_INITUNIT ; INIT PARTNER UNIT |
|
|
|
#ENDIF |
|
|
|
POP IY ; RECOVER ORIG CFG PTR |
|
|
|
; |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
@ -2053,7 +2150,11 @@ PPIDE_IN: |
|
|
|
DEC C ; SET IDE ADDRESS ; 4TS |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B ; SET ADDRESS LINES ; 12TS |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
RES 7,B ; CLEAR /READ BIT (READ ON) |
|
|
|
#ELSE |
|
|
|
SET 6,B ; TURN ON READ BIT ; 8TS |
|
|
|
#ENDIF |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B ; ASSERT READ LINE ; 12TS |
|
|
|
; |
|
|
|
@ -2065,7 +2166,11 @@ PPIDE_IN: |
|
|
|
INC C ; 4TS |
|
|
|
INC C ; 4TS |
|
|
|
; |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
LD B,PPIDE_IDLE ; SET DRIVE TO IDLE (READ OFF) |
|
|
|
#ELSE |
|
|
|
RES 6,B ; CLEAR READ BIT ; 8TS |
|
|
|
#ENDIF |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B ; DEASSERT READ LINE ; 12TS |
|
|
|
POP BC ; RECOVER INCOMING BC ; 10TS |
|
|
|
@ -2093,6 +2198,20 @@ PPIDE_OUT: |
|
|
|
DEC C ; SET IDE ADDRESS |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B ; SET ADDRESS LINES |
|
|
|
; |
|
|
|
#IF (PPIDE0MODE == PPIDEMODE_MSX) |
|
|
|
; FIRST SEND DATA VALUE THEN ASSERT WRITE LINE |
|
|
|
DEC C |
|
|
|
DEC C |
|
|
|
EZ80_IO |
|
|
|
OUT (C),A ; SEND DATA VALUE TO DEVICE |
|
|
|
INC C |
|
|
|
INC C |
|
|
|
RES 6,B ; CLEAR /WRITE BIT (WRITE ON) |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B |
|
|
|
LD B,PPIDE_IDLE ; SET DRIVE TO IDLE (WRITE OFF) |
|
|
|
#ELSE |
|
|
|
SET 5,B ; TURN ON WRITE BIT |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B ; ASSERT WRITE LINE |
|
|
|
@ -2106,6 +2225,7 @@ PPIDE_OUT: |
|
|
|
INC C |
|
|
|
; |
|
|
|
RES 5,B ; CLEAR WRITE BIT |
|
|
|
#ENDIF |
|
|
|
EZ80_IO |
|
|
|
OUT (C),B ; DEASSERT WRITE LINE |
|
|
|
POP BC ; RECOVER INCOMING BC |
|
|
|
|