Пример #1
0
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;
}
Пример #2
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;
}