From dfc82343a3d1c945da7daf4d959d89364ee145dd Mon Sep 17 00:00:00 2001 From: maron2000 <68574602+maron2000@users.noreply.github.com> Date: Fri, 9 Aug 2024 17:42:53 +0900 Subject: [PATCH 1/3] Add geometry information for 200kB, 400kB floppies --- src/ints/bios_disk.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ints/bios_disk.cpp b/src/ints/bios_disk.cpp index 1da0bb6ae1..811c7512fd 100644 --- a/src/ints/bios_disk.cpp +++ b/src/ints/bios_disk.cpp @@ -1100,10 +1100,10 @@ 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...) + { 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 From fb0d891adfa9423921fae72b977a8b60c9587672 Mon Sep 17 00:00:00 2001 From: maron2000 <68574602+maron2000@users.noreply.github.com> Date: Fri, 9 Aug 2024 17:45:39 +0900 Subject: [PATCH 2/3] Fix root entry and FAT size for floppy images made by IMGMAKE command --- src/dos/dos_programs.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/dos/dos_programs.cpp b/src/dos/dos_programs.cpp index ff6e7d831f..561e614505 100644 --- a/src/dos/dos_programs.cpp +++ b/src/dos/dos_programs.cpp @@ -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; @@ -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; @@ -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) { @@ -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); @@ -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 "); @@ -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; } @@ -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; } From 532f82d49acbc2e5cadf1f2655b198b8261f64bb Mon Sep 17 00:00:00 2001 From: maron2000 <68574602+maron2000@users.noreply.github.com> Date: Fri, 9 Aug 2024 21:42:46 +0900 Subject: [PATCH 3/3] Fix Sectors per Cluster for 180kB floppy image --- src/ints/bios_disk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ints/bios_disk.cpp b/src/ints/bios_disk.cpp index 811c7512fd..9166dbb6b8 100644 --- a/src/ints/bios_disk.cpp +++ b/src/ints/bios_disk.cpp @@ -1099,7 +1099,7 @@ 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 + { 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