/*************************************************************************** video.c Functions to emulate the video hardware of the machine. ***************************************************************************/ #include "emu.h" #include "includes/cabal.h" static TILE_GET_INFO( get_back_tile_info ) { cabal_state *state = machine.driver_data(); int tile = state->m_videoram[tile_index]; int color = (tile>>12)&0xf; tile &= 0xfff; SET_TILE_INFO( 1, tile, color, 0); } static TILE_GET_INFO( get_text_tile_info ) { cabal_state *state = machine.driver_data(); int tile = state->m_colorram[tile_index]; int color = (tile>>10); tile &= 0x3ff; SET_TILE_INFO( 0, tile, color, 0); } VIDEO_START( cabal ) { cabal_state *state = machine.driver_data(); state->m_background_layer = tilemap_create(machine, get_back_tile_info,tilemap_scan_rows,16,16,16,16); state->m_text_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows, 8,8,32,32); tilemap_set_transparent_pen(state->m_text_layer,3); tilemap_set_transparent_pen(state->m_background_layer,15); } /**************************************************************************/ WRITE16_HANDLER( cabal_flipscreen_w ) { if (ACCESSING_BITS_0_7) { cabal_state *state = space->machine().driver_data(); int flip = (data & 0x20) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; tilemap_set_flip(state->m_background_layer,flip); tilemap_set_flip(state->m_text_layer,flip); flip_screen_set(space->machine(), data & 0x20); } } WRITE16_HANDLER( cabal_background_videoram16_w ) { cabal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); tilemap_mark_tile_dirty(state->m_background_layer,offset); } WRITE16_HANDLER( cabal_text_videoram16_w ) { cabal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_colorram[offset]); tilemap_mark_tile_dirty(state->m_text_layer,offset); } /******************************************************************** Cabal Spriteram --------------- +0 .......x ........ Sprite enable bit +0 ........ xxxxxxxx Sprite Y coordinate +1 ..??.... ........ ??? unknown ??? +1 ....xxxx xxxxxxxx Sprite tile number +2 .xxxx... ........ Sprite color bank +2 .....x.. ........ Sprite flip x +2 .......x xxxxxxxx Sprite X coordinate +3 (unused) -------E YYYYYYYY ----BBTT TTTTTTTT -CCCCF-X XXXXXXXX -------- -------- ********************************************************************/ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) { cabal_state *state = machine.driver_data(); int offs,data0,data1,data2; UINT16 *spriteram16 = state->m_spriteram; for( offs = state->m_spriteram_size/2 - 4; offs >= 0; offs -= 4 ) { data0 = spriteram16[offs]; data1 = spriteram16[offs+1]; data2 = spriteram16[offs+2]; if( data0 & 0x100 ) { int tile_number = data1 & 0xfff; int color = ( data2 & 0x7800 ) >> 11; int sy = ( data0 & 0xff ); int sx = ( data2 & 0x1ff ); int flipx = ( data2 & 0x0400 ); int flipy = 0; if ( sx>256 ) sx -= 512; if (flip_screen_get(machine)) { sx = 240 - sx; sy = 240 - sy; flipx = !flipx; flipy = !flipy; } drawgfx_transpen( bitmap,cliprect,machine.gfx[2], tile_number, color, flipx,flipy, sx,sy,0xf ); } } } SCREEN_UPDATE( cabal ) { cabal_state *state = screen->machine().driver_data(); tilemap_draw(bitmap,cliprect,state->m_background_layer,TILEMAP_DRAW_OPAQUE,0); draw_sprites(screen->machine(),bitmap,cliprect); tilemap_draw(bitmap,cliprect,state->m_text_layer,0,0); return 0; }