1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 08:49:37 +00:00
CLK/Storage/Tape/Formats/CAS.hpp

69 lines
1.5 KiB
C++
Raw Normal View History

//
// CAS.hpp
// Clock Signal
//
// Created by Thomas Harte on 25/11/2017.
// Copyright 2017 Thomas Harte. All rights reserved.
//
#pragma once
#include "../Tape.hpp"
#include "../../FileHolder.hpp"
#include <cstdint>
#include <string>
#include <vector>
2023-05-10 21:02:18 +00:00
namespace Storage::Tape {
/*!
Provides a @c Tape containing a CAS tape image, which is an MSX byte stream.
*/
class CAS: public Tape {
public:
/*!
Constructs a @c CAS containing content from the file with name @c file_name.
@throws ErrorNotCAS if this file could not be opened and recognised as a valid CAS file.
*/
CAS(const std::string &file_name);
enum {
ErrorNotCAS
};
// implemented to satisfy @c Tape
bool is_at_end();
private:
void virtual_reset();
Pulse virtual_get_next_pulse();
// Storage for the array of data blobs to transcribe into audio;
2018-05-05 23:32:20 +00:00
// each chunk is preceded by a header which may be long, and is optionally
// also preceded by a gap.
struct Chunk {
2018-11-24 03:32:32 +00:00
bool has_gap;
2018-05-05 23:32:20 +00:00
bool long_header;
std::vector<std::uint8_t> data;
Chunk(bool has_gap, bool long_header, const std::vector<std::uint8_t> &data) :
has_gap(has_gap), long_header(long_header), data(std::move(data)) {}
};
std::vector<Chunk> chunks_;
// Tracker for active state within the file list.
std::size_t chunk_pointer_ = 0;
enum class Phase {
Header,
Bytes,
Gap,
EndOfFile
} phase_ = Phase::Header;
std::size_t distance_into_phase_ = 0;
std::size_t distance_into_bit_ = 0;
};
}