@ -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 , $ 1 E ;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 $ 1 F ; 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 $ 0 F ; 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 , $ 6 E ; 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 )
;