Previous 15994 Revisions Next

r9154 Friday 17th September, 2010 at 07:08:04 UTC by Angelo Salese
[PCE]: Added a function to modify MSM5205 clock on the fly, fixing the ADPCM clipping problems in this driver
[src/emu/sound]msm5205.c msm5205.h
[src/mess/drivers]pce.c
[src/mess/includes]pce.h
[src/mess/machine]pce.c

src/emu/sound/msm5205.c
r9153r9154
298298   stream_set_output_gain(voice->stream,0,volume / 100.0);
299299}
300300
301void msm5205_change_clock_w(running_device *device, INT32 clock)
302{
303   msm5205_state *voice = get_safe_token(device);
304   attotime period;
301305
306   voice->clock = clock;
302307
308   period = attotime_mul(ATTOTIME_IN_HZ(voice->clock), voice->prescaler);
309   timer_adjust_periodic(voice->timer, period, 0, period);
310}
303311
312
304313/**************************************************************************
305314 * Generic get_info
306315 **************************************************************************/
src/emu/sound/msm5205.h
r9153r9154
3838
3939void msm5205_set_volume(running_device *device,int volume);
4040
41void msm5205_change_clock_w(running_device *device, INT32 clock);
42
4143DECLARE_LEGACY_SOUND_DEVICE(MSM5205, msm5205);
4244
4345#endif /* __MSM5205_H__ */
src/mess/machine/pce.c
r9153r9154
100100   int      adpcm_write_ptr;
101101   UINT8   adpcm_write_buf;
102102   int      adpcm_length;
103   int      adpcm_clock_count;
104103   int      adpcm_clock_divider;
105104   UINT32  msm_start_addr;
106105   UINT32   msm_end_addr;
r9153r9154
495494   if ( pce_cd.msm_idle )
496495      return;
497496
498   if ( ! pce_cd.adpcm_clock_count )
499   {
500      /* Supply new ADPCM data */
501      msm_data = (pce_cd.msm_nibble) ? (pce_cd.adpcm_ram[pce_cd.msm_start_addr] & 0x0f) : ((pce_cd.adpcm_ram[pce_cd.msm_start_addr] & 0xf0) >> 4);
497   /* Supply new ADPCM data */
498   msm_data = (pce_cd.msm_nibble) ? (pce_cd.adpcm_ram[pce_cd.msm_start_addr] & 0x0f) : ((pce_cd.adpcm_ram[pce_cd.msm_start_addr] & 0xf0) >> 4);
502499
503      msm5205_data_w(device, msm_data);
504      pce_cd.msm_nibble ^= 1;
500   msm5205_data_w(device, msm_data);
501   pce_cd.msm_nibble ^= 1;
505502
506      if(pce_cd.msm_nibble == 0)
503   if(pce_cd.msm_nibble == 0)
504   {
505      pce_cd.msm_start_addr++;
506
507      if(pce_cd.msm_start_addr == pce_cd.msm_half_addr)
507508      {
508         pce_cd.msm_start_addr++;
509         //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_FULL_PLAY, CLEAR_LINE );
510         //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_HALF_PLAY, ASSERT_LINE );
511      }
509512
510         if(pce_cd.msm_start_addr == pce_cd.msm_half_addr)
511         {
512            //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_FULL_PLAY, CLEAR_LINE );
513            //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_HALF_PLAY, ASSERT_LINE );
514         }
515
516         if(pce_cd.msm_start_addr > pce_cd.msm_end_addr)
517         {
518            //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_HALF_PLAY, CLEAR_LINE );
519            //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_FULL_PLAY, CLEAR_LINE );
520            adpcm_stop(device->machine);
521            msm5205_reset_w(device, 1);
522         }
513      if(pce_cd.msm_start_addr > pce_cd.msm_end_addr)
514      {
515         //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_HALF_PLAY, CLEAR_LINE );
516         //pce_cd_set_irq_line( device->machine, PCE_CD_IRQ_SAMPLE_FULL_PLAY, CLEAR_LINE );
517         adpcm_stop(device->machine);
518         msm5205_reset_w(device, 1);
523519      }
524520   }
525   else
526   {
527      /* Make sure the sample does not change */
528      msm5205_data_w(device, msm_data);
529   }
530
531   pce_cd.adpcm_clock_count = ( pce_cd.adpcm_clock_count + 1 ) % pce_cd.adpcm_clock_divider;
532521}
533522
534523#define   SCSI_STATUS_OK         0x00
r9153r9154
12141203   pce_cd.adpcm_ram = auto_alloc_array(machine, UINT8, PCE_ADPCM_RAM_SIZE );
12151204   memset( pce_cd.adpcm_ram, 0, PCE_ADPCM_RAM_SIZE );
12161205   pce_cd.adpcm_clock_divider = 1;
1206   msm5205_change_clock_w(machine->device("msm5205"), (PCE_CD_CLOCK / 6) / pce_cd.adpcm_clock_divider);
12171207
12181208   /* Set up cd command buffer */
12191209   pce_cd.command_buffer = auto_alloc_array(machine, UINT8, PCE_CD_COMMAND_BUFFER_SIZE );
r9153r9154
13891379      }
13901380      break;
13911381   case 0x0E:   /* ADPCM playback rate */
1392      pce_cd.adpcm_clock_divider = 16 - ( data & 0x0F );
1393      pce_cd.adpcm_clock_count = pce_cd.adpcm_clock_divider - 1;
1382      pce_cd.adpcm_clock_divider = 0x10 - ( data & 0x0F );
1383      msm5205_change_clock_w(space->machine->device("msm5205"), (PCE_CD_CLOCK / 6) / pce_cd.adpcm_clock_divider);
13941384      break;
13951385   case 0x0F:   /* ADPCM and CD audio fade timer */
13961386      break;
src/mess/includes/pce.h
r9153r9154
1313
1414#define C6280_TAG         "c6280"
1515
16#define   MAIN_CLOCK      21477270
17#define PCE_CD_CLOCK   9216000
18
1619#define PCE_HEADER_SIZE      512
1720
1821#define TG_16_JOY_SIG      0x00
src/mess/drivers/pce.c
r9153r9154
6666#include "sound/msm5205.h"
6767#include "hash.h"
6868
69#define   MAIN_CLOCK      21477270
70#define PCE_CD_CLOCK   9216000
7169
72
7370static ADDRESS_MAP_START( pce_mem , ADDRESS_SPACE_PROGRAM, 8)
7471   AM_RANGE( 0x000000, 0x07FFFF) AM_ROMBANK("bank1")
7572   AM_RANGE( 0x080000, 0x087FFF) AM_ROMBANK("bank2")

Previous 15994 Revisions Next


© 1998-2018 The MESS Team