Added minidisk creation :p.

This commit is contained in:
2017-08-28 22:43:30 +01:00
parent 3517f45004
commit 4bb1dc2b95

View File

@@ -25,7 +25,7 @@ namespace CreateXDF
0x64, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x77, 0x69, 0x64, 0x65, 0x0A, 0x44, 0x75, 0x70, 0x6C, 0x64, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x77, 0x69, 0x64, 0x65, 0x0A, 0x44, 0x75, 0x70, 0x6C,
0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x72, 0x6F, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x72, 0x6F, 0x68, 0x69, 0x62, 0x69, 0x74,
0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6D, 0x69, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6D, 0x69,
0x73, 0x73, 0x69, 0x6F, 0x6E, 0x0A, 0x0A, 0xC0, 0x6E, 0xEF, 0xDD, 0x5F, 0xA5, 0xDA, 0xB1, 0xF7, 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x0A, 0x0A, 0xC0, 0x6E, 0xEF, 0xDD, 0x5F, 0x00, 0x00, 0x00, 0x00,
0x4F, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x31, 0x34, 0x37, 0x35, 0x4F, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x31, 0x34, 0x37, 0x35,
0x0D, 0x0A, 0x4F, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x32, 0x30, 0x0D, 0x0A, 0x4F, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x32, 0x30,
0x32, 0x37, 0x0D, 0x0A, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x74, 0x65, 0x6E, 0x32, 0x37, 0x0D, 0x0A, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x74, 0x65, 0x6E,
@@ -39,14 +39,51 @@ namespace CreateXDF
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA }; 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA };
static readonly byte[] minibpb = { 0xEB, 0x4F, 0x90, 0x58, 0x44, 0x46, 0x76, 0x31, 0x2E, 0x33, 0x69, 0x00, 0x02, 0x01, 0x01, 0x00,
0x02, 0x10, 0x00, 0x08, 0x00, 0xF9, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x33, 0xDB, 0x8E, 0xD3, 0xBC, 0xFF, 0x7B, 0xFB, 0xBA,
0xC0, 0xFA, 0x29, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C, 0xFB, 0x0E, 0x1F, 0xBE, 0x40, 0x7D, 0x8A,
0x04, 0x08, 0xC0, 0x74, 0x0D, 0x56, 0x1E, 0xB4, 0x0E, 0xB7, 0x00, 0xCD, 0x10, 0x1F, 0x5E, 0x46,
0xEB, 0xED, 0xB4, 0x00, 0xCD, 0x16, 0xCD, 0x19, 0xB9, 0x0B, 0x00, 0xF3, 0x00, 0x29, 0x0D, 0xB6,
0x58, 0x44, 0x46, 0x20, 0x76, 0x31, 0x2E, 0x31, 0x61, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39,
0x39, 0x33, 0x2C, 0x20, 0x31, 0x39, 0x39, 0x34, 0x20, 0x2D, 0x2D, 0x20, 0x42, 0x61, 0x63, 0x6B,
0x75, 0x70, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, 0x73, 0x2C,
0x20, 0x49, 0x6E, 0x63, 0x2E, 0x2C, 0x20, 0x54, 0x61, 0x6D, 0x70, 0x61, 0x20, 0x46, 0x4C, 0x0A,
0x20, 0x50, 0x61, 0x74, 0x65, 0x6E, 0x74, 0x28, 0x73, 0x29, 0x20, 0x50, 0x65, 0x6E, 0x64, 0x69,
0x6E, 0x67, 0x20, 0x2D, 0x2D, 0x20, 0x49, 0x6E, 0x76, 0x65, 0x6E, 0x74, 0x6F, 0x72, 0x3A, 0x20,
0x52, 0x6F, 0x67, 0x65, 0x72, 0x20, 0x44, 0x2E, 0x20, 0x49, 0x76, 0x65, 0x79, 0x0A, 0x41, 0x6C,
0x6C, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65,
0x64, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x77, 0x69, 0x64, 0x65, 0x0A, 0x44, 0x75, 0x70, 0x6C,
0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x72, 0x6F, 0x68, 0x69, 0x62, 0x69, 0x74,
0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6D, 0x69,
0x73, 0x73, 0x69, 0x6F, 0x6E, 0x0A, 0x0A, 0xC0, 0xDB, 0xCD, 0xDA, 0x55, 0x00, 0x00, 0x00, 0x00,
0x4F, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x31, 0x34, 0x37, 0x35,
0x0D, 0x0A, 0x4F, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x32, 0x30,
0x32, 0x37, 0x0D, 0x0A, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x74, 0x65, 0x6E,
0x74, 0x28, 0x73, 0x29, 0x20, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x0D, 0x0A, 0x0D, 0x0A,
0x4E, 0x6F, 0x6E, 0x2D, 0x42, 0x6F, 0x6F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x58, 0x44, 0x46,
0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x44, 0x69, 0x73, 0x6B, 0x0D, 0x0A, 0x49, 0x6E, 0x73, 0x65,
0x72, 0x74, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x20, 0x64, 0x69, 0x73, 0x6B, 0x20, 0x61,
0x6E, 0x64, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79,
0x0D, 0x0A, 0x00, 0x53, 0x2F, 0x32, 0x20, 0x21, 0x21, 0x20, 0x53, 0x59, 0x53, 0x30, 0x32, 0x30,
0x32, 0x37, 0x0D, 0x0A, 0x00, 0x4F, 0x53, 0x32, 0x42, 0x4F, 0x4F, 0x54, 0x20, 0x20, 0x20, 0x20,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA };
static readonly byte[] fatid = { 0xF9, 0xFF, 0xFF }; static readonly byte[] fatid = { 0xF9, 0xFF, 0xFF };
const ushort fatSectors = 11; static readonly byte[] miniFatEntry = { 0xF9, 0xFF, 0xFF, 0x03, 0x40, 0x00, 0xFF, 0x2F };
const ushort rootEntries = 224; const ushort rootEntries = 224;
const byte formatByte = 0xF6; const byte formatByte = 0xF6;
const string miniMessage = "This is a XDF disk created with CreateXDF.\n\r" +
"You need to use IBM's XDF.COM driver to access its contents.";
public static void Main(string[] args) public static void Main(string[] args)
{ {
string volname = "NEW XDF IMG"; string volname = "NEW XDF IMG";
@@ -55,6 +92,7 @@ namespace CreateXDF
ushort spt = 0; ushort spt = 0;
byte unk_sector_num = 0x0B; byte unk_sector_num = 0x0B;
DateTime creation = DateTime.Now; DateTime creation = DateTime.Now;
ushort fatSectors = 11;
if((args.Length != 2 && args.Length != 3) || (args[0] != "-3" && args[0] != "-5")) if((args.Length != 2 && args.Length != 3) || (args[0] != "-3" && args[0] != "-5"))
{ {
@@ -75,12 +113,14 @@ namespace CreateXDF
spt = 23; spt = 23;
mediaDescriptor = 0xF0; mediaDescriptor = 0xF0;
unk_sector_num = 0x0B; unk_sector_num = 0x0B;
fatSectors = 11;
} }
else if (args[0] == "-5") else if (args[0] == "-5")
{ {
spt = 19; spt = 19;
mediaDescriptor = 0xF9; mediaDescriptor = 0xF9;
unk_sector_num = 0x09; unk_sector_num = 0x09;
fatSectors = 9;
} }
sectors = (ushort)(80 * 2 * spt); sectors = (ushort)(80 * 2 * spt);
@@ -150,10 +190,25 @@ namespace CreateXDF
tmp = Encoding.ASCII.GetBytes(volname.ToUpper()); tmp = Encoding.ASCII.GetBytes(volname.ToUpper());
fs.Write(tmp, 0, tmp.Length >= 11 ? 11 : tmp.Length); fs.Write(tmp, 0, tmp.Length >= 11 ? 11 : tmp.Length);
// Write FATs // Write FAT
fs.Seek(512, SeekOrigin.Begin); fs.Seek(512, SeekOrigin.Begin);
fs.Write(fat, 0, fat.Length); fs.Write(fat, 0, fat.Length);
fs.Write(fat, 0, fat.Length);
// Write miniBPB
fs.Write(minibpb, 0, 512);
fs.Seek(-512, SeekOrigin.Current);
fs.Seek(0x26, SeekOrigin.Current);
fs.WriteByte(0x29);
fs.Write(serial, 0, 4);
tmp = Encoding.ASCII.GetBytes(volname.ToUpper());
fs.Write(tmp, 0, tmp.Length >= 11 ? 11 : tmp.Length);
fs.Seek(512 - 0x36, SeekOrigin.Current);
// Write miniFAT
byte[] miniFat = new byte[512];
Array.Copy(miniFat, 0, miniFatEntry, 0, miniFatEntry.Length);
fs.Write(miniFat, 0, 512);
fs.Write(miniFat, 0, 512);
// Create directory entry // Create directory entry
ushort ctime = 0, cdate = 0; ushort ctime = 0, cdate = 0;
@@ -166,40 +221,62 @@ namespace CreateXDF
byte[] cdate_b = BitConverter.GetBytes(cdate); byte[] cdate_b = BitConverter.GetBytes(cdate);
byte[] ctime_b = BitConverter.GetBytes(ctime); byte[] ctime_b = BitConverter.GetBytes(ctime);
byte[] dirEntry = new byte[32];
// Volume label // Volume label
for (int i = 0; i < 11; i++) for (int i = 0; i < 11; i++)
rootDir[i] = 0x20; dirEntry[i] = 0x20;
tmp = Encoding.ASCII.GetBytes(volname.ToUpper()); tmp = Encoding.ASCII.GetBytes(volname.ToUpper());
Array.Copy(tmp, 0, rootDir, 0, tmp.Length >= 11 ? 11 : tmp.Length); Array.Copy(tmp, 0, dirEntry, 0, tmp.Length >= 11 ? 11 : tmp.Length);
// Attributes // Attributes
rootDir[11] = 8; dirEntry[11] = 8;
// Case information // Case information
rootDir[12] = 0; dirEntry[12] = 0;
// Creation time milliseconds. This is DR-DOS so don't use. // Creation time milliseconds. This is DR-DOS so don't use.
rootDir[13] = 0; dirEntry[13] = 0;
// Creation time // Creation time
Array.Copy(ctime_b, 0, rootDir, 14, 2); Array.Copy(ctime_b, 0, dirEntry, 14, 2);
// Creation date // Creation date
Array.Copy(cdate_b, 0, rootDir, 16, 2); Array.Copy(cdate_b, 0, dirEntry, 16, 2);
// Last access date. From Windows 95 so don't use. // Last access date. From Windows 95 so don't use.
rootDir[18] = 0; dirEntry[18] = 0;
rootDir[19] = 0; dirEntry[19] = 0;
// Extended attributes handler // Extended attributes handler
rootDir[20] = 0; dirEntry[20] = 0;
rootDir[21] = 0; dirEntry[21] = 0;
// Last written time // Last written time
Array.Copy(ctime_b, 0, rootDir, 22, 2); Array.Copy(ctime_b, 0, dirEntry, 22, 2);
// Last written date // Last written date
Array.Copy(cdate_b, 0, rootDir, 24, 2); Array.Copy(cdate_b, 0, dirEntry, 24, 2);
// Starting cluster // Starting cluster
rootDir[26] = 0; dirEntry[26] = 0;
rootDir[27] = 0; dirEntry[27] = 0;
// Size // Size
rootDir[28] = 0; dirEntry[28] = 0;
rootDir[29] = 0; dirEntry[29] = 0;
rootDir[30] = 0; dirEntry[30] = 0;
rootDir[31] = 0; dirEntry[31] = 0;
Array.Copy(dirEntry, 0, rootDir, 0, 32);
// Write mini root
byte[] miniDir = new byte[512];
Array.Copy(dirEntry, 0, miniDir, 0, 32);
tmp = Encoding.ASCII.GetBytes("README TXT");
Array.Copy(tmp, 0, dirEntry, 0, 11);
dirEntry[11] = 1;
dirEntry[26] = 2;
int messageLen = Encoding.ASCII.GetBytes(miniMessage).Length;
tmp = BitConverter.GetBytes((uint)(messageLen < 512 ? messageLen : 512));
Array.Copy(tmp, 0, dirEntry, 28, 4);
Array.Copy(dirEntry, 0, miniDir, 32, 32);
fs.Write(miniDir, 0, 512);
// Write message file
tmp = Encoding.ASCII.GetBytes(miniMessage);
fs.Write(tmp, 0, tmp.Length >= 512 ? 512 : tmp.Length);
// Write root
fs.Seek(spt * 512, SeekOrigin.Begin);
fs.Write(rootDir, 0, rootDir.Length); fs.Write(rootDir, 0, rootDir.Length);
ushort remainingSectors = (ushort)(sectors - (fatSectors * 2 + rootDir.Length / 512 + 1)); ushort remainingSectors = (ushort)(sectors - (fatSectors * 2 + rootDir.Length / 512 + 1));
@@ -213,6 +290,8 @@ namespace CreateXDF
byte[] checksum = BitConverter.GetBytes(xdfcopy_verify_checksum(fs, unk_sector_num)); byte[] checksum = BitConverter.GetBytes(xdfcopy_verify_checksum(fs, unk_sector_num));
fs.Seek(0x13C, SeekOrigin.Begin); fs.Seek(0x13C, SeekOrigin.Begin);
fs.Write(checksum, 0, 4); fs.Write(checksum, 0, 4);
fs.Seek((fatSectors + 1) * 512 + 0x13C, SeekOrigin.Begin);
fs.Write(checksum, 0, 4);
fs.Close(); fs.Close();
} }