/* SDEXT emulation currently excepts the cartridge area (segments 4-7) to be filled * with the FLASH ROM content. Even segment 7, which will be copied to the second 64K "hidden" * and pagable flash area of the SD cartridge. Currently, there is no support for the full * sized SDEXT flash image */ void sdext_init ( void ) { /* try to detect SDEXT ROM extension and only turn on emulation if it exists */ if (sdext_detect_rom()) { WARNING_WINDOW("No SD-card cartridge ROM code found in loaded ROM set. SD card hardware emulation has been disabled!"); *sdimg_path = 0; sdf = NULL; SD_DEBUG("SDEXT: init: REFUSE: no SD-card cartridge ROM code found in loaded ROM set." NL); return; } SD_DEBUG("SDEXT: init: cool, SD-card cartridge ROM code seems to be found in loaded ROM set, enabling SD card hardware emulation ..." NL); sdf = open_emu_file(config_getopt_str("sdimg"), "rb", sdimg_path); // open in read-only mode, to get the path if (sdf) { fclose(sdf); sdf = fopen(sdimg_path, "r+b"); if (sdf) { DEBUGPRINT("SDEXT: SD image file is re-open in read/write mode, good (fd=%d)." NL, fileno(sdf)); } else { sdf = fopen(sdimg_path, "rb"); DEBUGPRINT("SDEXT: SD image cannot be re-open in read-write mode, using read-only access (fd=%d)." NL, fileno(sdf)); } } if (!sdf) { WARNING_WINDOW("SD card image file \"%s\" cannot be open: %s. You can use Xep128 but SD card access won't work!", sdimg_path, ERRSTR()); *sdimg_path = 0; } else { sdfd = fileno(sdf); sd_card_size = lseek(sdfd, 0, SEEK_END); SD_DEBUG("SDEXT: SD card size is: %ld bytes" NL, sd_card_size); if (sd_card_size > MAX_CARD_SIZE || sd_card_size < MIN_CARD_SIZE) { fclose(sdf); sdf = NULL; ERROR_WINDOW("SD card image file \"%s\" is too small or large, valid range is %ld - %ld Mbytes, but this one is %ld bytes long (about %ld Mbytes). SD access has been disabled!", sdimg_path, MIN_CARD_SIZE >> 20, MAX_CARD_SIZE >> 20, sd_card_size, sd_card_size >> 20 ); *sdimg_path = 0; } }
int main (int argc, char *argv[]) { const char *snapshot; atexit(shutdown_sdl); if (SDL_Init( #ifdef __EMSCRIPTEN__ // It seems there is an issue with emscripten SDL2: SDL_Init does not work if TIMER and/or HAPTIC is tried to be intialized or just "EVERYTHING" is used!! SDL_INIT_EVERYTHING & ~(SDL_INIT_TIMER | SDL_INIT_HAPTIC) #else SDL_INIT_EVERYTHING #endif ) != 0) { ERROR_WINDOW("Fatal SDL initialization problem: %s", SDL_GetError()); return 1; } if (config_init(argc, argv)) { #ifdef __EMSCRIPTEN__ ERROR_WINDOW("Error with config parsing. Please check the (javascript) console of your browser to learn about the error."); #endif return 1; } guarded_exit = 1; // turn on guarded exit, with custom de-init stuffs DEBUGPRINT("EMU: sleeping = \"%s\", timing = \"%s\"" NL, __SLEEP_METHOD_DESC, __TIMING_METHOD_DESC ); fileio_init( #ifdef __EMSCRIPTEN__ "/", #else app_pref_path, #endif "files"); if (screen_init()) return 1; if (xepgui_init()) return 1; audio_init(config_getopt_int("audio")); z80ex_init(); set_ep_cpu(CPU_Z80); ep_pixels = nick_init(); if (ep_pixels == NULL) return 1; snapshot = config_getopt_str("snapshot"); if (strcmp(snapshot, "none")) { if (ep128snap_load(snapshot)) snapshot = NULL; } else snapshot = NULL; if (!snapshot) { if (roms_load()) return 1; primo_rom_seg = primo_search_rom(); ep_set_ram_config(config_getopt_str("ram")); } mouse_setup(config_getopt_int("mousemode")); ep_reset(); kbd_matrix_reset(); joy_sdl_event(NULL); // this simply inits joy layer ... #ifdef CONFIG_SDEXT_SUPPORT if (!snapshot) sdext_init(); #endif #ifdef CONFIG_EXDOS_SUPPORT wd_exdos_reset(); wd_attach_disk_image(config_getopt_str("wdimg")); #endif #ifdef CONFIG_W5300_SUPPORT w5300_init(NULL); #endif ticks = SDL_GetTicks(); balancer = 0; set_cpu_clock(DEFAULT_CPU_CLOCK); emu_timekeeping_start(); audio_start(); if (config_getopt_int("fullscreen")) screen_set_fullscreen(1); DEBUGPRINT(NL "EMU: entering into main emulation loop" NL); sram_ready = 1; if (strcmp(config_getopt_str("primo"), "none") && !snapshot) { // TODO: da stuff ... primo_emulator_execute(); OSD("Primo Emulator Mode"); } if (snapshot) ep128snap_set_cpu_and_io(); console_monitor_ready(); // OK to run monitor on console now! #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(xep128_emulation, 50, 1); #else for (;;) xep128_emulation(); #endif printf("EXITING FROM main()?!" NL); return 0; }
int config_init ( int argc, char **argv ) { const char *config_name = DEFAULT_CONFIG_FILE; // name of the used config file, can be overwritten via CLI const struct configOption_st *opt; const char *exe = argv[0]; int default_config = 1; int testparsing = 0; argc--; argv++; #ifdef __EMSCRIPTEN__ exe = strdup("/files/emscripten-virtual-executable"); #endif #ifdef _WIN32 console_open_window(); #endif SDL_VERSION(&sdlver_compiled); SDL_GetVersion(&sdlver_linked); if (sdlver_linked.major < 2 || (sdlver_linked.minor == 0 && sdlver_linked.patch < 4)) { ERROR_WINDOW("Too old SDL library linked, at least version 2.0.4 is required."); return 1; } /* SDL info on paths */ if (get_path_info()) return 1; /* ugly hack: pre-parse comand line to find debug statement (to be worse, it does not handle single argument options too well ... */ #ifdef DISABLE_DEBUG printf("DEBUG: disabled at compilation time." NL); #else while (testparsing < argc) { if (!strcmp(argv[testparsing], "-" DEBUGFILE_OPT) && testparsing != argc - 1 && strcmp(argv[testparsing + 1], "none")) { debug_fp = fopen(argv[testparsing + 1], "w"); DEBUGPRINT("DEBUG: enable logging into file: %s" NL, argv[testparsing + 1]); if (debug_fp == NULL) fprintf(stderr, "Cannot open debug logging file: %s" NL, argv[testparsing + 1]); break; } testparsing++; } testparsing = 0; #endif /* end of ugly hack */ /* let's continue with the info block ... */ DEBUGPRINT("%s %s v%s %s %s" NL "GIT %s compiled by (%s) at (%s) with (%s)-(%s)" NL "Platform: (%s) (%d-bit), video: (%s), audio: (%s), " "SDL version compiled: (%d.%d.%d) and linked: (%d.%d.%d) rev (%s)" NL NL, WINDOW_TITLE, DESCRIPTION, VERSION, COPYRIGHT, PROJECT_PAGE, XEMU_BUILDINFO_GIT, XEMU_BUILDINFO_ON, XEMU_BUILDINFO_AT, CC_TYPE, XEMU_BUILDINFO_CC, SDL_GetPlatform(), ARCH_BITS, SDL_GetCurrentVideoDriver(), SDL_GetCurrentAudioDriver(), sdlver_compiled.major, sdlver_compiled.minor, sdlver_compiled.patch, sdlver_linked.major, sdlver_linked.minor, sdlver_linked.patch, SDL_GetRevision() ); DEBUGPRINT("PATH: executable: %s" NL, exe); /* SDL path info block printout */ DEBUGPRINT("PATH: SDL base path: %s" NL, app_base_path); DEBUGPRINT("PATH: SDL pref path: %s" NL, app_pref_path); #ifndef _WIN32 DEBUGPRINT("PATH: data directory: %s/" NL, DATADIR); #endif DEBUGPRINT("PATH: Current directory: %s" NL NL, current_directory); /* Look the very basic command line switches first */ if (argc && is_help_request_option(argv[0])) { opt = configOptions; printf("USAGE:" NL NL "\t%s -optname optval -optname2 optval2 ..." NL NL "OPTIONS:" NL NL "-config" NL "\tUse config file (or do not use the default one, if \"none\" is specified). This must be the first option if used! [default: @config]" NL, exe ); while (opt->name) { printf("-%s" NL "\t%s [default: %s]" NL, opt->name, opt->help, opt->defval ? opt->defval : "-"); opt++; } printf(NL "%s" NL, disclaimer); #ifdef _WIN32 if (!console_is_open) ERROR_WINDOW("Could not dump help, since console couldn't be allocated."); #endif XEMUEXIT(0); } DEBUGPRINT("%s" NL NL, disclaimer); if (argc && !strcasecmp(argv[0], "-testparsing")) { testparsing = 1; argc--; argv++; } if (argc & 1) { fprintf(stderr, "FATAL: Bad command line: should be even number of parameters (two for an option as key and its value)" NL); return 1; } if (argc > 1 && !strcmp(argv[0], "-config")) { default_config = 0; config_name = argv[1]; argc -= 2; argv += 2; } /* Set default (built-in) values */ opt = configOptions; while (opt->name) { if (opt->defval) config_set_internal(opt->name, -1, opt->defval); opt++; } config_set_internal("rom", 0, COMBINED_ROM_FN); // set default "combined" ROM image set (from segment 0, starting with EXOS) /* Default values for the keyboard follows ... */ keymap_preinit_config_internal(); /* check if we have written sample config file, if there is not, let's create one */ save_sample_config(DEFAULT_CONFIG_SAMPLE_FILE); /* now parse config file (not the sample one!) if there is any */ if (strcasecmp(config_name, "none")) { char path[PATH_MAX + 1]; FILE *f = open_emu_file(config_name, "r", path); DEBUGPRINT("CONFIG: config file: %s (%s)" NL, config_name, f ? path : "*** CANNOT OPEN, NOT USING CONFIG FILE ***"); if (f) { if (load_config_file_stream(f, path)) { fclose(f); return 1; } fclose(f); } else if (!default_config) { fprintf(stderr, "FATAL: Cannot open requested config file: %s" NL, config_name); return 1; } else DEBUGPRINT("CONFIG: Skipping default config file (cannot open), using built-in defaults." NL); } else DEBUGPRINT("CONFIG: Using config file: DISABLED in command line" NL); /* parse command line ... */ if (parse_command_line(argc, argv)) return -1; /* open debug file, if it was not requested via command line at the beginning ... */ if (!debug_fp && strcmp(config_getopt_str(DEBUGFILE_OPT), "none")) { debug_fp = fopen(config_getopt_str(DEBUGFILE_OPT), "w"); DEBUGPRINT("DEBUG: enable logging into file: %s" NL, config_getopt_str(DEBUGFILE_OPT)); if (!debug_fp) ERROR_WINDOW("Cannot open debug messages log file requested: %s", config_getopt_str(DEBUGFILE_OPT)); } if (debug_fp) INFO_WINDOW("DEBUG: Debug messages logging is active"); else printf("DEBUG: No debug messages logging is active." NL); /* test parsing mode? */ if (testparsing) { printf(NL "--- TEST DUMP OF *PARSED* CONFIGURATION (requested)" NL NL); dump_config(stdout); printf(NL "--- END OF TEST PARSING MODE (requested)" NL); XEMUEXIT(0); } DEBUG("CONFIG: End of configuration step." NL NL); /* Close console, unless user requested it with the -console option */ #ifdef _WIN32 if (!config_getopt_int("console")) console_close_window(); #else if (config_getopt_int("console")) console_open_window(); // on non-windows, it only will mark console as open for monitor to be used .. #endif return 0; }