mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
ay-3-8910 sound driver updates
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
; 2020-02-11 [WBW] Made hardware config & detection more flexible
|
||||
; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing
|
||||
; 2020-04-25 [DEN] Added support to use HBIOS Sound driver
|
||||
; 2020-05-02 [PMS] Add support for SBC-V2 slow-io hack
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
@@ -53,14 +54,18 @@
|
||||
#include "hbios.inc"
|
||||
#include "cpm.inc"
|
||||
#include "tune.inc"
|
||||
|
||||
;
|
||||
HEAPEND .EQU $C000 ; End of heap storage
|
||||
;
|
||||
TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file
|
||||
TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file
|
||||
TYPMYM .EQU 3 ; FILTYP value for MYM sound file
|
||||
;
|
||||
|
||||
; HIGH SPEED CPU CONTROL
|
||||
;
|
||||
SBCV2004 .EQU 1 ; USE SBC-V2-004 HALF CLOCK DIVIDER
|
||||
CPUFAMZ180 .EQU 1 ; USE Z180 WAIT STATE MANAGEMENT
|
||||
;
|
||||
;Conditional assembly - use -D switch on TASM or uz80as assembler to control
|
||||
_ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards)
|
||||
_MSX .EQU 0
|
||||
@@ -401,43 +406,44 @@ IDBIO2:
|
||||
;
|
||||
;
|
||||
;
|
||||
SLOWCPU:
|
||||
LD A,(Z180) ; Z180 base I/O port
|
||||
CP $FF ; Check for no value
|
||||
RET Z ; Bail out if no value
|
||||
ADD A,$1E ; Apply offset of CMR register
|
||||
LD C,A ; And put it in C
|
||||
LD B,0 ; MSB for 16-bit I/O
|
||||
IN A,(C) ; Get current value
|
||||
LD (CMRSAV),A ; Save it to restore later
|
||||
XOR A ; Go slow
|
||||
OUT (C),A ; And update CMR
|
||||
INC C ; Now point to CCR register
|
||||
IN A,(C) ; Get current value
|
||||
LD (CCRSAV),A ; Save it to restore later
|
||||
XOR A ; Go slow
|
||||
OUT (C),A ; And update CCR
|
||||
RET
|
||||
;SLOWCPU:
|
||||
; LD A,(Z180) ; Z180 base I/O port
|
||||
; CP $FF ; Check for no value
|
||||
; RET Z ; Bail out if no value
|
||||
; ADD A,$1E ; Apply offset of CMR register
|
||||
; LD C,A ; And put it in C
|
||||
; LD B,0 ; MSB for 16-bit I/O
|
||||
; IN A,(C) ; Get current value
|
||||
; LD (CMRSAV),A ; Save it to restore later
|
||||
; XOR A ; Go slow
|
||||
; OUT (C),A ; And update CMR
|
||||
; INC C ; Now point to CCR register
|
||||
; IN A,(C) ; Get current value
|
||||
; LD (CCRSAV),A ; Save it to restore later
|
||||
; XOR A ; Go slow
|
||||
; OUT (C),A ; And update CCR
|
||||
; RET
|
||||
;
|
||||
;
|
||||
;
|
||||
NORMCPU:
|
||||
LD A,(Z180) ; Z180 base I/O port
|
||||
CP $FF ; Check for no value
|
||||
RET Z ; Bail out if no value
|
||||
ADD A,$1E ; Apply offset of CMR register
|
||||
LD C,A ; And put it in C
|
||||
LD B,0 ; MSB for 16-bit I/O
|
||||
LD A,(CMRSAV) ; Get original CMR value
|
||||
OUT (C),A ; And update CMR
|
||||
INC C ; Now point to CCR register
|
||||
LD A,(CCRSAV) ; Get original CCR value
|
||||
OUT (C),A ; And update CCR
|
||||
RET
|
||||
;
|
||||
;NORMCPU:
|
||||
; LD A,(Z180) ; Z180 base I/O port
|
||||
; CP $FF ; Check for no value
|
||||
; RET Z ; Bail out if no value
|
||||
; ADD A,$1E ; Apply offset of CMR register
|
||||
; LD C,A ; And put it in C
|
||||
; LD B,0 ; MSB for 16-bit I/O
|
||||
; LD A,(CMRSAV) ; Get original CMR value
|
||||
; OUT (C),A ; And update CMR
|
||||
; INC C ; Now point to CCR register
|
||||
; LD A,(CCRSAV) ; Get original CCR value
|
||||
; OUT (C),A ; And update CCR
|
||||
; RET
|
||||
;
|
||||
; SLOW DOWN I/O FOR FAST CPU'S
|
||||
;
|
||||
SLOWIO:
|
||||
#IF (CPUFAMZ180)
|
||||
LD A,(Z180) ; Z180 base I/O port
|
||||
CP $FF ; Check for no value
|
||||
RET Z ; Bail out if no value
|
||||
@@ -448,11 +454,17 @@ SLOWIO:
|
||||
LD (DCSAV),A ; Save it to restore later
|
||||
OR %00110000 ; Force slow operation (I/O W/S=3)
|
||||
OUT (C),A ; And update DCNTL
|
||||
#ENDIF
|
||||
#IF (SBCV2004)
|
||||
LD A,8 ; sbc-v2-004 change to
|
||||
OUT (112),A ; half clock speed
|
||||
#ENDIF
|
||||
RET
|
||||
;
|
||||
;
|
||||
; RESTORE I/O SPEED FOR FAST CPU'S
|
||||
;
|
||||
NORMIO:
|
||||
#IF (CPUFAMZ180)
|
||||
LD A,(Z180) ; Z180 base I/O port
|
||||
CP $FF ; Check for no value
|
||||
RET Z ; Bail out if no value
|
||||
@@ -461,8 +473,12 @@ NORMIO:
|
||||
LD B,0 ; MSB for 16-bit I/O
|
||||
LD A,(DCSAV) ; Get saved DCNTL value
|
||||
OUT (C),A ; And restore it
|
||||
#ENDIF
|
||||
#IF (SBCV2004)
|
||||
LD A,0 ; sbc-v2-004 change to
|
||||
OUT (112),A ; normal clock speed
|
||||
#ENDIF
|
||||
RET
|
||||
|
||||
;
|
||||
ERRBIO: ; Invalid BIOS or version
|
||||
LD DE,MSGBIO
|
||||
@@ -1982,87 +1998,93 @@ LOUT OUT (C), A ; SELECT REGISTER
|
||||
JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE
|
||||
LD C, D ; SELECT DATA PORT
|
||||
OUT (C), A ; WRITE VALUE TO REGISTER 13
|
||||
LOUT2
|
||||
CALL NORMIO
|
||||
LOUT2 CALL NORMIO
|
||||
EI
|
||||
RET ; AND DONE
|
||||
|
||||
PLAYVIAHBIOS:
|
||||
LD B, BF_SNDVOL
|
||||
LD C, 0
|
||||
LD H, 0
|
||||
LD A, (AYREGS + AmplA)
|
||||
AND $0F
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
;
|
||||
; CHANNEL 0 (LEFT)
|
||||
;
|
||||
LD B, BF_SNDVOL ; SET VOLUME
|
||||
LD C, 0 ; DEVICE 0
|
||||
; LD H, 0
|
||||
LD A, (AYREGS + AmplA) ; GET 4-BIT
|
||||
AND $0F ; VOLUME 0-15
|
||||
RLCA ; AND CONVERT
|
||||
RLCA ; TO HBIOS
|
||||
RLCA ; RANGE 0-255
|
||||
RLCA
|
||||
LD L, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPRD
|
||||
LD C, 0
|
||||
LD HL, (AYREGS+TonA)
|
||||
ld a, h
|
||||
AND $0F
|
||||
;
|
||||
LD B, BF_SNDPRD ; SET PERIOD
|
||||
LD C, 0 ; DEVICE 0
|
||||
LD HL, (AYREGS+TonA) ; GET 12-BIT TONE PERIOD
|
||||
ld A, H ; MASK OFF HIGH
|
||||
AND $0F ; NIBBLE
|
||||
LD H, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPLAY
|
||||
LD C, 0
|
||||
LD D, 0
|
||||
;
|
||||
LD B, BF_SNDPLAY ; PLAY
|
||||
LD C, 0 ; DEVICE 0
|
||||
LD D, 0 ; CHANNEL 0
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDVOL
|
||||
LD C, 0
|
||||
LD H, 0
|
||||
LD A, (AYREGS + AmplB)
|
||||
AND $0F
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
;
|
||||
; CHANNEL 1 (MIDDLE)
|
||||
;
|
||||
LD B, BF_SNDVOL ; SET VOLUME
|
||||
LD C, 0 ; DEVICE 0
|
||||
; LD H, 0
|
||||
LD A, (AYREGS + AmplB) ; GET 4-BIT
|
||||
AND $0F ; VOLUME 0-15
|
||||
RLCA ; AND CONVERT
|
||||
RLCA ; TO HBIOS
|
||||
RLCA ; RANGE 0-255
|
||||
RLCA
|
||||
LD L, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPRD
|
||||
LD C, 0
|
||||
LD HL, (AYREGS+TonB)
|
||||
ld a, h
|
||||
AND $0F
|
||||
;
|
||||
LD B, BF_SNDPRD ; SET PERIOD
|
||||
LD C, 0 ; DEVICE 0
|
||||
LD HL, (AYREGS+TonB) ; GET 12-BIT ONE PERIOD
|
||||
ld a, h ; MASK OFF HIGH
|
||||
AND $0F ; NIBBLE
|
||||
LD H, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPLAY
|
||||
LD C, 0
|
||||
LD D, 1
|
||||
;
|
||||
LD B, BF_SNDPLAY ; PLAY
|
||||
LD C, 0 ; DEVICE 0
|
||||
LD D, 1 ; CHANNEL 1
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDVOL
|
||||
LD C, 0
|
||||
LD H, 0
|
||||
LD A, (AYREGS + AmplC)
|
||||
AND $0F
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
;
|
||||
; CHANNEL 2 (RIGHT)
|
||||
;
|
||||
LD B, BF_SNDVOL ; SET VOLUME
|
||||
LD C, 0 ; DEVICE 0
|
||||
; LD H, 0
|
||||
LD A, (AYREGS + AmplC) ; GET 4-BIT
|
||||
AND $0F ; VOLUME 0-15
|
||||
RLCA ; AND CONVERT
|
||||
RLCA ; TO HBIOS
|
||||
RLCA ; RANGE 0-255
|
||||
RLCA
|
||||
LD L, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPRD
|
||||
LD C, 0
|
||||
LD HL, (AYREGS+TonC)
|
||||
ld a, h
|
||||
AND $0F
|
||||
;
|
||||
LD B, BF_SNDPRD ; SET PERIOD
|
||||
LD C, 0 ; DEVICE 0
|
||||
LD HL, (AYREGS+TonC) ; GET 12-BIT ONE PERIOD
|
||||
ld A, H ; MASK OFF HIGH
|
||||
AND $0F ; NIBBLE
|
||||
LD H, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPLAY
|
||||
LD C, 0
|
||||
LD D, 2
|
||||
RST 08
|
||||
|
||||
;
|
||||
LD B, BF_SNDPLAY ; PLAY
|
||||
LD C, 0 ; DEVICE 0
|
||||
LD D, 2 ; CHANNEL 2
|
||||
RST 08 ; HBIOS CALL
|
||||
|
||||
RET
|
||||
#ENDIF
|
||||
|
||||
|
||||
@@ -1502,7 +1502,7 @@ The currently defined audio device types are:
|
||||
AUDIO ID | Value | Device | Returned registers
|
||||
-------------- | ----- | ---------- | --------------------------------------------
|
||||
SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port
|
||||
SND_SNAY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
|
||||
SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
|
||||
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
@@ -59,10 +59,12 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE
|
||||
;
|
||||
;======================================================================
|
||||
;
|
||||
; DEVICE CAPABILITIES AND CONFIGURATION
|
||||
|
||||
AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
|
||||
AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
|
||||
; DEVICE CAPABILITIES AND CONFIGURATION
|
||||
;
|
||||
SBCV2004 .EQU 1 ; USE SBC-V2-004 HALF CLOCK DIVIDER
|
||||
;
|
||||
AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
|
||||
AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
|
||||
;
|
||||
AY_CLKDIVIDER .EQU 2
|
||||
AY_CLK .EQU CPUOSC / AY_CLKDIVIDER
|
||||
@@ -81,6 +83,8 @@ C7 .EQU SN7RATIO / AY_LAST_NOTE
|
||||
.ECHO C7
|
||||
.ECHO ")\n"
|
||||
|
||||
AUDIOTRACE .SET TRUE
|
||||
|
||||
#INCLUDE "audio.inc"
|
||||
|
||||
;======================================================================
|
||||
@@ -123,8 +127,8 @@ AY_RESET:
|
||||
AUDTRACE(TRACE_INIT)
|
||||
;
|
||||
LD D,AY_R7ENAB ; SET MIXER CONTROL / IO ENABLE
|
||||
LD E,$FF ; $FF - 11 111 111
|
||||
CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A DISABLE
|
||||
LD E,$F8 ; $F8 - 11 111 000
|
||||
CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE
|
||||
|
||||
; CALL AY_VOLUME_OFF ; TURN VOLUME OFF
|
||||
; RET ; AND RETURN SUCCESS
|
||||
@@ -166,9 +170,8 @@ AY_PERIOD:
|
||||
AUDTRACE_HL
|
||||
AUDDEBUG("\r\n")
|
||||
|
||||
INC HL ; MAXIMUM TONE PERIOD IS 12-BITS
|
||||
LD A, H ; ALLOWED RANGE IS 0001-0FFF (4095)
|
||||
CP $10 ; SO OFFSET AND CHECK OF OVERFLOW
|
||||
LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS
|
||||
CP $10 ; ALLOWED RANGE IS 0001-0FFF (4095)
|
||||
JP NC, AY_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
|
||||
|
||||
LD (PENDING_PERIOD), HL ; SAVE AND
|
||||
@@ -285,7 +288,7 @@ AY_QUERY_VOLUME:
|
||||
RET
|
||||
;
|
||||
AY_QUERY_DEV:
|
||||
LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER
|
||||
LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER
|
||||
LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT
|
||||
XOR A
|
||||
RET
|
||||
@@ -342,11 +345,11 @@ AY_APPLY_PRD:
|
||||
AUDTRACE(TRACE_NEWLINE)
|
||||
;
|
||||
LD HL,(PENDING_PERIOD) ; WRITE THE LOWER
|
||||
LD E,L ; 8-BITS OF THE PERIOD
|
||||
LD E,L ; 8-BITS OF THE TONE PERIOD
|
||||
CALL AY_WRTPSG
|
||||
INC D
|
||||
LD E,H ; WRITE THE UPPER
|
||||
CALL AY_WRTPSG ; 8-BITS OF THE PERIOD
|
||||
CALL AY_WRTPSG ; 8-BITS OF THE TONE PERIOD
|
||||
;
|
||||
|
||||
POP AF
|
||||
@@ -363,6 +366,10 @@ AY_APPLY_PRD:
|
||||
;
|
||||
AY_WRTPSG:
|
||||
HB_DI
|
||||
#IF (SBCV2004)
|
||||
LD A,8 ; SBC-V2-004 CHANGE
|
||||
OUT (112),A ; TO HALF CLOCK SPEED
|
||||
#ENDIF
|
||||
#IF (CPUFAM == CPU_Z180)
|
||||
IN0 A,(Z180_DCNTL) ; GET WAIT STATES
|
||||
PUSH AF ; SAVE VALUE
|
||||
@@ -376,16 +383,18 @@ AY_WRTPSG:
|
||||
#IF (CPUFAM == CPU_Z180)
|
||||
POP AF ; GET SAVED DCNTL VALUE
|
||||
OUT0 (Z180_DCNTL),A ; AND RESTORE IT
|
||||
#ENDIF
|
||||
#IF (SBCV2004)
|
||||
LD A,0 ; SBC-V2-004 CHANGE TO
|
||||
OUT (112),A ; NORMAL CLOCK SPEED
|
||||
#ENDIF
|
||||
HB_EI
|
||||
RET
|
||||
;
|
||||
;======================================================================
|
||||
;
|
||||
PENDING_PERIOD
|
||||
.DW 0 ; PENDING PERIOD (10 BITS)
|
||||
PENDING_VOLUME
|
||||
.DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED)
|
||||
PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS)
|
||||
PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS)
|
||||
|
||||
#IF AUDIOTRACE
|
||||
TRACE_INIT .DB "\r\nAY_INIT CALLED\r\n$"
|
||||
@@ -393,7 +402,7 @@ TRACE_VOLUME_OFF .DB "\r\nAY_VOLUME_OFF\r\n$"
|
||||
TRACE_VOLUME_SET .DB "\r\nAY_VOLUME_SET CH: $"
|
||||
TRACE_PLAY .DB "\r\nPLAY\r\n$"
|
||||
TRACE_VOLUME .DB ", VOL: $"
|
||||
TRACE_PORT_WR .DB "\r\nOUT AY-3-8910 $"
|
||||
TRACE_REG_WR .DB "\r\nOUT AY-3-8910 $"
|
||||
TRACE_PERIOD_SET .DB "\r\nAY_PERIOD_SET CH: $"
|
||||
TRACE_PERIOD .DB ", PERIOD: $"
|
||||
TRACE_NEWLINE .DB "\r\n$"
|
||||
|
||||
@@ -347,7 +347,7 @@ SN7_FNTBL:
|
||||
PENDING_PERIOD
|
||||
.DW 0 ; PENDING PERIOD (10 BITS)
|
||||
PENDING_VOLUME
|
||||
.DB 0 ; PENDING VOL (8 BITS -> DOWNOVERTED TO 4 BITS AND INVERTED)
|
||||
.DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED)
|
||||
|
||||
STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$"
|
||||
STR_MESSAGERT .DB ", RIGHT IO=0x$"
|
||||
|
||||
Reference in New Issue
Block a user