예제 #1
0
 public Execution(MemoryHandler x, Registers Registers)
 {
     this.Registers = Registers;
     memoryHandler  = x;
 }
예제 #2
0
파일: Program.cs 프로젝트: HakopZ/Assembler
        static void Main(string[] args)
        {
            MemoryHandler memoryHandler = new MemoryHandler(ref AddressSpace);


            var docsFold   = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            var binaryFile = Path.Combine(docsFold, "asmBinaries", "Binary.bin");

            byte[] binary = File.ReadAllBytes(binaryFile);

            binary.AsSpan().CopyTo(AddressSpace.AsSpan().Slice(0x8000));

            ushort    sp       = 0x8000;
            ushort    pc       = 0x8000;
            Registers Register = new Registers(ref sp, ref pc);

            Register[31] = 0x8000;

            Register[30] = 0x8000;
            Execution execution = new Execution(memoryHandler, Register);
            MMIO      mmio      = new MMIO(AddressSpace);

            while (true)
            {
                mmio.Update();
                Span <byte> instruction = memoryHandler.ByteInstructionSpace.Slice(Register[31] - 0x8000, 4);
                Register[31] += 4;
                int         code   = instruction[0];
                OpCodeTypes opType = OpCodeHelpers.OpCodeTypeMap[(OpCodes)code];
                switch (opType)
                {
                case OpCodeTypes.NoArgs:
                    execution.NoArgs(code);
                    break;

                case OpCodeTypes.OneAddr:
                    ushort addr = (ushort)((instruction[2] << 8) | (instruction[3]));
                    execution.OneAddress(code, addr);
                    break;

                case OpCodeTypes.OneRegOneAddr:
                    ushort address = (ushort)((instruction[2] << 8) | (instruction[3]));
                    execution.OneRegOneAdr(code, instruction[1], address);
                    break;

                case OpCodeTypes.OneReg:
                    execution.OneReg(code, instruction[1]);
                    break;

                case OpCodeTypes.TwoReg:
                    execution.TwoReg(code, instruction[1], instruction[2]);
                    break;

                case OpCodeTypes.TwoRegOneOffset:
                    execution.TwoRegOneOffset(code, instruction[1], instruction[2], instruction[3]);
                    break;

                case OpCodeTypes.ThreeReg:
                    execution.ThreeReg(code, instruction[1], instruction[2], instruction[3]);
                    break;
                }
            }
        }