Browse Source

ay-3-8910 sound driver updates

pull/117/head
b1ackmai1er 6 years ago
parent
commit
3dfeaabe2f
  1. 226
      Source/Apps/Tune/Tune.asm
  2. 2
      Source/Doc/Architecture.md
  3. 43
      Source/HBIOS/ay38910.asm
  4. 2
      Source/HBIOS/sn76489.asm

226
Source/Apps/Tune/Tune.asm

@ -40,6 +40,7 @@
; 2020-02-11 [WBW] Made hardware config & detection more flexible ; 2020-02-11 [WBW] Made hardware config & detection more flexible
; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing ; 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-04-25 [DEN] Added support to use HBIOS Sound driver
; 2020-05-02 [PMS] Add support for SBC-V2 slow-io hack
;_______________________________________________________________________________ ;_______________________________________________________________________________
; ;
; ToDo: ; ToDo:
@ -53,14 +54,18 @@
#include "hbios.inc" #include "hbios.inc"
#include "cpm.inc" #include "cpm.inc"
#include "tune.inc" #include "tune.inc"
;
HEAPEND .EQU $C000 ; End of heap storage HEAPEND .EQU $C000 ; End of heap storage
; ;
TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file
TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file
TYPMYM .EQU 3 ; FILTYP value for MYM 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 ;Conditional assembly - use -D switch on TASM or uz80as assembler to control
_ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards) _ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards)
_MSX .EQU 0 _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
;
;
;
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
;
;
;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
;
; SLOW DOWN I/O FOR FAST CPU'S
; ;
SLOWIO: SLOWIO:
#IF (CPUFAMZ180)
LD A,(Z180) ; Z180 base I/O port LD A,(Z180) ; Z180 base I/O port
CP $FF ; Check for no value CP $FF ; Check for no value
RET Z ; Bail out if no value RET Z ; Bail out if no value
@ -448,11 +454,17 @@ SLOWIO:
LD (DCSAV),A ; Save it to restore later LD (DCSAV),A ; Save it to restore later
OR %00110000 ; Force slow operation (I/O W/S=3) OR %00110000 ; Force slow operation (I/O W/S=3)
OUT (C),A ; And update DCNTL 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 RET
; ;
;
; RESTORE I/O SPEED FOR FAST CPU'S
; ;
NORMIO: NORMIO:
#IF (CPUFAMZ180)
LD A,(Z180) ; Z180 base I/O port LD A,(Z180) ; Z180 base I/O port
CP $FF ; Check for no value CP $FF ; Check for no value
RET Z ; Bail out if no value RET Z ; Bail out if no value
@ -461,8 +473,12 @@ NORMIO:
LD B,0 ; MSB for 16-bit I/O LD B,0 ; MSB for 16-bit I/O
LD A,(DCSAV) ; Get saved DCNTL value LD A,(DCSAV) ; Get saved DCNTL value
OUT (C),A ; And restore it 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 RET
; ;
ERRBIO: ; Invalid BIOS or version ERRBIO: ; Invalid BIOS or version
LD DE,MSGBIO 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 JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE
LD C, D ; SELECT DATA PORT LD C, D ; SELECT DATA PORT
OUT (C), A ; WRITE VALUE TO REGISTER 13 OUT (C), A ; WRITE VALUE TO REGISTER 13
LOUT2
CALL NORMIO
LOUT2 CALL NORMIO
EI EI
RET ; AND DONE RET ; AND DONE
PLAYVIAHBIOS: 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 LD L, A
RST 08 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 LD H, A
RST 08 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 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 LD L, A
RST 08 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 LD H, A
RST 08 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 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 LD L, A
RST 08 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 LD H, A
RST 08 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 RET
#ENDIF #ENDIF

2
Source/Doc/Architecture.md

@ -1502,7 +1502,7 @@ The currently defined audio device types are:
AUDIO ID | Value | Device | Returned registers AUDIO ID | Value | Device | Returned registers
-------------- | ----- | ---------- | -------------------------------------------- -------------- | ----- | ---------- | --------------------------------------------
SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port 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} `\clearpage`{=latex}

