Skip to content

Commit

Permalink
Merge pull request #5166 from maron2000/fix_imgmake_bpb
Browse files Browse the repository at this point in the history
Some more fixes for incorrect BPB of floppy images made by IMGMAKE command
  • Loading branch information
joncampbell123 committed Aug 9, 2024
2 parents 1246e3e + 532f82d commit 6ff3c0a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 15 deletions.
28 changes: 16 additions & 12 deletions src/dos/dos_programs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3642,22 +3642,22 @@ class IMGMAKE : public Program {
uint16_t disksize = 0;
bool is_fd = false;
if(disktype=="fd_160") {
c = 40; h = 1; s = 8; mediadesc = 0xFE; root_ent = 56; // root_ent?
c = 40; h = 1; s = 8; mediadesc = 0xFE; root_ent = 64;
disksize = 160; is_fd = true;
} else if(disktype=="fd_180") {
c = 40; h = 1; s = 9; mediadesc = 0xFC; root_ent = 56; // root_ent?
c = 40; h = 1; s = 9; mediadesc = 0xFC; root_ent = 64;
disksize = 180; is_fd = true;
} else if(disktype=="fd_200") {
c = 40; h = 1; s = 10; mediadesc = 0xFC; root_ent = 56; // root_ent?
c = 40; h = 1; s = 10; mediadesc = 0xFC; root_ent = 64; // root_ent?
disksize = 200; is_fd = true;
} else if(disktype=="fd_320") {
c = 40; h = 2; s = 8; mediadesc = 0xFF; root_ent = 112; // root_ent?
c = 40; h = 2; s = 8; mediadesc = 0xFF; root_ent = 112;
disksize = 320; is_fd = true;
} else if(disktype=="fd_360") {
c = 40; h = 2; s = 9; mediadesc = 0xFD; root_ent = 112;
disksize = 360; is_fd = true;
} else if(disktype=="fd_400") {
c = 40; h = 2; s = 10; mediadesc = 0xFD; root_ent = 112; // root_ent?
c = 40; h = 2; s = 10; mediadesc = 0xFD; root_ent = 112;
disksize = 400; is_fd = true;
} else if(disktype=="fd_720") {
c = 80; h = 2; s = 9; mediadesc = 0xF9; root_ent = 112;
Expand All @@ -3669,7 +3669,7 @@ class IMGMAKE : public Program {
c = 80; h = 2; s = 18; mediadesc = 0xF0; root_ent = 224;
disksize = 1440; is_fd = true;
} else if(disktype=="fd_2880") {
c = 80; h = 2; s = 36; mediadesc = 0xF0; root_ent = 512; // root_ent?
c = 80; h = 2; s = 36; mediadesc = 0xF0; root_ent = 240;
disksize = 2880; is_fd = true;
} else if(disktype=="hd_250") {
c = 489; h = 16; s = 63;
Expand Down Expand Up @@ -4051,7 +4051,7 @@ class IMGMAKE : public Program {
sprintf((char*)&sbuf[0x03],"MSDOS5.0");
}
// bytes per sector: always 512
host_writew(&sbuf[0x0b],512);
host_writew(&sbuf[BytsPerSec],512);
// sectors per cluster: 1,2,4,8,16,...
// NOTES: SCANDISK.EXE will hang if you ask it to check a FAT12 filesystem with 128 sectors/cluster.
if (sectors_per_cluster == 0) {
Expand Down Expand Up @@ -4097,7 +4097,7 @@ class IMGMAKE : public Program {
}
}
while ((vol_sectors/sectors_per_cluster) >= (fatlimit - 2u) && sectors_per_cluster < 0x80u) sectors_per_cluster <<= 1;
sbuf[0x0d]=(uint8_t)sectors_per_cluster;
sbuf[SecPerClus]=(uint8_t)sectors_per_cluster;
// TODO small floppies have 2 sectors per cluster?
// reserved sectors
host_writew(&sbuf[0x0e],reserved_sectors);
Expand Down Expand Up @@ -4183,7 +4183,7 @@ class IMGMAKE : public Program {
sprintf((char*)&sbuf[FilSysType32],"FAT32 ");
}
else { /* FAT12/FAT16 */
// ext. boot signature
// BIOS drive
sbuf[BootSig] = 0x29;
// Volume label
sprintf((char*)&sbuf[VolLab], "NO NAME ");
Expand All @@ -4195,17 +4195,18 @@ class IMGMAKE : public Program {
while(DiskGeometryList[index].cylcount != 0) {
if(DiskGeometryList[index].ksize == disksize) {
sbuf[Media] = DiskGeometryList[index].mediaid;
mediadesc = DiskGeometryList[index].mediaid;
host_writew(&sbuf[SecPerTrk],DiskGeometryList[index].secttrack);
host_writew(&sbuf[NumHeads], DiskGeometryList[index].headscyl);
host_writew(&sbuf[BytsPerSec], DiskGeometryList[index].bytespersect);
sbuf[SecPerClus] = DiskGeometryList[index].sectcluster;
host_writew(&sbuf[RootEntCnt], DiskGeometryList[index].rootentries);
/* FIX_ME: FATSz16 for other floppy disk sizes? */
if(disksize == 320) {
/* FATSz16 to match FreeDOS FORMAT command https://github.com/FDOS/format/blob/master/floppy.h */
if(disksize == 160 || disksize == 320) {
host_writew(&sbuf[FATSz16],1);
sect_per_fat = 1;
}
else if(disksize == 360) {
else if(disksize == 180 || disksize == 200 || disksize == 360 || disksize == 400) {
host_writew(&sbuf[FATSz16],2);
sect_per_fat = 2;
}
Expand All @@ -4216,6 +4217,9 @@ class IMGMAKE : public Program {
else if(disksize == 1200) {
host_writew(&sbuf[FATSz16],7);
sect_per_fat = 7;
} else { // Explicitly set to 9 for disksize == 1400 || disksize == 2880
host_writew(&sbuf[FATSz16],9);
sect_per_fat = 9;
}
break;
}
Expand Down
6 changes: 3 additions & 3 deletions src/ints/bios_disk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1099,11 +1099,11 @@ bool saveDiskImage(imageDisk *image, const char *name) {

diskGeo DiskGeometryList[] = {
{ 160, 8, 1, 40, 0, 512, 64, 1, 0xFE}, // IBM PC double density 5.25" single-sided 160KB
{ 180, 9, 1, 40, 0, 512, 64, 2, 0xFC}, // IBM PC double density 5.25" single-sided 180KB
{ 200, 10, 1, 40, 0, 512, 0, 0, 0}, // DEC Rainbow double density 5.25" single-sided 200KB (I think...)
{ 180, 9, 1, 40, 0, 512, 64, 1, 0xFC}, // IBM PC double density 5.25" single-sided 180KB
{ 200, 10, 1, 40, 0, 512, 64, 2, 0xFC}, // DEC Rainbow double density 5.25" single-sided 200KB (I think...)
{ 320, 8, 2, 40, 1, 512, 112, 2, 0xFF}, // IBM PC double density 5.25" double-sided 320KB
{ 360, 9, 2, 40, 1, 512, 112, 2, 0xFD}, // IBM PC double density 5.25" double-sided 360KB
{ 400, 10, 2, 40, 1, 512, 0, 0, 0}, // DEC Rainbow double density 5.25" double-sided 400KB (I think...)
{ 400, 10, 2, 40, 1, 512, 112, 2, 0xFD}, // DEC Rainbow double density 5.25" double-sided 400KB (I think...)
{ 640, 8, 2, 80, 3, 512, 112, 2, 0xFB}, // IBM PC double density 3.5" double-sided 640KB
{ 720, 9, 2, 80, 3, 512, 112, 2, 0xF9}, // IBM PC double density 3.5" double-sided 720KB
{1200, 15, 2, 80, 2, 512, 224, 1, 0xF9}, // IBM PC double density 5.25" double-sided 1.2MB
Expand Down

0 comments on commit 6ff3c0a

Please sign in to comment.