summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2016-12-24 19:40:04 +0100
committer angelosa <salese_corp_ltd@email.it>2016-12-24 19:42:17 +0100
commit2f3e89b5dfc57c60950948147841c7bbf5041f94 (patch)
tree06063184b3f308c51352e3919e87db7b8aae40d9
parent382eb3b77f30928b9fcd47045a1fa504c80a5751 (diff)
Fixed vblank timings in Acorn Archimedes and enabled partial updates, VIDC definitely needs a device rewrite at this stage plus ARM timings are quite off unsurprisingly. (nw)
-rw-r--r--src/mame/includes/archimds.h1
-rw-r--r--src/mame/machine/archimds.cpp23
2 files changed, 16 insertions, 8 deletions
diff --git a/src/mame/includes/archimds.h b/src/mame/includes/archimds.h
index bea394da1f8..e711c7d76c6 100644
--- a/src/mame/includes/archimds.h
+++ b/src/mame/includes/archimds.h
@@ -91,6 +91,7 @@ public:
uint8_t m_ioc_regs[0x80/4];
uint8_t m_vidc_bpp_mode;
uint8_t m_vidc_interlace;
+ uint16_t m_vidc_vblank_time;
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
diff --git a/src/mame/machine/archimds.cpp b/src/mame/machine/archimds.cpp
index 111e992d10b..f8fd709159b 100644
--- a/src/mame/machine/archimds.cpp
+++ b/src/mame/machine/archimds.cpp
@@ -116,7 +116,7 @@ void archimedes_state::vidc_vblank()
archimedes_request_irq_a(ARCHIMEDES_IRQA_VBL);
// set up for next vbl
- m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time));
}
/* video DMA */
@@ -155,7 +155,7 @@ void archimedes_state::vidc_video_tick()
if(m_video_dma_on)
{
- m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time+1));
}
else
m_vid_timer->adjust(attotime::never);
@@ -293,6 +293,9 @@ void archimedes_state::archimedes_reset()
m_ioc_regs[IRQ_STATUS_B] = 0x00; //set up IL[1] On
m_ioc_regs[FIQ_STATUS] = 0x80; //set up Force FIQ
m_ioc_regs[CONTROL] = 0xff;
+
+ m_vidc_vblank_time = 10000; // set a stupidly high time so it doesn't fire off
+ m_vbl_timer->adjust(attotime::never);
}
void archimedes_state::archimedes_init()
@@ -621,7 +624,7 @@ WRITE32_MEMBER( archimedes_state::ioc_ctrl_w )
archimedes_request_irq_a((data & 0x80) ? ARCHIMEDES_IRQA_FORCE : 0);
if(data & 0x08) //set up the VBLANK timer
- m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vbl_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time));
break;
@@ -915,11 +918,13 @@ void archimedes_state::vidc_dynamic_res_change()
visarea.min_y = 0;
visarea.max_x = m_vidc_regs[VIDC_HBER] - m_vidc_regs[VIDC_HBSR] - 1;
visarea.max_y = (m_vidc_regs[VIDC_VBER] - m_vidc_regs[VIDC_VBSR]) * (m_vidc_interlace+1);
-
- //logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n",
+
+ m_vidc_vblank_time = m_vidc_regs[VIDC_VBER] * (m_vidc_interlace+1);
+ //logerror("Configuring: htotal %d vtotal %d border %d x %d display origin %d x %d vblank = %d\n",
// m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR],
// visarea.max_x, visarea.max_y,
- // m_vidc_regs[VIDC_HDER]-m_vidc_regs[VIDC_HDSR],m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]+1);
+ // m_vidc_regs[VIDC_HDER]-m_vidc_regs[VIDC_HDSR],m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]+1,
+ // m_vidc_vblank_time);
/* FIXME: pixel clock */
refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_vidc_pixel_clk]*2) * m_vidc_regs[VIDC_HCR] * m_vidc_regs[VIDC_VCR];
@@ -987,7 +992,9 @@ WRITE32_MEMBER(archimedes_state::archimedes_vidc_w)
m_palette->set_pen_color((reg >> 2) + 0x100 + i, pal4bit(r), pal4bit(g), pal4bit(b) );
}
}
-
+
+ // update partials
+ machine().first_screen()->update_partial(machine().first_screen()->vpos());
}
else if (reg >= 0x60 && reg <= 0x7c)
{
@@ -1103,7 +1110,7 @@ WRITE32_MEMBER(archimedes_state::archimedes_memc_w)
if ((data>>10)&1)
{
m_vidc_vidcur = 0;
- m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_regs[0xb4]));
+ m_vid_timer->adjust(m_screen->time_until_pos(m_vidc_vblank_time+1));
}
if ((data>>11)&1)