From db50370e7352d48eafa6d83210bfa2321c39031a Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 24 Nov 2024 06:39:47 +0100 Subject: k007342: add interface for sending sprite related flags to paired chip --- src/mame/konami/battlnts.cpp | 2 ++ src/mame/konami/bladestl.cpp | 3 +++ src/mame/konami/k007342.cpp | 54 ++++++++++++++++++++++++---------------- src/mame/konami/k007342.h | 7 +++++- src/mame/konami/k007420.cpp | 24 ++++++++++-------- src/mame/konami/k007420.h | 8 ++++-- src/mame/konami/rockrage.cpp | 4 ++- src/mame/nichibutsu/seicross.cpp | 4 +-- 8 files changed, 67 insertions(+), 39 deletions(-) diff --git a/src/mame/konami/battlnts.cpp b/src/mame/konami/battlnts.cpp index 7221e9c29a7..0201fe3c6c1 100644 --- a/src/mame/konami/battlnts.cpp +++ b/src/mame/konami/battlnts.cpp @@ -331,6 +331,8 @@ void battlnts_state::battlnts(machine_config &config) K007342(config, m_k007342, 0, "palette", gfx_battlnts_tiles); m_k007342->set_tile_callback(FUNC(battlnts_state::tile_callback)); + m_k007342->flipscreen_cb().set(m_k007420, FUNC(k007420_device::set_flipscreen)); + m_k007342->sprite_wrap_y_cb().set(m_k007420, FUNC(k007420_device::set_wrap_y)); K007420(config, m_k007420, 0, "palette", gfx_battlnts_spr); m_k007420->set_bank_limit(0x3ff); diff --git a/src/mame/konami/bladestl.cpp b/src/mame/konami/bladestl.cpp index 4c7b0bdcf66..dd772c6b699 100644 --- a/src/mame/konami/bladestl.cpp +++ b/src/mame/konami/bladestl.cpp @@ -173,6 +173,7 @@ uint32_t bladestl_state::screen_update(screen_device &screen, bitmap_ind16 &bitm m_k007342->tilemap_draw(screen, bitmap, cliprect, 1, 1 | TILEMAP_DRAW_OPAQUE, 0); m_k007342->tilemap_draw(screen, bitmap, cliprect, 0, 0 ,0); m_k007342->tilemap_draw(screen, bitmap, cliprect, 0, 1 ,0); + return 0; } @@ -446,6 +447,8 @@ void bladestl_state::bladestl(machine_config &config) K007342(config, m_k007342, 0, "palette", gfx_bladestl_tiles); m_k007342->set_tile_callback(FUNC(bladestl_state::tile_callback)); + m_k007342->flipscreen_cb().set(m_k007420, FUNC(k007420_device::set_flipscreen)); + m_k007342->sprite_wrap_y_cb().set(m_k007420, FUNC(k007420_device::set_wrap_y)); K007420(config, m_k007420, 0, "palette", gfx_bladestl_spr); m_k007420->set_bank_limit(0x3ff); diff --git a/src/mame/konami/k007342.cpp b/src/mame/konami/k007342.cpp index d8206f16ed5..4a9f4e4a4f3 100644 --- a/src/mame/konami/k007342.cpp +++ b/src/mame/konami/k007342.cpp @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Fabio Priuli,Acho A. Tang, R. Belmont /* + Konami 007342 ------ The 007342 manages 2 64x32 scrolling tilemaps with 8x8 characters, and @@ -8,6 +9,9 @@ optionally generates timing clocks and interrupt signals. It uses 0x2000 bytes of RAM, plus 0x0200 bytes for scrolling, and a variable amount of ROM. It cannot read the ROMs. +Some of the control flags are specifically meant for other Konami chips, +such as the sprite wraparound flag for K007420. + control registers 000: ------x- INT control ---x---- flip screen (TODO: doesn't work with thehustl) @@ -26,6 +30,7 @@ control registers 005: x scroll 2 006: y scroll 2 007: not used + */ #include "emu.h" @@ -48,7 +53,9 @@ k007342_device::k007342_device(const machine_config &mconfig, const char *tag, d m_tilemap{ nullptr, nullptr }, m_flipscreen(false), m_int_enabled(false), - m_callback(*this) + m_callback(*this), + m_flipscreen_cb(*this), + m_sprite_wrap_y_cb(*this) { } @@ -92,6 +99,10 @@ void k007342_device::device_reset() { m_int_enabled = false; m_flipscreen = false; + + m_flipscreen_cb(0); + m_sprite_wrap_y_cb(0); + m_scrollx[0] = 0; m_scrollx[1] = 0; m_scrolly[0] = 0; @@ -114,9 +125,9 @@ void k007342_device::write(offs_t offset, uint8_t data) { m_ram[offset] = data; - if (offset < 0x1000) /* layer 0 */ + if (offset < 0x1000) m_tilemap[0]->mark_tile_dirty(offset & 0x7ff); - else /* layer 1 */ + else m_tilemap[1]->mark_tile_dirty(offset & 0x7ff); } @@ -135,33 +146,37 @@ void k007342_device::vreg_w(offs_t offset, uint8_t data) switch (offset) { case 0x00: - /* bit 1: INT control */ + // bit 1: INT control m_int_enabled = BIT(data, 1); + + // bit 4: flip screen m_flipscreen = BIT(data, 4); + m_flipscreen_cb(BIT(data, 4)); m_tilemap[0]->set_flip(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); m_tilemap[1]->set_flip(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); break; - case 0x01: /* used for banking in Rock'n'Rage */ + case 0x01: // used for banking in Rock'n'Rage if (data != m_regs[1]) machine().tilemap().mark_all_dirty(); - [[fallthrough]]; + break; case 0x02: m_scrollx[0] = (m_scrollx[0] & 0xff) | ((data & 0x01) << 8); m_scrollx[1] = (m_scrollx[1] & 0xff) | ((data & 0x02) << 7); + m_sprite_wrap_y_cb(BIT(data, 7)); break; - case 0x03: /* scroll x (register 0) */ + case 0x03: // scroll x (register 0) m_scrollx[0] = (m_scrollx[0] & 0x100) | data; break; - case 0x04: /* scroll y (register 0) */ + case 0x04: // scroll y (register 0) m_scrolly[0] = data; break; - case 0x05: /* scroll x (register 1) */ + case 0x05: // scroll x (register 1) m_scrollx[1] = (m_scrollx[1] & 0x100) | data; break; - case 0x06: /* scroll y (register 1) */ + case 0x06: // scroll y (register 1) m_scrolly[1] = data; break; - case 0x07: /* unused */ + case 0x07: // unused break; } m_regs[offset] = data; @@ -169,18 +184,18 @@ void k007342_device::vreg_w(offs_t offset, uint8_t data) void k007342_device::tilemap_update() { - /* update scroll */ + // update scroll switch (m_regs[2] & 0x1c) { case 0x00: - case 0x08: /* unknown, blades of steel shootout between periods */ + case 0x08: // unknown, blades of steel shootout between periods m_tilemap[0]->set_scroll_rows(1); m_tilemap[0]->set_scroll_cols(1); m_tilemap[0]->set_scrollx(0, m_scrollx[0]); m_tilemap[0]->set_scrolly(0, m_scrolly[0]); break; - case 0x0c: /* 32 columns */ + case 0x0c: // 32 columns m_tilemap[0]->set_scroll_rows(1); m_tilemap[0]->set_scroll_cols(512); m_tilemap[0]->set_scrollx(0, m_scrollx[0]); @@ -189,7 +204,7 @@ void k007342_device::tilemap_update() m_scroll_ram[2 * (offs / 8)] + 256 * m_scroll_ram[2 * (offs / 8) + 1]); break; - case 0x14: /* 256 rows */ + case 0x14: // 256 rows m_tilemap[0]->set_scroll_rows(256); m_tilemap[0]->set_scroll_cols(1); m_tilemap[0]->set_scrolly(0, m_scrolly[0]); @@ -199,7 +214,7 @@ void k007342_device::tilemap_update() break; default: -// popmessage("unknown scroll ctrl %02x", m_regs[2] & 0x1c); + //popmessage("unknown scroll ctrl %02x", m_regs[2] & 0x1c); break; } @@ -227,11 +242,6 @@ void k007342_device::tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, c m_tilemap[num]->draw(screen, bitmap, cliprect, flags, priority); } -int k007342_device::is_int_enabled() -{ - return m_int_enabled; -} - /*************************************************************************** @@ -251,7 +261,7 @@ int k007342_device::is_int_enabled() TILEMAP_MAPPER_MEMBER(k007342_device::scan) { - /* logical (col,row) -> memory offset */ + // logical (col,row) -> memory offset return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5); } diff --git a/src/mame/konami/k007342.h b/src/mame/konami/k007342.h index 2f659ddf4ef..d88d9c7f7fd 100644 --- a/src/mame/konami/k007342.h +++ b/src/mame/konami/k007342.h @@ -23,6 +23,8 @@ public: // configuration template void set_tile_callback(T &&... args) { m_callback.set(std::forward(args)...); } + auto flipscreen_cb() { return m_flipscreen_cb.bind(); } + auto sprite_wrap_y_cb() { return m_sprite_wrap_y_cb.bind(); } uint8_t read(offs_t offset); void write(offs_t offset, uint8_t data); @@ -32,7 +34,7 @@ public: void tilemap_update(); void tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int num, int flags, uint32_t priority); - int is_int_enabled(); + int is_int_enabled() { return m_int_enabled; } protected: // device_t implementation @@ -51,7 +53,10 @@ private: uint8_t m_regs[8]; uint16_t m_scrollx[2]; uint8_t m_scrolly[2]; + tile_delegate m_callback; + devcb_write_line m_flipscreen_cb; + devcb_write_line m_sprite_wrap_y_cb; TILEMAP_MAPPER_MEMBER(scan); TILE_GET_INFO_MEMBER(get_tile_info0); diff --git a/src/mame/konami/k007420.cpp b/src/mame/konami/k007420.cpp index 2a15420fecd..d68af547143 100644 --- a/src/mame/konami/k007420.cpp +++ b/src/mame/konami/k007420.cpp @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Fabio Priuli,Acho A. Tang, R. Belmont /* + Konami 007420 ------ Sprite generator. 8 bytes per sprite with zoom. It uses 0x200 bytes of RAM, @@ -8,6 +9,7 @@ and a variable amount of ROM. Nothing is known about its external interface. TODO: - sprite X wraparound? (Rock N Rage sprites disappears on left edge of screen) + */ #include "emu.h" @@ -26,6 +28,7 @@ k007420_device::k007420_device(const machine_config &mconfig, const char *tag, d , device_gfx_interface(mconfig, *this) , m_ram(nullptr) , m_flipscreen(false) + , m_wrap_y(false) , m_banklimit(0) , m_callback(*this) { @@ -40,11 +43,11 @@ void k007420_device::device_start() // bind the init function m_callback.resolve(); - m_ram = make_unique_clear(0x200); + m_ram = make_unique_clear(K007420_SPRITERAM_SIZE); - save_pointer(NAME(m_ram), 0x200); - save_item(NAME(m_flipscreen)); // current one uses 7342 one - save_item(NAME(m_regs)); // current one uses 7342 ones + save_pointer(NAME(m_ram), K007420_SPRITERAM_SIZE); + save_item(NAME(m_flipscreen)); + save_item(NAME(m_wrap_y)); } //------------------------------------------------- @@ -53,9 +56,6 @@ void k007420_device::device_start() void k007420_device::device_reset() { - m_flipscreen = false; - for (int i = 0; i < 8; i++) - m_regs[i] = 0; } /***************************************************************************** @@ -193,13 +193,14 @@ void k007420_device::sprites_draw(bitmap_ind16 &bitmap, const rectangle &cliprec flipx,flipy, sx,sy,0); - if (m_regs[2] & 0x80) + if (m_wrap_y) { + const int dy = m_flipscreen ? +256 : -256; gfx(0)->transpen(bitmap,cliprect, c, color, flipx,flipy, - sx,sy-256,0); + sx,sy+dy,0); } } } @@ -239,13 +240,14 @@ void k007420_device::sprites_draw(bitmap_ind16 &bitmap, const rectangle &cliprec sx,sy, (zw << 16) / 8,(zh << 16) / 8,0); - if (m_regs[2] & 0x80) + if (m_wrap_y) { + const int dy = m_flipscreen ? +256 : -256; gfx(0)->zoom_transpen(bitmap,cliprect, c, color, flipx,flipy, - sx,sy-256, + sx,sy+dy, (zw << 16) / 8,(zh << 16) / 8,0); } } diff --git a/src/mame/konami/k007420.h b/src/mame/konami/k007420.h index 1cbf19ec9f7..76377c74f18 100644 --- a/src/mame/konami/k007420.h +++ b/src/mame/konami/k007420.h @@ -28,6 +28,10 @@ public: void write(offs_t offset, uint8_t data); void sprites_draw(bitmap_ind16 &bitmap, const rectangle &cliprect); + // signals from paired chip (commonly K007342) + void set_flipscreen(int flip) { m_flipscreen = bool(flip); } + void set_wrap_y(int wrap) { m_wrap_y = bool(wrap); } + protected: // device_t implementation virtual void device_start() override ATTR_COLD; @@ -37,8 +41,8 @@ private: // internal state std::unique_ptr m_ram; - bool m_flipscreen; // current code uses the 7342 flipscreen!! - uint8_t m_regs[8]; // current code uses the 7342 regs!! (only [2]) + bool m_flipscreen; + bool m_wrap_y; uint32_t m_banklimit; sprite_delegate m_callback; }; diff --git a/src/mame/konami/rockrage.cpp b/src/mame/konami/rockrage.cpp index 0e6dd73c17d..19d273666c4 100644 --- a/src/mame/konami/rockrage.cpp +++ b/src/mame/konami/rockrage.cpp @@ -388,6 +388,8 @@ void rockrage_state::rockrage(machine_config &config) K007342(config, m_k007342, 0, m_palette, gfx_rockrage_tiles); m_k007342->set_tile_callback(FUNC(rockrage_state::tile_callback)); + m_k007342->flipscreen_cb().set(m_k007420, FUNC(k007420_device::set_flipscreen)); + m_k007342->sprite_wrap_y_cb().set(m_k007420, FUNC(k007420_device::set_wrap_y)); K007420(config, m_k007420, 0, m_palette, gfx_rockrage_spr); m_k007420->set_bank_limit(0x3ff); @@ -403,7 +405,7 @@ void rockrage_state::rockrage(machine_config &config) GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, M6809_IRQ_LINE); - YM2151(config, "ymsnd", 3'579'545).add_route(0, "lspeaker", 0.60).add_route(1, "rspeaker", 0.60); + YM2151(config, "ymsnd", 3'579'545).add_route(0, "lspeaker", 0.30).add_route(1, "rspeaker", 0.30); VLM5030(config, m_vlm, 3'579'545); m_vlm->set_addrmap(0, &rockrage_state::vlm_map); diff --git a/src/mame/nichibutsu/seicross.cpp b/src/mame/nichibutsu/seicross.cpp index 310c6015eac..a768c1789fc 100644 --- a/src/mame/nichibutsu/seicross.cpp +++ b/src/mame/nichibutsu/seicross.cpp @@ -290,8 +290,8 @@ void seicross_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, 0); - if (sx > 0xf0) - m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, color, flipx, flipy, sx - 256, sy, 0); + const int dx = flip_screen() ? +256 : -256; + m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, color, flipx, flipy, sx + dx, sy, 0); } } } -- cgit v1.2.3