/* Fit of Fighting Video Hardware */ #include "emu.h" #include "includes/fitfight.h" static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) { fitfight_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[3]; UINT16 *source = state->m_spriteram; UINT16 *finish = source + 0x800 / 2; while (source < finish) { int xpos, ypos, number, xflip, yflip, end, colr, prio; ypos = source[0]; xpos = source[3]; number = source[2]; xflip = (source[1] & 0x0001) ^ 0x0001; yflip = (source[1] & 0x0002); prio = (source[1] & 0x0400) >> 10; colr = (source[1] & 0x00fc) >> 2; if (state->m_bbprot_kludge == 1) colr = (source[1] & 0x00f8) >> 3; end = source[0] & 0x8000; ypos = 0xff - ypos; xpos -= 38;//48; ypos -= 14;//16; if (end) break; if (prio == layer) drawgfx_transpen(bitmap, cliprect, gfx, number, colr, xflip, yflip, xpos, ypos, 0); source += 4; } } static TILE_GET_INFO( get_fof_bak_tile_info ) { fitfight_state *state = machine.driver_data(); int code = state->m_fof_bak_tileram[tile_index * 2 + 1]; int colr = state->m_fof_bak_tileram[tile_index * 2] & 0x1f; int xflip = (state->m_fof_bak_tileram[tile_index * 2] & 0x0020) >> 5; xflip ^= 1; SET_TILE_INFO(2, code, colr, TILE_FLIPYX(xflip)); } WRITE16_HANDLER( fof_bak_tileram_w ) { fitfight_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fof_bak_tileram[offset]); tilemap_mark_tile_dirty(state->m_fof_bak_tilemap, offset / 2); } static TILE_GET_INFO( get_fof_mid_tile_info ) { fitfight_state *state = machine.driver_data(); int code = state->m_fof_mid_tileram[tile_index * 2 + 1]; int colr = state->m_fof_mid_tileram[tile_index * 2] & 0x1f; int xflip = (state->m_fof_mid_tileram[tile_index * 2] & 0x0020) >> 5; xflip ^= 1; SET_TILE_INFO(1, code, colr, TILE_FLIPYX(xflip)); } WRITE16_HANDLER( fof_mid_tileram_w ) { fitfight_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fof_mid_tileram[offset]); tilemap_mark_tile_dirty(state->m_fof_mid_tilemap, offset / 2); } static TILE_GET_INFO( get_fof_txt_tile_info ) { fitfight_state *state = machine.driver_data(); int code = state->m_fof_txt_tileram[tile_index * 2 + 1]; int colr = state->m_fof_txt_tileram[tile_index * 2] & 0x1f; int xflip = (state->m_fof_txt_tileram[tile_index * 2] & 0x0020) >> 5; xflip ^= 1; SET_TILE_INFO(0, code, colr, TILE_FLIPYX(xflip)); } WRITE16_HANDLER( fof_txt_tileram_w ) { fitfight_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fof_txt_tileram[offset]); tilemap_mark_tile_dirty(state->m_fof_txt_tilemap, offset / 2); } /* video start / update */ VIDEO_START(fitfight) { fitfight_state *state = machine.driver_data(); state->m_fof_bak_tilemap = tilemap_create(machine, get_fof_bak_tile_info, tilemap_scan_cols, 8, 8, 128, 32); /* opaque */ state->m_fof_mid_tilemap = tilemap_create(machine, get_fof_mid_tile_info, tilemap_scan_cols, 8, 8, 128, 32); tilemap_set_transparent_pen(state->m_fof_mid_tilemap, 0); state->m_fof_txt_tilemap = tilemap_create(machine, get_fof_txt_tile_info, tilemap_scan_cols, 8, 8, 128, 32); tilemap_set_transparent_pen(state->m_fof_txt_tilemap, 0); } SCREEN_UPDATE(fitfight) { fitfight_state *state = screen->machine().driver_data(); /* scroll isn't right */ int vblank; int scrollbak, scrollmid; vblank = (state->m_fof_700000[0] & 0x8000); if (vblank > 0) bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); else { // if (screen->machine().input().code_pressed(KEYCODE_Q)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x0038) >> 3); // else if (screen->machine().input().code_pressed(KEYCODE_W)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x01c0) >> 6); // else if (screen->machine().input().code_pressed(KEYCODE_E)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x01c0) >> 6); // else if (screen->machine().input().code_pressed(KEYCODE_R)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x0038) >> 3); // else scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5); tilemap_set_scrollx(state->m_fof_bak_tilemap,0, scrollbak ); tilemap_set_scrolly(state->m_fof_bak_tilemap,0, state->m_fof_a00000[0] & 0xff); tilemap_draw(bitmap, cliprect, state->m_fof_bak_tilemap, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect, 0); // if (screen->machine().input().code_pressed(KEYCODE_A)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x01c0) >> 6); // else if (screen->machine().input().code_pressed(KEYCODE_S)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x0038) >> 3); // else if (screen->machine().input().code_pressed(KEYCODE_D)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x0038) >> 3); // else if (screen->machine().input().code_pressed(KEYCODE_F)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x01c0) >> 6); // else scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5); tilemap_set_scrollx(state->m_fof_mid_tilemap, 0, scrollmid ); tilemap_set_scrolly(state->m_fof_mid_tilemap, 0, state->m_fof_900000[0] & 0xff); // if (!screen->machine().input().code_pressed(KEYCODE_F)) tilemap_draw(bitmap, cliprect, state->m_fof_mid_tilemap, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect, 1); tilemap_draw(bitmap, cliprect, state->m_fof_txt_tilemap, 0, 0); } /* popmessage ("Regs %04x %04x %04x %04x %04x %04x", state->m_fof_100000[0], state->m_fof_600000[0], state->m_fof_700000[0], state->m_fof_800000[0], state->m_fof_900000[0], state->m_fof_a00000[0] ); */ return 0; }