// license:BSD-3-Clause // copyright-holders:David Haywood /* video/tbowl.c */ /* see drivers/tbowl.cpp for more info */ #include "emu.h" #include "includes/tbowl.h" /* Foreground Layer (tx) Tilemap */ TILE_GET_INFO_MEMBER(tbowl_state::get_tx_tile_info) { int tileno; int col; tileno = m_txvideoram[tile_index] | ((m_txvideoram[tile_index+0x800] & 0x07) << 8); col = (m_txvideoram[tile_index+0x800] & 0xf0) >> 4; SET_TILE_INFO_MEMBER(0,tileno,col,0); } WRITE8_MEMBER(tbowl_state::txvideoram_w) { m_txvideoram[offset] = data; m_tx_tilemap->mark_tile_dirty(offset & 0x7ff); } /* Bottom BG Layer (bg) Tilemap */ TILE_GET_INFO_MEMBER(tbowl_state::get_bg_tile_info) { int tileno; int col; tileno = m_bgvideoram[tile_index] | ((m_bgvideoram[tile_index+0x1000] & 0x0f) << 8); col = (m_bgvideoram[tile_index+0x1000] & 0xf0) >> 4; SET_TILE_INFO_MEMBER(1,tileno,col,0); } WRITE8_MEMBER(tbowl_state::bg2videoram_w) { m_bg2videoram[offset] = data; m_bg2_tilemap->mark_tile_dirty(offset & 0xfff); } WRITE8_MEMBER(tbowl_state::bgxscroll_lo) { m_xscroll = (m_xscroll & 0xff00) | data; } WRITE8_MEMBER(tbowl_state::bgxscroll_hi) { m_xscroll = (m_xscroll & 0x00ff) | (data << 8); } WRITE8_MEMBER(tbowl_state::bgyscroll_lo) { m_yscroll = (m_yscroll & 0xff00) | data; } WRITE8_MEMBER(tbowl_state::bgyscroll_hi) { m_yscroll = (m_yscroll & 0x00ff) | (data << 8); } /* Middle BG Layer (bg2) Tilemaps */ TILE_GET_INFO_MEMBER(tbowl_state::get_bg2_tile_info) { int tileno; int col; tileno = m_bg2videoram[tile_index] | ((m_bg2videoram[tile_index+0x1000] & 0x0f) << 8); tileno ^= 0x400; col = (m_bg2videoram[tile_index+0x1000] & 0xf0) >> 4; SET_TILE_INFO_MEMBER(2,tileno,col,0); } WRITE8_MEMBER(tbowl_state::bgvideoram_w) { m_bgvideoram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset & 0xfff); } WRITE8_MEMBER(tbowl_state::bg2xscroll_lo) { m_bg2xscroll = (m_bg2xscroll & 0xff00) | data; } WRITE8_MEMBER(tbowl_state::bg2xscroll_hi) { m_bg2xscroll = (m_bg2xscroll & 0x00ff) | (data << 8); } WRITE8_MEMBER(tbowl_state::bg2yscroll_lo) { m_bg2yscroll = (m_bg2yscroll & 0xff00) | data; } WRITE8_MEMBER(tbowl_state::bg2yscroll_hi) { m_bg2yscroll = (m_bg2yscroll & 0x00ff) | (data << 8); } /*** Video Start / Update ***/ void tbowl_state::video_start() { m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tbowl_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32); m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tbowl_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 128,32); m_bg2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tbowl_state::get_bg2_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 128,32); m_tx_tilemap->set_transparent_pen(0); m_bg_tilemap->set_transparent_pen(0); m_bg2_tilemap->set_transparent_pen(0); save_item(NAME(m_xscroll)); save_item(NAME(m_yscroll)); save_item(NAME(m_bg2xscroll)); save_item(NAME(m_bg2yscroll)); } uint32_t tbowl_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_bg_tilemap->set_scrollx(0, m_xscroll ); m_bg_tilemap->set_scrolly(0, m_yscroll ); m_bg2_tilemap->set_scrollx(0, m_bg2xscroll ); m_bg2_tilemap->set_scrolly(0, m_bg2yscroll ); m_tx_tilemap->set_scrollx(0, 0 ); m_tx_tilemap->set_scrolly(0, 0 ); bitmap.fill(0x100, cliprect); /* is there a register controlling the colour? looks odd when screen is blank */ m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0); m_sprgen->tbowl_draw_sprites(bitmap,cliprect, m_gfxdecode->gfx(3), 0, m_spriteram); m_bg2_tilemap->draw(screen, bitmap, cliprect, 0,0); m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); return 0; } uint32_t tbowl_state::screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_bg_tilemap->set_scrollx(0, m_xscroll+32*8 ); m_bg_tilemap->set_scrolly(0, m_yscroll ); m_bg2_tilemap->set_scrollx(0, m_bg2xscroll+32*8 ); m_bg2_tilemap->set_scrolly(0, m_bg2yscroll ); m_tx_tilemap->set_scrollx(0, 32*8 ); m_tx_tilemap->set_scrolly(0, 0 ); bitmap.fill(0x100, cliprect); /* is there a register controlling the colour? looks odd when screen is blank */ m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0); m_sprgen->tbowl_draw_sprites(bitmap,cliprect, m_gfxdecode->gfx(3), 32*8, m_spriteram); m_bg2_tilemap->draw(screen, bitmap, cliprect, 0,0); m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); return 0; }