summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile15
-rw-r--r--image.hex10
-rw-r--r--isa/checker.h4
-rw-r--r--main.cpp53
-rw-r--r--programs/count.pal8
5 files changed, 67 insertions, 23 deletions
diff --git a/Makefile b/Makefile
index 9ae29fd..b6a5e0d 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ CXXFLAGS := $(WARNINGS) $(OPTIMIZE) $(DEBUG)
11 11
12LD := ld 12LD := ld
13 13
14XXD := xxd 14PALBART := palbart
15 15
16override CXXFLAGS += -std=c++20 16override CXXFLAGS += -std=c++20
17 17
@@ -33,23 +33,24 @@ clean:
33.SECONDARY: 33.SECONDARY:
34.SUFFIXES: 34.SUFFIXES:
35 35
36override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.hex -o -name \*.cpp -\) -print -\)) 36override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.cpp -o -name \*.pal -\) -print -\))
37 37
38override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) 38override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES))))
39override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES)))) 39override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES))))
40 40
41-include $(DEPENDS) 41-include $(DEPENDS)
42 42
43$(BUILD)/%.bin: %.hex 43$(BUILD)/%.bin: %.bin
44 @mkdir -p $(dir $@) 44 @mkdir -p $(dir $@)
45 $(XXD) -r -p $< $@ 45 ln -ft $(dir $@) $<
46 46
47$(BUILD)/%.o: %.bin 47$(BUILD)/%.bin: %.pal
48 @mkdir -p $(dir $@) 48 @mkdir -p $(dir $@)
49 $(LD) -r -b binary -z noexecstack -o $@ $< 49 ln -ft $(dir $@) $<
50 $(PALBART) -$$ -a -n $(basename $@).pal
50 51
51$(BUILD)/%.o: $(BUILD)/%.bin 52$(BUILD)/%.o: $(BUILD)/%.bin
52 $(LD) -r -b binary -z noexecstack -o $@ $< 53 cd $(dir $@) && $(LD) -r -b binary -z noexecstack -o $(notdir $@) $(notdir $<)
53 54
54$(BUILD)/%.o: %.cpp 55$(BUILD)/%.o: %.cpp
55 @mkdir -p $(dir $@) 56 @mkdir -p $(dir $@)
diff --git a/image.hex b/image.hex
deleted file mode 100644
index 85d2e1f..0000000
--- a/image.hex
+++ /dev/null
@@ -1,10 +0,0 @@
10001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
20000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
30000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
40000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
50000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
60000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
70000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
80000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
9
100200 0a80
diff --git a/isa/checker.h b/isa/checker.h
index 70393b6..1ea572b 100644
--- a/isa/checker.h
+++ b/isa/checker.h
@@ -43,5 +43,9 @@ struct checker {
43 instruction_context inst; 43 instruction_context inst;
44 bool halted = false; 44 bool halted = false;
45 funcmem mem; 45 funcmem mem;
46 checker()
47 {
48 ctlregs.fill(0);
49 }
46 void execute(); 50 void execute();
47}; 51};
diff --git a/main.cpp b/main.cpp
index bc17427..5788c54 100644
--- a/main.cpp
+++ b/main.cpp
@@ -2,20 +2,61 @@
2#include <cstdint> 2#include <cstdint>
3#include <fmt/format.h> 3#include <fmt/format.h>
4#include <iostream> 4#include <iostream>
5#include <unordered_map>
5 6
6#include "isa/checker.h" 7#include "isa/checker.h"
7 8
8extern std::uint16_t _binary_build___image_bin_start[]; 9extern std::uint8_t _binary_count_bin_start[];
9extern std::uint16_t _binary_build___image_bin_end[]; 10
11static const std::unordered_map<std::string, std::uint8_t *> programs = {
12 { "count", _binary_count_bin_start }
13};
10 14
11int main(int argc, const char *argv[]) { 15int main(int argc, const char *argv[]) {
16 if (argc != 2) {
17 std::cerr << "Usage: " << argv[0] << " program\n";
18 std::cerr << "Programs:\n";
19 for (const auto &p : programs)
20 std::cerr << "\t" << p.first << "\n";
21 return 1;
22 }
23
24 auto program = programs.at(argv[1]);
25
12 checker checker; 26 checker checker;
13 27
28 bool seen_non_leader = false;
29 bool comment = false;
30 unsigned int field = 0;
14 unsigned int address = 0; 31 unsigned int address = 0;
15 for (auto *src = _binary_build___image_bin_start; src < _binary_build___image_bin_end; ++src, ++address) { 32 while (true) {
16 auto word = ntohs(*src); 33 auto b1 = *program++;
17 std::cout << fmt::format("mem[{:04o}] = {:04o}\n", address, word); 34 if (comment) {
18 checker.mem.store(address, word); 35 if (b1 == 0377)
36 comment = false;
37 } else {
38 if (b1 == 0377) {
39 comment = true;
40 } else if (b1 == 0200) {
41 if (seen_non_leader)
42 break;
43 } else if ((b1 & 0300) == 0100) {
44 seen_non_leader = true;
45 address = ((b1 & 0077) << 6) | *program++;
46 } else if ((b1 & 0300) == 0000) {
47 seen_non_leader = true;
48 auto a = field | address++;
49 auto d = ((b1 & 0077) << 6) | *program++;
50 //std::cout << fmt::format("mem[{:06o}] = {:04o}\n", a, d);
51 checker.mem.store(a, d);
52 } else if ((b1 & 0307) == 0300) {
53 seen_non_leader = true;
54 field = (b1 & 0070) << 3;
55 } else {
56 std::cerr << "Invalid program BIN\n";
57 return 2;
58 }
59 }
19 } 60 }
20 61
21 while (!checker.halted) { 62 while (!checker.halted) {
diff --git a/programs/count.pal b/programs/count.pal
new file mode 100644
index 0000000..e2e797d
--- /dev/null
+++ b/programs/count.pal
@@ -0,0 +1,8 @@
1/ vim: set sw=8 noexpandtab :
2
3*200
4
5LOOP, TAD ONE
6 JMP LOOP
7
8ONE, 1