/* Run and Gun (c) 1993 Konami Video hardware emulation. Driver by R. Belmont */ #include "driver.h" #include "video/konamiic.h" static int ttl_gfx_index; static tilemap *ttl_tilemap, *rng_936_tilemap; static UINT16 ttl_vram[0x1000]; static int sprite_colorbase; extern UINT16 *rng_936_videoram; /* TTL text plane stuff */ static TILE_GET_INFO( ttl_get_tile_info ) { UINT32 *lvram = (UINT32 *)ttl_vram; int attr, code; code = (lvram[tile_index]>>16)&0xffff; code |= (lvram[tile_index]&0x0f)<<8; /* tile "bank" */ attr = ((lvram[tile_index]&0xf0)>>4); /* palette */ SET_TILE_INFO(ttl_gfx_index, code, attr, 0); } static void rng_sprite_callback(int *code, int *color, int *priority_mask) { *color = sprite_colorbase | (*color & 0x001f); } READ16_HANDLER( ttl_ram_r ) { return(ttl_vram[offset]); } WRITE16_HANDLER( ttl_ram_w ) { COMBINE_DATA(&ttl_vram[offset]); } /* 53936 (PSAC2) rotation/zoom plane */ WRITE16_HANDLER(rng_936_videoram_w) { COMBINE_DATA(&rng_936_videoram[offset]); tilemap_mark_tile_dirty(rng_936_tilemap, offset/2); } static TILE_GET_INFO( get_rng_936_tile_info ) { int tileno, colour, flipx; tileno = rng_936_videoram[tile_index*2+1] & 0x3fff; flipx = (rng_936_videoram[tile_index*2+1] & 0xc000) >> 14; colour = 0x10 + (rng_936_videoram[tile_index*2] & 0x000f); SET_TILE_INFO(0, tileno, colour, TILE_FLIPYX(flipx)); } VIDEO_START(rng) { static const gfx_layout charlayout = { 8, 8, // 8x8 4096, // # of tiles 4, // 4bpp { 0, 1, 2, 3 }, // plane offsets { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 }, // X offsets { 0*8*4, 1*8*4, 2*8*4, 3*8*4, 4*8*4, 5*8*4, 6*8*4, 7*8*4 }, // Y offsets 8*8*4 }; K055673_vh_start(machine, REGION_GFX2, 1, -8, 15, rng_sprite_callback); K053936_wraparound_enable(0, 0); K053936_set_offset(0, 34, 9); rng_936_tilemap = tilemap_create(get_rng_936_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 16, 16, 128, 128); tilemap_set_transparent_pen(rng_936_tilemap, 0); /* find first empty slot to decode gfx */ for (ttl_gfx_index = 0; ttl_gfx_index < MAX_GFX_ELEMENTS; ttl_gfx_index++) if (machine->gfx[ttl_gfx_index] == 0) break; assert(ttl_gfx_index != MAX_GFX_ELEMENTS); // decode the ttl layer's gfx machine->gfx[ttl_gfx_index] = allocgfx(&charlayout); decodegfx(machine->gfx[ttl_gfx_index], memory_region(REGION_GFX3), 0, machine->gfx[ttl_gfx_index]->total_elements); if (machine->drv->color_table_len) machine->gfx[ttl_gfx_index]->total_colors = machine->drv->color_table_len / 16; else machine->gfx[ttl_gfx_index]->total_colors = machine->drv->total_colors / 16; // create the tilemap ttl_tilemap = tilemap_create(ttl_get_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 64, 32); tilemap_set_transparent_pen(ttl_tilemap, 0); state_save_register_global_array(ttl_vram); sprite_colorbase = 0x20; } VIDEO_UPDATE(rng) { fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap, 0, cliprect); K053936_0_zoom_draw(bitmap, cliprect, rng_936_tilemap, 0, 0); K053247_sprites_draw(machine, bitmap, cliprect); tilemap_mark_all_tiles_dirty(ttl_tilemap); tilemap_draw(bitmap, cliprect, ttl_tilemap, 0, 0); return 0; }