public final Mask SHIFT;
public final Mask TAIL;
+ public final Mask HEAD;
+ public final Mask ABORT;
public final Mask MOVE;
public final Mask TI;
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..................");
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..................");
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;
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;
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;
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);
} 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) {