blob: 28dcbf7abebb47a6f43f5a99dc22ec1af529922c (
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
|
#include <arpa/inet.h>
#include <cstdint>
#include <fmt/format.h>
#include <iostream>
#include <optional>
#include <utility>
#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<std::pair<unsigned int, unsigned int>> 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()) {
//std::cout << fmt::format("mem[{:06o}] = {:04o}\n", data->first, data->second);
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;
}
checker checker;
for (--argc, ++argv; argc; --argc, ++argv) {
auto program = programs.at(argv[0]);
if (auto err = load_program(checker, program))
return err;
}
while (!checker.halted) {
std::cout << fmt::format("{:04o}: ", checker.pc);
checker.execute();
std::cout << fmt::format("acc={:04o}\n", checker.acc);
}
return 0;
}
|