43
Source/HBIOS/ay38910.asm

@ -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_CLKDIVIDER .EQU 2
AY_CLK .EQU CPUOSC / AY_CLKDIVIDER AY_CLK .EQU CPUOSC / AY_CLKDIVIDER
@ -81,6 +83,8 @@ C7 .EQU SN7RATIO / AY_LAST_NOTE
.ECHO C7 .ECHO C7
.ECHO ")\n" .ECHO ")\n"
AUDIOTRACE .SET TRUE
#INCLUDE "audio.inc" #INCLUDE "audio.inc"
;====================================================================== ;======================================================================
@ -123,8 +127,8 @@ AY_RESET:
AUDTRACE(TRACE_INIT) AUDTRACE(TRACE_INIT)
; ;
LD D,AY_R7ENAB ; SET MIXER CONTROL / IO ENABLE 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 ; CALL AY_VOLUME_OFF ; TURN VOLUME OFF
; RET ; AND RETURN SUCCESS ; RET ; AND RETURN SUCCESS
@ -166,9 +170,8 @@ AY_PERIOD:
AUDTRACE_HL AUDTRACE_HL
AUDDEBUG("\r\n") 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 JP NC, AY_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
LD (PENDING_PERIOD), HL ; SAVE AND LD (PENDING_PERIOD), HL ; SAVE AND
@ -285,7 +288,7 @@ AY_QUERY_VOLUME:
RET RET
; ;
AY_QUERY_DEV: 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 LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT
XOR A XOR A
RET RET
@ -342,11 +345,11 @@ AY_APPLY_PRD:
AUDTRACE(TRACE_NEWLINE) AUDTRACE(TRACE_NEWLINE)
; ;
LD HL,(PENDING_PERIOD) ; WRITE THE LOWER 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 CALL AY_WRTPSG
INC D INC D
LD E,H ; WRITE THE UPPER 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 POP AF
@ -363,6 +366,10 @@ AY_APPLY_PRD:
; ;
AY_WRTPSG: AY_WRTPSG:
HB_DI HB_DI
#IF (SBCV2004)
LD A,8 ; SBC-V2-004 CHANGE
OUT (112),A ; TO HALF CLOCK SPEED
#ENDIF
#IF (CPUFAM == CPU_Z180) #IF (CPUFAM == CPU_Z180)
IN0 A,(Z180_DCNTL) ; GET WAIT STATES IN0 A,(Z180_DCNTL) ; GET WAIT STATES
PUSH AF ; SAVE VALUE PUSH AF ; SAVE VALUE
@ -376,16 +383,18 @@ AY_WRTPSG:
#IF (CPUFAM == CPU_Z180) #IF (CPUFAM == CPU_Z180)
POP AF ; GET SAVED DCNTL VALUE POP AF ; GET SAVED DCNTL VALUE
OUT0 (Z180_DCNTL),A ; AND RESTORE IT 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 #ENDIF
HB_EI HB_EI
RET 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 #IF AUDIOTRACE
TRACE_INIT .DB "\r\nAY_INIT CALLED\r\n$" 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_VOLUME_SET .DB "\r\nAY_VOLUME_SET CH: $"
TRACE_PLAY .DB "\r\nPLAY\r\n$" TRACE_PLAY .DB "\r\nPLAY\r\n$"
TRACE_VOLUME .DB ", VOL: $" 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_SET .DB "\r\nAY_PERIOD_SET CH: $"
TRACE_PERIOD .DB ", PERIOD: $" TRACE_PERIOD .DB ", PERIOD: $"
TRACE_NEWLINE .DB "\r\n$" TRACE_NEWLINE .DB "\r\n$"

2
Source/HBIOS/sn76489.asm

@ -347,7 +347,7 @@ SN7_FNTBL:
PENDING_PERIOD PENDING_PERIOD
.DW 0 ; PENDING PERIOD (10 BITS) .DW 0 ; PENDING PERIOD (10 BITS)
PENDING_VOLUME 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_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$"
STR_MESSAGERT .DB ", RIGHT IO=0x$" STR_MESSAGERT .DB ", RIGHT IO=0x$"

Loading…
Cancel
Save