/************************************************************************* Run and Gun (c) 1993 Konami Video hardware emulation. Driver by R. Belmont *************************************************************************/ #include "emu.h" #include "video/konicdev.h" #include "includes/rungun.h" /* TTL text plane stuff */ static TILE_GET_INFO( ttl_get_tile_info ) { rungun_state *state = machine.driver_data(); UINT8 *lvram = (UINT8 *)state->m_ttl_vram; int attr, code; attr = (lvram[BYTE_XOR_LE(tile_index<<2)] & 0xf0) >> 4; code = ((lvram[BYTE_XOR_LE(tile_index<<2)] & 0x0f) << 8) | (lvram[BYTE_XOR_LE((tile_index<<2)+2)]); SET_TILE_INFO(state->m_ttl_gfx_index, code, attr, 0); } void rng_sprite_callback( running_machine &machine, int *code, int *color, int *priority_mask ) { rungun_state *state = machine.driver_data(); *color = state->m_sprite_colorbase | (*color & 0x001f); } READ16_HANDLER( rng_ttl_ram_r ) { rungun_state *state = space->machine().driver_data(); return state->m_ttl_vram[offset]; } WRITE16_HANDLER( rng_ttl_ram_w ) { rungun_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ttl_vram[offset]); } /* 53936 (PSAC2) rotation/zoom plane */ WRITE16_HANDLER(rng_936_videoram_w) { rungun_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_936_videoram[offset]); tilemap_mark_tile_dirty(state->m_936_tilemap, offset / 2); } static TILE_GET_INFO( get_rng_936_tile_info ) { rungun_state *state = machine.driver_data(); int tileno, colour, flipx; tileno = state->m_936_videoram[tile_index * 2 + 1] & 0x3fff; flipx = (state->m_936_videoram[tile_index * 2 + 1] & 0xc000) >> 14; colour = 0x10 + (state->m_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 }; rungun_state *state = machine.driver_data(); int gfx_index; state->m_936_tilemap = tilemap_create(machine, get_rng_936_tile_info, tilemap_scan_rows, 16, 16, 128, 128); tilemap_set_transparent_pen(state->m_936_tilemap, 0); /* find first empty slot to decode gfx */ for (gfx_index = 0; gfx_index < MAX_GFX_ELEMENTS; gfx_index++) if (machine.gfx[gfx_index] == 0) break; assert(gfx_index != MAX_GFX_ELEMENTS); // decode the ttl layer's gfx machine.gfx[gfx_index] = gfx_element_alloc(machine, &charlayout, machine.region("gfx3")->base(), machine.total_colors() / 16, 0); state->m_ttl_gfx_index = gfx_index; // create the tilemap state->m_ttl_tilemap = tilemap_create(machine, ttl_get_tile_info, tilemap_scan_rows, 8, 8, 64, 32); tilemap_set_transparent_pen(state->m_ttl_tilemap, 0); state->m_sprite_colorbase = 0x20; } SCREEN_UPDATE(rng) { rungun_state *state = screen->machine().driver_data(); bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_936_tilemap, 0, 0, 1); k053247_sprites_draw(state->m_k055673, bitmap, cliprect); tilemap_mark_all_tiles_dirty(state->m_ttl_tilemap); tilemap_draw(bitmap, cliprect, state->m_ttl_tilemap, 0, 0); return 0; }