@@ -437,6 +437,8 @@ const std::array<u32, 4> swp30_device::lfo_shape_centered_tri = { 0x00000000, 0x
437
437
const std::array<u32 , 4 > swp30_device::lfo_shape_offset_saw = { 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 }; // __////__
438
438
const std::array<u32 , 4 > swp30_device::lfo_shape_offset_tri = { 0x00000000 , 0x00000000 , 0x000fffff , 0x000fffff }; // __/\/\__
439
439
440
+ const std::array<u8 , 4 > swp30_device::dpcm_offset = { 7 , 6 , 4 , 0 };
441
+
440
442
swp30_device::swp30_device (const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
441
443
: cpu_device(mconfig, SWP30, tag, owner, clock),
442
444
device_sound_interface(mconfig, *this ),
@@ -478,7 +480,7 @@ void swp30_device::device_start()
478
480
// Delta-packed samples decompression.
479
481
480
482
for (int i=0 ; i<128 ; i++) {
481
- s16 base = ((i & 0x1f ) << (5 +(i >> 5 ))) + (((1 << (i >> 5 ))-1 ) << 10 );
483
+ s16 base = ((i & 0x1f ) << (3 +(i >> 5 ))) + (((1 << (i >> 5 ))-1 ) << 8 );
482
484
m_dpcm[i | 0x80 ] = - base;
483
485
m_dpcm[i] = + base;
484
486
}
@@ -511,6 +513,7 @@ void swp30_device::device_start()
511
513
save_item (NAME (m_dpcm_current));
512
514
save_item (NAME (m_dpcm_next));
513
515
save_item (NAME (m_dpcm_address));
516
+ save_item (NAME (m_dpcm_sum));
514
517
515
518
save_item (NAME (m_sample_history));
516
519
@@ -568,6 +571,7 @@ void swp30_device::device_reset()
568
571
std::fill (m_dpcm_current.begin (), m_dpcm_current.end (), false );
569
572
std::fill (m_dpcm_next.begin (), m_dpcm_next.end (), false );
570
573
std::fill (m_dpcm_address.begin (), m_dpcm_address.end (), false );
574
+ std::fill (m_dpcm_sum.begin (), m_dpcm_sum.end (), 0 );
571
575
572
576
std::fill (m_meg_program.begin (), m_meg_program.end (), 0 );
573
577
std::fill (m_meg_const.begin (), m_meg_const.end (), 0 );
@@ -731,6 +735,7 @@ void swp30_device::keyon_w(u16)
731
735
if (m_sample_end[chan] & 0x80000000 )
732
736
dt = -dt;
733
737
m_dpcm_address[chan] = ((m_sample_address[chan] & 0xffffff ) << 2 ) - dt;
738
+ m_dpcm_sum[chan] = 0 ;
734
739
735
740
m_lfo_phase[chan] = 0 ;
736
741
@@ -1476,12 +1481,15 @@ void swp30_device::execute_run()
1476
1481
}
1477
1482
1478
1483
case 3 : { // 8-bits delta-pcm
1484
+ u8 offset = dpcm_offset[(m_sample_address[chan] >> 25 ) & 3 ];
1485
+ u8 scale = (m_sample_address[chan] >> 27 ) & 7 ;
1479
1486
offs_t adr = m_dpcm_address[chan];
1480
1487
if (m_sample_end[chan] & 0x80000000 ) {
1481
1488
u32 target_address = (base_address << 2 ) + spos - 1 ;
1482
1489
while (adr >= target_address) {
1483
1490
m_dpcm_current[chan] = m_dpcm_next[chan];
1484
- s32 sample = m_dpcm_next[chan] + m_dpcm[(m_rom_cache.read_dword (adr >> 2 ) >> (8 *(adr & 3 ))) & 0xff ];
1491
+ m_dpcm_sum[chan] += m_dpcm[(m_rom_cache.read_dword (adr >> 2 ) >> (8 *(adr & 3 ))) & 0xff ] - offset;
1492
+ s32 sample = (m_dpcm_sum[chan] << scale) >> 3 ;
1485
1493
adr --;
1486
1494
if (sample < -0x8000 )
1487
1495
sample = -0x8000 ;
@@ -1493,7 +1501,8 @@ void swp30_device::execute_run()
1493
1501
u32 target_address = (base_address << 2 ) + spos + 1 ;
1494
1502
while (adr <= target_address) {
1495
1503
m_dpcm_current[chan] = m_dpcm_next[chan];
1496
- s32 sample = m_dpcm_next[chan] + m_dpcm[(m_rom_cache.read_dword (adr >> 2 ) >> (8 *(adr & 3 ))) & 0xff ];
1504
+ m_dpcm_sum[chan] += m_dpcm[(m_rom_cache.read_dword (adr >> 2 ) >> (8 *(adr & 3 ))) & 0xff ] - offset;
1505
+ s32 sample = (m_dpcm_sum[chan] << scale) >> 3 ;
1497
1506
// logerror("## + sample %08x %02x %d\n", adr, (m_rom_cache.read_dword(adr >> 2) >> (8*(adr & 3))) & 0xff, sample);
1498
1507
adr ++;
1499
1508
if (sample < -0x8000 )
@@ -1545,12 +1554,13 @@ void swp30_device::execute_run()
1545
1554
else {
1546
1555
s32 prev = m_sample_pos[chan];
1547
1556
do
1548
- m_sample_pos[chan] = m_sample_pos[chan] - (( m_sample_end[chan] & 0xffffff ) << 8 ) + ((m_sample_address[chan] >> 22 ) & 0xfc ) ;
1557
+ m_sample_pos[chan] -= ( m_sample_end[chan] & 0xffffff ) << 8 ;
1549
1558
while ((m_sample_pos[chan] >> 8 ) >= (m_sample_end[chan] & 0xffffff ));
1550
1559
if (m_sample_end[chan] & 0x80000000 )
1551
1560
m_dpcm_address[chan] -= (m_sample_pos[chan] >> 8 ) - (prev >> 8 );
1552
1561
else
1553
1562
m_dpcm_address[chan] += (m_sample_pos[chan] >> 8 ) - (prev >> 8 );
1563
+ m_dpcm_sum[chan] = 0 ;
1554
1564
}
1555
1565
}
1556
1566
0 commit comments