1212
1313static const FluxPattern SECTOR_PATTERN (32 , AESLANIER5_RECORD_SEPARATOR);
1414
15- /* This is actually M2FM , rather than MFM, but it our MFM/FM decoder copes fine
15+ /* This is actually FM , rather than MFM, but it our MFM/FM decoder copes fine
1616 * with it. */
1717
1818class AesLanier5Decoder : public Decoder
@@ -29,32 +29,45 @@ class AesLanier5Decoder : public Decoder
2929 {
3030 /* Skip ID mark (we know it's a AESLANIER5_RECORD_SEPARATOR). */
3131
32- readRawBits (16 );
32+ readRawBits (SECTOR_PATTERN. length () );
3333
3434 const auto & rawbits = readRawBits (AESLANIER5_RECORD_SIZE * 16 );
3535 const auto & bytes =
3636 decodeFmMfm (rawbits).slice (0 , AESLANIER5_RECORD_SIZE);
3737 const auto & reversed = bytes.reverseBits ();
3838
39- _sector->logicalTrack = reversed[1 ];
39+ uint8_t encodedTrack = reversed[0 ];
40+ uint8_t encodedSector = reversed[1 ];
41+
42+ _sector->logicalTrack = encodedTrack >> 1 ;
4043 _sector->logicalSide = 0 ;
41- _sector->logicalSector = reversed[ 2 ] ;
44+ _sector->logicalSector = encodedSector ;
4245
4346 /* Check header 'checksum' (which seems far too simple to mean much). */
4447
4548 {
46- uint8_t wanted = reversed[3 ];
47- uint8_t got = reversed[1 ] + reversed[2 ];
49+ uint8_t wanted = reversed[2 ];
50+ uint8_t got = reversed[0 ] + reversed[1 ];
4851 if (wanted != got)
4952 return ;
5053 }
5154
5255 /* Check data checksum, which also includes the header and is
5356 * significantly better. */
5457
55- _sector->data = reversed.slice (1 , AESLANIER5_SECTOR_LENGTH);
56- uint16_t wanted = reversed.reader ().seek (0x101 ).read_le16 ();
57- uint16_t got = crc16ref (MODBUS_POLY_REF, _sector->data );
58+ _sector->data = reversed.slice (3 , AESLANIER5_SECTOR_LENGTH);
59+ uint8_t wanted, got;
60+ ByteReader br (_sector->data );
61+ if ((encodedSector == 0 ) || (encodedSector == 8 ))
62+ {
63+ wanted = br.seek (17 ).read_8 () + br.seek (150 ).read_8 ();
64+ got = sumBytes (_sector->data .slice (0 , 17 )) + sumBytes (_sector->data .slice (18 , 132 ));
65+ }
66+ else
67+ {
68+ wanted = br.seek (150 ).read_8 ();
69+ got = sumBytes (_sector->data .slice (0 , AESLANIER5_SECTOR_LENGTH-1 ));
70+ }
5871 _sector->status = (wanted == got) ? Sector::OK : Sector::BAD_CHECKSUM;
5972 }
6073};
0 commit comments