Actually battlera.cpp / pcfx.cpp can access upper VRAM bounds, fixed regression (nw)

This commit is contained in:
angelosa 2017-10-20 04:49:41 +02:00
parent 138bb6f484
commit 67f927881b

View File

@ -576,13 +576,13 @@ inline void huc6270_device::handle_dma()
uint16_t data;
// area 0x8000-0xffff cannot be r/w (open bus)
if((m_sour & 0x8000) == 0)
data = m_vram[ m_sour & m_vram_mask ];
if(m_sour <= m_vram_mask)
data = m_vram[ m_sour ];
else
data = 0;
if((m_desr & 0x8000) == 0)
m_vram[ m_desr & m_vram_mask ] = data;
if(m_desr <= m_vram_mask)
m_vram[ m_desr ] = data;
m_sour += sour_inc;
m_desr += desr_inc;
m_lenr -= 1;
@ -619,8 +619,8 @@ READ8_MEMBER( huc6270_device::read )
{
m_marr += vram_increments[ ( m_cr >> 11 ) & 3 ];
if((m_marr & 0x8000) == 0)
m_vrr = m_vram[ m_marr & m_vram_mask ];
if(m_marr <= m_vram_mask)
m_vrr = m_vram[ m_marr ];
else
{
// TODO: test with real HW
@ -653,8 +653,8 @@ WRITE8_MEMBER( huc6270_device::write )
case MARR: /* memory address read register LSB */
m_marr = ( m_marr & 0xFF00 ) | data;
if((m_marr & 0x8000) == 0)
m_vrr = m_vram[ m_marr & m_vram_mask ];
if(m_marr <= m_vram_mask)
m_vrr = m_vram[ m_marr ];
else
{
// TODO: test with real HW
@ -749,14 +749,17 @@ WRITE8_MEMBER( huc6270_device::write )
case MARR: /* memory address read register MSB */
m_marr = ( m_marr & 0x00FF ) | ( data << 8 );
m_vrr = m_vram[ m_marr & m_vram_mask ];
if(m_marr <= m_vram_mask)
m_vrr = m_vram[ m_marr ];
else
m_vrr = 0;
break;
case VxR: /* vram write data MSB */
m_vwr = ( m_vwr & 0x00FF ) | ( data << 8 );
// area 0x8000-0xffff is NOP and cannot be written to.
if((m_mawr & 0x8000) == 0)
m_vram[ m_mawr & m_vram_mask ] = m_vwr;
if(m_mawr <= m_vram_mask)
m_vram[ m_mawr ] = m_vwr;
m_mawr += vram_increments[ ( m_cr >> 11 ) & 3 ];
break;
@ -843,7 +846,7 @@ void huc6270_device::device_start()
m_vram = make_unique_clear<uint16_t[]>(m_vram_size/sizeof(uint16_t));
m_vram_mask = (m_vram_size >> 1) - 1;
save_pointer(NAME(m_vram.get()), m_vram_size/sizeof(uint16_t));
save_item(NAME(m_register_index));