mirror of
https://github.com/holub/mame
synced 2025-04-24 17:30:55 +03:00
added readlatch (dummy read is documented by Yamaha)
This commit is contained in:
parent
a7ea9ebf30
commit
47fab3c799
@ -607,9 +607,10 @@ void ymz280b_device::device_start()
|
||||
save_item(NAME(m_irq_enable));
|
||||
save_item(NAME(m_keyon_enable));
|
||||
save_item(NAME(m_ext_mem_enable));
|
||||
save_item(NAME(m_rom_readback_addr));
|
||||
save_item(NAME(m_rom_addr_hi));
|
||||
save_item(NAME(m_rom_addr_mid));
|
||||
save_item(NAME(m_ext_mem_address));
|
||||
save_item(NAME(m_ext_readlatch));
|
||||
save_item(NAME(m_ext_mem_address_hi));
|
||||
save_item(NAME(m_ext_mem_address_mid));
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
save_item(NAME(m_voice[j].playing), j);
|
||||
@ -657,7 +658,7 @@ void ymz280b_device::device_reset()
|
||||
|
||||
m_current_register = 0;
|
||||
m_status_register = 0;
|
||||
m_rom_readback_addr = 0;
|
||||
m_ext_mem_address = 0;
|
||||
|
||||
/* clear other voice parameters */
|
||||
for (int i = 0; i < 8; i++)
|
||||
@ -808,25 +809,25 @@ void ymz280b_device::write_to_register(int data)
|
||||
break;
|
||||
|
||||
case 0x84: /* ROM readback / RAM write (high) */
|
||||
m_rom_addr_hi = data << 16;
|
||||
m_ext_mem_address_hi = data << 16;
|
||||
break;
|
||||
|
||||
case 0x85: /* ROM readback / RAM write (middle) */
|
||||
m_rom_addr_mid = data << 8;
|
||||
m_ext_mem_address_mid = data << 8;
|
||||
break;
|
||||
|
||||
case 0x86: /* ROM readback / RAM write (low) -> update latch */
|
||||
m_rom_readback_addr = m_rom_addr_hi | m_rom_addr_mid | data;
|
||||
m_ext_mem_address = m_ext_mem_address_hi | m_ext_mem_address_mid | data;
|
||||
break;
|
||||
|
||||
case 0x87: /* RAM write */
|
||||
if (m_ext_mem_enable)
|
||||
{
|
||||
m_ext_mem_address = (m_ext_mem_address + 1) & 0xffffff;
|
||||
if (!m_ext_write_handler.isnull())
|
||||
m_ext_write_handler(m_rom_readback_addr, data);
|
||||
m_ext_write_handler(m_ext_mem_address, data);
|
||||
else
|
||||
logerror("YMZ280B attempted RAM write to %X\n", m_rom_readback_addr);
|
||||
m_rom_readback_addr = (m_rom_readback_addr + 1) & 0xffffff;
|
||||
logerror("YMZ280B attempted RAM write to %X\n", m_ext_mem_address);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -908,9 +909,10 @@ READ8_MEMBER( ymz280b_device::read )
|
||||
return 0xff;
|
||||
|
||||
/* read from external memory */
|
||||
UINT8 result = ymz280b_read_memory(m_rom_readback_addr);
|
||||
m_rom_readback_addr = (m_rom_readback_addr + 1) & 0xffffff;
|
||||
return result;
|
||||
UINT8 ret = m_ext_readlatch;
|
||||
m_ext_readlatch = ymz280b_read_memory(m_ext_mem_address);
|
||||
m_ext_mem_address = (m_ext_mem_address + 1) & 0xffffff;
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
return compute_status();
|
||||
@ -943,9 +945,10 @@ ymz280b_device::ymz280b_device(const machine_config &mconfig, const char *tag, d
|
||||
m_irq_enable(0),
|
||||
m_keyon_enable(0),
|
||||
m_ext_mem_enable(0),
|
||||
m_rom_addr_hi(0),
|
||||
m_rom_addr_mid(0),
|
||||
m_rom_readback_addr(0),
|
||||
m_ext_mem_address_hi(0),
|
||||
m_ext_mem_address_mid(0),
|
||||
m_ext_mem_address(0),
|
||||
m_ext_readlatch(0),
|
||||
m_irq_handler(*this),
|
||||
m_ext_read_handler(*this),
|
||||
m_ext_write_handler(*this)
|
||||
|
@ -105,9 +105,10 @@ private:
|
||||
UINT8 m_irq_enable; /* current IRQ enable */
|
||||
UINT8 m_keyon_enable; /* key on enable */
|
||||
UINT8 m_ext_mem_enable; /* external memory enable */
|
||||
UINT32 m_rom_addr_hi;
|
||||
UINT32 m_rom_addr_mid;
|
||||
UINT32 m_rom_readback_addr; /* where the CPU can read the ROM */
|
||||
UINT8 m_ext_readlatch; /* external memory prefetched data */
|
||||
UINT32 m_ext_mem_address_hi;
|
||||
UINT32 m_ext_mem_address_mid;
|
||||
UINT32 m_ext_mem_address; /* where the CPU can read the ROM */
|
||||
|
||||
devcb2_write_line m_irq_handler; /* IRQ callback */
|
||||
devcb2_read8 m_ext_read_handler; /* external RAM read handler */
|
||||
|
@ -1876,12 +1876,6 @@ ADDRESS_MAP_END
|
||||
|
||||
READ8_MEMBER(firebeat_state::soundram_r)
|
||||
{
|
||||
// HACK: firebeat expects first read after setting the address to be dummy. fixes "YMZ test".
|
||||
if (offset > 0)
|
||||
{
|
||||
offset--;
|
||||
}
|
||||
|
||||
if (offset < 0x200000)
|
||||
{
|
||||
return m_flash[1]->read(offset & 0x1fffff);
|
||||
|
Loading…
Reference in New Issue
Block a user