diff options
author | cracyc <cracyc@users.noreply.github.com> | 2018-01-29 08:14:11 -0600 |
---|---|---|
committer | cracyc <cracyc@users.noreply.github.com> | 2018-01-29 08:14:11 -0600 |
commit | 0bb0f5baa9cf1f30ccd8a6cd4cc7dc9ff4e9ccef (patch) | |
tree | 489b8884c248dc75f50c3eb84a9249d5d83ad4d8 | |
parent | 6f377beb873cf7496645626e0234b4bb4c3e9a2e (diff) |
fmtowns: vram write masking (nw)
-rw-r--r-- | src/mame/includes/fmtowns.h | 2 | ||||
-rw-r--r-- | src/mame/video/fmtowns.cpp | 22 |
2 files changed, 23 insertions, 1 deletions
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); } |