コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 public abstract ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra);
コード例 #5
0
 public ExecutionResult Execute(MmixComputer mmixComputer, Tetra tetra)
 {
     //Console.WriteLine(Symbol);
     return(ExecuteInstruction(mmixComputer, tetra));
 }