fixed bugs

This commit is contained in:
zanostro 2025-12-06 22:55:01 +01:00
parent d3ab78e76c
commit 098766bb65
5 changed files with 64 additions and 15 deletions

View file

@ -3,9 +3,8 @@
#include <fstream>
FileDevice::FileDevice(const std::string &filename)
: filename(filename), fileCreated(false)
: filename(filename), fileCreated(false), readPosition(0)
{
// Don't create the file yet - wait until first write
}
FileDevice::~FileDevice()
@ -18,9 +17,16 @@ FileDevice::~FileDevice()
void FileDevice::ensureFileOpen()
{
if (!fileStream.is_open()) {
if (fileCreated) {
fileStream.open(filename, std::ios::in | std::ios::out);
// Check if file exists
std::ifstream checkFile(filename);
bool fileExists = checkFile.good();
checkFile.close();
if (fileExists) {
fileStream.open(filename, std::ios::in | std::ios::out | std::ios::ate);
fileCreated = true;
} else {
// Create new file
std::ofstream create(filename);
if (!create) {
throw std::runtime_error("Failed to create file: " + filename);
@ -41,9 +47,11 @@ unsigned char FileDevice::read()
unsigned char value = 0;
ensureFileOpen();
if (fileStream.is_open()) {
fileStream.seekg(readPosition);
char ch;
if (fileStream.get(ch)) {
value = static_cast<unsigned char>(ch);
readPosition = fileStream.tellg();
}
}
return value;
@ -53,6 +61,7 @@ void FileDevice::write(unsigned char value)
{
ensureFileOpen();
if (fileStream.is_open()) {
fileStream.seekp(0, std::ios::end);
fileStream.put(static_cast<char>(value));
fileStream.flush();
}

View file

@ -1,8 +1,10 @@
#include "loader.h"
#include "file_reader.h"
#include "string_reader.h"
#include "machine.h"
#include "constants.h"
#include <algorithm>
#include <cstdio>
Loader::~Loader()
{
@ -82,20 +84,24 @@ Loader::TextRecord Loader::readTextRecord()
if(FILE_CONTAINS_WHITE_SPACES) _file_reader->readByte();
// Read length (1 byte, 2 hex digits)
int length = std::stoi(_file_reader->readString(2), nullptr, 16);
if(FILE_CONTAINS_WHITE_SPACES) _file_reader->readByte();
std::string lengthStr = _file_reader->readString(2);
int length = std::stoi(lengthStr, nullptr, 16);
// Read the rest of the line (data bytes with spaces)
std::string dataLine = _file_reader->readLine();
// Remove all whitespace from the data line
dataLine.erase(std::remove_if(dataLine.begin(), dataLine.end(), ::isspace), dataLine.end());
// Now use StringReader to parse the hex bytes
StringReader stringReader(dataLine);
record.data.resize(length);
int index = 0;
string byteStr = _file_reader->readLine();
// Remove spaces, newlines, and other whitespace characters
byteStr.erase(std::remove_if(byteStr.begin(), byteStr.end(), ::isspace), byteStr.end());
for (int i = 0; i < length; ++i) {
std::string byteHex = byteStr.substr(i * 2, 2);
std::string byteHex = stringReader.readString(2);
record.data[i] = static_cast<uint8_t>(std::stoi(byteHex, nullptr, 16));
}
return record;
}

View file

@ -14,6 +14,17 @@ string prefix = "Machine error: ";
Machine::Machine()
{
// Initialize registers and memory to zero
A = B = X = L = S = T = PC = SW = 0;
F = 0.0;
for (int i = 0; i < MEMORY_SIZE; i++) {
memory[i] = 0;
}
for (int i = 0; i < VECTOR_REG_SIZE; i++) {
VA[i] = VS[i] = VT[i] = 0;
}
_stopped = false;
devices.resize(NUM_DEVICES);
// device 0: standard input
devices[0] = make_shared<InputDevice>(std::cin);