/* Open an existing IMD disk image. It will be opened and parsed, and after this * call, will be ready for sector read/write. The result is the corresponding * DISK_INFO or NULL if an error occurred. */ DISK_INFO *diskOpen(FILE *fileref, uint32 isVerbose) { DISK_INFO *myDisk = NULL; myDisk = (DISK_INFO *)malloc(sizeof(DISK_INFO)); myDisk->file = fileref; if (diskParse(myDisk, isVerbose) != SCPE_OK) { free(myDisk); myDisk = NULL; } return myDisk; }
/* Open an existing IMD disk image. It will be opened and parsed, and after this * call, will be ready for sector read/write. The result is the corresponding * DISK_INFO or NULL if an error occurred. */ DISK_INFO *diskOpenEx(FILE *fileref, uint32 isVerbose, DEVICE *device, uint32 debugmask, uint32 verbosedebugmask) { DISK_INFO *myDisk = NULL; myDisk = (DISK_INFO *)malloc(sizeof(DISK_INFO)); myDisk->file = fileref; myDisk->device = device; myDisk->debugmask = debugmask; myDisk->verbosedebugmask = verbosedebugmask; if (diskParse(myDisk, isVerbose) != SCPE_OK) { free(myDisk); myDisk = NULL; } return myDisk; }
/* Format an entire track. The new track to be formatted must be after any existing tracks on * the disk. * * This routine should be enhanced to re-format an existing track to the same format (this * does not involve changing the disk image size.) * * Any existing data on the disk image will be destroyed when Track 0, Head 0 is formatted. * At that time, the IMD file is truncated. So for the trackWrite to be used to sucessfully * format a disk image, then format program must format tracks starting with Cyl 0, Head 0, * and proceed sequentially through all tracks/heads on the disk. * * Format programs that are known to work include: * Cromemco CDOS "INIT.COM" * ADC Super-Six (CP/M-80) "FMT8.COM" * 86-DOS "INIT.COM" * */ t_stat trackWrite(DISK_INFO *myDisk, uint32 Cyl, uint32 Head, uint32 numSectors, uint32 sectorLen, uint8 *sectorMap, uint8 mode, uint8 fillbyte, uint32 *flags) { FILE *fileref; IMD_HEADER track_header; uint8 *sectorData; unsigned long i; unsigned long dataLen; *flags = 0; /* Check parameters */ if(myDisk == NULL) { *flags |= IMD_DISK_IO_ERROR_GENERAL; return(SCPE_IOERR); } if(myDisk->flags & FD_FLAG_WRITELOCK) { sim_printf("Disk write-protected, cannot format tracks.\n"); *flags |= IMD_DISK_IO_ERROR_WPROT; return(SCPE_IOERR); } fileref = myDisk->file; sim_debug(myDisk->debugmask, myDisk->device, "Formatting C:%d/H:%d/N:%d, len=%d, Fill=0x%02x\n", Cyl, Head, numSectors, sectorLen, fillbyte); /* Truncate the IMD file when formatting Cyl 0, Head 0 */ if((Cyl == 0) && (Head == 0)) { /* Skip over IMD comment field. */ commentParse(myDisk, NULL, 0); /* Truncate the IMD file after the comment field. */ if (sim_set_fsize(fileref, (t_addr)ftell (fileref)) == -1) { sim_printf("Disk truncation failed.\n"); *flags |= IMD_DISK_IO_ERROR_GENERAL; return(SCPE_IOERR); } /* Flush and re-parse the IMD file. */ fflush(fileref); diskParse(myDisk, 0); } /* Check to make sure the Cyl / Head is not already formatted. */ if(sectSeek(myDisk, Cyl, Head) == 0) { sim_printf("SIM_IMD: ERROR: Not Formatting C:%d/H:%d, track already exists.\n", Cyl, Head); *flags |= IMD_DISK_IO_ERROR_GENERAL; return(SCPE_IOERR); } track_header.mode = mode; track_header.cyl = Cyl; track_header.head = Head; track_header.nsects = numSectors; track_header.sectsize = sectorLen; /* Forward to end of the file, write track header and sector map. */ sim_fseek(myDisk->file, 0, SEEK_END); sim_fwrite(&track_header, 1, sizeof(IMD_HEADER), fileref); sim_fwrite(sectorMap, 1, numSectors, fileref); /* Compute data length, and fill a sector buffer with the * sector record type as the first byte, and fill the sector * data with the fillbyte. */ dataLen = sectorLen + 1; sectorData = (uint8 *)malloc(dataLen); memset(sectorData, fillbyte, dataLen); sectorData[0] = SECT_RECORD_NORM; /* For each sector on the track, write the record type and sector data. */ for(i=0;i<numSectors;i++) { sim_fwrite(sectorData, 1, dataLen, fileref); } /* Flush the file, and free the sector buffer. */ fflush(fileref); free(sectorData); /* Now that the disk track/sector layout has been modified, re-parse the disk image. */ diskParse(myDisk, 0); return(SCPE_OK); }