ref: e5906658cd621b1ccc52024e024fce6cb173da89
parent: 191cb6279378acfb0bcdf5a0d4ee1f76591c7a11
author: cancel <cancel@cancel.fm>
date: Tue Nov 27 13:01:58 EST 2018
Add (wip, wrong) 'O'
--- a/sim.c
+++ b/sim.c
@@ -71,6 +71,14 @@
gbuf[y * width + x] = '.';
}
+static inline Usz UCLAMP(Usz val, Usz min, Usz max) {
+ if (val < min)
+ return min;
+ if (val > max)
+ return max;
+ return val;
+}
+
#define ORCA_EXPAND_SOLO_OPER_CHARS(_oper_char, _oper_name) \
Orca_oper_char_##_oper_name = _oper_char,
#define ORCA_EXPAND_DUAL_OPER_CHARS(_upper_oper_char, _lower_oper_char, \
@@ -211,7 +219,8 @@
_('H', 'h', halt) \
_('I', 'i', increment) \
_('J', 'j', jump) \
- _('M', 'm', modulo)
+ _('M', 'm', modulo) \
+ _('O', 'o', offset)
ORCA_DECLARE_OPERATORS(ORCA_SOLO_OPERATORS, ORCA_DUAL_OPERATORS)
@@ -312,6 +321,26 @@
REALIZE_DUAL;
STOP_IF_DUAL_INACTIVE;
POKE(1, 0, glyphs_mod(PEEK(0, 1), PEEK(0, 2)));
+END_PHASE
+
+BEGIN_DUAL_PHASE_0(offset)
+ REALIZE_DUAL;
+ Isz read_y = (Isz)UCLAMP(INDEX(PEEK(0, -1)), 0, 16);
+ Isz read_x = (Isz)UCLAMP(INDEX(PEEK(0, -2)), 1, 16);
+ BEGIN_DUAL_PORTS
+ I_PORT(0, -1, LOCKING | HASTE);
+ I_PORT(0, -2, LOCKING | HASTE);
+ I_PORT(read_y, read_x, LOCKING);
+ O_PORT(0, 1, LOCKING);
+ END_PORTS
+ // wrong
+ STOP_IF_DUAL_INACTIVE;
+ BEGIN_HASTE
+ POKE(0, 1, PEEK(read_y, read_x));
+ STUN(0, 1);
+ END_HASTE
+END_PHASE
+BEGIN_DUAL_PHASE_1(offset)
END_PHASE
//////// Run simulation