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