MCPcopy Create free account
hub / github.com/davidgiven/fluxengine / decodeSectorRecord

Method decodeSectorRecord

arch/amiga/decoder.cc:39–75  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

37 }
38
39 void decodeSectorRecord() override
40 {
41 if (readRaw48() != AMIGA_SECTOR_RECORD)
42 return;
43
44 const auto& rawbits = readRawBits(AMIGA_RECORD_SIZE * 16);
45 if (rawbits.size() < (AMIGA_RECORD_SIZE * 16))
46 return;
47 const auto& rawbytes = toBytes(rawbits).slice(0, AMIGA_RECORD_SIZE * 2);
48 const auto& bytes = decodeFmMfm(rawbits).slice(0, AMIGA_RECORD_SIZE);
49
50 const uint8_t* ptr = bytes.begin();
51
52 Bytes header = amigaDeinterleave(ptr, 4);
53 Bytes recoveryinfo = amigaDeinterleave(ptr, 16);
54
55 _sector->logicalCylinder = header[1] >> 1;
56 _sector->logicalHead = header[1] & 1;
57 _sector->logicalSector = header[2];
58
59 uint32_t wantedheaderchecksum =
60 amigaDeinterleave(ptr, 4).reader().read_be32();
61 uint32_t gotheaderchecksum = amigaChecksum(rawbytes.slice(0, 40));
62 if (gotheaderchecksum != wantedheaderchecksum)
63 return;
64
65 uint32_t wanteddatachecksum =
66 amigaDeinterleave(ptr, 4).reader().read_be32();
67 uint32_t gotdatachecksum = amigaChecksum(rawbytes.slice(56, 1024));
68
69 Bytes data;
70 data.writer().append(amigaDeinterleave(ptr, 512)).append(recoveryinfo);
71 _sector->data = data;
72 _sector->status = (gotdatachecksum == wanteddatachecksum)
73 ? Sector::OK
74 : Sector::BAD_CHECKSUM;
75 }
76
77private:
78 const AmigaDecoderProto& _config;

Callers

nothing calls this directly

Calls 10

amigaDeinterleaveFunction · 0.85
amigaChecksumFunction · 0.85
sliceMethod · 0.80
read_be32Method · 0.80
readerMethod · 0.80
writerMethod · 0.80
toBytesFunction · 0.50
decodeFmMfmFunction · 0.50
sizeMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected