123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /*
- * PicoDrive
- * (C) notaz, 2006-2010
- *
- * This work is licensed under the terms of MAME license.
- * See COPYING file in the top-level directory.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <strings.h>
- #include <signal.h>
- #ifdef USE_SDL
- #include <SDL.h>
- #endif
- #include "../libpicofe/input.h"
- #include "../libpicofe/plat.h"
- #include "menu_pico.h"
- #include "emu.h"
- #include "configfile_fk.h"
- #include "version.h"
- #include <cpu/debug.h>
- #ifdef USE_LIBRETRO_VFS
- #include "file_stream_transforms.h"
- #endif
- char **g_argv;
- char *prog_name;
- char *load_state_file = NULL;
- int load_state_slot = -1;
- static char *quick_save_file_extension = "quicksave";
- char *mRomName = NULL;
- char *mRomPath = NULL;
- char *quick_save_file = NULL;
- int need_quick_load = -1;
- char *cfg_file_default = NULL;
- char *cfg_file_rom = NULL;
- static char *cfg_file_default_name = "default_config";
- static char *cfg_file_extension = "fkcfg";
- int mQuickSaveAndPoweroff=0;
- void usage(){
- printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2009,2013\n");
- printf("usage: PicoDriveBin [options] [romfile]\n");
- printf("options:\n"
- " -config <file> use specified config file instead of default 'config.cfg'\n"
- " -fps use to show fps\n"
- " -loadStateSlot <num> if ROM is specified, try loading savestate slot <num>\n"
- " -loadStateFile <filePath> if ROM is specified, try loading savestate file <filePath>\n");
- exit(1);
- }
- /* Handler for SIGUSR1, caused by closing the console */
- void handle_sigusr1(int sig)
- {
- //printf("Caught signal USR1 %d\n", sig);
- /* Exit menu if it was launched */
- stop_menu_loop = 1;
- /* Signal to quick save and poweoff after next loop */
- mQuickSaveAndPoweroff = 1;
- }
- void parse_cmd_line(int argc, char *argv[])
- {
- int x, unrecognized = 0;
- for (x = 1; x < argc; x++)
- {
- if (argv[x][0] == '-')
- {
- if (strcasecmp(argv[x], "-config") == 0) {
- if (x+1 < argc) { ++x; PicoConfigFile = argv[x]; }
- }
- else if (strcasecmp(argv[x], "-loadStateSlot") == 0
- || strcasecmp(argv[x], "-load") == 0)
- {
- if (x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }
- }
- else if (strcasecmp(argv[x], "-loadStateFile") == 0)
- {
- if (x+1 < argc) { ++x; load_state_file = argv[x]; }
- }
- else if (strcasecmp(argv[x], "-fps") == 0) {
- currentConfig.EmuOpt |= EOPT_SHOW_FPS;
- show_fps_bypass = 1;
- }
- else if (strcasecmp(argv[x], "-pdb") == 0) {
- if (x+1 < argc) { ++x; pdb_command(argv[x]); }
- }
- else if (strcasecmp(argv[x], "-pdb_connect") == 0) {
- if (x+2 < argc) { pdb_net_connect(argv[x+1], argv[x+2]); x += 2; }
- }
- else {
- unrecognized = 1;
- break;
- }
- }
- /* Check if file exists, Save ROM name, and ROM path */
- else {
- mRomName = argv[x];
- FILE *f = fopen(argv[x], "rb");
- if (f) {
- /* Save Rom path */
- mRomPath = (char *)malloc(strlen(mRomName)+1);
- strcpy(mRomPath, mRomName);
- char *slash = strrchr ((char*)mRomPath, '/');
- *slash = 0;
- /* Rom name without extension */
- char *point = strrchr ((char*)slash+1, '.');
- *point = 0;
- /* Set quicksave filename */
- quick_save_file = (char *)malloc(strlen(mRomPath) + strlen(slash+1) +
- strlen(quick_save_file_extension) + 2 + 1);
- sprintf(quick_save_file, "%s/%s.%s",
- mRomPath, slash+1, quick_save_file_extension);
- printf("Quick_save_file: %s\n", quick_save_file);
-
- /* Set rom cfg filepath */
- cfg_file_rom = (char *)malloc(strlen(mRomPath) + strlen(slash+1) +
- strlen(cfg_file_extension) + 2 + 1);
- sprintf(cfg_file_rom, "%s/%s.%s",
- mRomPath, slash+1, cfg_file_extension);
- printf("cfg_file_rom: %s\n", cfg_file_rom);
- /* Set console cfg filepath */
- cfg_file_default = (char *)malloc(strlen(mRomPath) + strlen(cfg_file_default_name) +
- strlen(cfg_file_extension) + 2 + 1);
- sprintf(cfg_file_default, "%s/%s.%s",
- mRomPath, cfg_file_default_name, cfg_file_extension);
- printf("cfg_file_default: %s\n", cfg_file_default);
- /** Load config files */
- configfile_load(cfg_file_default);
- configfile_load(cfg_file_rom);
- /* Close file*/
- fclose(f);
- rom_fname_reload = argv[x];
- engineState = PGS_ReloadRom;
- }
- else{
- printf("Rom %s not found \n", mRomName);
- unrecognized = 1;
- }
- break;
- }
- }
- if (unrecognized) {
- usage();
- }
- }
- int main(int argc, char *argv[])
- {
- g_argv = argv;
- /* Save program name */
- prog_name = argv[0];
- /* Engine initial state */
- engineState = PGS_Menu;
- /* Parse arguments */
- if (argc > 1){
- parse_cmd_line(argc, argv);
- }
- else{
- usage();
- }
- /* Init Signals */
- signal(SIGUSR1, handle_sigusr1);
- /* Set env var for no mouse */
- putenv(strdup("SDL_NOMOUSE=1"));
- plat_early_init();
- in_init();
- //in_probe();
- plat_target_init();
- plat_init();
- //menu_init();
- emu_prep_defconfig(); // depends on input
- emu_read_config(NULL, 0);
- emu_init();
- menu_init();
- if (engineState == PGS_ReloadRom)
- {
- if (emu_reload_rom(rom_fname_reload)) {
- engineState = PGS_Running;
- /* Load slot (if NOT sega CD) */
- if(load_state_slot != -1){
- /* DO NOT put this if in the previous one, we need this here not to enter the next else */
- if(!emu_is_segaCD()){
- printf("LOADING FROM SLOT %d...\n", load_state_slot+1);
- char fname[1024];
- emu_save_load_game(1, 0);
- printf("LOADED FROM SLOT %d\n", load_state_slot+1);
- load_state_slot = -1;
- }
- }
- /* Load file (if NOT sega CD) */
- else if(load_state_file != NULL){
- /* DO NOT put this if in the previous one, we need this here not to enter the next else */
- if(!emu_is_segaCD()){
- printf("LOADING FROM FILE %s...\n", load_state_file);
- emu_save_load_game_from_file(1, load_state_file);
- printf("LOADED FROM SLOT %s\n", load_state_file);
- load_state_file = NULL;
- }
- }
- /* Load quick save file (if NOT sega CD) */
- else if(access( quick_save_file, F_OK ) != -1){
- printf("Found quick save file: %s\n", quick_save_file);
- int resume = launch_resume_menu_loop();
- if(resume == RESUME_YES){
- printf("Resume game from quick save file: %s\n", quick_save_file);
- if(emu_is_segaCD()){
- need_quick_load = 1;
- }
- else{
- emu_save_load_game_from_file(1, quick_save_file);
- }
- }
- else{
- printf("Reset game\n");
- /* Remove quicksave file if present */
- if (remove(quick_save_file) == 0){
- printf("Deleted successfully: %s\n", quick_save_file);
- }
- else{
- printf("Unable to delete the file: %s\n", quick_save_file);
- }
- }
- }
- }
- }
- for (;;)
- {
- /** Debug */
- /*static int prev_engine_state = -1;
- if(prev_engine_state != engineState){
- printf("current engine state: %d, prev = %d\n", engineState, prev_engine_state);
- prev_engine_state = engineState;
- }*/
- switch (engineState)
- {
- case PGS_Menu:
- //menu_loop();
- menu_loop_funkey();
- break;
- case PGS_TrayMenu:
- menu_loop_tray();
- break;
- case PGS_ReloadRom:
- if (emu_reload_rom(rom_fname_reload))
- engineState = PGS_Running;
- else {
- printf("PGS_ReloadRom == 0\n");
- engineState = PGS_Menu;
- }
- break;
- case PGS_RestartRun:
- engineState = PGS_Running;
- /* vvv fallthrough */
- case PGS_Running:
- #ifdef GPERF
- ProfilerStart("gperf.out");
- #endif
- emu_loop();
- #ifdef GPERF
- ProfilerStop();
- #endif
- break;
- case PGS_Quit:
- goto endloop;
- default:
- printf("engine got into unknown state (%i), exitting\n", engineState);
- goto endloop;
- }
- }
- endloop:
- emu_finish();
- plat_finish();
- plat_target_finish();
- return 0;
- }
|