// license:BSD-3-Clause // copyright-holders:David Haywood,Stephane Humbert /******************************************************************************* WWF Superstars (C) 1989 Technos Japan (video/wwfsstar.c) ******************************************************************************** driver by David Haywood see (drivers/wwfsstar.c) for more notes *******************************************************************************/ #include "emu.h" #include "includes/wwfsstar.h" /******************************************************************************* Write Handlers ******************************************************************************** for writes to Video Ram *******************************************************************************/ WRITE16_MEMBER(wwfsstar_state::fg0_videoram_w) { COMBINE_DATA(&m_fg0_videoram[offset]); m_fg0_tilemap->mark_tile_dirty(offset/2); } WRITE16_MEMBER(wwfsstar_state::bg0_videoram_w) { COMBINE_DATA(&m_bg0_videoram[offset]); m_bg0_tilemap->mark_tile_dirty(offset/2); } /******************************************************************************* Tilemap Related Functions *******************************************************************************/ TILE_GET_INFO_MEMBER(wwfsstar_state::get_fg0_tile_info) { /*- FG0 RAM Format -** 0x1000 sized region (4096 bytes) 32x32 tilemap, 4 bytes per tile ---- ---- CCCC TTTT ---- ---- TTTT TTTT C = Colour Bank (0-15) T = Tile Number (0 - 4095) other bits unknown / unused **- End of Comments -*/ uint16_t *tilebase; int tileno; int colbank; tilebase = &m_fg0_videoram[tile_index*2]; tileno = (tilebase[1] & 0x00ff) | ((tilebase[0] & 0x000f) << 8); colbank = (tilebase[0] & 0x00f0) >> 4; SET_TILE_INFO_MEMBER(0, tileno, colbank, 0); } TILEMAP_MAPPER_MEMBER(wwfsstar_state::bg0_scan) { return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x10) << 4) + ((row & 0x10) << 5); } TILE_GET_INFO_MEMBER(wwfsstar_state::get_bg0_tile_info) { /*- BG0 RAM Format -** 0x1000 sized region (4096 bytes) 32x32 tilemap, 4 bytes per tile ---- ---- FCCC TTTT ---- ---- TTTT TTTT C = Colour Bank (0-7) T = Tile Number (0 - 4095) F = FlipX other bits unknown / unused **- End of Comments -*/ uint16_t *tilebase; int tileno, colbank, flipx; tilebase = &m_bg0_videoram[tile_index*2]; tileno = (tilebase[1] & 0x00ff) | ((tilebase[0] & 0x000f) << 8); colbank = (tilebase[0] & 0x0070) >> 4; flipx = (tilebase[0] & 0x0080) >> 7; SET_TILE_INFO_MEMBER(2, tileno, colbank, flipx ? TILE_FLIPX : 0); } /******************************************************************************* Sprite Related Functions ******************************************************************************** sprite colour marking could probably be improved.. *******************************************************************************/ void wwfsstar_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ) { /*- SPR RAM Format -** 0x3FF sized region (1024 bytes) 10 bytes per sprite ---- ---- yyyy yyyy ---- ---- CCCC XYLE ---- ---- fFNN NNNN ---- ---- nnnn nnnn ---- ---- xxxx xxxx Yy = sprite Y Position Xx = sprite X Position C = colour bank f = flip Y F = flip X L = chain sprite (32x16) E = sprite enable Nn = Sprite Number other bits unused **- End of Comments -*/ gfx_element *gfx = m_gfxdecode->gfx(1); uint16_t *source = m_spriteram; uint16_t *finish = source + 0x3ff/2; while (source < finish) { int xpos, ypos, colourbank, flipx, flipy, chain, enable, number, count; enable = (source [1] & 0x0001); if (enable) { ypos = ((source [0] & 0x00ff) | ((source [1] & 0x0004) << 6) ); ypos = (((256 - ypos) & 0x1ff) - 16) ; xpos = ((source [4] & 0x00ff) | ((source [1] & 0x0008) << 5) ); xpos = (((256 - xpos) & 0x1ff) - 16); flipx = (source [2] & 0x0080 ) >> 7; flipy = (source [2] & 0x0040 ) >> 6; chain = (source [1] & 0x0002 ) >> 1; chain += 1; number = (source [3] & 0x00ff) | ((source [2] & 0x003f) << 8); colourbank = (source [1] & 0x00f0) >> 4; number &= ~(chain - 1); if (flip_screen()) { flipy = !flipy; flipx = !flipx; ypos=240-ypos; xpos=240-xpos; } for (count=0;counttranspen(bitmap,cliprect,number+count,colourbank,flipx,flipy,xpos,ypos+16*count,0); } else { gfx->transpen(bitmap,cliprect,number+count,colourbank,flipx,flipy,xpos,ypos+(16*(chain-1))-(16*count),0); } } else { if (!flipy) { gfx->transpen(bitmap,cliprect,number+count,colourbank,flipx,flipy,xpos,ypos-(16*(chain-1))+(16*count),0); } else { gfx->transpen(bitmap,cliprect,number+count,colourbank,flipx,flipy,xpos,ypos-16*count,0); } } } } source+=5; } } /******************************************************************************* Video Start and Refresh Functions ******************************************************************************** Drawing Order is simple BG0 - Back SPR - Middle FG0 - Front *******************************************************************************/ void wwfsstar_state::video_start() { m_fg0_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wwfsstar_state::get_fg0_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_fg0_tilemap->set_transparent_pen(0); m_bg0_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wwfsstar_state::get_bg0_tile_info)), tilemap_mapper_delegate(*this, FUNC(wwfsstar_state::bg0_scan)), 16, 16, 32, 32); m_fg0_tilemap->set_transparent_pen(0); save_item(NAME(m_vblank)); save_item(NAME(m_scrollx)); save_item(NAME(m_scrolly)); } uint32_t wwfsstar_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_bg0_tilemap->set_scrolly(0, m_scrolly ); m_bg0_tilemap->set_scrollx(0, m_scrollx ); m_bg0_tilemap->draw(screen, bitmap, cliprect, 0,0); draw_sprites(bitmap,cliprect ); m_fg0_tilemap->draw(screen, bitmap, cliprect, 0,0); return 0; }