Browse Source

Remove use of X macro for uturn definition

master
cancel 6 years ago
parent
commit
dcd2b2462c
  1. 42
      sim.c

42
sim.c

@ -730,39 +730,41 @@ BEGIN_DUAL_PHASE_1(track)
STUN(1, 0); STUN(1, 0);
END_PHASE END_PHASE
#define UTURN_DIRS(_) \ static Isz const uturn_data[] = {
_(-1, 0, 'N') \ // clang-format off
_(0, -1, 'W') \ -1, 0, (Isz)'N',
_(0, 1, 'E') \ 0, -1, (Isz)'W',
_(1, 0, 'S') 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) BEGIN_DUAL_PHASE_0(uturn)
REALIZE_DUAL; REALIZE_DUAL;
BEGIN_DUAL_PORTS BEGIN_DUAL_PORTS
#define X(_d_y, _d_x, _d_glyph) PORT(_d_y, _d_x, IN | OUT | HASTE | NONLOCKING); for (Usz i = 0; i < Uturn_loop_limit; i += Uturn_per) {
UTURN_DIRS(X) PORT(uturn_data[i + 0], uturn_data[i + 1], IN | OUT | HASTE | NONLOCKING);
#undef X }
END_PORTS END_PORTS
END_PHASE END_PHASE
BEGIN_DUAL_PHASE_1(uturn) BEGIN_DUAL_PHASE_1(uturn)
REALIZE_DUAL; REALIZE_DUAL;
if (!DUAL_IS_ACTIVE) if (!DUAL_IS_ACTIVE)
return; return;
#define X(_d_y, _d_x, _d_glyph) \ for (Usz i = 0; i < Uturn_loop_limit; i += Uturn_per) {
{ \ Isz dy = uturn_data[i + 0];
Glyph g = PEEK(_d_y, _d_x); \ Isz dx = uturn_data[i + 1];
switch (g) { \ Glyph g = PEEK(dy, dx);
case MOVEMENT_CASES: \ switch (g) {
POKE(_d_y, _d_x, _d_glyph); \ case MOVEMENT_CASES:
STUN(_d_y, _d_x); \ POKE(dy, dx, (Glyph)uturn_data[i + 2]);
} \ STUN(dy, dx);
}
} }
UTURN_DIRS(X)
#undef X
END_PHASE END_PHASE
#undef UTURN_DIRS
BEGIN_DUAL_PHASE_0(beam) BEGIN_DUAL_PHASE_0(beam)
if (!IS_AWAKE) if (!IS_AWAKE)
return; return;

Loading…
Cancel
Save