Browse Source

Merge pull request #121 from b1ackmai1er/dev

Sound driver tweaks
patch
Wayne Warthen 6 years ago
committed by GitHub
parent
commit
112a94c69d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 105
      Source/Apps/Tune/Tune.asm
  2. 81
      Source/HBIOS/ay38910.asm
  3. 5
      Source/HBIOS/sn76489.asm

105
Source/Apps/Tune/Tune.asm

@ -2006,84 +2006,69 @@ PLAYVIAHBIOS:
;
; 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 BC, (BF_SNDVOL*256)+0 ; SET VOLUME
LD A, (AYREGS + AmplA) ; DEVICE 0
ADD A,A ; GET 4-BIT
ADD A,A ; VOLUME 0-15
ADD A,A ; AND CONVERT
ADD A,A ; TO HBIOS
LD L, A ; RANGE 0-255
RST 08
;
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 BC, (BF_SNDPRD*256)+0 ; SET PERIOD
LD HL, (AYREGS+TonA) ; DEVICE 0
ld A, H ; GET 12-BIT ONE PERIOD
AND $0F ; MASK OFF HIGH
LD H, A ; NIBBLE
RST 08
;
LD B, BF_SNDPLAY ; PLAY
LD C, 0 ; DEVICE 0
LD D, 0 ; CHANNEL 0
RST 08
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
LD D, 0 ; DEVICE 0
RST 08 ; CHANNEL 0
;
; 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 BC, (BF_SNDVOL*256)+0 ; SET VOLUME
LD A, (AYREGS + AmplB) ; DEVICE 0
ADD A,A ; GET 4-BIT
ADD A,A ; VOLUME 0-15
ADD A,A ; AND CONVERT
ADD A,A ; TO HBIOS
LD L, A ; RANGE 0-255
RST 08
;
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 BC, (BF_SNDPRD*256)+0 ; SET PERIOD
LD HL, (AYREGS+TonB) ; DEVICE 0
ld A, H ; GET 12-BIT ONE PERIOD
AND $0F ; MASK OFF HIGH
LD H, A ; NIBBLE
RST 08
;
LD B, BF_SNDPLAY ; PLAY
LD C, 0 ; DEVICE 0
LD D, 1 ; CHANNEL 1
RST 08
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
LD D, 1 ; DEVICE 0
RST 08 ; CHANNEL 0
;
; 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 BC, (BF_SNDVOL*256)+0 ; SET VOLUME
LD A, (AYREGS + AmplC) ; DEVICE 0
ADD A,A ; GET 4-BIT
ADD A,A ; VOLUME 0-15
ADD A,A ; AND CONVERT
ADD A,A ; TO HBIOS
LD L, A ; RANGE 0-255
RST 08
;
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 BC, (BF_SNDPRD*256)+0 ; SET PERIOD
LD HL, (AYREGS+TonC) ; DEVICE 0
ld A, H ; GET 12-BIT ONE PERIOD
AND $0F ; MASK OFF HIGH
LD H, A ; NIBBLE
RST 08
;
LD B, BF_SNDPLAY ; PLAY
LD C, 0 ; DEVICE 0
LD D, 2 ; CHANNEL 2
RST 08 ; HBIOS CALL
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
LD D, 2 ; DEVICE 0
RST 08 ; CHANNEL 0
RET
#ENDIF

81
Source/HBIOS/ay38910.asm

