From 2f3e89b5dfc57c60950948147841c7bbf5041f94 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sat, 24 Dec 2016 19:40:04 +0100 Subject: 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) --- src/mame/includes/archimds.h | 1 + src/mame/machine/archimds.cpp | 23 +++++++++++++++-------- 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) -- cgit v1.2.3