mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:13:13 -06:00
Add IM0 Mode to ACIA Driver
This commit is contained in:
@@ -27,9 +27,25 @@ ACIA_ACIA .EQU 1
|
||||
ACIAA_BASE .EQU $80 + $20 ; MODULE A
|
||||
ACIAB_BASE .EQU $40 + $20 ; MODULE B
|
||||
;
|
||||
#IF (INTMODE == 0)
|
||||
;
|
||||
ACIA_RTSON .EQU %00010110 ; NO RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD
|
||||
ACIA_RTSOFF .EQU %01010110 ; NO RCV INT, RTS DEASSERTED, 8N1, CLK/64 BAUD
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
#IF (INTMODE == 1)
|
||||
;
|
||||
ACIA_RTSON .EQU %10010110 ; RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD
|
||||
ACIA_RTSOFF .EQU %11010110 ; RCV INT, RTS DEASSERTED, 8N1, CLK/64 BAUD
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
#IF (INTMODE > 1)
|
||||
.ECHO "*** ERROR: UNSUPPORTED INTMODE FOR ACIA DRIVER!!!\n"
|
||||
!!! ; FORCE AN ASSEMBLY ERROR
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;
|
||||
ACIA_PREINIT:
|
||||
@@ -55,7 +71,7 @@ ACIA_PREINIT0:
|
||||
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
;
|
||||
LD A,(IY + 1) ; GET THE ACIA TYPE DETECTED
|
||||
LD A,(IY+1) ; GET THE ACIA TYPE DETECTED
|
||||
OR A ; SET FLAGS
|
||||
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND
|
||||
;
|
||||
@@ -75,7 +91,7 @@ ACIA_PREINIT2:
|
||||
;
|
||||
ACIA_INITUNIT:
|
||||
CALL ACIA_DETECT ; DETERMINE ACIA TYPE
|
||||
LD (IY + 1),A ; SAVE IN CONFIG TABLE
|
||||
LD (IY+1),A ; SAVE IN CONFIG TABLE
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; ABORT IF NOTHING THERE
|
||||
|
||||
@@ -84,7 +100,8 @@ ACIA_INITUNIT:
|
||||
LD A,(HL) ; PUT IN ACCUM
|
||||
INC (HL) ; INCREMENT IT (FOR NEXT LOOP)
|
||||
LD (IY),A ; UDPATE UNIT NUM
|
||||
|
||||
;
|
||||
#IF (INTMODE == 1)
|
||||
; ADD IM1 INT CALL LIST ENTRY
|
||||
LD L,(IY+6) ; GET RCVBUF PTR
|
||||
LD H,(IY+7) ; ... INTO HL
|
||||
@@ -95,6 +112,7 @@ ACIA_INITUNIT:
|
||||
LD H,(HL) ; ...
|
||||
LD L,A ; ...
|
||||
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
|
||||
#ENDIF
|
||||
|
||||
; SET DEFAULT CONFIG
|
||||
LD DE,-1 ; LEAVE CONFIG ALONE
|
||||
@@ -117,7 +135,7 @@ ACIA_INIT1:
|
||||
PUSH HL ; COPY CFG DATA PTR
|
||||
POP IY ; ... TO IY
|
||||
|
||||
LD A,(IY + 1) ; GET ACIA TYPE
|
||||
LD A,(IY+1) ; GET ACIA TYPE
|
||||
OR A ; SET FLAGS
|
||||
CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO
|
||||
|
||||
@@ -130,6 +148,8 @@ ACIA_INIT1:
|
||||
;
|
||||
; INTERRUPT HANDLERS
|
||||
;
|
||||
#IF (INTMODE > 0)
|
||||
;
|
||||
ACIAA_INT:
|
||||
LD IY,ACIAA_CFG ; POINT TO CONFIG
|
||||
;
|
||||
@@ -216,6 +236,8 @@ ACIAB_INT1:
|
||||
OR $FF ; NZ SET TO INDICATE INT HANDLED
|
||||
RET ; AND RETURN
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; DRIVER FUNCTION TABLE
|
||||
;
|
||||
ACIA_FNTBL:
|
||||
@@ -232,6 +254,19 @@ ACIA_FNTBL:
|
||||
;
|
||||
;
|
||||
;
|
||||
#IF (INTMODE == 0)
|
||||
;
|
||||
ACIA_IN:
|
||||
CALL ACIA_IST ; CHAR WAITING?
|
||||
JR Z,ACIA_IN ; LOOP IF NOT
|
||||
LD C,(IY+3) ; C := ACIA BASE PORT
|
||||
INC C ; BUMP TO DATA PORT
|
||||
IN E,(C) ; GET BYTE
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
ACIA_IN:
|
||||
LD A,(IY+2) ; GET MODULE ID
|
||||
OR A ; SET FLAGS
|
||||
@@ -251,7 +286,7 @@ ACIAA_IN:
|
||||
CP 5 ; BUFFER LOW THRESHOLD
|
||||
JR NZ,ACIAA_IN0 ; IF NOT, BYPASS SETTING RTS
|
||||
|
||||
LD C,(IY + 3) ; C := ACIA CMD PORT
|
||||
LD C,(IY+3) ; C := ACIA CMD PORT
|
||||
LD A,ACIA_RTSON ; ASSERT RTS
|
||||
OUT (C),A ; DO IT
|
||||
ACIAA_IN0:
|
||||
@@ -278,7 +313,7 @@ ACIAB_IN:
|
||||
CP 5 ; BUFFER LOW THRESHOLD
|
||||
JR NZ,ACIAB_IN0 ; IF NOT, BYPASS SETTING RTS
|
||||
|
||||
LD C,(IY + 3) ; C := ACIA CMD PORT
|
||||
LD C,(IY+3) ; C := ACIA CMD PORT
|
||||
LD A,ACIA_RTSON ; ASSERT RTS
|
||||
OUT (C),A ; DO IT
|
||||
ACIAB_IN0:
|
||||
@@ -295,12 +330,14 @@ ACIAB_IN1:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;
|
||||
ACIA_OUT:
|
||||
CALL ACIA_OST ; READY FOR CHAR?
|
||||
JR Z,ACIA_OUT ; LOOP IF NOT
|
||||
LD C,(IY + 3) ; C := ACIA CMD PORT
|
||||
LD C,(IY+3) ; C := ACIA CMD PORT
|
||||
INC C ; BUMP TO DATA PORT
|
||||
OUT (C),E ; SEND CHAR FROM E
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -308,6 +345,19 @@ ACIA_OUT:
|
||||
;
|
||||
;
|
||||
;
|
||||
#IF (INTMODE == 0)
|
||||
;
|
||||
ACIA_IST:
|
||||
LD C,(IY+3) ; STATUS PORT
|
||||
IN A,(C) ; GET STATUS
|
||||
AND $01 ; ISOLATE BIT 0 (RX READY)
|
||||
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING
|
||||
XOR A ; ZERO ACCUM
|
||||
INC A ; ASCCUM := 1 TO SIGNAL 1 CHAR WAITING
|
||||
RET ; DONE
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
ACIA_IST:
|
||||
LD A,(IY+2) ; GET MODULE ID
|
||||
OR A ; SET FLAGS
|
||||
@@ -329,10 +379,12 @@ ACIAB_IST:
|
||||
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING
|
||||
RET ; AND DONE
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;
|
||||
ACIA_OST:
|
||||
LD C,(IY + 3) ; CMD PORT
|
||||
LD C,(IY+3) ; CMD PORT
|
||||
IN A,(C) ; GET STATUS
|
||||
AND $02 ; ISOLATE BIT 2 (TX EMPTY)
|
||||
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING
|
||||
@@ -346,15 +398,17 @@ ACIA_INITDEV:
|
||||
HB_DI ; AVOID CONFLICTS
|
||||
;
|
||||
; PROGRAM THE ACIA CHIP
|
||||
LD C,(IY + 3) ; COMMAND PORT
|
||||
LD C,(IY+3) ; COMMAND PORT
|
||||
LD A,$FF ; MASTER RESET
|
||||
OUT (C),A ; DO IT
|
||||
LD A,ACIA_RTSON ; NORMAL OPERATION
|
||||
OUT (C),A ; DO IT
|
||||
;
|
||||
#IF (INTMODE > 0)
|
||||
;
|
||||
; RESET THE RECEIVE BUFFER
|
||||
LD E,(IY + 6)
|
||||
LD D,(IY + 7) ; DE := _CNT
|
||||
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
|
||||
@@ -371,6 +425,8 @@ ACIA_INITDEV:
|
||||
LD (HL),E
|
||||
INC HL
|
||||
LD (HL),D ; _TL := _BUF
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
HB_EI ; READY FOR INTS AGAIN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -379,8 +435,8 @@ ACIA_INITDEV:
|
||||
;
|
||||
;
|
||||
ACIA_QUERY:
|
||||
LD E,(IY + 4) ; FIRST CONFIG BYTE TO E
|
||||
LD D,(IY + 5) ; SECOND CONFIG BYTE TO D
|
||||
LD E,(IY+4) ; FIRST CONFIG BYTE TO E
|
||||
LD D,(IY+5) ; SECOND CONFIG BYTE TO D
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
@@ -408,7 +464,7 @@ ACIA_DETECT:
|
||||
ACIA_DETECT1:
|
||||
; ACIA FOUND, RECORD IT
|
||||
;LD A,C ; BASE PORT ADDRESS TO A
|
||||
;LD (IY + 3),A ; SAVE ACTIVE BASE PORT
|
||||
;LD (IY+3),A ; SAVE ACTIVE BASE PORT
|
||||
LD A,ACIA_ACIA ; RETURN CHIP TYPE
|
||||
RET ; DONE
|
||||
;
|
||||
@@ -436,12 +492,12 @@ ACIA_PRTCFG:
|
||||
LD A,(IY) ; DEVICE NUM
|
||||
CALL PRTDECB ; PRINT DEVICE NUM
|
||||
PRTS(": IO=0x$") ; FORMATTING
|
||||
LD A,(IY + 3) ; GET BASE PORT
|
||||
LD A,(IY+3) ; GET BASE PORT
|
||||
CALL PRTHEXBYTE ; PRINT BASE PORT
|
||||
|
||||
; PRINT THE ACIA TYPE
|
||||
CALL PC_SPACE ; FORMATTING
|
||||
LD A,(IY + 1) ; GET ACIA TYPE BYTE
|
||||
LD A,(IY+1) ; GET ACIA TYPE BYTE
|
||||
RLCA ; MAKE IT A WORD OFFSET
|
||||
LD HL,ACIA_TYPE_MAP ; POINT HL TO TYPE MAP TABLE
|
||||
CALL ADDHLA ; HL := ENTRY
|
||||
@@ -451,13 +507,13 @@ ACIA_PRTCFG:
|
||||
CALL WRITESTR ; PRINT IT
|
||||
;
|
||||
; ALL DONE IF NO ACIA WAS DETECTED
|
||||
LD A,(IY + 1) ; GET ACIA TYPE BYTE
|
||||
LD A,(IY+1) ; GET ACIA 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
|
||||
LD E,(IY+4) ; LOAD CONFIG
|
||||
LD D,(IY+5) ; ... WORD TO DE
|
||||
CALL PS_PRTSC0 ; PRINT CONFIG
|
||||
;
|
||||
XOR A
|
||||
@@ -476,6 +532,13 @@ ACIA_STR_ACIA .DB "ACIA$"
|
||||
;
|
||||
ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT
|
||||
;
|
||||
#IF (INTMODE == 0)
|
||||
;
|
||||
ACIAA_RCVBUF .EQU 0
|
||||
ACIAB_RCVBUF .EQU 0
|
||||
;
|
||||
#ELSE
|
||||
;
|
||||
; RECEIVE BUFFERS
|
||||
;
|
||||
ACIAA_RCVBUF:
|
||||
@@ -496,6 +559,8 @@ ACIAB_BUF .FILL 32,0 ; RECEIVE RING BUFFER
|
||||
ACIAB_BUFEND .EQU $ ; END OF BUFFER
|
||||
ACIAB_BUFSZ .EQU $ - ACIAB_BUF ; SIZE OF RING BUFFER
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; ACIA PORT TABLE
|
||||
;
|
||||
ACIA_CFG:
|
||||
|
||||
@@ -507,7 +507,7 @@ BROK:
|
||||
LD A,E ; 112233445566d1d0 CC
|
||||
RRA ; CC112233445566d1 d0
|
||||
RRA ; d0CC112233445566 d1
|
||||
RRA ; d1d0CC1122334455 66
|
||||
RRA ; d1d0CC1122334455 66
|
||||
LD D,A
|
||||
RRA ; 66d1d0CC11223344 55
|
||||
AND $60 ; 0011110000000000 00
|
||||
@@ -555,6 +555,8 @@ BROK:
|
||||
LD HL,SIO_INITVALS ; POINT TO INIT VALUES
|
||||
LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE
|
||||
OTIR ; WRITE ALL VALUES
|
||||
;
|
||||
#IF (INTMODE > 0)
|
||||
;
|
||||
; RESET THE RECEIVE BUFFER
|
||||
LD E,(IY+6)
|
||||
@@ -575,6 +577,8 @@ BROK:
|
||||
LD (HL),E
|
||||
INC HL
|
||||
LD (HL),D ; _TL := _BUF
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
HB_EI ; READY FOR INTS AGAIN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
Reference in New Issue
Block a user