diff options
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 |
commit | 67f927881b65fdb85f9de8770b12377ea8b9fadf (patch) | |
tree | b42ca8bd9d594a0a6ee2963225f50976e8156d87 | |
parent | 138bb6f484ad0df2df25894d0d8a71f65d2718b9 (diff) |
Actually battlera.cpp / pcfx.cpp can access upper VRAM bounds, fixed regression (nw)
-rw-r--r-- | src/devices/video/huc6270.cpp | 27 |
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)); |