Browse Source

Support SCC on RCBus

- Updated SCC driver and RCZ80 config
- Completed and tested IM1 support
- IM2 should work, but needs to be tested
- Not enabled by default
pull/653/head
Wayne Warthen 2 weeks ago
parent
commit
1e5e4eeb6b
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 1
      Source/HBIOS/Config/RCZ80_std.asm
  2. 1
      Source/HBIOS/cfg_MASTER.asm
  3. 21
      Source/HBIOS/cfg_RCZ80.asm
  4. 1
      Source/HBIOS/cfg_SZ180.asm
  5. 1
      Source/HBIOS/cfg_SZ80.asm
  6. 54
      Source/HBIOS/scc.asm
  7. 2
      Source/HBIOS/std.asm

1
Source/HBIOS/Config/RCZ80_std.asm

@ -70,6 +70,7 @@ DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM)
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
SCCENABLE .SET FALSE ; SCC: ENABLE ZILOG SCC SERIAL DRIVER (SCC.ASM)
;
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY]

1
Source/HBIOS/cfg_MASTER.asm

@ -321,6 +321,7 @@ SCCDEBUG .EQU FALSE ; SCC: ENABLE DEBUG OUTPUT
SCCBOOT .EQU 0 ; SCC: REBOOT ON RCV CHAR (0=DISABLED)
SCCCNT .EQU 2 ; SCC: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP
SCCINTS .EQU FALSE ; SCC: INCLUDE SCC INTERRUPT SUPPORT UNDER IM1/2/3
SCCPCLK .EQU FALSE ; SCC: USE PROCESSOR CLOCK AS BAUD CLOCK
SCC0MODE .EQU SCCMODE_SZ80 ; SCC 0: CHIP TYPE: SCCMODE_[STD|SZ80]
SCC0BASE .EQU $FF ; SCC 0: REGISTERS BASE ADR
SCC0ACLK .EQU 4915200 ; SCC 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800

21
Source/HBIOS/cfg_RCZ80.asm

@ -265,6 +265,27 @@ SIO1BCFG .SET DEFSERCFG ; SIO 1B: SERIAL LINE CONFIG
SIO1BCTCC .SET -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE
;
SCCENABLE .SET FALSE ; SCC: ENABLE ZILOG SCC SERIAL DRIVER (SCC.ASM)
SCCDEBUG .SET FALSE ; SCC: ENABLE DEBUG OUTPUT
SCCBOOT .SET 0 ; SCC: REBOOT ON RCV CHAR (0=DISABLED)
SCCCNT .SET 1 ; SCC: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP
SCCINTS .SET TRUE ; SCC: INCLUDE SCC INTERRUPT SUPPORT UNDER IM1/2/3
SCCPCLK .SET TRUE ; SCC: USE PROCESSOR CLOCK AS BAUD CLOCK
SCC0MODE .SET SCCMODE_SZ80 ; SCC 0: CHIP TYPE: SCCMODE_[STD|SZ80]
SCC0BASE .SET $A0 ; SCC 0: REGISTERS BASE ADR
SCC0ACLK .SET CPUOSC ; SCC 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SCC0ACFG .SET DEFSERCFG ; SCC 0A: SERIAL LINE CONFIG
SCC0ACTCC .SET -1 ; SCC 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE
SCC0BCLK .SET CPUOSC ; SCC 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SCC0BCFG .SET DEFSERCFG ; SCC 0B: SERIAL LINE CONFIG
SCC0BCTCC .SET -1 ; SCC 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE
SCC1MODE .SET SCCMODE_SZ80 ; SCC 1: CHIP TYPE: SIOMODE_[STD|SZ80]
SCC1BASE .SET $FF ; SCC 1: REGISTERS BASE ADR
SCC1ACLK .SET CPUOSC ; SCC 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SCC1ACFG .SET DEFSERCFG ; SCC 1A: SERIAL LINE CONFIG
SCC1ACTCC .SET -1 ; SCC 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE
SCC1BCLK .SET CPUOSC ; SCC 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800
SCC1BCFG .SET DEFSERCFG ; SCC 1B: SERIAL LINE CONFIG
SCC1BCTCC .SET -1 ; SCC 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE
;
XIOCFG .SET DEFSERCFG ; XIO: SERIAL LINE CONFIG
;

1
Source/HBIOS/cfg_SZ180.asm

@ -236,6 +236,7 @@ SCCDEBUG .SET FALSE ; SCC: ENABLE DEBUG OUTPUT
SCCBOOT .SET 0 ; SCC: REBOOT ON RCV CHAR (0=DISABLED)
SCCCNT .SET 1 ; SCC: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP
SCCINTS .SET FALSE ; SCC: INCLUDE SCC INTERRUPT SUPPORT UNDER IM1/2/3
SCCPCLK .SET FALSE ; SCC: USE PROCESSOR CLOCK AS BAUD CLOCK
SCC0MODE .SET SCCMODE_SZ80 ; SCC 0: CHIP TYPE: SCCMODE_[STD|SZ80]
SCC0BASE .SET $A0 ; SCC 0: REGISTERS BASE ADR
SCC0ACLK .SET 4915200 ; SCC 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800

1
Source/HBIOS/cfg_SZ80.asm

@ -225,6 +225,7 @@ SCCDEBUG .SET FALSE ; SCC: ENABLE DEBUG OUTPUT
SCCBOOT .SET 0 ; SCC: REBOOT ON RCV CHAR (0=DISABLED)
SCCCNT .SET 1 ; SCC: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP
SCCINTS .SET FALSE ; SCC: INCLUDE SCC INTERRUPT SUPPORT UNDER IM1/2/3
SCCPCLK .SET FALSE ; SCC: USE PROCESSOR CLOCK AS BAUD CLOCK
SCC0MODE .SET SCCMODE_SZ80 ; SCC 0: CHIP TYPE: SCCMODE_[STD|SZ80]
SCC0BASE .SET $A0 ; SCC 0: REGISTERS BASE ADR
SCC0ACLK .SET 4915200 ; SCC 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800

54
Source/HBIOS/scc.asm

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

2
Source/HBIOS/std.asm

@ -1075,6 +1075,8 @@ INT_PIO0A .EQU 9 ; ZILOG PIO 0, CHANNEL A
INT_PIO0B .EQU 10 ; ZILOG PIO 0, CHANNEL B
INT_PIO1A .EQU 11 ; ZILOG PIO 1, CHANNEL A
INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B
INT_SCC0 .EQU 13 ; ZILOG SCC 0, CHANNEL A & B
INT_SCC1 .EQU 14 ; ZILOG SCC 1, CHANNEL A & B
#ENDIF
#ENDIF

Loading…
Cancel
Save