void actionCasSave() { char* filename; if (*state.properties->media.tapes[0].fileName) { int type; if (emulatorGetState() == EMU_STOPPED) { tapeSetReadOnly(1); boardChangeCassette(0, strlen(state.properties->media.tapes[0].fileName) ? state.properties->media.tapes[0].fileName : NULL, strlen(state.properties->media.tapes[0].fileNameInZip) ? state.properties->media.tapes[0].fileNameInZip : NULL); } else { emulatorSuspend(); } type = tapeGetFormat(); filename = archFilenameGetSaveCas(state.properties, &type); if (filename != NULL && strlen(filename) != 0) { if (type == 1 || type == 2 || type == 3) { tapeSave(filename, type); } } if (emulatorGetState() == EMU_STOPPED) { boardChangeCassette(0, NULL, NULL); tapeSetReadOnly(state.properties->cassette.readOnly); } else { emulatorResume(); } } archUpdateMenu(0); }
int tapeInsert(char *name, const char *fileInZipFile) { FILE* file; Properties* pProperties = propGetGlobalProperties(); if (ramImageBuffer != NULL) { file = fopen(tapePosName, "w"); if (file != NULL) { char buffer[32]; sprintf(buffer, "POS:%d", ramImagePos); fwrite(buffer, 1, 32, file); fclose(file); } if (*tapeName && tapeRdWr) { tapeSave(tapeName, tapeFormat); } free(ramImageBuffer); ramImageBuffer = NULL; } *tapeName = 0; if(!name) { return 1; } // Create filename for tape position file sprintf(tapePosName, "%s" DIR_SEPARATOR "%s", tapeBaseDir, stripPath(name)); if (fileInZipFile == NULL) { strcpy(tapeName, name); } else { strcat(tapePosName, stripPath((char*)fileInZipFile)); } strcat(tapePosName, ".pos"); ramImagePos = 0; // Load and verify tape position file = fopen(tapePosName, "rb"); if (file != NULL) { char buffer[32] = { 0 }; fread(buffer, 1, 31, file); sscanf(buffer, "POS:%d", &ramImagePos); fclose(file); } if (fileInZipFile != NULL) { ramImageBuffer = zipLoadFile(name, fileInZipFile, &ramImageSize); if (ramImagePos > ramImageSize) { ramImagePos = ramImageSize; } } else { file = fopen(name,"rb"); if (file != NULL) { // Load file into RAM buffer fseek(file, 0, SEEK_END); ramImageSize = ftell(file); fseek(file, 0, SEEK_SET); ramImageBuffer = malloc(ramImageSize); if (ramImageBuffer != NULL) { if (ramImageSize != fread(ramImageBuffer, 1, ramImageSize, file)) { free(ramImageBuffer); ramImageBuffer = NULL; } } fclose(file); } } if (rewindNextInsert&&pProperties->cassette.rewindAfterInsert) ramImagePos=0; rewindNextInsert=0; if (ramImageBuffer != NULL) { UInt8* ptr = ramImageBuffer + ramImageSize - 17; int cntFMSXDOS = 0; int cntFMSX98 = 0; int cntSVICAS = 0; while (ptr >= ramImageBuffer) { if (!memcmp(ptr, hdrFMSXDOS, sizeof(hdrFMSXDOS))) { cntFMSXDOS++; } if (!memcmp(ptr, hdrFMSX98, sizeof(hdrFMSX98))) { cntFMSX98++; } if (!memcmp(ptr, hdrSVICAS, sizeof(hdrSVICAS))) { cntSVICAS++; } ptr--; } if (cntSVICAS > cntFMSXDOS && cntSVICAS > cntFMSX98) { tapeFormat = TAPE_SVICAS; tapeHeader = hdrSVICAS; tapeHeaderSize = sizeof(hdrSVICAS); } else if (cntFMSXDOS >= cntFMSX98) { tapeFormat = TAPE_FMSXDOS; tapeHeader = hdrFMSXDOS; tapeHeaderSize = sizeof(hdrFMSXDOS); } else { tapeFormat = TAPE_FMSX98AT; tapeHeader = hdrFMSX98; tapeHeaderSize = sizeof(hdrFMSX98); } } if (ramImagePos > ramImageSize) { ramImagePos = ramImageSize; } return ramImageBuffer != NULL; }