mirror of https://github.com/wwarthen/RomWBW.git
committed by
GitHub
3 changed files with 3888 additions and 0 deletions
File diff suppressed because it is too large
@ -0,0 +1,187 @@ |
|||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|||
; |
|||
; HBIOS FUNCTIONS |
|||
; |
|||
BF_CIO .EQU $00 |
|||
BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT |
|||
BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT |
|||
BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS |
|||
BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS |
|||
BF_CIOINIT .EQU BF_CIO + 4 ; INIT/RESET DEVICE/LINE CONFIG |
|||
BF_CIOQUERY .EQU BF_CIO + 5 ; REPORT DEVICE/LINE CONFIG |
|||
BF_CIODEVICE .EQU BF_CIO + 6 ; REPORT DEVICE INFO |
|||
; |
|||
BF_DIO .EQU $10 |
|||
BF_DIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS |
|||
BF_DIORESET .EQU BF_DIO + 1 ; DISK RESET |
|||
BF_DIOSEEK .EQU BF_DIO + 2 ; DISK SEEK |
|||
BF_DIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS |
|||
BF_DIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS |
|||
BF_DIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS |
|||
BF_DIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK |
|||
BF_DIODEVICE .EQU BF_DIO + 7 ; DISK DEVICE INFO REPORT |
|||
BF_DIOMEDIA .EQU BF_DIO + 8 ; DISK MEDIA REPORT |
|||
BF_DIODEFMED .EQU BF_DIO + 9 ; DEFINE DISK MEDIA |
|||
BF_DIOCAP .EQU BF_DIO + 10 ; DISK CAPACITY REPORT |
|||
BF_DIOGEOM .EQU BF_DIO + 11 ; DISK GEOMETRY REPORT |
|||
; |
|||
BF_RTC .EQU $20 |
|||
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME |
|||
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME |
|||
BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX |
|||
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX |
|||
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK |
|||
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK |
|||
; |
|||
BF_EMU .EQU $30 ; DEPRECATED |
|||
; |
|||
BF_VDA .EQU $40 |
|||
BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU |
|||
BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS |
|||
BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU |
|||
BF_VDADEV .EQU BF_VDA + 3 ; DEVICE INFO |
|||
BF_VDASCS .EQU BF_VDA + 4 ; SET CURSOR STYLE |
|||
BF_VDASCP .EQU BF_VDA + 5 ; SET CURSOR POSITION |
|||
BF_VDASAT .EQU BF_VDA + 6 ; SET CHARACTER ATTRIBUTE |
|||
BF_VDASCO .EQU BF_VDA + 7 ; SET CHARACTER COLOR |
|||
BF_VDAWRC .EQU BF_VDA + 8 ; WRITE CHARACTER |
|||
BF_VDAFIL .EQU BF_VDA + 9 ; FILL |
|||
BF_VDACPY .EQU BF_VDA + 10 ; COPY |
|||
BF_VDASCR .EQU BF_VDA + 11 ; SCROLL |
|||
BF_VDAKST .EQU BF_VDA + 12 ; GET KEYBOARD STATUS |
|||
BF_VDAKFL .EQU BF_VDA + 13 ; FLUSH KEYBOARD BUFFER |
|||
BF_VDAKRD .EQU BF_VDA + 14 ; READ KEYBOARD |
|||
; |
|||
BF_SYS .EQU $F0 |
|||
BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS |
|||
BF_SYSVER .EQU BF_SYS + 1 ; GET HBIOS VERSION |
|||
BF_SYSSETBNK .EQU BF_SYS + 2 ; SET CURRENT BANK |
|||
BF_SYSGETBNK .EQU BF_SYS + 3 ; GET CURRENT BANK |
|||
BF_SYSSETCPY .EQU BF_SYS + 4 ; BANK MEMORY COPY SETUP |
|||
BF_SYSBNKCPY .EQU BF_SYS + 5 ; BANK MEMORY COPY |
|||
BF_SYSALLOC .EQU BF_SYS + 6 ; ALLOC HBIOS HEAP MEMORY |
|||
BF_SYSFREE .EQU BF_SYS + 7 ; FREE HBIOS HEAP MEMORY |
|||
BF_SYSGET .EQU BF_SYS + 8 ; GET HBIOS INFO |
|||
BF_SYSSET .EQU BF_SYS + 9 ; SET HBIOS PARAMETERS |
|||
BF_SYSPEEK .EQU BF_SYS + 10 ; GET A BYTE VALUE FROM ALT BANK |
|||
BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK |
|||
BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS |
|||
; |
|||
BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT |
|||
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT |
|||
BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT |
|||
BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE |
|||
BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION |
|||
BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION |
|||
BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO |
|||
BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO |
|||
; |
|||
BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE |
|||
BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION |
|||
; |
|||
BF_SYSINT_INFO .EQU $00 ; GET INTERRUPT SYSTEM INFO |
|||
BF_SYSINT_GET .EQU $10 ; GET INT VECTOR ADDRESS |
|||
BF_SYSINT_SET .EQU $20 ; SET INT VECTOR ADDRESS |
|||
; |
|||
; CHAR DEVICE IDS |
|||
; |
|||
CIODEV_UART .EQU $00 |
|||
CIODEV_ASCI .EQU $10 |
|||
CIODEV_TERM .EQU $20 |
|||
CIODEV_PRPCON .EQU $30 |
|||
CIODEV_PPPCON .EQU $40 |
|||
CIODEV_SIO .EQU $50 |
|||
CIODEV_ACIA .EQU $60 |
|||
CIODEV_CONSOLE .EQU $D0 |
|||
CIODEV_PIO .EQU $70 |
|||
; |
|||
; SUB TYPES OF CHAR DEVICES |
|||
; |
|||
;00 RS-232 |
|||
;01 TERMINAL |
|||
;02 PARALLEL PORT |
|||
;03 UNUSED |
|||
; |
|||
; DISK DEVICE IDS |
|||
; |
|||
DIODEV_MD .EQU $00 |
|||
DIODEV_FD .EQU $10 |
|||
DIODEV_RF .EQU $20 |
|||
DIODEV_IDE .EQU $30 |
|||
DIODEV_ATAPI .EQU $40 |
|||
DIODEV_PPIDE .EQU $50 |
|||
DIODEV_SD .EQU $60 |
|||
DIODEV_PRPSD .EQU $70 |
|||
DIODEV_PPPSD .EQU $80 |
|||
DIODEV_HDSK .EQU $90 |
|||
; |
|||
; VIDEO DEVICE IDS |
|||
; |
|||
VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 |
|||
VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 |
|||
VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 |
|||
VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 |
|||
VDADEV_VGA .EQU $40 ; VGA |
|||
; |
|||
; EMULATION TYPES |
|||
; |
|||
EMUTYP_NONE .EQU 0 ; NONE |
|||
EMUTYP_TTY .EQU 1 ; TTY |
|||
EMUTYP_ANSI .EQU 2 ; ANSI |
|||
; |
|||
; HBIOS CONTROL BLOCK OFFSETS |
|||
; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES |
|||
; IT IS STRONGLY RECOMMENDED THAT YOU DO NOT USE THEM! |
|||
; |
|||
HCB_LOC .EQU $100 ; LOCATION OF HCB IN HBIOS BANK |
|||
HCB_SIZ .EQU $100 ; SIZE OF HCB DATA BLOCK |
|||
; |
|||
HCB_MARKER .EQU $03 ; MARKER ('W',~'W') (WORD) |
|||
HCB_VERSION .EQU $05 ; HBIOS VERSION NUM |
|||
HCB_PLATFORM .EQU $07 ; PLATFORM ID |
|||
HCB_CPUMHZ .EQU $08 ; CPU SPEED IN MHZ (BYTE) |
|||
HCB_CPUKHZ .EQU $09 ; CPU SPEED IN KHZ (WORD) |
|||
HCB_RAMBANKS .EQU $0B ; TOTAL SIZE OF RAM IN 32K BANKS (BYTE) |
|||
HCB_ROMBANKS .EQU $0C ; TOTAL SIZE OF ROM IN 32K BANKS (BYTE) |
|||
HCB_BOOTVOL .EQU $0D ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU (WORD) |
|||
HCB_BOOTBID .EQU $0F ; BANK ID OF ROM PAGE BOOTED (BYTE) |
|||
HCB_SERDEV .EQU $10 ; PRIMARY SERIAL DEVICE/UNIT (BYTE) |
|||
HCB_CRTDEV .EQU $11 ; CRT DISPLAY DEVICE/UNIT (BYTE) |
|||
HCB_CONDEV .EQU $12 ; ACTIVE CONSOLE DEVICE/UNIT (BYTE) |
|||
;HCB_CUREMU .EQU $13 ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) |
|||
;HCB_CURVDA .EQU $14 ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) |
|||
; |
|||
HCB_HEAP .EQU $20 ; DWORD ADDRESS OF START OF HEAP |
|||
HCB_HEAPTOP .EQU $22 ; DWORD ADDRESS OF TOP OF HEAP |
|||
; |
|||
; MEMORY BANK IDS (ONE BYTE EACH) |
|||
HCB_BIDCOM .EQU $D8 ; COMMON BANK (UPPER 32K) |
|||
HCB_BIDUSR .EQU $D9 ; USER BANK (TPA) |
|||
HCB_BIDBIOS .EQU $DA ; BIOS BANK (HBIOS, UBIOS) |
|||
HCB_BIDAUX .EQU $DB ; AUX BANK (BPBIOS) |
|||
HCB_BIDRAMD0 .EQU $DC ; FIRST BANK OF RAM DRIVE |
|||
HCB_BIDRAMDN .EQU $DD ; LAST BANK OF RAM DRIVE |
|||
HCB_BIDROMD0 .EQU $DE ; FIRST BANK OF ROM DRIVE |
|||
HCB_BIDROMDN .EQU $DF ; LAST BANK OF ROM DRIVE |
|||
; |
|||
; HBIOS PROXY COMMON DATA BLOCK |
|||
; EXACTLY 32 BYTES AT $FFE0-$FFFF |
|||
; |
|||
HBX_XFC .EQU $10000 - $20 ; HBIOS PROXY INTERFACE AREA, 32 BYTES FIXED |
|||
; |
|||
HBX_XFCDAT .EQU HBX_XFC ; DATA PORTION OF HBIOS PROXY INTERFACE AREA |
|||
HB_CURBNK .EQU HBX_XFCDAT + 0 ; CURRENTLY ACTIVE LOW MEMORY BANK ID |
|||
HB_INVBNK .EQU HBX_XFCDAT + 1 ; BANK ACTIVE AT TIME OF HBIOS CALL INVOCATION |
|||
HB_SRCADR .EQU HBX_XFCDAT + 2 ; BNKCPY: DESTINATION BANK ID |
|||
HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID |
|||
HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS |
|||
HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS |
|||
HB_CPYLEN .EQU HBX_XFCDAT + 8 ; BNKCPY: COPY LENGTH |
|||
; |
|||
HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA |
|||
HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION |
|||
HB_BNKSEL .EQU HBX_XFCFNS + (1 * 3) ; SELECT LOW MEMORY BANK ID |
|||
HB_BNKCPY .EQU HBX_XFCFNS + (2 * 3) ; INTERBANK MEMORY COPY |
|||
HB_BNKCALL .EQU HBX_XFCFNS + (3 * 3) ; INTERBANK FUNCTION CALL |
|||
;HB_LOC .EQU HBX_XFCFNS + 12 ; ADDRESS OF HBIOS PROXY START (DEPRECATED) |
|||
HB_IDENT .EQU HBX_XFCFNS + 14 ; POINTER TO HBIOS IDENT DATA BLOCK |
|||
@ -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$" |
|||
Loading…
Reference in new issue