summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2017-10-20 04:49:41 +0200
committer angelosa <salese_corp_ltd@email.it>2017-10-20 04:49:41 +0200
commit67f927881b65fdb85f9de8770b12377ea8b9fadf (patch)
treeb42ca8bd9d594a0a6ee2963225f50976e8156d87
parent138bb6f484ad0df2df25894d0d8a71f65d2718b9 (diff)
Actually battlera.cpp / pcfx.cpp can access upper VRAM bounds, fixed regression (nw)
-rw-r--r--src/devices/video/huc6270.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/devices/video/huc6270.cpp b/src/devices/video/huc6270.cpp
index bcdd35637a1..454d5e9129a 100644
--- a/src/devices/video/huc6270.cpp
+++ b/src/devices/video/huc6270.cpp
@@ -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));