diff --git a/hash/amigaocs_flop.xml b/hash/amigaocs_flop.xml
index 0d8d8b2e26c..fdd1cf067be 100644
--- a/hash/amigaocs_flop.xml
+++ b/hash/amigaocs_flop.xml
@@ -49337,7 +49337,7 @@ ATK test: OK
Team 17
diff --git a/src/mame/amiga/agnus_copper.cpp b/src/mame/amiga/agnus_copper.cpp
index d321ae70cf7..b79e02ee88f 100644
--- a/src/mame/amiga/agnus_copper.cpp
+++ b/src/mame/amiga/agnus_copper.cpp
@@ -309,22 +309,14 @@ int agnus_copper_device::execute_next(int xpos, int ypos, bool is_blitter_busy,
word0 = (word0 >> 1) & 0xff;
if (word0 >= m_cdang_setting)
{
- if (delay[word0] == 0)
- {
- //LOGCHIPSET("%02X.%02X: Write to %s = %04x\n", ypos, xpos / 2, s_custom_reg_names[word0 & 0xff], word1);
- LOGCHIPSET("%02X.%02X: MOVE $dff%03x = %04x\n",
- ypos,
- xpos / 2,
- word0 << 1,
- word1
- );
- m_host_space->write_word(0xdff000 | (word0 << 1), word1);
- }
- else // additional 2 cycles needed for non-Agnus registers
- {
- m_pending_offset = word0;
- m_pending_data = word1;
- }
+ // delay write to the next available DMA slot if not in blanking area
+ // - bchvolly (title), suprfrog & abreed (bottom playfield rows)
+ const bool horizontal_blank = xpos < 0x47;
+ const int move_offset = horizontal_blank ? 0 : std::max(num_planes - 4, 0);
+
+ m_pending_offset = word0;
+ m_pending_data = word1;
+ xpos += COPPER_CYCLES_TO_PIXELS(move_offset);
}
/* illegal writes suspend until next frame */
@@ -351,7 +343,8 @@ int agnus_copper_device::execute_next(int xpos, int ypos, bool is_blitter_busy,
/* handle a wait */
if ((word1 & 1) == 0)
{
- const int wait_offset = std::max(num_planes - 4, 0) + 1;
+ const bool horizontal_blank = xpos < 0x47;
+ const int wait_offset = horizontal_blank ? 0 : std::max(num_planes - 4, 0) + 1;
LOGINST(" WAIT %04x & %04x (currently %04x, num planes %d +%d)\n",
m_waitval,
@@ -383,6 +376,8 @@ int agnus_copper_device::execute_next(int xpos, int ypos, bool is_blitter_busy,
LOGINST(" Skipped\n");
/* count the cycles it out have taken to fetch the next instruction */
+ // TODO: look ahead, check if next instruction is a valid MOVE
+ // SKIP/WAIT and illegal instructions aren't skipped.
m_pc += 4;
xpos += COPPER_CYCLES_TO_PIXELS(2);
}
diff --git a/src/mame/amiga/agnus_copper.h b/src/mame/amiga/agnus_copper.h
index c60ab18c980..075f43f6dc5 100644
--- a/src/mame/amiga/agnus_copper.h
+++ b/src/mame/amiga/agnus_copper.h
@@ -68,30 +68,6 @@ private:
u16 m_waitmask;
u16 m_pending_offset;
u16 m_pending_data;
-
- // waitstate delays for copper
- // basically anything that doesn't belong to Angus has a penalty for Copper
- static constexpr u16 delay[256] =
- {
- 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* 0x000 - 0x03e */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x040 - 0x05e */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x060 - 0x07e */
- 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, /* 0x080 - 0x09e */
- 1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0, /* 0x0a0 - 0x0de */
- /* BPLxPTH/BPLxPTL */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x0e0 - 0x0fe */
- /* BPLCON0-3,BPLMOD1-2 */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x100 - 0x11e */
- /* SPRxPTH/SPRxPTL */
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0x120 - 0x13e */
- /* SPRxPOS/SPRxCTL/SPRxDATA/SPRxDATB */
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0x140 - 0x17e */
- /* COLORxx */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x180 - 0x1be */
- /* RESERVED */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0x1c0 - 0x1fe */
- };
-
};
diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp
index 1ba821f8aa2..5beb295704d 100644
--- a/src/mame/amiga/amiga_m.cpp
+++ b/src/mame/amiga/amiga_m.cpp
@@ -1700,6 +1700,9 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data)
{
CUSTOM_REG(REG_BEAMCON0) = data;
update_screenmode();
+ // TODO: variable beam counter, disables hard display stops, enables HTOTAL/VTOTAL programming
+ if (BIT(data, 7))
+ popmessage("BEAMCON0: VARBEAMEN enabled");
}
break;
diff --git a/src/mame/amiga/amigaaga.cpp b/src/mame/amiga/amigaaga.cpp
index a6956a7d51d..9d21009a66d 100644
--- a/src/mame/amiga/amigaaga.cpp
+++ b/src/mame/amiga/amigaaga.cpp
@@ -623,10 +623,13 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
if ((raw_scanline & 1) == 0)
{
+ const int min_x = 0x18 << 1;
+ const int max_x = 0x34 << 1;
+
// TODO: refine, merge with OCS version
- if (x >= 0x18 && x <= 0x34 && (x & 3) == 0)
+ if (x >= min_x && x <= max_x && (x & 7) == 0)
{
- int num = (x - 0x18) >> 2;
+ int num = (x - min_x) >> 3;
//printf("%d %02x\n", num, x);
aga_update_sprite_dma(raw_scanline >> 1, num);
}