From c210b5941ea34a34427c5c2507a4ef90e9fe2f37 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 15 Jul 2019 22:44:18 +0800 Subject: [PATCH] Update pio.asm --- Source/HBIOS/pio.asm | 134 +++++++++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index 841c04ad..c5a2314b 100644 --- a/Source/HBIOS/pio.asm +++ b/Source/HBIOS/pio.asm @@ -87,6 +87,7 @@ INT0 .EQU 00000000B INT1 .EQU 00000001B INT2 .EQU 00000010B INT3 .EQU 00000011B + ; ; SETUP THE DISPATCH TABLE ENTRIES ; @@ -107,27 +108,29 @@ PIO_PREINIT: LD (INT_ALLOC),A ; START WITH NO INTERRUPTS ALLOCATED PIO_PREINIT0: PUSH BC ; SAVE LOOP CONTROL - LD A,C ; INITIALIZE THE UNIT - - PUSH AF ;D - LD A,'u' ;D - CALL COUT ;D - POP AF ;D - CALL PRTHEXBYTE ;D UNIT - CALL PC_SPACE ;D - - RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (32 BYTES) - RLCA ; ... - RLCA ; ... TO GET OFFSET INTO CFG TABLE - RLCA +; LD A,C ; INITIALIZE THE UNIT + +; PUSH AF ;D +; LD A,'u' ;D +; CALL COUT ;D +; POP AF ;D +; CALL PRTHEXBYTE ;D UNIT +; CALL PC_SPACE ;D + +; RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (32 BYTES) +; RLCA ; ... +; RLCA ; ... TO GET OFFSET INTO CFG TABLE ; RLCA - LD HL,PIO_CFG ; POINT TO START OF CFG TABLE - PUSH AF - CALL ADDHLA ; HL := ENTRY ADDRESS - POP AF - CALL ADDHLA ; HL := ENTRY ADDRESS - PUSH HL ; SAVE IT - POP IY ; ... TO IY +;; RLCA +; LD HL,PIO_CFG ; POINT TO START OF CFG TABLE +; PUSH AF +; CALL ADDHLA ; HL := ENTRY ADDRESS +; POP AF +; CALL ADDHLA ; HL := ENTRY ADDRESS +; PUSH HL ; SAVE IT +; POP IY ; ... TO IY + + CALL IDXCFG LD (HL),C @@ -211,6 +214,27 @@ SKPINIT:DJNZ PIO_PREINIT0 ; LOOP UNTIL DONE POP DE ;D XOR A ; SIGNAL SUCCESS RET ; AND RETURN +; +; X24 +; +; +CFG_SIZ .EQU 24 +; +IDXCFG: LD A,C + RLCA ; X 2 + RLCA ; X 4 + RLCA ; X 8 + LD H,0 + LD L,A ; HL = X 8 + PUSH HL + ADD HL,HL ; HL = X 16 + POP DE + ADD HL,DE ; HL = X 24 + LD DE,PIO_CFG + ADD HL,DE + PUSH HL ; COPY CFG DATA PTR + POP IY ; ... TO IY + RET ; PIO_INITDEV - INITIALIZE DEVICE ; @@ -285,7 +309,7 @@ SETPIO1:PUSH AF ;D ; AND FIND A FREE ONE PUSH AF ; NESTED LOOP - LD DE,32 ; OUTSIDE LOOP IS INTERRUPT + LD DE,CFG_SIZ ; OUTSIDE LOOP IS INTERRUPT LD B,INT_ALLOW ; INSIDE LOOP IS DEVICE SETPIOP: LD C,B DEC C @@ -325,8 +349,7 @@ SETPIOQ:PUSH AF ; AVAILABLE INTERRUPT IS IN C POP AF POP AF -SETPIOR: - LD HL,INT_ALLOC ; INCREASE THE COUNT +SETPIOR:LD HL,INT_ALLOC ; INCREASE THE COUNT INC (HL) ; OF USED INTERRUPTS LD A,(HL) @@ -338,19 +361,17 @@ SETPIOR: OR C ; SAVE THE ALLOCATES LD (IY+4),A ; INTERRUPT ; -; ; FOR THIS DEVICE AND INTERRUPT, UPDATE THE CONFIG TABLE FOR THIS DEVICE. ; PIO_IN, PIO_OUT, PIO_IST, PIO_OST ENTRIES NEED TO BE REDIRECTED. ; INTERRUPT VECTOR NEEDS TO BE UPDATED ; LD A,(IY+0) LD HL,0 - ; SETUP SIO INTERRUPT VECTOR IN IVT - LD HL,HB_IVT09+1 + ; SETUP PIO INTERRUPT VECTOR IN IVT + LD HL,HBX_IV09+1 CALL SPK_BEEP - - +; SETPIO6:RET ; EXIT WITH FREE INTERRUPT IN C @@ -358,8 +379,6 @@ SETPIO6:RET LD A,C LD (INT_ALLOC),A -; CALL SPK_BEEP - LD A,E AND 11000000B OR 00000100B @@ -406,13 +425,13 @@ SETPIO3:; INTERUPT HANDLING ADD A,A ; LD C,A LD B,0 - LD HL,HB_IVT07+1 + LD HL,HBX_IV09+1 ADD HL,BC ; GET THE ADDRESS OF PUSH DE LD D,(HL) ; THAT INTERRUPT INC HL ; HANDLER LD E,(HL) - LD HL,HBX_IVT+IVT_PIO0 ; POPULATE THE + LD HL,0 ;HBX_IVT+IVT_PIO0 ; POPULATE THE LD A,L ; GET LOW BYTE OF IVT ADDRESS ADD HL,BC ; INTERRUPT TABLE LD (HL),D ; WITH THE INTERRUPT @@ -447,16 +466,18 @@ GUD_SET:LD (IY+4),E ; LOW BYTE ; ; UPDATE THE DEVICE TABLE WITH THE ADDRESSES FOR THE CORRECT ROUTINE. ; + LD A,E + AND 00000111B LD HL,INTMATRIX ; POINT TO EITHER THE INTERRUPT + JR NZ, USEIM LD HL,POLMATRIX ; MATRIX OR THE POLLED MATRIX - PUSH HL +USEIM: PUSH HL PUSH IY ; CALCULATE THE DESTINATION POP HL ; ADDRESS IN THE PIO_CFG TABLE LD BC,8 ; FOR THE FOUR ADDESSES TO BE ADD HL,BC ; COPIED TO - ; LD B,0 ; 00000000 CALCULATE THE SOURCE ADDRESS LD C,E ; XX?????? FROM THE MATRIX. EACH ENTRY SRL C ; 0XX????? IN THE MATRIX IS 8 BYTES SO @@ -715,8 +736,7 @@ SET_8255: SET_BYE: XOR A ; SIGNAL SUCCESS RET - - +; ; ------------------------------------ ; i8255 FUNCTION TABLE ROUTINES ;------------------------------------- @@ -767,7 +787,7 @@ PIO_PRTCFG: CALL WRITESTR ; PRINT IT ; ; ALL DONE IF NO PIO WAS DETECTED - LD A,(IY+1) ; GET SIO TYPE BYTE + LD A,(IY+1) ; GET PIO TYPE BYTE OR A ; SET FLAGS RET Z ; IF ZERO, NOT PRESENT ; @@ -822,7 +842,7 @@ PIO_STR_PORT .DB "IO Port$" ; .DW PIO_QUERY ; IY+18 ADDR FOR QUERY DEVICE RECORD ROUTINE (SET AT ASSEMBLY, FIXED) ; .DW PIO_DEVICE ; IY+20 ADDR FOR DEVICE TYPE ROUTINE (SET AT ASSEMBLY, FIXED) ; .FILL 10 - +; ; SETUP PARAMETER WORD: ; ; +-------------------------------+ +-------+-----------+---+-------+ @@ -856,7 +876,7 @@ PIO_STR_PORT .DB "IO Port$" #DEFCONT \ .DB MPIOCH0X #DEFCONT \ .DW 0 #DEFCONT \ .DW 0,0,0,0, PIO_INITDEV,PIO_QUERY,PIO_DEVICE -#DEFCONT \ .FILL 10 +#DEFCONT \ .FILL 2 #DEFCONT \ .DB 0 #DEFCONT \ .DB PIO_ZPIO #DEFCONT \ .DB 1 @@ -865,7 +885,7 @@ PIO_STR_PORT .DB "IO Port$" #DEFCONT \ .DB MPIOCH1X #DEFCONT \ .DW 0 #DEFCONT \ .DW 0,0,0,0, PIO_INITDEV,PIO_QUERY,PIO_DEVICE -#DEFCONT \ .FILL 10 +#DEFCONT \ .FILL 2 ; ; i8255 PORT TABLE - EACH ENTRY IS FOR 1 CHIP I.E. THREE PORTS ; @@ -878,7 +898,7 @@ PIO_STR_PORT .DB "IO Port$" #DEFCONT \ .DB MPPICH1X #DEFCONT \ .DW 0 #DEFCONT \ .DW PPI_IN,PPI_OUT,PPI_IST,PPI_OST,PPI_INITDEV,PPI_QUERY,PPI_DEVICE -#DEFCONT \ .FILL 10 +#DEFCONT \ .FILL 2 #DEFCONT \ .DB 0 #DEFCONT \ .DB PIO_8255 #DEFCONT \ .DB 1 @@ -887,7 +907,7 @@ PIO_STR_PORT .DB "IO Port$" #DEFCONT \ .DB MPPICH2X #DEFCONT \ .DW 0 #DEFCONT \ .DW PPI_IN,PPI_OUT,PPI_IST,PPI_OST,PPI_INITDEV,PPI_QUERY,PPI_DEVICE -#DEFCONT \ .FILL 10 +#DEFCONT \ .FILL 2 #DEFCONT \ .DB 0 #DEFCONT \ .DB PIO_8255 #DEFCONT \ .DB 2 @@ -896,7 +916,7 @@ PIO_STR_PORT .DB "IO Port$" #DEFCONT \ .DB MPPICH3X #DEFCONT \ .DW 0 #DEFCONT \ .DW PPI_IN,PPI_OUT,PPI_IST,PPI_OST,PPI_INITDEV,PPI_QUERY,PPI_DEVICE -#DEFCONT \ .FILL 10 +#DEFCONT \ .FILL 2 ; ; HERE WE ACTUALLY DEFINE THE HARDWARE THAT THE HBIOS CAN ACCESS ; THE INIT ROUTINES READ AND SET THE INITIAL MODES FROM THIS INFO @@ -919,7 +939,7 @@ DEFPIO(PIOZBASE+4,M_Output,M_Output,M_BitAllOut,M_BitAllOut,INT_N,INT_N) DEFPPI(PPIBASE,M_Output,M_Output,M_Output,M_BitAllOut,M_BitAllOut,M_BitAllOut) #ENDIF ; -PIO_CNT .EQU ($ - PIO_CFG) / 32 +PIO_CNT .EQU ($ - PIO_CFG) / CFG_SIZ ; ;------------------------------------------------------------------- ; WHEN WE GET HERE IY POINTS TO THE PIO_CFG TABLE WE ARE WORKING ON. @@ -942,19 +962,21 @@ PIO_INIT: PIO_INIT1: PUSH BC ; SAVE LOOP CONTROL - LD A,C ; PHYSICAL UNIT TO A - RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (32 BYTES) - RLCA ; ... - RLCA ; ... TO GET OFFSET INTO CFG TABLE - RLCA +; LD A,C ; PHYSICAL UNIT TO A +; RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (32 BYTES) +; RLCA ; ... +; RLCA ; ... TO GET OFFSET INTO CFG TABLE ; RLCA - LD HL,PIO_CFG ; POINT TO START OF CFG TABLE - PUSH AF - CALL ADDHLA ; HL := ENTRY ADDRESS - POP AF - CALL ADDHLA ; HL := ENTRY ADDRESS - PUSH HL ; COPY CFG DATA PTR - POP IY ; ... TO IY +;; RLCA +; LD HL,PIO_CFG ; POINT TO START OF CFG TABLE +; PUSH AF +; CALL ADDHLA ; HL := ENTRY ADDRESS +; POP AF +; CALL ADDHLA ; HL := ENTRY ADDRESS +; PUSH HL ; COPY CFG DATA PTR +; POP IY ; ... TO IY + + CALL IDXCFG LD A,(IY+1) ; GET PIO TYPE OR A ; SET FLAGS