Browse Source

Framework for Parallel port driver for ECB-Zilog-Peripherals & ECB-4PIO

pull/14/head
b1ackmai1er 7 years ago
committed by GitHub
parent
commit
f4953e6394
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      Source/HBIOS/cfg_sbc.asm
  2. 34
      Source/HBIOS/hbios.asm
  3. 336
      Source/HBIOS/pio.asm
  4. 8
      Source/HBIOS/std.asm

3
Source/HBIOS/cfg_sbc.asm

@ -92,3 +92,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
PIOENABLE .EQU TRUE ; TRUE FOR ZILOG PIO SUPPORT
PIOMODE .EQU PIOMODE_ZP ; PIOMODE_ZP=ECB-ZILOG PERIPHERALS BOARD PIOMODE_4P=ECB-4PIO

34
Source/HBIOS/hbios.asm

@ -546,6 +546,13 @@ INT_SIO: ; SIO INTERRUPT HANDLER
LD HL,SIO_INT ; HL := SIO INT HANDLER IN BIOS BANK
JR HBX_INT ; GO TO ROUTING CODE
#ENDIF
#IF (PIOENABLE)
INT_PIO: ; SIO INTERRUPT HANDLER
PUSH HL ; SAVE HL
LD HL,PIO_INT ; HL := PIO INT HANDLER IN BIOS BANK
JR HBX_INT ; GO TO ROUTING CODE
#ENDIF
;
#ENDIF
;
@ -860,6 +867,10 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
#IF (ACIAENABLE)
CALL ACIA_PREINIT
#ENDIF
#IF (PIOENABLE)
CALL PIO_PREINIT
#ENDIF
;
DIAG(%01111111)
;
@ -1206,6 +1217,9 @@ HB_INITTBL:
#IF (PPPENABLE)
.DW PPP_INIT
#ENDIF
#IF (PIOENABLE)
.DW PIO_INIT
#ENDIF
;
HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2)
;
@ -1322,7 +1336,7 @@ CIO_ADDENT:
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
CIO_FNCNT .EQU 7 ; NUMBER OF CIO FUNCS (FOR RANGE CHECK)
CIO_MAX .EQU 16 ; UP TO 16 UNITS
CIO_MAX .EQU 32 ; UP TO 16 UNITS
CIO_SIZ .EQU CIO_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
.DB CIO_FNCNT ; CIO FUNCTION COUNT (FOR RANGE CHECK)
@ -2386,6 +2400,15 @@ SIZ_AY .EQU $ - ORG_AY
.ECHO SIZ_AY
.ECHO " bytes.\n"
#ENDIF
#IF (PIOENABLE)
ORG_PIO .EQU $
#INCLUDE "pio.asm"
SIZ_PIO .EQU $ - ORG_PIO
.ECHO "PIO occupies "
.ECHO SIZ_PIO
.ECHO " bytes.\n"
#ENDIF
;
#DEFINE USEDELAY
#INCLUDE "util.asm"
@ -2785,7 +2808,7 @@ PS_SERIAL:
PUSH BC ; SAVE UNIT INDEX FOR LATER
;
; UNIT COLUMN
PRTS("Serial $")
PRTS("Char. $")
LD A,C ; MOVE UNIT NUM TO A
CALL PRTDECB ; PRINT IT, ASSUME SINGLE DIGIT
PRTS(" $") ; PAD TO NEXT COLUMN
@ -2907,6 +2930,9 @@ PS_PRTSC2:
PRTS("ANSI$")
RET
;
PS_PRTPC0:
RET
;
; PRINT ONE LINE VIDEO UNIT/DEVICE INFO, VIDEO UNIT INDEX IN C
;
PS_VIDEO:
@ -3069,7 +3095,7 @@ PS_FLPED .TEXT "ED$"
;
PS_SDSTRREF:
.DW PS_SDUART, PS_SDASCI, PS_SDTERM,
.DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA
.DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA, PS_SDPIO
;
PS_SDUART .TEXT "UART$"
PS_SDASCI .TEXT "ASCI$"
@ -3078,11 +3104,13 @@ PS_SDPRPCON .TEXT "PRPCON$"
PS_SDPPPCON .TEXT "PPPCON$"
PS_SDSIO .TEXT "SIO$"
PS_SDACIA .TEXT "ACIA$"
PS_SDPIO .TEXT "PORT$"
;
; SERIAL TYPE STRINGS
;
PS_STRS232 .TEXT "RS-232$"
PS_STTERM .TEXT "Terminal$"
PS_STPPT .TEXT "Parallel$"
;
PS_STPARMAP .DB "NONENMNS"

