mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-22 12:33:29 +00:00
Avoid off-by-one error in sector decoding.
Specific issue: retaining the 256 bytes up to _and including_ the checksum, rather than excluding.
This commit is contained in:
parent
9cba56237d
commit
d17fadbe0b
@ -175,11 +175,12 @@ std::unique_ptr<Sector> decode_appleii_sector(const std::array<uint_fast8_t, 8>
|
||||
}
|
||||
}
|
||||
|
||||
// Undo the XOR step on sector contents and check that checksum.
|
||||
// Undo the XOR step on sector contents, then check and discard the checksum.
|
||||
for(std::size_t c = 1; c < sector->data.size(); ++c) {
|
||||
sector->data[c] ^= sector->data[c-1];
|
||||
}
|
||||
if(sector->data.back()) return nullptr;
|
||||
sector->data.resize(sector->data.size() - 1);
|
||||
|
||||
if(is_five_and_three) {
|
||||
// TODO: the below is almost certainly incorrect; Beneath Apple DOS partly documents
|
||||
@ -275,7 +276,8 @@ std::map<std::size_t, Sector> Storage::Encodings::AppleGCR::sectors_from_segment
|
||||
scanner[2] == five_and_three_header_prologue[2] ||
|
||||
scanner[2] == header_prologue[2] ||
|
||||
scanner[2] == data_prologue[2]
|
||||
)) {
|
||||
)
|
||||
) {
|
||||
pointer = 0;
|
||||
|
||||
if(scanner[2] != data_prologue[2]) {
|
||||
@ -309,20 +311,21 @@ std::map<std::size_t, Sector> Storage::Encodings::AppleGCR::sectors_from_segment
|
||||
new_sector.reset();
|
||||
pointer = scanning_sentinel;
|
||||
|
||||
const bool had_header = has_header;
|
||||
has_header = false;
|
||||
|
||||
// Potentially this is a Macintosh sector.
|
||||
auto macintosh_sector = decode_macintosh_sector(has_header ? &header : nullptr, sector);
|
||||
auto macintosh_sector = decode_macintosh_sector(had_header ? &header : nullptr, sector);
|
||||
if(macintosh_sector) {
|
||||
result.insert(std::make_pair(sector_location, std::move(*macintosh_sector)));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Apple II then?
|
||||
auto appleii_sector = decode_appleii_sector(has_header ? &header : nullptr, sector, is_five_and_three);
|
||||
auto appleii_sector = decode_appleii_sector(had_header ? &header : nullptr, sector, is_five_and_three);
|
||||
if(appleii_sector) {
|
||||
result.insert(std::make_pair(sector_location, std::move(*appleii_sector)));
|
||||
}
|
||||
|
||||
has_header = false;
|
||||
} else {
|
||||
new_sector->data.push_back(value);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user