#include #include #include #include #include #include #include "isa/checker.h" #include "programs/programs.h" int load_program(checker &checker, const std::uint8_t *program) { bool seen_non_leader = false; bool comment = false; unsigned int field = 0; unsigned int address = 0; std::optional> data; while (true) { auto b1 = *program++; if (comment) { if (b1 == 0377) comment = false; } else { if (b1 == 0377) { comment = true; } else if (b1 == 0200) { if (seen_non_leader) break; } else if ((b1 & 0300) == 0100) { seen_non_leader = true; address = ((b1 & 0077) << 6) | *program++; } else if ((b1 & 0300) == 0000) { seen_non_leader = true; if (data.has_value()) checker.mem.store(data->first, data->second); auto a = field | address++; auto d = ((b1 & 0077) << 6) | *program++; data = std::make_pair(a, d); } else if ((b1 & 0307) == 0300) { seen_non_leader = true; field = (b1 & 0070) << 3; } else { std::cerr << "Invalid program BIN\n"; return 2; } } } return 0; } int main(int argc, const char *argv[]) { if (argc < 2) { std::cerr << "Usage: " << argv[0] << " program [program ...]\n"; std::cerr << "Programs:\n"; for (const auto &p : programs) std::cerr << "\t" << p.first << "\n"; return 1; } iomodel system; checker checker(system); for (--argc, ++argv; argc; --argc, ++argv) { auto program = programs.at(argv[0]); if (auto err = load_program(checker, program)) return err; } while (true) { //std::cout << fmt::format("{:9} @{:04o} {:01o}:{:04o}:{:04o} TTO={:x}\n", system.time, checker.pc, checker.link, checker.acc, checker.mq, checker.ctlregs[TT_OUTPUT]); checker.execute(); } return 0; }