336
Source/HBIOS/pio.asm

@ -0,0 +1,336 @@
PIO0A .EQU ; ECB-ZP
PIO0B .EQU ; ECB-ZP
PIO1A .EQU ; ECB-ZP
PIO1B .EQU ; ECB-ZP
PIO2A .EQU ; ECB-4PIO
PIO2B .EQU ; ECB-4PIO
PIO3A .EQU ; ECB-4PIO
PIO3B .EQU ; ECB-4PIO
PIO4A .EQU ; ECB-4PIO
PIO4B .EQU ; ECB-4PIO
PIO5A .EQU ; ECB-4PIO
PIO5B .EQU ; ECB-4PIO
PIO_NONE .EQU 0
PIO_ZPIO .EQU 1
PIO_8255 .EQU 2
;
PIO_PREINIT:
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,PIO_CNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
XOR A ; ZERO TO ACCUM
LD (PIO_DEV),A ; CURRENT DEVICE NUMBER
PIO_PREINIT0:
PUSH BC ; SAVE LOOP CONTROL
LD A,C ; PHYSICAL UNIT TO A
RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES)
RLCA ; ...
RLCA ; ... TO GET OFFSET INTO CFG TABLE
LD HL,PIO_CFG ; POINT TO START OF CFG TABLE
CALL ADDHLA ; HL := ENTRY ADDRESS
PUSH HL ; SAVE IT
PUSH HL ; COPY CFG DATA PTR
POP IY ; ... TO IY
CALL PIO_INITUNIT ; HAND OFF TO GENERIC INIT CODE
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE
POP BC ; RESTORE LOOP CONTROL
;
LD A,(IY+1) ; GET THE PIO TYPE DETECTED
OR A ; SET FLAGS
JR Z,PIO_PREINIT2 ; SKIP IT IF NOTHING FOUND
;
PUSH BC ; SAVE LOOP CONTROL
LD BC,PIO_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF PIO FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL
;
PIO_PREINIT2:
INC C ; NEXT PHYSICAL UNIT
DJNZ PIO_PREINIT0 ; LOOP UNTIL DONE
;
;#IF (INTMODE == 1)
; ; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE
; LD A,(SIO_DEV) ; GET NEXT DEVICE NUM
; OR A ; SET FLAGS
; JR Z,PIO_PREINIT3 ; IF ZERO, NO SIO DEVICES
; LD HL,PIO_INT ; GET INT VECTOR
; CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
;#ENDIF
;
;#IF (INTMODE == 2)
; ; SETUP SIO INTERRUPT VECTOR IN IVT
; LD HL,INT_PIO
; LD (HBX_IVT + IVT_SER0),HL
;#ENDIF
;
PIO_PREINIT3:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
PIO_INITUNIT:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
PIO_INIT:
LD B,PIO_CNT ; COUNT OF POSSIBLE SIO UNITS
LD C,0 ; INDEX INTO SIO CONFIG TABLE
PIO_INIT1:
PUSH BC ; SAVE LOOP CONTROL
LD A,C ; PHYSICAL UNIT TO A
RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES)
RLCA ; ...
RLCA ; ... TO GET OFFSET INTO CFG TABLE
LD HL,PIO_CFG ; POINT TO START OF CFG TABLE
CALL ADDHLA ; HL := ENTRY ADDRESS
PUSH HL ; COPY CFG DATA PTR
POP IY ; ... TO IY
LD A,(IY+1) ; GET PIO TYPE
OR A ; SET FLAGS
CALL NZ,PIO_PRTCFG ; PRINT IF NOT ZERO
POP BC ; RESTORE LOOP CONTROL
INC C ; NEXT UNIT
DJNZ PIO_INIT1 ; LOOP TILL DONE
;
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
PIO_LPT:
IN A,($F6) ; get device status
AND $20 ; device ready?
JR Z,PIO_LPT ; no, busy wait
IN A,($F5) ; get transmit buffer register status ready?
AND $20 ; ready?
JR Z,PIO_LPT ; no, busy wait
LD A,C ; ready, char A for output through data port
OUT ($F0),A ; output char
RET
;
; PIO PORT TABLE
;
PIO_CFG:
; PIO CHANNEL A
.DB 0 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB PIOBASE+2 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 1 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB PIOBASE+3 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 2 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB PIOBASE+6 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 3 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB PIOBASE+7 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
; PIO CHANNEL A
.DB 4 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+2 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 5 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+3 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 6 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+6 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 7 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+7 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 8 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+10 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 9 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+11 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 10 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+14 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 11 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+15 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 12 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+14 ; BASE PORT (CMD PORT)
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 13 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_8255 ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+15 ; BASE PORT (CMD PORT)
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
;
PIO_CNT .EQU ($ - PIO_CFG) / 8
;
; DRIVER FUNCTION TABLE
;
PIO_FNTBL:
.DW PIO_IN
.DW PIO_OUT
.DW PIO_IST
.DW PIO_OST
.DW PIO_INITDEV
.DW PIO_QUERY
.DW PIO_DEVICE
#IF (($ - PIO_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID SIO FUNCTION TABLE ***\n"
#ENDIF
;
PIO_OUT:
XOR A ; SIGNAL SUCCESS
RET
;
PIO_IN:
XOR A ; SIGNAL SUCCESS
RET
;
PIO_IST:
RET
;
PIO_OST:
RET
;
PIO_INITDEV:
XOR A ; SIGNAL SUCCESS
RET
;
PIO_QUERY:
LD E,(IY+4) ; FIRST CONFIG BYTE TO E
LD D,(IY+5) ; SECOND CONFIG BYTE TO D
XOR A ; SIGNAL SUCCESS
RET
;
;
;TTY_DEVICE:
; LD D,CIODEV_TERM ; TYPE IS TERMINAL
; LD A,(TTY_DEVNUM) ; GET DEVICE NUMBER
; LD E,A ; PUT IT IN E
; LD A,(TTY_VDAUNIT) ; GET VDA UNIT NUM
; SET 7,A ; SET BIT 7 TO INDICATE TERMINAL TYPE
; LD C,A ; PUT IT IN C
; XOR A ; SIGNAL SUCCESS
; RET
;
;
PIO_DEVICE:
LD D,CIODEV_PIO ; D := DEVICE TYPE
LD E,(IY) ; E := PHYSICAL UNIT
LD C,$80
XOR A ; SIGNAL SUCCESS
RET
;
PIO_PRTCFG:
; ANNOUNCE PORT
CALL NEWLINE ; FORMATTING
PRTS("PIO$") ; FORMATTING
LD A,(IY) ; DEVICE NUM
CALL PRTDECB ; PRINT DEVICE NUM
PRTS(": IO=0x$") ; FORMATTING
LD A,(IY+3) ; GET BASE PORT
CALL PRTHEXBYTE ; PRINT BASE PORT
;
; PRINT THE PIO TYPE
CALL PC_SPACE ; FORMATTING
LD A,(IY+1) ; GET PIO TYPE BYTE
RLCA ; MAKE IT A WORD OFFSET
LD HL,PIO_TYPE_MAP ; POINT HL TO TYPE MAP TABLE
CALL ADDHLA ; HL := ENTRY
LD E,(HL) ; DEREFERENCE
INC HL ; ...
LD D,(HL) ; ... TO GET STRING POINTER
CALL WRITESTR ; PRINT IT
;
; ALL DONE IF NO PIO WAS DETECTED
LD A,(IY+1) ; GET SIO TYPE BYTE
OR A ; SET FLAGS
RET Z ; IF ZERO, NOT PRESENT
;
PRTS(" MODE=$") ; FORMATTING
LD E,(IY+4) ; LOAD CONFIG
LD D,(IY+5) ; ... WORD TO DE
CALL PS_PRTPC0 ; PRINT CONFIG
;
XOR A
RET
;
; WORKING VARIABLES
;
PIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT
;
PIO_TYPE_MAP:
.DW PIO_STR_NONE
.DW PIO_STR_PIO
.DW PIO_STR_8255
PIO_STR_NONE .DB "<NOT PRESENT>$"
PIO_STR_PIO .DB "Zilog PIO$"
PIO_STR_8255 .DB "i8255 PIO$"

8
Source/HBIOS/std.asm

@ -77,7 +77,13 @@ DSRTCMODE_MFPIC .EQU 2 ; MF/PIC VARIANT
SIOMODE_NONE .EQU 0
SIOMODE_RC .EQU 1 ; RC2014 SIO MODULE (SPENCER OWEN)
SIOMODE_SMB .EQU 2 ; RC2014 SIO MODULE (SCOTT BAKER)
SIOMODE_ZP .EQU 3 ; ZILOG PERIPHERALS BOARD
SIOMODE_ZP .EQU 3 ; ECB-ZILOG PERIPHERALS BOARD
;
; PIO MODE SELECTIONS
;
PIOMODE_NONE .EQU 0
PIOMODE_4P .EQU 1 ; ECB-4PIO BOARD
PIOMODE_ZP .EQU 2 ; ECB-ZILOG PERIPHERALS BOARD
;
; TYPE OF CONSOLE BELL TO USE
;

Loading…
Cancel
Save