@@ -270,12 +270,18 @@ static void c6280mame_w(void *chip, UINT8 offset, UINT8 data)
270270
271271static void c6280mame_update (void * param , UINT32 samples , DEV_SMPL * * outputs )
272272{
273+ static const UINT8 scale_tab [16 ] =
274+ {
275+ 0x00 , 0x03 , 0x05 , 0x07 , 0x09 , 0x0b , 0x0d , 0x0f ,
276+ 0x10 , 0x13 , 0x15 , 0x17 , 0x19 , 0x1b , 0x1d , 0x1f
277+ };
278+
273279 int ch ;
274280 UINT32 i ;
275281 c6280_t * p = (c6280_t * )param ;
276282
277- UINT8 lmal = (p -> balance >> 4 ) & 0x0F ;
278- UINT8 rmal = (p -> balance >> 0 ) & 0x0F ;
283+ UINT8 lmal = scale_tab [ (p -> balance >> 4 ) & 0x0F ] ;
284+ UINT8 rmal = scale_tab [ (p -> balance >> 0 ) & 0x0F ] ;
279285
280286 /* Clear buffer */
281287 memset (outputs [0 ], 0x00 , samples * sizeof (DEV_SMPL ));
@@ -286,85 +292,85 @@ static void c6280mame_update(void* param, UINT32 samples, DEV_SMPL **outputs)
286292 /* Only look at enabled channels */
287293 if ((p -> channel [ch ].control & 0x80 ) && ! p -> channel [ch ].Muted )
288294 {
289- UINT8 lal = (p -> channel [ch ].balance >> 4 ) & 0x0F ;
290- UINT8 ral = (p -> channel [ch ].balance >> 0 ) & 0x0F ;
291- UINT8 al = (p -> channel [ch ].control >> 1 ) & 0x0F ; // only high 4 bit is affected to calculating volume, low 1 bit is independent
295+ t_channel * chan = & p -> channel [ch ];
296+ UINT8 lal = scale_tab [(chan -> balance >> 4 ) & 0x0F ];
297+ UINT8 ral = scale_tab [(chan -> balance >> 0 ) & 0x0F ];
298+ UINT8 al = chan -> control & 0x1F ;
292299 INT16 vll , vlr ;
293300
294301 // verified from both patent and manual
295- vll = (0xf - lmal ) + (0xf - al ) + (0xf - lal );
296- if (vll > 0xf ) vll = 0xf ;
302+ vll = (0x1f - lmal ) + (0x1f - al ) + (0x1f - lal );
303+ if (vll > 0x1f ) vll = 0x1f ;
297304
298- vlr = (0xf - rmal ) + (0xf - al ) + (0xf - ral );
299- if (vlr > 0xf ) vlr = 0xf ;
305+ vlr = (0x1f - rmal ) + (0x1f - al ) + (0x1f - ral );
306+ if (vlr > 0x1f ) vlr = 0x1f ;
300307
301- vll = p -> volume_table [( vll << 1 ) | (~ p -> channel [ ch ]. control & 1 ) ];
302- vlr = p -> volume_table [( vlr << 1 ) | (~ p -> channel [ ch ]. control & 1 ) ];
308+ vll = p -> volume_table [vll ];
309+ vlr = p -> volume_table [vlr ];
303310
304311 /* Check channel mode */
305- if ((ch >= 4 ) && (p -> channel [ ch ]. noise_control & 0x80 ))
312+ if ((ch >= 4 ) && (chan -> noise_control & 0x80 ))
306313 {
307314 /* Noise mode */
308- UINT32 step = p -> noise_freq_tab [(p -> channel [ ch ]. noise_control & 0x1F ) ^ 0x1F ];
309- for (i = 0 ; i < samples ; i += 1 )
315+ UINT32 step = p -> noise_freq_tab [(chan -> noise_control & 0x1F ) ^ 0x1F ];
316+ for (i = 0 ; i < samples ; i ++ )
310317 {
311- INT16 data = (p -> channel [ ch ]. noise_seed & 1 ) ? 0x1F : 0 ;
312- p -> channel [ ch ]. noise_counter += step ;
313- if (p -> channel [ ch ]. noise_counter >= 0x800 )
318+ INT16 data = (chan -> noise_seed & 1 ) ? 0x1F : 0 ;
319+ chan -> noise_counter += step ;
320+ if (chan -> noise_counter >= 0x800 )
314321 {
315- UINT32 seed = p -> channel [ ch ]. noise_seed ;
322+ UINT32 seed = chan -> noise_seed ;
316323 // based on Charles MacDonald's research
317324 UINT32 feedback = ((seed ) ^ (seed >> 1 ) ^ (seed >> 11 ) ^ (seed >> 12 ) ^ (seed >> 17 )) & 1 ;
318- p -> channel [ ch ]. noise_seed = (p -> channel [ ch ]. noise_seed >> 1 ) ^ (feedback << 17 );
325+ chan -> noise_seed = (chan -> noise_seed >> 1 ) ^ (feedback << 17 );
319326 }
320- p -> channel [ ch ]. noise_counter &= 0x7FF ;
327+ chan -> noise_counter &= 0x7FF ;
321328 outputs [0 ][i ] += (vll * (data - 16 ));
322329 outputs [1 ][i ] += (vlr * (data - 16 ));
323330 }
324331 }
325- else
326- if (p -> channel [ch ].control & 0x40 )
332+ else if (chan -> control & 0x40 )
327333 {
328334 /* DDA mode */
329335 for (i = 0 ; i < samples ; i ++ )
330336 {
331- outputs [0 ][i ] += (vll * (p -> channel [ ch ]. dda - 16 ));
332- outputs [1 ][i ] += (vlr * (p -> channel [ ch ]. dda - 16 ));
337+ outputs [0 ][i ] += (vll * (chan -> dda - 16 ));
338+ outputs [1 ][i ] += (vlr * (chan -> dda - 16 ));
333339 }
334340 }
335341 else
336342 {
337- //if ((p->lfo_control & 3) && (ch < 2))
338- if ((p -> lfo_control & 0x80 ) && (ch < 2 ))
343+ if ((p -> lfo_control & 3 ) && (ch < 2 ))
339344 {
340345 if (ch == 0 ) // CH 0 only, CH 1 is muted
341346 {
342347 /* Waveform mode with LFO */
343- UINT16 lfo_step = p -> channel [1 ].frequency ;
344- for (i = 0 ; i < samples ; i += 1 )
348+ t_channel * lfo_srcchan = & p -> channel [1 ];
349+ t_channel * lfo_dstchan = & p -> channel [0 ];
350+ UINT16 lfo_step = lfo_srcchan -> frequency ;
351+ for (i = 0 ; i < samples ; i ++ )
345352 {
346- UINT32 step = p -> channel [ 0 ]. frequency ;
353+ UINT32 step = lfo_dstchan -> frequency ;
347354 UINT8 offset ;
348355 INT16 data ;
349356 if (p -> lfo_control & 0x80 ) // reset LFO
350357 {
351- p -> channel [ 1 ]. counter = 0 ;
358+ lfo_srcchan -> counter = 0 ;
352359 }
353360 else
354361 {
355- int lfooffset = (p -> channel [1 ].counter >> 12 ) & 0x1F ;
356- INT16 lfo_data = p -> channel [1 ].waveform [lfooffset ];
357- p -> channel [1 ].counter += p -> wave_freq_tab [(lfo_step * p -> lfo_frequency ) & 0xfff ]; // TODO : multiply? verify this from real hardware.
358- p -> channel [1 ].counter &= 0x1FFFF ;
359- p -> channel [1 ].index = (p -> channel [1 ].counter >> 12 ) & 0x1F ;
360- if (p -> lfo_control & 3 )
361- step += ((lfo_data - 16 ) << (((p -> lfo_control & 3 )- 1 )<<1 )); // verified from patent, TODO : same in real hardware?
362+ int lfooffset = (lfo_srcchan -> counter >> 12 ) & 0x1F ;
363+ INT16 lfo_data = lfo_srcchan -> waveform [lfooffset ];
364+ lfo_srcchan -> counter += p -> wave_freq_tab [(lfo_step * p -> lfo_frequency ) & 0xfff ]; // verified from manual
365+ lfo_srcchan -> counter &= 0x1FFFF ;
366+ lfo_srcchan -> index = (lfo_srcchan -> counter >> 12 ) & 0x1F ;
367+ step += ((lfo_data - 16 ) << (((p -> lfo_control & 3 ) - 1 ) << 1 )); // verified from manual
362368 }
363- offset = (p -> channel [ 0 ]. counter >> 12 ) & 0x1F ;
364- data = p -> channel [ 0 ]. waveform [offset ];
365- p -> channel [ 0 ]. counter += p -> wave_freq_tab [step & 0xfff ];
366- p -> channel [ 0 ]. counter &= 0x1FFFF ;
367- p -> channel [ 0 ]. index = (p -> channel [ 0 ]. counter >> 12 ) & 0x1F ;
369+ offset = (lfo_dstchan -> counter >> 12 ) & 0x1F ;
370+ data = lfo_dstchan -> waveform [offset ];
371+ lfo_dstchan -> counter += p -> wave_freq_tab [step & 0xfff ];
372+ lfo_dstchan -> counter &= 0x1FFFF ;
373+ lfo_dstchan -> index = (lfo_dstchan -> counter >> 12 ) & 0x1F ;
368374 outputs [0 ][i ] += (vll * (data - 16 ));
369375 outputs [1 ][i ] += (vlr * (data - 16 ));
370376 }
@@ -373,14 +379,14 @@ static void c6280mame_update(void* param, UINT32 samples, DEV_SMPL **outputs)
373379 else
374380 {
375381 /* Waveform mode */
376- UINT32 step = p -> wave_freq_tab [p -> channel [ ch ]. frequency ];
377- for (i = 0 ; i < samples ; i += 1 )
382+ UINT32 step = p -> wave_freq_tab [chan -> frequency ];
383+ for (i = 0 ; i < samples ; i ++ )
378384 {
379- UINT8 offset = (p -> channel [ ch ]. counter >> 12 ) & 0x1F ;
380- INT16 data = p -> channel [ ch ]. waveform [offset ];
381- p -> channel [ ch ]. counter += step ;
382- p -> channel [ ch ]. counter &= 0x1FFFF ;
383- p -> channel [ ch ]. index = (p -> channel [ ch ]. counter >> 12 ) & 0x1F ;
385+ UINT8 offset = (chan -> counter >> 12 ) & 0x1F ;
386+ INT16 data = chan -> waveform [offset ];
387+ chan -> counter += step ;
388+ chan -> counter &= 0x1FFFF ;
389+ chan -> index = (chan -> counter >> 12 ) & 0x1F ;
384390 outputs [0 ][i ] += (vll * (data - 16 ));
385391 outputs [1 ][i ] += (vlr * (data - 16 ));
386392 }
@@ -431,12 +437,12 @@ static void* device_start_c6280mame(UINT32 clock, UINT32 rate)
431437 /* Make volume table */
432438 /* PSG has 48dB volume range spread over 32 steps */
433439 step = 48.0 / 32.0 ;
434- for (i = 0 ; i < 30 ; i ++ )
440+ for (i = 0 ; i < 31 ; i ++ )
435441 {
436442 info -> volume_table [i ] = (UINT16 )level ;
437443 level /= pow (10.0 , step / 20.0 );
438444 }
439- info -> volume_table [30 ] = info -> volume_table [ 31 ] = 0 ;
445+ info -> volume_table [31 ] = 0 ;
440446
441447 c6280mame_set_mute_mask (info , 0x00 );
442448
0 commit comments