/* video/tbowl.c */ /* see drivers/tbowl.c for more info */ #include "driver.h" static tilemap *tx_tilemap, *bg_tilemap, *bg2_tilemap; UINT8 *tbowl_txvideoram, *tbowl_bgvideoram, *tbowl_bg2videoram; UINT8 *tbowl_spriteram; /*** Tilemap Stuff ***/ static UINT16 tbowl_xscroll; static UINT16 tbowl_yscroll; static UINT16 tbowl_bg2xscroll; static UINT16 tbowl_bg2yscroll; /* Foreground Layer (tx) Tilemap */ static TILE_GET_INFO( get_tx_tile_info ) { int tileno; int col; tileno = tbowl_txvideoram[tile_index] | ((tbowl_txvideoram[tile_index+0x800] & 0x07) << 8); col = (tbowl_txvideoram[tile_index+0x800] & 0xf0) >> 4; SET_TILE_INFO(0,tileno,col,0); } WRITE8_HANDLER( tbowl_txvideoram_w ) { tbowl_txvideoram[offset] = data; tilemap_mark_tile_dirty(tx_tilemap,offset & 0x7ff); } /* Bottom BG Layer (bg) Tilemap */ static TILE_GET_INFO( get_bg_tile_info ) { int tileno; int col; tileno = tbowl_bgvideoram[tile_index] | ((tbowl_bgvideoram[tile_index+0x1000] & 0x0f) << 8); col = (tbowl_bgvideoram[tile_index+0x1000] & 0xf0) >> 4; SET_TILE_INFO(1,tileno,col,0); } WRITE8_HANDLER( tbowl_bg2videoram_w ) { tbowl_bg2videoram[offset] = data; tilemap_mark_tile_dirty(bg2_tilemap,offset & 0xfff); } WRITE8_HANDLER (tbowl_bgxscroll_lo) { tbowl_xscroll = (tbowl_xscroll & 0xff00) | data; } WRITE8_HANDLER (tbowl_bgxscroll_hi) { tbowl_xscroll = (tbowl_xscroll & 0x00ff) | (data << 8); } WRITE8_HANDLER (tbowl_bgyscroll_lo) { tbowl_yscroll = (tbowl_yscroll & 0xff00) | data; } WRITE8_HANDLER (tbowl_bgyscroll_hi) { tbowl_yscroll = (tbowl_yscroll & 0x00ff) | (data << 8); } /* Middle BG Layer (bg2) Tilemaps */ static TILE_GET_INFO( get_bg2_tile_info ) { int tileno; int col; tileno = tbowl_bg2videoram[tile_index] | ((tbowl_bg2videoram[tile_index+0x1000] & 0x0f) << 8); tileno ^= 0x400; col = (tbowl_bg2videoram[tile_index+0x1000] & 0xf0) >> 4; SET_TILE_INFO(2,tileno,col,0); } WRITE8_HANDLER( tbowl_bgvideoram_w ) { tbowl_bgvideoram[offset] = data; tilemap_mark_tile_dirty(bg_tilemap,offset & 0xfff); } WRITE8_HANDLER (tbowl_bg2xscroll_lo) { tbowl_bg2xscroll = (tbowl_bg2xscroll & 0xff00) | data; } WRITE8_HANDLER (tbowl_bg2xscroll_hi) { tbowl_bg2xscroll = (tbowl_bg2xscroll & 0x00ff) | (data << 8); } WRITE8_HANDLER (tbowl_bg2yscroll_lo) { tbowl_bg2yscroll = (tbowl_bg2yscroll & 0xff00) | data; } WRITE8_HANDLER (tbowl_bg2yscroll_hi) { tbowl_bg2yscroll = (tbowl_bg2yscroll & 0x00ff) | (data << 8); } static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect, int xscroll) { int offs; static const UINT8 layout[8][8] = { {0,1,4,5,16,17,20,21}, {2,3,6,7,18,19,22,23}, {8,9,12,13,24,25,28,29}, {10,11,14,15,26,27,30,31}, {32,33,36,37,48,49,52,53}, {34,35,38,39,50,51,54,55}, {40,41,44,45,56,57,60,61}, {42,43,46,47,58,59,62,63} }; for (offs = 0;offs < 0x800;offs += 8) { if (tbowl_spriteram[offs+0] & 0x80) /* enable */ { int code,color,sizex,sizey,flipx,flipy,xpos,ypos; int x,y;//,priority,priority_mask; code = (tbowl_spriteram[offs+2])+(tbowl_spriteram[offs+1]<<8); color = (tbowl_spriteram[offs+3])&0x1f; sizex = 1 << ((tbowl_spriteram[offs+0] & 0x03) >> 0); sizey = 1 << ((tbowl_spriteram[offs+0] & 0x0c) >> 2); flipx = (tbowl_spriteram[offs+0])&0x20; flipy = 0; xpos = (tbowl_spriteram[offs+6])+((tbowl_spriteram[offs+4]&0x03)<<8); ypos = (tbowl_spriteram[offs+5])+((tbowl_spriteram[offs+4]&0x10)<<4); /* bg: 1; fg:2; text: 4 */ for (y = 0;y < sizey;y++) { for (x = 0;x < sizex;x++) { int sx = xpos + 8*(flipx?(sizex-1-x):x); int sy = ypos + 8*(flipy?(sizey-1-y):y); sx -= xscroll; drawgfx(bitmap,machine->gfx[3], code + layout[y][x], color, flipx,flipy, sx,sy, cliprect,TRANSPARENCY_PEN,0 ); /* wraparound */ drawgfx(bitmap,machine->gfx[3], code + layout[y][x], color, flipx,flipy, sx,sy-0x200, cliprect,TRANSPARENCY_PEN,0 ); /* wraparound */ drawgfx(bitmap,machine->gfx[3], code + layout[y][x], color, flipx,flipy, sx-0x400,sy, cliprect,TRANSPARENCY_PEN,0 ); /* wraparound */ drawgfx(bitmap,machine->gfx[3], code + layout[y][x], color, flipx,flipy, sx-0x400,sy-0x200, cliprect,TRANSPARENCY_PEN,0 ); } } } } } /*** Video Start / Update ***/ VIDEO_START( tbowl ) { tx_tilemap = tilemap_create(get_tx_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32); bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,128,32); bg2_tilemap = tilemap_create(get_bg2_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,128,32); tilemap_set_transparent_pen(tx_tilemap,0); tilemap_set_transparent_pen(bg_tilemap,0); tilemap_set_transparent_pen(bg2_tilemap,0); } VIDEO_UPDATE( tbowl ) { if (screen == 0) { tilemap_set_scrollx(bg_tilemap, 0, tbowl_xscroll ); tilemap_set_scrolly(bg_tilemap, 0, tbowl_yscroll ); tilemap_set_scrollx(bg2_tilemap, 0, tbowl_bg2xscroll ); tilemap_set_scrolly(bg2_tilemap, 0, tbowl_bg2yscroll ); tilemap_set_scrollx(tx_tilemap, 0, 0 ); tilemap_set_scrolly(tx_tilemap, 0, 0 ); fillbitmap(bitmap,0x100,cliprect); /* is there a register controling the colour? looks odd when screen is blank */ tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); draw_sprites(machine, bitmap,cliprect, 0); tilemap_draw(bitmap,cliprect,bg2_tilemap,0,0); tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); } else if (screen ==1) { tilemap_set_scrollx(bg_tilemap, 0, tbowl_xscroll+32*8 ); tilemap_set_scrolly(bg_tilemap, 0, tbowl_yscroll ); tilemap_set_scrollx(bg2_tilemap, 0, tbowl_bg2xscroll+32*8 ); tilemap_set_scrolly(bg2_tilemap, 0, tbowl_bg2yscroll ); tilemap_set_scrollx(tx_tilemap, 0, 32*8 ); tilemap_set_scrolly(tx_tilemap, 0, 0 ); fillbitmap(bitmap,0x100,cliprect); /* is there a register controling the colour? looks odd when screen is blank */ tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); draw_sprites(machine, bitmap,cliprect, 32*8); tilemap_draw(bitmap,cliprect,bg2_tilemap,0,0); tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); } return 0; }