summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenji Dial <benji@benjidial.net>2023-05-30 00:22:29 -0400
committerBenji Dial <benji@benjidial.net>2023-05-30 00:22:29 -0400
commit28e855f5424df395dd1ba98354a53536d4598d47 (patch)
tree21e17429958fedf754ac7aad59377f6fdac2a08f
parente56afe88854d3da8d0d9d5c836da6024b02a9bac (diff)
downloadlib94-28e855f5424df395dd1ba98354a53536d4598d47.tar.gz
fix djn again, and pre-dec / post-inc; few other changes
-rw-r--r--bench/bench_window.cpp2
-rw-r--r--lib94/core.cpp15
-rw-r--r--lib94/executors.cpp11
-rw-r--r--lib94/warrior.cpp2
-rw-r--r--score/main.cpp21
-rw-r--r--warriors/big-nothing.red30
-rw-r--r--warriors/dwarf-replicator.red55
-rw-r--r--warriors/dwarf.red12
-rw-r--r--warriors/epson.red42
-rw-r--r--warriors/imp.red4
-rw-r--r--warriors/simple-clear.red9
-rw-r--r--warriors/splitter.red5
-rw-r--r--warriors/trap.red28
13 files changed, 145 insertions, 91 deletions
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<number_t, number_t> &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<number_t> 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 <fstream>
[[noreturn]] void usage(const char *argv0) {
- std::cerr << "usage: " << argv0 << " <first warrior> <second warrior> <number of rounds> <steps until tie>\n";
+ std::cout << "usage: " << argv0 << " <first warrior> <second warrior> <number of rounds> <steps until tie>\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<std::string>(w1)) {
- std::cerr << "error compiling " << argv[1] << ": " << std::get<std::string>(w1) << '\n';
+ std::cout << "error compiling " << argv[1] << ": " << std::get<std::string>(w1) << '\n';
return 1;
}
if (std::holds_alternative<std::string>(w2)) {
- std::cerr << "error compiling " << argv[2] << ": " << std::get<std::string>(w2) << '\n';
+ std::cout << "error compiling " << argv[2] << ": " << std::get<std::string>(w2) << '\n';
return 1;
}
@@ -50,6 +60,9 @@ int main(int argc, const char **argv) {
ws[0] = std::get<lib94::warrior *>(w1);
ws[1] = std::get<lib94::warrior *>(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, <start
+
+ dat
+
+dwarf:
+ mov end, end + 4
+ add.ab #4, dwarf
+ jmp 2
+
+ dat
+
+ seq.ab #start + 723 - dwarf, dwarf
+ jmp dwarf
+ jmp 2
+
+ dat
+
+core_clear:
+ mov end, end + 1
+ add.ab #1, 0-1
+ jmp 2
+
+ dat
+
+ seq.a #0-1, core_clear
+ jmp core_clear
+ jmp 2
+
+ dat
+
+ mov.ab #end + 1, core_clear
+ jmp core_clear
+ dat
+
+end:
diff --git a/warriors/dwarf.red b/warriors/dwarf.red
index 17c075c..e0e2638 100644
--- a/warriors/dwarf.red
+++ b/warriors/dwarf.red
@@ -1,10 +1,6 @@
-;author standard
-;name dwarf
+;author Standard
+;name Dwarf
-;assert (0 - bomb_step) % bomb_step == 0
-
-bomb_step equ 4
-
-mov 0-1, 3
-add.ab #bomb_step, 0-1
+mov 3, 7
+add.ab #4, 0-1
jmp 0-2
diff --git a/warriors/epson.red b/warriors/epson.red
new file mode 100644
index 0000000..b0409f0
--- /dev/null
+++ b/warriors/epson.red
@@ -0,0 +1,42 @@
+;author Benji Dial
+;name Epson
+
+period equ 10
+
+scan_init equ end - (end - scan) % period + period
+
+scan:
+ seq.i 0 - period, scan_init
+ jmp found
+
+found_ret:
+ add.ab #period, scan
+ seq.ab scan, scan
+ jmp scan
+
+ add.f scan_add, scan
+ jmn.a scan, scan
+
+clear:
+ mov end, 0 - 1
+ sub.ab #2, clear
+
+ seq.ab #end - clear - (end - clear) % 2 + 3, clear
+ jmp clear
+
+ mov.ab #0 - 1, clear
+ jmp clear
+
+scan_add:
+ dat 2, period + scan_init + 2
+
+found:
+ mov bomb, >scan
+ mov bomb + 1, @scan
+ jmp found_ret, <scan
+
+bomb:
+ spl 1
+ jmp bomb
+
+end:
diff --git a/warriors/imp.red b/warriors/imp.red
deleted file mode 100644
index 5ba74c4..0000000
--- a/warriors/imp.red
+++ /dev/null
@@ -1,4 +0,0 @@
-;author standard
-;name imp
-
-mov 0, 1
diff --git a/warriors/simple-clear.red b/warriors/simple-clear.red
deleted file mode 100644
index b40215e..0000000
--- a/warriors/simple-clear.red
+++ /dev/null
@@ -1,9 +0,0 @@
-;name simple core clear
-;author blah
-
-start:
-mov background, background + 1
-sne.ab #0-1, start
-mov.ab #background - start, start
-jmp start, >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: