Browse Source

Add IM0 Mode to ACIA Driver

pull/11/merge
Wayne Warthen 8 years ago
parent
commit
64f2e37ffb
  1. 103
      Source/HBIOS/acia.asm
  2. 6
      Source/HBIOS/sio.asm

103
Source/HBIOS/acia.asm

@ -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:

6
Source/HBIOS/sio.asm

@ -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

Loading…
Cancel
Save