1 /* Sound channel usage
2 0 = CPU music, Shoot
3 1 = Crash
4 2 = Spectar sound
5 3 = Tone generator
6 */
7
8 #include "driver.h"
9
10 static int tone_channel;
11
12 unsigned char targ_spec_flag;
13 static unsigned char targ_sh_ctrl0=0;
14 static unsigned char targ_sh_ctrl1=0;
15 static unsigned char tone_active;
16
17 #define MAXFREQ_A_TARG 125000
18 #define MAXFREQ_A_SPECTAR 525000
19
20 static int sound_a_freq;
21 static unsigned char tone_pointer;
22 static unsigned char tone_offset;
23
24 static unsigned char tone_prom[32] =
25 {
26 0xE5,0xE5,0xED,0xED,0xE5,0xE5,0xED,0xED,0xE7,0xE7,0xEF,0xEF,0xE7,0xE7,0xEF,0xEF,
27 0xC1,0xE1,0xC9,0xE9,0xC5,0xE5,0xCD,0xED,0xC3,0xE3,0xCB,0xEB,0xC7,0xE7,0xCF,0xEF
28 };
29
30 /* waveforms for the audio hardware */
31 static unsigned char waveform1[32] =
32 {
33 /* sine-wave */
34 0x0F, 0x0F, 0x0F, 0x06, 0x06, 0x09, 0x09, 0x06, 0x06, 0x09, 0x06, 0x0D, 0x0F, 0x0F, 0x0D, 0x00,
35 0xE6, 0xDE, 0xE1, 0xE6, 0xEC, 0xE6, 0xE7, 0xE7, 0xE7, 0xEC, 0xEC, 0xEC, 0xE7, 0xE1, 0xE1, 0xE7,
36 };
37
38 /* some macros to make detecting bit changes easier */
39 #define RISING_EDGE(bit) ((data & bit) && !(targ_sh_ctrl0 & bit))
40 #define FALLING_EDGE(bit) (!(data & bit) && (targ_sh_ctrl0 & bit))
41
42
targ_tone_generator(int data)43 void targ_tone_generator(int data)
44 {
45 int maxfreq;
46
47
48 if (targ_spec_flag) maxfreq = MAXFREQ_A_TARG;
49 else maxfreq = MAXFREQ_A_SPECTAR;
50
51 sound_a_freq = data;
52 if (sound_a_freq == 0xFF || sound_a_freq == 0x00)
53 {
54 mixer_set_volume(tone_channel,0);
55 }
56 else
57 {
58 mixer_set_sample_frequency(tone_channel,maxfreq/(0xFF-sound_a_freq));
59 mixer_set_volume(tone_channel,tone_active*100);
60 }
61 }
62
targ_sh_start(const struct MachineSound * msound)63 int targ_sh_start(const struct MachineSound *msound)
64 {
65 tone_channel = mixer_allocate_channel(50);
66
67 tone_pointer=0;
68 tone_offset=0;
69 tone_active=0;
70 sound_a_freq = 0x00;
71 mixer_set_volume(tone_channel,0);
72 mixer_play_sample(tone_channel,(signed char*)waveform1,32,1000,1);
73 return 0;
74 }
75
targ_sh_stop(void)76 void targ_sh_stop(void)
77 {
78 mixer_stop_sample(tone_channel);
79 }
80
WRITE_HANDLER(targ_sh_w)81 WRITE_HANDLER( targ_sh_w )
82 {
83 int maxfreq;
84
85
86 if (targ_spec_flag) maxfreq = MAXFREQ_A_TARG;
87 else maxfreq = MAXFREQ_A_SPECTAR;
88
89 if (offset) {
90 if (targ_spec_flag) {
91 if (data & 0x02)
92 tone_offset=16;
93 else
94 tone_offset=0;
95
96 if ((data & 0x01) && !(targ_sh_ctrl1 & 0x01)) {
97 tone_pointer++;
98 if (tone_pointer > 15) tone_pointer = 0;
99 targ_tone_generator(tone_prom[tone_pointer+tone_offset]);
100 }
101 }
102 else {
103 targ_tone_generator(data);
104 }
105 targ_sh_ctrl1=data;
106 }
107 else
108 {
109 /* cpu music */
110 if ((data & 0x01) != (targ_sh_ctrl0 & 0x01)) {
111 DAC_data_w(0,(data & 0x01) * 0xFF);
112 }
113 /* Shoot */
114 if FALLING_EDGE(0x02) {
115 if (!sample_playing(0)) sample_start(0,1,0);
116 }
117 if RISING_EDGE(0x02) {
118 sample_stop(0);
119 }
120
121 /* Crash */
122 if RISING_EDGE(0x20) {
123 if (data & 0x40) {
124 sample_start(1,2,0); }
125 else {
126 sample_start(1,0,0); }
127 }
128
129 /* Sspec */
130 if (data & 0x10) {
131 sample_stop(2);
132 }
133 else {
134 if ((data & 0x08) != (targ_sh_ctrl0 & 0x08)) {
135 if (data & 0x08) {
136 sample_start(2,3,1); }
137 else {
138 sample_start(2,4,1); }
139 }
140 }
141
142 /* Game (tone generator enable) */
143 if FALLING_EDGE(0x80) {
144 tone_pointer=0;
145 tone_active=0;
146 if (sound_a_freq == 0xFF || sound_a_freq == 0x00)
147 {
148 mixer_set_volume(tone_channel,0);
149 }
150 else
151 {
152 mixer_set_sample_frequency(tone_channel,maxfreq/(0xFF-sound_a_freq));
153 mixer_set_volume(tone_channel,0);
154 }
155 }
156 if RISING_EDGE(0x80) {
157 tone_active=1;
158 }
159 targ_sh_ctrl0 = data;
160 }
161 }
162
163