#include #include #include #include #include #include const char *const opcodes[] = { "dat", "mov", "add", "sub", "mul", "div", "mod", "jmp", "jmz", "jmn", "djn", "seq", "sne", "slt", "spl", "nop" }; const char *const modifiers[] = { "a ", "b ", "ab", "ba", "f ", "x ", "i " }; const char *modes = "#$*@{<}>"; int main(int argc, const char **argv) { assert(argc > 1); seed_prng(time(0)); std::vector ws; for (int i = 1; i < argc; ++i) { std::string source; std::ifstream f(argv[i]); std::getline(f, source, '\0'); f.close(); auto result = compile_warrior(source); if (std::holds_alternative(result)) { std::cout << "Error in " << argv[i] << ": " << std::get(result) << std::endl; return 0; } ws.push_back(std::get(result)); } std::vector wps; wps.resize(ws.size()); clear_core({.op = DAT, .mod = F, .amode = DIRECT, .bmode = DIRECT, .anumber = 0, .bnumber = 0}); init_round(ws); while (true) { for (int i = 0; i < ws.size(); ++i) if (get_processes(ws[i]).size() == 0) wps[i] = -1; else wps[i] = get_next_process(ws[i]); auto mod = get_modified_addresses(); printf("\x1b[H\x1b[2J"); for (int a = 0; a < CORE_SIZE; ++a) { const instruction &i = get_instruction(a); printf("%d: %s.%s %c%d, %c%d", a, opcodes[i.op], modifiers[i.mod], modes[i.amode], i.anumber, modes[i.bmode], i.bnumber); if (mod.contains(a)) printf(" *"); for (int w = 0; w < ws.size(); ++w) if (a == wps[w]) printf(" < %s", ws[w]->name.c_str()); putchar('\n'); } std::this_thread::sleep_for(std::chrono::milliseconds(250)); clear_modified_addresses(); single_step(); } return 0; }