From 8954c5fd8938256accd8bb7b83e685024f0ae57d Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 16 Jan 2025 16:00:19 +0100 Subject: amiga/agnus_copper.cpp: calculate cycles remainders on end of scanlines --- src/mame/amiga/agnus_copper.cpp | 16 ++++++++++++++++ src/mame/amiga/agnus_copper.h | 3 +++ src/mame/amiga/amiga_v.cpp | 4 +++- src/mame/amiga/amigaaga.cpp | 5 ++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/mame/amiga/agnus_copper.cpp b/src/mame/amiga/agnus_copper.cpp index 0af24767947..6de9b35b2c6 100644 --- a/src/mame/amiga/agnus_copper.cpp +++ b/src/mame/amiga/agnus_copper.cpp @@ -97,6 +97,7 @@ void agnus_copper_device::device_start() save_item(NAME(m_waitmask)); save_item(NAME(m_pending_data)); save_item(NAME(m_pending_offset)); + save_item(NAME(m_xpos_state)); } @@ -235,6 +236,21 @@ void agnus_copper_device::copins_w(u16 data) void agnus_copper_device::vblank_sync() { set_pc(0, true); + m_xpos_state = 0; +} + +// check current copper cycle at end of scanline +// - auntaadv (gameplay), WAITs with $xxd9 +void agnus_copper_device::suspend_offset(int xpos, int hblank_width) +{ + m_xpos_state = (xpos == 511) ? 0 : xpos - hblank_width; +// std::assert(m_xpos_state > 0); +} + +// restore at start +int agnus_copper_device::restore_offset() +{ + return m_xpos_state; } // TODO: h/vblank checks against xpos/vpos diff --git a/src/mame/amiga/agnus_copper.h b/src/mame/amiga/agnus_copper.h index 06b0c866047..064b7ee6e80 100644 --- a/src/mame/amiga/agnus_copper.h +++ b/src/mame/amiga/agnus_copper.h @@ -34,6 +34,8 @@ public: // getters/setters void vblank_sync(); int execute_next(int xpos, int ypos, bool is_blitter_busy, int num_planes); + void suspend_offset(int xpos, int hblank_width); + int restore_offset(); protected: // device-level overrides @@ -69,6 +71,7 @@ private: u16 m_waitmask; u16 m_pending_offset; u16 m_pending_data; + u16 m_xpos_state; }; diff --git a/src/mame/amiga/amiga_v.cpp b/src/mame/amiga/amiga_v.cpp index 557ebd9c419..552e9686da0 100644 --- a/src/mame/amiga/amiga_v.cpp +++ b/src/mame/amiga/amiga_v.cpp @@ -537,7 +537,7 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) /* loop over the line */ // TODO: copper runs on odd timeslots - next_copper_x = 0; + next_copper_x = m_copper->restore_offset(); // FIXME: without the add this increment will skip bitplane ops // ddf_stop_pixel_max = 0xd8 * 2 = 432 + 17 + 15 + 1(*) = 465 > width / 2 (455) // (*) because there's a comparison with <= in the bitplane code. @@ -880,6 +880,8 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) CUSTOM_REG_LONG(REG_BPL1PTH + pl * 2) += CUSTOM_REG_SIGNED(REG_BPL2MOD); } + m_copper->suspend_offset(next_copper_x, amiga_state::SCREEN_WIDTH / 2); + // restore color00 CUSTOM_REG(REG_COLOR00) = save_color0; diff --git a/src/mame/amiga/amigaaga.cpp b/src/mame/amiga/amigaaga.cpp index d94333433be..30a51d902d1 100644 --- a/src/mame/amiga/amigaaga.cpp +++ b/src/mame/amiga/amigaaga.cpp @@ -528,7 +528,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) /* loop over the line */ // TODO: copper runs on odd timeslots - next_copper_x = 0; + next_copper_x = m_copper->restore_offset(); // TODO: verify where we're missing pixels here for the GFX pitch bitplane corruptions // - wbenc30 scrolling in lores mode (fmode=3, expects a +58!, verify ddfstrt) // - roadkill title (fmode=3, max +14), gameplay uses fmode=1 @@ -876,6 +876,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) pri = (sprpix >> 12); /* sprite has priority */ + // TODO: porting OCS alfred fix to AGA will break OCS rodland status bar (!?) if (sprpix && pf1pri > pri) { dst[x*2+0] = @@ -946,6 +947,8 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) } } + m_copper->suspend_offset(next_copper_x, amiga_state::SCREEN_WIDTH / 2); + /* restore color00 */ CUSTOM_REG(REG_COLOR00) = save_color0; -- cgit v1.2.3