From f4953e6394ba0e2082095ce4ce26ad8a907724af Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sat, 6 Oct 2018 23:53:11 +0800 Subject: [PATCH] Framework for Parallel port driver for ECB-Zilog-Peripherals & ECB-4PIO --- Source/HBIOS/cfg_sbc.asm | 3 + Source/HBIOS/hbios.asm | 34 +++- Source/HBIOS/pio.asm | 336 +++++++++++++++++++++++++++++++++++++++ Source/HBIOS/std.asm | 8 +- 4 files changed, 377 insertions(+), 4 deletions(-) create mode 100644 Source/HBIOS/pio.asm diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 450294e0..8023fa6f 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 36916770..b0b765d1 100644 --- a/Source/HBIOS/hbios.asm +++ b/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" diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm new file mode 100644 index 00000000..87a3d0ec --- /dev/null +++ b/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 "$" +PIO_STR_PIO .DB "Zilog PIO$" +PIO_STR_8255 .DB "i8255 PIO$" \ No newline at end of file diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index f8b72695..8e483c04 100644 --- a/Source/HBIOS/std.asm +++ b/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 ;