diff --git a/sim.c b/sim.c index da820e6..080dc4d 100644 --- a/sim.c +++ b/sim.c @@ -232,7 +232,7 @@ static void oper_poke_and_stun(Glyph* restrict gbuffer, Mark* restrict mbuffer, _('I', increment) \ _('J', jump) \ _('K', konkat) \ - _('L', loop) \ + _('L', lesser) \ _('M', multiply) \ _('N', movement) \ _('O', offset) \ @@ -553,36 +553,21 @@ BEGIN_OPERATOR(konkat) } END_OPERATOR -BEGIN_OPERATOR(loop) +BEGIN_OPERATOR(lesser) LOWERCASE_REQUIRES_BANG; - PORT(0, -2, IN | PARAM); PORT(0, -1, IN | PARAM); - PORT(0, 1, IN | PARAM); + PORT(0, 1, IN); PORT(1, 0, OUT); - Glyph g = PEEK(0, -2); - Usz rate = 1; - if (g != '.' && g != '*') - rate = index_of(g); - Usz len = safe_index_of(PEEK(0, -1)); - if (len > width - x - 1) - len = width - x - 1; - Mark* m = mbuffer + y * width + x + 1; - for (Usz i = 0; i < len; ++i) { - m[i] |= (Mark_flag_lock | Mark_flag_sleep); - } - if (len == 0) - return; - rate = rate % len; - Glyph buff[Glyphs_index_count]; - Glyph* gs = gbuffer + y * width + x + 1; - for (Usz i = 0; i < len; ++i) { - Usz offset = (i + len - rate) % len; - buff[i] = gs[offset]; - } - for (Usz i = 0; i < len; ++i) { - gs[i] = buff[i]; + Glyph ga = PEEK(0, -1); + Glyph gb = PEEK(0, 1); + if (ga == '.' || gb == '.') { + POKE(1, 0, '.'); + } else { + Usz a = index_of(ga); + Usz b = index_of(gb); + Usz out = (a < b) ? a : b; + POKE(1, 0, indexed_glyphs[out]); } - POKE(1, 0, PEEK(0, 1)); END_OPERATOR BEGIN_OPERATOR(multiply)