From 85b34e1c9dc03585ec4f13f6241cd8f0ecaf9cd9 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 8 Oct 2022 00:39:15 -0700 Subject: Trivial support for running the checker on an image. --- Makefile | 20 ++++++++++++++------ image.hex | 4 ++++ isa/checker.cpp | 2 +- isa/checker.h | 33 ++++++++++++++++++++++++++++++--- main.cpp | 28 ++++++++++++++++++++++++++++ minigolf | 1 + 6 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 image.hex create mode 100644 main.cpp create mode 120000 minigolf diff --git a/Makefile b/Makefile index 863826d..9ae29fd 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ DEBUG := -g CXX := g++ CXXFLAGS := $(WARNINGS) $(OPTIMIZE) $(DEBUG) -SED := sed +LD := ld XXD := xxd @@ -30,15 +30,27 @@ clean: rm -rf $(BUILD) .PHONY: clean +.SECONDARY: .SUFFIXES: -override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -name \*.cpp -print -\)) +override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -\( -name \*.bin -o -name \*.hex -o -name \*.cpp -\) -print -\)) override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES)))) -include $(DEPENDS) +$(BUILD)/%.bin: %.hex + @mkdir -p $(dir $@) + $(XXD) -r -p $< $@ + +$(BUILD)/%.o: %.bin + @mkdir -p $(dir $@) + $(LD) -r -b binary -z noexecstack -o $@ $< + +$(BUILD)/%.o: $(BUILD)/%.bin + $(LD) -r -b binary -z noexecstack -o $@ $< + $(BUILD)/%.o: %.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) $(COMPILE_FLAGS) -c -o $@ $< @@ -46,7 +58,3 @@ $(BUILD)/%.o: %.cpp $(BUILD)/minigolf: $(OBJECTS) @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -o $@ -Wl,--start-group $+ -Wl,--end-group $(LINK_FLAGS) - -$(BUILD)/%.bin: %.hex - @mkdir -p $(dir $@) - $(SED) -e "s/\\s*#.*//" $< | $(XXD) -r -p > $@ diff --git a/image.hex b/image.hex new file mode 100644 index 0000000..6c7573e --- /dev/null +++ b/image.hex @@ -0,0 +1,4 @@ +0001 0002 0004 +0008 0010 0020 +0040 0080 0100 +0200 0400 0800 diff --git a/isa/checker.cpp b/isa/checker.cpp index 604279a..05b59a9 100644 --- a/isa/checker.cpp +++ b/isa/checker.cpp @@ -10,7 +10,7 @@ void checker::execute() { // check for interrupt } ctlregs[INT_ENABLE] = (int_enable_delay << 1) | int_enable_delay; - auto inst = decode(ctlregs[DATA_INSTRUCTION_FIELD_BUFFER], + inst = decode(ctlregs[DATA_INSTRUCTION_FIELD_BUFFER], pc, mem.fetch(pc)); auto next_pc = inst.next_pc; diff --git a/isa/checker.h b/isa/checker.h index 6aae3ff..70393b6 100644 --- a/isa/checker.h +++ b/isa/checker.h @@ -1,19 +1,46 @@ #pragma once #include +#include #include "isa/isa.h" struct funcmem { - unsigned int fetch(unsigned int address); - void store(unsigned int address, unsigned int value); + static constexpr unsigned int PAGE_BYTES_LOG2 = 20; + static constexpr unsigned int PAGE_BYTES = 1 << PAGE_BYTES_LOG2; + static constexpr unsigned int PAGE_BYTE_OFFSET_MASK = PAGE_BYTES - 1; + + typedef std::array page; + + std::map image; + + unsigned int fetch(unsigned int address) const { + auto page_address = address >> PAGE_BYTES_LOG2; + auto page_offset = address & PAGE_BYTE_OFFSET_MASK; + if (auto p = image.find(page_address); p != image.end()) { + const auto &page = p->second; + return page[page_offset]; + } + return 0; + } + + void store(unsigned int address, unsigned int value) { + auto page_address = address >> PAGE_BYTES_LOG2; + auto page_offset = address & PAGE_BYTE_OFFSET_MASK; + auto [p, emplaced] = image.try_emplace(page_address); + auto &page = p->second; + if (emplaced) + page.fill(0); + page[page_offset] = value; + } }; struct checker { unsigned int acc = 0; unsigned int link = 0; - unsigned int pc = 0; + unsigned int pc = 00200; std::array ctlregs; + instruction_context inst; bool halted = false; funcmem mem; void execute(); diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..bc17427 --- /dev/null +++ b/main.cpp @@ -0,0 +1,28 @@ +#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[]; + +int main(int argc, const char *argv[]) { + checker checker; + + 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 (!checker.halted) { + std::cout << fmt::format("{:04o}: ", checker.pc); + checker.execute(); + std::cout << fmt::format("acc={:04o}\n", checker.acc); + } + + return 0; +} diff --git a/minigolf b/minigolf new file mode 120000 index 0000000..b6cb41a --- /dev/null +++ b/minigolf @@ -0,0 +1 @@ +build/minigolf \ No newline at end of file -- cgit v1.2.3