Browse Source

Add '!' (keys) operator

master
cancel 6 years ago
parent
commit
ca259636fa
  1. 2
      .clang-format
  2. 41
      sim.c
  3. 7
      tui_main.c

2
.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"

41
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);
}

7
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:

Loading…
Cancel
Save