From 28e855f5424df395dd1ba98354a53536d4598d47 Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Tue, 30 May 2023 00:22:29 -0400 Subject: fix djn again, and pre-dec / post-inc; few other changes --- bench/bench_window.cpp | 2 +- lib94/core.cpp | 15 +++++------- lib94/executors.cpp | 11 +++++---- lib94/warrior.cpp | 2 +- score/main.cpp | 21 ++++++++++++++--- warriors/big-nothing.red | 30 ++++++++++------------- warriors/dwarf-replicator.red | 55 +++++++++++++++++++++++++++++++++++++++++++ warriors/dwarf.red | 12 ++++------ warriors/epson.red | 42 +++++++++++++++++++++++++++++++++ warriors/imp.red | 4 ---- warriors/simple-clear.red | 9 ------- warriors/splitter.red | 5 ---- warriors/trap.red | 28 ---------------------- 13 files changed, 145 insertions(+), 91 deletions(-) create mode 100644 warriors/dwarf-replicator.red create mode 100644 warriors/epson.red delete mode 100644 warriors/imp.red delete mode 100644 warriors/simple-clear.red delete mode 100644 warriors/splitter.red delete mode 100644 warriors/trap.red diff --git a/bench/bench_window.cpp b/bench/bench_window.cpp index 16110cd..d872de7 100644 --- a/bench/bench_window.cpp +++ b/bench/bench_window.cpp @@ -63,7 +63,7 @@ bench_window::bench_window() target_core_rate_scale.signal_value_changed().connect(sigc::mem_fun(*this, &bench_window::on_target_core_rate_changed)); - target_core_rate_scale.set_range(0.0, 3.0); + target_core_rate_scale.set_range(0.0, 4.0); target_core_rate_scale.set_value(std::log10(20.0)); control_box.append(new_round_button); diff --git a/lib94/core.cpp b/lib94/core.cpp index d0e81e1..49b76e5 100644 --- a/lib94/core.cpp +++ b/lib94/core.cpp @@ -70,13 +70,8 @@ namespace lib94 { for (size_t i = 0; i < count; ++i) { const warrior *w = warriors[i]; - unsigned tries = 0; new_place_at: - if (tries > 1000) - return false; - ++tries; - number_t place_at = i == 0 ? 0 : number(prng); for (std::pair &other : placements) @@ -194,7 +189,8 @@ namespace lib94 { case A_DECREMENT: secondary = core + (program_counter + n) % LIB94_CORE_SIZE; - ptr = (n + --secondary->anumber) % LIB94_CORE_SIZE; + secondary->anumber = (secondary->anumber + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; + ptr = (n + secondary->anumber) % LIB94_CORE_SIZE; instr = core[(program_counter + ptr) % LIB94_CORE_SIZE]; add_read_instruction(secondary); add_written_instruction(secondary); @@ -202,7 +198,8 @@ namespace lib94 { case B_DECREMENT: secondary = core + (program_counter + n) % LIB94_CORE_SIZE; - ptr = (n + --secondary->bnumber) % LIB94_CORE_SIZE; + secondary->bnumber = (secondary->bnumber + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; + ptr = (n + secondary->bnumber) % LIB94_CORE_SIZE; instr = core[(program_counter + ptr) % LIB94_CORE_SIZE]; add_read_instruction(secondary); add_written_instruction(secondary); @@ -212,7 +209,7 @@ namespace lib94 { secondary = core + (program_counter + n) % LIB94_CORE_SIZE; ptr = (n + secondary->anumber) % LIB94_CORE_SIZE; instr = core[(program_counter + ptr) % LIB94_CORE_SIZE]; - ++secondary->anumber; + secondary->anumber = (secondary->anumber + 1) % LIB94_CORE_SIZE; add_read_instruction(secondary); add_written_instruction(secondary); break; @@ -221,7 +218,7 @@ namespace lib94 { secondary = core + (program_counter + n) % LIB94_CORE_SIZE; ptr = (n + secondary->bnumber) % LIB94_CORE_SIZE; instr = core[(program_counter + ptr) % LIB94_CORE_SIZE]; - ++secondary->bnumber; + secondary->bnumber = (secondary->bnumber + 1) % LIB94_CORE_SIZE; add_read_instruction(secondary); add_written_instruction(secondary); break; diff --git a/lib94/executors.cpp b/lib94/executors.cpp index b9fac22..236944b 100644 --- a/lib94/executors.cpp +++ b/lib94/executors.cpp @@ -37,7 +37,8 @@ namespace lib94 { } inline bool dec_not_zero() { - return --*ptr != 0; + *ptr = (*ptr + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; + return *ptr != 0; } inline bool equal_to(const single_target &other) { @@ -78,8 +79,8 @@ namespace lib94 { } inline bool dec_not_zero() { - --*ptr1; - --*ptr2; + *ptr1 = (*ptr1 + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; + *ptr2 = (*ptr2 + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; return *ptr1 != 0 || *ptr2 != 0; } @@ -122,8 +123,8 @@ namespace lib94 { } inline bool dec_not_zero() { - --instr->anumber; - --instr->bnumber; + instr->anumber = (instr->anumber + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; + instr->bnumber = (instr->bnumber + LIB94_CORE_SIZE - 1) % LIB94_CORE_SIZE; return instr->anumber != 0 || instr->bnumber != 0; } diff --git a/lib94/warrior.cpp b/lib94/warrior.cpp index bb65828..e0d7192 100644 --- a/lib94/warrior.cpp +++ b/lib94/warrior.cpp @@ -566,7 +566,7 @@ namespace lib94 { if (org.has_value()) { std::optional org_number = org.value()->to_number(label_offsets, macro_values, org_offset); if (org_number.has_value()) - w->org = org_number.value() + org_offset; + w->org = real_mod(org_number.value() + org_offset); else return std::string("bad expression on line ") + std::to_string(org_source_line); } diff --git a/score/main.cpp b/score/main.cpp index 1b29107..88536bb 100644 --- a/score/main.cpp +++ b/score/main.cpp @@ -3,10 +3,20 @@ #include [[noreturn]] void usage(const char *argv0) { - std::cerr << "usage: " << argv0 << " \n"; + std::cout << "usage: " << argv0 << " \n"; exit(1); } +void print_warrior(const lib94::warrior *w) { + std::cerr << ";name " << w->name << '\n'; + std::cerr << ";author " << w->author << '\n'; + if (w->org != 0) + std::cerr << "org " << w->org << '\n'; + for (const auto &i : w->instructions) + std::cerr << lib94::instruction_to_string(i) << '\n'; + std::cerr << '\n'; +} + int main(int argc, const char **argv) { if (argc != 5) usage(argv[0]); @@ -37,12 +47,12 @@ int main(int argc, const char **argv) { auto w2 = lib94::compile_warrior(source2); if (std::holds_alternative(w1)) { - std::cerr << "error compiling " << argv[1] << ": " << std::get(w1) << '\n'; + std::cout << "error compiling " << argv[1] << ": " << std::get(w1) << '\n'; return 1; } if (std::holds_alternative(w2)) { - std::cerr << "error compiling " << argv[2] << ": " << std::get(w2) << '\n'; + std::cout << "error compiling " << argv[2] << ": " << std::get(w2) << '\n'; return 1; } @@ -50,6 +60,9 @@ int main(int argc, const char **argv) { ws[0] = std::get(w1); ws[1] = std::get(w2); + print_warrior(ws[0]); + print_warrior(ws[1]); + unsigned w1_wins = 0; unsigned w2_wins = 0; @@ -57,6 +70,8 @@ int main(int argc, const char **argv) { for (unsigned round_number = 0; round_number < round_count; ++round_number) { + std::cerr << "round " << round_number + 1 << "\x1b[0G"; + lib94::clear_core({ .op = lib94::DAT, .mod = lib94::F, .amode = lib94::DIRECT, .bmode = lib94::DIRECT, diff --git a/warriors/big-nothing.red b/warriors/big-nothing.red index 8549f6f..a9aa6c9 100644 --- a/warriors/big-nothing.red +++ b/warriors/big-nothing.red @@ -1,20 +1,14 @@ -;author blah -;name big nothing +;author Benji Dial +;name Big Nothing start: -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -jmp start + nop + nop + nop + nop + nop + nop + nop + nop + nop + jmp start diff --git a/warriors/dwarf-replicator.red b/warriors/dwarf-replicator.red new file mode 100644 index 0000000..f301a05 --- /dev/null +++ b/warriors/dwarf-replicator.red @@ -0,0 +1,55 @@ +;author Benji Dial +;name Dwarf Replicator + +;not a particularly good warrior, but is sufficient to test a few things + +start: + mov 0, 2908 + nop }start, >start + jmp 2 + + dat + + seq.a #end - start, start + jmp start + jmp 2 + + dat + + sub.ab #end - start, start + spl @start + jmp 2, scan + mov bomb + 1, @scan + jmp found_ret, start -background: diff --git a/warriors/splitter.red b/warriors/splitter.red deleted file mode 100644 index 17016c4..0000000 --- a/warriors/splitter.red +++ /dev/null @@ -1,5 +0,0 @@ -;author blah -;name splitter - -spl 0 -jmp 0-1 diff --git a/warriors/trap.red b/warriors/trap.red deleted file mode 100644 index 681ea6e..0000000 --- a/warriors/trap.red +++ /dev/null @@ -1,28 +0,0 @@ -;author benji -;name trap - -org start - -trap: -spl 1 -jmp trap - -start: -mov.i bomb, bomb + 8 -add.ab #8, start -sub.ab #8, bomb -sne.ab #bomb - 8 - start, start -jmp core_clear -jmp start - -bomb: -jmp trap - 8 - -core_clear: -mov background, background + 1 -add.ab #1, core_clear -jnz.b core_clear, core_clear -mov.ab #background + 1 - core_clear, core_clear -jmp core_clear - -background: -- cgit v1.2.3