int main(int argc, char** argv) { int opt; //int verbose_flag = 0; char *bios_path = NULL; char *rom_path = NULL; Uint32 start_time, time, frame; uint32_t delta, elapsed; pause_emu = 0; scale = 2; while ((opt = getopt(argc, argv, "vdb:")) != -1) { switch (opt) { case 'b': bios_path = optarg; break; case 'v': //verbose_flag = 1; break; case 'd': debug_flag = 1; debug_pause = 1; break; default: usage(argv[0]); } } if (optind == argc) { usage(argv[0]); } rom_path = argv[optind]; dmg_init(); dmg_load_bios(bios_path); dmg_load_rom(rom_path); sdl_init(scale); time = 0; frame = 1; start_time = SDL_GetTicks(); for (;;) { delta = ((frame * 1000) / SCREEN_FPS) - time; if ((elapsed = main_loop(delta)) == -1) { break; } time += elapsed; if (elapsed > 0) { sdl_render(screen_get_fb()); } // Sync to maximum fps if (SDL_GetTicks() - start_time < time) { SDL_Delay(time - (SDL_GetTicks() - start_time)); } else { time = 0; frame = 1; start_time = SDL_GetTicks(); } frame++; // When Uint32 overflows, restart. This is unlikely to happen: // Uint32 will overflow after 828 days at 60 fps if (frame == 0) { start_time = SDL_GetTicks(); } } sdl_stop(); return 0; }
int main(int argc, char *argv[]) { // Setup SDL if(SDL_setup() != 0) return -1; // Command line arguments char *ram_file = 0; char binary = 0; char little_endian = 0; char debug_mode = 0; char enable_profiling = 0; // Parse the arguments for(int c = 1; c < argc; c++) { if(strcmp(argv[c], "-d") == 0) { debug_mode = 1; } else if(strcmp(argv[c], "-bl") == 0) { binary = 1; little_endian = 1; } else if(strcmp(argv[c], "-bb") == 0) { binary = 1; little_endian = 0; } else if(strcmp(argv[c], "-p") == 0) { enable_profiling = 1; } else { ram_file = argv[c]; } } // Make sure the user specified a RAM file if(ram_file) { // Prepare the emulator if(emulator_setup(ram_file, binary, little_endian, enable_profiling) != 0) return -1; } else { PRINTF("No RAM file specified.\n"); return 0; } // Setup hardware hardware_setup(); // Start the emulator thread pthread_create(&emulator_thread, 0, (void *) &emulator_thread_func, (void *) &debug_mode); // SDL event loop while(running) { sdl_handle_events(); sdl_render(); } // Wait for the emulator thread to finish running = 0; pthread_join(emulator_thread, 0); // Cleanup hardware_release(); // Quit SDL SDL_Quit(); return 0; }