From d438feb9eeb909f91dc7f7d6b99df6e76bb17b1a Mon Sep 17 00:00:00 2001 From: zanostro Date: Mon, 17 Nov 2025 13:07:24 +0100 Subject: [PATCH] added reading start --- simulator_SIC_XE/include/file_reader.h | 7 ++- simulator_SIC_XE/include/loader.h | 61 ++++++++++++++++++++++++ simulator_SIC_XE/include/reader.h | 10 +++- simulator_SIC_XE/include/string_reader.h | 7 ++- simulator_SIC_XE/src/file_reader.cpp | 6 +++ simulator_SIC_XE/src/loader.cpp | 35 ++++++++++++++ simulator_SIC_XE/src/string_reader.cpp | 6 +++ 7 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 simulator_SIC_XE/include/loader.h create mode 100644 simulator_SIC_XE/src/loader.cpp diff --git a/simulator_SIC_XE/include/file_reader.h b/simulator_SIC_XE/include/file_reader.h index 2ee9fcd..e2da87a 100644 --- a/simulator_SIC_XE/include/file_reader.h +++ b/simulator_SIC_XE/include/file_reader.h @@ -1,4 +1,6 @@ -#pragma once +#ifndef FILE_READER_H +#define FILE_READER_H + #include "reader.h" #include #include @@ -11,9 +13,12 @@ public: int readByte() override; bool readBytes(uint8_t* buf, size_t len) override; std::string readString(size_t len) override; + std::string readLine() override; bool good() const; private: std::ifstream in; }; + +#endif // FILE_READER_H \ No newline at end of file diff --git a/simulator_SIC_XE/include/loader.h b/simulator_SIC_XE/include/loader.h new file mode 100644 index 0000000..c4d75e3 --- /dev/null +++ b/simulator_SIC_XE/include/loader.h @@ -0,0 +1,61 @@ +#ifndef LOADER_H +#define LOADER_H + +#include +#include +#include +#include "file_reader.h" + +class Machine; + +using std::shared_ptr; +using std::string; + + +class Loader { +public: + Loader( shared_ptr machine, string filename) : _machine(machine), _filename(filename) { + _file_reader = std::make_shared(filename, std::ios::in); + } + ~Loader(); + + + enum class RecordType { + HEADER, + TEXT, + END, + UNKNOWN + }; + + struct HeaderMetadata { + string program_name; + int start_address; + int length; + }; + struct TextRecord { + int start_address; + std::vector data; + }; + struct EndRecord { + int execution_start_address; + }; + + void load(); + +private : + + static RecordType parseRecordType(char c); + + + shared_ptr _machine; + string _filename; + shared_ptr _file_reader; + HeaderMetadata readHeader(); + +}; + + + + + +#endif // LOADER_H \ No newline at end of file diff --git a/simulator_SIC_XE/include/reader.h b/simulator_SIC_XE/include/reader.h index ff64e77..e582161 100644 --- a/simulator_SIC_XE/include/reader.h +++ b/simulator_SIC_XE/include/reader.h @@ -1,4 +1,6 @@ -#pragma once +#ifndef READER_H +#define READER_H + #include #include @@ -12,4 +14,8 @@ public: virtual bool readBytes(uint8_t* buf, size_t len) = 0; // read up to len bytes into a std::string; may return shorter string on EOF virtual std::string readString(size_t len) = 0; -}; \ No newline at end of file + // read a line (up to newline), return empty string on EOF + virtual std::string readLine() = 0; +}; + +#endif // READER_H \ No newline at end of file diff --git a/simulator_SIC_XE/include/string_reader.h b/simulator_SIC_XE/include/string_reader.h index 6b9187e..71c3da9 100644 --- a/simulator_SIC_XE/include/string_reader.h +++ b/simulator_SIC_XE/include/string_reader.h @@ -1,4 +1,6 @@ -#pragma once +#ifndef STRING_READER_H +#define STRING_READER_H + #include "reader.h" #include #include @@ -11,7 +13,10 @@ public: int readByte() override; bool readBytes(uint8_t* buf, size_t len) override; std::string readString(size_t len) override; + std::string readLine() override; private: std::istringstream in; }; + +#endif // STRING_READER_H \ No newline at end of file diff --git a/simulator_SIC_XE/src/file_reader.cpp b/simulator_SIC_XE/src/file_reader.cpp index 5785f06..0ace74b 100644 --- a/simulator_SIC_XE/src/file_reader.cpp +++ b/simulator_SIC_XE/src/file_reader.cpp @@ -27,3 +27,9 @@ std::string FileReader::readString(size_t len) { } bool FileReader::good() const { return static_cast(in); } + +std::string FileReader::readLine() { + std::string s; + if (!std::getline(in, s)) return std::string(); + return s; +} diff --git a/simulator_SIC_XE/src/loader.cpp b/simulator_SIC_XE/src/loader.cpp new file mode 100644 index 0000000..0626ac6 --- /dev/null +++ b/simulator_SIC_XE/src/loader.cpp @@ -0,0 +1,35 @@ +#include "loader.h" +#include "file_reader.h" + +Loader::~Loader() +{ + _machine.reset(); +} + + + + +void Loader::load() +{ + + +} + +Loader::RecordType Loader::parseRecordType(char c) +{ + switch (c) { + case 'H': return RecordType::HEADER; + case 'T': return RecordType::TEXT; + case 'E': return RecordType::END; + default: return RecordType::UNKNOWN; // fallback; adjust as needed + } +} + +Loader::HeaderMetadata Loader::readHeader() +{ + RecordType type = parseRecordType(static_cast(_file_reader->readByte())); + if (type != RecordType::HEADER) { + throw std::runtime_error("Expected HEADER record"); + } + HeaderMetadata header; +} diff --git a/simulator_SIC_XE/src/string_reader.cpp b/simulator_SIC_XE/src/string_reader.cpp index 3a24cb9..b87cc02 100644 --- a/simulator_SIC_XE/src/string_reader.cpp +++ b/simulator_SIC_XE/src/string_reader.cpp @@ -25,3 +25,9 @@ std::string StringReader::readString(size_t len) { if (static_cast(got) < len) s.resize(static_cast(got)); return s; } + +std::string StringReader::readLine() { + std::string s; + if (!std::getline(in, s)) return std::string(); + return s; +}