mirror of https://github.com/wwarthen/RomWBW.git
committed by
GitHub
11 changed files with 6761 additions and 31 deletions
@ -0,0 +1,12 @@ |
|||||
|
#INCLUDE "std.asm" |
||||
|
; |
||||
|
SLACK .EQU ($8000-LDR_SIZ-MON_SIZ-SYS_SIZ-SYS_SIZ) |
||||
|
.FILL SLACK,00H |
||||
|
; |
||||
|
MON_STACK .EQU $ |
||||
|
; |
||||
|
.ECHO "Padspace space created: " |
||||
|
.ECHO SLACK |
||||
|
.ECHO " bytes.\n" |
||||
|
|
||||
|
.END |
||||
@ -0,0 +1,12 @@ |
|||||
|
#INCLUDE "std.asm" |
||||
|
; |
||||
|
SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ) |
||||
|
.FILL SLACK,00H |
||||
|
; |
||||
|
MON_STACK .EQU $ |
||||
|
; |
||||
|
.ECHO "Padspace space created: " |
||||
|
.ECHO SLACK |
||||
|
.ECHO " bytes.\n" |
||||
|
|
||||
|
.END |
||||
File diff suppressed because it is too large
@ -0,0 +1,350 @@ |
|||||
|
|
||||
|
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_Input .EQU $0000 |
||||
|
PIO_Output .EQU $0001 |
||||
|
PIO_BiDir .Equ $0002 |
||||
|
|
||||
|
DEFPIOCFGA .EQU $8000 + PIO_Input |
||||
|
DEFPIOCFGB .EQU $8000 + PIO_Output |
||||
|
DEFPIOCFGX .EQU $8000 + PIO_BiDir |
||||
|
|
||||
|
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 DEFPIOCFGA ; 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 DEFPIOCFGB ; 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 DEFPIOCFGA ; 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 DEFPIOCFGB ; 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 DEFPIOCFGX ; 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 DEFPIOCFGB ; 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 DEFPIOCFGA ; 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 DEFPIOCFGB ; 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 DEFPIOCFGA ; 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 DEFPIOCFGB ; 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 DEFPIOCFGA ; 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 DEFPIOCFGB ; 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 DEFPIOCFGA ; 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 DEFPIOCFGB ; 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 - Configure device. |
||||
|
; If DE = FFFF then extract the configuratio information from the table of devices and program the device using those settings. |
||||
|
; Otherwise use the configuration information in DE to program those settings and save them in the device table |
||||
|
|
||||
|
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 A,E |
||||
|
SET 7,A |
||||
|
LD C,A |
||||
|
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$" |
||||
File diff suppressed because it is too large
Loading…
Reference in new issue