diff options
author | Vas Crabb <vas@vastheman.com> | 2021-09-16 04:29:53 +1000 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2021-09-16 04:29:53 +1000 |
commit | 55c73a821edae5897a51234749459396e704e379 (patch) | |
tree | f037056f33262937f82f6c0e4b6a19806345414f | |
parent | 263e1af894fae8ac752a52637d555952d8a2d3af (diff) |
mrgame.cpp: Add tilemap drawing - dakar works properly, wcup90 has some issues.
-rw-r--r-- | src/mame/drivers/mrgame.cpp | 148 |
1 files changed, 109 insertions, 39 deletions
diff --git a/src/mame/drivers/mrgame.cpp b/src/mame/drivers/mrgame.cpp index 721614e9906..0feda84e450 100644 --- a/src/mame/drivers/mrgame.cpp +++ b/src/mame/drivers/mrgame.cpp @@ -29,6 +29,7 @@ ToDo: *****************************************************************************************/ #include "emu.h" + #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/74259.h" @@ -39,9 +40,12 @@ ToDo: #include "sound/dac.h" #include "sound/tms5220.h" #include "video/resnet.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + namespace { @@ -83,9 +87,9 @@ private: void sound_w(uint8_t data); void triple_w(uint8_t data); void video_w(uint8_t data); - DECLARE_WRITE_LINE_MEMBER(video_a11_w); - DECLARE_WRITE_LINE_MEMBER(video_a12_w); - DECLARE_WRITE_LINE_MEMBER(video_a13_w); + void videoram_w(offs_t offset, uint8_t data); + void objectram_w(offs_t offset, uint8_t data); + template <unsigned Bit> DECLARE_WRITE_LINE_MEMBER(video_bank_w); DECLARE_WRITE_LINE_MEMBER(intst_w); DECLARE_WRITE_LINE_MEMBER(nmi_intst_w); DECLARE_WRITE_LINE_MEMBER(flip_w); @@ -97,6 +101,7 @@ private: DECLARE_WRITE_LINE_MEMBER(vblank_int_w); DECLARE_WRITE_LINE_MEMBER(vblank_nmi_w); TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); + TILE_GET_INFO_MEMBER(get_tile_info); uint32_t screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void audio1_io(address_map &map); @@ -107,12 +112,21 @@ private: void video_map(address_map &map); void wcup90_video_map(address_map &map); - std::unique_ptr<bitmap_ind16> m_tile_bitmap; required_device<palette_device> m_palette; required_shared_ptr<uint8_t> m_p_videoram; required_shared_ptr<uint8_t> m_p_objectram; required_device<gfxdecode_device> m_gfxdecode; + required_device<m68000_device> m_maincpu; + required_device<z80_device> m_audiocpu1; + required_device<z80_device> m_audiocpu2; + required_device<z80_device> m_videocpu; + required_device<ls259_device> m_selectlatch; + required_ioport m_io_dsw0; + required_ioport m_io_dsw1; + required_ioport m_io_x0; + required_ioport m_io_x1; + bool m_ack1; bool m_ack2; bool m_ackv; @@ -125,15 +139,7 @@ private: uint8_t m_video_data; uint8_t m_video_status; - required_device<m68000_device> m_maincpu; - required_device<z80_device> m_audiocpu1; - required_device<z80_device> m_audiocpu2; - required_device<z80_device> m_videocpu; - required_device<ls259_device> m_selectlatch; - required_ioport m_io_dsw0; - required_ioport m_io_dsw1; - required_ioport m_io_x0; - required_ioport m_io_x1; + tilemap_t *m_tilemap; }; @@ -155,8 +161,8 @@ void mrgame_state::video_map(address_map &map) { map(0x0000, 0x3fff).rom().region("video", 0); map(0x4000, 0x47ff).ram(); - map(0x4800, 0x4bff).mirror(0x0400).ram().share("videoram"); - map(0x5000, 0x50ff).mirror(0x0700).ram().share("objectram"); + map(0x4800, 0x4bff).mirror(0x0400).ram().share(m_p_videoram).w(FUNC(mrgame_state::videoram_w)); + map(0x5000, 0x50ff).mirror(0x0700).ram().share(m_p_objectram).w(FUNC(mrgame_state::objectram_w)); map(0x6800, 0x6807).mirror(0x07f8).w(m_selectlatch, FUNC(ls259_device::write_d0)); map(0x7000, 0x7000).mirror(0x07ff).nopr(); //AFR - watchdog reset map(0x8100, 0x8103).mirror(0x7efc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); @@ -166,8 +172,8 @@ void mrgame_state::wcup90_video_map(address_map &map) { map(0x0000, 0x7fff).rom().region("video", 0); map(0x8000, 0x87ff).ram(); - map(0x8800, 0x8bff).mirror(0x0400).ram().share("videoram"); - map(0x9000, 0x90ff).mirror(0x0700).ram().share("objectram"); + map(0x8800, 0x8bff).mirror(0x0400).ram().share(m_p_videoram).w(FUNC(mrgame_state::videoram_w)); + map(0x9000, 0x90ff).mirror(0x0700).ram().share(m_p_objectram).w(FUNC(mrgame_state::objectram_w)); map(0xa800, 0xa807).mirror(0x07f8).w(m_selectlatch, FUNC(ls259_device::write_d0)); map(0xb000, 0xb000).mirror(0x07ff).nopr(); //AFR - watchdog reset map(0xc000, 0xc003).mirror(0x3ffc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); @@ -303,19 +309,35 @@ void mrgame_state::video_w(uint8_t data) m_video_data = data; } -WRITE_LINE_MEMBER(mrgame_state::video_a11_w) +void mrgame_state::videoram_w(offs_t offset, uint8_t data) { - m_gfx_bank = (m_gfx_bank & 6) | (state ? 1 : 0); + m_p_videoram[offset] = data; + m_tilemap->mark_tile_dirty(offset); } -WRITE_LINE_MEMBER(mrgame_state::video_a12_w) +void mrgame_state::objectram_w(offs_t offset, uint8_t data) { - m_gfx_bank = (m_gfx_bank & 5) | (state ? 2 : 0); + m_p_objectram[offset] = data; + if (offset < 0x40) + { + if (BIT(offset, 0)) + { + for (int y = 0; y < 32; y++) + m_tilemap->mark_tile_dirty((y << 5) | (offset >> 1)); + } + else + { + m_tilemap->set_scrolly(offset >> 1, data); + } + } } -WRITE_LINE_MEMBER(mrgame_state::video_a13_w) +template <unsigned Bit> +WRITE_LINE_MEMBER(mrgame_state::video_bank_w) { - m_gfx_bank = (m_gfx_bank & 3) | (state ? 4 : 0); + m_gfx_bank &= 0x0f & ~(uint8_t(1) << Bit); + m_gfx_bank |= uint8_t(state ? 1 : 0) << Bit; + m_tilemap->mark_all_dirty(); } WRITE_LINE_MEMBER(mrgame_state::intst_w) @@ -335,6 +357,7 @@ WRITE_LINE_MEMBER(mrgame_state::nmi_intst_w) WRITE_LINE_MEMBER(mrgame_state::flip_w) { m_flip = state; + m_tilemap->mark_all_dirty(); } void mrgame_state::ack1_w(uint8_t data) @@ -365,7 +388,11 @@ uint8_t mrgame_state::portc_r() void mrgame_state::machine_start() { - m_tile_bitmap=std::make_unique<bitmap_ind16>(256,256); + m_tilemap = &machine().tilemap().create( + *m_gfxdecode, + tilemap_get_info_delegate(*this, FUNC(mrgame_state::get_tile_info)), TILEMAP_SCAN_ROWS, + 8, 8, 32, 32); + m_tilemap->set_scroll_cols(32); } void mrgame_state::machine_reset() @@ -417,33 +444,63 @@ TIMER_DEVICE_CALLBACK_MEMBER(mrgame_state::irq_timer) } } -static const gfx_layout charlayout = + +static const gfx_layout charlayout_2bpp = { 8, 8, 4096, 2, - { 0, 0x8000*8 }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0, 8, 16, 24, 32, 40, 48, 56 }, + { 0x00000*8, 0x08000*8 }, + { STEP8(0, 1) }, + { STEP8(0, 8) }, 8*8 }; -static const gfx_layout spritelayout = +static const gfx_layout spritelayout_2bpp = { 16, 16, 1024, 2, - { 0, 0x8000*8 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 64, 65, 66, 67, 68, 69, 70, 71 }, - { 0, 8, 16, 24, 32, 40, 48, 56, 128, 136, 144, 152, 160, 168, 176, 184 }, + { 0x00000*8, 0x08000*8 }, + { STEP8(0, 1), STEP8(64, 1) }, + { STEP8(0, 8), STEP8(128, 8) }, 32*8 }; -static GFXDECODE_START(gfx_mrgame) - GFXDECODE_ENTRY("chargen", 0, charlayout, 0, 16) - GFXDECODE_ENTRY("chargen", 0, spritelayout, 0, 16) +static GFXDECODE_START(gfx_2bpp) + GFXDECODE_ENTRY("chargen", 0, charlayout_2bpp, 0, 16) + GFXDECODE_ENTRY("chargen", 0, spritelayout_2bpp, 0, 16) GFXDECODE_END + +static const gfx_layout charlayout_5bpp +{ + 8, 8, + 4096, + 5, + { 0x00000*8, 0x08000*8, 0x10000*8, 0x18000*8, 0x20000*8 }, + { STEP8(0, 1) }, + { STEP8(0, 8) }, + 8*8 +}; + +static const gfx_layout spritelayout_5bpp = +{ + 16, 16, + 1024, + 2, + { 0x00000*8, 0x08000*8, 0x10000*8, 0x18000*8, 0x20000*8 }, + { STEP8(0, 1), STEP8(64, 1) }, + { STEP8(0, 8), STEP8(128, 8) }, + 32*8 +}; + +static GFXDECODE_START(gfx_5bpp) + GFXDECODE_ENTRY("chargen", 0, charlayout_5bpp, 0, 1) + GFXDECODE_ENTRY("chargen", 0, spritelayout_5bpp, 0, 1) +GFXDECODE_END + + void mrgame_state::mrgame_palette(palette_device &palette) const { static constexpr int resistances[3] = { 1000, 470, 220 }; @@ -483,8 +540,18 @@ void mrgame_state::mrgame_palette(palette_device &palette) const } } +TILE_GET_INFO_MEMBER(mrgame_state::get_tile_info) +{ + tileinfo.set( + 0, m_p_videoram[tile_index] | (uint16_t(m_gfx_bank) << 8), + m_p_objectram[((tile_index & 0x1f) << 1) | 1], + m_flip ? TILEMAP_FLIPX : 0); +} + uint32_t mrgame_state::screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + m_tilemap->draw(screen, bitmap, cliprect); + return 0; } @@ -509,10 +576,10 @@ void mrgame_state::mrgame(machine_config &config) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5564 (x2) + battery LS259(config, m_selectlatch); // 5B - m_selectlatch->q_out_cb<0>().set(FUNC(mrgame_state::video_a11_w)); + m_selectlatch->q_out_cb<0>().set(FUNC(mrgame_state::video_bank_w<0>)); m_selectlatch->q_out_cb<1>().set(FUNC(mrgame_state::nmi_intst_w)); - m_selectlatch->q_out_cb<3>().set(FUNC(mrgame_state::video_a12_w)); - m_selectlatch->q_out_cb<4>().set(FUNC(mrgame_state::video_a13_w)); + m_selectlatch->q_out_cb<3>().set(FUNC(mrgame_state::video_bank_w<1>)); + m_selectlatch->q_out_cb<4>().set(FUNC(mrgame_state::video_bank_w<2>)); m_selectlatch->q_out_cb<6>().set(FUNC(mrgame_state::flip_w)); //watchdog_timer_device &watchdog(WATCHDOG_TIMER(config, "watchdog")); // LS393 at 5D (video board) driven by VBLANK @@ -527,7 +594,7 @@ void mrgame_state::mrgame(machine_config &config) PALETTE(config, m_palette, FUNC(mrgame_state::mrgame_palette), 64); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_mrgame); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_2bpp); /* Sound */ SPEAKER(config, "lspeaker").front_left(); @@ -562,7 +629,10 @@ void mrgame_state::wcup90(machine_config &config) m_videocpu->set_addrmap(AS_PROGRAM, &mrgame_state::wcup90_video_map); + m_gfxdecode->set_info(gfx_5bpp); + m_selectlatch->q_out_cb<1>().set(FUNC(mrgame_state::intst_w)); // U48 + m_selectlatch->q_out_cb<2>().set(FUNC(mrgame_state::video_bank_w<3>)); subdevice<screen_device>("screen")->screen_vblank().set(FUNC(mrgame_state::vblank_int_w)); } |