mirror of https://github.com/wwarthen/RomWBW.git
committed by
GitHub
21 changed files with 644 additions and 8 deletions
@ -0,0 +1,561 @@ |
|||
; |
|||
;================================================================================================== |
|||
; Z280 UART DRIVER (Z280 BUILT-IN UART) |
|||
;================================================================================================== |
|||
; |
|||
; SETUP PARAMETER WORD: |
|||
; +-------+---+-------------------+ +---+---+-----------+---+-------+ |
|||
; | |RTS| ENCODED BAUD RATE | |DTR|XON| PARITY |STP| 8/7/6 | |
|||
; +-------+---+---+---------------+ ----+---+-----------+---+-------+ |
|||
; F E D C B A 9 8 7 6 5 4 3 2 1 0 |
|||
; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- |
|||
; |
|||
; CONFIG ($FE__10): |
|||
; 7 6 5 4 3 2 1 0 |
|||
; 1 1 0 0 0 0 1 0 DEFAULT VALUES |
|||
; | | | | | | | | |
|||
; | | | | | | | | |
|||
; | | | | | | | +-- LB: LOOP BACK ENABLE |
|||
; | | | | | + +---- CR: CLOCK RATE |
|||
; | | | | +-------- CS: CLOCK SELECT |
|||
; | | | +---------- E/O: EVEN/ODD |
|||
; | | +------------ P: PARITY |
|||
; + +-------------- B/C: BITS PER CHARACTER |
|||
; |
|||
; TRANSMITTER CONTROL/STATUS REGISTER ($FE__12) |
|||
; 7 6 5 4 3 2 1 0 |
|||
; 1 0 0 0 0 0 0 0 DEFAULT VALUES |
|||
; | | | | | | | | |
|||
; | | | | | | | +-- BE: BUFFER EMPTY |
|||
; | | | | | | +---- VAL: VALUE |
|||
; | | | | | +------ FRC: FORCE CHARACTER |
|||
; | | | | +-------- BRK: SEND BREAK |
|||
; | | | +---------- SB: STOP BITS |
|||
; | | +------------ 0: RESERVED (SET TO 0) |
|||
; | +-------------- IE: XMIT INT ENBABLE |
|||
; +---------------- EN: TRANSMITTER ENABLE |
|||
; |
|||
; RECEIVER CONTROL/STATUS REGISTER ($FE__14) |
|||
; 7 6 5 4 3 2 1 0 |
|||
; 1 0 0 0 0 0 0 0 DEFAULT VALUES |
|||
; | | | | | | | | |
|||
; | | | | | | | +-- ERR: LOGICAL OR OF (OVE, PE, FE) |
|||
; | | | | | | +---- OVE: OVERRUN ERROR |
|||
; | | | | | +------ PE: PARITY ERROR |
|||
; | | | | +-------- FE: FRAMING ERROR |
|||
; | | | +---------- CA: RECEIVE CHAR AVAILABLE |
|||
; | | +------------ 0: RESERVED (SET TO 0) |
|||
; | +-------------- IE: RECEIVER INT ENBABLE |
|||
; +---------------- EN: RECEIVER ENABLE |
|||
; |
|||
; THE Z280 UART USES MODE 3 INTERRUPT PROCESSING REGARDLESS OF THE INT |
|||
; MODE SETTING. SINCE MODE 3 REQUIRES A LARGE INTERRUPT VECTOR TABLE |
|||
; AND THAT TABLE MUST BE ACCESSIBLE WITHOUT USING EXTERNAL BANK |
|||
; SWITCHING, IT IS IMPRACTICAL TO SUPPORT THIS UART UNLESS NATIVE |
|||
; Z280 MEMORY MANAGEMENT IS IN USE. |
|||
; |
|||
#IF (MEMMGR != MM_Z280) |
|||
.ECHO "*** ERROR: Z280 UART REQUIRES NATIVE MEMORY MANAGER!!!\n" |
|||
!!! ; FORCE AN ASSEMBLY ERROR |
|||
#ENDIF |
|||
; |
|||
Z2U_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE |
|||
; |
|||
Z2U_NONE .EQU 0 ; NOT PRESENT |
|||
Z2U_PRESENT .EQU 1 ; PRESENT |
|||
; |
|||
; |
|||
; |
|||
Z2U_PREINIT: |
|||
; |
|||
; SETUP THE DISPATCH TABLE ENTRIES |
|||
; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMAIN |
|||
; DISABLED. |
|||
; |
|||
LD B,Z2U_CFGCNT ; LOOP CONTROL |
|||
XOR A ; ZERO TO ACCUM |
|||
LD (Z2U_DEV),A ; CURRENT DEVICE NUMBER |
|||
LD IY,Z2U_CFG ; POINT TO START OF CFG TABLE |
|||
Z2U_PREINIT0: |
|||
PUSH BC ; SAVE LOOP CONTROL |
|||
CALL Z2U_INITUNIT ; HAND OFF TO GENERIC INIT CODE |
|||
POP BC ; RESTORE LOOP CONTROL |
|||
; |
|||
LD A,(IY+1) ; GET THE Z280 UART TYPE DETECTED |
|||
OR A ; SET FLAGS |
|||
JR Z,Z2U_PREINIT2 ; SKIP IT IF NOTHING FOUND |
|||
; |
|||
PUSH BC ; SAVE LOOP CONTROL |
|||
PUSH IY ; CFG ENTRY ADDRESS |
|||
POP DE ; ... TO DE |
|||
LD BC,Z2U_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|||
CALL NZ,CIO_ADDENT ; ADD ENTRY IF Z2U FOUND, BC:DE |
|||
POP BC ; RESTORE LOOP CONTROL |
|||
; |
|||
Z2U_PREINIT2: |
|||
LD DE,Z2U_CFGSIZ ; SIZE OF CFG ENTRY |
|||
ADD IY,DE ; BUMP IY TO NEXT ENTRY |
|||
DJNZ Z2U_PREINIT0 ; LOOP UNTIL DONE |
|||
; |
|||
#IF (INTMODE > 0) |
|||
; SETUP INT VECTORS AS APPROPRIATE |
|||
LD A,(Z2U_DEV) ; GET DEVICE COUNT |
|||
OR A ; SET FLAGS |
|||
JR Z,Z2U_PREINIT3 ; IF ZERO, NO Z2U DEVICES, ABORT |
|||
; |
|||
LD HL,Z2U_INT ; GET INT VECTOR |
|||
LD (Z280_IVT+$36),HL ; SET IT |
|||
#ENDIF |
|||
; |
|||
Z2U_PREINIT3: |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; AND RETURN |
|||
; |
|||
; Z280 UART INITIALIZATION ROUTINE |
|||
; |
|||
Z2U_INITUNIT: |
|||
CALL Z2U_DETECT ; DETERMINE Z280 UART TYPE |
|||
LD (IY+1),A ; SAVE IN CONFIG TABLE |
|||
OR A ; SET FLAGS |
|||
RET Z ; ABORT IF NOTHING THERE |
|||
|
|||
; UPDATE WORKING Z280 UART DEVICE NUM |
|||
LD HL,Z2U_DEV ; POINT TO CURRENT UART DEVICE NUM |
|||
LD A,(HL) ; PUT IN ACCUM |
|||
INC (HL) ; INCREMENT IT (FOR NEXT LOOP) |
|||
LD (IY),A ; UPDATE UNIT NUM |
|||
; |
|||
; IT IS EASY TO SPECIFY A SERIAL CONFIG THAT CANNOT BE IMPLEMENTED |
|||
; DUE TO THE CONSTRAINTS OF THE Z280 UART. HERE WE FORCE A GENERIC |
|||
; FAILSAFE CONFIG ONTO THE CHANNEL. IF THE SUBSEQUENT "REAL" |
|||
; CONFIG FAILS, AT LEAST THE CHIP WILL BE ABLE TO SPIT DATA OUT |
|||
; AT A RATIONAL BAUD/DATA/PARITY/STOP CONFIG. |
|||
CALL Z2U_INITSAFE |
|||
; |
|||
; SET DEFAULT CONFIG |
|||
LD DE,-1 ; LEAVE CONFIG ALONE |
|||
; CALL INITDEV TO IMPLEMENT CONFIG, BUT NOTE THAT WE CALL |
|||
; THE INITDEVX ENTRY POINT THAT DOES NOT ENABLE/DISABLE INTS! |
|||
JP Z2U_INITDEVX ; IMPLEMENT IT AND RETURN |
|||
; |
|||
; |
|||
; |
|||
Z2U_INIT: |
|||
LD B,Z2U_CFGCNT ; COUNT OF POSSIBLE Z2U UNITS |
|||
LD IY,Z2U_CFG ; POINT TO START OF CFG TABLE |
|||
Z2U_INIT1: |
|||
PUSH BC ; SAVE LOOP CONTROL |
|||
LD A,(IY+1) ; GET Z2U TYPE |
|||
OR A ; SET FLAGS |
|||
CALL NZ,Z2U_PRTCFG ; PRINT IF NOT ZERO |
|||
POP BC ; RESTORE LOOP CONTROL |
|||
LD DE,Z2U_CFGSIZ ; SIZE OF CFG ENTRY |
|||
ADD IY,DE ; BUMP IY TO NEXT ENTRY |
|||
DJNZ Z2U_INIT1 ; LOOP TILL DONE |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; DONE |
|||
; |
|||
; RECEIVE INTERRUPT HANDLER |
|||
; |
|||
#IF (INTMODE > 0) |
|||
; |
|||
; INT ENTRY POINT |
|||
; |
|||
Z2U_INT: |
|||
; DISCARD REASON CODE |
|||
INC SP |
|||
INC SP |
|||
; |
|||
; SAVE REGISTERS |
|||
PUSH AF |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
; |
|||
; START BY SELECTING I/O PAGE $FE |
|||
LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE |
|||
IN A,(Z280_UARTRCTL) ; GET STATUS |
|||
AND $10 ; ISOLATE CHAR AVAILABLE BIT |
|||
JR Z,Z2U_INTRCV4 ; IF NOT, BAIL OUT |
|||
; |
|||
Z2U_INTRCV1: |
|||
; RECEIVE CHARACTER INTO BUFFER |
|||
IN A,(Z280_UARTRECV) ; GET A BYTE |
|||
LD B,A ; SAVE BYTE READ |
|||
LD HL,Z2U0_RCVBUF ; SET HL TO START OF BUFFER STRUCT |
|||
LD A,(HL) ; GET COUNT |
|||
CP Z2U_BUFSZ ; COMPARE TO BUFFER SIZE |
|||
JR Z,Z2U_INTRCV4 ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED |
|||
INC A ; INCREMENT THE COUNT |
|||
LD (HL),A ; AND SAVE IT |
|||
CP Z2U_BUFSZ / 2 ; BUFFER GETTING FULL? |
|||
JR NZ,Z2U_INTRCV2 ; IF NOT, BYPASS CLEARING RTS |
|||
; THIS IS WHERE WE SHOULD DEASSERT RTS, BUT THE Z2U HAS NONE |
|||
Z2U_INTRCV2: |
|||
INC HL ; HL NOW HAS ADR OF HEAD PTR |
|||
PUSH HL ; SAVE ADR OF HEAD PTR |
|||
LD A,(HL) ; DEREFERENCE HL |
|||
INC HL |
|||
LD H,(HL) |
|||
LD L,A ; HL IS NOW ACTUAL HEAD PTR |
|||
LD (HL),B ; SAVE CHARACTER RECEIVED IN BUFFER AT HEAD |
|||
INC HL ; BUMP HEAD POINTER |
|||
POP DE ; RECOVER ADR OF HEAD PTR |
|||
LD A,L ; GET LOW BYTE OF HEAD PTR |
|||
SUB Z2U_BUFSZ+4 ; SUBTRACT SIZE OF BUFFER AND POINTER |
|||
CP E ; IF EQUAL TO START, HEAD PTR IS PAST BUF END |
|||
JR NZ,Z2U_INTRCV3 ; IF NOT, BYPASS |
|||
LD H,D ; SET HL TO |
|||
LD L,E ; ... HEAD PTR ADR |
|||
INC HL ; BUMP PAST HEAD PTR |
|||
INC HL |
|||
INC HL |
|||
INC HL ; ... SO HL NOW HAS ADR OF ACTUAL BUFFER START |
|||
Z2U_INTRCV3: |
|||
EX DE,HL ; DE := HEAD PTR VAL, HL := ADR OF HEAD PTR |
|||
LD (HL),E ; SAVE UPDATED HEAD PTR |
|||
INC HL |
|||
LD (HL),D |
|||
|
|||
; CHECK FOR MORE PENDING... |
|||
IN A,(Z280_UARTRCTL) ; GET STATUS |
|||
AND $10 ; ISOLATE CHAR AVAILABLE BIT |
|||
JR NZ,Z2U_INTRCV1 |
|||
; |
|||
Z2U_INTRCV4: |
|||
; RESTORE I/O PAGE TO $00 |
|||
LD L,$00 ; NORMAL I/O REG IS $00 |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; RESTORE REGISTERS |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
POP AF |
|||
; |
|||
.DB $ED,$55 ; RETIL |
|||
#ENDIF |
|||
; |
|||
; DRIVER FUNCTION TABLE |
|||
; |
|||
Z2U_FNTBL: |
|||
.DW Z2U_IN |
|||
.DW Z2U_OUT |
|||
.DW Z2U_IST |
|||
.DW Z2U_OST |
|||
.DW Z2U_INITDEV |
|||
.DW Z2U_QUERY |
|||
.DW Z2U_DEVICE |
|||
#IF (($ - Z2U_FNTBL) != (CIO_FNCNT * 2)) |
|||
.ECHO "*** INVALID Z2U FUNCTION TABLE ***\n" |
|||
#ENDIF |
|||
; |
|||
#IF (INTMODE == 0) |
|||
; |
|||
Z2U_IN: |
|||
CALL Z2U_IST ; CHECK FOR CHAR READY |
|||
JR Z,Z2U_IN ; IF NOT, LOOP |
|||
; |
|||
; START BY SELECTING I/O PAGE $FE |
|||
LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; GET CHAR |
|||
IN A,(Z280_UARTRECV) ; GET A BYTE |
|||
LD E,A ; PUT IN E FOR RETURN |
|||
; |
|||
; RESTORE I/O PAGE TO $00 |
|||
LD L,$00 ; NORMAL I/O REG IS $00 |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; DONE |
|||
; |
|||
#ELSE |
|||
; |
|||
Z2U_IN: |
|||
CALL Z2U_IST ; SEE IF CHAR AVAILABLE |
|||
JR Z,Z2U_IN ; LOOP UNTIL SO |
|||
HB_DI ; AVOID COLLISION WITH INT HANDLER |
|||
LD L,(IY+6) ; SET HL TO |
|||
LD H,(IY+7) ; ... START OF BUFFER STRUCT |
|||
LD A,(HL) ; GET COUNT |
|||
DEC A ; DECREMENT COUNT |
|||
LD (HL),A ; SAVE UPDATED COUNT |
|||
; THIS IS WHERE WE SHOULD ASSERT RTS, BUT THE Z2U HAS NONE |
|||
Z2U_IN1: |
|||
INC HL ; HL := ADR OF TAIL PTR |
|||
INC HL ; " |
|||
INC HL ; " |
|||
PUSH HL ; SAVE ADR OF TAIL PTR |
|||
LD A,(HL) ; DEREFERENCE HL |
|||
INC HL |
|||
LD H,(HL) |
|||
LD L,A ; HL IS NOW ACTUAL TAIL PTR |
|||
LD C,(HL) ; C := CHAR TO BE RETURNED |
|||
INC HL ; BUMP TAIL PTR |
|||
POP DE ; RECOVER ADR OF TAIL PTR |
|||
LD A,L ; GET LOW BYTE OF TAIL PTR |
|||
SUB Z2U_BUFSZ+2 ; SUBTRACT SIZE OF BUFFER AND POINTER |
|||
CP E ; IF EQUAL TO START, TAIL PTR IS PAST BUF END |
|||
JR NZ,Z2U_IN2 ; IF NOT, BYPASS |
|||
LD H,D ; SET HL TO |
|||
LD L,E ; ... TAIL PTR ADR |
|||
INC HL ; BUMP PAST TAIL PTR |
|||
INC HL ; ... SO HL NOW HAS ADR OF ACTUAL BUFFER START |
|||
Z2U_IN2: |
|||
EX DE,HL ; DE := TAIL PTR VAL, HL := ADR OF TAIL PTR |
|||
LD (HL),E ; SAVE UPDATED TAIL PTR |
|||
INC HL ; " |
|||
LD (HL),D ; " |
|||
LD E,C ; MOVE CHAR TO RETURN TO E |
|||
HB_EI ; INTERRUPTS OK AGAIN |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; AND DONE |
|||
; |
|||
#ENDIF |
|||
; |
|||
; |
|||
; |
|||
Z2U_OUT: |
|||
CALL Z2U_OST ; CHECK IF OUTPUT REGISTER READY |
|||
JR Z,Z2U_OUT ; LOOP UNTIL SO |
|||
; |
|||
; START BY SELECTING I/O PAGE $FE |
|||
LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; WRITE CHAR |
|||
LD A,E ; BYTE TO A |
|||
OUT (Z280_UARTXMIT),A ; SEND IT |
|||
; |
|||
; RESTORE I/O PAGE TO $00 |
|||
LD L,$00 ; NORMAL I/O REG IS $00 |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; DONE |
|||
; |
|||
; |
|||
; |
|||
#IF (INTMODE == 0) |
|||
; |
|||
Z2U_IST: |
|||
; |
|||
; START BY SELECTING I/O PAGE $FE |
|||
LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; GET RECEIVE STATUS |
|||
IN A,(Z280_UARTRCTL) ; GET STATUS |
|||
AND $10 ; ISOLATE CHAR AVAILABLE BIT |
|||
; |
|||
; RESTORE I/O PAGE TO $00 |
|||
LD L,$00 ; NORMAL I/O REG IS $00 |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
OR A ; SET FLAGS |
|||
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|||
RET |
|||
; |
|||
#ELSE |
|||
; |
|||
Z2U_IST: |
|||
LD L,(IY+6) ; GET ADDRESS |
|||
LD H,(IY+7) ; ... OF RECEIVE BUFFER |
|||
LD A,(HL) ; BUFFER UTILIZATION COUNT |
|||
OR A ; SET FLAGS |
|||
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|||
RET ; DONE |
|||
; |
|||
#ENDIF |
|||
; |
|||
; |
|||
; |
|||
Z2U_OST: |
|||
; |
|||
; START BY SELECTING I/O PAGE $FE |
|||
LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; GET TRANSMIT STATUS |
|||
IN A,(Z280_UARTXCTL) ; GET STATUS |
|||
; |
|||
; RESTORE I/O PAGE TO $00 |
|||
LD L,$00 ; NORMAL I/O REG IS $00 |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; CHECK FOR CHAR AVAILABLE |
|||
AND $01 ; ISOLATE CHAR AVAILABLE BIT |
|||
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|||
RET ; DONE |
|||
; |
|||
; AT INITIALIZATION THE SETUP PARAMETER WORD IS TRANSLATED TO THE FORMAT |
|||
; REQUIRED BY THE Z2U AND STORED IN A PORT/REGISTER INITIALIZATION TABLE, |
|||
; WHICH IS THEN LOADED INTO THE Z2U. |
|||
; |
|||
; NOTE THAT THERE ARE TWO ENTRY POINTS. INITDEV WILL DISABLE/ENABLE INTS |
|||
; AND INITDEVX WILL NOT. THIS IS DONE SO THAT THE PREINIT ROUTINE ABOVE |
|||
; CAN AVOID ENABLING/DISABLING INTS. |
|||
; |
|||
Z2U_INITDEV: |
|||
Z2U_INITSAFE: |
|||
HB_DI ; DISABLE INTS |
|||
CALL Z2U_INITDEVX ; DO THE WORK |
|||
HB_EI ; INTS BACK ON |
|||
RET ; DONE |
|||
; |
|||
Z2U_INITDEVX: |
|||
; |
|||
; START BY SELECTING I/O PAGE $FE |
|||
LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
; SETUP |
|||
LD A,%11000010 ; 8N0, DIV 16, NO C/T |
|||
OUT (Z280_UARTCFG),A ; SET CONFIG REGISTER |
|||
LD A,%10000000 ; ENABLE, NO INTS, 1 STOP BITS |
|||
OUT (Z280_UARTXCTL),A ; SET CONFIG REGISTER |
|||
#IF (INTMODE > 0) |
|||
LD A,%11000000 ; ENABLE W/ INTS |
|||
#ELSE |
|||
LD A,%10000000 ; ENABLE, NO INTS |
|||
#ENDIF |
|||
OUT (Z280_UARTRCTL),A ; SET CONFIG REGISTER |
|||
; |
|||
; RESTORE I/O PAGE TO $00 |
|||
LD L,$00 ; NORMAL I/O REG IS $00 |
|||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|||
.DB $ED,$6E ; LDCTL (C),HL |
|||
; |
|||
#IF (INTMODE > 0) |
|||
; |
|||
; RESET THE RECEIVE BUFFER |
|||
LD E,(IY+6) |
|||
LD D,(IY+7) ; DE := _CNT |
|||
XOR A ; A := 0 |
|||
LD (DE),A ; _CNT = 0 |
|||
INC DE ; DE := ADR OF _HD |
|||
PUSH DE ; SAVE IT |
|||
INC DE |
|||
INC DE |
|||
INC DE |
|||
INC DE ; DE := ADR OF _BUF |
|||
POP HL ; HL := ADR OF _HD |
|||
LD (HL),E |
|||
INC HL |
|||
LD (HL),D ; _HD := _BUF |
|||
INC HL |
|||
LD (HL),E |
|||
INC HL |
|||
LD (HL),D ; _TL := _BUF |
|||
; |
|||
#ENDIF |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; DONE |
|||
; |
|||
; |
|||
; |
|||
Z2U_QUERY: |
|||
LD E,(IY+4) ; FIRST CONFIG BYTE TO E |
|||
LD D,(IY+5) ; SECOND CONFIG BYTE TO D |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; DONE |
|||
; |
|||
; |
|||
; |
|||
Z2U_DEVICE: |
|||
LD D,CIODEV_Z2U ; D := DEVICE TYPE |
|||
LD E,(IY) ; E := PHYSICAL UNIT |
|||
LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 |
|||
LD H,0 ; H := 0, DRIVER HAS NO MODES |
|||
LD L,(IY+3) ; L := BASE I/O ADDRESS |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; Z280 UART DETECTION ROUTINE |
|||
; ALWAYS PRESENT, JUST SAY SO. |
|||
; |
|||
Z2U_DETECT: |
|||
LD A,Z2U_PRESENT ; PRESENT |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
Z2U_PRTCFG: |
|||
; ANNOUNCE PORT |
|||
CALL NEWLINE ; FORMATTING |
|||
PRTS("Z2U$") ; 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 |
|||
; |
|||
; ALL DONE IF NO Z2U WAS DETECTED |
|||
LD A,(IY+1) ; GET Z2U 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_PRTSC0 ; PRINT CONFIG |
|||
; |
|||
XOR A |
|||
RET |
|||
; |
|||
; WORKING VARIABLES |
|||
; |
|||
Z2U_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|||
; |
|||
#IF (INTMODE == 0) |
|||
; |
|||
Z2U0_RCVBUF .EQU 0 |
|||
; |
|||
#ELSE |
|||
; |
|||
; RECEIVE BUFFERS |
|||
; |
|||
Z2U0_RCVBUF: |
|||
Z2U0_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER |
|||
Z2U0_HD .DW Z2U0_BUF ; BUFFER HEAD POINTER |
|||
Z2U0_TL .DW Z2U0_BUF ; BUFFER TAIL POINTER |
|||
Z2U0_BUF .FILL 32,0 ; RECEIVE RING BUFFER |
|||
Z2U0_BUFEND .EQU $ ; END OF BUFFER |
|||
Z2U0_BUFSZ .EQU $ - Z2U0_BUF ; SIZE OF RING BUFFER |
|||
; |
|||
#ENDIF |
|||
; |
|||
; Z2U PORT TABLE |
|||
; |
|||
Z2U_CFG: |
|||
; |
|||
Z2U0_CFG: |
|||
; Z2U CONFIG |
|||
.DB 0 ; DEVICE NUMBER (SET DURING INIT) |
|||
.DB 0 ; Z280 UART TYPE (SET DURING INIT) |
|||
.DB 0 ; MODULE ID |
|||
.DB Z2U0BASE ; BASE PORT |
|||
.DW Z2U0CFG ; LINE CONFIGURATION |
|||
.DW Z2U0_RCVBUF ; POINTER TO RCV BUFFER STRUCT |
|||
; |
|||
Z2U_CFGSIZ .EQU $ - Z2U_CFG ; SIZE OF ONE CFG TABLE ENTRY |
|||
; |
|||
Z2U_CFGCNT .EQU ($ - Z2U_CFG) / Z2U_CFGSIZ |
|||
Loading…
Reference in new issue