Previous 15994 Revisions Next

r9288 Thursday 30th September, 2010 at 06:49:01 UTC by Angelo Salese
[32x]: Implemented proper PWM FIFO, fixing frequency sound bugs
[src/mame/drivers]megadriv.c

src/mame/drivers/megadriv.c
r9287r9288
27612761// access from the SH2 via 4030 - 403f
27622762/**********************************************************************************************/
27632763
2764#define PWM_FIFO_SIZE pwm_tm_reg // guess, check this (Doom wants 3, Virtua Racing wants 1 like they sets this register?)
2765
27642766static UINT16 pwm_ctrl,pwm_cycle,pwm_tm_reg;
2765static UINT16 cur_lch,cur_rch;
2767static UINT16 cur_lch[0x10],cur_rch[0x10];
27662768static UINT16 pwm_cycle_reg; //used for latching
27672769static UINT8 pwm_timer_tick;
2770static UINT8 lch_index_r,rch_index_r,lch_index_w,rch_index_w;
27682771static UINT16 lch_fifo_state,rch_fifo_state;
27692772
27702773static emu_timer *_32x_pwm_timer;
27712774
2772
27732775static void calculate_pwm_timer(void)
27742776{
27752777   if(pwm_tm_reg == 0) { pwm_tm_reg = 16; } // zero gives max range
r9287r9288
27822784   {
27832785      pwm_timer_tick = 0;
27842786      lch_fifo_state = rch_fifo_state = 0x4000;
2787      lch_index_r = rch_index_r = 0;
2788      lch_index_w = rch_index_w = 0;
27852789      timer_adjust_oneshot(_32x_pwm_timer, ATTOTIME_IN_HZ(((MASTER_CLOCK_NTSC*3 / 7) / (pwm_cycle - 1))), 0);
27862790   }
27872791}
27882792
27892793static TIMER_CALLBACK( _32x_pwm_callback )
27902794{
2791   if(lch_fifo_state == 0x8000)
2795   if(lch_index_r < PWM_FIFO_SIZE)
27922796   {
2793      lch_fifo_state = 0x4000;
2794      dac_data_16_w(machine->device("lch_pwm"), cur_lch);
2797      dac_signed_data_16_w(machine->device("lch_pwm"), cur_lch[lch_index_r++]);
2798      lch_index_w = 0;
27952799   }
2796   if(rch_fifo_state == 0x8000)
2800
2801   lch_fifo_state = (lch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000;
2802
2803   if(rch_index_r < PWM_FIFO_SIZE)
27972804   {
2798      rch_fifo_state = 0x4000;
2799      dac_data_16_w(machine->device("rch_pwm"), cur_rch);
2805      dac_signed_data_16_w(machine->device("rch_pwm"), cur_rch[rch_index_r++]);
2806      rch_index_w = 0;
28002807   }
28012808
2809   rch_fifo_state = (rch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000;
2810
28022811   pwm_timer_tick++;
28032812
28042813   if(pwm_timer_tick == pwm_tm_reg)
r9287r9288
28402849         calculate_pwm_timer();
28412850         break;
28422851      case 0x04/2:
2843         cur_lch = ((data & 0xfff) << 4);
2844         lch_fifo_state = 0x8000;
2852         if(lch_index_w < PWM_FIFO_SIZE)
2853         {
2854            cur_lch[lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
2855            lch_index_r = 0;
2856         }
2857
2858         lch_fifo_state = (lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
28452859         break;
28462860      case 0x06/2:
2847         cur_rch = ((data & 0xfff) << 4);
2848         rch_fifo_state = 0x8000;
2861         if(rch_index_w < PWM_FIFO_SIZE)
2862         {
2863            cur_rch[rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
2864            rch_index_r = 0;
2865         }
2866
2867         rch_fifo_state = (rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
2868
28492869         break;
28502870      case 0x08/2:
2851         cur_lch = ((data & 0xfff) << 4);
2852         cur_rch = ((data & 0xfff) << 4);
2853         lch_fifo_state = rch_fifo_state = 0x8000;
2871         if(lch_index_w < PWM_FIFO_SIZE)
2872         {
2873            cur_lch[lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
2874            lch_index_r = 0;
2875         }
2876
2877         if(rch_index_w < PWM_FIFO_SIZE)
2878         {
2879            cur_rch[rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
2880            rch_index_r = 0;
2881         }
2882
2883         lch_fifo_state = (lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
2884         rch_fifo_state = (rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
2885
28542886         break;
28552887      default:
28562888         printf("Write at undefined PWM register %02x %04x\n",offset,data);
r9287r9288
63266358   MDRV_QUANTUM_TIME(HZ(1800000))
63276359
63286360   MDRV_SOUND_ADD("lch_pwm", DAC, 0)
6329   MDRV_SOUND_ROUTE(0, "lspeaker", 0.75)
6361   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
63306362
63316363   MDRV_SOUND_ADD("rch_pwm", DAC, 0)
6332   MDRV_SOUND_ROUTE(0, "rspeaker", 0.75)
6364   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
63336365MACHINE_CONFIG_END
63346366
63356367
r9287r9288
63496381   // boosting the interleave here actually makes Kolibri run incorrectly however, that
63506382   // one works best just boosting the interleave on communications?!
63516383   MDRV_QUANTUM_TIME(HZ(1800000))
6384
6385   MDRV_SOUND_ADD("lch_pwm", DAC, 0)
6386   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
6387
6388   MDRV_SOUND_ADD("rch_pwm", DAC, 0)
6389   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
63526390MACHINE_CONFIG_END
63536391
63546392MACHINE_CONFIG_DERIVED( genesis_scd, megadriv )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team