From 6606baebe9eacd2a3e3a988343318afb855274be Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Tue, 9 Apr 2019 23:25:57 +0800 Subject: [PATCH] Fix IM2 assembly error. Add second ECB-ZP PIO chip. --- Source/HBIOS/hbios.asm | 8 ++--- Source/HBIOS/pio.asm | 78 +++++++++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e6e171fb..69f95dfb 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ; diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index f3ec74e5..9a04177d 100644 --- a/Source/HBIOS/pio.asm +++ b/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