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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user