public void ExecuteRecover(Alu alu) { var value = Compare.Match(reg => alu.GetRegValue(reg), val => val.Value); if (value != 0) { alu.SetRegValue(_RECEIVE, alu.GetRegValue(_SEND)); } }
public void ExecuteOp(Alu alu) { if (!string.IsNullOrWhiteSpace(DebugKey)) { alu.IncreaseDebugCount(DebugKey); } alu.SetRegValue(Register, Operation(alu.GetRegValue(Register), Value.Match(reg => alu.GetRegValue(reg), val => val.Value))); }
public void ExecuteJump(Alu alu) { if (Compare.Match(reg => alu.GetRegValue(reg), val => val.Value) != 0) { var offset = Offset.Match(reg => alu.GetRegValue(reg), val => val.Value); if (offset == 0) { throw new StackOverflowException("Assembunny"); } alu.AdjustPtr(offset - 1); } }
public override string First(string input) { var alu = new Alu(input); alu.ExecuteProgram(haltOnReceive: true); return(alu.GetRegValue(_RECEIVE).ToString()); }
public void ExecuteReceive(Alu alu) { if (alu.HasRegValue(_RECEIVE)) { alu.SetRegValue(Register, alu.GetRegValue(_RECEIVE)); alu.RemoveRegValue(_RECEIVE); } else { alu.SetRegValue(_WAITING, 1); } }
public void ExecuteOutput(Alu alu) { var value = Value.Match(reg => alu.GetRegValue(reg), val => val.Value); alu.Output(value); }
public void ExecuteToggle(Alu alu) { var offset = Offset.Match(reg => alu.GetRegValue(reg), val => val.Value); alu.ToggleInstruction(offset); }
public void ExecuteDec(Alu alu) { alu.SetRegValue(Register, alu.GetRegValue(Register) - 1); }
public void ExecuteInc(Alu alu) { alu.SetRegValue(Register, alu.GetRegValue(Register) + 1); }
public void ExecuteCopy(Alu alu) { alu.SetRegValue(Destination, Source.Match(reg => alu.GetRegValue(reg), val => val.Value)); }
public void ExecuteOp(Alu alu) { alu.SetRegValue(Register, Operation(alu.GetRegValue(Register), Value.Match(reg => alu.GetRegValue(reg), val => val.Value))); }