spo/ass2/main.cpp
2025-12-05 13:27:40 +01:00

72 lines
2.4 KiB
C++

#include <fstream>
#include <iomanip>
#include <iostream>
#include "Machine.h"
void printReg(const char* name, int value) {
std::cout << name << " = " << std::setw(8) << std::dec << value
<< " (0x" << std::hex << std::setw(6) << std::setfill('0')
<< value << ")" << std::setfill(' ') << std::endl;
}
void printRegisters(Machine& machine) {
std::cout << "\n=== Registers ===" << std::endl;
printReg("A ", machine.getA());
printReg("X ", machine.getX());
printReg("L ", machine.getL());
printReg("B ", machine.getB());
printReg("S ", machine.getS());
printReg("T ", machine.getT());
printReg("F ", machine.getF());
printReg("PC", machine.getPC());
printReg("SW", machine.getSW());
}
int main(int argc, char* argv[]) {
Machine machine;
if (argc > 1) {
std::ifstream file(argv[1]);
if (file.is_open()) {
std::cout << "=== SIC/XE Simulator ===" << std::endl;
std::cout << "Loading: " << argv[1] << std::endl;
if (machine.loadSection(file)) {
std::cout << "Start address: 0x" << std::hex << std::setw(6) << std::setfill('0') << machine.getPC() << std::dec << std::setfill(' ') << std::endl;
std::cout << "\nExecuting..." << std::endl;
int prevPC = -1;
int instrCount = 0;
int maxInstr = 100000; // stop after too many instructions
while (machine.getPC() != prevPC && instrCount < maxInstr) {
prevPC = machine.getPC();
machine.execute();
instrCount++;
}
if (instrCount >= maxInstr) {
std::cout << "\nwarning: stopped after " << maxInstr << " instructions (infinite loop?)" << std::endl;
} else {
std::cout << "Halted after " << instrCount << " instructions" << std::endl;
}
printRegisters(machine);
} else {
std::cerr << "ERROR: Failed to load " << argv[1] << std::endl;
return 1;
}
file.close();
} else {
std::cerr << "ERROR: Cannot open " << argv[1] << std::endl;
return 1;
}
} else {
std::cout << "SIC/XE Simulator" << std::endl;
std::cout << "Usage: " << argv[0] << " <file.obj>" << std::endl;
}
return 0;
}