mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-15 14:27:29 +00:00
Merge pull request #434 from TomHarte/RelaxedParsing
Removes requirement for correct sector epilogues.
This commit is contained in:
@@ -85,18 +85,15 @@ std::map<std::size_t, Sector> Storage::Encodings::AppleGCR::sectors_from_segment
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(new_sector) {
|
if(new_sector) {
|
||||||
// If this is an epilogue, make sense of this whole sector;
|
new_sector->data.push_back(value);
|
||||||
// otherwise just keep the byte for later.
|
|
||||||
if(scanner[1] == epilogue[0] && scanner[2] == epilogue[1]) {
|
// If this is potentially a complete sector, check it out.
|
||||||
|
if(new_sector->data.size() == 343) {
|
||||||
|
// TODO: allow for 13-sector form.
|
||||||
std::unique_ptr<Sector> sector = std::move(new_sector);
|
std::unique_ptr<Sector> sector = std::move(new_sector);
|
||||||
new_sector.reset();
|
new_sector.reset();
|
||||||
pointer = scanning_sentinel;
|
pointer = scanning_sentinel;
|
||||||
|
|
||||||
// Check for an expected size; the first byte of the epilogue has been stored, so
|
|
||||||
// these numbers are one bigger than usual.
|
|
||||||
if(sector->data.size() != 412 && sector->data.size() != 344) continue;
|
|
||||||
sector->data.resize(sector->data.size() - 1);
|
|
||||||
|
|
||||||
// Check for apparent four and four encoding.
|
// Check for apparent four and four encoding.
|
||||||
uint_fast8_t header_mask = 0xff;
|
uint_fast8_t header_mask = 0xff;
|
||||||
for(auto c : header) header_mask &= c;
|
for(auto c : header) header_mask &= c;
|
||||||
@@ -111,7 +108,6 @@ std::map<std::size_t, Sector> Storage::Encodings::AppleGCR::sectors_from_segment
|
|||||||
uint_fast8_t checksum = ((header[6] << 1) | 1) & header[7];
|
uint_fast8_t checksum = ((header[6] << 1) | 1) & header[7];
|
||||||
if(checksum != (sector->address.volume^sector->address.track^sector->address.sector)) continue;
|
if(checksum != (sector->address.volume^sector->address.track^sector->address.sector)) continue;
|
||||||
|
|
||||||
if(sector->data.size() == 343) {
|
|
||||||
// Unmap the sector contents as 6 and 2 data.
|
// Unmap the sector contents as 6 and 2 data.
|
||||||
bool out_of_bounds = false;
|
bool out_of_bounds = false;
|
||||||
for(auto &c : sector->data) {
|
for(auto &c : sector->data) {
|
||||||
@@ -150,15 +146,12 @@ std::map<std::size_t, Sector> Storage::Encodings::AppleGCR::sectors_from_segment
|
|||||||
unmap(171, 85, 2);
|
unmap(171, 85, 2);
|
||||||
|
|
||||||
#undef unmap
|
#undef unmap
|
||||||
}
|
|
||||||
|
|
||||||
// Throw away the collection of two-bit chunks.
|
// Throw away the collection of two-bit chunks.
|
||||||
sector->data.erase(sector->data.begin(), sector->data.end() - 256);
|
sector->data.erase(sector->data.begin(), sector->data.end() - 256);
|
||||||
|
|
||||||
// Add this sector to the map.
|
// Add this sector to the map.
|
||||||
result.insert(std::make_pair(sector_location, std::move(*sector)));
|
result.insert(std::make_pair(sector_location, std::move(*sector)));
|
||||||
} else {
|
|
||||||
new_sector->data.push_back(value);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Just capture the header in place; it'll be decoded
|
// Just capture the header in place; it'll be decoded
|
||||||
|
Reference in New Issue
Block a user