Well not a whole heap done today as we had a rare glimpse of the sun. The checksum checking is done & I’ve created a C# struct that represents all the non-Sync parts of a sector:
[StructLayout(LayoutKind.Sequential, Size = 540, Pack = 1)]
private struct AmigaSector
{
public byte DiskFormat, TrackNumber, SectorNumber, SectorsToWrite;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] SectorLabel;
public uint HeaderChecksum
{
get
{
return (uint)(HeaderChecksum4 << 24 | HeaderChecksum3 << 16 | HeaderChecksum2 << 8 | HeaderChecksum1);
}
}
public byte HeaderChecksum4;
public byte HeaderChecksum3;
public byte HeaderChecksum2;
public byte HeaderChecksum1;
public uint DataChecksum
{
get
{
return (uint)(DataChecksum4 << 24 | DataChecksum3 << 16 | DataChecksum2 << 8 | DataChecksum1);
}
}
public byte DataChecksum4;
public byte DataChecksum3;
public byte DataChecksum2;
public byte DataChecksum1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
public byte[] SectorData;
}
The properties were needed because Amiga longs are stored as Big Endian and they do the conversion for me.
I still need to tidy the code a little but I’ve run the checksum check over the first 14 sectors I am sniffing. The results look perfect so far:
Sync Marker found FMT: 255 TRK: 0 SEC: 3 REM: 8 Stored header csum: 0x00000004 Calculated header csum: 0x00000004 Stored data csum: 0x15441114 Calculated data csum: 0x15441114 Sync Marker found FMT: 255 TRK: 0 SEC: 4 REM: 7 Stored header csum: 0x00000404 Calculated header csum: 0x00000404 Stored data csum: 0x04051114 Calculated data csum: 0x04051114 Sync Marker found FMT: 255 TRK: 0 SEC: 5 REM: 6 Stored header csum: 0x00000505 Calculated header csum: 0x00000505 Stored data csum: 0x11001410 Calculated data csum: 0x11001410 Sync Marker found FMT: 255 TRK: 0 SEC: 6 REM: 5 Stored header csum: 0x00000505 Calculated header csum: 0x00000505 Stored data csum: 0x51514551 Calculated data csum: 0x51514551 Sync Marker found FMT: 255 TRK: 0 SEC: 7 REM: 4 Stored header csum: 0x00000404 Calculated header csum: 0x00000404 Stored data csum: 0x05045155 Calculated data csum: 0x05045155 Sync Marker found FMT: 255 TRK: 0 SEC: 8 REM: 3 Stored header csum: 0x00000400 Calculated header csum: 0x00000400 Stored data csum: 0x51444054 Calculated data csum: 0x51444054 Sync Marker found FMT: 255 TRK: 0 SEC: 9 REM: 2 Stored header csum: 0x00000501 Calculated header csum: 0x00000501 Stored data csum: 0x44555051 Calculated data csum: 0x44555051 Sync Marker found FMT: 255 TRK: 0 SEC: 10 REM: 1 Stored header csum: 0x00000501 Calculated header csum: 0x00000501 Stored data csum: 0x10504040 Calculated data csum: 0x10504040 Sync Marker found FMT: 255 TRK: 0 SEC: 0 REM: 11 Stored header csum: 0x00000004 Calculated header csum: 0x00000004 Stored data csum: 0x54151100 Calculated data csum: 0x54151100 Sync Marker found FMT: 255 TRK: 0 SEC: 1 REM: 10 Stored header csum: 0x00000105 Calculated header csum: 0x00000105 Stored data csum: 0x00000000 Calculated data csum: 0x00000000 Sync Marker found FMT: 255 TRK: 0 SEC: 2 REM: 9 Stored header csum: 0x00000105 Calculated header csum: 0x00000105 Stored data csum: 0x15410001 Calculated data csum: 0x15410001 Sync Marker found FMT: 255 TRK: 0 SEC: 3 REM: 8 Stored header csum: 0x00000004 Calculated header csum: 0x00000004 Stored data csum: 0x15441114 Calculated data csum: 0x15441114 Sync Marker found FMT: 255 TRK: 0 SEC: 4 REM: 7 Stored header csum: 0x00000404 Calculated header csum: 0x00000404 Stored data csum: 0x04051114 Calculated data csum: 0x04051114 Sync Marker found FMT: 255 TRK: 0 SEC: 5 REM: 6 Stored header csum: 0x00000505 Calculated header csum: 0x00000505 Stored data csum: 0x11001410 Calculated data csum: 0x11001410