#include "driver.h" #include "video/konamiic.h" UINT8 *fastlane_k007121_regs,*fastlane_videoram1,*fastlane_videoram2; static tilemap *layer0, *layer1; static rectangle clip0, clip1; PALETTE_INIT( fastlane ) { int pal,col; for (pal = 0;pal < 16;pal++) { for (col = 0;col < 1024;col++) { *(colortable++) = (col & ~0x0f) | color_prom[16 * pal + (col & 0x0f)]; } } } /*************************************************************************** Callbacks for the TileMap code ***************************************************************************/ static TILE_GET_INFO( get_tile_info0 ) { int attr = fastlane_videoram1[tile_index]; int code = fastlane_videoram1[tile_index + 0x400]; int bit0 = (K007121_ctrlram[0][0x05] >> 0) & 0x03; int bit1 = (K007121_ctrlram[0][0x05] >> 2) & 0x03; int bit2 = (K007121_ctrlram[0][0x05] >> 4) & 0x03; int bit3 = (K007121_ctrlram[0][0x05] >> 6) & 0x03; int bank = ((attr & 0x80) >> 7) | ((attr >> (bit0+2)) & 0x02) | ((attr >> (bit1+1)) & 0x04) | ((attr >> (bit2 )) & 0x08) | ((attr >> (bit3-1)) & 0x10) | ((K007121_ctrlram[0][0x03] & 0x01) << 5); int mask = (K007121_ctrlram[0][0x04] & 0xf0) >> 4; bank = (bank & ~(mask << 1)) | ((K007121_ctrlram[0][0x04] & mask) << 1); SET_TILE_INFO( 0, code+bank*256, 1 + 64 * (attr & 0x0f), 0); } static TILE_GET_INFO( get_tile_info1 ) { int attr = fastlane_videoram2[tile_index]; int code = fastlane_videoram2[tile_index + 0x400]; int bit0 = (K007121_ctrlram[0][0x05] >> 0) & 0x03; int bit1 = (K007121_ctrlram[0][0x05] >> 2) & 0x03; int bit2 = (K007121_ctrlram[0][0x05] >> 4) & 0x03; int bit3 = (K007121_ctrlram[0][0x05] >> 6) & 0x03; int bank = ((attr & 0x80) >> 7) | ((attr >> (bit0+2)) & 0x02) | ((attr >> (bit1+1)) & 0x04) | ((attr >> (bit2 )) & 0x08) | ((attr >> (bit3-1)) & 0x10) | ((K007121_ctrlram[0][0x03] & 0x01) << 5); int mask = (K007121_ctrlram[0][0x04] & 0xf0) >> 4; bank = (bank & ~(mask << 1)) | ((K007121_ctrlram[0][0x04] & mask) << 1); SET_TILE_INFO( 0, code+bank*256, 0 + 64 * (attr & 0x0f), 0); } /*************************************************************************** Start the video hardware emulation. ***************************************************************************/ VIDEO_START( fastlane ) { layer0 = tilemap_create(get_tile_info0,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); layer1 = tilemap_create(get_tile_info1,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); tilemap_set_scroll_rows( layer0, 32 ); clip0 = machine->screen[0].visarea; clip0.min_x += 40; clip1 = machine->screen[0].visarea; clip1.max_x = 39; clip1.min_x = 0; } /*************************************************************************** Memory Handlers ***************************************************************************/ WRITE8_HANDLER( fastlane_vram1_w ) { fastlane_videoram1[offset] = data; tilemap_mark_tile_dirty(layer0,offset & 0x3ff); } WRITE8_HANDLER( fastlane_vram2_w ) { fastlane_videoram2[offset] = data; tilemap_mark_tile_dirty(layer1,offset & 0x3ff); } /*************************************************************************** Screen Refresh ***************************************************************************/ VIDEO_UPDATE( fastlane ) { rectangle finalclip0 = clip0, finalclip1 = clip1; int i, xoffs; sect_rect(&finalclip0, cliprect); sect_rect(&finalclip1, cliprect); /* set scroll registers */ xoffs = K007121_ctrlram[0][0x00]; for( i=0; i<32; i++ ){ tilemap_set_scrollx(layer0, i, fastlane_k007121_regs[0x20 + i] + xoffs - 40); } tilemap_set_scrolly( layer0, 0, K007121_ctrlram[0][0x02] ); tilemap_draw(bitmap,&finalclip0,layer0,0,0); K007121_sprites_draw(machine,0,bitmap,cliprect,spriteram,0,40,0,-1); tilemap_draw(bitmap,&finalclip1,layer1,0,0); return 0; }