From 313d71b73e2f436261e20814cd41a01d99037f0c Mon Sep 17 00:00:00 2001 From: "Howard M. Harte" Date: Sun, 13 Dec 2020 15:26:04 -0800 Subject: [PATCH] sim_imd: Properly calculate IMD sectsize. The ImageDisk sectsize field was incorrectly set to the number of bytes in the sector, when it should be an index as follows: 00 = 128 bytes/sector 01 = 256 bytes/sector 02 = 512 bytes/sector 03 = 1024 bytes/sector 04 = 2048 bytes/sector 05 = 4096 bytes/sector 06 = 8192 bytes/sector Tested disk formatting on MS-DOS 1.25, Cromemco CP/M 2.2, Cromemco CDOS, OASIS 5.6. --- sim_imd.c | 20 +++++++++++++++++--- sim_imd.h | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/sim_imd.c b/sim_imd.c index ded9c0a3..0710332e 100644 --- a/sim_imd.c +++ b/sim_imd.c @@ -655,7 +655,11 @@ t_stat sectWrite(DISK_INFO *myDisk, * Cromemco CDOS "INIT.COM" * ADC Super-Six (CP/M-80) "FMT8.COM" * 86-DOS "INIT.COM" - * + * MS-DOS 1.25 "FORMAT.COM" - SSSD 8" + * MS-DOS 1.25 "FORMAT.COM /D" - DSDD 8" + * OASIS-80 v5.6 "INITDISK A (FORMAT,SECTOR 13)" - SSSD 8" + * OASIS-80 v5.6 "INITDISK A (FORMAT)" - SSDD 8" + * OASIS-80 v5.6 "INITDISK A (FORMAT,HEAD 2)" - DSDD 8" */ t_stat trackWrite(DISK_INFO *myDisk, uint32 Cyl, @@ -668,10 +672,11 @@ t_stat trackWrite(DISK_INFO *myDisk, uint32 *flags) { FILE *fileref; - IMD_HEADER track_header; + IMD_HEADER track_header = { 0 }; uint8 *sectorData; unsigned long i; unsigned long dataLen; + uint8 sectsize = 0; *flags = 0; @@ -719,7 +724,16 @@ t_stat trackWrite(DISK_INFO *myDisk, track_header.cyl = Cyl; track_header.head = Head; track_header.nsects = numSectors; - track_header.sectsize = sectorLen; + + for (i = (sectorLen >> 8); i; i >>= 1) { + sectsize++; + } + + if (sectsize > IMD_MAX_SECTSIZE) { + sim_printf("SIM_IMD: ERROR: Invalid sectsize %d\n", sectsize); + return(SCPE_IERR); + } + track_header.sectsize = sectsize; /* Forward to end of the file, write track header and sector map. */ sim_fseek(myDisk->file, 0, SEEK_END); diff --git a/sim_imd.h b/sim_imd.h index a021547a..d4142105 100644 --- a/sim_imd.h +++ b/sim_imd.h @@ -86,6 +86,8 @@ typedef struct { #define IMD_MODE_300K_MFM 4 #define IMD_MODE_250K_MFM 5 +#define IMD_MAX_SECTSIZE 6 + #define IMD_MODE_FM(x) (x <= IMD_MODE_250K_FM) #define IMD_MODE_MFM(x) (x >= IMD_MODE_500K_MFM)