Browse Source

Update 'Q' behavior

master
cancel 6 years ago
parent
commit
cddd709dc1
  1. 65
      sim.c

65
sim.c

@ -756,43 +756,46 @@ END_PHASE
BEGIN_DUAL_PHASE_0(query) BEGIN_DUAL_PHASE_0(query)
REALIZE_DUAL; REALIZE_DUAL;
I32 data[3];
data[0] = 0; // x
data[1] = 0; // y
data[2] = 0; // len
if (IS_AWAKE && DUAL_IS_ACTIVE) {
data[0] = (I32)index_of(PEEK(0, -3));
data[1] = (I32)index_of(PEEK(0, -2));
data[2] = (I32)index_of(PEEK(0, -1));
STORE(data);
}
BEGIN_DUAL_PORTS BEGIN_DUAL_PORTS
PORT(0, -1, IN | HASTE); PORT(0, -3, IN | HASTE); // x
PORT(1, 0, OUT); PORT(0, -2, IN | HASTE); // y
END_PORTS PORT(0, -1, IN | HASTE); // len
if (IS_AWAKE) { I32 in_x = data[0] + 1;
Usz len = usz_clamp(index_of(PEEK(0, -1)), 0, 16) + 1; I32 in_y = data[1];
I32 len_data[1]; I32 len = data[2];
len_data[0] = (I32)len; I32 out_x = -len + 1;
STORE(len_data); // todo direct buffer manip
Usz max_x = x + len + 1; for (I32 i = 0; i < len; ++i) {
if (max_x > width) PORT(in_y, in_x + i, IN);
max_x = width;
Mark* i = mbuffer + y * width + x + 1;
Mark* e = mbuffer + y * width + max_x;
while (i != e) {
*i = (Mark)(*i | Mark_flag_lock);
++i;
} }
for (I32 i = 0; i < len; ++i) {
PORT(1, out_x + i, OUT);
} }
END_PORTS
END_PHASE END_PHASE
BEGIN_DUAL_PHASE_1(query) BEGIN_DUAL_PHASE_1(query)
I32 len_data[1]; REALIZE_DUAL;
if (LOAD(len_data) && len_data[0] >= 1 && len_data[0] <= 17) { STOP_IF_DUAL_INACTIVE;
Usz len = (Usz)len_data[0]; I32 data[3];
Usz max_x = x + len + 1; if (LOAD(data)) {
if (max_x >= width) I32 in_x = data[0] + 1;
max_x = width; I32 in_y = data[1];
Glyph const* i = gbuffer + y * width + x + 1; I32 len = data[2];
Glyph const* e = gbuffer + y * width + max_x; I32 out_x = -len + 1;
Usz count = 0; for (I32 i = 0; i < len; ++i) {
while (i != e) { Glyph g = PEEK(in_y, in_x + i);
if (*i != '.') POKE(1, out_x + i, g);
++count;
++i;
} }
Glyph g = glyph_of(count % Glyphs_index_max);
POKE(1, 0, g);
} }
END_PHASE END_PHASE

Loading…
Cancel
Save