From 0bb0f5baa9cf1f30ccd8a6cd4cc7dc9ff4e9ccef Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 29 Jan 2018 08:14:11 -0600 Subject: fmtowns: vram write masking (nw) --- src/mame/includes/fmtowns.h | 2 ++ src/mame/video/fmtowns.cpp | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/mame/includes/fmtowns.h b/src/mame/includes/fmtowns.h index 091fbbf350d..e380f88cca9 100644 --- a/src/mame/includes/fmtowns.h +++ b/src/mame/includes/fmtowns.h @@ -371,6 +371,8 @@ private: u8 m_rtc_d; bool m_rtc_busy; + u8 m_vram_mask[4]; + u8 m_vram_mask_addr; public: INTERRUPT_GEN_MEMBER(towns_vsync_irq); TIMER_CALLBACK_MEMBER(towns_cdrom_read_byte); diff --git a/src/mame/video/fmtowns.cpp b/src/mame/video/fmtowns.cpp index af8064cad43..5be149f0e4b 100644 --- a/src/mame/video/fmtowns.cpp +++ b/src/mame/video/fmtowns.cpp @@ -137,7 +137,9 @@ READ8_MEMBER( towns_state::towns_gfx_high_r ) WRITE8_MEMBER( towns_state::towns_gfx_high_w ) { - m_towns_gfxvram[offset] = data; + u8 mask = m_vram_mask[offset & 3]; + u8 mem = m_towns_gfxvram[offset]; + m_towns_gfxvram[offset] = (mem & ~mask) | (data & mask); } READ8_MEMBER( towns_state::towns_gfx_r ) @@ -414,6 +416,14 @@ READ8_MEMBER(towns_state::towns_video_440_r) case 0x12: if(LOG_VID) logerror("SPR: reading register %i (0x452) [%02x]\n",m_video.towns_sprite_sel,m_video.towns_sprite_reg[m_video.towns_sprite_sel]); return m_video.towns_sprite_reg[m_video.towns_sprite_sel]; + case 0x18: + return m_vram_mask_addr; + case 0x1a: + case 0x1b: + { + int idx = (m_vram_mask_addr << 1) + offset - 0x1a; + return m_vram_mask[idx]; + } //default: //if(LOG_VID) logerror("VID: read port %04x\n",offset+0x440); } @@ -453,6 +463,16 @@ WRITE8_MEMBER(towns_state::towns_video_440_w) logerror("SPR: writing register %i (0x452) [%02x]\n",m_video.towns_sprite_sel,data); m_video.towns_sprite_reg[m_video.towns_sprite_sel] = data; break; + case 0x18: + m_vram_mask_addr = data & 1; + break; + case 0x1a: + case 0x1b: + { + int idx = (m_vram_mask_addr << 1) + offset - 0x1a; + m_vram_mask[idx] = data; + break; + } default: if(LOG_VID) logerror("VID: wrote 0x%02x to port %04x\n",data,offset+0x440); } -- cgit v1.2.3