|
|
@ -27,9 +27,25 @@ ACIA_ACIA .EQU 1 |
|
|
ACIAA_BASE .EQU $80 + $20 ; MODULE A |
|
|
ACIAA_BASE .EQU $80 + $20 ; MODULE A |
|
|
ACIAB_BASE .EQU $40 + $20 ; MODULE B |
|
|
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_RTSON .EQU %10010110 ; RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD |
|
|
ACIA_RTSOFF .EQU %11010110 ; RCV INT, RTS DEASSERTED, 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: |
|
|
ACIA_PREINIT: |
|
|
@ -55,7 +71,7 @@ ACIA_PREINIT0: |
|
|
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE |
|
|
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
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 |
|
|
OR A ; SET FLAGS |
|
|
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND |
|
|
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND |
|
|
; |
|
|
; |
|
|
@ -75,7 +91,7 @@ ACIA_PREINIT2: |
|
|
; |
|
|
; |
|
|
ACIA_INITUNIT: |
|
|
ACIA_INITUNIT: |
|
|
CALL ACIA_DETECT ; DETERMINE ACIA TYPE |
|
|
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 |
|
|
OR A ; SET FLAGS |
|
|
RET Z ; ABORT IF NOTHING THERE |
|
|
RET Z ; ABORT IF NOTHING THERE |
|
|
|
|
|
|
|
|
@ -84,7 +100,8 @@ ACIA_INITUNIT: |
|
|
LD A,(HL) ; PUT IN ACCUM |
|
|
LD A,(HL) ; PUT IN ACCUM |
|
|
INC (HL) ; INCREMENT IT (FOR NEXT LOOP) |
|
|
INC (HL) ; INCREMENT IT (FOR NEXT LOOP) |
|
|
LD (IY),A ; UDPATE UNIT NUM |
|
|
LD (IY),A ; UDPATE UNIT NUM |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
; ADD IM1 INT CALL LIST ENTRY |
|
|
; ADD IM1 INT CALL LIST ENTRY |
|
|
LD L,(IY+6) ; GET RCVBUF PTR |
|
|
LD L,(IY+6) ; GET RCVBUF PTR |
|
|
LD H,(IY+7) ; ... INTO HL |
|
|
LD H,(IY+7) ; ... INTO HL |
|
|
@ -95,6 +112,7 @@ ACIA_INITUNIT: |
|
|
LD H,(HL) ; ... |
|
|
LD H,(HL) ; ... |
|
|
LD L,A ; ... |
|
|
LD L,A ; ... |
|
|
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST |
|
|
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
|
|
|
; SET DEFAULT CONFIG |
|
|
; SET DEFAULT CONFIG |
|
|
LD DE,-1 ; LEAVE CONFIG ALONE |
|
|
LD DE,-1 ; LEAVE CONFIG ALONE |
|
|
@ -117,7 +135,7 @@ ACIA_INIT1: |
|
|
PUSH HL ; COPY CFG DATA PTR |
|
|
PUSH HL ; COPY CFG DATA PTR |
|
|
POP IY ; ... TO IY |
|
|
POP IY ; ... TO IY |
|
|
|
|
|
|
|
|
LD A,(IY + 1) ; GET ACIA TYPE |
|
|
|
|
|
|
|
|
LD A,(IY+1) ; GET ACIA TYPE |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO |
|
|
CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO |
|
|
|
|
|
|
|
|
@ -130,6 +148,8 @@ ACIA_INIT1: |
|
|
; |
|
|
; |
|
|
; INTERRUPT HANDLERS |
|
|
; INTERRUPT HANDLERS |
|
|
; |
|
|
; |
|
|
|
|
|
#IF (INTMODE > 0) |
|
|
|
|
|
; |
|
|
ACIAA_INT: |
|
|
ACIAA_INT: |
|
|
LD IY,ACIAA_CFG ; POINT TO CONFIG |
|
|
LD IY,ACIAA_CFG ; POINT TO CONFIG |
|
|
; |
|
|
; |
|
|
@ -216,6 +236,8 @@ ACIAB_INT1: |
|
|
OR $FF ; NZ SET TO INDICATE INT HANDLED |
|
|
OR $FF ; NZ SET TO INDICATE INT HANDLED |
|
|
RET ; AND RETURN |
|
|
RET ; AND RETURN |
|
|
; |
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
; DRIVER FUNCTION TABLE |
|
|
; DRIVER FUNCTION TABLE |
|
|
; |
|
|
; |
|
|
ACIA_FNTBL: |
|
|
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: |
|
|
ACIA_IN: |
|
|
LD A,(IY+2) ; GET MODULE ID |
|
|
LD A,(IY+2) ; GET MODULE ID |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
@ -251,7 +286,7 @@ ACIAA_IN: |
|
|
CP 5 ; BUFFER LOW THRESHOLD |
|
|
CP 5 ; BUFFER LOW THRESHOLD |
|
|
JR NZ,ACIAA_IN0 ; IF NOT, BYPASS SETTING RTS |
|
|
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 |
|
|
LD A,ACIA_RTSON ; ASSERT RTS |
|
|
OUT (C),A ; DO IT |
|
|
OUT (C),A ; DO IT |
|
|
ACIAA_IN0: |
|
|
ACIAA_IN0: |
|
|
@ -278,7 +313,7 @@ ACIAB_IN: |
|
|
CP 5 ; BUFFER LOW THRESHOLD |
|
|
CP 5 ; BUFFER LOW THRESHOLD |
|
|
JR NZ,ACIAB_IN0 ; IF NOT, BYPASS SETTING RTS |
|
|
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 |
|
|
LD A,ACIA_RTSON ; ASSERT RTS |
|
|
OUT (C),A ; DO IT |
|
|
OUT (C),A ; DO IT |
|
|
ACIAB_IN0: |
|
|
ACIAB_IN0: |
|
|
@ -295,12 +330,14 @@ ACIAB_IN1: |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
RET ; AND DONE |
|
|
RET ; AND DONE |
|
|
; |
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
ACIA_OUT: |
|
|
ACIA_OUT: |
|
|
CALL ACIA_OST ; READY FOR CHAR? |
|
|
CALL ACIA_OST ; READY FOR CHAR? |
|
|
JR Z,ACIA_OUT ; LOOP IF NOT |
|
|
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 |
|
|
INC C ; BUMP TO DATA PORT |
|
|
OUT (C),E ; SEND CHAR FROM E |
|
|
OUT (C),E ; SEND CHAR FROM E |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
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: |
|
|
ACIA_IST: |
|
|
LD A,(IY+2) ; GET MODULE ID |
|
|
LD A,(IY+2) ; GET MODULE ID |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
@ -329,10 +379,12 @@ ACIAB_IST: |
|
|
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|
|
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|
|
RET ; AND DONE |
|
|
RET ; AND DONE |
|
|
; |
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
ACIA_OST: |
|
|
ACIA_OST: |
|
|
LD C,(IY + 3) ; CMD PORT |
|
|
|
|
|
|
|
|
LD C,(IY+3) ; CMD PORT |
|
|
IN A,(C) ; GET STATUS |
|
|
IN A,(C) ; GET STATUS |
|
|
AND $02 ; ISOLATE BIT 2 (TX EMPTY) |
|
|
AND $02 ; ISOLATE BIT 2 (TX EMPTY) |
|
|
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|
|
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING |
|
|
@ -346,15 +398,17 @@ ACIA_INITDEV: |
|
|
HB_DI ; AVOID CONFLICTS |
|
|
HB_DI ; AVOID CONFLICTS |
|
|
; |
|
|
; |
|
|
; PROGRAM THE ACIA CHIP |
|
|
; PROGRAM THE ACIA CHIP |
|
|
LD C,(IY + 3) ; COMMAND PORT |
|
|
|
|
|
|
|
|
LD C,(IY+3) ; COMMAND PORT |
|
|
LD A,$FF ; MASTER RESET |
|
|
LD A,$FF ; MASTER RESET |
|
|
OUT (C),A ; DO IT |
|
|
OUT (C),A ; DO IT |
|
|
LD A,ACIA_RTSON ; NORMAL OPERATION |
|
|
LD A,ACIA_RTSON ; NORMAL OPERATION |
|
|
OUT (C),A ; DO IT |
|
|
OUT (C),A ; DO IT |
|
|
|
|
|
; |
|
|
|
|
|
#IF (INTMODE > 0) |
|
|
; |
|
|
; |
|
|
; RESET THE RECEIVE BUFFER |
|
|
; 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 |
|
|
XOR A ; A := 0 |
|
|
LD (DE),A ; _CNT = 0 |
|
|
LD (DE),A ; _CNT = 0 |
|
|
INC DE ; DE := ADR OF _HD |
|
|
INC DE ; DE := ADR OF _HD |
|
|
@ -371,6 +425,8 @@ ACIA_INITDEV: |
|
|
LD (HL),E |
|
|
LD (HL),E |
|
|
INC HL |
|
|
INC HL |
|
|
LD (HL),D ; _TL := _BUF |
|
|
LD (HL),D ; _TL := _BUF |
|
|
|
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
HB_EI ; READY FOR INTS AGAIN |
|
|
HB_EI ; READY FOR INTS AGAIN |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
@ -379,8 +435,8 @@ ACIA_INITDEV: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
ACIA_QUERY: |
|
|
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 |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
@ -408,7 +464,7 @@ ACIA_DETECT: |
|
|
ACIA_DETECT1: |
|
|
ACIA_DETECT1: |
|
|
; ACIA FOUND, RECORD IT |
|
|
; ACIA FOUND, RECORD IT |
|
|
;LD A,C ; BASE PORT ADDRESS TO A |
|
|
;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 |
|
|
LD A,ACIA_ACIA ; RETURN CHIP TYPE |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
@ -436,12 +492,12 @@ ACIA_PRTCFG: |
|
|
LD A,(IY) ; DEVICE NUM |
|
|
LD A,(IY) ; DEVICE NUM |
|
|
CALL PRTDECB ; PRINT DEVICE NUM |
|
|
CALL PRTDECB ; PRINT DEVICE NUM |
|
|
PRTS(": IO=0x$") ; FORMATTING |
|
|
PRTS(": IO=0x$") ; FORMATTING |
|
|
LD A,(IY + 3) ; GET BASE PORT |
|
|
|
|
|
|
|
|
LD A,(IY+3) ; GET BASE PORT |
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
|
|
|
|
|
|
; PRINT THE ACIA TYPE |
|
|
; PRINT THE ACIA TYPE |
|
|
CALL PC_SPACE ; FORMATTING |
|
|
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 |
|
|
RLCA ; MAKE IT A WORD OFFSET |
|
|
LD HL,ACIA_TYPE_MAP ; POINT HL TO TYPE MAP TABLE |
|
|
LD HL,ACIA_TYPE_MAP ; POINT HL TO TYPE MAP TABLE |
|
|
CALL ADDHLA ; HL := ENTRY |
|
|
CALL ADDHLA ; HL := ENTRY |
|
|
@ -451,13 +507,13 @@ ACIA_PRTCFG: |
|
|
CALL WRITESTR ; PRINT IT |
|
|
CALL WRITESTR ; PRINT IT |
|
|
; |
|
|
; |
|
|
; ALL DONE IF NO ACIA WAS DETECTED |
|
|
; 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 |
|
|
OR A ; SET FLAGS |
|
|
RET Z ; IF ZERO, NOT PRESENT |
|
|
RET Z ; IF ZERO, NOT PRESENT |
|
|
; |
|
|
; |
|
|
PRTS(" MODE=$") ; FORMATTING |
|
|
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 |
|
|
CALL PS_PRTSC0 ; PRINT CONFIG |
|
|
; |
|
|
; |
|
|
XOR A |
|
|
XOR A |
|
|
@ -476,6 +532,13 @@ ACIA_STR_ACIA .DB "ACIA$" |
|
|
; |
|
|
; |
|
|
ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|
|
ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|
|
; |
|
|
; |
|
|
|
|
|
#IF (INTMODE == 0) |
|
|
|
|
|
; |
|
|
|
|
|
ACIAA_RCVBUF .EQU 0 |
|
|
|
|
|
ACIAB_RCVBUF .EQU 0 |
|
|
|
|
|
; |
|
|
|
|
|
#ELSE |
|
|
|
|
|
; |
|
|
; RECEIVE BUFFERS |
|
|
; RECEIVE BUFFERS |
|
|
; |
|
|
; |
|
|
ACIAA_RCVBUF: |
|
|
ACIAA_RCVBUF: |
|
|
@ -496,6 +559,8 @@ ACIAB_BUF .FILL 32,0 ; RECEIVE RING BUFFER |
|
|
ACIAB_BUFEND .EQU $ ; END OF BUFFER |
|
|
ACIAB_BUFEND .EQU $ ; END OF BUFFER |
|
|
ACIAB_BUFSZ .EQU $ - ACIAB_BUF ; SIZE OF RING BUFFER |
|
|
ACIAB_BUFSZ .EQU $ - ACIAB_BUF ; SIZE OF RING BUFFER |
|
|
; |
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
; ACIA PORT TABLE |
|
|
; ACIA PORT TABLE |
|
|
; |
|
|
; |
|
|
ACIA_CFG: |
|
|
ACIA_CFG: |
|
|
|