Browse Source

Fix IM2 assembly error. Add second ECB-ZP PIO chip.

pull/27/head
b1ackmai1er 7 years ago
committed by GitHub
parent
commit
6606baebe9
  1. 8
      Source/HBIOS/hbios.asm
  2. 78
      Source/HBIOS/pio.asm

8
Source/HBIOS/hbios.asm

@ -556,22 +556,22 @@ INT_SIO: ; SIO INTERRUPT HANDLER
#IF (PIO_ZP)
INT_ZP0: ; PIO INTERRUPT HANDLER
PUSH HL ; SAVE HL
LD HL,PIO_INT0 ; HL := PIO INT HANDLER IN BIOS BANK
LD HL,PIO0INT ; HL := PIO INT HANDLER IN BIOS BANK
JR HBX_INT ; GO TO ROUTING CODE
INT_ZP1
PUSH HL ; SAVE HL
LD HL,PIO_INT1 ; HL := PIO INT HANDLER IN BIOS BANK
LD HL,PIO1INT ; HL := PIO INT HANDLER IN BIOS BANK
JR HBX_INT ; GO TO ROUTING CODE
#ENDIF
;
#IF (PIO_4P)
INT_4P0: ; PIO INTERRUPT HANDLER
PUSH HL ; SAVE HL
LD HL,PIO_INT2 ; HL := PIO INT HANDLER IN BIOS BANK
LD HL,PIO2INT ; HL := PIO INT HANDLER IN BIOS BANK
JR HBX_INT ; GO TO ROUTING CODE
INT_4P1:
PUSH HL ; SAVE HL
LD HL,PIO_INT3 ; HL := PIO INT HANDLER IN BIOS BANK
LD HL,PIO3INT ; HL := PIO INT HANDLER IN BIOS BANK
JR HBX_INT ; GO TO ROUTING CODE
#ENDIF
;

78
Source/HBIOS/pio.asm

@ -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

Loading…
Cancel
Save