From 66bf7bb81fe0f408d3348a7a1b33066d1f369216 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Fri, 14 Oct 2022 11:48:14 -0700 Subject: Actual palbart-compatible rim/bin loader --- Makefile | 15 ++++++++------- image.hex | 10 ---------- isa/checker.h | 4 ++++ main.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++------ programs/count.pal | 8 ++++++++ 5 files changed, 67 insertions(+), 23 deletions(-) delete mode 100644 image.hex create mode 100644 programs/count.pal diff --git a/Makefile b/Makefile index 9ae29fd..b6a5e0d 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ CXXFLAGS := $(WARNINGS) $(OPTIMIZE) $(DEBUG) LD := ld -XXD := xxd +PALBART := palbart override CXXFLAGS += -std=c++20 @@ -33,23 +33,24 @@ clean: .SECONDARY: .SUFFIXES: -override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.hex -o -name \*.cpp -\) -print -\)) +override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.cpp -o -name \*.pal -\) -print -\)) override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES)))) -include $(DEPENDS) -$(BUILD)/%.bin: %.hex +$(BUILD)/%.bin: %.bin @mkdir -p $(dir $@) - $(XXD) -r -p $< $@ + ln -ft $(dir $@) $< -$(BUILD)/%.o: %.bin +$(BUILD)/%.bin: %.pal @mkdir -p $(dir $@) - $(LD) -r -b binary -z noexecstack -o $@ $< + ln -ft $(dir $@) $< + $(PALBART) -$$ -a -n $(basename $@).pal $(BUILD)/%.o: $(BUILD)/%.bin - $(LD) -r -b binary -z noexecstack -o $@ $< + cd $(dir $@) && $(LD) -r -b binary -z noexecstack -o $(notdir $@) $(notdir $<) $(BUILD)/%.o: %.cpp @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 @@ -0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 -0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 - -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 { instruction_context inst; bool halted = false; funcmem mem; + checker() + { + ctlregs.fill(0); + } void execute(); }; diff --git a/main.cpp b/main.cpp index bc17427..5788c54 100644 --- a/main.cpp +++ b/main.cpp @@ -2,20 +2,61 @@ #include #include #include +#include #include "isa/checker.h" -extern std::uint16_t _binary_build___image_bin_start[]; -extern std::uint16_t _binary_build___image_bin_end[]; +extern std::uint8_t _binary_count_bin_start[]; + +static const std::unordered_map programs = { + { "count", _binary_count_bin_start } +}; int main(int argc, const char *argv[]) { + if (argc != 2) { + std::cerr << "Usage: " << argv[0] << " program\n"; + std::cerr << "Programs:\n"; + for (const auto &p : programs) + std::cerr << "\t" << p.first << "\n"; + return 1; + } + + auto program = programs.at(argv[1]); + checker checker; + bool seen_non_leader = false; + bool comment = false; + unsigned int field = 0; unsigned int address = 0; - for (auto *src = _binary_build___image_bin_start; src < _binary_build___image_bin_end; ++src, ++address) { - auto word = ntohs(*src); - std::cout << fmt::format("mem[{:04o}] = {:04o}\n", address, word); - checker.mem.store(address, word); + 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; + auto a = field | address++; + auto d = ((b1 & 0077) << 6) | *program++; + //std::cout << fmt::format("mem[{:06o}] = {:04o}\n", a, d); + checker.mem.store(a, d); + } else if ((b1 & 0307) == 0300) { + seen_non_leader = true; + field = (b1 & 0070) << 3; + } else { + std::cerr << "Invalid program BIN\n"; + return 2; + } + } } 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 @@ +/ vim: set sw=8 noexpandtab : + +*200 + +LOOP, TAD ONE + JMP LOOP + +ONE, 1 -- cgit v1.2.3