diff options
| -rw-r--r-- | Makefile | 15 | ||||
| -rw-r--r-- | image.hex | 10 | ||||
| -rw-r--r-- | isa/checker.h | 4 | ||||
| -rw-r--r-- | main.cpp | 53 | ||||
| -rw-r--r-- | programs/count.pal | 8 |
5 files changed, 67 insertions, 23 deletions
| @@ -11,7 +11,7 @@ CXXFLAGS := $(WARNINGS) $(OPTIMIZE) $(DEBUG) | |||
| 11 | 11 | ||
| 12 | LD := ld | 12 | LD := ld |
| 13 | 13 | ||
| 14 | XXD := xxd | 14 | PALBART := palbart |
| 15 | 15 | ||
| 16 | override CXXFLAGS += -std=c++20 | 16 | override CXXFLAGS += -std=c++20 |
| 17 | 17 | ||
| @@ -33,23 +33,24 @@ clean: | |||
| 33 | .SECONDARY: | 33 | .SECONDARY: |
| 34 | .SUFFIXES: | 34 | .SUFFIXES: |
| 35 | 35 | ||
| 36 | override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.hex -o -name \*.cpp -\) -print -\)) | 36 | override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.cpp -o -name \*.pal -\) -print -\)) |
| 37 | 37 | ||
| 38 | override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) | 38 | override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) |
| 39 | override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES)))) | 39 | override 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 @@ | |||
| 1 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 2 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 3 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 4 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 5 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 6 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 7 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 8 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ||
| 9 | |||
| 10 | 0200 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 | }; |
| @@ -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 | ||
| 8 | extern std::uint16_t _binary_build___image_bin_start[]; | 9 | extern std::uint8_t _binary_count_bin_start[]; |
| 9 | extern std::uint16_t _binary_build___image_bin_end[]; | 10 | |
| 11 | static const std::unordered_map<std::string, std::uint8_t *> programs = { | ||
| 12 | { "count", _binary_count_bin_start } | ||
| 13 | }; | ||
| 10 | 14 | ||
| 11 | int main(int argc, const char *argv[]) { | 15 | int 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 | |||
| 5 | LOOP, TAD ONE | ||
| 6 | JMP LOOP | ||
| 7 | |||
| 8 | ONE, 1 | ||
