1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-03-02 05:29:11 +00:00

59 lines
1.6 KiB
C++
Raw Normal View History

//
// Parser.hpp
// Clock Signal
//
// Created by Thomas Harte on 24/09/2017.
// Copyright 2017 Thomas Harte. All rights reserved.
//
#pragma once
2023-12-10 22:17:23 -05:00
#include "Constants.hpp"
#include "Sector.hpp"
2023-12-11 10:32:13 -05:00
#include "SegmentParser.hpp"
#include "../../Track/Track.hpp"
#include "../../Drive.hpp"
2023-12-11 10:32:13 -05:00
#include <optional>
2023-05-10 16:02:18 -05:00
namespace Storage::Encodings::MFM {
/*!
Provides a mechanism for collecting sectors from a disk.
*/
class Parser {
public:
2023-12-11 10:32:13 -05:00
/// Creates a parser that will only attempt to interpret the underlying disk as being of @c density.
2023-12-10 22:17:23 -05:00
Parser(Density density, const std::shared_ptr<Storage::Disk::Disk> &disk);
2023-12-11 10:32:13 -05:00
/// Creates a parser that will automatically try all available FM and MFM densities to try to extract sectors.
Parser(const std::shared_ptr<Storage::Disk::Disk> &disk);
/*!
Seeks to the physical track at @c head and @c track. Searches on it for a sector
with logical address @c sector.
@returns a sector if one was found; @c nullptr otherwise.
*/
2023-12-11 09:58:24 -05:00
const Storage::Encodings::MFM::Sector *sector(int head, int track, uint8_t sector);
2023-12-11 10:32:13 -05:00
// TODO: set_sector.
private:
std::shared_ptr<Storage::Disk::Disk> disk_;
2023-12-11 10:32:13 -05:00
std::optional<Density> density_;
2023-12-11 09:58:24 -05:00
void install_track(const Storage::Disk::Track::Address &address);
2023-12-11 10:32:13 -05:00
static SectorMap parse_track(const Storage::Disk::Track &track, Density density);
static void append(const SectorMap &source, std::map<int, Sector> &destination);
2023-12-11 09:58:24 -05:00
// Maps from a track address, i.e. head and position, to a map from
// sector IDs to sectors.
std::map<
Storage::Disk::Track::Address,
std::map<int, Storage::Encodings::MFM::Sector>
> sectors_by_address_by_track_;
};
}