From 67f927881b65fdb85f9de8770b12377ea8b9fadf Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 20 Oct 2017 04:49:41 +0200 Subject: Actually battlera.cpp / pcfx.cpp can access upper VRAM bounds, fixed regression (nw) --- src/devices/video/huc6270.cpp | 27 +++++++++++++++------------ 1 file 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(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)); -- cgit v1.2.3