mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
sound/k054539.cpp: Corrected reverb RAM size and addressing. (#12856)
Top address bit for the 32K RAM is bit 16, rather than the intuitive bit 14.
This commit is contained in:
parent
3633adc8bd
commit
b4587b38ac
@ -25,7 +25,6 @@ k054539_device::k054539_device(const machine_config &mconfig, const char *tag, d
|
|||||||
, flags(0)
|
, flags(0)
|
||||||
, reverb_pos(0)
|
, reverb_pos(0)
|
||||||
, cur_ptr(0)
|
, cur_ptr(0)
|
||||||
, cur_limit(0)
|
|
||||||
, rom_addr(0)
|
, rom_addr(0)
|
||||||
, stream(nullptr)
|
, stream(nullptr)
|
||||||
, m_timer(nullptr)
|
, m_timer(nullptr)
|
||||||
@ -131,7 +130,7 @@ void k054539_device::sound_stream_update(sound_stream &stream, std::vector<read_
|
|||||||
rbase[reverb_pos] = 0;
|
rbase[reverb_pos] = 0;
|
||||||
|
|
||||||
for(int ch=0; ch<8; ch++)
|
for(int ch=0; ch<8; ch++)
|
||||||
if(regs[0x22c] & (1<<ch)) {
|
if(BIT(regs[0x22c], ch)) {
|
||||||
unsigned char *base1 = regs + 0x20*ch;
|
unsigned char *base1 = regs + 0x20*ch;
|
||||||
unsigned char *base2 = regs + 0x200 + 0x2*ch;
|
unsigned char *base2 = regs + 0x200 + 0x2*ch;
|
||||||
channel *chan = channels + ch;
|
channel *chan = channels + ch;
|
||||||
@ -318,11 +317,11 @@ void k054539_device::init_chip()
|
|||||||
memset(posreg_latch, 0, sizeof(posreg_latch)); //*
|
memset(posreg_latch, 0, sizeof(posreg_latch)); //*
|
||||||
flags |= UPDATE_AT_KEYON; //* make it default until proven otherwise
|
flags |= UPDATE_AT_KEYON; //* make it default until proven otherwise
|
||||||
|
|
||||||
ram = std::make_unique<uint8_t []>(0x4000);
|
ram = std::make_unique<uint8_t []>(0x8000);
|
||||||
|
|
||||||
reverb_pos = 0;
|
reverb_pos = 0;
|
||||||
cur_ptr = 0;
|
cur_ptr = 0;
|
||||||
memset(&ram[0], 0, 0x4000);
|
memset(&ram[0], 0, 0x8000);
|
||||||
|
|
||||||
stream = stream_alloc(0, 2, clock() / 384);
|
stream = stream_alloc(0, 2, clock() / 384);
|
||||||
|
|
||||||
@ -333,10 +332,9 @@ void k054539_device::init_chip()
|
|||||||
save_item(NAME(flags));
|
save_item(NAME(flags));
|
||||||
|
|
||||||
save_item(NAME(regs));
|
save_item(NAME(regs));
|
||||||
save_pointer(NAME(ram), 0x4000);
|
save_pointer(NAME(ram), 0x8000);
|
||||||
save_item(NAME(reverb_pos));
|
save_item(NAME(reverb_pos));
|
||||||
save_item(NAME(cur_ptr));
|
save_item(NAME(cur_ptr));
|
||||||
save_item(NAME(cur_limit));
|
|
||||||
save_item(NAME(rom_addr));
|
save_item(NAME(rom_addr));
|
||||||
|
|
||||||
save_item(NAME(m_timer_state));
|
save_item(NAME(m_timer_state));
|
||||||
@ -433,16 +431,15 @@ void k054539_device::write(offs_t offset, u8 data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x22d:
|
case 0x22d:
|
||||||
if(rom_addr == 0x80)
|
if(rom_addr == 0x80) {
|
||||||
ram[cur_ptr] = data;
|
offs_t const addr = (cur_ptr & 0x3fff) | ((cur_ptr & 0x10000) >> 2);
|
||||||
cur_ptr++;
|
ram[addr] = data;
|
||||||
if(cur_ptr == cur_limit)
|
}
|
||||||
cur_ptr = 0;
|
cur_ptr = (cur_ptr + 1) & 0x1ffff;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x22e:
|
case 0x22e:
|
||||||
rom_addr = data;
|
rom_addr = data;
|
||||||
cur_limit = rom_addr == 0x80 ? 0x4000 : 0x20000;
|
|
||||||
cur_ptr = 0;
|
cur_ptr = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -477,7 +474,6 @@ void k054539_device::write(offs_t offset, u8 data)
|
|||||||
|
|
||||||
void k054539_device::device_post_load()
|
void k054539_device::device_post_load()
|
||||||
{
|
{
|
||||||
cur_limit = rom_addr == 0x80 ? 0x4000 : 0x20000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 k054539_device::read(offs_t offset)
|
u8 k054539_device::read(offs_t offset)
|
||||||
@ -485,13 +481,10 @@ u8 k054539_device::read(offs_t offset)
|
|||||||
switch(offset) {
|
switch(offset) {
|
||||||
case 0x22d:
|
case 0x22d:
|
||||||
if(regs[0x22f] & 0x10) {
|
if(regs[0x22f] & 0x10) {
|
||||||
uint8_t res = (rom_addr == 0x80) ? ram[cur_ptr] : read_byte((0x20000*rom_addr)+cur_ptr);
|
offs_t const addr = (cur_ptr & 0x3fff) | ((cur_ptr & 0x10000) >> 2);
|
||||||
if (!machine().side_effects_disabled())
|
uint8_t res = (rom_addr == 0x80) ? ram[ram_addr] : read_byte((0x20000*rom_addr) + cur_ptr);
|
||||||
{
|
if(!machine().side_effects_disabled())
|
||||||
cur_ptr++;
|
cur_ptr = (cur_ptr + 1) & 0x1ffff;
|
||||||
if(cur_ptr == cur_limit)
|
|
||||||
cur_ptr = 0;
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
@ -550,7 +543,7 @@ void k054539_device::device_reset()
|
|||||||
{
|
{
|
||||||
regs[0x22c] = 0;
|
regs[0x22c] = 0;
|
||||||
regs[0x22f] = 0;
|
regs[0x22f] = 0;
|
||||||
memset(&ram[0], 0, 0x4000);
|
memset(&ram[0], 0, 0x8000);
|
||||||
m_timer->enable(false);
|
m_timer->enable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,6 @@ private:
|
|||||||
int reverb_pos;
|
int reverb_pos;
|
||||||
|
|
||||||
int32_t cur_ptr;
|
int32_t cur_ptr;
|
||||||
int cur_limit;
|
|
||||||
uint32_t rom_addr;
|
uint32_t rom_addr;
|
||||||
|
|
||||||
channel channels[8];
|
channel channels[8];
|
||||||
|
Loading…
Reference in New Issue
Block a user