/*************************************************************************** Goal '92 video hardware ***************************************************************************/ #include "emu.h" #include "includes/goal92.h" READ16_HANDLER( goal92_fg_bank_r ) { goal92_state *state = space->machine().driver_data(); return state->m_fg_bank; } WRITE16_HANDLER( goal92_fg_bank_w ) { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_bank); if (ACCESSING_BITS_0_7) { tilemap_mark_all_tiles_dirty(state->m_fg_layer); } } WRITE16_HANDLER( goal92_text_w ) { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_data[offset]); tilemap_mark_tile_dirty(state->m_tx_layer, offset); } WRITE16_HANDLER( goal92_background_w ) { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_data[offset]); tilemap_mark_tile_dirty(state->m_bg_layer, offset); } WRITE16_HANDLER( goal92_foreground_w ) { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_data[offset]); tilemap_mark_tile_dirty(state->m_fg_layer, offset); } static TILE_GET_INFO( get_text_tile_info ) { goal92_state *state = machine.driver_data(); int tile = state->m_tx_data[tile_index]; int color = (tile >> 12) & 0xf; tile &= 0xfff; tile |= 0xc000; SET_TILE_INFO(1, tile, color, 0); } static TILE_GET_INFO( get_back_tile_info ) { goal92_state *state = machine.driver_data(); int tile = state->m_bg_data[tile_index]; int color = (tile >> 12) & 0xf; tile &= 0xfff; SET_TILE_INFO(2, tile, color, 0); } static TILE_GET_INFO( get_fore_tile_info ) { goal92_state *state = machine.driver_data(); int tile = state->m_fg_data[tile_index]; int color = (tile >> 12) & 0xf; int region; tile &= 0xfff; if(state->m_fg_bank & 0xff) { region = 3; tile |= 0x1000; } else { region = 4; tile |= 0x2000; } SET_TILE_INFO(region, tile, color, 0); } static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) { goal92_state *state = machine.driver_data(); UINT16 *buffered_spriteram16 = state->m_buffered_spriteram; int offs, fx, fy, x, y, color, sprite; for (offs = 3; offs <= 0x400 - 5; offs += 4) { UINT16 data = buffered_spriteram16[offs + 2]; y = buffered_spriteram16[offs + 0]; if (y & 0x8000) break; if (!(data & 0x8000)) continue; sprite = buffered_spriteram16[offs + 1]; if ((sprite >> 14) != pri) continue; x = buffered_spriteram16[offs + 3]; sprite &= 0x1fff; x &= 0x1ff; y &= 0x1ff; color = (data & 0x3f) + 0x40; fx = (data & 0x4000) >> 14; fy = 0; x -= 320 / 4 - 16 - 1; y = 256 - (y + 7); drawgfx_transpen(bitmap,cliprect,machine.gfx[0], sprite, color,fx,fy,x,y,15); } } VIDEO_START( goal92 ) { goal92_state *state = machine.driver_data(); state->m_bg_layer = tilemap_create(machine, get_back_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_layer = tilemap_create(machine, get_fore_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_tx_layer = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_buffered_spriteram = auto_alloc_array(machine, UINT16, 0x400 * 2); state_save_register_global_pointer(machine, state->m_buffered_spriteram, 0x400 * 2); tilemap_set_transparent_pen(state->m_bg_layer, 15); tilemap_set_transparent_pen(state->m_fg_layer, 15); tilemap_set_transparent_pen(state->m_tx_layer, 15); } SCREEN_UPDATE( goal92 ) { goal92_state *state = screen->machine().driver_data(); tilemap_set_scrollx(state->m_bg_layer, 0, state->m_scrollram[0] + 60); tilemap_set_scrolly(state->m_bg_layer, 0, state->m_scrollram[1] + 8); if (state->m_fg_bank & 0xff) { tilemap_set_scrollx(state->m_fg_layer, 0, state->m_scrollram[0] + 60); tilemap_set_scrolly(state->m_fg_layer, 0, state->m_scrollram[1] + 8); } else { tilemap_set_scrollx(state->m_fg_layer, 0, state->m_scrollram[2] + 60); tilemap_set_scrolly(state->m_fg_layer, 0, state->m_scrollram[3] + 8); } bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); tilemap_draw(bitmap, cliprect, state->m_bg_layer, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect, 2); if (!(state->m_fg_bank & 0xff)) draw_sprites(screen->machine(), bitmap, cliprect, 1); tilemap_draw(bitmap, cliprect, state->m_fg_layer, 0, 0); if(state->m_fg_bank & 0xff) draw_sprites(screen->machine(), bitmap, cliprect, 1); draw_sprites(screen->machine(), bitmap, cliprect, 0); draw_sprites(screen->machine(), bitmap, cliprect, 3); tilemap_draw(bitmap, cliprect, state->m_tx_layer, 0, 0); return 0; } SCREEN_EOF( goal92 ) { goal92_state *state = machine.driver_data(); memcpy(state->m_buffered_spriteram, state->m_spriteram, 0x400 * 2); }