1 /***************************************************************************
2
3 Philips SAA1099 Sound driver
4
5 By Juergen Buchmueller and Manuel Abadia
6
7 SAA1099 register layout:
8 ========================
9
10 offs | 7654 3210 | description
11 -----+-----------+---------------------------
12 0x00 | ---- xxxx | Amplitude channel 0 (left)
13 0x00 | xxxx ---- | Amplitude channel 0 (right)
14 0x01 | ---- xxxx | Amplitude channel 1 (left)
15 0x01 | xxxx ---- | Amplitude channel 1 (right)
16 0x02 | ---- xxxx | Amplitude channel 2 (left)
17 0x02 | xxxx ---- | Amplitude channel 2 (right)
18 0x03 | ---- xxxx | Amplitude channel 3 (left)
19 0x03 | xxxx ---- | Amplitude channel 3 (right)
20 0x04 | ---- xxxx | Amplitude channel 4 (left)
21 0x04 | xxxx ---- | Amplitude channel 4 (right)
22 0x05 | ---- xxxx | Amplitude channel 5 (left)
23 0x05 | xxxx ---- | Amplitude channel 5 (right)
24 | |
25 0x08 | xxxx xxxx | Frequency channel 0
26 0x09 | xxxx xxxx | Frequency channel 1
27 0x0a | xxxx xxxx | Frequency channel 2
28 0x0b | xxxx xxxx | Frequency channel 3
29 0x0c | xxxx xxxx | Frequency channel 4
30 0x0d | xxxx xxxx | Frequency channel 5
31 | |
32 0x10 | ---- -xxx | Channel 0 octave select
33 0x10 | -xxx ---- | Channel 1 octave select
34 0x11 | ---- -xxx | Channel 2 octave select
35 0x11 | -xxx ---- | Channel 3 octave select
36 0x12 | ---- -xxx | Channel 4 octave select
37 0x12 | -xxx ---- | Channel 5 octave select
38 | |
39 0x14 | ---- ---x | Channel 0 frequency enable (0 = off, 1 = on)
40 0x14 | ---- --x- | Channel 1 frequency enable (0 = off, 1 = on)
41 0x14 | ---- -x-- | Channel 2 frequency enable (0 = off, 1 = on)
42 0x14 | ---- x--- | Channel 3 frequency enable (0 = off, 1 = on)
43 0x14 | ---x ---- | Channel 4 frequency enable (0 = off, 1 = on)
44 0x14 | --x- ---- | Channel 5 frequency enable (0 = off, 1 = on)
45 | |
46 0x15 | ---- ---x | Channel 0 noise enable (0 = off, 1 = on)
47 0x15 | ---- --x- | Channel 1 noise enable (0 = off, 1 = on)
48 0x15 | ---- -x-- | Channel 2 noise enable (0 = off, 1 = on)
49 0x15 | ---- x--- | Channel 3 noise enable (0 = off, 1 = on)
50 0x15 | ---x ---- | Channel 4 noise enable (0 = off, 1 = on)
51 0x15 | --x- ---- | Channel 5 noise enable (0 = off, 1 = on)
52 | |
53 0x16 | ---- --xx | Noise generator parameters 0
54 0x16 | --xx ---- | Noise generator parameters 1
55 | |
56 0x18 | --xx xxxx | Envelope generator 0 parameters
57 0x18 | x--- ---- | Envelope generator 0 control enable (0 = off, 1 = on)
58 0x19 | --xx xxxx | Envelope generator 1 parameters
59 0x19 | x--- ---- | Envelope generator 1 control enable (0 = off, 1 = on)
60 | |
61 0x1c | ---- ---x | All channels enable (0 = off, 1 = on)
62 0x1c | ---- --x- | Synch & Reset generators
63
64 ***************************************************************************/
65
66 #include "burnint.h"
67 #include "saa1099.h"
68
69 #define LEFT 0x00
70 #define RIGHT 0x01
71
72 /* this structure defines a channel */
73 struct saa1099_channel
74 {
75 INT32 frequency; /* frequency (0x00..0xff) */
76 INT32 freq_enable; /* frequency enable */
77 INT32 noise_enable; /* noise enable */
78 INT32 octave; /* octave (0x00..0x07) */
79 INT32 amplitude[2]; /* amplitude (0x00..0x0f) */
80 INT32 envelope[2]; /* envelope (0x00..0x0f or 0x10 == off) */
81
82 /* vars to simulate the square wave */
83 double counter;
84 double freq;
85 INT32 level;
86 };
87
88 /* this structure defines a noise channel */
89 struct saa1099_noise
90 {
91 /* vars to simulate the noise generator output */
92 double counter;
93 double freq;
94 INT32 level; /* noise polynomal shifter */
95 };
96
97 /* this structure defines a SAA1099 chip */
98 struct saa1099_state
99 {
100 INT32 noise_params[2]; /* noise generators parameters */
101 INT32 env_enable[2]; /* envelope generators enable */
102 INT32 env_reverse_right[2]; /* envelope reversed for right channel */
103 INT32 env_mode[2]; /* envelope generators mode */
104 INT32 env_bits[2]; /* non zero = 3 bits resolution */
105 INT32 env_clock[2]; /* envelope clock mode (non-zero external) */
106 INT32 env_step[2]; /* current envelope step */
107 INT32 all_ch_enable; /* all channels enable */
108 INT32 sync_state; /* sync all channels */
109 INT32 selected_reg; /* selected register */
110 struct saa1099_channel channels[6]; /* channels */
111 struct saa1099_noise noise[2]; /* noise generators */
112 double sample_rate;
113 INT32 bAdd;
114 double gain[2];
115 INT32 output_dir[2];
116 };
117
118 static saa1099_state chips[2];
119 static INT32 nNumChips = 0;
120
121 static const INT32 amplitude_lookup[16] = {
122 0*32767/16, 1*32767/16, 2*32767/16, 3*32767/16,
123 4*32767/16, 5*32767/16, 6*32767/16, 7*32767/16,
124 8*32767/16, 9*32767/16, 10*32767/16, 11*32767/16,
125 12*32767/16, 13*32767/16, 14*32767/16, 15*32767/16
126 };
127
128 static const UINT8 envelope[8][64] = {
129 /* zero amplitude */
130 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
132 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
133 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
134 /* maximum amplitude */
135 {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
136 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
137 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
138 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, },
139 /* single decay */
140 {15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
141 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
142 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
143 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
144 /* repetitive decay */
145 {15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
146 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
147 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
148 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
149 /* single triangular */
150 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
151 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
152 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
153 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
154 /* repetitive triangular */
155 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
156 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
157 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
158 15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
159 /* single attack */
160 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
164 /* repetitive attack */
165 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
166 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
167 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
168 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 }
169 };
170
saa1099_envelope(saa1099_state * saa,INT32 ch)171 static void saa1099_envelope(saa1099_state *saa, INT32 ch)
172 {
173 if (saa->env_enable[ch])
174 {
175 INT32 step, mode, mask;
176 mode = saa->env_mode[ch];
177 /* step from 0..63 and then loop in steps 32..63 */
178 step = saa->env_step[ch] =
179 ((saa->env_step[ch] + 1) & 0x3f) | (saa->env_step[ch] & 0x20);
180
181 mask = 15;
182 if (saa->env_bits[ch])
183 mask &= ~1; /* 3 bit resolution, mask LSB */
184
185 saa->channels[ch*3+0].envelope[ LEFT] =
186 saa->channels[ch*3+1].envelope[ LEFT] =
187 saa->channels[ch*3+2].envelope[ LEFT] = envelope[mode][step] & mask;
188 if (saa->env_reverse_right[ch] & 0x01)
189 {
190 saa->channels[ch*3+0].envelope[RIGHT] =
191 saa->channels[ch*3+1].envelope[RIGHT] =
192 saa->channels[ch*3+2].envelope[RIGHT] = (15 - envelope[mode][step]) & mask;
193 }
194 else
195 {
196 saa->channels[ch*3+0].envelope[RIGHT] =
197 saa->channels[ch*3+1].envelope[RIGHT] =
198 saa->channels[ch*3+2].envelope[RIGHT] = envelope[mode][step] & mask;
199 }
200 }
201 else
202 {
203 /* envelope mode off, set all envelope factors to 16 */
204 saa->channels[ch*3+0].envelope[ LEFT] =
205 saa->channels[ch*3+1].envelope[ LEFT] =
206 saa->channels[ch*3+2].envelope[ LEFT] =
207 saa->channels[ch*3+0].envelope[RIGHT] =
208 saa->channels[ch*3+1].envelope[RIGHT] =
209 saa->channels[ch*3+2].envelope[RIGHT] = 16;
210 }
211 }
212
saa1099Update(INT32 chip,INT16 * output,INT32 samples)213 void saa1099Update(INT32 chip, INT16 *output, INT32 samples)
214 {
215 #if defined FBA_DEBUG
216 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099Update called without init\n"));
217 if (chip > nNumChips) bprintf(PRINT_ERROR, _T("saa1099Update called with invalid chip %x\n"), chip);
218 #endif
219
220 saa1099_state *saa = &chips[chip];
221 INT32 j, ch;
222
223 /* if the channels are disabled we're done */
224 if (!saa->all_ch_enable)
225 {
226 /* init output data */
227 memset (output, 0, samples * sizeof(INT16) * 2);
228 return;
229 }
230
231 for (ch = 0; ch < 2; ch++)
232 {
233 switch (saa->noise_params[ch])
234 {
235 case 0: saa->noise[ch].freq = 31250.0 * 2; break;
236 case 1: saa->noise[ch].freq = 15625.0 * 2; break;
237 case 2: saa->noise[ch].freq = 7812.5 * 2; break;
238 case 3: saa->noise[ch].freq = saa->channels[ch * 3].freq; break;
239 }
240 }
241
242 /* fill all data needed */
243 for( j = 0; j < samples; j++, output+=2)
244 {
245 INT32 output_l = 0, output_r = 0;
246
247 /* for each channel */
248 for (ch = 0; ch < 6; ch++)
249 {
250 if (saa->channels[ch].freq == 0.0)
251 saa->channels[ch].freq = (double)((2 * 15625) << saa->channels[ch].octave) / (511.0 - (double)saa->channels[ch].frequency);
252
253 /* check the actual position in the square wave */
254 saa->channels[ch].counter -= saa->channels[ch].freq;
255
256 while (saa->channels[ch].counter < 0)
257 {
258 /* calculate new frequency now after the half wave is updated */
259 saa->channels[ch].freq = (double)((2 * 15625) << saa->channels[ch].octave) /
260 (511.0 - (double)saa->channels[ch].frequency);
261
262 saa->channels[ch].counter += saa->sample_rate;
263 saa->channels[ch].level ^= 1;
264
265 /* eventually clock the envelope counters */
266 if (ch == 1 && saa->env_clock[0] == 0)
267 saa1099_envelope(saa, 0);
268 if (ch == 4 && saa->env_clock[1] == 0)
269 saa1099_envelope(saa, 1);
270 }
271
272 /* if the noise is enabled */
273 if (saa->channels[ch].noise_enable)
274 {
275 /* if the noise level is high (noise 0: chan 0-2, noise 1: chan 3-5) */
276 if (saa->noise[ch/3].level & 1)
277 {
278 /* subtract to avoid overflows, also use only half amplitude */
279 output_l -= saa->channels[ch].amplitude[ LEFT] * saa->channels[ch].envelope[ LEFT] / 16 / 2;
280 output_r -= saa->channels[ch].amplitude[RIGHT] * saa->channels[ch].envelope[RIGHT] / 16 / 2;
281 }
282 }
283
284 /* if the square wave is enabled */
285 if (saa->channels[ch].freq_enable)
286 {
287 /* if the channel level is high */
288 if (saa->channels[ch].level & 1)
289 {
290 output_l += saa->channels[ch].amplitude[ LEFT] * saa->channels[ch].envelope[ LEFT] / 16;
291 output_r += saa->channels[ch].amplitude[RIGHT] * saa->channels[ch].envelope[RIGHT] / 16;
292 }
293 }
294 }
295
296 for (ch = 0; ch < 2; ch++)
297 {
298 /* check the actual position in noise generator */
299 saa->noise[ch].counter -= saa->noise[ch].freq;
300 while (saa->noise[ch].counter < 0)
301 {
302 saa->noise[ch].counter += saa->sample_rate;
303 if( ((saa->noise[ch].level & 0x4000) == 0) == ((saa->noise[ch].level & 0x0040) == 0) )
304 saa->noise[ch].level = (saa->noise[ch].level << 1) | 1;
305 else
306 saa->noise[ch].level <<= 1;
307 }
308 }
309 /* write sound data to the buffer */
310 INT32 nLeftSample = 0, nRightSample = 0;
311
312 if ((saa->output_dir[BURN_SND_SAA1099_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
313 nLeftSample += (INT32)((output_l / 6) * saa->gain[BURN_SND_SAA1099_ROUTE_1]);
314 }
315 if ((saa->output_dir[BURN_SND_SAA1099_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
316 nRightSample += (INT32)((output_l / 6) * saa->gain[BURN_SND_SAA1099_ROUTE_1]);
317 }
318
319 if ((saa->output_dir[BURN_SND_SAA1099_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
320 nLeftSample += (INT32)((output_r / 6) * saa->gain[BURN_SND_SAA1099_ROUTE_2]);
321 }
322 if ((saa->output_dir[BURN_SND_SAA1099_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
323 nRightSample += (INT32)((output_r / 6) * saa->gain[BURN_SND_SAA1099_ROUTE_2]);
324 }
325
326 nLeftSample = BURN_SND_CLIP(nLeftSample);
327 nRightSample = BURN_SND_CLIP(nRightSample);
328
329 output[LEFT] = nLeftSample;
330 output[RIGHT] = nRightSample;
331 }
332 }
333
saa1099Reset(INT32 chip)334 void saa1099Reset(INT32 chip)
335 {
336 #if defined FBA_DEBUG
337 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099Reset called without init\n"));
338 if (chip > nNumChips) bprintf(PRINT_ERROR, _T("saa1099Reset called with invalid chip %x\n"), chip);
339 #endif
340
341 saa1099_state *saa = &chips[chip];
342
343 double sample_rate = saa->sample_rate;
344 INT32 bAdd = saa->bAdd;
345 double gain0 = saa->gain[BURN_SND_SAA1099_ROUTE_1];
346 double gain1 = saa->gain[BURN_SND_SAA1099_ROUTE_2];
347 INT32 dir0 = saa->output_dir[BURN_SND_SAA1099_ROUTE_1];
348 INT32 dir1 = saa->output_dir[BURN_SND_SAA1099_ROUTE_2];
349
350 memset (saa, 0, sizeof(saa1099_state));
351
352 saa->sample_rate = sample_rate;
353 saa->bAdd = bAdd;
354 saa->gain[BURN_SND_SAA1099_ROUTE_1] = gain0;
355 saa->gain[BURN_SND_SAA1099_ROUTE_2] = gain1;
356 saa->output_dir[BURN_SND_SAA1099_ROUTE_1] = dir0;
357 saa->output_dir[BURN_SND_SAA1099_ROUTE_2] = dir1;
358 }
359
saa1099Init(INT32 chip,INT32 clock,INT32 bAdd)360 void saa1099Init(INT32 chip, INT32 clock, INT32 bAdd)
361 {
362 DebugSnd_SAA1099Initted = 1;
363
364 saa1099_state *saa = &chips[chip];
365
366 saa->sample_rate = clock / 256;
367 saa->bAdd = bAdd;
368 saa->gain[BURN_SND_SAA1099_ROUTE_1] = 1.00;
369 saa->gain[BURN_SND_SAA1099_ROUTE_2] = 1.00;
370 saa->output_dir[BURN_SND_SAA1099_ROUTE_1] = BURN_SND_ROUTE_BOTH;
371 saa->output_dir[BURN_SND_SAA1099_ROUTE_2] = BURN_SND_ROUTE_BOTH;
372
373 nNumChips = chip;
374 }
375
saa1099SetRoute(INT32 chip,INT32 nIndex,double nVolume,INT32 nRouteDir)376 void saa1099SetRoute(INT32 chip, INT32 nIndex, double nVolume, INT32 nRouteDir)
377 {
378 #if defined FBA_DEBUG
379 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099SetRoute called without init\n"));
380 if (chip > nNumChips) bprintf(PRINT_ERROR, _T("saa1099SetRoute called with invalid chip %x\n"), chip);
381 if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("saa1099SetRoute called with invalid index %i\n"), nIndex);
382 #endif
383
384 saa1099_state *saa = &chips[chip];
385
386 saa->gain[nIndex] = nVolume;
387 saa->output_dir[nIndex] = nRouteDir;
388 }
389
saa1099Exit(INT32)390 void saa1099Exit(INT32 )
391 {
392 #if defined FBA_DEBUG
393 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099Exit called without init\n"));
394 #endif
395
396 DebugSnd_SAA1099Initted = 0;
397 nNumChips = 0;
398 }
399
saa1099ControlWrite(INT32 chip,INT32 data)400 void saa1099ControlWrite(INT32 chip, INT32 data)
401 {
402 #if defined FBA_DEBUG
403 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099ControlWrite called without init\n"));
404 if (chip > nNumChips) bprintf(PRINT_ERROR, _T("saa1099ControlWrite called with invalid chip %x\n"), chip);
405 #endif
406
407 saa1099_state *saa = &chips[chip];
408
409 saa->selected_reg = data & 0x1f;
410
411 if (saa->selected_reg == 0x18 || saa->selected_reg == 0x19)
412 {
413 /* clock the envelope channels */
414 if (saa->env_clock[0])
415 saa1099_envelope(saa,0);
416 if (saa->env_clock[1])
417 saa1099_envelope(saa,1);
418 }
419 }
420
saa1099DataWrite(INT32 chip,INT32 data)421 void saa1099DataWrite(INT32 chip, INT32 data)
422 {
423 #if defined FBA_DEBUG
424 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099DataWrite called without init\n"));
425 if (chip > nNumChips) bprintf(PRINT_ERROR, _T("saa1099DataWrite called with invalid chip %x\n"), chip);
426 #endif
427
428 saa1099_state *saa = &chips[chip];
429 INT32 reg = saa->selected_reg;
430 INT32 ch;
431
432 switch (reg)
433 {
434 /* channel i amplitude */
435 case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05:
436 ch = reg & 7;
437 saa->channels[ch].amplitude[LEFT] = amplitude_lookup[data & 0x0f];
438 saa->channels[ch].amplitude[RIGHT] = amplitude_lookup[(data >> 4) & 0x0f];
439 break;
440 /* channel i frequency */
441 case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d:
442 ch = reg & 7;
443 saa->channels[ch].frequency = data & 0xff;
444 break;
445 /* channel i octave */
446 case 0x10: case 0x11: case 0x12:
447 ch = (reg - 0x10) << 1;
448 saa->channels[ch + 0].octave = data & 0x07;
449 saa->channels[ch + 1].octave = (data >> 4) & 0x07;
450 break;
451 /* channel i frequency enable */
452 case 0x14:
453 saa->channels[0].freq_enable = data & 0x01;
454 saa->channels[1].freq_enable = data & 0x02;
455 saa->channels[2].freq_enable = data & 0x04;
456 saa->channels[3].freq_enable = data & 0x08;
457 saa->channels[4].freq_enable = data & 0x10;
458 saa->channels[5].freq_enable = data & 0x20;
459 break;
460 /* channel i noise enable */
461 case 0x15:
462 saa->channels[0].noise_enable = data & 0x01;
463 saa->channels[1].noise_enable = data & 0x02;
464 saa->channels[2].noise_enable = data & 0x04;
465 saa->channels[3].noise_enable = data & 0x08;
466 saa->channels[4].noise_enable = data & 0x10;
467 saa->channels[5].noise_enable = data & 0x20;
468 break;
469 /* noise generators parameters */
470 case 0x16:
471 saa->noise_params[0] = data & 0x03;
472 saa->noise_params[1] = (data >> 4) & 0x03;
473 break;
474 /* envelope generators parameters */
475 case 0x18: case 0x19:
476 ch = reg - 0x18;
477 saa->env_reverse_right[ch] = data & 0x01;
478 saa->env_mode[ch] = (data >> 1) & 0x07;
479 saa->env_bits[ch] = data & 0x10;
480 saa->env_clock[ch] = data & 0x20;
481 saa->env_enable[ch] = data & 0x80;
482 /* reset the envelope */
483 saa->env_step[ch] = 0;
484 break;
485 /* channels enable & reset generators */
486 case 0x1c:
487 saa->all_ch_enable = data & 0x01;
488 saa->sync_state = data & 0x02;
489 if (data & 0x02)
490 {
491 INT32 i;
492
493 /* Synch & Reset generators */
494 for (i = 0; i < 6; i++)
495 {
496 saa->channels[i].level = 0;
497 saa->channels[i].counter = 0.0;
498 }
499 }
500 break;
501 default: break; /* Error! */
502 }
503 }
504
saa1099Scan(INT32 nAction,INT32 *)505 void saa1099Scan(INT32 nAction, INT32 *)
506 {
507 #if defined FBA_DEBUG
508 if (!DebugSnd_SAA1099Initted) bprintf(PRINT_ERROR, _T("saa1099Scan called without init\n"));
509 #endif
510
511 struct BurnArea ba;
512 saa1099_state *saa ;
513
514 if (nAction & ACB_VOLATILE)
515 {
516 for (INT32 i = 0; i < 2; i++)
517 {
518 saa = &chips[i];
519 memset(&ba, 0, sizeof(ba));
520
521 ba.Data = (UINT8*)saa;
522 ba.nLen = sizeof(saa1099_state);
523 ba.szName = "SAA data";
524 BurnAcb(&ba);
525 }
526 }
527 }
528