|
|
|
@ -12,8 +12,6 @@ |
|
|
|
; |
|
|
|
; Hardware initialization. |
|
|
|
; Configure to initial state or to a new state. |
|
|
|
; |
|
|
|
; |
|
|
|
; Implementation limitations: |
|
|
|
; |
|
|
|
; The fully functionality of the Z80 PIO can only be realized by using Z80 interrupt mode 2. |
|
|
|
@ -129,7 +127,7 @@ PIO_PREINIT2: |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
; SETUP PIO INTERRUPT VECTOR IN IVT |
|
|
|
LD HL,INT_PIO |
|
|
|
LD HL,PIO0INT |
|
|
|
LD (HBX_IVT + IVT_PIO0),HL |
|
|
|
#ENDIF |
|
|
|
PIO_PREINIT3: |
|
|
|
@ -205,16 +203,17 @@ PIO_IN: |
|
|
|
RET |
|
|
|
|
|
|
|
; |
|
|
|
PIO_INT0: |
|
|
|
PIO_INT1: |
|
|
|
PIO_INT2: |
|
|
|
PIO_INT3: |
|
|
|
PIO_INT4: |
|
|
|
PIO_INT5: |
|
|
|
PIO_INT6: |
|
|
|
PIO_INT7: |
|
|
|
PIO_INT8: |
|
|
|
PIO_INT9:OR $FF ; NZ SET TO INDICATE INT HANDLED |
|
|
|
PIO0INT: |
|
|
|
PIO1INT: |
|
|
|
PIO2INT: |
|
|
|
PIO3INT: |
|
|
|
PIO4INT: |
|
|
|
PIO5INT: |
|
|
|
PIO6INT: |
|
|
|
PIO7INT: |
|
|
|
PIO8INT: |
|
|
|
PIO9INT: |
|
|
|
OR $FF ; NZ SET TO INDICATE INT HANDLED |
|
|
|
RET |
|
|
|
; |
|
|
|
; ON ENTRY IY POINTS TO THE DEVICE RECORD |
|
|
|
@ -258,11 +257,13 @@ PIO_OST: |
|
|
|
; CHIP CHANNEL B5 B4 B3 001 Channel 1 |
|
|
|
; 010 Channel 2 |
|
|
|
; 100 Channel 3 |
|
|
|
; INTERRUPT ALLOCATED B2 = 0 NOT ALLOCATED |
|
|
|
; = 1 IS ALLOCATED |
|
|
|
; |
|
|
|
; INTERUPT B1 B0 00 IVT 1 |
|
|
|
; 01 IVT 2 |
|
|
|
; 10 IVT 3 |
|
|
|
; 11 IVT 4 |
|
|
|
; WHICH IVT IS ALLOCATES B1 B0 00 IVT_PIO0 |
|
|
|
; 01 IVT_PIO1 |
|
|
|
; 10 IVT_PIO2 |
|
|
|
; 11 IVT_PIO3 |
|
|
|
PIO_INITDEV: |
|
|
|
; TEST FOR -1 (FFFF) WHICH MEANS USE CURRENT CONFIG (JUST REINIT) |
|
|
|
LD A,D ; TEST DE FOR |
|
|
|
@ -505,13 +506,14 @@ PIO_STR_PORT .DB "IO Port$" |
|
|
|
PIO_CFG: |
|
|
|
|
|
|
|
#IF PIO_ZP |
|
|
|
DEFPIO(PIO_ZPIO,PIOZBASE,M_Output,M_BitCtrl,M_BitAllOut,M_BitAllOut,PIO0FT,PIO1FT,INT_Y,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIOZBASE+0,M_Output,M_BitCtrl,M_BitAllOut,M_BitAllOut,PIO0FT,PIO1FT,INT_Y,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIOZBASE+4,M_Output,M_BitCtrl,M_BitAllOut,M_BitAllOut,PIO2FT,PIO3FT,INT_Y,INT_N) |
|
|
|
#ENDIF |
|
|
|
#IF PIO_4P |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+0,M_Output,M_BitCtrl,M_BitAllOut,M_BitAllOut,PIO2FT,PIO3FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+4,M_Output,M_Input,M_BitAllOut,M_BitAllOut,PIO4FT,PIO5FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+8,M_Output,M_Output,M_BitAllOut,M_BitAllOut,PIO6FT,PIO7FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+12,M_Output,M_Output,M_BitAllOut,M_Output,PIO8FT,PIO9FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+0,M_Output,M_BitCtrl,M_BitAllOut,M_BitAllOut,PIO4FT,PIO5FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+4,M_Output,M_Input,M_BitAllOut,M_BitAllOut,PIO6FT,PIO7FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+8,M_Output,M_Output,M_BitAllOut,M_BitAllOut,PIO8FT,PIO9FT,INT_N,INT_N) |
|
|
|
DEFPIO(PIO_ZPIO,PIO4BASE+12,M_Output,M_Output,M_BitAllOut,M_Output,PIO10FT,PIO11FT,INT_N,INT_N) |
|
|
|
#ENDIF |
|
|
|
; PPI_SBC & (PLATFORM == PLT_SBC) & (PPIDEMODE != PPIDEMODE_SBC)) |
|
|
|
|
|
|
|
@ -532,8 +534,10 @@ PIO_CNT .EQU ($ - PIO_CFG) / 8 |
|
|
|
; |
|
|
|
|
|
|
|
; DRIVER FUNCTION TABLE FOR Z80 PIO's |
|
|
|
; |
|
|
|
; |
|
|
|
; EACH PIO NEEDS A FUNCTION TABLE |
|
|
|
; ECB-ZP : PIO0FT-PIO3FT |
|
|
|
; ECB-4P : PIO4FT-PIO11FT |
|
|
|
|
|
|
|
PIO_FNTBL: |
|
|
|
; |
|
|
|
#IF PIO_ZP |
|
|
|
@ -557,9 +561,6 @@ PIO1FT .DW PIO_IN |
|
|
|
#IF (($ - PIO1FT) != (CIO_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID PIO FUNCTION TABLE ***\n" |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#IF PIO_4P |
|
|
|
PIO2FT .DW PIO_IN |
|
|
|
.DW PIO_OUT |
|
|
|
.DW PIO_IST |
|
|
|
@ -580,6 +581,9 @@ PIO3FT .DW PIO_IN |
|
|
|
#IF (($ - PIO3FT) != (CIO_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID PIO FUNCTION TABLE ***\n" |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF PIO_4P |
|
|
|
PIO4FT .DW PIO_IN |
|
|
|
.DW PIO_OUT |
|
|
|
.DW PIO_IST |
|
|
|
@ -640,6 +644,26 @@ PIO9FT .DW PIO_IN |
|
|
|
#IF (($ - PIO9FT) != (CIO_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID PIO FUNCTION TABLE ***\n" |
|
|
|
#ENDIF |
|
|
|
PIO10FT .DW PIO_IN |
|
|
|
.DW PIO_OUT |
|
|
|
.DW PIO_IST |
|
|
|
.DW PIO_OST |
|
|
|
.DW PIO_INITDEV |
|
|
|
.DW PIO_QUERY |
|
|
|
.DW PIO_DEVICE |
|
|
|
#IF (($ - PIO10FT) != (CIO_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID PIO FUNCTION TABLE ***\n" |
|
|
|
#ENDIF |
|
|
|
PIO11FT .DW PIO_IN |
|
|
|
.DW PIO_OUT |
|
|
|
.DW PIO_IST |
|
|
|
.DW PIO_OST |
|
|
|
.DW PIO_INITDEV |
|
|
|
.DW PIO_QUERY |
|
|
|
.DW PIO_DEVICE |
|
|
|
#IF (($ - PIO11FT) != (CIO_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID PIO FUNCTION TABLE ***\n" |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; DRIVER FUNCTION TABLE FOR i8255's |
|
|
|
|