From ca259636fa5a55cfb0445acd4b665f98865013b9 Mon Sep 17 00:00:00 2001 From: cancel Date: Tue, 4 Dec 2018 15:47:53 +0900 Subject: [PATCH] Add '!' (keys) operator --- .clang-format | 2 +- sim.c | 41 ++++++++++++++++++++++++++++++++++------- tui_main.c | 7 +++++-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/.clang-format b/.clang-format index 36f7286..9a364c7 100644 --- a/.clang-format +++ b/.clang-format @@ -2,5 +2,5 @@ BasedOnStyle: LLVM PointerAlignment: Left ReflowComments: false -MacroBlockBegin: "^BEGIN_SOLO_PHASE_.|^BEGIN_DUAL_PHASE_.|^BEGIN_DUAL_PORTS|^BEGIN_HASTE|^BEGIN_IF_." +MacroBlockBegin: "^BEGIN_SOLO_PHASE_.|^BEGIN_DUAL_PHASE_.|^BEGIN_ACTIVE_PORTS|^BEGIN_DUAL_PORTS|^BEGIN_HASTE|^BEGIN_IF_." MacroBlockEnd: "^END_PHASE|^END_PORTS|^END_HASTE|^END_IF" diff --git a/sim.c b/sim.c index 1ddf1e0..faf33bd 100644 --- a/sim.c +++ b/sim.c @@ -126,6 +126,7 @@ typedef struct { Usz size; Bank_cursor cursor; Glyph const* vars_slots; + Piano_bits piano_bits; } Oper_bank_read_params; static void oper_bank_store(Oper_bank_write_params* bank_params, Usz width, @@ -257,6 +258,10 @@ Usz usz_clamp(Usz val, Usz min, Usz max) { { \ bool const Oper_ports_enabled = Dual_is_active; +#define BEGIN_ACTIVE_PORTS \ + { \ + bool const Oper_ports_enabled = true; + #define DUAL_IS_ACTIVE Dual_is_active #define IS_AWAKE (!(cell_flags & (Mark_flag_lock | Mark_flag_sleep))) @@ -283,6 +288,7 @@ Usz usz_clamp(Usz val, Usz min, Usz max) { //////// Operators #define ORCA_SOLO_OPERATORS(_) \ + _('!', keys) \ _('#', comment) \ _('*', bang) @@ -322,12 +328,25 @@ ORCA_DECLARE_OPERATORS(ORCA_SOLO_OPERATORS, ORCA_DUAL_OPERATORS, 'N' : case 'n' : case 'E' : case 'e' : case 'S' : case 's' : case 'W' \ : case 'w' : case 'Z' : case 'z' -BEGIN_SOLO_PHASE_0(bang) - if (IS_AWAKE) { - BECOME('.'); - } +BEGIN_SOLO_PHASE_0(keys) + BEGIN_ACTIVE_PORTS + PORT(0, 1, IN); + PORT(1, 0, OUT); + END_PORTS END_PHASE -BEGIN_SOLO_PHASE_1(bang) +BEGIN_SOLO_PHASE_1(keys) + Glyph g = PEEK(0, 1); + Piano_bits pb = piano_bits_of(g); + // instead of this extra branch, could maybe just leave output port unlocked + // so the '*' goes away on its own? + if (pb == ORCA_PIANO_BITS_NONE) + return; + Glyph o; + if (ORCA_LIKELY((pb & bank_params->piano_bits) == ORCA_PIANO_BITS_NONE)) + o = '.'; + else + o = '*'; + POKE(1, 0, o); END_PHASE BEGIN_SOLO_PHASE_0(comment) @@ -347,6 +366,14 @@ END_PHASE BEGIN_SOLO_PHASE_1(comment) END_PHASE +BEGIN_SOLO_PHASE_0(bang) + if (IS_AWAKE) { + BECOME('.'); + } +END_PHASE +BEGIN_SOLO_PHASE_1(bang) +END_PHASE + BEGIN_DUAL_PHASE_0(add) REALIZE_DUAL; BEGIN_DUAL_PORTS @@ -934,7 +961,6 @@ static void sim_phase_1(Gbuffer gbuf, Mbuffer mbuf, Usz height, Usz width, void orca_run(Gbuffer gbuf, Mbuffer mbuf, Usz height, Usz width, Usz tick_number, Bank* bank, Piano_bits piano_bits) { - (void)piano_bits; Glyph vars_slots[('Z' - 'A' + 1) + ('z' - 'a' + 1)]; memset(vars_slots, '.', sizeof(vars_slots)); mbuffer_clear(mbuf, height, width); @@ -946,7 +972,8 @@ void orca_run(Gbuffer gbuf, Mbuffer mbuf, Usz height, Usz width, Oper_bank_read_params bank_read_params; bank_read_params.bank = bank; bank_read_params.size = bank_write_params.size; - bank_read_params.vars_slots = &vars_slots[0]; bank_cursor_reset(&bank_read_params.cursor); + bank_read_params.vars_slots = &vars_slots[0]; + bank_read_params.piano_bits = piano_bits; sim_phase_1(gbuf, mbuf, height, width, tick_number, &bank_read_params); } diff --git a/tui_main.c b/tui_main.c index 3bf8016..92828cd 100644 --- a/tui_main.c +++ b/tui_main.c @@ -83,6 +83,8 @@ static Glyph_class glyph_class_of(Glyph glyph) { case 'Z': case 'z': return Glyph_class_movement; + case '!': + return Glyph_class_uppercase; case '*': return Glyph_class_bang; case '#': @@ -497,6 +499,7 @@ int main(int argc, char** argv) { Tui_cursor tui_cursor; tui_cursor_init(&tui_cursor); Tui_input_mode input_mode = Tui_input_mode_normal; + Piano_bits piano_bits = ORCA_PIANO_BITS_NONE; Usz tick_num = 0; Usz ruler_spacing_y = 8; Usz ruler_spacing_x = 8; @@ -522,7 +525,7 @@ int main(int argc, char** argv) { field_resize_raw_if_necessary(&scratch_field, field.height, field.width); field_copy(&field, &scratch_field); orca_run(field.buffer, markmap_r.buffer, field.height, field.width, - tick_num, &bank, ORCA_PIANO_BITS_NONE); + tick_num, &bank, piano_bits); field_copy(&scratch_field, &field); needs_remarking = false; } @@ -565,7 +568,6 @@ int main(int argc, char** argv) { } wrefresh(cont_win); - Piano_bits piano_bits = ORCA_PIANO_BITS_NONE; int key; // ncurses gives us ERR if there was no user input. We'll sleep for 0 // seconds, so that we'll yield CPU time to the OS instead of looping as @@ -651,6 +653,7 @@ int main(int argc, char** argv) { orca_run(field.buffer, markmap_r.buffer, field.height, field.width, tick_num, &bank, piano_bits); ++tick_num; + piano_bits = ORCA_PIANO_BITS_NONE; needs_remarking = true; break; default: