mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
acia - whitespace
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user