diff --git a/src/mame/konami/konami_helper.cpp b/src/mame/konami/konami_helper.cpp index f30f1198f370f..0ced4ba7c6e7d 100644 --- a/src/mame/konami/konami_helper.cpp +++ b/src/mame/konami/konami_helper.cpp @@ -14,65 +14,3 @@ void konami_decode_gfx(device_gfx_interface &gfxdecode, int gfx_index, uint8_t * gl.total = total; gfxdecode.set_gfx(gfx_index, std::make_unique(&palette, gl, data, 0, palette.entries() >> bpp, 0)); } - - -/* useful function to sort three tile layers by priority order */ -void konami_sortlayers3( int *layer, int *pri ) -{ -#define SWAP(a,b) \ - if (pri[a] < pri[b]) \ - { \ - int t; \ - t = pri[a]; pri[a] = pri[b]; pri[b] = t; \ - t = layer[a]; layer[a] = layer[b]; layer[b] = t; \ - } - - SWAP(0,1) - SWAP(0,2) - SWAP(1,2) -#undef SWAP -} - -/* useful function to sort four tile layers by priority order */ -void konami_sortlayers4( int *layer, int *pri ) -{ -#define SWAP(a,b) \ - if (pri[a] <= pri[b]) \ - { \ - int t; \ - t = pri[a]; pri[a] = pri[b]; pri[b] = t; \ - t = layer[a]; layer[a] = layer[b]; layer[b] = t; \ - } - - SWAP(0, 1) - SWAP(0, 2) - SWAP(0, 3) - SWAP(1, 2) - SWAP(1, 3) - SWAP(2, 3) -#undef SWAP -} - -/* useful function to sort five tile layers by priority order */ -void konami_sortlayers5( int *layer, int *pri ) -{ -#define SWAP(a,b) \ - if (pri[a] <= pri[b]) \ - { \ - int t; \ - t = pri[a]; pri[a] = pri[b]; pri[b] = t; \ - t = layer[a]; layer[a] = layer[b]; layer[b] = t; \ - } - - SWAP(0, 1) - SWAP(0, 2) - SWAP(0, 3) - SWAP(0, 4) - SWAP(1, 2) - SWAP(1, 3) - SWAP(1, 4) - SWAP(2, 3) - SWAP(2, 4) - SWAP(3, 4) -#undef SWAP -} diff --git a/src/mame/konami/konami_helper.h b/src/mame/konami/konami_helper.h index a91a93c578866..967671eb4b9d1 100644 --- a/src/mame/konami/konami_helper.h +++ b/src/mame/konami/konami_helper.h @@ -6,13 +6,47 @@ #pragma once +#include +#include + void konami_decode_gfx(device_gfx_interface &gfxdecode, int gfx_index, uint8_t *data, uint32_t total, const gfx_layout *layout, int bpp); +// unrolled bubble sort helper +template +inline void konami_sortlayers(C cmp, T *layer, U *pri) +{ + if constexpr (B > (A + 1)) + konami_sortlayers(cmp, layer, pri); + else if constexpr (A > 0) + konami_sortlayers(cmp, layer, pri); + if (cmp(pri[A], pri[B])) + { + using std::swap; + swap(pri[A], pri[B]); + swap(layer[A], layer[B]); + } +} + // helper function to sort three tile layers by priority order -void konami_sortlayers3(int *layer, int *pri); +template +inline void konami_sortlayers3(T *layer, U *pri) +{ + konami_sortlayers<3>(std::less(), layer, pri); +} + // helper function to sort four tile layers by priority order -void konami_sortlayers4(int *layer, int *pri); +template +inline void konami_sortlayers4(T *layer, U *pri) +{ + konami_sortlayers<4>(std::less_equal(), layer, pri); +} + // helper function to sort five tile layers by priority order -void konami_sortlayers5(int *layer, int *pri); +template +inline void konami_sortlayers5(T *layer, U *pri) +{ + konami_sortlayers<5>(std::less_equal(), layer, pri); +} + #endif // MAME_KONAMI_KONAMI_HELPER_H diff --git a/src/mame/konami/simpsons.cpp b/src/mame/konami/simpsons.cpp index 2d8b159d077b3..5291ce650676d 100644 --- a/src/mame/konami/simpsons.cpp +++ b/src/mame/konami/simpsons.cpp @@ -113,6 +113,8 @@ GX072 PWB352346B #include "emupal.h" #include "speaker.h" +#include + namespace { @@ -121,13 +123,16 @@ class simpsons_state : public driver_device public: simpsons_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_palette_view(*this, "palette_view"), - m_video_view(*this, "video_view"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_k052109(*this, "k052109"), m_k053246(*this, "k053246"), - m_k053251(*this, "k053251") + m_k053251(*this, "k053251"), + m_mainbank(*this, "mainbank"), + m_audiobank(*this, "audiobank"), + m_io_eepromout(*this, "EEPROMOUT"), + m_palette_view(*this, "palette_view"), + m_video_view(*this, "video_view") { } void simpsons(machine_config &config); @@ -137,38 +142,34 @@ class simpsons_state : public driver_device virtual void machine_reset() override ATTR_COLD; private: - void bank0000_map(address_map &map) ATTR_COLD; - void bank2000_map(address_map &map) ATTR_COLD; - void main_map(address_map &map) ATTR_COLD; - void z80_map(address_map &map) ATTR_COLD; - - TIMER_CALLBACK_MEMBER(dma_start); - TIMER_CALLBACK_MEMBER(dma_end); + /* devices */ + required_device m_maincpu; + required_device m_audiocpu; + required_device m_k052109; + required_device m_k053246; + required_device m_k053251; + required_memory_bank m_mainbank; + required_memory_bank m_audiobank; + required_ioport m_io_eepromout; /* memory pointers */ std::unique_ptr m_spriteram; /* video-related */ - int m_sprite_colorbase = 0; - int m_layer_colorbase[3]{}; - int m_layerpri[3]{}; + int32_t m_sprite_colorbase = 0; + int32_t m_layer_colorbase[3]{}; + int32_t m_layerpri[3]{}; emu_timer *m_dma_start_timer; emu_timer *m_dma_end_timer; /* misc */ - int m_firq_enabled = 0; + bool m_firq_enabled = false; emu_timer *m_nmi_blocked; /* views */ memory_view m_palette_view; memory_view m_video_view; - /* devices */ - required_device m_maincpu; - required_device m_audiocpu; - required_device m_k052109; - required_device m_k053246; - required_device m_k053251; void z80_bankswitch_w(uint8_t data); void z80_arm_nmi_w(uint8_t data); void eeprom_w(uint8_t data); @@ -186,6 +187,12 @@ class simpsons_state : public driver_device K052109_CB_MEMBER(tile_callback); void banking_callback(u8 data); K053246_CB_MEMBER(sprite_callback); + + TIMER_CALLBACK_MEMBER(dma_start); + TIMER_CALLBACK_MEMBER(dma_end); + + void main_map(address_map &map) ATTR_COLD; + void z80_map(address_map &map) ATTR_COLD; }; @@ -211,7 +218,7 @@ K052109_CB_MEMBER(simpsons_state::tile_callback) K053246_CB_MEMBER(simpsons_state::sprite_callback) { - int pri = (*color & 0x0f80) >> 6; /* ??????? */ + int const pri = (*color & 0x0f80) >> 6; /* ??????? */ if (pri <= m_layerpri[2]) *priority_mask = 0; @@ -244,9 +251,9 @@ void simpsons_state::k052109_w(offs_t offset, uint8_t data) uint8_t simpsons_state::k053247_r(offs_t offset) { - int offs = offset >> 1; + int const offs = offset >> 1; - if (offset & 1) + if (BIT(offset, 0)) return(m_spriteram[offs] & 0xff); else return(m_spriteram[offs] >> 8); @@ -254,21 +261,21 @@ uint8_t simpsons_state::k053247_r(offs_t offset) void simpsons_state::k053247_w(offs_t offset, uint8_t data) { - int offs = offset >> 1; + int const offs = offset >> 1; - if (offset & 1) + if (BIT(offset, 0)) m_spriteram[offs] = (m_spriteram[offs] & 0xff00) | data; else m_spriteram[offs] = (m_spriteram[offs] & 0x00ff) | (data << 8); } -void simpsons_state::video_bank_select( int bank ) +void simpsons_state::video_bank_select(int bank) { - if(bank & 1) + if (BIT(bank, 0)) m_palette_view.select(0); else m_palette_view.disable(); - m_video_view.select((bank >> 1) & 1); + m_video_view.select(BIT(bank, 1)); } @@ -283,12 +290,12 @@ uint32_t simpsons_state::screen_update(screen_device &screen, bitmap_ind16 &bitm { // update color info and refresh tilemaps static const int K053251_CI[3] = { k053251_device::CI2, k053251_device::CI3, k053251_device::CI4 }; - int bg_colorbase = m_k053251->get_palette_index(k053251_device::CI0); + int const bg_colorbase = m_k053251->get_palette_index(k053251_device::CI0); m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI1); for (int i = 0; i < 3; i++) { - int prev_colorbase = m_layer_colorbase[i]; + int const prev_colorbase = m_layer_colorbase[i]; m_layer_colorbase[i] = m_k053251->get_palette_index(K053251_CI[i]); if (m_layer_colorbase[i] != prev_colorbase) @@ -298,7 +305,7 @@ uint32_t simpsons_state::screen_update(screen_device &screen, bitmap_ind16 &bitm m_k052109->tilemap_update(); // sort layers and draw - int layer[3]; + int layer[3]{}; for (int i = 0; i < 3; i++) { layer[i] = i; @@ -330,11 +337,11 @@ void simpsons_state::eeprom_w(uint8_t data) if (data == 0xff) return; - ioport("EEPROMOUT")->write(data, 0xff); + m_io_eepromout->write(data, 0xff); video_bank_select(data & 0x03); - m_firq_enabled = data & 0x04; + m_firq_enabled = BIT(data, 2); if (!m_firq_enabled) m_maincpu->set_input_line(KONAMI_FIRQ_LINE, CLEAR_LINE); } @@ -348,14 +355,14 @@ void simpsons_state::eeprom_w(uint8_t data) void simpsons_state::coin_counter_w(uint8_t data) { /* bit 0,1 coin counters */ - machine().bookkeeping().coin_counter_w(0, data & 0x01); - machine().bookkeeping().coin_counter_w(1, data & 0x02); + machine().bookkeeping().coin_counter_w(0, BIT(data, 0)); + machine().bookkeeping().coin_counter_w(1, BIT(data, 1)); /* bit 2 selects mono or stereo sound */ /* bit 3 = enable char ROM reading through the video RAM */ - m_k052109->set_rmrd_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE); + m_k052109->set_rmrd_line(BIT(data, 3)); /* bit 4 = INIT (unknown) */ /* bit 5 = enable sprite ROM reading */ - m_k053246->k053246_set_objcha_line((~data & 0x20) ? ASSERT_LINE : CLEAR_LINE); + m_k053246->k053246_set_objcha_line(BIT(~data, 5)); } uint8_t simpsons_state::sound_interrupt_r() @@ -375,17 +382,17 @@ uint8_t simpsons_state::sound_interrupt_r() void simpsons_state::banking_callback(u8 data) { - membank("bank1")->set_entry(data & 0x3f); + m_mainbank->set_entry(data & 0x3f); } void simpsons_state::machine_start() { m_spriteram = make_unique_clear(0x1000 / 2); - membank("bank1")->configure_entries(0, 64, memregion("maincpu")->base(), 0x2000); + m_mainbank->configure_entries(0, 64, memregion("maincpu")->base(), 0x2000); - membank("bank2")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x10000, 0); - membank("bank2")->configure_entries(2, 6, memregion("audiocpu")->base() + 0x10000, 0x4000); + m_audiobank->configure_entries(0, 2, memregion("audiocpu")->base() + 0x10000, 0); + m_audiobank->configure_entries(2, 6, memregion("audiocpu")->base() + 0x10000, 0x4000); save_item(NAME(m_firq_enabled)); save_item(NAME(m_sprite_colorbase)); @@ -407,11 +414,11 @@ void simpsons_state::machine_reset() } m_sprite_colorbase = 0; - m_firq_enabled = 0; + m_firq_enabled = false; /* init the default banks */ - membank("bank1")->set_entry(0); - membank("bank2")->set_entry(0); + m_mainbank->set_entry(0); + m_audiobank->set_entry(0); video_bank_select(0); m_dma_start_timer->adjust(attotime::never); @@ -454,13 +461,13 @@ void simpsons_state::main_map(address_map &map) m_video_view[1](0x2000, 0x2fff).rw(FUNC(simpsons_state::k053247_r), FUNC(simpsons_state::k053247_w)); m_video_view[1](0x3000, 0x3fff).ram(); map(0x4000, 0x5fff).ram(); - map(0x6000, 0x7fff).bankr("bank1"); + map(0x6000, 0x7fff).bankr(m_mainbank); map(0x8000, 0xffff).rom().region("maincpu", 0x78000); } void simpsons_state::z80_bankswitch_w(uint8_t data) { - membank("bank2")->set_entry(data & 7); + m_audiobank->set_entry(data & 7); } @@ -499,7 +506,7 @@ void simpsons_state::z80_nmi_w(int state) void simpsons_state::z80_map(address_map &map) { map(0x0000, 0x7fff).rom(); - map(0x8000, 0xbfff).bankr("bank2"); + map(0x8000, 0xbfff).bankr(m_audiobank); map(0xf000, 0xf7ff).ram(); map(0xf800, 0xf801).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); map(0xfa00, 0xfa00).w(FUNC(simpsons_state::z80_arm_nmi_w)); @@ -593,26 +600,27 @@ INPUT_PORTS_END void simpsons_state::object_dma() { - int counter, num_inactive; - uint16_t *src, *dst; - + uint16_t *dst; m_k053246->k053247_get_ram(&dst); - src = m_spriteram.get(); - num_inactive = counter = 256; + uint16_t const *src = m_spriteram.get(); + int num_inactive = 256; - do { - if ((*src & 0x8000) && (*src & 0xff)) + for (int counter = 256; counter; --counter) + { + if (BIT(*src, 15) && (*src & 0xff)) { - memcpy(dst, src, 0x10); - dst += 8; + dst = std::copy_n(src, 8, dst); num_inactive--; } src += 8; } - while (--counter); - if (num_inactive) do { *dst = 0; dst += 8; } while (--num_inactive); + while (num_inactive--) + { + *dst = 0; + dst += 8; + } } INTERRUPT_GEN_MEMBER(simpsons_state::periodic_irq)