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