update to 03-Jan-2009 am33: head, abort, and d-flag
[fleet.git] / src / edu / berkeley / fleet / two / FleetTwoFleet.java
index 27bf3df..311a007 100644 (file)
@@ -39,6 +39,8 @@ public abstract class FleetTwoFleet extends Fleet {
     public final Mask SHIFT;
 
     public final Mask TAIL;
+    public final Mask HEAD;
+    public final Mask ABORT;
 
     public final Mask MOVE;
     public final Mask TI;
@@ -110,7 +112,9 @@ public abstract class FleetTwoFleet extends Fleet {
 
             SHIFT                      = new Mask("..........101111.1vvvvvvvvvvvvvvvvvvv");
 
-            TAIL                       = new Mask("................1....................");
+            TAIL                       = new Mask("................1...................0");
+            HEAD                       = null;
+            ABORT                      = null;
 
             MOVE                       = new Mask("..........110111.....................");
             TI                         = new Mask("..........110111..1..................");
@@ -162,7 +166,10 @@ public abstract class FleetTwoFleet extends Fleet {
 
             SHIFT                      = new Mask("................00vvvvvvvvvvvvvvvvvvv");
 
-            TAIL                       = new Mask("................11...................");
+            ABORT                      = new Mask("................1100.................");  // note: has a predicate!
+
+            HEAD                       = new Mask("................1110.................");
+            TAIL                       = new Mask("................1111.................");
 
             MOVE                       = new Mask("................01...................");
             TI                         = new Mask("................011..................");
@@ -252,11 +259,12 @@ public abstract class FleetTwoFleet extends Fleet {
         Dock dock = getPathByAddr(dispatchFrom, DISPATCH_PATH.getvalAsBitVector(inst)).getDestination().getDock();
 
         if (TAIL.get(inst))   return new Tail(dock);
+        if (HEAD.get(inst))   return new Head(dock);
 
         Predicate predicate = Default;
-        if (P_ALWAYS.get(inst)) predicate = IgnoreOLC;
+        if (P_ALWAYS.get(inst)) predicate = IgnoreFlagD;
         if (P_OLC_NONZERO.get(inst))    predicate = Default;
-        if (P_OLC_ZERO.get(inst))    predicate = OLCZero;
+        if (P_OLC_ZERO.get(inst))    predicate = FlagD;
         if (P_A.get(inst))      predicate = FlagA;
         if (P_B.get(inst))      predicate = FlagB;
         if (P_NOT_A.get(inst))  predicate = NotFlagA;
@@ -265,6 +273,8 @@ public abstract class FleetTwoFleet extends Fleet {
         boolean looping = !OS.get(inst);
         if (FLUSH.get(inst))
             return new Flush(dock, looping, predicate);
+        if (ABORT.get(inst))
+            return new Abort(dock, predicate);
         if (SHIFT.get(inst))                return new Shift(dock, looping, predicate, new BitVector(dock.getShip().getFleet().getShiftWidth()).set(SHIFT.getval(inst)));
         if (SET_IMMEDIATE.get(inst)) {
             boolean extend = SET_IMMEDIATE_EXTEND.getval(inst) != 0;
@@ -336,8 +346,8 @@ public abstract class FleetTwoFleet extends Fleet {
         Instruction pi = d;
         if (!pi.looping) instr = OS.set(instr);
         switch(pi.predicate) {
-            case IgnoreOLC:         instr = P_ALWAYS.set(instr); break;
-            case OLCZero:         instr = P_OLC_ZERO.set(instr); break;
+            case IgnoreFlagD:         instr = P_ALWAYS.set(instr); break;
+            case FlagD:         instr = P_OLC_ZERO.set(instr); break;
             case Default: instr = P_OLC_NONZERO.set(instr); break;
             case FlagA:      instr = P_A.set(instr);      break;
             case FlagB:      instr = P_B.set(instr);      break;
@@ -349,6 +359,9 @@ public abstract class FleetTwoFleet extends Fleet {
         if (d instanceof Tail) {
             instr = TAIL.set(instr);
 
+        } else if (d instanceof Head) {
+            instr = HEAD.set(instr);
+
         } else if (d instanceof Shift) {
             Shift shift = (Shift)d;
             instr = SHIFT.set(instr);
@@ -357,6 +370,9 @@ public abstract class FleetTwoFleet extends Fleet {
         } else if (d instanceof Flush) {
             instr = FLUSH.set(instr);
 
+        } else if (d instanceof Abort) {
+            instr = ABORT.set(instr);
+
         } else if (d instanceof Set) {
             Set s = (Set)d;
             switch(s.dest) {