1
0
mirror of https://github.com/TomHarte/CLK.git synced 2026-04-21 02:17:08 +00:00

Move validation up a level.

This commit is contained in:
Thomas Harte
2025-01-17 16:59:30 -05:00
parent 3f59a03f29
commit 9461e6f285
3 changed files with 37 additions and 34 deletions
+16 -19
View File
@@ -13,31 +13,28 @@
using namespace Storage::Tape;
OricTAP::OricTAP(const std::string &file_name) : file_name_(file_name) {
format_serialiser();
Storage::FileHolder file(file_name, FileHolder::FileMode::Read);
// Check for a sequence of at least three 0x16s followed by a 0x24.
while(true) {
const uint8_t next = file.get8();
if(next != 0x16 && next != 0x24) {
throw ErrorNotOricTAP;
}
if(next == 0x24) {
if(file.tell() < 4) {
throw ErrorNotOricTAP;
}
break;
}
}
}
std::unique_ptr<FormatSerialiser> OricTAP::format_serialiser() const {
return std::make_unique<Serialiser>(file_name_);
}
OricTAP::Serialiser::Serialiser(const std::string &file_name) :
file_(file_name, FileHolder::FileMode::Read)
{
// Check for a sequence of at least three 0x16s followed by a 0x24.
while(true) {
const uint8_t next = file_.get8();
if(next != 0x16 && next != 0x24) {
throw ErrorNotOricTAP;
}
if(next == 0x24) {
if(file_.tell() < 4) {
throw ErrorNotOricTAP;
}
break;
}
}
// Rewind and start again.
OricTAP::Serialiser::Serialiser(const std::string &file_name) : file_(file_name, FileHolder::FileMode::Read) {
reset();
}
+17 -13
View File
@@ -49,29 +49,33 @@
using namespace Storage::Tape;
PRG::PRG(const std::string &file_name) : file_name_(file_name) {
format_serialiser();
}
FileHolder file(file_name, FileHolder::FileMode::Read);
std::unique_ptr<FormatSerialiser> PRG::format_serialiser() const {
return std::make_unique<Serialiser>(file_name_);
}
PRG::Serialiser::Serialiser(const std::string &file_name) :
file_(file_name, FileHolder::FileMode::Read),
timings_(true)
{
// There's really no way to validate other than that if this file is larger than 64kb,
// of if load address + length > 65536 then it's broken.
if(file_.stats().st_size >= 65538 || file_.stats().st_size < 3)
if(file.stats().st_size >= 65538 || file.stats().st_size < 3)
throw ErrorBadFormat;
load_address_ = file_.get16le();
length_ = uint16_t(file_.stats().st_size - 2);
load_address_ = file.get16le();
length_ = uint16_t(file.stats().st_size - 2);
if(load_address_ + length_ >= 65536)
throw ErrorBadFormat;
}
std::unique_ptr<FormatSerialiser> PRG::format_serialiser() const {
return std::make_unique<Serialiser>(file_name_, load_address_, length_);
}
PRG::Serialiser::Serialiser(const std::string &file_name, uint16_t load_address, uint16_t length) :
file_(file_name, FileHolder::FileMode::Read),
load_address_(load_address),
length_(length),
timings_(false)
{
reset();
}
void PRG::Serialiser::set_target_platforms(TargetPlatform::Type type) {
timings_ = Timings(type & TargetPlatform::Type::Plus4);
}
+4 -2
View File
@@ -38,15 +38,15 @@ private:
std::unique_ptr<FormatSerialiser> format_serialiser() const override;
struct Serialiser: public FormatSerialiser, public TargetPlatform::Recipient {
Serialiser(const std::string &file_name);
Serialiser(const std::string &file_name, uint16_t load_address, uint16_t length);
void set_target_platforms(TargetPlatform::Type) override;
private:
bool is_at_end() const override;
Pulse next_pulse() override;
void reset() override;
FileHolder file_;
uint16_t load_address_;
uint16_t length_;
@@ -88,6 +88,8 @@ private:
} timings_;
};
std::string file_name_;
uint16_t load_address_;
uint16_t length_;
};
}