summaryrefslogtreecommitdiff
path: root/test/test.cpp
blob: b838a023bc5120fb75e0b0f019c2d30492cf744e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <lib94/lib94.hpp>
#include <iostream>
#include <cassert>
#include <fstream>
#include <chrono>
#include <thread>

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<const warrior *> 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<std::string>(result)) {
      std::cout << "Error in " << argv[i] << ": " << std::get<std::string>(result) << std::endl;
      return 0;
    }

    ws.push_back(std::get<warrior *>(result));
  }

  std::vector<number_t> 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;
}