|
|
|
@ -56,6 +56,7 @@ |
|
|
|
; UNLESS FULL BLOWN INTERRUPT MODE 3 W/ NATIVE MEMORY MANAGEMENT |
|
|
|
; IS BEING USED. |
|
|
|
; |
|
|
|
;Z2U_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE |
|
|
|
Z2U_BUFSZ .EQU 128 ; RECEIVE RING BUFFER SIZE |
|
|
|
; |
|
|
|
Z2U_NONE .EQU 0 ; NOT PRESENT |
|
|
|
@ -190,16 +191,17 @@ Z2U_INTRCV1: |
|
|
|
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 |
|
|
|
;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 A,(HL) ; DEREFERENCE HL |
|
|
|
;INC HL |
|
|
|
;LD H,(HL) |
|
|
|
;LD L,A ; HL IS NOW ACTUAL HEAD PTR |
|
|
|
.DB $ED,$26 ; LD HL,(HL) ; DEREFERENCE HL, 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 |
|
|
|
@ -215,9 +217,10 @@ Z2U_INTRCV2: |
|
|
|
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 |
|
|
|
;LD (HL),E ; SAVE UPDATED HEAD PTR |
|
|
|
;INC HL |
|
|
|
;LD (HL),D |
|
|
|
.DB $ED,$1E ;LD (HL),DE ; SAVE UPDATED HEAD PTR |
|
|
|
|
|
|
|
; CHECK FOR MORE PENDING... |
|
|
|
IN A,(Z280_UARTRCTL) ; GET STATUS |
|
|
|
@ -416,11 +419,23 @@ Z2U_INITDEV: |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
Z2U_INITSAFE: |
|
|
|
LD E,%11000010 ; 8N0, DIV 16, NO C/T |
|
|
|
JR Z2U_INITDEV2 ; YES, DO IT |
|
|
|
LD A,%11000010 ; 8N0, DIV 16, NO C/T |
|
|
|
LD (Z2U_CFGREG),A ; SAVE IT |
|
|
|
JR Z2U_INITDEV8 ; DO IT |
|
|
|
; |
|
|
|
Z2U_INITDEVX: |
|
|
|
; |
|
|
|
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT) |
|
|
|
LD A,D ; TEST DE FOR |
|
|
|
AND E ; ... VALUE OF -1 |
|
|
|
INC A ; ... SO Z SET IF -1 |
|
|
|
JR NZ,Z2U_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG |
|
|
|
; |
|
|
|
; LOAD EXISTING CONFIG TO REINIT |
|
|
|
LD E,(IY+4) ; LOW BYTE |
|
|
|
LD D,(IY+5) ; HIGH BYTE |
|
|
|
; |
|
|
|
Z2U_INITDEV1: |
|
|
|
LD (Z2U_NEWCFG),DE ; SAVE NEW CONFIG |
|
|
|
LD A,D ; HIWORD OF CONFIG |
|
|
|
AND $1F ; ISOLATE BAUD RATE |
|
|
|
PUSH AF |
|
|
|
@ -430,42 +445,99 @@ Z2U_INITDEVX: |
|
|
|
LD C,75 ; BAUD RATE ENCODE CONSTANT |
|
|
|
CALL ENCODE ; C = ENCODED OSC |
|
|
|
POP DE ; D = UART OSC |
|
|
|
JR NZ,Z2U_INITFAIL ; HANDLE ENCODE FAILURE |
|
|
|
JP NZ,Z2U_INITFAIL ; HANDLE ENCODE FAILURE |
|
|
|
LD A,C ; TO A |
|
|
|
SUB D ; DIV W/ SUB OF SQUARES |
|
|
|
; REG A NOW HAS ENCODED BAUD RATE DIVISOR |
|
|
|
; |
|
|
|
PUSH AF ; SAVE IT |
|
|
|
AND $0F ; ISOLATE 2'S POWER |
|
|
|
; |
|
|
|
; Z280 UART CAN USE 16, 32, OR 64 AS BAUD RATE DIVISOR |
|
|
|
; SET E TO IMPLEMENT WHAT WE CAN |
|
|
|
LD E,%11000000 ; 8N0, DIV 1, NO C/T |
|
|
|
;JR Z2U_INITDEV2 ; *DEBUG* |
|
|
|
CP 4 ; DIV 16 POSSIBLE? |
|
|
|
JR C,Z2U_INITDEV2 ; IF NOT, SKIP AHEAD |
|
|
|
LD E,%11000010 ; 8N0, DIV 16, NO C/T |
|
|
|
CP 4 ; DIV 16? |
|
|
|
JR Z,Z2U_INITDEV2 ; YES, DO IT |
|
|
|
SUB 4 ; REFLECT IN TGT DIVISOR |
|
|
|
CP 1 ; DIV 32 POSSIBLE? |
|
|
|
JR C,Z2U_INITDEV2 ; IF NOT, SKIP AHEAD |
|
|
|
LD E,%11000100 ; 8N0, DIV 32, NO C/T |
|
|
|
CP 5 ; DIV 32? |
|
|
|
JR Z,Z2U_INITDEV2 ; YES, DO IT |
|
|
|
DEC A ; REFLECT IN TGT DIVISOR |
|
|
|
CP 1 ; DIV 64 POSSIBLE? |
|
|
|
JR C,Z2U_INITDEV2 ; IF NOT, SKIP AHEAD |
|
|
|
LD E,%11000110 ; 8N0, DIV 64, NO C/T |
|
|
|
CP 6 ; DIV 64? |
|
|
|
JR Z,Z2U_INITDEV2 ; YES, DO IT |
|
|
|
; |
|
|
|
Z2U_INITFAIL: |
|
|
|
OR $FF ; SIGNAL ERROR |
|
|
|
RET ; AND DONE |
|
|
|
DEC A |
|
|
|
; |
|
|
|
Z2U_INITDEV2: |
|
|
|
LD D,A ; 2'S POWER TO D |
|
|
|
POP AF ; RECOVER ORIGINAL VALUE |
|
|
|
AND $F0 ; MASK OFF ORIG 2'S POWER |
|
|
|
OR D ; COMBINE |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
PUSH AF ; RESAVE IT |
|
|
|
LD A,E ; GET Z280 UART CONFIG REG VAL |
|
|
|
LD (Z2U_CFGREG),A ; SAVE CONFIG REG VALUE FOR LATER |
|
|
|
POP AF ; RECOVER REMAINING ENCODED DIVISOR |
|
|
|
LD L,A ; INTO L |
|
|
|
LD H,0 ; H MUST BE ZERO |
|
|
|
LD DE,1 ; RATIO, SO NO CONSTANT |
|
|
|
CALL DECODE ; DECODE INTO DE:HL |
|
|
|
;LD HL,626 ; *DEBUG* |
|
|
|
JR NZ,Z2U_INITFAIL ; HANDLE FAILURE |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXWORDHL ; *DEBUG* |
|
|
|
; |
|
|
|
; SAVE CONFIG PERMANENTLY NOW |
|
|
|
LD DE,(Z2U_NEWCFG) ; GET NEW CONFIG BACK |
|
|
|
LD (IY+4),E ; SAVE LOW WORD |
|
|
|
LD (IY+5),D ; SAVE HI WORD |
|
|
|
; |
|
|
|
Z2U_INITDEV8: |
|
|
|
; START BY SELECTING I/O PAGE $FE |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
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 |
|
|
|
POP HL ; RESTORE HL |
|
|
|
; |
|
|
|
DEC HL ; ADJUST FOR T/C |
|
|
|
LD A,H ; TEST FOR |
|
|
|
OR L ; ... ZERO |
|
|
|
JR Z,Z2U_INITDEV9 ; IF ZERO, SKIP C/T |
|
|
|
; |
|
|
|
; SETUP |
|
|
|
;LD A,%11000010 ; 8N0, DIV 16, NO C/T |
|
|
|
LD A,E ; CONFIG VALUE |
|
|
|
; PROGRAM C/T 1 |
|
|
|
#IF Z2UOSCEXT |
|
|
|
LD A,%10001100 ; CONFIG: C, RE, COUNTER |
|
|
|
#ELSE |
|
|
|
LD A,%10001000 ; CONFIG: C, RE, COUNTER |
|
|
|
#ENDIF |
|
|
|
OUT (Z280_CT1_CFG),A ; SET C/T 1 |
|
|
|
LD C,Z280_CT1_TC ; SET C/T 1 FROM HL |
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
LD C,Z280_CT1_CT ; SET C/T 1 FROM HL |
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
LD A,%11100000 ; CMD: EN, GT, TG |
|
|
|
OUT (Z280_CT1_CMDST),A ; SET C/T 1 |
|
|
|
; |
|
|
|
; MODIFY CFG REG VALUE TO USE C/T |
|
|
|
LD A,(Z2U_CFGREG) ; CONFIG VALUE |
|
|
|
SET 3,A ; SET C/T USAGE BIT |
|
|
|
LD (Z2U_CFGREG),A ; SAVE IT |
|
|
|
; |
|
|
|
Z2U_INITDEV9: |
|
|
|
; PROGRAM THE UART |
|
|
|
LD A,(Z2U_CFGREG) ; CONFIG VALUE |
|
|
|
OUT (Z280_UARTCFG),A ; SET CONFIG REGISTER |
|
|
|
LD A,%10000000 ; ENABLE, NO INTS, 1 STOP BITS |
|
|
|
OUT (Z280_UARTXCTL),A ; SET CONFIG REGISTER |
|
|
|
OUT (Z280_UARTXCTL),A ; SET XMIT CTL REGISTER |
|
|
|
#IF (INTMODE == 3) |
|
|
|
LD A,%11000000 ; ENABLE W/ INTS |
|
|
|
LD A,%11000000 ; ENABLE W/ RCV INTS |
|
|
|
#ELSE |
|
|
|
LD A,%10000000 ; ENABLE, NO INTS |
|
|
|
LD A,%10000000 ; ENABLE, NO RCV INTS |
|
|
|
#ENDIF |
|
|
|
OUT (Z280_UARTRCTL),A ; SET CONFIG REGISTER |
|
|
|
OUT (Z280_UARTRCTL),A ; SET RCV CTL REGISTER |
|
|
|
; |
|
|
|
; RESTORE I/O PAGE TO $00 |
|
|
|
LD L,$00 ; NORMAL I/O REG IS $00 |
|
|
|
@ -496,9 +568,14 @@ Z2U_INITDEV2: |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; RETURN SUCCESS |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
Z2U_INITFAIL: |
|
|
|
OR $FF ; SIGNAL ERROR |
|
|
|
RET ; AND DONE |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
Z2U_QUERY: |
|
|
|
@ -552,7 +629,9 @@ Z2U_PRTCFG: |
|
|
|
; |
|
|
|
; WORKING VARIABLES |
|
|
|
; |
|
|
|
Z2U_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|
|
|
Z2U_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|
|
|
Z2U_CFGREG .DB 0 ; VALUE TO PROGRAM CFG REG |
|
|
|
Z2U_NEWCFG .DW 0 ; TEMP STORE FOR NEW CFG |
|
|
|
; |
|
|
|
#IF (INTMODE < 3) |
|
|
|
; |
|
|
|
|