mirror of
https://github.com/aaru-dps/Aaru.Decoders.git
synced 2025-12-16 19:24:32 +00:00
[Aaru.Decoders] Reformat and cleanup.
This commit is contained in:
@@ -36,10 +36,13 @@ using System.Runtime.InteropServices;
|
||||
namespace Aaru.Decoders.Floppy;
|
||||
|
||||
/// <summary>Methods and structures for Commodore Amiga decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class Amiga
|
||||
{
|
||||
#region Nested type: Sector
|
||||
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Set to 0x00</summary>
|
||||
@@ -66,4 +69,6 @@ public static class Amiga
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
|
||||
public byte[] data;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
203
Floppy/Apple2.cs
203
Floppy/Apple2.cs
@@ -42,8 +42,9 @@ using Aaru.Localization;
|
||||
namespace Aaru.Decoders.Floppy;
|
||||
|
||||
/// <summary>Methods and structures for Apple ][ floppy decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class Apple2
|
||||
{
|
||||
const string MODULE_NAME = "Apple ][ GCR Decoder";
|
||||
@@ -156,32 +157,32 @@ public static class Apple2
|
||||
if(data is not { Length: 410 })
|
||||
return null;
|
||||
|
||||
byte[] buffer = new byte[data.Length];
|
||||
byte carry = 0;
|
||||
var buffer = new byte[data.Length];
|
||||
byte carry = 0;
|
||||
|
||||
for(int i = 0; i < data.Length; i++)
|
||||
for(var i = 0; i < data.Length; i++)
|
||||
{
|
||||
carry ^= ReadTable5and3[data[i]];
|
||||
buffer[i] = carry;
|
||||
}
|
||||
|
||||
byte[] output = new byte[256];
|
||||
var output = new byte[256];
|
||||
|
||||
for(int i = 0; i < 51; i++)
|
||||
for(var i = 0; i < 51; i++)
|
||||
{
|
||||
byte b1 = buffer[(51 * 3) - i];
|
||||
byte b2 = buffer[(51 * 2) - i];
|
||||
byte b3 = buffer[51 - i];
|
||||
byte b4 = (byte)((((b1 & 2) << 1) | (b2 & 2) | ((b3 & 2) >> 1)) & 0xFF);
|
||||
byte b5 = (byte)((((b1 & 1) << 2) | ((b2 & 1) << 1) | (b3 & 1)) & 0xFF);
|
||||
output[250 - (5 * i)] = (byte)(((buffer[i + (51 * 3) + 1] << 3) | ((b1 >> 2) & 0x7)) & 0xFF);
|
||||
output[251 - (5 * i)] = (byte)(((buffer[i + (51 * 4) + 1] << 3) | ((b2 >> 2) & 0x7)) & 0xFF);
|
||||
output[252 - (5 * i)] = (byte)(((buffer[i + (51 * 5) + 1] << 3) | ((b3 >> 2) & 0x7)) & 0xFF);
|
||||
output[253 - (5 * i)] = (byte)(((buffer[i + (51 * 6) + 1] << 3) | b4) & 0xFF);
|
||||
output[254 - (5 * i)] = (byte)(((buffer[i + (51 * 7) + 1] << 3) | b5) & 0xFF);
|
||||
byte b1 = buffer[51 * 3 - i];
|
||||
byte b2 = buffer[51 * 2 - i];
|
||||
byte b3 = buffer[51 - i];
|
||||
var b4 = (byte)(((b1 & 2) << 1 | b2 & 2 | (b3 & 2) >> 1) & 0xFF);
|
||||
var b5 = (byte)(((b1 & 1) << 2 | (b2 & 1) << 1 | b3 & 1) & 0xFF);
|
||||
output[250 - 5 * i] = (byte)((buffer[i + 51 * 3 + 1] << 3 | b1 >> 2 & 0x7) & 0xFF);
|
||||
output[251 - 5 * i] = (byte)((buffer[i + 51 * 4 + 1] << 3 | b2 >> 2 & 0x7) & 0xFF);
|
||||
output[252 - 5 * i] = (byte)((buffer[i + 51 * 5 + 1] << 3 | b3 >> 2 & 0x7) & 0xFF);
|
||||
output[253 - 5 * i] = (byte)((buffer[i + 51 * 6 + 1] << 3 | b4) & 0xFF);
|
||||
output[254 - 5 * i] = (byte)((buffer[i + 51 * 7 + 1] << 3 | b5) & 0xFF);
|
||||
}
|
||||
|
||||
output[255] = (byte)(((buffer[409] << 3) | (buffer[0] & 0x7)) & 0xFF);
|
||||
output[255] = (byte)((buffer[409] << 3 | buffer[0] & 0x7) & 0xFF);
|
||||
|
||||
return output;
|
||||
}
|
||||
@@ -193,36 +194,36 @@ public static class Apple2
|
||||
if(data is not { Length: 342 })
|
||||
return null;
|
||||
|
||||
byte[] buffer = new byte[data.Length];
|
||||
byte carry = 0;
|
||||
var buffer = new byte[data.Length];
|
||||
byte carry = 0;
|
||||
|
||||
for(int i = 0; i < data.Length; i++)
|
||||
for(var i = 0; i < data.Length; i++)
|
||||
{
|
||||
carry ^= ReadTable6and2[data[i]];
|
||||
buffer[i] = carry;
|
||||
}
|
||||
|
||||
byte[] output = new byte[256];
|
||||
var output = new byte[256];
|
||||
|
||||
for(uint i = 0; i < 256; i++)
|
||||
{
|
||||
output[i] = (byte)((buffer[86 + i] << 2) & 0xFF);
|
||||
output[i] = (byte)(buffer[86 + i] << 2 & 0xFF);
|
||||
|
||||
switch(i)
|
||||
{
|
||||
case < 86:
|
||||
output[i] |= (byte)(((buffer[i] & 1) << 1) & 0xFF);
|
||||
output[i] |= (byte)(((buffer[i] & 2) >> 1) & 0xFF);
|
||||
output[i] |= (byte)((buffer[i] & 1) << 1 & 0xFF);
|
||||
output[i] |= (byte)((buffer[i] & 2) >> 1 & 0xFF);
|
||||
|
||||
break;
|
||||
case < 86 * 2:
|
||||
output[i] |= (byte)(((buffer[i - 86] & 4) >> 1) & 0xFF);
|
||||
output[i] |= (byte)(((buffer[i - 86] & 8) >> 3) & 0xFF);
|
||||
output[i] |= (byte)((buffer[i - 86] & 4) >> 1 & 0xFF);
|
||||
output[i] |= (byte)((buffer[i - 86] & 8) >> 3 & 0xFF);
|
||||
|
||||
break;
|
||||
default:
|
||||
output[i] |= (byte)(((buffer[i - (86 * 2)] & 0x10) >> 3) & 0xFF);
|
||||
output[i] |= (byte)(((buffer[i - (86 * 2)] & 0x20) >> 5) & 0xFF);
|
||||
output[i] |= (byte)((buffer[i - 86 * 2] & 0x10) >> 3 & 0xFF);
|
||||
output[i] |= (byte)((buffer[i - 86 * 2] & 0x20) >> 5 & 0xFF);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -281,57 +282,39 @@ public static class Apple2
|
||||
{
|
||||
addressField = new RawAddressField
|
||||
{
|
||||
prologue = new[]
|
||||
{
|
||||
data[position], data[position + 1], data[position + 2]
|
||||
},
|
||||
volume = new[]
|
||||
{
|
||||
data[position + 3], data[position + 4]
|
||||
},
|
||||
track = new[]
|
||||
{
|
||||
data[position + 5], data[position + 6]
|
||||
},
|
||||
sector = new[]
|
||||
{
|
||||
data[position + 7], data[position + 8]
|
||||
},
|
||||
checksum = new[]
|
||||
{
|
||||
data[position + 9], data[position + 10]
|
||||
},
|
||||
epilogue = new[]
|
||||
{
|
||||
data[position + 11], data[position + 12], data[position + 13]
|
||||
}
|
||||
prologue = new[] { data[position], data[position + 1], data[position + 2] },
|
||||
volume = new[] { data[position + 3], data[position + 4] },
|
||||
track = new[] { data[position + 5], data[position + 6] },
|
||||
sector = new[] { data[position + 7], data[position + 8] },
|
||||
checksum = new[] { data[position + 9], data[position + 10] },
|
||||
epilogue = new[] { data[position + 11], data[position + 12], data[position + 13] }
|
||||
}
|
||||
};
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Volume_0,
|
||||
(((sector.addressField.volume[0] & 0x55) << 1) |
|
||||
(sector.addressField.volume[1] & 0x55)) & 0xFF);
|
||||
((sector.addressField.volume[0] & 0x55) << 1 |
|
||||
sector.addressField.volume[1] & 0x55) & 0xFF);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Core.Track_0,
|
||||
(((sector.addressField.track[0] & 0x55) << 1) |
|
||||
(sector.addressField.track[1] & 0x55)) & 0xFF);
|
||||
((sector.addressField.track[0] & 0x55) << 1 |
|
||||
sector.addressField.track[1] & 0x55) & 0xFF);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Sector_0,
|
||||
(((sector.addressField.sector[0] & 0x55) << 1) |
|
||||
(sector.addressField.sector[1] & 0x55)) & 0xFF);
|
||||
((sector.addressField.sector[0] & 0x55) << 1 |
|
||||
sector.addressField.sector[1] & 0x55) & 0xFF);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Checksum_0,
|
||||
(((sector.addressField.checksum[0] & 0x55) << 1) |
|
||||
(sector.addressField.checksum[1] & 0x55)) & 0xFF);
|
||||
((sector.addressField.checksum[0] & 0x55) << 1 |
|
||||
sector.addressField.checksum[1] & 0x55) & 0xFF);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Epilogue_0_1_2,
|
||||
sector.addressField.epilogue[0], sector.addressField.epilogue[1],
|
||||
sector.addressField.epilogue[2]);
|
||||
|
||||
position += 14;
|
||||
int syncCount = 0;
|
||||
bool onSync = false;
|
||||
var gaps = new MemoryStream();
|
||||
var syncCount = 0;
|
||||
var onSync = false;
|
||||
var gaps = new MemoryStream();
|
||||
|
||||
while(data[position] == 0xFF)
|
||||
{
|
||||
@@ -442,9 +425,9 @@ public static class Apple2
|
||||
|
||||
var raw = new MemoryStream();
|
||||
raw.Write(addressField.prologue, 0, addressField.prologue.Length);
|
||||
raw.Write(addressField.volume, 0, addressField.volume.Length);
|
||||
raw.Write(addressField.track, 0, addressField.track.Length);
|
||||
raw.Write(addressField.sector, 0, addressField.sector.Length);
|
||||
raw.Write(addressField.volume, 0, addressField.volume.Length);
|
||||
raw.Write(addressField.track, 0, addressField.track.Length);
|
||||
raw.Write(addressField.sector, 0, addressField.sector.Length);
|
||||
raw.Write(addressField.checksum, 0, addressField.checksum.Length);
|
||||
raw.Write(addressField.epilogue, 0, addressField.epilogue.Length);
|
||||
|
||||
@@ -458,17 +441,17 @@ public static class Apple2
|
||||
|
||||
var raw = new MemoryStream();
|
||||
raw.Write(sector.addressField.prologue, 0, sector.addressField.prologue.Length);
|
||||
raw.Write(sector.addressField.volume, 0, sector.addressField.volume.Length);
|
||||
raw.Write(sector.addressField.track, 0, sector.addressField.track.Length);
|
||||
raw.Write(sector.addressField.sector, 0, sector.addressField.sector.Length);
|
||||
raw.Write(sector.addressField.volume, 0, sector.addressField.volume.Length);
|
||||
raw.Write(sector.addressField.track, 0, sector.addressField.track.Length);
|
||||
raw.Write(sector.addressField.sector, 0, sector.addressField.sector.Length);
|
||||
raw.Write(sector.addressField.checksum, 0, sector.addressField.checksum.Length);
|
||||
raw.Write(sector.addressField.epilogue, 0, sector.addressField.epilogue.Length);
|
||||
raw.Write(sector.innerGap, 0, sector.innerGap.Length);
|
||||
raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length);
|
||||
raw.Write(sector.dataField.data, 0, sector.dataField.data.Length);
|
||||
raw.Write(sector.innerGap, 0, sector.innerGap.Length);
|
||||
raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length);
|
||||
raw.Write(sector.dataField.data, 0, sector.dataField.data.Length);
|
||||
raw.WriteByte(sector.dataField.checksum);
|
||||
raw.Write(sector.dataField.epilogue, 0, sector.dataField.epilogue.Length);
|
||||
raw.Write(sector.gap, 0, sector.gap.Length);
|
||||
raw.Write(sector.gap, 0, sector.gap.Length);
|
||||
|
||||
return raw.ToArray();
|
||||
}
|
||||
@@ -478,12 +461,12 @@ public static class Apple2
|
||||
public static RawTrack MarshalTrack(byte[] data, out int endOffset, int offset = 0)
|
||||
{
|
||||
int position = offset;
|
||||
bool firstSector = true;
|
||||
bool onSync = false;
|
||||
var firstSector = true;
|
||||
var onSync = false;
|
||||
var gaps = new MemoryStream();
|
||||
int count = 0;
|
||||
var count = 0;
|
||||
List<RawSector> sectors = new();
|
||||
byte[] trackNumber = new byte[2];
|
||||
var trackNumber = new byte[2];
|
||||
endOffset = offset;
|
||||
|
||||
while(position < data.Length &&
|
||||
@@ -525,10 +508,10 @@ public static class Apple2
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Adding_sector_0_of_track_1,
|
||||
(((sector.addressField.sector[0] & 0x55) << 1) |
|
||||
(sector.addressField.sector[1] & 0x55)) & 0xFF,
|
||||
(((sector.addressField.track[0] & 0x55) << 1) |
|
||||
(sector.addressField.track[1] & 0x55)) & 0xFF);
|
||||
((sector.addressField.sector[0] & 0x55) << 1 |
|
||||
sector.addressField.sector[1] & 0x55) & 0xFF,
|
||||
((sector.addressField.track[0] & 0x55) << 1 |
|
||||
sector.addressField.track[1] & 0x55) & 0xFF);
|
||||
|
||||
sectors.Add(sector);
|
||||
}
|
||||
@@ -607,26 +590,7 @@ public static class Apple2
|
||||
return sector != null && position != 0;
|
||||
}
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy track</summary>
|
||||
public class RawTrack
|
||||
{
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, between 40 and 95 bytes</summary>
|
||||
public byte[] gap;
|
||||
public RawSector[] sectors;
|
||||
}
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy sector</summary>
|
||||
public class RawSector
|
||||
{
|
||||
/// <summary>Address field</summary>
|
||||
public RawAddressField addressField;
|
||||
/// <summary>Data field</summary>
|
||||
public RawDataField dataField;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, between 14 and 24 bytes</summary>
|
||||
public byte[] gap;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, between 5 and 10 bytes</summary>
|
||||
public byte[] innerGap;
|
||||
}
|
||||
#region Nested type: RawAddressField
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy sector address field</summary>
|
||||
public class RawAddressField
|
||||
@@ -654,6 +618,10 @@ public static class Apple2
|
||||
public byte[] volume;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RawDataField
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy sector data field</summary>
|
||||
public class RawDataField
|
||||
{
|
||||
@@ -667,4 +635,35 @@ public static class Apple2
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] prologue;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RawSector
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy sector</summary>
|
||||
public class RawSector
|
||||
{
|
||||
/// <summary>Address field</summary>
|
||||
public RawAddressField addressField;
|
||||
/// <summary>Data field</summary>
|
||||
public RawDataField dataField;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, between 14 and 24 bytes</summary>
|
||||
public byte[] gap;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, between 5 and 10 bytes</summary>
|
||||
public byte[] innerGap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RawTrack
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy track</summary>
|
||||
public class RawTrack
|
||||
{
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, between 40 and 95 bytes</summary>
|
||||
public byte[] gap;
|
||||
public RawSector[] sectors;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -43,8 +43,10 @@ namespace Aaru.Decoders.Floppy;
|
||||
// Inside Macintosh, Volume II, ISBN 0-201-17732-3
|
||||
|
||||
/// <summary>Methods and structures for Apple Sony GCR floppy decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public static class AppleSony
|
||||
{
|
||||
public static byte[] DecodeSector(RawSector sector)
|
||||
@@ -54,16 +56,16 @@ public static class AppleSony
|
||||
sector.addressField.prologue[2] != 0x96)
|
||||
return null;
|
||||
|
||||
byte[] bf1 = new byte[175];
|
||||
byte[] bf2 = new byte[175];
|
||||
byte[] bf3 = new byte[175];
|
||||
var bf1 = new byte[175];
|
||||
var bf2 = new byte[175];
|
||||
var bf3 = new byte[175];
|
||||
byte[] nib_data = sector.dataField.data;
|
||||
var ms = new MemoryStream();
|
||||
|
||||
int j = 0;
|
||||
var j = 0;
|
||||
byte w3 = 0;
|
||||
|
||||
for(int i = 0; i <= 174; i++)
|
||||
for(var i = 0; i <= 174; i++)
|
||||
{
|
||||
byte w4 = nib_data[j++];
|
||||
byte w1 = nib_data[j++];
|
||||
@@ -72,9 +74,9 @@ public static class AppleSony
|
||||
if(i != 174)
|
||||
w3 = nib_data[j++];
|
||||
|
||||
bf1[i] = (byte)(((w1 & 0x3F) | ((w4 << 2) & 0xC0)) & 0x0F);
|
||||
bf2[i] = (byte)(((w2 & 0x3F) | ((w4 << 4) & 0xC0)) & 0x0F);
|
||||
bf3[i] = (byte)(((w3 & 0x3F) | ((w4 << 6) & 0xC0)) & 0x0F);
|
||||
bf1[i] = (byte)((w1 & 0x3F | w4 << 2 & 0xC0) & 0x0F);
|
||||
bf2[i] = (byte)((w2 & 0x3F | w4 << 4 & 0xC0) & 0x0F);
|
||||
bf3[i] = (byte)((w3 & 0x3F | w4 << 6 & 0xC0) & 0x0F);
|
||||
}
|
||||
|
||||
j = 0;
|
||||
@@ -89,7 +91,7 @@ public static class AppleSony
|
||||
if((ck1 & 0x0100) > 0)
|
||||
ck1++;
|
||||
|
||||
byte carry = (byte)((bf1[j] ^ ck1) & 0xFF);
|
||||
var carry = (byte)((bf1[j] ^ ck1) & 0xFF);
|
||||
ck3 += carry;
|
||||
|
||||
if((ck1 & 0x0100) > 0)
|
||||
@@ -163,26 +165,20 @@ public static class AppleSony
|
||||
{
|
||||
addressField = new RawAddressField
|
||||
{
|
||||
prologue = new[]
|
||||
{
|
||||
data[position], data[position + 1], data[position + 2]
|
||||
},
|
||||
prologue = new[] { data[position], data[position + 1], data[position + 2] },
|
||||
track = data[position + 3],
|
||||
sector = data[position + 4],
|
||||
side = data[position + 5],
|
||||
format = (AppleEncodedFormat)data[position + 6],
|
||||
checksum = data[position + 7],
|
||||
epilogue = new[]
|
||||
{
|
||||
data[position + 8], data[position + 9]
|
||||
}
|
||||
epilogue = new[] { data[position + 8], data[position + 9] }
|
||||
}
|
||||
};
|
||||
|
||||
position += 10;
|
||||
int syncCount = 0;
|
||||
bool onSync = false;
|
||||
var gaps = new MemoryStream();
|
||||
var syncCount = 0;
|
||||
var onSync = false;
|
||||
var gaps = new MemoryStream();
|
||||
|
||||
while(data[position] == 0xFF)
|
||||
{
|
||||
@@ -206,11 +202,8 @@ public static class AppleSony
|
||||
|
||||
sector.dataField = new RawDataField
|
||||
{
|
||||
prologue = new[]
|
||||
{
|
||||
data[position], data[position + 1], data[position + 2]
|
||||
},
|
||||
spare = data[position + 3]
|
||||
prologue = new[] { data[position], data[position + 1], data[position + 2] },
|
||||
spare = data[position + 3]
|
||||
};
|
||||
|
||||
position += 4;
|
||||
@@ -309,13 +302,13 @@ public static class AppleSony
|
||||
raw.WriteByte(sector.addressField.side);
|
||||
raw.WriteByte((byte)sector.addressField.format);
|
||||
raw.WriteByte(sector.addressField.checksum);
|
||||
raw.Write(sector.innerGap, 0, sector.innerGap.Length);
|
||||
raw.Write(sector.innerGap, 0, sector.innerGap.Length);
|
||||
raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length);
|
||||
raw.WriteByte(sector.dataField.spare);
|
||||
raw.Write(sector.dataField.data, 0, sector.dataField.data.Length);
|
||||
raw.Write(sector.dataField.data, 0, sector.dataField.data.Length);
|
||||
raw.Write(sector.dataField.checksum, 0, sector.dataField.checksum.Length);
|
||||
raw.Write(sector.dataField.epilogue, 0, sector.dataField.epilogue.Length);
|
||||
raw.Write(sector.gap, 0, sector.gap.Length);
|
||||
raw.Write(sector.gap, 0, sector.gap.Length);
|
||||
|
||||
return raw.ToArray();
|
||||
}
|
||||
@@ -325,10 +318,10 @@ public static class AppleSony
|
||||
public static RawTrack MarshalTrack(byte[] data, out int endOffset, int offset = 0)
|
||||
{
|
||||
int position = offset;
|
||||
bool firstSector = true;
|
||||
bool onSync = false;
|
||||
var firstSector = true;
|
||||
var onSync = false;
|
||||
var gaps = new MemoryStream();
|
||||
int count = 0;
|
||||
var count = 0;
|
||||
List<RawSector> sectors = new();
|
||||
byte trackNumber = 0;
|
||||
byte sideNumber = 0;
|
||||
@@ -449,26 +442,7 @@ public static class AppleSony
|
||||
return sector != null && position != 0;
|
||||
}
|
||||
|
||||
/// <summary>GCR-encoded Apple Sony GCR floppy track</summary>
|
||||
public class RawTrack
|
||||
{
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, 36 bytes</summary>
|
||||
public byte[] gap;
|
||||
public RawSector[] sectors;
|
||||
}
|
||||
|
||||
/// <summary>GCR-encoded Apple Sony GCR floppy sector</summary>
|
||||
public class RawSector
|
||||
{
|
||||
/// <summary>Address field</summary>
|
||||
public RawAddressField addressField;
|
||||
/// <summary>Data field</summary>
|
||||
public RawDataField dataField;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, unknown size</summary>
|
||||
public byte[] gap;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, 6 bytes</summary>
|
||||
public byte[] innerGap;
|
||||
}
|
||||
#region Nested type: RawAddressField
|
||||
|
||||
/// <summary>GCR-encoded Apple Sony GCR floppy sector address field</summary>
|
||||
public class RawAddressField
|
||||
@@ -491,6 +465,10 @@ public static class AppleSony
|
||||
public byte track;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RawDataField
|
||||
|
||||
/// <summary>GCR-encoded Apple ][ GCR floppy sector data field</summary>
|
||||
public class RawDataField
|
||||
{
|
||||
@@ -509,4 +487,35 @@ public static class AppleSony
|
||||
/// <summary>Spare, usually <see cref="RawAddressField.sector" /></summary>
|
||||
public byte spare;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RawSector
|
||||
|
||||
/// <summary>GCR-encoded Apple Sony GCR floppy sector</summary>
|
||||
public class RawSector
|
||||
{
|
||||
/// <summary>Address field</summary>
|
||||
public RawAddressField addressField;
|
||||
/// <summary>Data field</summary>
|
||||
public RawDataField dataField;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, unknown size</summary>
|
||||
public byte[] gap;
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, 6 bytes</summary>
|
||||
public byte[] innerGap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: RawTrack
|
||||
|
||||
/// <summary>GCR-encoded Apple Sony GCR floppy track</summary>
|
||||
public class RawTrack
|
||||
{
|
||||
/// <summary>Track preamble, set to self-sync 0xFF, 36 bytes</summary>
|
||||
public byte[] gap;
|
||||
public RawSector[] sectors;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -36,10 +36,31 @@ using System.Runtime.InteropServices;
|
||||
namespace Aaru.Decoders.Floppy;
|
||||
|
||||
/// <summary>Methods and structures for Commodore GCR floppy decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class Commodore
|
||||
{
|
||||
#region Nested type: SectorData
|
||||
|
||||
/// <summary>Decoded Commodore GCR sector data</summary>
|
||||
public struct SectorData
|
||||
{
|
||||
/// <summary>Always 0x07</summary>
|
||||
public byte id;
|
||||
/// <summary>User data</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
|
||||
public byte data;
|
||||
/// <summary>XOR of <see cref="data" /></summary>
|
||||
public byte checksum;
|
||||
/// <summary>Filled with 0x0F</summary>
|
||||
public ushort fill;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: SectorHeader
|
||||
|
||||
/// <summary>Decoded Commodore GCR sector header</summary>
|
||||
public struct SectorHeader
|
||||
{
|
||||
@@ -57,17 +78,5 @@ public static class Commodore
|
||||
public ushort fill;
|
||||
}
|
||||
|
||||
/// <summary>Decoded Commodore GCR sector data</summary>
|
||||
public struct SectorData
|
||||
{
|
||||
/// <summary>Always 0x07</summary>
|
||||
public byte id;
|
||||
/// <summary>User data</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
|
||||
public byte data;
|
||||
/// <summary>XOR of <see cref="data" /></summary>
|
||||
public byte checksum;
|
||||
/// <summary>Filled with 0x0F</summary>
|
||||
public ushort fill;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
@@ -59,7 +59,9 @@ public enum IBMSectorSizeCode : byte
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public enum IBMIdType : byte
|
||||
{
|
||||
IndexMark = 0xFC, AddressMark = 0xFE, DataMark = 0xFB,
|
||||
IndexMark = 0xFC,
|
||||
AddressMark = 0xFE,
|
||||
DataMark = 0xFB,
|
||||
DeletedDataMark = 0xF8
|
||||
}
|
||||
|
||||
|
||||
@@ -46,35 +46,12 @@ namespace Aaru.Decoders.Floppy;
|
||||
// ECMA-100
|
||||
|
||||
/// <summary>Methods and structures for ISO floppy decoding (also used by Atari ST and others)</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class ISO
|
||||
{
|
||||
/// <summary>ISO floppy track, also used by Atari ST and others</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track, 32 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
/// <summary>Raw demodulated format for IBM System 34 floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>22 bytes set to 0x4E, set to 0x22 on Commodore 1581</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable bytes set to 0x4E, ECMA defines 54</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
#region Nested type: AddressMark
|
||||
|
||||
/// <summary>Sector address mark for IBM System 34 floppies, contains sync word</summary>
|
||||
public struct AddressMark
|
||||
@@ -101,6 +78,10 @@ public static class ISO
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DataBlock
|
||||
|
||||
/// <summary>Sector data block for IBM System 34 floppies</summary>
|
||||
public struct DataBlock
|
||||
{
|
||||
@@ -117,4 +98,40 @@ public static class ISO
|
||||
/// <summary>CRC16 from <see cref="aone" /> to end of <see cref="data" /></summary>
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Sector
|
||||
|
||||
/// <summary>Raw demodulated format for IBM System 34 floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>22 bytes set to 0x4E, set to 0x22 on Commodore 1581</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable bytes set to 0x4E, ECMA defines 54</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Track
|
||||
|
||||
/// <summary>ISO floppy track, also used by Atari ST and others</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track, 32 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -46,53 +46,12 @@ namespace Aaru.Decoders.Floppy;
|
||||
// ECMA-100
|
||||
|
||||
/// <summary>Methods and structures for perpendicular MFM floppy decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class Perpendicular
|
||||
{
|
||||
/// <summary>Perpendicular floppy track</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track</summary>
|
||||
public TrackPreamble trackStart;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
/// <summary>Raw demodulated format for perpendicular floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>41 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable-sized inter-sector gap, ECMA defines 83 bytes</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
|
||||
/// <summary>Start of IBM PC MFM floppy track Used by IBM PC, Apple Macintosh (high-density only), and a lot others</summary>
|
||||
public struct TrackPreamble
|
||||
{
|
||||
/// <summary>Gap from index pulse, 80 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
|
||||
public byte[] gap;
|
||||
/// <summary>12 bytes set to 0x00</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] zero;
|
||||
/// <summary>3 bytes set to 0xC2</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] ctwo;
|
||||
/// <summary>Set to <see cref="IBMIdType.IndexMark" /></summary>
|
||||
public IBMIdType type;
|
||||
/// <summary>Gap until first sector, 50 bytes to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
|
||||
public byte[] gap1;
|
||||
}
|
||||
#region Nested type: AddressMark
|
||||
|
||||
/// <summary>Sector address mark for IBM System 34 floppies, contains sync word</summary>
|
||||
public struct AddressMark
|
||||
@@ -119,6 +78,10 @@ public static class Perpendicular
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DataBlock
|
||||
|
||||
/// <summary>Sector data block for IBM System 34 floppies</summary>
|
||||
public struct DataBlock
|
||||
{
|
||||
@@ -135,4 +98,62 @@ public static class Perpendicular
|
||||
/// <summary>CRC16 from <see cref="aone" /> to end of <see cref="data" /></summary>
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Sector
|
||||
|
||||
/// <summary>Raw demodulated format for perpendicular floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>41 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable-sized inter-sector gap, ECMA defines 83 bytes</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Track
|
||||
|
||||
/// <summary>Perpendicular floppy track</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track</summary>
|
||||
public TrackPreamble trackStart;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: TrackPreamble
|
||||
|
||||
/// <summary>Start of IBM PC MFM floppy track Used by IBM PC, Apple Macintosh (high-density only), and a lot others</summary>
|
||||
public struct TrackPreamble
|
||||
{
|
||||
/// <summary>Gap from index pulse, 80 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
|
||||
public byte[] gap;
|
||||
/// <summary>12 bytes set to 0x00</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] zero;
|
||||
/// <summary>3 bytes set to 0xC2</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] ctwo;
|
||||
/// <summary>Set to <see cref="IBMIdType.IndexMark" /></summary>
|
||||
public IBMIdType type;
|
||||
/// <summary>Gap until first sector, 50 bytes to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
|
||||
public byte[] gap1;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -46,53 +46,12 @@ namespace Aaru.Decoders.Floppy;
|
||||
// ECMA-100
|
||||
|
||||
/// <summary>Methods and structures for IBM System 34 floppy decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class System34
|
||||
{
|
||||
/// <summary>Track format for IBM System 34 floppy Used by IBM PC, Apple Macintosh (high-density only), and a lot others</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track</summary>
|
||||
public TrackPreamble trackStart;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
/// <summary>Start of IBM PC MFM floppy track Used by IBM PC, Apple Macintosh (high-density only), and a lot others</summary>
|
||||
public struct TrackPreamble
|
||||
{
|
||||
/// <summary>Gap from index pulse, 80 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
|
||||
public byte[] gap;
|
||||
/// <summary>12 bytes set to 0x00</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] zero;
|
||||
/// <summary>3 bytes set to 0xC2</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] ctwo;
|
||||
/// <summary>Set to <see cref="IBMIdType.IndexMark" /></summary>
|
||||
public IBMIdType type;
|
||||
/// <summary>Gap until first sector, 50 bytes to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
|
||||
public byte[] gap1;
|
||||
}
|
||||
|
||||
/// <summary>Raw demodulated format for IBM System 34 floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>22 bytes set to 0x4E, set to 0x22 on Commodore 1581</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable bytes set to 0x4E, ECMA defines 54</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
#region Nested type: AddressMark
|
||||
|
||||
/// <summary>Sector address mark for IBM System 34 floppies, contains sync word</summary>
|
||||
public struct AddressMark
|
||||
@@ -119,6 +78,10 @@ public static class System34
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DataBlock
|
||||
|
||||
/// <summary>Sector data block for IBM System 34 floppies</summary>
|
||||
public struct DataBlock
|
||||
{
|
||||
@@ -135,4 +98,62 @@ public static class System34
|
||||
/// <summary>CRC16 from <see cref="aone" /> to end of <see cref="data" /></summary>
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Sector
|
||||
|
||||
/// <summary>Raw demodulated format for IBM System 34 floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>22 bytes set to 0x4E, set to 0x22 on Commodore 1581</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable bytes set to 0x4E, ECMA defines 54</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Track
|
||||
|
||||
/// <summary>Track format for IBM System 34 floppy Used by IBM PC, Apple Macintosh (high-density only), and a lot others</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track</summary>
|
||||
public TrackPreamble trackStart;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: TrackPreamble
|
||||
|
||||
/// <summary>Start of IBM PC MFM floppy track Used by IBM PC, Apple Macintosh (high-density only), and a lot others</summary>
|
||||
public struct TrackPreamble
|
||||
{
|
||||
/// <summary>Gap from index pulse, 80 bytes set to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)]
|
||||
public byte[] gap;
|
||||
/// <summary>12 bytes set to 0x00</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] zero;
|
||||
/// <summary>3 bytes set to 0xC2</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] ctwo;
|
||||
/// <summary>Set to <see cref="IBMIdType.IndexMark" /></summary>
|
||||
public IBMIdType type;
|
||||
/// <summary>Gap until first sector, 50 bytes to 0x4E</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
|
||||
public byte[] gap1;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -46,50 +46,12 @@ namespace Aaru.Decoders.Floppy;
|
||||
// ECMA-100
|
||||
|
||||
/// <summary>Methods and structures for IBM System 3740 floppy decoding</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class System3740
|
||||
{
|
||||
/// <summary>Track format for IBM System 3740 floppy</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track</summary>
|
||||
public TrackPreamble trackStart;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
/// <summary>Start of IBM PC FM floppy track</summary>
|
||||
public struct TrackPreamble
|
||||
{
|
||||
/// <summary>Gap from index pulse, 80 bytes set to 0xFF</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
|
||||
public byte[] gap;
|
||||
/// <summary>6 bytes set to 0x00</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[] zero;
|
||||
/// <summary>Set to <see cref="IBMIdType.IndexMark" /></summary>
|
||||
public IBMIdType type;
|
||||
/// <summary>Gap until first sector, 26 bytes to 0xFF</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
|
||||
public byte[] gap1;
|
||||
}
|
||||
|
||||
/// <summary>Raw demodulated format for IBM System 3740 floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>11 bytes set to 0xFF</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable bytes set to 0xFF</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
#region Nested type: AddressMark
|
||||
|
||||
/// <summary>Sector address mark for IBM System 3740 floppies, contains sync word</summary>
|
||||
public struct AddressMark
|
||||
@@ -113,6 +75,10 @@ public static class System3740
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: DataBlock
|
||||
|
||||
/// <summary>Sector data block for IBM System 3740 floppies</summary>
|
||||
public struct DataBlock
|
||||
{
|
||||
@@ -126,4 +92,59 @@ public static class System3740
|
||||
/// <summary>CRC16 from <see cref="type" /> to end of <see cref="data" /></summary>
|
||||
public ushort crc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Sector
|
||||
|
||||
/// <summary>Raw demodulated format for IBM System 3740 floppies</summary>
|
||||
public struct Sector
|
||||
{
|
||||
/// <summary>Sector address mark</summary>
|
||||
public AddressMark addressMark;
|
||||
/// <summary>11 bytes set to 0xFF</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
|
||||
public byte[] innerGap;
|
||||
/// <summary>Sector data block</summary>
|
||||
public DataBlock dataBlock;
|
||||
/// <summary>Variable bytes set to 0xFF</summary>
|
||||
public byte[] outerGap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: Track
|
||||
|
||||
/// <summary>Track format for IBM System 3740 floppy</summary>
|
||||
public struct Track
|
||||
{
|
||||
/// <summary>Start of track</summary>
|
||||
public TrackPreamble trackStart;
|
||||
/// <summary>Track sectors</summary>
|
||||
public Sector[] sectors;
|
||||
/// <summary>Undefined size</summary>
|
||||
public byte[] gap;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Nested type: TrackPreamble
|
||||
|
||||
/// <summary>Start of IBM PC FM floppy track</summary>
|
||||
public struct TrackPreamble
|
||||
{
|
||||
/// <summary>Gap from index pulse, 80 bytes set to 0xFF</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
|
||||
public byte[] gap;
|
||||
/// <summary>6 bytes set to 0x00</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[] zero;
|
||||
/// <summary>Set to <see cref="IBMIdType.IndexMark" /></summary>
|
||||
public IBMIdType type;
|
||||
/// <summary>Gap until first sector, 26 bytes to 0xFF</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
|
||||
public byte[] gap1;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user