From 6d17e2e08394ca9f26ad050ec11e2ef954360f3c Mon Sep 17 00:00:00 2001
From: cancel <cancel@cancel.fm>
Date: Wed, 28 Nov 2018 18:30:59 +0900
Subject: [PATCH] Add 'B'

---
 sim.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/sim.c b/sim.c
index 0e98e20..64809ef 100644
--- a/sim.c
+++ b/sim.c
@@ -260,6 +260,7 @@ Usz UCLAMP(Usz val, Usz min, Usz max) {
   _('W', 'w', west)                                                            \
   _('Z', 'z', southeast)                                                       \
   _('A', 'a', add)                                                             \
+  _('B', 'b', banger)                                                          \
   _('F', 'f', if)                                                              \
   _('G', 'g', generator)                                                       \
   _('H', 'h', halt)                                                            \
@@ -300,6 +301,40 @@ BEGIN_DUAL_PHASE_1(add)
   POKE(1, 0, glyphs_add(PEEK(0, 1), PEEK(0, 2)));
 END_PHASE
 
+BEGIN_DUAL_PHASE_0(banger)
+  REALIZE_DUAL;
+  BEGIN_DUAL_PORTS
+    PORT(0, 1, IN | NONLOCKING);
+    PORT(1, 0, OUT);
+  END_PORTS
+END_PHASE
+BEGIN_DUAL_PHASE_1(banger)
+  REALIZE_DUAL;
+  STOP_IF_DUAL_INACTIVE;
+  Glyph g = PEEK(0, 1);
+  Glyph result;
+  switch (g) {
+  case '1':
+  case 'N':
+  case 'n':
+  case 'E':
+  case 'e':
+  case 'S':
+  case 's':
+  case 'W':
+  case 'w':
+  case 'Z':
+  case 'z':
+  case '*':
+    result = '*';
+    break;
+  default:
+    result = '.';
+    break;
+  }
+  POKE(1, 0, result);
+END_PHASE
+
 BEGIN_DUAL_PHASE_0(if)
   REALIZE_DUAL;
   BEGIN_DUAL_PORTS