public override ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra) { mmixComputer.rBB = mmixComputer.Registers[255]; // TODO there is a lot more to be understood here - http://mmix.cs.hm.edu/doc/instructions-en.html#TRAP // for now, XYZ == 0 terminates the program. if (tetra.Y == Constants.Fputs && tetra.Z == 1) { // get pointer from $255 var address = mmixComputer.Registers[255].ToLong(); byte letter; var letters = new List <byte>(); do { letter = mmixComputer.Memory[address]; letters.Add(letter); address++; } while (letter != 0x00); Console.Write(Encoding.ASCII.GetString(letters.ToArray())); } if (tetra.ToInt() == 0) { return(ExecutionResult.HALTED); } return(ExecutionResult.CONTINUE); }
public override ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra) { var reg = mmixComputer.Registers[tetra.X]; ulong a = mmixComputer.Registers[tetra.Y].ToULong() + mmixComputer.Registers[tetra.Z].ToULong(); var bytes = mmixComputer.ReadOcta(a); reg.Store(bytes); return(ExecutionResult.CONTINUE); }
public override ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra) { // register to store into var reg = mmixComputer.Registers[tetra.X]; // multiply by 4 as ops are 4 bytes wide long relativeAddress = 4 * (tetra.Y + tetra.Z); // sign check as there isn't a ulong + long overload that handles negatives (I think) ulong address; if (relativeAddress > 0) { address = mmixComputer.PC + (ulong)relativeAddress; } else { address = mmixComputer.PC - (ulong)(-relativeAddress); } reg.Store(address); return(ExecutionResult.CONTINUE); }
public abstract ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra);
public ExecutionResult Execute(MmixComputer mmixComputer, Tetra tetra) { //Console.WriteLine(Symbol); return(ExecuteInstruction(mmixComputer, tetra)); }