1 // license:GPL-2.0+
2 // copyright-holders:Juergen Buchmueller
3 /***************************************************************************
4     meadows.c
5     Sound handler
6     Dead Eye, Gypsy Juggler
7 
8     J. Buchmueller, June '98
9 ****************************************************************************/
10 
11 #include "emu.h"
12 #include "cpu/s2650/s2650.h"
13 #include "includes/meadows.h"
14 #include "sound/samples.h"
15 
16 
17 
18 #define BASE_CLOCK      5000000
19 #define BASE_CTR1       (BASE_CLOCK / 256)
20 #define BASE_CTR2       (BASE_CLOCK / 32)
21 
22 #define DIV2OR4_CTR2    0x01
23 #define ENABLE_CTR2     0x02
24 #define ENABLE_DAC      0x04
25 #define ENABLE_CTR1     0x08
26 
27 static const int16_t waveform[2] = { -120*256, 120*256 };
28 
29 /************************************/
30 /* Sound handler start              */
31 /************************************/
SAMPLES_START_CB_MEMBER(meadows_state::meadows_sh_start)32 SAMPLES_START_CB_MEMBER(meadows_state::meadows_sh_start)
33 {
34 	m_0c00 = m_0c01 = m_0c02 = m_0c03 = 0;
35 	m_channel = 0;
36 	m_freq1 = m_freq2 = 1000;
37 	m_latched_0c01 = m_latched_0c02 = m_latched_0c03 = 0;
38 
39 	m_samples->set_volume(0,0);
40 	m_samples->start_raw(0,waveform,ARRAY_LENGTH(waveform),m_freq1,true);
41 	m_samples->set_volume(1,0);
42 	m_samples->start_raw(1,waveform,ARRAY_LENGTH(waveform),m_freq2,true);
43 }
44 
45 /************************************/
46 /* Sound handler update             */
47 /************************************/
meadows_sh_update()48 void meadows_state::meadows_sh_update()
49 {
50 	int preset, amp;
51 
52 	if (m_latched_0c01 != m_0c01 || m_latched_0c03 != m_0c03)
53 	{
54 		/* amplitude is a combination of the upper 4 bits of 0c01 */
55 		/* and bit 4 merged from S2650's flag output */
56 		amp = ((m_0c03 & ENABLE_CTR1) == 0) ? 0 : (m_0c01 & 0xf0) >> 1;
57 		if( m_maincpu->state_int(S2650_FO) )
58 			amp += 0x80;
59 		/* calculate frequency for counter #1 */
60 		/* bit 0..3 of 0c01 are ctr preset */
61 		preset = (m_0c01 & 15) ^ 15;
62 		if (preset)
63 			m_freq1 = BASE_CTR1 / (preset + 1);
64 		else amp = 0;
65 		logerror("meadows ctr1 channel #%d preset:%3d freq:%5d amp:%d\n", m_channel, preset, m_freq1, amp);
66 		m_samples->set_frequency(0, m_freq1 * sizeof(waveform)/2);
67 		m_samples->set_volume(0,amp/255.0);
68 	}
69 
70 	if (m_latched_0c02 != m_0c02 || m_latched_0c03 != m_0c03)
71 	{
72 		/* calculate frequency for counter #2 */
73 		/* 0c02 is ctr preset, 0c03 bit 0 enables division by 2 */
74 		amp = ((m_0c03 & ENABLE_CTR2) != 0) ? 0xa0 : 0;
75 		preset = m_0c02 ^ 0xff;
76 		if (preset)
77 		{
78 			m_freq2 = BASE_CTR2 / (preset + 1) / 2;
79 			if ((m_0c03 & DIV2OR4_CTR2) == 0)
80 				m_freq2 >>= 1;
81 		}
82 		else amp = 0;
83 		logerror("meadows ctr2 channel #%d preset:%3d freq:%5d amp:%d\n", m_channel+1, preset, m_freq2, amp);
84 		m_samples->set_frequency(1, m_freq2 * sizeof(waveform));
85 		m_samples->set_volume(1,amp/255.0);
86 	}
87 
88 	if (((m_latched_0c03 ^ m_0c03) & ENABLE_DAC) != 0)
89 	{
90 		m_dac->set_output_gain(ALL_OUTPUTS, (m_0c03 & ENABLE_DAC) != 0 ? 1.0 : 0.0);
91 	}
92 
93 	m_latched_0c01 = m_0c01;
94 	m_latched_0c02 = m_0c02;
95 	m_latched_0c03 = m_0c03;
96 }
97