diff options
author | cam900 <dbtlrchl@naver.com> | 2018-09-03 10:58:24 +0900 |
---|---|---|
committer | Vas Crabb <cuavas@users.noreply.github.com> | 2018-09-04 23:54:44 +1000 |
commit | 660417c5304231033a26c71203e180210bd791a1 (patch) | |
tree | c1751943fa9cc595a34801f3e1273e0fef58bbb6 | |
parent | 6507f3007be05f8b13afc36b660c626f62b13bc2 (diff) |
funybubl.cpp : Update/Cleanups
Cleanup naming, Convert tilemap, Add address_map_bank_device for banked vram, Cleanup OKI banking, Fix OKI clock related to On-PCB XTAL, Add palette decoder member for palette, Cleanup/fix naming, Fix palette entry, Reduce runtime tag lookups
-rw-r--r-- | src/mame/drivers/funybubl.cpp | 93 | ||||
-rw-r--r-- | src/mame/includes/funybubl.h | 41 | ||||
-rw-r--r-- | src/mame/video/funybubl.cpp | 50 |
3 files changed, 94 insertions, 90 deletions
diff --git a/src/mame/drivers/funybubl.cpp b/src/mame/drivers/funybubl.cpp index 30291b5cd42..59b316358c0 100644 --- a/src/mame/drivers/funybubl.cpp +++ b/src/mame/drivers/funybubl.cpp @@ -58,61 +58,65 @@ Note: SW2, SW3 & SW4 not populated #include "speaker.h" -WRITE8_MEMBER(funybubl_state::funybubl_vidram_bank_w) +WRITE8_MEMBER(funybubl_state::vidram_bank_w) { - membank("bank1")->set_entry(data & 1); + m_vrambank->set_bank(data & 1); } -WRITE8_MEMBER(funybubl_state::funybubl_cpurombank_w) +WRITE8_MEMBER(funybubl_state::cpurombank_w) { - membank("bank2")->set_entry(data & 0x3f); // should we add a check that (data&0x3f) < #banks? + m_mainbank->set_entry(data & 0x3f); // should we add a check that (data&0x3f) < #banks? } - -WRITE8_MEMBER(funybubl_state::funybubl_soundcommand_w) -{ - m_soundlatch->write(space, 0, data); - m_audiocpu->set_input_line(0, HOLD_LINE); -} - -WRITE8_MEMBER(funybubl_state::funybubl_oki_bank_sw) +WRITE8_MEMBER(funybubl_state::oki_bank_w) { - m_oki->set_rom_bank(data & 1); + m_okibank->set_entry(data & 1); } void funybubl_state::funybubl_map(address_map &map) { map(0x0000, 0x7fff).rom(); - map(0x8000, 0xbfff).bankr("bank2"); // banked port 1? - map(0xc400, 0xcfff).ram().w(FUNC(funybubl_state::funybubl_paldatawrite)).share("paletteram"); // palette - map(0xd000, 0xdfff).bankrw("bank1"); // banked port 0? + map(0x8000, 0xbfff).bankr("mainbank"); // banked port 1? + map(0xc400, 0xcfff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); // palette + map(0xd000, 0xdfff).m(m_vrambank, FUNC(address_map_bank_device::amap8)); // banked port 0? map(0xe000, 0xffff).ram(); } void funybubl_state::io_map(address_map &map) { map.global_mask(0xff); - map(0x00, 0x00).portr("SYSTEM").w(FUNC(funybubl_state::funybubl_vidram_bank_w)); // vidram bank - map(0x01, 0x01).portr("P1").w(FUNC(funybubl_state::funybubl_cpurombank_w)); // rom bank? + map(0x00, 0x00).portr("SYSTEM").w(FUNC(funybubl_state::vidram_bank_w)); // vidram bank + map(0x01, 0x01).portr("P1").w(FUNC(funybubl_state::cpurombank_w)); // rom bank? map(0x02, 0x02).portr("P2"); - map(0x03, 0x03).portr("DSW").w(FUNC(funybubl_state::funybubl_soundcommand_w)); + map(0x03, 0x03).portr("DSW").w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0x06, 0x06).nopr(); /* Nothing is done with the data read */ map(0x06, 0x06).nopw(); /* Written directly after IO port 0 */ map(0x07, 0x07).nopw(); /* Reset something on startup - Sound CPU ?? */ } +void funybubl_state::vrambank_map(address_map &map) +{ + map(0x0000, 0x0fff).ram().w(FUNC(funybubl_state::tilemap_w)).share("tilemapram"); + map(0x1000, 0x1fff).ram().share("spriteram"); +} + /* Sound CPU */ void funybubl_state::sound_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0x8000, 0x87ff).ram(); - map(0x9000, 0x9000).w(FUNC(funybubl_state::funybubl_oki_bank_sw)); + map(0x9000, 0x9000).w(FUNC(funybubl_state::oki_bank_w)); map(0x9800, 0x9800).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); } +void funybubl_state::oki_map(address_map &map) +{ + map(0x00000, 0x1ffff).rom(); + map(0x20000, 0x3ffff).bankr("okibank"); +} static INPUT_PORTS_START( funybubl ) @@ -174,48 +178,42 @@ INPUT_PORTS_END -static const gfx_layout tiles16x16x8_1_layout = +static const gfx_layout layout_8x8x8 = { 8,8, RGN_FRAC(1,8), 8, - { RGN_FRAC(3,8),RGN_FRAC(2,8),RGN_FRAC(1,8),RGN_FRAC(0,8),RGN_FRAC(7,8),RGN_FRAC(6,8),RGN_FRAC(5,8), RGN_FRAC(4,8) }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + { RGN_FRAC(3,8), RGN_FRAC(2,8), RGN_FRAC(1,8), RGN_FRAC(0,8), RGN_FRAC(7,8), RGN_FRAC(6,8), RGN_FRAC(5,8), RGN_FRAC(4,8) }, + { STEP8(0,1) }, + { STEP8(0,8) }, 8*8 }; -static const gfx_layout tiles16x16x8_2_layout = +static const gfx_layout layout_16x16x8 = { 16,16, RGN_FRAC(1,4), 8, { RGN_FRAC(3,4)+4,RGN_FRAC(3,4)+0, RGN_FRAC(2,4)+4, RGN_FRAC(2,4)+0, RGN_FRAC(1,4)+4, RGN_FRAC(1,4)+0, RGN_FRAC(0,4)+4, RGN_FRAC(0,4)+0 }, - { 0, 1,2,3, 8,9,10,11, 256,257,258,259, 264,265,266,267}, - { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, - 8*16, 9*16,10*16,11*16,12*16,13*16,14*16,15*16 }, + { STEP4(0,1), STEP4(4*2,1), STEP4(16*4*2*2,1), STEP4(16*4*2*2+4*2,1) }, + { STEP16(0,4*2*2) }, 32*16 }; static GFXDECODE_START( gfx_funybubl ) - GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x8_1_layout, 0, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x8_2_layout, 0, 16 ) + GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x8, 0x100, 2 ) + GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x8, 0x000, 1 ) GFXDECODE_END void funybubl_state::machine_start() { - uint8_t *ROM = memregion("maincpu")->base(); - + m_mainbank->configure_entries(0, 0x10, memregion("maincpu")->base(), 0x4000); + m_okibank->configure_entries(0, 2, memregion("oki")->base() + 0x20000, 0x20000); - save_item(NAME(m_banked_vram)); - - membank("bank1")->configure_entries(0, 2, &m_banked_vram[0x0000], 0x1000); - membank("bank2")->configure_entries(0, 0x10, ROM, 0x4000); - - membank("bank1")->set_entry(0); + m_vrambank->set_bank(0); } @@ -230,6 +228,7 @@ MACHINE_CONFIG_START(funybubl_state::funybubl) MCFG_DEVICE_ADD("audiocpu", Z80,8000000/2) /* 4 MHz?? */ MCFG_DEVICE_PROGRAM_MAP(sound_map) + ADDRESS_MAP_BANK(config, m_vrambank).set_map(&funybubl_state::vrambank_map).set_options(ENDIANNESS_LITTLE, 8, 13, 0x1000); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -238,19 +237,21 @@ MACHINE_CONFIG_START(funybubl_state::funybubl) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(12*8, 512-12*8-1, 16, 256-16-1) // MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE_DRIVER(funybubl_state, screen_update_funybubl) + MCFG_SCREEN_UPDATE_DRIVER(funybubl_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_funybubl) - MCFG_PALETTE_ADD("palette", 0x400) - + MCFG_PALETTE_ADD("palette", 0xc00/4) + MCFG_PALETTE_FORMAT_CLASS(4, funybubl_state, funybubl_R6B6G6) /* sound hardware */ SPEAKER(config, "mono").front_center(); MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0)) - MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified + MCFG_DEVICE_ADD("oki", OKIM6295, 8000000/8, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified + MCFG_DEVICE_ADDRESS_MAP(0, oki_map) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END @@ -281,9 +282,7 @@ ROM_START( funybubl ) ROM_REGION( 0x80000, "oki", 0 ) ROM_LOAD( "b.su12", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) /* Same as below, different label */ - ROM_RELOAD( 0x40000, 0x20000 ) - ROM_LOAD( "c.su13", 0x20000, 0x20000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) /* Same as below, different label */ - ROM_CONTINUE( 0x60000, 0x20000 ) + ROM_LOAD( "c.su13", 0x20000, 0x40000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) /* Same as below, different label */ ROM_END ROM_START( funybublc ) @@ -311,9 +310,7 @@ ROM_START( funybublc ) ROM_REGION( 0x80000, "oki", 0 ) ROM_LOAD( "3.su12", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) - ROM_RELOAD( 0x40000, 0x20000 ) - ROM_LOAD( "4.su13", 0x20000, 0x20000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) - ROM_CONTINUE( 0x60000, 0x20000 ) + ROM_LOAD( "4.su13", 0x20000, 0x40000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) ROM_END diff --git a/src/mame/includes/funybubl.h b/src/mame/includes/funybubl.h index 2dcce7ab081..4c90ba4eeea 100644 --- a/src/mame/includes/funybubl.h +++ b/src/mame/includes/funybubl.h @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +#include "machine/bankdev.h" #include "machine/gen_latch.h" #include "sound/okim6295.h" #include "emupal.h" @@ -8,21 +9,32 @@ class funybubl_state : public driver_device { public: - funybubl_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_paletteram(*this, "paletteram"), + funybubl_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_tilemapram(*this, "tilemapram"), + m_spriteram(*this, "spriteram"), + m_mainbank(*this, "mainbank"), + m_okibank(*this, "okibank"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_oki(*this, "oki"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), - m_soundlatch(*this, "soundlatch") { } + m_soundlatch(*this, "soundlatch"), + m_vrambank(*this, "vrambank") { } void funybubl(machine_config &config); private: /* memory pointers */ - required_shared_ptr<uint8_t> m_paletteram; + required_shared_ptr<uint8_t> m_tilemapram; + required_shared_ptr<uint8_t> m_spriteram; + + required_memory_bank m_mainbank; + required_memory_bank m_okibank; + + /* video-related */ + tilemap_t *m_tilemap; /* devices */ required_device<cpu_device> m_maincpu; @@ -31,19 +43,24 @@ private: required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; required_device<generic_latch_8_device> m_soundlatch; + required_device<address_map_bank_device> m_vrambank; /* memory */ - uint8_t m_banked_vram[0x2000]; - DECLARE_WRITE8_MEMBER(funybubl_vidram_bank_w); - DECLARE_WRITE8_MEMBER(funybubl_cpurombank_w); - DECLARE_WRITE8_MEMBER(funybubl_soundcommand_w); - DECLARE_WRITE8_MEMBER(funybubl_paldatawrite); - DECLARE_WRITE8_MEMBER(funybubl_oki_bank_sw); + DECLARE_WRITE8_MEMBER(vidram_bank_w); + DECLARE_WRITE8_MEMBER(cpurombank_w); + DECLARE_WRITE8_MEMBER(oki_bank_w); + + DECLARE_PALETTE_DECODER(funybubl_R6B6G6); + DECLARE_WRITE8_MEMBER(tilemap_w); + TILE_GET_INFO_MEMBER(get_tile_info); + virtual void machine_start() override; virtual void video_start() override; - uint32_t screen_update_funybubl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); void funybubl_map(address_map &map); void io_map(address_map &map); + void oki_map(address_map &map); void sound_map(address_map &map); + void vrambank_map(address_map &map); }; diff --git a/src/mame/video/funybubl.cpp b/src/mame/video/funybubl.cpp index 10a4d8cc11b..586a3639b3b 100644 --- a/src/mame/video/funybubl.cpp +++ b/src/mame/video/funybubl.cpp @@ -10,31 +10,35 @@ todo - convert to tilemap #include "emu.h" #include "includes/funybubl.h" - -WRITE8_MEMBER(funybubl_state::funybubl_paldatawrite) +PALETTE_DECODER_MEMBER(funybubl_state, funybubl_R6B6G6) { - int colchanged ; - uint32_t coldat; - - m_paletteram[offset] = data; - colchanged = offset >> 2; - coldat = m_paletteram[colchanged * 4] | (m_paletteram[colchanged * 4 + 1] << 8) | - (m_paletteram[colchanged * 4 + 2] << 16) | (m_paletteram[colchanged * 4 + 3] << 24); + return rgb_t(pal6bit(raw >> 12), pal6bit(raw >> 0), pal6bit(raw >> 6)); +} - m_palette->set_pen_color(colchanged, pal6bit(coldat >> 12), pal6bit(coldat >> 0), pal6bit(coldat >> 6)); +WRITE8_MEMBER(funybubl_state::tilemap_w) +{ + COMBINE_DATA(&m_tilemapram[offset]); + m_tilemap->mark_tile_dirty(offset>>1); } +TILE_GET_INFO_MEMBER(funybubl_state::get_tile_info) +{ + uint16_t const code = m_tilemapram[tile_index << 1] | (m_tilemapram[(tile_index << 1) | 1] << 8); + SET_TILE_INFO_MEMBER(0, code & 0x7fff, BIT(code, 15), 0); +} void funybubl_state::video_start() { + m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(funybubl_state::get_tile_info),this),TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_tilemap->set_transparent_pen(0); } void funybubl_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) { - uint8_t *source = &m_banked_vram[0x2000 - 0x20]; - uint8_t *finish = source - 0x1000; + uint8_t *source = &m_spriteram[0x1000 - 0x20]; + uint8_t *finish = m_spriteram; - while (source > finish) + while (source >= finish) { int xpos, ypos, tile; @@ -73,25 +77,11 @@ void funybubl_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &clipre } -uint32_t funybubl_state::screen_update_funybubl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t funybubl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int x, y, offs; - offs = 0; - bitmap.fill(m_palette->black_pen(), cliprect); - /* tilemap .. convert it .. banking makes it slightly more annoying but still easy */ - for (y = 0; y < 32; y++) - { - for (x = 0; x< 64; x++) - { - int data; - - data = m_banked_vram[offs] | (m_banked_vram[offs + 1] << 8); - m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, data & 0x7fff, (data & 0x8000) ? 2 : 1, 0, 0, x*8, y*8, 0); - offs += 2; - } - } + m_tilemap->draw(screen, bitmap, cliprect, 0, 0); draw_sprites(bitmap, cliprect); @@ -103,7 +93,7 @@ uint32_t funybubl_state::screen_update_funybubl(screen_device &screen, bitmap_in fp = fopen("funnybubsprites", "w+b"); if (fp) { - fwrite(&m_banked_vram[0x1000], 0x1000, 1, fp); + fwrite(&m_spriteram[0], 0x1000, 1, fp); fclose(fp); } } |