|
@ -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; |
|
|