// for various file operations, usually called during image file load, power on/off and reset static void NST_CALLBACK DoFileIO(void *userData, User::File& file) { unsigned char *compbuffer; int compsize, compoffset; char mbstr[512]; switch (file.GetAction()) { case User::File::LOAD_ROM: wcstombs(mbstr, file.GetName(), 511); if (auxio_load_archive(lastarchname, &compbuffer, &compsize, &compoffset, (const char *)mbstr)) { file.SetContent((const void*)&compbuffer[compoffset], (unsigned long int)compsize); free(compbuffer); } break; case User::File::LOAD_SAMPLE: case User::File::LOAD_SAMPLE_MOERO_PRO_YAKYUU: case User::File::LOAD_SAMPLE_MOERO_PRO_YAKYUU_88: case User::File::LOAD_SAMPLE_MOERO_PRO_TENNIS: case User::File::LOAD_SAMPLE_TERAO_NO_DOSUKOI_OOZUMOU: case User::File::LOAD_SAMPLE_AEROBICS_STUDIO: wcstombs(mbstr, file.GetName(), 511); if (auxio_load_archive(lastarchname, &compbuffer, &compsize, &compoffset, (const char *)mbstr)) { int chan, bits, rate; if (!strncmp((const char *)compbuffer, "RIFF", 4)) { chan = compbuffer[20] | compbuffer[21]<<8; rate = compbuffer[24] | compbuffer[25]<<8 | compbuffer[26]<<16 | compbuffer[27]<<24; bits = compbuffer[34] | compbuffer[35]<<8; // std::cout << "WAV has " << chan << " chan, " << bits << " bits per sample, rate = " << rate << "\n"; file.SetSampleContent((const void*)&compbuffer[compoffset], (unsigned long int)compsize, (chan == 2) ? true : false, bits, rate); } free(compbuffer); } break; case User::File::LOAD_BATTERY: // load in battery data from a file case User::File::LOAD_EEPROM: // used by some Bandai games, can be treated the same as battery files case User::File::LOAD_TAPE: // for loading Famicom cassette tapes case User::File::LOAD_TURBOFILE: // for loading turbofile data { int size; FILE *f; f = fopen(savename, "rb"); if (!f) { return; } fseek(f, 0, SEEK_END); size = ftell(f); fclose(f); std::ifstream batteryFile( savename, std::ifstream::in|std::ifstream::binary ); if (batteryFile.is_open()) { file.SetContent( batteryFile ); } break; } case User::File::SAVE_BATTERY: // save battery data to a file case User::File::SAVE_EEPROM: // can be treated the same as battery files case User::File::SAVE_TAPE: // for saving Famicom cassette tapes case User::File::SAVE_TURBOFILE: // for saving turbofile data { std::ofstream batteryFile( savename, std::ifstream::out|std::ifstream::binary ); const void* savedata; unsigned long savedatasize; file.GetContent( savedata, savedatasize ); if (batteryFile.is_open()) batteryFile.write( (const char*) savedata, savedatasize ); break; } case User::File::LOAD_FDS: // for loading modified Famicom Disk System files { char fdsname[512]; sprintf(fdsname, "%s.ups", rootname); std::ifstream batteryFile( fdsname, std::ifstream::in|std::ifstream::binary ); // no ups, look for ips if (!batteryFile.is_open()) { sprintf(fdsname, "%s.ips", rootname); std::ifstream batteryFile( fdsname, std::ifstream::in|std::ifstream::binary ); if (!batteryFile.is_open()) { return; } file.SetPatchContent(batteryFile); return; } file.SetPatchContent(batteryFile); break; } case User::File::SAVE_FDS: // for saving modified Famicom Disk System files { char fdsname[512]; sprintf(fdsname, "%s.ups", rootname); std::ofstream fdsFile( fdsname, std::ifstream::out|std::ifstream::binary ); if (fdsFile.is_open()) file.GetPatchContent( User::File::PATCH_UPS, fdsFile ); break; } } }
static void NST_CALLBACK nst_cb_file(void *userData, User::File& file) { unsigned char *compbuffer; int compsize, compoffset; char *filename; switch (file.GetAction()) { case User::File::LOAD_ROM: // Nothing here for now break; case User::File::LOAD_SAMPLE: case User::File::LOAD_SAMPLE_MOERO_PRO_YAKYUU: case User::File::LOAD_SAMPLE_MOERO_PRO_YAKYUU_88: case User::File::LOAD_SAMPLE_MOERO_PRO_TENNIS: case User::File::LOAD_SAMPLE_TERAO_NO_DOSUKOI_OOZUMOU: case User::File::LOAD_SAMPLE_AEROBICS_STUDIO: // Nothing here for now break; case User::File::LOAD_BATTERY: // load in battery data from a file case User::File::LOAD_EEPROM: // used by some Bandai games, can be treated the same as battery files case User::File::LOAD_TAPE: // for loading Famicom cassette tapes case User::File::LOAD_TURBOFILE: // for loading turbofile data { std::ifstream batteryFile(nstpaths.savename, std::ifstream::in|std::ifstream::binary); if (batteryFile.is_open()) { file.SetContent(batteryFile); } break; } case User::File::SAVE_BATTERY: // save battery data to a file case User::File::SAVE_EEPROM: // can be treated the same as battery files case User::File::SAVE_TAPE: // for saving Famicom cassette tapes case User::File::SAVE_TURBOFILE: // for saving turbofile data { std::ofstream batteryFile(nstpaths.savename, std::ifstream::out|std::ifstream::binary); const void* savedata; unsigned long savedatasize; file.GetContent(savedata, savedatasize); if (batteryFile.is_open()) { batteryFile.write((const char*) savedata, savedatasize); } break; } case User::File::LOAD_FDS: // for loading modified Famicom Disk System files { char fdsname[512]; snprintf(fdsname, sizeof(fdsname), "%s.ups", nstpaths.fdssave); std::ifstream batteryFile( fdsname, std::ifstream::in|std::ifstream::binary ); // no ups, look for ips if (!batteryFile.is_open()) { snprintf(fdsname, sizeof(fdsname), "%s.ips", nstpaths.fdssave); std::ifstream batteryFile( fdsname, std::ifstream::in|std::ifstream::binary ); if (!batteryFile.is_open()) { return; } file.SetPatchContent(batteryFile); return; } file.SetPatchContent(batteryFile); break; } case User::File::SAVE_FDS: // for saving modified Famicom Disk System files { char fdsname[512]; snprintf(fdsname, sizeof(fdsname), "%s.ups", nstpaths.fdssave); std::ofstream fdsFile( fdsname, std::ifstream::out|std::ifstream::binary ); if (fdsFile.is_open()) file.GetPatchContent( User::File::PATCH_UPS, fdsFile ); break; } } }