/** * Eject disk from floppy drive, save contents back to PCs hard-drive if * they have been changed. * Return true if there was something to eject. */ bool Floppy_EjectDiskFromDrive(int Drive) { bool bEjected = false; /* Does our drive have a disk in? */ if (EmulationDrives[Drive].bDiskInserted) { bool bSaved = false; char *psFileName = EmulationDrives[Drive].sFileName; /* OK, has contents changed? If so, need to save */ if (EmulationDrives[Drive].bContentsChanged) { /* Is OK to save image (if boot-sector is bad, don't allow a save) */ if (EmulationDrives[Drive].bOKToSave && !Floppy_IsWriteProtected(Drive)) { /* Save as .MSA or .ST image? */ if (MSA_FileNameIsMSA(psFileName, true)) bSaved = MSA_WriteDisk(psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (ST_FileNameIsST(psFileName, true)) bSaved = ST_WriteDisk(psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (DIM_FileNameIsDIM(psFileName, true)) bSaved = DIM_WriteDisk(psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (ZIP_FileNameIsZIP(psFileName)) bSaved = ZIP_WriteDisk(psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); if (bSaved) Log_Printf(LOG_INFO, "Updated the contents of floppy image '%s'.", psFileName); else Log_Printf(LOG_INFO, "Writing of this format failed or not supported, discarded the contents\n of floppy image '%s'.", psFileName); } else Log_Printf(LOG_INFO, "Writing not possible, discarded the contents of floppy image\n '%s'.", psFileName); } /* Inform user that disk has been ejected! */ Log_Printf(LOG_INFO, "Floppy %c: has been removed from drive.", 'A'+Drive); Floppy_DriveTransitionSetState ( Drive , FLOPPY_DRIVE_TRANSITION_STATE_EJECT ); bEjected = true; } /* Drive is now empty */ if (EmulationDrives[Drive].pBuffer != NULL) { free(EmulationDrives[Drive].pBuffer); EmulationDrives[Drive].pBuffer = NULL; } EmulationDrives[Drive].sFileName[0] = '\0'; EmulationDrives[Drive].nImageBytes = 0; EmulationDrives[Drive].bDiskInserted = false; EmulationDrives[Drive].bContentsChanged = false; EmulationDrives[Drive].bOKToSave = false; return bEjected; }
/** * Insert previously set disk file image into floppy drive. * The WHOLE image is copied into Hatari drive buffers, and * uncompressed if necessary. * Return TRUE on success, false otherwise. */ bool Floppy_InsertDiskIntoDrive(int Drive) { long nImageBytes = 0; char *filename; /* Eject disk, if one is inserted (doesn't inform user) */ assert(Drive >= 0 && Drive < MAX_FLOPPYDRIVES); Floppy_EjectDiskFromDrive(Drive); filename = ConfigureParams.DiskImage.szDiskFileName[Drive]; if (!filename[0]) { return true; /* only do eject */ } if (!File_Exists(filename)) { Log_AlertDlg(LOG_INFO, "Image '%s' not found", filename); return false; } /* Check disk image type and read the file: */ if (MSA_FileNameIsMSA(filename, true)) EmulationDrives[Drive].pBuffer = MSA_ReadDisk(filename, &nImageBytes); else if (ST_FileNameIsST(filename, true)) EmulationDrives[Drive].pBuffer = ST_ReadDisk(filename, &nImageBytes); else if (DIM_FileNameIsDIM(filename, true)) EmulationDrives[Drive].pBuffer = DIM_ReadDisk(filename, &nImageBytes); else if (ZIP_FileNameIsZIP(filename)) { const char *zippath = ConfigureParams.DiskImage.szDiskZipPath[Drive]; EmulationDrives[Drive].pBuffer = ZIP_ReadDisk(filename, zippath, &nImageBytes); } if (EmulationDrives[Drive].pBuffer == NULL) { return false; } /* Store image filename (required for ejecting the disk later!) */ strcpy(EmulationDrives[Drive].sFileName, filename); /* Store size and set drive states */ EmulationDrives[Drive].nImageBytes = nImageBytes; EmulationDrives[Drive].bDiskInserted = true; EmulationDrives[Drive].bContentsChanged = false; EmulationDrives[Drive].bOKToSave = Floppy_IsBootSectorOK(Drive); Floppy_DriveTransitionSetState ( Drive , FLOPPY_DRIVE_TRANSITION_STATE_INSERT ); Log_Printf(LOG_INFO, "Inserted disk '%s' to drive %c:.", filename, 'A'+Drive); return true; }
/** * Check an image file in the archive, return the uncompressed length */ static long ZIP_CheckImageFile(unzFile uf, char *filename, int namelen, int *pImageType) { unz_file_info file_info; if (unzLocateFile(uf,filename, 0) != UNZ_OK) { Log_Printf(LOG_ERROR, "Error: File \"%s\" not found in the archive!\n", filename); return -1; } if (unzGetCurrentFileInfo(uf, &file_info, filename, namelen, NULL, 0, NULL, 0) != UNZ_OK) { Log_Printf(LOG_ERROR, "Error with zipfile in unzGetCurrentFileInfo\n"); return -1; } /* check for .stx, .ipf, .msa, .dim or .st extension */ if (STX_FileNameIsSTX(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_STX; return file_info.uncompressed_size; } if (IPF_FileNameIsIPF(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_IPF; return file_info.uncompressed_size; } if (MSA_FileNameIsMSA(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_MSA; return file_info.uncompressed_size; } if (ST_FileNameIsST(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_ST; return file_info.uncompressed_size; } if (DIM_FileNameIsDIM(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_DIM; return file_info.uncompressed_size; } Log_Printf(LOG_ERROR, "Not an .ST, .MSA, .DIM, .IPF or .STX file.\n"); return 0; }
/** * Check an image file in the archive, return the uncompressed length */ static long ZIP_CheckImageFile(unzFile uf, char *filename, int namelen, int *pDiskType) { unz_file_info file_info; if (unzLocateFile(uf,filename, 0) != UNZ_OK) { Log_Printf(LOG_ERROR, "Error: File \"%s\" not found in the archive!\n", filename); return -1; } if (unzGetCurrentFileInfo(uf, &file_info, filename, namelen, NULL, 0, NULL, 0) != UNZ_OK) { Log_Printf(LOG_ERROR, "Error with zipfile in unzGetCurrentFileInfo\n"); return -1; } /* check for a .msa or .st extention */ if (MSA_FileNameIsMSA(filename, false)) { *pDiskType = ZIP_FILE_MSA; return file_info.uncompressed_size; } if (ST_FileNameIsST(filename, false)) { *pDiskType = ZIP_FILE_ST; return file_info.uncompressed_size; } if (DIM_FileNameIsDIM(filename, false)) { *pDiskType = ZIP_FILE_DIM; return file_info.uncompressed_size; } Log_Printf(LOG_ERROR, "Not an .ST, .MSA or .DIM file.\n"); return 0; }