From b5ffdb3e08d2b07714032031baa532600f454853 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 6 Jan 2025 21:36:23 +0100 Subject: amiga/amiga_m.cpp: disable DMA reload on SPRxPOS (Copper) writes --- hash/amigaocs_flop.xml | 18 ++++++++++-------- src/mame/amiga/amiga_m.cpp | 12 ++++++++++++ src/mame/amiga/amiga_v.cpp | 8 +++++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/hash/amigaocs_flop.xml b/hash/amigaocs_flop.xml index 051a1b7c34c..0d8d8b2e26c 100644 --- a/hash/amigaocs_flop.xml +++ b/hash/amigaocs_flop.xml @@ -1689,9 +1689,9 @@ ATK test: C:0 H:U Bad 1991 Team 17 8" after credits display +Throws "amiga_fdc_device::live_run - cur_live.bit_counter > 8" after credits display (worked around) Motor keeps spinning badly on disk swap screen(s) (verify) -No player sprite, red dots incorrectly drawn on several elements during gameplay (namely alien enemies) +Glitchy [Copper] on bottom part of screen, may use SKIP ATK test: OK ]]> @@ -2726,7 +2726,7 @@ ATK test: failed Virgin @@ -7829,7 +7829,7 @@ Fatal errors in ipf_decode::generate_timings type 4 new68k: white screen Title screen background glitches out [Copper] Map screen mosaic effect is off [Copper] -Gameplay has no [Denise] sprites [Copper] +Gameplay missing [Denise] lives counter, missing background [Copper] https://codetapper.com/amiga/sprite-tricks/brian-the-lion/ ATK test: OK ]]> @@ -43752,9 +43752,10 @@ ATK test: OK Psygnosis @@ -49335,8 +49336,9 @@ ATK test: OK 1993 Team 17 diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp index aeda9df1ba3..1ba821f8aa2 100644 --- a/src/mame/amiga/amiga_m.cpp +++ b/src/mame/amiga/amiga_m.cpp @@ -1545,9 +1545,21 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data) case REG_SPR0DATA: case REG_SPR1DATA: case REG_SPR2DATA: case REG_SPR3DATA: case REG_SPR4DATA: case REG_SPR5DATA: case REG_SPR6DATA: case REG_SPR7DATA: + { /* enable comparitor on writes here */ sprite_enable_comparitor((offset - REG_SPR0DATA) / 4, true); break; + } + + case REG_SPR0POS: case REG_SPR1POS: case REG_SPR2POS: case REG_SPR3POS: + case REG_SPR4POS: case REG_SPR5POS: case REG_SPR6POS: case REG_SPR7POS: + { + // a bunch of games override position thru copper + // suprfrog, abreed, brian, jimpower (lives counter) + int which = (offset - REG_SPR0POS) / 4; + m_sprite_dma_reload_mask &= ~(1 << which); + break; + } case REG_DDFSTRT: /* impose hardware limits ( HRM, page 75 ) */ diff --git a/src/mame/amiga/amiga_v.cpp b/src/mame/amiga/amiga_v.cpp index fd9f04b0597..89c8adb28fa 100644 --- a/src/mame/amiga/amiga_v.cpp +++ b/src/mame/amiga/amiga_v.cpp @@ -607,14 +607,16 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) // this is also unaffected by LACE if ((raw_scanline & 1) == 0) { + const int min_x = 0x18 << 1; + const int max_x = 0x34 << 1; // TODO: refine // Sprite DMA loads first two words at $14 + num * 4, other 2 words at $18 + num * 4 // NOTE: position $28 for sprite 4 has a typo on HRM diagram // non-zero DMA fetches are required by: - // - beast gameplay, suprfrog player sprite, abreed (top left counter) - if (x >= 0x18 && x <= 0x34 && (x & 3) == 0) + // - beast gameplay, abreed (top left counter) + 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); update_sprite_dma(raw_scanline >> 1, num); } -- cgit v1.2.3