overhaul of interpreter, update ships to match; "make test" works now
[fleet.git] / ships / Counter.ship
index f82bc14..0acc5b7 100644 (file)
@@ -20,7 +20,70 @@ data  in:   inOp
 data  out:  out
 
 == Fleeterpreter ====================================================
-public void service() { }
+
+boolean full = false;
+boolean op_count = false;
+boolean op_repeat = false;
+boolean op_pass = false;
+boolean op_drop = false;
+boolean op_c1 = false;
+boolean op_c2 = false;
+boolean op_v1 = false;
+boolean op_v2 = false;
+long temp = 0;
+
+public void reset() {
+  super.reset();
+  full = false;
+  temp = 0;
+}
+public void service() {
+
+  if (full) {
+    if (temp < 0) {
+      temp = 0;
+      full = false;
+      box_inOp.removeDataForShip();
+      if (op_count) box_in2.removeDataForShip();
+      else if (op_repeat && op_v1) box_in1.removeDataForShip();
+      else if (op_repeat && op_v2) box_in2.removeDataForShip();
+
+    } else if (box_out.readyForDataFromShip()) {
+      if (op_count) {
+        box_out.addDataFromShip(temp);
+        temp = temp - box_in2.peekDataForShip();
+      } else if (op_v1 && box_in1.dataReadyForShip()) {
+        if (op_drop) { box_in1.removeDataForShip(); temp--; }
+        else         { box_out.addDataFromShip(op_pass ? box_in1.removeDataForShip() : box_in1.peekDataForShip()); temp--; }
+      } else if (op_v2 && box_in2.dataReadyForShip()) {
+        if (op_drop) { box_in2.removeDataForShip(); temp--; }
+        else         { box_out.addDataFromShip(op_pass ? box_in2.removeDataForShip() : box_in2.peekDataForShip()); temp--; }
+      }
+      
+    }
+
+  } else if (box_inOp.dataReadyForShip()) {
+    long op   = box_inOp.peekDataForShip();
+    op_count  = (op & 15)==12;
+    op_repeat = ((op>>2) & 3)==0;
+    op_pass   = ((op>>2) & 3)==1;
+    op_drop   = ((op>>2) & 3)==2;
+    op_c1     = (op_repeat || op_pass || op_drop) && !(((op>>1)&1)!=0);
+    op_c2     = (op_repeat || op_pass || op_drop) &&  (((op>>1)&1)!=0);
+    op_v1     = (op_repeat || op_pass || op_drop) && !(((op>>0)&1)!=0);
+    op_v2     = (op_repeat || op_pass || op_drop) &&  (((op>>0)&1)!=0);
+
+    if (op_count && (!box_in1.dataReadyForShip() || !box_in2.dataReadyForShip())) return;
+    if (op_c1    &&  !box_in1.dataReadyForShip()) return;
+    if (op_c2    &&  !box_in2.dataReadyForShip()) return;
+    
+    full = true;
+
+    if (op_count) temp = box_in1.removeDataForShip() - box_in2.peekDataForShip();
+    if (op_c1)    temp = box_in1.removeDataForShip()-1;
+    if (op_c2)    temp = box_in2.removeDataForShip()-1;
+  }
+}
 
 == FleetSim ==============================================================