[Aaru.Decoders] Reformat and cleanup.

This commit is contained in:
2023-10-03 23:09:28 +01:00
parent 4b26439847
commit 99e85ca762
123 changed files with 43962 additions and 30991 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}