|
|
|
@ -11,12 +11,7 @@ |
|
|
|
; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - IMPLEMENT INTERRUPT DRIVEN BUFFER AND FLOW CONTROL |
|
|
|
; |
|
|
|
#IF ((SCCINTS) & (INTMODE > 0)) |
|
|
|
.ECHO "*** ERROR: SCC DRIVER DOES NOT YET SUPPORT IONTERRUPTS!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
; - INTERRUPT MODE 2 IS UNTESTED |
|
|
|
; |
|
|
|
SCC_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE |
|
|
|
; |
|
|
|
@ -31,9 +26,11 @@ SCC_RTSON .EQU $EA |
|
|
|
SCC_RTSOFF .EQU $E8 |
|
|
|
; |
|
|
|
#IF ((SCCINTS) & (INTMODE > 0)) |
|
|
|
SCC_WR1VAL .EQU $18 ; WR1 VALUE FOR INT ON RECEIVED CHARS |
|
|
|
SCC_WR1VAL .EQU $10 ; WR1 VALUE FOR INT ON RECEIVED CHARS |
|
|
|
SCC_WR9VAL .EQU $08 ; WR9 VALUE FOR MASTER INTERRUPTS ENABLED |
|
|
|
#ELSE |
|
|
|
SCC_WR1VAL .EQU $00 ; WR1 VALUE FOR NO INTS |
|
|
|
SCC_WR9VAL .EQU $00 ; WR9 VALUE FOR MASTER INTERRUPTS DISABLED |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF ((SCCINTS) & (INTMODE >= 2)) |
|
|
|
@ -251,8 +248,8 @@ SCC_INTRCV: |
|
|
|
; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE |
|
|
|
LD C,(IY+3) ; CMD/STAT PORT TO C |
|
|
|
XOR A ; A := 0 |
|
|
|
OUT (C),A ; ADDRESS RD0 |
|
|
|
IN A,(C) ; GET RD0 |
|
|
|
OUT (C),A ; ADDRESS RR0 |
|
|
|
IN A,(C) ; GET RR0 |
|
|
|
AND $01 ; ISOLATE RECEIVE READY BIT |
|
|
|
RET Z ; NOTHING AVAILABLE ON CURRENT CHANNEL |
|
|
|
; |
|
|
|
@ -261,7 +258,7 @@ SCC_INTRCV1: |
|
|
|
LD C,(IY+4) ; DATA PORT TO C |
|
|
|
IN A,(C) ; READ PORT |
|
|
|
#IF (SCCBOOT != 0) |
|
|
|
CP SCCBOOT ; REBOOT REQUEST? |
|
|
|
CP SCCBOOT ; REBOOT REQUEST? |
|
|
|
JP Z,SYS_RESCOLD ; IF SO, DO IT, NO RETURN |
|
|
|
#ENDIF |
|
|
|
LD B,A ; SAVE BYTE READ |
|
|
|
@ -312,6 +309,26 @@ SCC_INTRCV3: |
|
|
|
RRA ; READY BIT TO CF |
|
|
|
JR C,SCC_INTRCV1 ; IF SET, DO SOME MORE |
|
|
|
SCC_INTRCV4: |
|
|
|
; CHECK FOR ANY PENDING SPECIAL CONDITIONS |
|
|
|
; IF AN ERROR OCCURS, THE RECEIVER WILL BE LOCKED UNTIL YOU |
|
|
|
; CLEAR IT BY READ RR1 |
|
|
|
LD C,(IY+3) ; CMD/STAT PORT TO C |
|
|
|
LD A,1 ; RR1 |
|
|
|
OUT (C),A ; SELECT IT |
|
|
|
IN A,(C) ; READ IT |
|
|
|
AND %0111000 ; ISOLATE ERROR BITS |
|
|
|
JR Z,SCC_INTRCV5 ; DONE IF NO BITS SET |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
; |
|
|
|
; ERROR RESET |
|
|
|
LD A,%00110000 ; ERROR RESET |
|
|
|
OUT (C),A ; SEND IT |
|
|
|
; |
|
|
|
SCC_INTRCV5: |
|
|
|
; RESET INTERRUPT UNDER SERVICE |
|
|
|
LD A,%00111000 ; RESET HIGHEST IUS |
|
|
|
OUT (C),A ; DO IT |
|
|
|
; |
|
|
|
OR $FF ; NZ SET TO INDICATE INT HANDLED |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
@ -643,9 +660,9 @@ SCC_INITPRT: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; RESET THE CHANNEL |
|
|
|
LD C,(IY+3) |
|
|
|
XOR A |
|
|
|
OUT (C),A ; SELECT WR0 |
|
|
|
LD C,(IY+3) ; CONTROL PORT |
|
|
|
LD A,9 ; REGISTER WR9 |
|
|
|
OUT (C),A ; SELECT IT |
|
|
|
LD A,%10000000 ; CHANNEL A RESET CMD |
|
|
|
BIT 0,(IY+2) ; TEST CHANNEL NUM |
|
|
|
JR Z,SCC_INITGO1 ; SKIP AHEAD IF CHANNEL 0 |
|
|
|
@ -701,15 +718,22 @@ SCC_INITGO1: |
|
|
|
; |
|
|
|
SCC_INITDEFS: |
|
|
|
.DB 4, $44 ; ASYNC MODE, X16, 1 STOP, NO PARITY ; 0100 0100 |
|
|
|
.DB 1, SCC_WR1VAL ; CONFIGURE INTERRUPTS |
|
|
|
.DB 3, $C0 ; RX 8 BITS PER CHAR ; 1100 0000 |
|
|
|
.DB 5, $E2 ; TX 8 BITS PER CHAR ; 1110 0010 |
|
|
|
.DB 11, $56 ; RTxC VIA BRG ; 0101 0110 |
|
|
|
.DB 12, SCC_DEFDIV & $FF ; BAUD RATE DIVISOR LO BYTE |
|
|
|
.DB 13, SCC_DEFDIV >> 8 ; BAUD RATE DIVISOR HI BYTE |
|
|
|
#IF (SCCPCLK) |
|
|
|
.DB 14, $02 ; BRG SOURCE PCLK ; 0000 0000 |
|
|
|
.DB 14, $03 ; ENABLE BRG ; 0000 0001 |
|
|
|
#ELSE |
|
|
|
.DB 14, $00 ; BRG SOURCE RTxC ; 0000 0000 |
|
|
|
.DB 14, $01 ; ENABLE BRG ; 0000 0001 |
|
|
|
#ENDIF |
|
|
|
.DB 3, $C1 ; ENABLE RECEIVER ; 1100 0001 |
|
|
|
.DB 5, $EA ; ENABLE TRANSMITTER ; 1110 1010 |
|
|
|
.DB 9, SCC_WR9VAL ; MASTER INTERRUPT CONTROL |
|
|
|
; |
|
|
|
SCC_INITLEN .EQU $ - SCC_INITDEFS |
|
|
|
; |
|
|
|
@ -719,7 +743,8 @@ SCC_INITVALS .FILL SCC_INITLEN,0 |
|
|
|
; *** MUST SYNC WITH SCC_INITDEFS !!! |
|
|
|
; |
|
|
|
SCC_WR4 .EQU SCC_INITVALS + 1 |
|
|
|
SCC_WR3 .EQU SCC_WR4 + 2 |
|
|
|
SCC_WR1 .EQU SCC_WR4 + 2 |
|
|
|
SCC_WR3 .EQU SCC_WR1 + 2 |
|
|
|
SCC_WR5 .EQU SCC_WR3 + 2 |
|
|
|
SCC_WR11 .EQU SCC_WR5 + 2 |
|
|
|
SCC_WR12 .EQU SCC_WR11 + 2 |
|
|
|
@ -728,6 +753,7 @@ SCC_WR14 .EQU SCC_WR13 + 2 |
|
|
|
SCC_WR14A .EQU SCC_WR14 + 2 |
|
|
|
SCC_WR3A .EQU SCC_WR14A + 2 |
|
|
|
SCC_WR5A .EQU SCC_WR3A + 2 |
|
|
|
SCC_WR9 .EQU SCC_WR5A + 2 |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
|