acia - whitespace

This commit is contained in:
Phillip Stevens
2021-02-09 16:44:05 +11:00
parent 0fa5ef45e2
commit bec1c46d21

View File

@@ -25,37 +25,37 @@
; | RIE | TC2 | TC1 | WS3 | WS2 | WS1 | CDS2 | CDS1 |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; RIE: RECEIVE INTERRUPT ENABLE (RECEIVE DATA REGISTER FULL)
; RIE: RECEIVE INTERRUPT ENABLE (RECEIVE DATA REGISTER FULL)
;
; TC: TRANSMIT CONTROL (TRANSMIT DATA REGISTER EMPTY)
; 0 0 - /RTS=LOW, TDRE INT DISABLED
; 0 1 - /RTS=LOW, TDRE INT ENABLED
; 1 0 - /RTS=HIGH, TDRE INT DISABLED
; 1 1 - /RTS=LOW, TRANSMIT BREAK, TDRE INT DISABLED
;
; WS: WORD SELECT (DATA BITS, PARITY, STOP BITS)
; 0 0 0 - 7,E,2
; 0 0 1 - 7,O,2
; 0 1 0 - 7,E,1
; 0 1 1 - 7,O,1
; 1 0 0 - 8,N,2
; 1 0 1 - 8,N,1
; 1 1 0 - 8,E,1
; 1 1 1 - 8,O,1
; TC: TRANSMIT CONTROL (TRANSMIT DATA REGISTER EMPTY)
; 0 0 - /RTS=LOW, TDRE INT DISABLED
; 0 1 - /RTS=LOW, TDRE INT ENABLED
; 1 0 - /RTS=HIGH, TDRE INT DISABLED
; 1 1 - /RTS=LOW, TRANSMIT BREAK, TDRE INT DISABLED
;
; WS: WORD SELECT (DATA BITS, PARITY, STOP BITS)
; 0 0 0 - 7,E,2
; 0 0 1 - 7,O,2
; 0 1 0 - 7,E,1
; 0 1 1 - 7,O,1
; 1 0 0 - 8,N,2
; 1 0 1 - 8,N,1
; 1 1 0 - 8,E,1
; 1 1 1 - 8,O,1
;
; CDS: COUNTER DIVIDE SELECT
; 0 0 - DIVIDE BY 1
; 0 1 - DIVIDE BY 16
; 1 0 - DIVIDE BY 64
; 1 1 - MASTER RESET
; CDS: COUNTER DIVIDE SELECT
; 0 0 - DIVIDE BY 1
; 0 1 - DIVIDE BY 16
; 1 0 - DIVIDE BY 64
; 1 1 - MASTER RESET
;
ACIA_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE
ACIA_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE
;
ACIA_NONE .EQU 0
ACIA_ACIA .EQU 1
;
ACIA_RTSON .EQU %00000000 ; BIT MASK TO ASSERT RTS
ACIA_RTSOFF .EQU %01000000 ; BIT MASK TO DEASSERT RTS
ACIA_RTSON .EQU %00000000 ; BIT MASK TO ASSERT RTS
ACIA_RTSOFF .EQU %01000000 ; BIT MASK TO DEASSERT RTS
;
#IF (INTMODE > 1)
.ECHO "*** ERROR: UNSUPPORTED INTMODE FOR ACIA DRIVER!!!\n"
@@ -70,34 +70,34 @@ ACIA_PREINIT:
; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN
; DISABLED.
;
LD B,ACIA_CFGCNT ; LOOP CONTROL
LD B,ACIA_CFGCNT ; LOOP CONTROL
XOR A ; ZERO TO ACCUM
LD (ACIA_DEV),A ; CURRENT DEVICE NUMBER
LD IY,ACIA_CFG ; POINT TO START OF CFG TABLE
LD IY,ACIA_CFG ; POINT TO START OF CFG TABLE
ACIA_PREINIT0:
PUSH BC ; SAVE LOOP CONTROL
CALL ACIA_INITUNIT ; HAND OFF TO GENERIC INIT CODE
POP BC ; RESTORE LOOP CONTROL
PUSH BC ; SAVE LOOP CONTROL
CALL ACIA_INITUNIT ; HAND OFF TO GENERIC INIT CODE
POP BC ; RESTORE LOOP CONTROL
;
LD A,(IY+1) ; GET THE ACIA TYPE DETECTED
OR A ; SET FLAGS
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND
;
PUSH BC ; SAVE LOOP CONTROL
PUSH IY ; CFG ENTRY ADDRESS
POP DE ; ... TO DE
LD BC,ACIA_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF ACIA FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL
LD A,(IY+1) ; GET THE ACIA TYPE DETECTED
OR A ; SET FLAGS
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND
;
PUSH BC ; SAVE LOOP CONTROL
PUSH IY ; CFG ENTRY ADDRESS
POP DE ; ... TO DE
LD BC,ACIA_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF ACIA FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL
;
ACIA_PREINIT2:
LD DE,ACIA_CFGSIZ ; SIZE OF CFG ENTRY
ADD IY,DE ; BUMP IY TO NEXT ENTRY
DJNZ ACIA_PREINIT0 ; LOOP UNTIL DONE
ACIA_PREINIT2:
LD DE,ACIA_CFGSIZ ; SIZE OF CFG ENTRY
ADD IY,DE ; BUMP IY TO NEXT ENTRY
DJNZ ACIA_PREINIT0 ; LOOP UNTIL DONE
;
ACIA_PREINIT3:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
; ACIA INITIALIZATION ROUTINE
;
@@ -115,22 +115,22 @@ ACIA_INITUNIT:
;
#IF (INTMODE == 1)
; ADD IM1 INT CALL LIST ENTRY
LD L,(IY+8) ; GET INT HANDLER PTR
LD H,(IY+9) ; ... INTO HL
LD L,(IY+8) ; GET INT HANDLER PTR
LD H,(IY+9) ; ... INTO HL
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
#ENDIF
;
#IF (INTMODE > 1)
.ECHO "*** ERROR: ACIA DEVICE DOES NOT SUPPORT INTMODE 2!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
.ECHO "*** ERROR: ACIA DEVICE DOES NOT SUPPORT INTMODE 2!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
#ENDIF
;
; IT IS EASY TO SPECIFY A SERIAL CONFIG THAT CANNOT BE IMPLEMENTED
; DUE TO THE CONSTRAINTS OF THE ACIA. 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 ACIA_INITSAFE
; IT IS EASY TO SPECIFY A SERIAL CONFIG THAT CANNOT BE IMPLEMENTED
; DUE TO THE CONSTRAINTS OF THE ACIA. 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 ACIA_INITSAFE
;
; SET DEFAULT CONFIG
LD DE,-1 ; LEAVE CONFIG ALONE
@@ -141,20 +141,20 @@ ACIA_INITUNIT:
;
;
ACIA_INIT:
LD B,ACIA_CFGCNT ; COUNT OF POSSIBLE ACIA UNITS
LD IY,ACIA_CFG ; POINT TO START OF CFG TABLE
LD B,ACIA_CFGCNT ; COUNT OF POSSIBLE ACIA UNITS
LD IY,ACIA_CFG ; POINT TO START OF CFG TABLE
ACIA_INIT1:
PUSH BC ; SAVE LOOP CONTROL
LD A,(IY+1) ; GET ACIA TYPE
OR A ; SET FLAGS
CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO
POP BC ; RESTORE LOOP CONTROL
LD DE,ACIA_CFGSIZ ; SIZE OF CFG ENTRY
ADD IY,DE ; BUMP IY TO NEXT ENTRY
DJNZ ACIA_INIT1 ; LOOP TILL DONE
PUSH BC ; SAVE LOOP CONTROL
LD A,(IY+1) ; GET ACIA TYPE
OR A ; SET FLAGS
CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO
POP BC ; RESTORE LOOP CONTROL
LD DE,ACIA_CFGSIZ ; SIZE OF CFG ENTRY
ADD IY,DE ; BUMP IY TO NEXT ENTRY
DJNZ ACIA_INIT1 ; LOOP TILL DONE
;
XOR A ; SIGNAL SUCCESS
RET ; DONE
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
; INTERRUPT HANDLERS
;
@@ -165,21 +165,21 @@ ACIA_INIT1:
;
ACIA0_INT:
ACIA1_INT:
CALL PANIC
CALL PANIC
;
#ENDIF
;
#IF (INTMODE > 0)
;
ACIA0_INT:
LD IY,ACIA0_CFG ; POINT TO ACIA0 CFG
JR ACIA_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN
LD IY,ACIA0_CFG ; POINT TO ACIA0 CFG
JR ACIA_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN
;
#IF (ACIACNT >= 2)
;
ACIA1_INT:
LD IY,ACIA1_CFG ; POINT TO ACIA1 CFG
JR ACIA_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN
LD IY,ACIA1_CFG ; POINT TO ACIA1 CFG
JR ACIA_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN
;
#ENDIF
;
@@ -187,62 +187,62 @@ ACIA1_INT:
; BASED ON UNIT CFG POINTED TO BY IY
;
ACIA_INTRCV:
; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE
LD C,(IY+3) ; CMD/STAT PORT TO C
IN A,(C) ; GET STATUS
AND $01 ; ISOLATE RECEIVE READY BIT
RET Z ; NOTHING AVAILABLE ON CURRENT CHANNEL
; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE
LD C,(IY+3) ; CMD/STAT PORT TO C
IN A,(C) ; GET STATUS
AND $01 ; ISOLATE RECEIVE READY BIT
RET Z ; NOTHING AVAILABLE ON CURRENT CHANNEL
;
ACIA_INTRCV1:
; RECEIVE CHARACTER INTO BUFFER
; RECEIVE CHARACTER INTO BUFFER
INC C ; DATA PORT
IN A,(C) ; READ PORT
IN A,(C) ; READ PORT
DEC C ; BACK TO CONTROL PORT
LD B,A ; SAVE BYTE READ
LD L,(IY+6) ; SET HL TO
LD H,(IY+7) ; ... START OF BUFFER STRUCT
LD A,(HL) ; GET COUNT
CP ACIA_BUFSZ ; COMPARE TO BUFFER SIZE
JR Z,ACIA_INTRCV4 ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED
INC A ; INCREMENT THE COUNT
LD (HL),A ; AND SAVE IT
CP ACIA_BUFSZ / 2 ; BUFFER GETTING FULL?
JR NZ,ACIA_INTRCV2 ; IF NOT, BYPASS CLEARING RTS
LD A,(ACIA_CMD) ; CONFIG BYTE W/O RTS BIT
OR ACIA_RTSOFF ; CLEAR RTS
OUT (C),A ; DO IT
LD B,A ; SAVE BYTE READ
LD L,(IY+6) ; SET HL TO
LD H,(IY+7) ; ... START OF BUFFER STRUCT
LD A,(HL) ; GET COUNT
CP ACIA_BUFSZ ; COMPARE TO BUFFER SIZE
JR Z,ACIA_INTRCV4 ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED
INC A ; INCREMENT THE COUNT
LD (HL),A ; AND SAVE IT
CP ACIA_BUFSZ / 2 ; BUFFER GETTING FULL?
JR NZ,ACIA_INTRCV2 ; IF NOT, BYPASS CLEARING RTS
LD A,(ACIA_CMD) ; CONFIG BYTE W/O RTS BIT
OR ACIA_RTSOFF ; CLEAR RTS
OUT (C),A ; DO IT
ACIA_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 ACIA_BUFSZ+4 ; SUBTRACT SIZE OF BUFFER AND POINTER
CP E ; IF EQUAL TO START, HEAD PTR IS PAST BUF END
JR NZ,ACIA_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
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 ACIA_BUFSZ+4 ; SUBTRACT SIZE OF BUFFER AND POINTER
CP E ; IF EQUAL TO START, HEAD PTR IS PAST BUF END
JR NZ,ACIA_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
ACIA_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,(C) ; GET STATUS
RRA ; READY BIT TO CF
JR C,ACIA_INTRCV1 ; IF SET, DO SOME MORE
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,(C) ; GET STATUS
RRA ; READY BIT TO CF
JR C,ACIA_INTRCV1 ; IF SET, DO SOME MORE
ACIA_INTRCV4:
OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN
OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN
;
#ENDIF
;
@@ -277,49 +277,49 @@ ACIA_IN:
#ELSE
;
ACIA_IN:
CALL ACIA_IST ; SEE IF CHAR AVAILABLE
JR Z,ACIA_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
CP ACIA_BUFSZ / 4 ; BUFFER LOW THRESHOLD
JR NZ,ACIA_IN1 ; IF NOT, BYPASS SETTING RTS
LD C,(IY+3) ; C IS CMD/STATUS PORT ADR
LD A,(ACIA_CMD) ; CONFIG BYTE W/O RTS BIT
OR ACIA_RTSON ; SET RTS
OUT (C),A ; DO IT
CALL ACIA_IST ; SEE IF CHAR AVAILABLE
JR Z,ACIA_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
CP ACIA_BUFSZ / 4 ; BUFFER LOW THRESHOLD
JR NZ,ACIA_IN1 ; IF NOT, BYPASS SETTING RTS
LD C,(IY+3) ; C IS CMD/STATUS PORT ADR
LD A,(ACIA_CMD) ; CONFIG BYTE W/O RTS BIT
OR ACIA_RTSON ; SET RTS
OUT (C),A ; DO IT
ACIA_IN1:
INC HL
INC HL
INC HL ; HL NOW HAS ADR OF TAIL PTR
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 ACIA_BUFSZ+2 ; SUBTRACT SIZE OF BUFFER AND POINTER
CP E ; IF EQUAL TO START, TAIL PTR IS PAST BUF END
JR NZ,ACIA_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
INC HL
INC HL
INC HL ; HL NOW HAS ADR OF TAIL PTR
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 ACIA_BUFSZ+2 ; SUBTRACT SIZE OF BUFFER AND POINTER
CP E ; IF EQUAL TO START, TAIL PTR IS PAST BUF END
JR NZ,ACIA_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
ACIA_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
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
;
@@ -350,12 +350,12 @@ ACIA_IST:
#ELSE
;
ACIA_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
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
;
#ENDIF
;
@@ -384,150 +384,150 @@ ACIA_INITDEV:
ACIA_INITDEVX:
;
#IF (ACIADEBUG)
CALL NEWLINE
PRTS("ACIA$")
LD A,(IY+2)
CALL PRTDECB
CALL COUT
CALL PC_COLON
CALL NEWLINE
PRTS("ACIA$")
LD A,(IY+2)
CALL PRTDECB
CALL COUT
CALL PC_COLON
#ENDIF
;
; 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,ACIA_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
; 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,ACIA_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
;
; LOAD EXISTING CONFIG TO REINIT
LD E,(IY+4) ; LOW BYTE
LD D,(IY+5) ; HIGH BYTE
; LOAD EXISTING CONFIG TO REINIT
LD E,(IY+4) ; LOW BYTE
LD D,(IY+5) ; HIGH BYTE
;
ACIA_INITDEV1:
;
#IF (ACIADEBUG)
PUSH DE
POP BC
PRTS(" CFG=$")
CALL PRTHEXWORD
PUSH DE
POP BC
PRTS(" CFG=$")
CALL PRTHEXWORD
#ENDIF
;
LD A,E ; GET CONFIG LSB
AND $E0 ; CHECK FOR DTR, XON, PARITY=MARK/SPACE
JR NZ,ACIA_INITFAIL ; IF ANY BIT SET, FAIL, NOT SUPPORTED
LD A,E ; GET CONFIG LSB
AND $E0 ; CHECK FOR DTR, XON, PARITY=MARK/SPACE
JR NZ,ACIA_INITFAIL ; IF ANY BIT SET, FAIL, NOT SUPPORTED
;
LD A,D ; GET CONFIG MSB
AND $1F ; ISOLATE ENCODED BAUD RATE
LD A,D ; GET CONFIG MSB
AND $1F ; ISOLATE ENCODED BAUD RATE
;
#IF (ACIADEBUG)
PRTS(" ENC=$")
CALL PRTHEXBYTE
PRTS(" ENC=$")
CALL PRTHEXBYTE
#ENDIF
;
; BAUD RATE
PUSH DE ; SAVE REQUESTED CONFIG
LD L,(IY+10) ; LOAD CLK FREQ
LD H,(IY+11) ; ... INTO DE:HL
LD E,(IY+12) ; ... "
LD D,(IY+13) ; ... "
LD C,75 ; BAUD RATE ENCODING CONSTANT
CALL ENCODE ; C = TEST BAUD RATE (ENCODED) = BAUDTST
POP DE ; GET REQ CONFIG BACK, D = BAUDREQ
; BAUD RATE
PUSH DE ; SAVE REQUESTED CONFIG
LD L,(IY+10) ; LOAD CLK FREQ
LD H,(IY+11) ; ... INTO DE:HL
LD E,(IY+12) ; ... "
LD D,(IY+13) ; ... "
LD C,75 ; BAUD RATE ENCODING CONSTANT
CALL ENCODE ; C = TEST BAUD RATE (ENCODED) = BAUDTST
POP DE ; GET REQ CONFIG BACK, D = BAUDREQ
;
; BIT 4 (DIV 3) OF BAUDREQ AND BAUDTST MUST MATCH!
LD A,C ; A = BAUDTST
XOR D ; XOR WITH BAUDREQ
BIT 4,A ; DO BIT 4 VALS MATCH?
JR NZ,ACIA_INITFAIL ; IF NOT, BAIL OUT
;
LD A,C ; BAUDTST TO A
AND $0F ; ISOLATE DIV 2 BAUD BITS
LD C,A ; C = BAUDTST
;
LD A,D ; MSB W/ BAUD RATE TO A
AND $0F ; ISOLATE DIV 2 BAUD BITS
LD L,A ; L = BAUDREQ
;
LD A,C ; A = BAUDTST
LD B,%00000000 ; ACIA VAL FOR DIV 1
CP L ; BAUDTST = BAUDREQ?
JR Z,ACIA_INITBROK ; IF MATCH, WE ARE DONE
;
SUB 4 ; DIVIDE BY 16 (NOW DIV 16 TOT)
JR C,ACIA_INITFAIL ; FAIL IF UNDERFLOW
LD B,%00000001 ; ACIA VAL FOR DIV 16
CP L ; BAUDTST = BAUDREQ?
JR Z,ACIA_INITBROK ; IF MATCH, WE ARE DONE
;
SUB 2 ; DIVIDE BY 4 (NOW DIV 64 TOT)
JR C,ACIA_INITFAIL ; FAIL IF UNDERFLOW
LD B,%00000010 ; ACIA R4 VAL FOR DIV 32
CP L ; BAUDTST = BAUDREQ?
JR Z,ACIA_INITBROK ; IF MATCH, WE ARE DONE
; BIT 4 (DIV 3) OF BAUDREQ AND BAUDTST MUST MATCH!
LD A,C ; A = BAUDTST
XOR D ; XOR WITH BAUDREQ
BIT 4,A ; DO BIT 4 VALS MATCH?
JR NZ,ACIA_INITFAIL ; IF NOT, BAIL OUT
;
LD A,C ; BAUDTST TO A
AND $0F ; ISOLATE DIV 2 BAUD BITS
LD C,A ; C = BAUDTST
;
LD A,D ; MSB W/ BAUD RATE TO A
AND $0F ; ISOLATE DIV 2 BAUD BITS
LD L,A ; L = BAUDREQ
;
LD A,C ; A = BAUDTST
LD B,%00000000 ; ACIA VAL FOR DIV 1
CP L ; BAUDTST = BAUDREQ?
JR Z,ACIA_INITBROK ; IF MATCH, WE ARE DONE
;
SUB 4 ; DIVIDE BY 16 (NOW DIV 16 TOT)
JR C,ACIA_INITFAIL ; FAIL IF UNDERFLOW
LD B,%00000001 ; ACIA VAL FOR DIV 16
CP L ; BAUDTST = BAUDREQ?
JR Z,ACIA_INITBROK ; IF MATCH, WE ARE DONE
;
SUB 2 ; DIVIDE BY 4 (NOW DIV 64 TOT)
JR C,ACIA_INITFAIL ; FAIL IF UNDERFLOW
LD B,%00000010 ; ACIA R4 VAL FOR DIV 32
CP L ; BAUDTST = BAUDREQ?
JR Z,ACIA_INITBROK ; IF MATCH, WE ARE DONE
;
ACIA_INITFAIL:
;
#IF (ACIADEBUG)
PRTS(" BAD CFG$")
PRTS(" BAD CFG$")
#ENDIF
;
OR $FF
RET ; INVALID CONFIG
;
OR $FF
RET ; INVALID CONFIG
;
ACIA_INITBROK:
; REG B HAS WORKING CONFIG VALUE W/ BAUD RATE BITS
LD C,B ; WORKING VAL TO C
LD A,E ; LSB OF INCOMING CONFIG
AND %00111111 ; ISOLATE LOW 6 BITS TO COMPARE
LD B,8 ; WORD SELECT TABLE SIZE
LD HL,ACIA_WSTBL ; POINT TO TABLE
; REG B HAS WORKING CONFIG VALUE W/ BAUD RATE BITS
LD C,B ; WORKING VAL TO C
LD A,E ; LSB OF INCOMING CONFIG
AND %00111111 ; ISOLATE LOW 6 BITS TO COMPARE
LD B,8 ; WORD SELECT TABLE SIZE
LD HL,ACIA_WSTBL ; POINT TO TABLE
ACIA_INITWS:
CP (HL) ; MATCH?
JR Z,ACIA_INITWS2 ; IF SO, REG B HAS ACIA VAL + 1
INC HL ; NEXT ENTRY
DJNZ ACIA_INITWS ; KEEP CHECKING TILL DONE
JR ACIA_INITFAIL ; FAIL IF NO MATCH
CP (HL) ; MATCH?
JR Z,ACIA_INITWS2 ; IF SO, REG B HAS ACIA VAL + 1
INC HL ; NEXT ENTRY
DJNZ ACIA_INITWS ; KEEP CHECKING TILL DONE
JR ACIA_INITFAIL ; FAIL IF NO MATCH
ACIA_WSTBL:
.DB %00001011 ; 8/O/1
.DB %00011011 ; 8/E/1
.DB %00000011 ; 8/N/1
.DB %00000111 ; 8/N/2
.DB %00001010 ; 7/O/1
.DB %00011010 ; 7/E/1
.DB %00001110 ; 7/O/2
.DB %00011110 ; 7/E/2
.DB %00001011 ; 8/O/1
.DB %00011011 ; 8/E/1
.DB %00000011 ; 8/N/1
.DB %00000111 ; 8/N/2
.DB %00001010 ; 7/O/1
.DB %00011010 ; 7/E/1
.DB %00001110 ; 7/O/2
.DB %00011110 ; 7/E/2
ACIA_INITWS2:
LD A,B ; PUT FANAL VALUE IN A
DEC A ; ZERO INDEX ADJUSTMENT
RLA ; MOVE BITS TO
RLA ; ... PROPER LOCATION
OR C ; COMBINE WITH WORKING VALUE
JR ACIA_INITGO
LD A,B ; PUT FANAL VALUE IN A
DEC A ; ZERO INDEX ADJUSTMENT
RLA ; MOVE BITS TO
RLA ; ... PROPER LOCATION
OR C ; COMBINE WITH WORKING VALUE
JR ACIA_INITGO
;
ACIA_INITSAFE:
LD A,%00010110 ; DEFAULT CONFIG
LD A,%00010110 ; DEFAULT CONFIG
;
ACIA_INITGO:
;
#IF (INTMODE > 0)
OR %10000000 ; ENABLE RCV INT
OR %10000000 ; ENABLE RCV INT
#ENDIF
;
LD (ACIA_CMD),A ; SAVE SHADOW REGISTER
LD (ACIA_CMD),A ; SAVE SHADOW REGISTER
;
#IF (ACIADEBUG)
PRTS(" CMD=$")
CALL PRTHEXBYTE
LD DE,65
CALL VDELAY ; WAIT FOR FINAL CHAR TO SEND
PRTS(" CMD=$")
CALL PRTHEXBYTE
LD DE,65
CALL VDELAY ; WAIT FOR FINAL CHAR TO SEND
#ENDIF
;
; PROGRAM THE ACIA CHIP
LD C,(IY+3) ; COMMAND PORT
LD A,$FF ; MASTER RESET
OUT (C),A ; DO IT
LD A,(ACIA_CMD) ; RESTORE CONFIG VALUE
LD A,(ACIA_CMD) ; RESTORE CONFIG VALUE
OUT (C),A ; DO IT
;
#IF (INTMODE > 0)
@@ -583,9 +583,9 @@ ACIA_DEVICE:
; AND COMPACT FLASH MODULES DURING DETECTION PROBES.
;
ACIA_DETECT:
LD A,(IY+3) ; BASE PORT ADDRESS
ADD A,$20 ; OFFSET (SEE ABOVE)
LD C,A ; PUT IN C FOR I/O
LD A,(IY+3) ; BASE PORT ADDRESS
ADD A,$20 ; OFFSET (SEE ABOVE)
LD C,A ; PUT IN C FOR I/O
CALL ACIA_DETECT2 ; CHECK IT
JR Z,ACIA_DETECT1 ; FOUND IT, RECORD IT
LD A,ACIA_NONE ; NOTHING FOUND
@@ -659,7 +659,7 @@ ACIA_STR_ACIA .DB "ACIA$"
; WORKING VARIABLES
;
ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT
ACIA_CMD .DB 0 ; COMMAND PORT SHADOW REGISTER
ACIA_CMD .DB 0 ; COMMAND PORT SHADOW REGISTER
;
#IF (INTMODE == 0)
;
@@ -704,11 +704,11 @@ ACIA0_CFG:
.DB ACIA0BASE ; BASE PORT
.DW ACIA0CFG ; LINE CONFIGURATION
.DW ACIA0_RCVBUF ; POINTER TO RCV BUFFER STRUCT
.DW ACIA0_INT ; INT HANDLER POINTER
.DW (ACIA0CLK / ACIA0DIV) & $FFFF ; CLOCK FREQ AS
.DW (ACIA0CLK / ACIA0DIV) >> 16 ; ... DWORD VALUE
.DW ACIA0_INT ; INT HANDLER POINTER
.DW (ACIA0CLK / ACIA0DIV) & $FFFF ; CLOCK FREQ AS
.DW (ACIA0CLK / ACIA0DIV) >> 16 ; ... DWORD VALUE
;
ACIA_CFGSIZ .EQU $ - ACIA_CFG ; SIZE OF ONE CFG TABLE ENTRY
ACIA_CFGSIZ .EQU $ - ACIA_CFG ; SIZE OF ONE CFG TABLE ENTRY
;
#IF (ACIACNT >= 2)
;
@@ -720,10 +720,10 @@ ACIA1_CFG:
.DB ACIA1BASE ; BASE PORT
.DW ACIA1CFG ; LINE CONFIGURATION
.DW ACIA1_RCVBUF ; POINTER TO RCV BUFFER STRUCT
.DW ACIA1_INT ; INT HANDLER POINTER
.DW (ACIA1CLK / ACIA1DIV) & $FFFF ; CLOCK FREQ AS
.DW (ACIA1CLK / ACIA1DIV) >> 16 ; ... DWORD VALUE
.DW ACIA1_INT ; INT HANDLER POINTER
.DW (ACIA1CLK / ACIA1DIV) & $FFFF ; CLOCK FREQ AS
.DW (ACIA1CLK / ACIA1DIV) >> 16 ; ... DWORD VALUE
;
#ENDIF
;
ACIA_CFGCNT .EQU ($ - ACIA_CFG) / ACIA_CFGSIZ
ACIA_CFGCNT .EQU ($ - ACIA_CFG) / ACIA_CFGSIZ