// license:BSD-3-Clause // copyright-holders:Manuel Abadia #include "emu.h" #include "includes/fastlane.h" PALETTE_INIT_MEMBER(fastlane_state, fastlane) { const uint8_t *color_prom = memregion("proms")->base(); int pal; for (pal = 0; pal < 0x10; pal++) { int i; for (i = 0; i < 0x400; i++) { uint8_t ctabentry = (i & 0x3f0) | color_prom[(pal << 4) | (i & 0x0f)]; palette.set_pen_indirect((pal << 10) | i, ctabentry); } } } /*************************************************************************** Callbacks for the TileMap code ***************************************************************************/ TILE_GET_INFO_MEMBER(fastlane_state::get_tile_info0) { uint8_t ctrl_3 = m_k007121->ctrlram_r(3); uint8_t ctrl_4 = m_k007121->ctrlram_r(4); uint8_t ctrl_5 = m_k007121->ctrlram_r(5); int attr = m_videoram1[tile_index]; int code = m_videoram1[tile_index + 0x400]; int bit0 = (ctrl_5 >> 0) & 0x03; int bit1 = (ctrl_5 >> 2) & 0x03; int bit2 = (ctrl_5 >> 4) & 0x03; int bit3 = (ctrl_5 >> 6) & 0x03; int bank = ((attr & 0x80) >> 7) | ((attr >> (bit0+2)) & 0x02) | ((attr >> (bit1+1)) & 0x04) | ((attr >> (bit2 )) & 0x08) | ((attr >> (bit3-1)) & 0x10) | ((ctrl_3 & 0x01) << 5); int mask = (ctrl_4 & 0xf0) >> 4; bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); SET_TILE_INFO_MEMBER(0, code+bank*256, 1 + 64 * (attr & 0x0f), 0); } TILE_GET_INFO_MEMBER(fastlane_state::get_tile_info1) { uint8_t ctrl_3 = m_k007121->ctrlram_r(3); uint8_t ctrl_4 = m_k007121->ctrlram_r(4); uint8_t ctrl_5 = m_k007121->ctrlram_r(5); int attr = m_videoram2[tile_index]; int code = m_videoram2[tile_index + 0x400]; int bit0 = (ctrl_5 >> 0) & 0x03; int bit1 = (ctrl_5 >> 2) & 0x03; int bit2 = (ctrl_5 >> 4) & 0x03; int bit3 = (ctrl_5 >> 6) & 0x03; int bank = ((attr & 0x80) >> 7) | ((attr >> (bit0+2)) & 0x02) | ((attr >> (bit1+1)) & 0x04) | ((attr >> (bit2 )) & 0x08) | ((attr >> (bit3-1)) & 0x10) | ((ctrl_3 & 0x01) << 5); int mask = (ctrl_4 & 0xf0) >> 4; bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); SET_TILE_INFO_MEMBER(0, code+bank*256, 0 + 64 * (attr & 0x0f), 0); } /*************************************************************************** Start the video hardware emulation. ***************************************************************************/ void fastlane_state::video_start() { m_layer0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(fastlane_state::get_tile_info0),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_layer1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(fastlane_state::get_tile_info1),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_layer0->set_scroll_rows(32); m_clip0 = m_screen->visible_area(); m_clip0.min_x += 40; m_clip1 = m_screen->visible_area(); m_clip1.max_x = 39; m_clip1.min_x = 0; } /*************************************************************************** Memory Handlers ***************************************************************************/ WRITE8_MEMBER(fastlane_state::fastlane_vram1_w) { m_videoram1[offset] = data; m_layer0->mark_tile_dirty(offset & 0x3ff); } WRITE8_MEMBER(fastlane_state::fastlane_vram2_w) { m_videoram2[offset] = data; m_layer1->mark_tile_dirty(offset & 0x3ff); } /*************************************************************************** Screen Refresh ***************************************************************************/ uint32_t fastlane_state::screen_update_fastlane(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { rectangle finalclip0 = m_clip0, finalclip1 = m_clip1; int i, xoffs; finalclip0 &= cliprect; finalclip1 &= cliprect; /* set scroll registers */ xoffs = m_k007121->ctrlram_r(0); for (i = 0; i < 32; i++) m_layer0->set_scrollx(i, m_k007121_regs[0x20 + i] + xoffs - 40); m_layer0->set_scrolly(0, m_k007121->ctrlram_r(2)); m_layer0->draw(screen, bitmap, finalclip0, 0, 0); m_k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(0), *m_palette, m_spriteram, 0, 40, 0, screen.priority(), (uint32_t)-1); m_layer1->draw(screen, bitmap, finalclip1, 0, 0); return 0; }