@ -4,26 +4,32 @@
;
;======================================================================
;
AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE
;
#IF (AYMODE == AYMODE_SCG)
AY_RSEL .EQU $9A
AY_RDAT .EQU $9B
AY_RIN .EQU AY_RSEL
AY_ACR .EQU $9C
#ENDIF
;
#IF (AYMODE == AYMODE_N8)
AY_RSEL .EQU $9C
AY_RDAT .EQU $9D
AY_RIN .EQU AY_RSEL
AY_ACR .EQU N8_DEFACR
#ENDIF
;
#IF (AYMODE == AYMODE_RCZ80)
#IF (AYMODE == AYMODE_RCZ80)
AY_RSEL .EQU $D8
AY_RDAT .EQU $D0
AY_RIN .EQU AY_RSEL+AY_RCSND
#ENDIF
;
#IF (AYMODE == AYMODE_RCZ180)
AY_RSEL .EQU $68
AY_RDAT .EQU $60
AY_RIN .EQU AY_RSEL+AY_RCSND
#ENDIF
;
;======================================================================
@ -58,14 +64,16 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE
;
; DEVICE CAPABILITIES AND CONFIGURATION
;
SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER
SBCV2004 .EQU 0 ; 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_PHICLK .EQU 3579500
AY_CLKDIV .EQU 2
AY_CLK .EQU AY_PHICLK / AY_CLKDIV
;AY_PHICLK .EQU 3579500 ; MSX NTSC COLOUR BURST FREQ = 315/88
;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ
;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG
;AY_CLKDIV .EQU 2
;AY_CLK .EQU AY_PHICLK / AY_CLKDIV
;
#INCLUDE "audio.inc"
;
@ -85,12 +93,24 @@ AY38910_INIT:
CALL PRTHEXBYTE
;
#IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8))
; ACTIVATE DEVICE
LD A,$FF ; BIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED
LD A,$FF ; ACTIVATE DEVICEBIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED
OUT (AY_ACR),A ; SET INIT AUX CONTROL REG
#ENDIF
;
LD IY, AY_IDAT ; SETUP FUNCTION TABLE
LD D,AY_R2CHBP ; SIMPLE HARDWARE PROBE
LD E,$55
CALL AY_WRTPSG ; WRITE AND
CALL AY_RDPSG ; READ TO A
LD A,$55 ; SOUND CHANNEL
CP E ; REGISTER
JR Z,AY_FND
;
CALL PRTSTRD \ .TEXT " NOT PRESENT$"
;
LD A,$FF ; UNSUCCESSFULL INIT
RET
;
AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE
LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA
LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS
CALL SND_ADDENT ; DE := INSTANCE DATA PTR
@ -100,9 +120,9 @@ AY38910_INIT:
LD E,$07 ; SET VOLUME TO 50%
CALL AY_SETV ; ON ALL CHANNELS
;
LD D,AY_R2CHBP ; BEEP ON CHANNEL B (CENTER)
LD E,$55
CALL AY_WRTPSG ; R02 = $55 = 01010101
; LD D,AY_R2CHBP ; BEEP ON CHANNEL B (CENTER)
; LD E,$55
; CALL AY_WRTPSG ; R02 = $55 = 01010101
LD D,AY_R3CHBP
LD E,$00
CALL AY_WRTPSG ; R03 = $00 = XXXX0000
@ -112,7 +132,8 @@ AY38910_INIT:
LD E,$00 ; SET VOLUME OFF
CALL AY_SETV ; ON ALL CHANNELS
;
; RET
XOR A ; SUCCESSFULL INIT
RET
;
;======================================================================
; INITIALIZE DEVICE
@ -221,8 +242,6 @@ AY_NOTE:
JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL
;
ADD HL, DE ; RESTORE HL
; EX DE,HL
; LD HL, AY3NOTETBL ; HL = AY3NOTETBL + HL
LD DE, AY3NOTETBL ; HL = AY3NOTETBL + HL
ADD HL, DE
;
@ -390,6 +409,38 @@ AY_WRTPSG:
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
;
;======================================================================
;
; READ FROM REGISTER D AND RETURN WITH RESULT IN E
;
AY_RDPSG:
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
OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3)
OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL
#ENDIF
LD A,D ; SELECT THE REGISTER WE
OUT (AY_RSEL),A ; WANT TO READ
IN A,(AY_RIN) ; READ SELECTED REGISTER
LD E,A
#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
@ -416,7 +467,7 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $"
; FREQUENCY TONE TABLE (SEMITONE CURRENTLY)
;======================================================================
;
; PERIOD OCTAVE NOTE MIDI#
; MSX TABLE PERIOD OCTAVE NOTE MIDI#
;
AY3NOTETBL:
; .DW 6842 ;0 12

5
Source/HBIOS/sn76489.asm

@ -119,6 +119,7 @@ SN7_NOTE:
AUDTRACE_L
AUDTRACE_CR
LD H,0
ADD HL, HL ; SHIFT RIGHT (MULT 2) -INDEX INTO SN7NOTETBL TABLE OF WORDS
; TEST IF HL IS LARGER THAN SN7NOTETBL SIZE
OR A ; CLEAR CARRY FLAG
@ -127,9 +128,7 @@ SN7_NOTE:
JR NC, SN7_NOTE1 ; INCOMING HL DOES NOT MAP INTO SN7NOTETBL
ADD HL, DE ; RESTORE HL
LD E, L ; HL = SN7NOTETBL + HL
LD D, H
LD HL, SN7NOTETBL
LD DE, SN7NOTETBL
ADD HL, DE
LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL

Loading…
Cancel
Save