summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit0bb0f5baa9cf1f30ccd8a6cd4cc7dc9ff4e9ccef (patch)
tree489b8884c248dc75f50c3eb84a9249d5d83ad4d8
parent6f377beb873cf7496645626e0234b4bb4c3e9a2e (diff)
fmtowns: vram write masking (nw)
-rw-r--r--src/mame/includes/fmtowns.h2
-rw-r--r--src/mame/video/fmtowns.cpp22
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);
}