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,
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, 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,
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,
@@ -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, 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 };
const ushort fatSectors = 11;
static readonly byte[] miniFatEntry = { 0xF9, 0xFF, 0xFF, 0x03, 0x40, 0x00, 0xFF, 0x2F };
const ushort rootEntries = 224;
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)
{
string volname = "NEW XDF IMG";
@@ -55,6 +92,7 @@ namespace CreateXDF
ushort spt = 0;
byte unk_sector_num = 0x0B;
DateTime creation = DateTime.Now;
ushort fatSectors = 11;
if((args.Length != 2 && args.Length != 3) || (args[0] != "-3" && args[0] != "-5"))
{
@@ -75,13 +113,15 @@ namespace CreateXDF
spt = 23;
mediaDescriptor = 0xF0;
unk_sector_num = 0x0B;
fatSectors = 11;
}
else if (args[0] == "-5")
{
spt = 19;
mediaDescriptor = 0xF9;
unk_sector_num = 0x09;
}
fatSectors = 9;
}
sectors = (ushort)(80 * 2 * spt);
FileStream fs = new FileStream(args[1], FileMode.CreateNew, FileAccess.ReadWrite);
@@ -150,13 +190,28 @@ namespace CreateXDF
tmp = Encoding.ASCII.GetBytes(volname.ToUpper());
fs.Write(tmp, 0, tmp.Length >= 11 ? 11 : tmp.Length);
// Write FATs
// Write FAT
fs.Seek(512, SeekOrigin.Begin);
fs.Write(fat, 0, fat.Length);
fs.Write(fat, 0, fat.Length);
// Create directory entry
ushort ctime = 0, cdate = 0;
// 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
ushort ctime = 0, cdate = 0;
cdate += (ushort)(((creation.Year - 1980) << 9) & 0xFE00);
cdate += (ushort)((creation.Month << 5) & 0x1E0);
cdate += (ushort)creation.Day;
@@ -166,41 +221,63 @@ namespace CreateXDF
byte[] cdate_b = BitConverter.GetBytes(cdate);
byte[] ctime_b = BitConverter.GetBytes(ctime);
byte[] dirEntry = new byte[32];
// Volume label
for (int i = 0; i < 11; i++)
rootDir[i] = 0x20;
dirEntry[i] = 0x20;
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
rootDir[11] = 8;
dirEntry[11] = 8;
// Case information
rootDir[12] = 0;
dirEntry[12] = 0;
// Creation time milliseconds. This is DR-DOS so don't use.
rootDir[13] = 0;
dirEntry[13] = 0;
// Creation time
Array.Copy(ctime_b, 0, rootDir, 14, 2);
Array.Copy(ctime_b, 0, dirEntry, 14, 2);
// 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.
rootDir[18] = 0;
rootDir[19] = 0;
dirEntry[18] = 0;
dirEntry[19] = 0;
// Extended attributes handler
rootDir[20] = 0;
rootDir[21] = 0;
dirEntry[20] = 0;
dirEntry[21] = 0;
// Last written time
Array.Copy(ctime_b, 0, rootDir, 22, 2);
Array.Copy(ctime_b, 0, dirEntry, 22, 2);
// Last written date
Array.Copy(cdate_b, 0, rootDir, 24, 2);
Array.Copy(cdate_b, 0, dirEntry, 24, 2);
// Starting cluster
rootDir[26] = 0;
rootDir[27] = 0;
dirEntry[26] = 0;
dirEntry[27] = 0;
// Size
rootDir[28] = 0;
rootDir[29] = 0;
rootDir[30] = 0;
rootDir[31] = 0;
dirEntry[28] = 0;
dirEntry[29] = 0;
dirEntry[30] = 0;
dirEntry[31] = 0;
fs.Write(rootDir, 0, rootDir.Length);
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);
ushort remainingSectors = (ushort)(sectors - (fatSectors * 2 + rootDir.Length / 512 + 1));
tmp = new byte[512];
@@ -213,6 +290,8 @@ namespace CreateXDF
byte[] checksum = BitConverter.GetBytes(xdfcopy_verify_checksum(fs, unk_sector_num));
fs.Seek(0x13C, SeekOrigin.Begin);
fs.Write(checksum, 0, 4);
fs.Seek((fatSectors + 1) * 512 + 0x13C, SeekOrigin.Begin);
fs.Write(checksum, 0, 4);
fs.Close();
}