From dcd2b2462cc9080fed9813591c7a0fe3c0e0161f Mon Sep 17 00:00:00 2001 From: cancel Date: Sat, 1 Dec 2018 19:04:10 +0900 Subject: [PATCH] Remove use of X macro for uturn definition --- sim.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/sim.c b/sim.c index f5354f2..0ed719b 100644 --- a/sim.c +++ b/sim.c @@ -730,39 +730,41 @@ BEGIN_DUAL_PHASE_1(track) STUN(1, 0); END_PHASE -#define UTURN_DIRS(_) \ - _(-1, 0, 'N') \ - _(0, -1, 'W') \ - _(0, 1, 'E') \ - _(1, 0, 'S') +static Isz const uturn_data[] = { + // clang-format off + -1, 0, (Isz)'N', + 0, -1, (Isz)'W', + 0, 1, (Isz)'E', + 1, 0, (Isz)'S', + // clang-format on +}; + +enum { Uturn_per = 3, Uturn_loop_limit = Uturn_per * 4, }; BEGIN_DUAL_PHASE_0(uturn) REALIZE_DUAL; BEGIN_DUAL_PORTS -#define X(_d_y, _d_x, _d_glyph) PORT(_d_y, _d_x, IN | OUT | HASTE | NONLOCKING); - UTURN_DIRS(X) -#undef X + for (Usz i = 0; i < Uturn_loop_limit; i += Uturn_per) { + PORT(uturn_data[i + 0], uturn_data[i + 1], IN | OUT | HASTE | NONLOCKING); + } END_PORTS END_PHASE BEGIN_DUAL_PHASE_1(uturn) REALIZE_DUAL; if (!DUAL_IS_ACTIVE) return; -#define X(_d_y, _d_x, _d_glyph) \ - { \ - Glyph g = PEEK(_d_y, _d_x); \ - switch (g) { \ - case MOVEMENT_CASES: \ - POKE(_d_y, _d_x, _d_glyph); \ - STUN(_d_y, _d_x); \ - } \ + for (Usz i = 0; i < Uturn_loop_limit; i += Uturn_per) { + Isz dy = uturn_data[i + 0]; + Isz dx = uturn_data[i + 1]; + Glyph g = PEEK(dy, dx); + switch (g) { + case MOVEMENT_CASES: + POKE(dy, dx, (Glyph)uturn_data[i + 2]); + STUN(dy, dx); + } } - UTURN_DIRS(X) -#undef X END_PHASE -#undef UTURN_DIRS - BEGIN_DUAL_PHASE_0(beam) if (!IS_AWAKE) return;