72 lines
2.4 KiB
C++
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;
|
|
}
|