From e5a3d63abee624c3c9e67fcfb59391a6e68d058e Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sun, 13 Dec 2015 20:03:38 +0000 Subject: [PATCH] pollux bombs now cause brightness change --- src/mame/drivers/dooyong.cpp | 16 +++++++------- src/mame/includes/dooyong.h | 6 ++++-- src/mame/video/dooyong.cpp | 42 +++++++++++++++++++++++++++++------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/mame/drivers/dooyong.cpp b/src/mame/drivers/dooyong.cpp index 54be12530e3..0620392d110 100644 --- a/src/mame/drivers/dooyong.cpp +++ b/src/mame/drivers/dooyong.cpp @@ -731,17 +731,17 @@ static const gfx_layout popbingo_tilelayout = }; static GFXDECODE_START( lastday ) - GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16 ) - GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 16 ) + GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16+64 ) + GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16+64 ) + GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16+64 ) + GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 16+64 ) GFXDECODE_END static GFXDECODE_START( flytiger ) - GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16 ) - GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 32 ) + GFXDECODE_ENTRY( "gfx1", 0, lastday_charlayout, 0, 16+64 ) + GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 256, 16+64 ) + GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 768, 16+64 ) + GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 512, 32+64 ) GFXDECODE_END static GFXDECODE_START( bluehawk ) diff --git a/src/mame/includes/dooyong.h b/src/mame/includes/dooyong.h index bd4b69d3bfa..ed72bbb6a57 100644 --- a/src/mame/includes/dooyong.h +++ b/src/mame/includes/dooyong.h @@ -10,7 +10,8 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_palette_bank(0) { } DECLARE_WRITE8_MEMBER(bgscroll_w); @@ -24,6 +25,7 @@ public: inline void get_tile_info(tile_data &tileinfo, int tile_index, UINT8 const *tilerom, UINT8 const *scroll, int graphics); inline void scroll8_w(offs_t offset, UINT8 data, UINT8 *scroll, tilemap_t *map); + tilemap_t *m_bg_tilemap; tilemap_t *m_bg2_tilemap; tilemap_t *m_fg_tilemap; @@ -46,6 +48,7 @@ public: required_device m_audiocpu; required_device m_gfxdecode; required_device m_palette; + UINT8 m_palette_bank; }; class dooyong_z80_state : public dooyong_state @@ -84,7 +87,6 @@ public: required_shared_ptr m_txvideoram; UINT8* m_paletteram_flytiger; UINT8 m_sprites_disabled; - UINT8 m_flytiger_palette_bank; UINT8 m_flytiger_pri; UINT8 m_tx_pri; int m_tx_tilemap_mode; diff --git a/src/mame/video/dooyong.cpp b/src/mame/video/dooyong.cpp index ee3e145f94f..b8f819cb503 100644 --- a/src/mame/video/dooyong.cpp +++ b/src/mame/video/dooyong.cpp @@ -101,6 +101,8 @@ WRITE8_MEMBER(dooyong_z80_ym2203_state::lastday_ctrl_w) WRITE8_MEMBER(dooyong_z80_ym2203_state::pollux_ctrl_w) { +// printf("pollux_ctrl_w %02x\n", data); + /* bit 0 is flip screen */ flip_screen_set(data & 0x01); @@ -108,11 +110,20 @@ WRITE8_MEMBER(dooyong_z80_ym2203_state::pollux_ctrl_w) coin_counter_w(machine(), 0, data & 0x80); coin_counter_w(machine(), 1, data & 0x40); - /* bit 1 is used but unknown - possibly palette banking */ - m_flytiger_palette_bank = (data & 0x02); + /* bit 1 is used but unknown - palette banking (both write and display based on pollux bombs) */ + int last_palbank = m_palette_bank; + m_palette_bank = (data & 0x02)>>1; + + if (last_palbank != m_palette_bank) + { + m_bg_tilemap->mark_all_dirty(); + m_fg_tilemap->mark_all_dirty(); + m_tx_tilemap->mark_all_dirty(); + } /* bit 2 is continuously toggled (unknown) */ - /* bit 4 is used but unknown */ + + /* bit 4 is used but unknown - display disable? */ } @@ -135,7 +146,7 @@ WRITE8_MEMBER(dooyong_z80_state::primella_ctrl_w) WRITE8_MEMBER(dooyong_z80_state::paletteram_flytiger_w) { - if (!m_flytiger_palette_bank) offset+= 0x800; + if (m_palette_bank) offset+= 0x800; m_paletteram_flytiger[offset] = data; UINT16 const value = m_paletteram_flytiger[offset & ~1] | (m_paletteram_flytiger[offset | 1] << 8); @@ -150,8 +161,16 @@ WRITE8_MEMBER(dooyong_z80_state::flytiger_ctrl_w) /* bits 1, 2 used but unknown */ - /* bit 3 fg palette banking: trash protection? */ - m_flytiger_palette_bank = data & 0x08; + /* bit 3 palette banking */ + int last_palbank = m_palette_bank; + m_palette_bank = (data & 0x08)>>3; + + if (last_palbank != m_palette_bank) + { + m_bg_tilemap->mark_all_dirty(); + m_fg_tilemap->mark_all_dirty(); + m_tx_tilemap->mark_all_dirty(); + } /* bit 4 changes tilemaps priority */ m_flytiger_pri = data & 0x10; @@ -186,6 +205,7 @@ inline void dooyong_state::get_tile_info(tile_data &tileinfo, int tile_index, Y = y flip */ code = tilerom[offs + 1] | ((attr & 0x01) << 8) | ((attr & 0x80) << 2); color = (attr & 0x78) >> 3; + color += m_palette_bank * 0x40; flags = TILE_FLIPYX((attr & 0x06) >> 1); } else @@ -257,7 +277,7 @@ TILE_GET_INFO_MEMBER(dooyong_z80_state::get_tx_tile_info) int const code = m_txvideoram[offs] | ((attr & 0x0f) << 8); int const color = (attr & 0xf0) >> 4; - tileinfo.set(0, code, color, 0); + tileinfo.set(0, code, color + m_palette_bank *0x40, 0); } @@ -292,7 +312,8 @@ void dooyong_z80_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap int sx = buffered_spriteram[offs+3] | ((buffered_spriteram[offs+1] & 0x10) << 4); int sy = buffered_spriteram[offs+2]; int code = buffered_spriteram[offs] | ((buffered_spriteram[offs+1] & 0xe0) << 3); - int const color = buffered_spriteram[offs+1] & 0x0f; + int color = buffered_spriteram[offs+1] & 0x0f; + //TODO: This priority mechanism works for known games, but seems a bit strange. //Are we missing something? (The obvious spare palette bit isn't it.) int const pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0); @@ -330,6 +351,8 @@ void dooyong_z80_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap flipy = !flipy; } + color += m_palette_bank * 0x40; + for (int y = 0; y <= height; y++) { m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect, @@ -449,6 +472,8 @@ UINT32 dooyong_z80_state::screen_update_primella(screen_device &screen, bitmap_i return 0; } + + VIDEO_START_MEMBER(dooyong_z80_ym2203_state, lastday) { /* Configure tilemap callbacks */ @@ -806,6 +831,7 @@ UINT32 dooyong_68k_state::screen_update_popbingo(screen_device &screen, bitmap_i } + VIDEO_START_MEMBER(dooyong_68k_state, rshark) { /* Configure tilemap callbacks */