added readlatch (dummy read is documented by Yamaha)

This commit is contained in:
Michaël Banaan Ananas 2013-06-01 18:54:46 +00:00
parent a7ea9ebf30
commit 47fab3c799
3 changed files with 23 additions and 25 deletions

View File

@ -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)

View File

@ -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 */

View File

@ -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);