mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Update pio.asm
This commit is contained in:
@@ -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
|
||||
; 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
|
||||
; 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
|
||||
; 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
|
||||
|
||||
Reference in New Issue
Block a user