From 098766bb6545b1d97a4222f943456a45acbdd0ca Mon Sep 17 00:00:00 2001 From: zanostro Date: Sat, 6 Dec 2025 22:55:01 +0100 Subject: [PATCH] fixed bugs --- simulator_SIC_XE/gui/qt/mainwindow.cpp | 24 +++++++++++++++++++++++- simulator_SIC_XE/include/file_device.h | 1 + simulator_SIC_XE/src/file_device.cpp | 17 +++++++++++++---- simulator_SIC_XE/src/loader.cpp | 26 ++++++++++++++++---------- simulator_SIC_XE/src/machine.cpp | 11 +++++++++++ 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/simulator_SIC_XE/gui/qt/mainwindow.cpp b/simulator_SIC_XE/gui/qt/mainwindow.cpp index e2d4c61..dcdb9bc 100644 --- a/simulator_SIC_XE/gui/qt/mainwindow.cpp +++ b/simulator_SIC_XE/gui/qt/mainwindow.cpp @@ -19,6 +19,7 @@ #include #include #include +#include class Loader; @@ -698,7 +699,18 @@ MainWindow::DisassembledInstruction MainWindow::disassembleAt(int address) QString reg1Str = (r1 < 10) ? regNames[r1] : "?"; QString reg2Str = (r2 < 10) ? regNames[r2] : "?"; - result.operand = QString("%1, %2").arg(reg1Str).arg(reg2Str); + // Check if this is a single-operand Format 2 instruction + QString mnem = result.mnemonic.toUpper(); + if (mnem == "CLEAR" || mnem == "TIXR") { + result.operand = reg1Str; + } else if (mnem == "SVC") { + result.operand = QString::number(r1); + } else if (mnem == "SHIFTL" || mnem == "SHIFTR") { + result.operand = QString("%1, %2").arg(reg1Str).arg(r2); + } else { + // Two register operands (ADDR, SUBR, COMPR, etc.) + result.operand = QString("%1, %2").arg(reg1Str).arg(reg2Str); + } } break; } @@ -852,7 +864,13 @@ void MainWindow::updateDisassemblyDisplay() layout->addStretch(); container->setLayout(layout); + // Save scroll position before updating + int scrollPos = ui->DisasemblyScrollArea->verticalScrollBar()->value(); + ui->DisasemblyScrollArea->setWidget(container); + + // Restore scroll position after updating + ui->DisasemblyScrollArea->verticalScrollBar()->setValue(scrollPos); } void MainWindow::updateMemoryDisplay() @@ -919,7 +937,11 @@ void MainWindow::updateMemoryDisplay() layout->addStretch(); container->setLayout(layout); + int scrollPos = ui->MemoryScrollArea->verticalScrollBar()->value(); + ui->MemoryScrollArea->setWidget(container); + + ui->MemoryScrollArea->verticalScrollBar()->setValue(scrollPos); } void MainWindow::loadObjectFile() diff --git a/simulator_SIC_XE/include/file_device.h b/simulator_SIC_XE/include/file_device.h index a08e2ac..01b433c 100644 --- a/simulator_SIC_XE/include/file_device.h +++ b/simulator_SIC_XE/include/file_device.h @@ -17,6 +17,7 @@ private: std::fstream fileStream; std::string filename; bool fileCreated; + std::streampos readPosition; }; #endif // FILE_DEVICE_H \ No newline at end of file diff --git a/simulator_SIC_XE/src/file_device.cpp b/simulator_SIC_XE/src/file_device.cpp index 8ca554f..781a9b6 100644 --- a/simulator_SIC_XE/src/file_device.cpp +++ b/simulator_SIC_XE/src/file_device.cpp @@ -3,9 +3,8 @@ #include 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(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(value)); fileStream.flush(); } diff --git a/simulator_SIC_XE/src/loader.cpp b/simulator_SIC_XE/src/loader.cpp index 9b3d293..8d3aa17 100644 --- a/simulator_SIC_XE/src/loader.cpp +++ b/simulator_SIC_XE/src/loader.cpp @@ -1,8 +1,10 @@ #include "loader.h" #include "file_reader.h" +#include "string_reader.h" #include "machine.h" #include "constants.h" #include +#include 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(std::stoi(byteHex, nullptr, 16)); } + return record; } diff --git a/simulator_SIC_XE/src/machine.cpp b/simulator_SIC_XE/src/machine.cpp index f71814d..d8d0356 100644 --- a/simulator_SIC_XE/src/machine.cpp +++ b/simulator_SIC_XE/src/machine.cpp @@ -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(std::cin);