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