/*************************************************************************** * MountDVD * * return 0 on error, 1 on success ***************************************************************************/ static int MountDVD(void) { GUI_MsgBoxOpen("Information", "Mounting DVD ...",1); /* check if DVD is already mounted */ if (dvd_mounted) { /* unmount DVD */ ISO9660_Unmount("dvd:"); dvd_mounted = 0; } /* check if disc is found */ if(!dvd->isInserted()) { GUI_WaitPrompt("Error","No Disc inserted !"); return 0; } /* mount DVD */ if(!ISO9660_Mount("dvd",dvd)) { GUI_WaitPrompt("Error","Disc can not be read !"); return 0; } /* DVD is mounted */ dvd_mounted = 1; GUI_MsgBoxClose(); return 1; }
/*************************************************************************** * FAT_ParseDirectory * * List files into one FAT directory ***************************************************************************/ int FAT_ParseDirectory(void) { int nbfiles = 0; char filename[MAXPATHLEN]; struct stat filestat; /* open directory */ DIR_ITER *dir = diropen (fatdir); if (dir == NULL) { GUI_WaitPrompt("Error","Unable to open directory !"); return -1; } while ((dirnext(dir, filename, &filestat) == 0) && (nbfiles < MAXFILES)) { if (strcmp(filename,".") != 0) { memset(&filelist[nbfiles], 0, sizeof (FILEENTRIES)); sprintf(filelist[nbfiles].filename,"%s",filename); filelist[nbfiles].length = filestat.st_size; filelist[nbfiles].flags = (filestat.st_mode & S_IFDIR) ? 1 : 0; nbfiles++; } } dirclose(dir); /* Sort the file list */ qsort(filelist, nbfiles, sizeof(FILEENTRIES), FileSortCallback); return nbfiles; }
/***************************************************************************** * UnZipBuffer * * It should be noted that there is a limit of 5MB total size for any ROM ******************************************************************************/ int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, char *filename) { PKZIPHEADER pkzip; int zipoffset = 0; int zipchunk = 0; char out[ZIPCHUNK]; z_stream zs; int res; int bufferoffset = 0; int have = 0; char readbuffer[2048]; char msg[128]; FILE *fatfile = NULL; /*** FAT file support ***/ if (filename) { fatfile = fopen(filename, "rb"); if (fatfile == NULL) return 0; } /*** Read Zip Header ***/ if (fatfile) { fseek(fatfile, 0, SEEK_SET); fread(readbuffer, FATCHUNK, 1, fatfile); } else { dvd_read (&readbuffer, DVDCHUNK, discoffset); } /*** Copy PKZip header to local, used as info ***/ memcpy (&pkzip, &readbuffer, sizeof (PKZIPHEADER)); sprintf (msg, "Unzipping %d bytes ...", FLIP32 (pkzip.uncompressedSize)); GUI_MsgBoxOpen("Information",msg,1); /*** Prepare the zip stream ***/ memset (&zs, 0, sizeof (z_stream)); zs.zalloc = Z_NULL; zs.zfree = Z_NULL; zs.opaque = Z_NULL; zs.avail_in = 0; zs.next_in = Z_NULL; res = inflateInit2 (&zs, -MAX_WBITS); if (res != Z_OK) { GUI_WaitPrompt("Error","Unable to unzip file !"); return 0; } /*** Set ZipChunk for first pass ***/ zipoffset = (sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) + FLIP16 (pkzip.extraDataLength)); zipchunk = ZIPCHUNK - zipoffset; /*** Now do it! ***/ do { zs.avail_in = zipchunk; zs.next_in = (Bytef *) & readbuffer[zipoffset]; /*** Now inflate until input buffer is exhausted ***/ do { zs.avail_out = ZIPCHUNK; zs.next_out = (Bytef *) & out; res = inflate (&zs, Z_NO_FLUSH); if (res == Z_MEM_ERROR) { inflateEnd (&zs); GUI_WaitPrompt("Error","Unable to unzip file !"); return 0; } have = ZIPCHUNK - zs.avail_out; if (have) { /*** Copy to normal block buffer ***/ memcpy (&outbuffer[bufferoffset], &out, have); bufferoffset += have; } } while (zs.avail_out == 0); /*** Readup the next 2k block ***/ zipoffset = 0; zipchunk = ZIPCHUNK; if (fatfile) { fread(readbuffer, FATCHUNK, 1, fatfile); } else { discoffset += DVDCHUNK; dvd_read (&readbuffer, DVDCHUNK, discoffset); } } while (res != Z_STREAM_END); inflateEnd (&zs); /* close file */ if (fatfile) fclose(fatfile); if (res == Z_STREAM_END) { if (FLIP32 (pkzip.uncompressedSize) == (u32) bufferoffset) return bufferoffset; else return FLIP32 (pkzip.uncompressedSize); } return 0; }
int slot_save(int slot, int device) { char filename[MAXPATHLEN]; int filesize, done = 0; int offset = device ? 2112 : 0; u8 *savebuffer; if (slot > 0) { /* allocate buffer */ savebuffer = (u8 *)memalign(32,STATE_SIZE); if (!savebuffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); return 0; } GUI_MsgBoxOpen("Information","Saving State ...",1); filesize = state_save(&savebuffer[offset]); } else { if (!sram.on) { GUI_WaitPrompt("Error","SRAM is disabled !"); return 0; } /* allocate buffer */ savebuffer = (u8 *)memalign(32,0x10000+offset); if (!savebuffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); return 0; } GUI_MsgBoxOpen("Information","Saving SRAM ...",1); memcpy(&savebuffer[offset], sram.sram, 0x10000); sram.crc = crc32(0, sram.sram, 0x10000); filesize = 0x10000; } if (!device) { /* FAT support */ if (slot > 0) sprintf(filename, "%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); else sprintf(filename, "%s/saves/%s.srm", DEFAULT_PATH, rom_filename); /* Open file */ FILE *fp = fopen(filename, "wb"); if (!fp) { GUI_WaitPrompt("Error","Unable to open file !"); free(savebuffer); return 0; } /* Write from buffer (2k blocks) */ while (filesize > FILECHUNK) { fwrite(savebuffer + done, FILECHUNK, 1, fp); done += FILECHUNK; filesize -= FILECHUNK; } /* Write remaining bytes */ fwrite(savebuffer + done, filesize, 1, fp); done += filesize; fclose(fp); } else { /* Memory Card support */ if (slot > 0) sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1); else sprintf(filename, "MD-%04X.srm", rominfo.realchecksum); /* Initialise the CARD system */ char action[64]; memset(&SysArea, 0, CARD_WORKAREA); CARD_Init("GENP", "00"); /* CARD slot */ device--; /* Attempt to mount the card */ if (!CardMount(device)) { GUI_WaitPrompt("Error","Unable to mount memory card"); free(savebuffer); return 0; } /* Retrieve the sector size */ u32 SectorSize = 0; int CardError = CARD_GetSectorSize(device, &SectorSize); if (!SectorSize) { sprintf(action, "Invalid sector size (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); free(savebuffer); return 0; } /* Build the output buffer */ char comment[2][32] = { {"Genesis Plus GX"}, {"SRAM Save"} }; strcpy (comment[1], filename); memcpy (&savebuffer[0], &icon, 2048); memcpy (&savebuffer[2048], &comment[0], 64); /* Adjust file size */ filesize += 2112; if (filesize % SectorSize) filesize = ((filesize / SectorSize) + 1) * SectorSize; /* Check if file already exists */ card_file CardFile; if (CARD_Open(device, filename, &CardFile) == CARD_ERROR_READY) { int size = filesize - CardFile.len; CARD_Close(&CardFile); memset(&CardFile,0,sizeof(CardFile)); /* Check file new size */ if (size > 0) { CardError = CARD_Create(device, "TEMP", size, &CardFile); if (CardError) { sprintf(action, "Unable to increase file size (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); free(savebuffer); return 0; } /* delete temporary file */ CARD_Close(&CardFile); memset(&CardFile,0,sizeof(CardFile)); CARD_Delete(device, "TEMP"); } /* delete previously existing file */ CARD_Delete(device, filename); } /* Create a new file */ CardError = CARD_Create(device, filename, filesize, &CardFile); if (CardError) { sprintf(action, "Unable to create file (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); free(savebuffer); return 0; } /* Update file informations */ time_t rawtime; time(&rawtime); card_stat CardStatus; CARD_GetStatus(device, CardFile.filenum, &CardStatus); CardStatus.icon_addr = 0x0; CardStatus.icon_fmt = 2; CardStatus.icon_speed = 1; CardStatus.comment_addr = 2048; CardStatus.time = rawtime; CARD_SetStatus(device, CardFile.filenum, &CardStatus); /* Write file sectors */ while (filesize > 0) { CARD_Write(&CardFile, &savebuffer[done], SectorSize, done); filesize -= SectorSize; done += SectorSize; } /* Close file */ CARD_Close(&CardFile); CARD_Unmount(device); } GUI_MsgBoxClose(); free(savebuffer); /* Save screenshot */ if (slot && !device) { sprintf(filename,"%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); gxSaveScreenshot(filename); } return 1; }
int slot_load(int slot, int device) { char filename[MAXPATHLEN]; int filesize, done = 0; int offset = 0; u8 *savebuffer; if (slot > 0) { GUI_MsgBoxOpen("Information","Loading State ...",1); } else { if (!sram.on) { GUI_WaitPrompt("Error","SRAM is disabled !"); return 0; } GUI_MsgBoxOpen("Information","Loading SRAM ...",1); } if (!device) { /* FAT support */ if (slot > 0) sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); else sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); /* Open file */ FILE *fp = fopen(filename, "rb"); if (!fp) { GUI_WaitPrompt("Error","Unable to open file !"); return 0; } /* Read size */ fseek(fp, 0, SEEK_END); filesize = ftell(fp); fseek(fp, 0, SEEK_SET); /* allocate buffer */ savebuffer = (u8 *)memalign(32,filesize); if (!savebuffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); fclose(fp); return 0; } /* Read into buffer (2k blocks) */ while (filesize > FILECHUNK) { fread(savebuffer + done, FILECHUNK, 1, fp); done += FILECHUNK; filesize -= FILECHUNK; } /* Read remaining bytes */ fread(savebuffer + done, filesize, 1, fp); done += filesize; fclose(fp); } else { /* Memory Card support */ if (slot > 0) sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1); else sprintf(filename, "MD-%04X.srm", rominfo.realchecksum); /* Initialise the CARD system */ char action[64]; memset(&SysArea, 0, CARD_WORKAREA); CARD_Init("GENP", "00"); /* CARD slot */ device--; /* Attempt to mount the card */ if (!CardMount(device)) { GUI_WaitPrompt("Error","Unable to mount memory card"); return 0; } /* Retrieve the sector size */ u32 SectorSize = 0; int CardError = CARD_GetSectorSize(device, &SectorSize); if (!SectorSize) { sprintf(action, "Invalid sector size (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); return 0; } /* Open file */ card_file CardFile; CardError = CARD_Open(device, filename, &CardFile); if (CardError) { sprintf(action, "Unable to open file (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); return 0; } /* Retrieve file size */ filesize = CardFile.len; if (filesize % SectorSize) filesize = ((filesize / SectorSize) + 1) * SectorSize; /* Allocate buffer */ savebuffer = (u8 *)memalign(32,filesize); if (!savebuffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); CARD_Close(&CardFile); CARD_Unmount(device); return 0; } /* Read file sectors */ while (filesize > 0) { CARD_Read(&CardFile, &savebuffer[done], SectorSize, done); done += SectorSize; filesize -= SectorSize; } CARD_Close(&CardFile); CARD_Unmount(device); offset = 2112; } if (slot > 0) { /* Load state */ if (!state_load(&savebuffer[offset])) { free(savebuffer); GUI_WaitPrompt("Error","Unable to load state !"); return 0; } } else { /* Load SRAM & update CRC */ memcpy(sram.sram, &savebuffer[offset], 0x10000); sram.crc = crc32(0, sram.sram, 0x10000); } free(savebuffer); GUI_MsgBoxClose(); return 1; }
int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) { int size = 0; char in[CHUNKSIZE]; char msg[64]; char type[16]; /* Open file */ FILE *fd = fopen(filename, "rb"); /* Autodetect needed System ROM files */ if (filename == CD_BIOS_US) { sprintf(type,"CD BIOS (USA)"); } else if (filename == CD_BIOS_EU) { sprintf(type,"CD BIOS (PAL)"); } else if (filename == CD_BIOS_JP) { sprintf(type,"CD BIOS (JAP)"); } else if (filename == AR_ROM) { sprintf(type,"Action Replay"); } else if (filename == GG_ROM) { sprintf(type,"Game Genie"); } else if (filename == SK_ROM) { sprintf(type,"S&K (2MB ROM)"); } else if (filename == SK_UPMEM) { sprintf(type,"S2&K (256K ROM)"); } else if ((filename == MS_BIOS_US) || (filename == MS_BIOS_EU) || (filename == MS_BIOS_JP) || (filename == GG_BIOS) || (filename == MD_BIOS)) { /* Mega Drive / Genesis, Master System & Game Gear BIOS are optional so we disable error messages */ SILENT = 1; } else { sprintf(type,"file"); } if (!fd) { sprintf(msg,"Unable to open %s", type); GUI_WaitPrompt("Error", msg); SILENT = 0; return 0; } /* Read first chunk */ fread(in, CHUNKSIZE, 1, fd); /* Detect Zip file */ if (memcmp(in, "PK", 2) == 0) { /* Inflate buffer */ char out[CHUNKSIZE]; /* PKZip header pointer */ PKZIPHEADER *pkzip = (PKZIPHEADER *) in; /* Retrieve uncompressed ROM size */ size = FLIP32(pkzip->uncompressedSize); /* Check ROM size */ if (size > MAXROMSIZE) { fclose(fd); GUI_WaitPrompt("Error","File is too large"); SILENT = 0; return 0; } else if (size > maxsize) { size = maxsize; } sprintf (msg, "Unzipping %d bytes ...", size); GUI_MsgBoxUpdate("Information",msg); /* Initialize zip stream */ z_stream zs; memset (&zs, 0, sizeof (z_stream)); zs.zalloc = Z_NULL; zs.zfree = Z_NULL; zs.opaque = Z_NULL; zs.avail_in = 0; zs.next_in = Z_NULL; int res = inflateInit2(&zs, -MAX_WBITS); if (res != Z_OK) { fclose(fd); sprintf(msg,"Unable to unzip %s", type); GUI_WaitPrompt("Error",msg); SILENT = 0; return 0; } /* Compressed filename offset */ int offset = sizeof (PKZIPHEADER) + FLIP16(pkzip->filenameLength); if (extension) { memcpy(extension, &in[offset - 3], 3); extension[3] = 0; } /* Initial Zip buffer offset */ offset += FLIP16(pkzip->extraDataLength); zs.next_in = (Bytef *)&in[offset]; /* Initial Zip remaining chunk size */ zs.avail_in = CHUNKSIZE - offset; /* Initialize output size */ size = 0; /* Start unzipping file */ do { /* Inflate data until output buffer is empty */ do { zs.avail_out = CHUNKSIZE; zs.next_out = (Bytef *) out; res = inflate(&zs, Z_NO_FLUSH); if (res == Z_MEM_ERROR) { inflateEnd(&zs); fclose(fd); sprintf(msg,"Unable to unzip %s", type); GUI_WaitPrompt("Error",msg); SILENT = 0; return 0; } offset = CHUNKSIZE - zs.avail_out; if ((size + offset) > maxsize) { offset = maxsize - size; } if (offset) { memcpy(buffer, out, offset); buffer += offset; size += offset; } } while ((zs.avail_out == 0) && (size < maxsize)); /* Read next chunk of zipped data */ fread(in, CHUNKSIZE, 1, fd); zs.next_in = (Bytef *)&in[0]; zs.avail_in = CHUNKSIZE; } while ((res != Z_STREAM_END) && (size < maxsize)); inflateEnd (&zs); } else { /* Get file size */ fseek(fd, 0, SEEK_END); size = ftell(fd); fseek(fd, 0, SEEK_SET); /* Check ROM size */ if (size > MAXROMSIZE) { fclose(fd); GUI_WaitPrompt("Error","File is too large"); SILENT = 0; return 0; } else if (size > maxsize) { size = maxsize; } sprintf((char *)msg,"Loading %d bytes ...", size); GUI_MsgBoxUpdate("Information", (char *)msg); /* filename extension */ if (extension) { memcpy(extension, &filename[strlen(filename) - 3], 3); extension[3] = 0; } /* Read into buffer */ int left = size; while (left > CHUNKSIZE) { fread(buffer, CHUNKSIZE, 1, fd); buffer += CHUNKSIZE; left -= CHUNKSIZE; } /* Read remaining bytes */ fread(buffer, left, 1, fd); } /* Close file */ fclose(fd); /* Return loaded ROM size */ SILENT = 0; return size; }
void config_default(void) { /* version TAG */ strncpy(config.version,CONFIG_VERSION,16); /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; config.psgBoostNoise = 1; config.filter = 1; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.low_freq = 880; config.high_freq = 5000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.dac_bits = 14; config.ym2413 = 2; /* AUTO */ config.mono = 0; /* system options */ config.system = 0; /* AUTO */ config.region_detect = 0; /* AUTO */ config.vdp_mode = 0; /* AUTO */ config.master_clock = 0; /* AUTO */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; config.hot_swap = 0; /* video options */ config.xshift = 0; config.yshift = 0; config.xscale = 0; config.yscale = 0; config.aspect = 1; config.overscan = 3; /* FULL */ config.gg_extra = 0; config.lcd = 0; config.ntsc = 0; config.vsync = 1; /* AUTO */ config.bilinear = 0; config.vfilter = 1; if (VIDEO_HaveComponentCable()) { config.render = 2; } else { config.render = 0; } switch (vmode->viTVMode >> 2) { case VI_PAL: config.tv_mode = 1; /* 50hz only */ break; case VI_EURGB60: config.tv_mode = 2; /* 50/60hz */ break; default: config.tv_mode = 0; /* 60hz only */ break; } #ifdef HW_RVL config.trap = 0; config.gamma = VI_GM_1_0 / 10.0; #else config.v_prog = 1; #endif /* NTSC filter options */ config.ntsc_sharpness = 0.0; config.ntsc_resolution = 0.0; config.ntsc_artifacts = 0.0; config.ntsc_fringing = 0.0; config.ntsc_bleed = 0.0; /* controllers options */ config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; /* on-screen options */ config.cd_leds = 0; config.fps = 0; /* menu options */ config.autoload = 0; config.autocheat = 0; config.s_auto = 1; config.s_default = 1; config.s_device = 0; config.bg_overlay = 0; config.screen_w = 658; config.bgm_volume = 100.0; config.sfx_volume = 100.0; #ifdef HW_RVL config.autosleep = 1; config.calx = 0; config.caly = 0; #endif /* default ROM directories */ #ifdef HW_RVL DIR *dir = opendir("sd:/"); if (dir) { config.l_device = TYPE_SD; closedir(dir); } else { config.l_device = TYPE_USB; } sprintf (config.lastdir[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #else config.l_device = TYPE_SD; sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #endif /* system ROM paths */ sprintf (config.sys_rom[0], "%s/bios/bios_CD_U.bin", DEFAULT_PATH); sprintf (config.sys_rom[1], "%s/bios/bios_CD_E.bin", DEFAULT_PATH); sprintf (config.sys_rom[2], "%s/bios/bios_CD_J.bin", DEFAULT_PATH); sprintf (config.sys_rom[3], "%s/bios/bios_MD.bin", DEFAULT_PATH); sprintf (config.sys_rom[4], "%s/bios/bios_U.sms", DEFAULT_PATH); sprintf (config.sys_rom[5], "%s/bios/bios_E.sms", DEFAULT_PATH); sprintf (config.sys_rom[6], "%s/bios/bios_J.sms", DEFAULT_PATH); sprintf (config.sys_rom[7], "%s/bios/bios.gg", DEFAULT_PATH); sprintf (config.sys_rom[8], "%s/lock-on/ggenie.bin", DEFAULT_PATH); sprintf (config.sys_rom[9], "%s/lock-on/areplay.bin", DEFAULT_PATH); sprintf (config.sys_rom[10], "%s/lock-on/sk.bin", DEFAULT_PATH); sprintf (config.sys_rom[11], "%s/lock-on/sk2chip.bin", DEFAULT_PATH); /* try to restore user config */ int loaded = config_load(); #ifdef HW_RVL /* initialize WPAD timeout */ WPAD_SetIdleTimeout(config.autosleep ? 300 : 1800); #else /* check if component cable was detected */ if (VIDEO_HaveComponentCable()) { /* when component cable is detected, libogc automatically enables progressive mode */ /* as preferred video mode but it could still be used on TV not supporting 480p/576p */ PAD_ScanPads(); /* detect progressive mode switch requests */ if (PAD_ButtonsHeld(0) & PAD_BUTTON_B) { /* swap progressive mode enable flag */ config.v_prog ^= 1; /* play some sound to inform user */ ASND_Pause(0); int voice = ASND_GetFirstUnusedVoice(); ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL); sleep (2); ASND_Pause(1); } /* check if progressive mode should be disabled */ if (!config.v_prog) { /* switch menu video mode to interlaced */ vmode->viTVMode = (vmode->viTVMode & ~3) | VI_INTERLACE; VIDEO_Configure(vmode); VIDEO_Flush(); VIDEO_WaitVSync(); VIDEO_WaitVSync(); } } #endif /* inform user if default config is used */ if (!loaded) { GUI_WaitPrompt("Warning","Default Settings restored"); gx_input_SetDefault(); } /* default emulated inputs */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = (config.input[1].device != -1) ? SYSTEM_GAMEPAD : NO_SYSTEM; input_init(); }
/**************************************************************************** * OpenDir * * Function to open a directory and load ROM file list. ****************************************************************************/ int OpenDirectory(int device, int type) { int max = 0; if (device == TYPE_RECENT) { /* fetch history list */ int i; for(i=0; i < NUM_HISTORY_ENTRIES; i++) { if(history.entries[i].filepath[0] > 0) { filelist[i].flags = 0; strncpy(filelist[i].filename,history.entries[i].filename, MAXJOLIET-1); filelist[i].filename[MAXJOLIET-1] = '\0'; max++; } else { /* Found the end of the list. */ break; } } } else { /* only DVD hot swap is supported */ if (device == TYPE_DVD) { /* try to access root directory */ DIR *dir = opendir(rootdir[TYPE_DVD]); if (dir == NULL) { /* mount DVD */ if (!MountDVD()) return 0; deviceType = -1; } else { closedir(dir); } } /* parse last directory */ fileDir = config.lastdir[type][device]; max = ParseDirectory(); if (max <= 0) { /* parse root directory */ strcpy(fileDir, rootdir[device]); max = ParseDirectory(); if (max < 0) { GUI_WaitPrompt("Error","Unable to open directory !"); return 0; } deviceType = -1; } } if (max == 0) { GUI_WaitPrompt("Error","No files found !"); return 0; } /* check if device or file type has changed */ if ((device != deviceType) || (type != fileType)) { /* reset current types */ deviceType = device; fileType = type; /* reset File selector */ ClearSelector(max); } return 1; }
/**************************************************************************** * LoadFile * * This function will load a game file into the ROM buffer. * This functions return the actual size of data copied into the buffer * ****************************************************************************/ int LoadFile(int selection) { int size, cd_mode1, filetype; char filename[MAXPATHLEN]; /* file path */ char *filepath = (deviceType == TYPE_RECENT) ? history.entries[selection].filepath : fileDir; /* full filename */ sprintf(filename, "%s%s", filepath, filelist[selection].filename); /* DVD hot swap */ if (!strncmp(filepath, rootdir[TYPE_DVD], strlen(rootdir[TYPE_DVD]))) { /* Check if file is still accessible */ struct stat filestat; if(stat(filename, &filestat) != 0) { /* If not, try to mount DVD */ if (!MountDVD()) return 0; } } /* open message box */ GUI_MsgBoxOpen("Information", "Loading game...", 1); /* no cartridge or CD game loaded */ size = cd_mode1 = 0; /* check if virtual CD tray was open */ if ((system_hw == SYSTEM_MCD) && (cdd.status == CD_OPEN)) { /* swap CD image file in (without changing region, system,...) */ size = cdd_load(filename, (char *)(cdc.ram)); /* check if a cartridge is currently loaded */ if (scd.cartridge.boot) { /* CD Mode 1 */ cd_mode1 = size; } else { /* update game informations from CD image file header */ getrominfo((char *)(cdc.ram)); } } /* no CD image file loaded */ if (!size) { /* close CD tray to force system reset */ cdd.status = NO_DISC; /* load game file */ size = load_rom(filename); } if (size > 0) { /* do not update game basename if a CD was loaded with a cartridge (Mode 1) */ if (cd_mode1) { /* add CD image file to history list */ filetype = 1; } else { /* auto-save previous game state */ slot_autosave(config.s_default,config.s_device); /* update game basename (for screenshot, save & cheat files) */ if (romtype & SYSTEM_SMS) { /* Master System ROM file */ filetype = 2; sprintf(rom_filename,"ms/%s",filelist[selection].filename); } else if (romtype & SYSTEM_GG) { /* Game Gear ROM file */ filetype = 3; sprintf(rom_filename,"gg/%s",filelist[selection].filename); } else if (romtype == SYSTEM_SG) { /* SG-1000 ROM file */ filetype = 4; sprintf(rom_filename,"sg/%s",filelist[selection].filename); } else if (romtype == SYSTEM_MCD) { /* CD image file */ filetype = 1; sprintf(rom_filename,"cd/%s",filelist[selection].filename); } else { /* by default, Genesis ROM file */ filetype = 0; sprintf(rom_filename,"md/%s",filelist[selection].filename); } /* remove file extension */ int i = strlen(rom_filename) - 1; while ((i > 0) && (rom_filename[i] != '.')) i--; if (i > 0) rom_filename[i] = 0; } /* add/move the file to the top of the history. */ history_add_file(filepath, filelist[selection].filename, filetype); /* recent file list may have changed */ if (deviceType == TYPE_RECENT) deviceType = -1; /* close message box */ GUI_MsgBoxClose(); /* valid image has been loaded */ return 1; } GUI_WaitPrompt("Error", "Unable to load game"); return 0; }
/**************************************************************************** * OpenFAT * * Function to load a FAT directory and display to user. ****************************************************************************/ int FAT_Open(int type) { int max = 0; char root[10] = ""; /* FAT header */ #ifdef HW_RVL if (type == TYPE_SD) sprintf (root, "sd:"); else if (type == TYPE_USB) sprintf (root, "usb:"); #endif /* if FAT device type changed, reload filelist */ if (fat_type != type) { fat_type = type; haveFATdir = 0; } /* update filelist */ if (haveFATdir == 0) { useHistory = 0; if (type == TYPE_RECENT) { /* fetch history list */ useHistory = 1; int i; for(i=0; i < NUM_HISTORY_ENTRIES; i++) { if(history.entries[i].filepath[0] > 0) { filelist[i].offset = 0; filelist[i].length = 0; filelist[i].flags = 0; strncpy(filelist[i].filename, history.entries[i].filename, MAXJOLIET-1); filelist[i].filename[MAXJOLIET-1] = '\0'; max++; } else { /* Found the end of the list. */ break; } } } else { /* reset root directory */ sprintf (fatdir, "%s%s/roms/", root, DEFAULT_PATH); /* if directory doesn't exist, use root as default */ DIR_ITER *dir = diropen(fatdir); if (dir == NULL) sprintf (fatdir, "%s/", root); else dirclose(dir); /* parse root directory */ max = FAT_ParseDirectory (); } if (max > 0) { /* FAT is default */ haveFATdir = 1; DVD_ClearDirectory(); /* reset File selector */ ClearSelector(max); return 1; } else { /* no entries found */ if (max == 0) GUI_WaitPrompt("Error","No files found !"); return 0; } } return 1; }
/**************************************************************************** * FAT_LoadFile * * This function will load a BIN, SMD or ZIP file from DVD into the ROM buffer. * This functions return the actual size of data copied into the buffer * ****************************************************************************/ int FAT_LoadFile(u8 *buffer, u32 selection) { /* If loading from history then we need to setup a few more things. */ if(useHistory) { /* Get the parent folder for the file. */ strncpy(fatdir, history.entries[selection].filepath, MAXJOLIET-1); fatdir[MAXJOLIET-1] = '\0'; /* Get the length of the file. This has to be done * before calling LoadFile(). */ char filepath[MAXJOLIET]; struct stat filestat; snprintf(filepath, MAXJOLIET-1, "%s%s", history.entries[selection].filepath, history.entries[selection].filename); filepath[MAXJOLIET-1] = '\0'; if(stat(filepath, &filestat) == 0) { filelist[selection].length = filestat.st_size; } /* update filelist */ haveFATdir = 0; } /* file size */ int length = filelist[selection].length; if (length > 0) { /* Add/move the file to the top of the history. */ history_add_file(fatdir, filelist[selection].filename); /* full filename */ char fname[MAXPATHLEN]; sprintf(fname, "%s%s",fatdir,filelist[selection].filename); /* open file */ FILE *sdfile = fopen(fname, "rb"); if (sdfile == NULL) { GUI_WaitPrompt("Error","Unable to open file !"); haveFATdir = 0; return 0; } /* Read first data chunk */ unsigned char temp[FATCHUNK]; fread(temp, FATCHUNK, 1, sdfile); fclose(sdfile); /* determine file type */ if (!IsZipFile ((char *) temp)) { /* re-open and read file */ sdfile = fopen(fname, "rb"); if (sdfile) { char msg[50]; sprintf(msg,"Loading %d bytes ...", length); GUI_MsgBoxOpen("Information",msg,1); int i = 0; while (length > FATCHUNK) { fread(buffer+i, FATCHUNK, 1, sdfile); length -= FATCHUNK; i += FATCHUNK; } fread(buffer+i, length, 1, sdfile); fclose(sdfile); return filelist[selection].length; } } else { /* unzip file */ return UnZipBuffer (buffer, 0, fname); } } return 0; }
void config_default(void) { /* version TAG */ strncpy(config.version,CONFIG_VERSION,16); /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; config.psgBoostNoise = 1; config.filter = 1; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.low_freq = 880; config.high_freq = 5000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.dac_bits = 14; config.ym2413 = 2; /* AUTO */ config.mono = 0; /* system options */ config.system = 0; /* AUTO */ config.region_detect = 0; /* AUTO */ config.vdp_mode = 0; /* AUTO */ config.master_clock = 0; /* AUTO */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; config.hot_swap = 0; /* video options */ config.xshift = 0; config.yshift = 0; config.xscale = 0; config.yscale = 0; config.aspect = 1; config.overscan = 3; /* FULL */ config.gg_extra = 0; config.ntsc = 0; config.vsync = 1; /* AUTO */ config.bilinear = 1; config.vfilter = 1; if (VIDEO_HaveComponentCable()) { config.render = 2; } else { config.render = 0; } switch (vmode->viTVMode >> 2) { case VI_PAL: config.tv_mode = 1; /* 50hz only */ break; case VI_EURGB60: config.tv_mode = 2; /* 50/60hz */ break; default: config.tv_mode = 0; /* 60hz only */ break; } #ifdef HW_RVL config.trap = 0; config.gamma = VI_GM_1_0 / 10.0; #endif /* controllers options */ config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; /* on-screen options */ config.cd_leds = 0; /* menu options */ config.autoload = 0; config.autocheat = 0; #ifdef HW_RVL config.s_auto = 1; #else config.s_auto = 0; config.v_prog = 1; #endif config.s_default = 1; config.s_device = 0; config.l_device = 0; config.bg_overlay = 0; config.screen_w = 658; config.bgm_volume = 100.0; config.sfx_volume = 100.0; /* default ROM directories */ #ifdef HW_RVL sprintf (config.lastdir[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #else sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #endif /* try to restore user config */ int loaded = config_load(); #ifndef HW_RVL /* detect progressive mode enable/disable requests */ PAD_ScanPads(); if (PAD_ButtonsHeld(0) & PAD_BUTTON_B) { /* swap progressive mode enable flag and play some sound to inform user */ config.v_prog ^= 1; ASND_Pause(0); int voice = ASND_GetFirstUnusedVoice(); ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL); sleep (2); ASND_Pause(1); } /* switch into 480p if component cable has been detected and progressive mode is enabled */ if (VIDEO_HaveComponentCable() && config.v_prog) { vmode = &TVNtsc480Prog; VIDEO_Configure (vmode); VIDEO_Flush(); VIDEO_WaitVSync(); VIDEO_WaitVSync(); } #endif /* inform user if default config is used */ if (!loaded) { GUI_WaitPrompt("Warning","Default Settings restored"); gx_input_SetDefault(); } /* default emulated inputs */ input.system[0] = SYSTEM_MD_GAMEPAD; input.system[1] = (config.input[1].device != -1) ? SYSTEM_MD_GAMEPAD : NO_SYSTEM; input_init(); }
void config_default(void) { /* version TAG */ strncpy(config.version,CONFIG_VERSION,16); /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; config.psgBoostNoise = 0; config.filter = 1; config.lp_range = 50; config.low_freq = 880; config.high_freq = 5000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.rolloff = 0.995; config.dac_bits = 14; /* system options */ config.region_detect = 0; config.force_dtack = 0; config.addr_error = 1; config.tmss = 0; config.lock_on = 0; config.romtype = 0; config.hot_swap = 0; /* video options */ config.xshift = 0; config.yshift = 0; config.xscale = 0; config.yscale = 0; config.aspect = 1; config.overscan = 3; config.ntsc = 0; if (VIDEO_HaveComponentCable()) { config.render = 2; config.bilinear = 1; #ifdef HW_RVL config.trap = 1; #endif } else { config.render = 0; config.bilinear = 0; #ifdef HW_RVL config.trap = 0; #endif } #ifdef HW_RVL config.gamma = VI_GM_1_0 / 10.0; #endif /* controllers options */ config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; gx_input_SetDefault(); /* menu options */ config.autoload = 0; config.autocheat = 0; #ifdef HW_RVL config.s_auto = 1; #else config.s_auto = 0; #endif config.s_default = 1; config.s_device = 0; config.bg_type = 0; config.bg_overlay = 1; config.screen_w = 658; config.bgm_volume = 100.0; config.sfx_volume = 100.0; /* default ROM directories */ #ifdef HW_RVL sprintf (config.lastdir[TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #else sprintf (config.lastdir[TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #endif /* try to restore settings from config file */ if (!config_load()) GUI_WaitPrompt("Info","Default Settings restored"); /* restore inputs */ input_init(); /* restore menu settings */ menu_configure(); }