summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2016-12-24 20:33:54 -0600
committer cracyc <cracyc@users.noreply.github.com>2016-12-24 20:33:54 -0600
commitaa4e9a5d85877beda4344266e9fb6dae93d7502b (patch)
tree6a7808064adf8bab876d98df8a0e752a5e826e84
parent2e2946fd6ed7ce83a1aabce2c6e392259d21f687 (diff)
vis: fix bunch of video issues (nw)
-rw-r--r--src/frontend/mame/luaengine.cpp2
-rw-r--r--src/mame/drivers/vis.cpp49
2 files changed, 31 insertions, 20 deletions
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index 1bdc3582fef..34d9c769338 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -1219,7 +1219,7 @@ void lua_engine::initialize()
* port:active() - get port status
* port:live() - get port ioport_port_live (TODO: not usable from lua as of now)
* port:read() - get port value
- * port:write(val, mask) - set port to value & mask
+ * port:write(val, mask) - set port to value & mask (output fields only, for other fields use field:set_value(val))
* port:field(mask) - get ioport_field for port and mask
* port.field[] - get ioport_field table
*/
diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp
index 23d9d2b3b70..bedd268d398 100644
--- a/src/mame/drivers/vis.cpp
+++ b/src/mame/drivers/vis.cpp
@@ -440,14 +440,15 @@ uint32_t vis_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm
READ8_MEMBER(vis_vga_device::visvgamem_r)
{
- if(!m_wina)
+ if(!(vga.sequencer.data[0x25] & 0x40))
return mem_r(space, offset, mem_mask);
- return mem_linear_r(space, (offset + (m_wina * 64)) & 0x3ffff, mem_mask);
+ u16 win = (vga.sequencer.data[0x1e] & 0x0f) == 3 ? m_wina : m_winb; // this doesn't seem quite right
+ return mem_linear_r(space, (offset + (win * 64)) & 0x3ffff, mem_mask);
}
WRITE8_MEMBER(vis_vga_device::visvgamem_w)
{
- if(!m_wina)
+ if(!(vga.sequencer.data[0x25] & 0x40))
return mem_w(space, offset, data, mem_mask);
return mem_linear_w(space, (offset + (m_wina * 64)) & 0x3ffff, data, mem_mask);
}
@@ -546,40 +547,40 @@ WRITE8_MEMBER(vis_vga_device::vga_w)
case 0x00:
if(vga.crtc.protect_enable)
return;
- vga.crtc.horz_total = data / (m_interlace ? 2 : 1);
+ vga.crtc.horz_total = data / (m_interlace && !(vga.sequencer.data[0x25] & 0x20) ? 2 : 1);
recompute_params();
return;
case 0x01:
if(vga.crtc.protect_enable)
return;
- vga.crtc.horz_disp_end = data / (m_interlace ? 2 : 1);
+ vga.crtc.horz_disp_end = data / (m_interlace && !(vga.sequencer.data[0x25] & 0x20) ? 2 : 1);
recompute_params();
return;
case 0x02:
if(vga.crtc.protect_enable)
return;
- vga.crtc.horz_blank_start = data / (m_interlace ? 2 : 1);
+ vga.crtc.horz_blank_start = data / (m_interlace && !(vga.sequencer.data[0x25] & 0x20) ? 2 : 1);
return;
case 0x03:
if(vga.crtc.protect_enable)
return;
vga.crtc.horz_blank_end = (m_crtc_regs[0x05] & 0x80) >> 2;
vga.crtc.horz_blank_end |= data & 0x1f;
- vga.crtc.horz_blank_end /= (m_interlace ? 2 : 1);
+ vga.crtc.horz_blank_end /= (m_interlace && !(vga.sequencer.data[0x25] & 0x20) ? 2 : 1);
vga.crtc.disp_enable_skew = (data & 0x60) >> 5;
vga.crtc.evra = (data & 0x80) >> 7;
return;
case 0x04:
if(vga.crtc.protect_enable)
return;
- vga.crtc.horz_retrace_start = data / (m_interlace ? 2 : 1);
+ vga.crtc.horz_retrace_start = data / (m_interlace && !(vga.sequencer.data[0x25] & 0x20) ? 2 : 1);
return;
case 0x05:
if(vga.crtc.protect_enable)
return;
vga.crtc.horz_blank_end = m_crtc_regs[0x05] & 0x1f;
vga.crtc.horz_blank_end |= ((data & 0x80) >> 2);
- vga.crtc.horz_blank_end /= (m_interlace ? 2 : 1);
+ vga.crtc.horz_blank_end /= (m_interlace && !(vga.sequencer.data[0x25] & 0x20) ? 2 : 1);
vga.crtc.horz_retrace_skew = ((data & 0x60) >> 5);
vga.crtc.horz_retrace_end = data & 0x1f;
return;
@@ -649,27 +650,37 @@ WRITE8_MEMBER(vis_vga_device::vga_w)
case 0x30:
if(data && !m_interlace)
{
- vga.crtc.horz_total /= 2;
- vga.crtc.horz_disp_end /= 2;
- vga.crtc.horz_blank_end /= 2;
- vga.crtc.horz_retrace_start /= 2;
- vga.crtc.horz_retrace_end /= 2;
+ if(!(vga.sequencer.data[0x25] & 0x20))
+ {
+ vga.crtc.horz_total /= 2;
+ vga.crtc.horz_disp_end /= 2;
+ vga.crtc.horz_blank_end /= 2;
+ vga.crtc.horz_retrace_start /= 2;
+ vga.crtc.horz_retrace_end /= 2;
+ }
vga.crtc.vert_total *= 2;
vga.crtc.vert_retrace_start *= 2;
vga.crtc.vert_disp_end *= 2;
vga.crtc.vert_blank_start *= 2;
+ vga.crtc.vert_blank_end *= 2;
+ recompute_params();
}
else if(!data && m_interlace)
{
- vga.crtc.horz_total *= 2;
- vga.crtc.horz_disp_end *= 2;
- vga.crtc.horz_blank_end *= 2;
- vga.crtc.horz_retrace_start *= 2;
- vga.crtc.horz_retrace_end *= 2;
+ if(!(vga.sequencer.data[0x25] & 0x20))
+ {
+ vga.crtc.horz_total *= 2;
+ vga.crtc.horz_disp_end *= 2;
+ vga.crtc.horz_blank_end *= 2;
+ vga.crtc.horz_retrace_start *= 2;
+ vga.crtc.horz_retrace_end *= 2;
+ }
vga.crtc.vert_total /= 2;
vga.crtc.vert_retrace_start /= 2;
vga.crtc.vert_disp_end /= 2;
vga.crtc.vert_blank_start /= 2;
+ vga.crtc.vert_blank_end /= 2;
+ recompute_params();
}
m_interlace = data;
return;