From 593eaad2c9623e57de96b0c49a7bcfb47026f9ba Mon Sep 17 00:00:00 2001 From: cancel Date: Wed, 1 Jan 2020 03:20:36 +0900 Subject: [PATCH] Add output b->a casing rules for A, B, L and M --- sim.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/sim.c b/sim.c index e57803c..b9b5b8e 100644 --- a/sim.c +++ b/sim.c @@ -73,6 +73,14 @@ static inline bool glyph_is_lowercase(Glyph g) { return g & (1 << 5); } static inline Glyph glyph_lowered_unsafe(Glyph g) { return (Glyph)(g | (1 << 5)); } +static inline Glyph glyph_with_case(Glyph g, Glyph caser) { + enum { + Case_bit = 1 << 5, + Alpha_bit = 1 << 6, + }; + return (Glyph)((g & ~Case_bit) | ((~g & Alpha_bit) >> 1) | + (caser & Case_bit)); +} ORCA_PURE static bool oper_has_neighboring_bang(Glyph const* gbuf, Usz h, Usz w, Usz y, Usz x) { @@ -421,9 +429,10 @@ BEGIN_OPERATOR(add) PORT(0, -1, IN | PARAM); PORT(0, 1, IN); PORT(1, 0, OUT); - Usz a = index_of(PEEK(0, -1)); - Usz b = index_of(PEEK(0, 1)); - POKE(1, 0, indexed_glyphs[(a + b) % Glyphs_index_count]); + Glyph a = PEEK(0, -1); + Glyph b = PEEK(0, 1); + Glyph g = indexed_glyphs[(index_of(a) + index_of(b)) % Glyphs_index_count]; + POKE(1, 0, glyph_with_case(g, b)); END_OPERATOR BEGIN_OPERATOR(bounce) @@ -431,12 +440,12 @@ BEGIN_OPERATOR(bounce) PORT(0, -1, IN | PARAM); PORT(0, 1, IN); PORT(1, 0, OUT); - Isz a = (Isz)index_of(PEEK(0, -1)); - Isz b = (Isz)index_of(PEEK(0, 1)); - Isz val = b - a; + Glyph a = PEEK(0, -1); + Glyph b = PEEK(0, 1); + Isz val = (Isz)index_of(b) - (Isz)index_of(a); if (val < 0) val = -val; - POKE(1, 0, glyph_of((Usz)val)); + POKE(1, 0, glyph_with_case(glyph_of((Usz)val), b)); END_OPERATOR BEGIN_OPERATOR(clock) @@ -557,10 +566,10 @@ BEGIN_OPERATOR(lesser) 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]); + Usz ia = index_of(ga); + Usz ib = index_of(gb); + Usz out = ia < ib ? ia : ib; + POKE(1, 0, glyph_with_case(glyph_of(out), gb)); } END_OPERATOR @@ -569,9 +578,10 @@ BEGIN_OPERATOR(multiply) PORT(0, -1, IN | PARAM); PORT(0, 1, IN); PORT(1, 0, OUT); - Usz ia = index_of(PEEK(0, -1)); - Usz ib = index_of(PEEK(0, 1)); - POKE(1, 0, indexed_glyphs[(ia * ib) % Glyphs_index_count]); + Glyph a = PEEK(0, -1); + Glyph b = PEEK(0, 1); + Glyph g = indexed_glyphs[(index_of(a) * index_of(b)) % Glyphs_index_count]; + POKE(1, 0, glyph_with_case(g, b)); END_OPERATOR BEGIN_OPERATOR(offset)