mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
Actually battlera.cpp / pcfx.cpp can access upper VRAM bounds, fixed regression (nw)
This commit is contained in:
parent
138bb6f484
commit
67f927881b
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user