interrupt void RealTimeInterrupt (void) { volatile static unsigned char state = 0; CRGFLG = CRGINT_RTIE_MASK; /* Reset interrupt request flag */ decrement_timers (); if (state = ~state) { //PTL_PTL0 = 0; //Turn on ACTLED } else { //PTL_PTL0 = 1; //Turn off ACTLED } }
// Source: 0xB15E void Outrun::main_switch() { switch (game_state) { case GS_INIT: init_attract(); // fall through // ---------------------------------------------------------------------------------------- // Attract Mode // ---------------------------------------------------------------------------------------- case GS_ATTRACT: tick_attract(); break; case GS_INIT_BEST1: oferrari.car_ctrl_active = false; oinitengine.car_increment = 0; oferrari.car_inc_old = 0; ostats.time_counter = 5; ostats.frame_counter = ostats.frame_reset; ohiscore.init(); osoundint.queue_sound(sound::FM_RESET); #ifdef COMPILE_SOUND_CODE cannonball::audio.clear_wav(); #endif game_state = GS_BEST1; case GS_BEST1: ohud.draw_copyright_text(); ohiscore.display_scores(); ohud.draw_credits(); ohud.draw_insert_coin(); if (ostats.credits) game_state = GS_INIT_MUSIC; else if (decrement_timers()) game_state = GS_INIT_LOGO; break; case GS_INIT_LOGO: video->clear_text_ram(); oferrari.car_ctrl_active = false; oinitengine.car_increment = 0; oferrari.car_inc_old = 0; ostats.time_counter = 5; ostats.frame_counter = ostats.frame_reset; osoundint.queue_sound(0); ologo.enable(sound::FM_RESET); game_state = GS_LOGO; case GS_LOGO: ohud.draw_credits(); ohud.draw_copyright_text(); ohud.draw_insert_coin(); ologo.tick(); if (ostats.credits) game_state = GS_INIT_MUSIC; else if (decrement_timers()) { ologo.disable(); game_state = GS_INIT; // Resume attract mode } break; // ---------------------------------------------------------------------------------------- // Music Select Screen // ---------------------------------------------------------------------------------------- case GS_INIT_MUSIC: omusic.enable(); game_state = GS_MUSIC; case GS_MUSIC: ohud.draw_credits(); ohud.draw_insert_coin(); omusic.check_start(); // Check for start button omusic.tick(); if (decrement_timers()) { omusic.disable(); game_state = GS_INIT_GAME; } break; // ---------------------------------------------------------------------------------------- // In-Game // ---------------------------------------------------------------------------------------- case GS_INIT_GAME: //ROM:0000B3E8 move.w #-1,(ingame_active1).l ; Denote in-game engine is active //ROM:0000B3F0 clr.l (prev_game_time).l ; Reset overall game time //ROM:0000B3F6 move.w #-1,(ingame_active2).l video->clear_text_ram(); oferrari.car_ctrl_active = true; init_jump_table(); oinitengine.init(cannonball_mode == MODE_TTRIAL ? ttrial.level : 0); // Timing Hack to ensure horizon is correct // Note that the original code disables the screen, and waits for the second CPU's interrupt instead oroad.tick(); oroad.tick(); oroad.tick(); osoundint.queue_sound(sound::STOP_CHEERS); osoundint.queue_sound(sound::VOICE_GETREADY); #ifdef COMPILE_SOUND_CODE if (omusic.music_selected >= 0 && omusic.music_selected <= 2) { cannonball::audio.load_wav(config.sound.custom_music[omusic.music_selected].filename.c_str()); osoundint.queue_sound(sound::REVS); // queue revs sound manually } else #endif osoundint.queue_sound(omusic.music_selected); if (!freeze_timer) ostats.time_counter = ostats.TIME[config.engine.dip_time * 40]; // Set time to begin level with else ostats.time_counter = 0x30; ostats.frame_counter = ostats.frame_reset + 50; ostats.credits--; // Update Credits ohud.blit_text1(TEXT1_CLEAR_START); ohud.blit_text1(TEXT1_CLEAR_CREDITS); osoundint.queue_sound(sound::INIT_CHEERS); video->enabled = true; game_state = GS_START1; ohud.draw_main_hud(); // fall through // Start Game - Car Driving In case GS_START1: case GS_START2: if (--ostats.frame_counter < 0) { osoundint.queue_sound(sound::SIGNAL1); ostats.frame_counter = ostats.frame_reset; game_state++; } break; case GS_START3: if (--ostats.frame_counter < 0) { if (cannonball_mode == MODE_TTRIAL) { ohud.clear_timetrial_text(); } osoundint.queue_sound(sound::SIGNAL2); osoundint.queue_sound(sound::STOP_CHEERS); ostats.frame_counter = ostats.frame_reset; game_state++; } break; case GS_INGAME: if (decrement_timers()) game_state = GS_INIT_GAMEOVER; break; // ---------------------------------------------------------------------------------------- // Bonus Mode // ---------------------------------------------------------------------------------------- case GS_INIT_BONUS: ostats.frame_counter = ostats.frame_reset; obonus.bonus_control = OBonus::BONUS_INIT; // Initialize Bonus Mode Logic oroad.road_load_end |= BIT_0; // Instruct CPU 1 to load end road section ostats.game_completed |= BIT_0; // Denote game completed obonus.bonus_timer = 3600; // Safety Timer Added in Rev. A Roms game_state = GS_BONUS; case GS_BONUS: if (--obonus.bonus_timer < 0) { obonus.bonus_control = OBonus::BONUS_DISABLE; game_state = GS_INIT_GAMEOVER; } break; // ---------------------------------------------------------------------------------------- // Display Game Over Text // ---------------------------------------------------------------------------------------- case GS_INIT_GAMEOVER: if (cannonball_mode != MODE_TTRIAL) { oferrari.car_ctrl_active = false; // -1 oinitengine.car_increment = 0; oferrari.car_inc_old = 0; ostats.time_counter = 3; ostats.frame_counter = ostats.frame_reset; ohud.blit_text2(TEXT2_GAMEOVER); } else { ohud.blit_text_big(7, ttrial.new_high_score ? "NEW RECORD" : "BAD LUCK"); ohud.blit_text1(TEXT1_LAPTIME1); ohud.blit_text1(TEXT1_LAPTIME2); ohud.draw_lap_timer(0x110554, ttrial.best_lap, ttrial.best_lap[2]); ohud.blit_text_new(9, 14, "OVERTAKES - "); ohud.blit_text_new(31, 14, Utils::to_string((int) ttrial.overtakes).c_str(), OHud::GREEN); ohud.blit_text_new(9, 16, "VEHICLE COLLISIONS - "); ohud.blit_text_new(31, 16, Utils::to_string((int) ttrial.vehicle_cols).c_str(), OHud::GREEN); ohud.blit_text_new(9, 18, "CRASHES - "); ohud.blit_text_new(31, 18, Utils::to_string((int) ttrial.crashes).c_str(), OHud::GREEN); } osoundint.queue_sound(sound::NEW_COMMAND); game_state = GS_GAMEOVER; case GS_GAMEOVER: if (cannonball_mode == MODE_ORIGINAL) { if (decrement_timers()) game_state = GS_INIT_MAP; } else if (cannonball_mode == MODE_CONT) { if (decrement_timers()) init_best_outrunners(); } else if (cannonball_mode == MODE_TTRIAL) { if (outrun.tick_counter & BIT_4) ohud.blit_text1(10, 20, TEXT1_PRESS_START); else ohud.blit_text1(10, 20, TEXT1_CLEAR_START); if (input.is_pressed(Input::START)) cannonball::state = cannonball::STATE_INIT_MENU; } break; // ---------------------------------------------------------------------------------------- // Display Course Map // ---------------------------------------------------------------------------------------- case GS_INIT_MAP: omap.init(); ohud.blit_text2(TEXT2_COURSEMAP); game_state = GS_MAP; // fall through case GS_MAP: break; // ---------------------------------------------------------------------------------------- // Best OutRunners / Score Entry // ---------------------------------------------------------------------------------------- case GS_INIT_BEST2: oroad.set_view_mode(ORoad::VIEW_ORIGINAL, true); // bsr.w EndGame osprites.disable_sprites(); otraffic.disable_traffic(); // bsr.w EditJumpTable3 osprites.clear_palette_data(); olevelobjs.init_hiscore_sprites(); ocrash.coll_count1 = 0; ocrash.coll_count2 = 0; ocrash.crash_counter = 0; ocrash.skid_counter = 0; ocrash.spin_control1 = 0; oferrari.car_ctrl_active = false; // -1 oinitengine.car_increment = 0; oferrari.car_inc_old = 0; ostats.time_counter = 0x30; ostats.frame_counter = ostats.frame_reset; ohiscore.init(); osoundint.queue_sound(sound::NEW_COMMAND); osoundint.queue_sound(sound::FM_RESET); #ifdef COMPILE_SOUND_CODE cannonball::audio.clear_wav(); #endif game_state = GS_BEST2; // fall through case GS_BEST2: ohiscore.tick(); // Do High Score Logic ohud.draw_credits(); // If countdown has expired if (decrement_timers()) { //ROM:0000B700 bclr #5,(ppi1_value).l ; Turn screen off (not activated until PPI written to) oferrari.car_ctrl_active = true; // 0 : Allow road updates init_jump_table(); oinitengine.init(cannonball_mode == MODE_TTRIAL ? ttrial.level : 0); //ROM:0000B716 bclr #0,(byte_260550).l game_state = GS_REINIT; // Reinit game to attract mode } break; // ---------------------------------------------------------------------------------------- // Reinitialize Game After High Score Entry // ---------------------------------------------------------------------------------------- case GS_REINIT: video->clear_text_ram(); game_state = GS_INIT; break; } oinitengine.update_road(); oinitengine.update_engine(); // -------------------------------------------------------------------------------------------- // Debugging Only // -------------------------------------------------------------------------------------------- if (DEBUG_LEVEL) { if (oinitengine.rd_split_state != 0) { if (!fork_chosen) { if (oinitengine.camera_x_off < 0) fork_chosen = -1; else fork_chosen = 1; } } else if (fork_chosen) fork_chosen = 0; // Hack to allow user to choose road fork with left/right if (fork_chosen == -1) { oroad.road_width_bak = oroad.road_width >> 16; oroad.car_x_bak = -oroad.road_width_bak; oinitengine.car_x_pos = oroad.car_x_bak; } else {