|
@ -288,6 +288,7 @@ Usz usz_clamp(Usz val, Usz min, Usz max) { |
|
|
_('I', 'i', increment) \ |
|
|
_('I', 'i', increment) \ |
|
|
_('J', 'j', jump) \ |
|
|
_('J', 'j', jump) \ |
|
|
_('K', 'k', kill) \ |
|
|
_('K', 'k', kill) \ |
|
|
|
|
|
_('L', 'l', loop) \ |
|
|
_('M', 'm', modulo) \ |
|
|
_('M', 'm', modulo) \ |
|
|
_('O', 'o', offset) \ |
|
|
_('O', 'o', offset) \ |
|
|
_('P', 'p', push) \ |
|
|
_('P', 'p', push) \ |
|
@ -481,6 +482,39 @@ END_PHASE |
|
|
BEGIN_DUAL_PHASE_1(kill) |
|
|
BEGIN_DUAL_PHASE_1(kill) |
|
|
END_PHASE |
|
|
END_PHASE |
|
|
|
|
|
|
|
|
|
|
|
BEGIN_DUAL_PHASE_0(loop) |
|
|
|
|
|
PSEUDO_DUAL; |
|
|
|
|
|
BEGIN_DUAL_PORTS |
|
|
|
|
|
PORT(0, -1, IN | HASTE); |
|
|
|
|
|
END_PORTS |
|
|
|
|
|
if (IS_AWAKE) { |
|
|
|
|
|
Usz len = usz_clamp(INDEX(PEEK(0, -1)), 1, 16); |
|
|
|
|
|
I32 len_data[1]; |
|
|
|
|
|
len_data[0] = (I32)len; |
|
|
|
|
|
STORE(len_data); |
|
|
|
|
|
// todo optimize
|
|
|
|
|
|
for (Usz i = 0; i < len; ++i) { |
|
|
|
|
|
LOCK(0, (Isz)i + 1); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
END_PHASE |
|
|
|
|
|
BEGIN_DUAL_PHASE_1(loop) |
|
|
|
|
|
I32 len_data[1]; |
|
|
|
|
|
// todo should at least stun the 1 column if columns is 1
|
|
|
|
|
|
if (LOAD(len_data) && len_data[0] >= 1 && len_data[0] <= 16) { |
|
|
|
|
|
Usz len = (Usz)len_data[0]; |
|
|
|
|
|
Glyph buff[15]; |
|
|
|
|
|
Glyph* gs = gbuffer + y * width + x + 1; |
|
|
|
|
|
Glyph hopped = *gs; |
|
|
|
|
|
memcpy(buff, gs + 1, len - 1); |
|
|
|
|
|
buff[len - 1] = hopped; |
|
|
|
|
|
memcpy(gs, buff, len); |
|
|
|
|
|
for (Usz i = 0; i < len; ++i) { |
|
|
|
|
|
STUN(0, (Isz)i + 1); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
END_PHASE |
|
|
|
|
|
|
|
|
BEGIN_DUAL_PHASE_0(modulo) |
|
|
BEGIN_DUAL_PHASE_0(modulo) |
|
|
REALIZE_DUAL; |
|
|
REALIZE_DUAL; |
|
|
BEGIN_DUAL_PORTS |
|
|
BEGIN_DUAL_PORTS |
|
@ -565,7 +599,8 @@ BEGIN_DUAL_PHASE_0(count) |
|
|
len_data[0] = (I32)len; |
|
|
len_data[0] = (I32)len; |
|
|
STORE(len_data); |
|
|
STORE(len_data); |
|
|
Usz max_x = x + len; |
|
|
Usz max_x = x + len; |
|
|
if (max_x >= width) max_x = width; |
|
|
if (max_x > width) |
|
|
|
|
|
max_x = width; |
|
|
U8* i = mbuffer + y * width + x + 1; |
|
|
U8* i = mbuffer + y * width + x + 1; |
|
|
U8* e = mbuffer + y * width + max_x; |
|
|
U8* e = mbuffer + y * width + max_x; |
|
|
while (i != e) { |
|
|
while (i != e) { |
|
@ -579,7 +614,8 @@ BEGIN_DUAL_PHASE_1(count) |
|
|
if (LOAD(len_data) && len_data[0] >= 1 && len_data[0] <= 17) { |
|
|
if (LOAD(len_data) && len_data[0] >= 1 && len_data[0] <= 17) { |
|
|
Usz len = (Usz)len_data[0]; |
|
|
Usz len = (Usz)len_data[0]; |
|
|
Usz max_x = x + len; |
|
|
Usz max_x = x + len; |
|
|
if (max_x >= width) max_x = width; |
|
|
if (max_x >= width) |
|
|
|
|
|
max_x = width; |
|
|
Glyph const* i = gbuffer + y * width + x + 1; |
|
|
Glyph const* i = gbuffer + y * width + x + 1; |
|
|
Glyph const* e = gbuffer + y * width + max_x; |
|
|
Glyph const* e = gbuffer + y * width + max_x; |
|
|
Usz count = 0; |
|
|
Usz count = 0; |
|
|