Beispiel #1
0
        protected override void Execute()
        {
            if (!cycleException)
            {
                int arguments = operation.Method.GetParameters().Length;

                // TODO: Wrap in try-catch
                try
                {
                    switch (arguments)
                    {
                    case 0:
                        operation.DynamicInvoke();
                        break;

                    case 1:
                        operation.DynamicInvoke(operandA);
                        break;

                    case 2:
                        operation.DynamicInvoke(operandA, operandB);
                        break;
                    }
                }
                catch (Exception ex)
                {
                    Northbridge.WriteDisplay(0, Encoding.ASCII.GetBytes(ex.Message));
                }

                //Parent.RaiseUpdateDebugger();
            }
        }
Beispiel #2
0
        void _in()
        {
            uint32_t port    = registers.Read <uint32_t>(Register.EAX);
            uint32_t address = registers.Read <uint32_t>(Register.EBX);
            uint32_t buffer  = registers.Read <uint32_t>(Register.ECX);

            Northbridge.ReadFromPort(port, address, buffer);
        }
Beispiel #3
0
        void _out()
        {
            uint32_t port    = registers.Read <uint32_t>(Register.EAX);
            uint32_t address = registers.Read <uint32_t>(Register.EBX);
            uint32_t length  = registers.Read <uint32_t>(Register.ECX);

            Northbridge.WriteToPort(port, address, length);
        }
Beispiel #4
0
        public VirtualMachine(CPU cpu, ClockGenerator clock, Northbridge northbridge, Southbridge southbridge)
        {
            this.cpu        = cpu;
            this.cpu.Parent = this;

            this.northbridge       = northbridge;
            this.southbridge       = southbridge;
            this.northbridge.Clock = clock;
        }
Beispiel #5
0
 public static void Step(Northbridge nb)
 {
     if (nb.CPU.Enabled)
     {
         if (!nb.CPU.Busy)
         {
             nb.ClockTick();
             RaiseTick();
         }
     }
 }
Beispiel #6
0
        public static void ClockTick(object nb)
        {
            Northbridge _nb = (Northbridge)nb;

            while (_nb.CPU.Enabled & ClockEnabled)
            {
                if (!_nb.CPU.Busy)
                {
                    _nb.ClockTick();
                    RaiseTick();
                }
            }
        }
Beispiel #7
0
        protected void WriteMemory()
        {
            if (Parent == null)
            {
                throw new Exception("Not connected to VM. Parent is null.");
            }
            if (Northbridge == null)
            {
                throw new Exception("Not connected to northbridge.");
            }

            uint16_t address = registers.Read <uint16_t>(Register.MAR);
            uint16_t length  = registers.Read <uint16_t>(Register.MLR);

            byte[] value = new byte[0];

            switch (length.Value)
            {
            case 8:
                value = registers.Read(Register.MDR);
                break;

            case 4:
                value = registers.Read(Register.MDR32);
                break;

            case 2:
                value = registers.Read(Register.MDR16);
                break;

            case 1:
                value = registers.Read(Register.MDR8);
                break;
            }

            try
            {
                Northbridge.WriteMemory(address, value, (uint)value.Length);
            }
            catch (MemoryAccessException)
            {
                // Raise interrupt
                SetFlag(CPUFlags.MemoryError);
            }
        }
Beispiel #8
0
        protected override void Execute()
        {
            if (!cycleException)
            {
                int arguments = operation.Method.GetParameters().Length;

                // TODO: Wrap in try-catch
                try
                {
                    switch (arguments)
                    {
                    case 0:
                        operation.DynamicInvoke();
                        break;

                    case 1:
                        operation.DynamicInvoke(operandA);
                        break;

                    case 2:
                        operation.DynamicInvoke(operandA, operandB);
                        break;
                    }
                }
                catch (Exception ex)
                {
                    Northbridge.WriteDisplay(0, Encoding.ASCII.GetBytes(ex.Message));
                }

                Parent.RaiseUpdateDebugger();

                if ((speedTesting) && (cycleCount == 5))
                {
                    TimeSpan time = DateTime.Now - startTime;
                    Speed        = 5.0f / time.TotalSeconds;
                    speedTesting = false;
                }
            }
        }
Beispiel #9
0
        protected void ReadMemory()
        {
            if (Parent == null)
            {
                throw new Exception("Not connected to VM. Parent is null.");
            }
            if (Northbridge == null)
            {
                throw new Exception("Not connected to northbridge.");
            }

            uint16_t address = registers.Read <uint16_t>(Register.MAR);
            uint16_t length  = registers.Read <uint16_t>(Register.MLR);

            try
            {
                byte[] value = Northbridge.ReadMemory(address.Value, length.Value);
                registers.Write(Register.MDR, value);
            }
            catch (IndexOutOfRangeException)
            {
                SetFlag(CPUFlags.MemoryError);
            }
        }
Beispiel #10
0
 public ThreadedClock(Northbridge northbridge)
     : base(northbridge)
 {
 }
Beispiel #11
0
 public ClockGenerator(Northbridge northbridge)
 {
     this.northbridge = northbridge;
 }
Beispiel #12
0
 public DebugStepping(Northbridge northbridge) : base(northbridge)
 {
 }
Beispiel #13
0
        private void frmRegisters_Load(object sender, EventArgs e)
        {
            registers.Append <uint16_t>(Register.PC);            // Program counter
            registers.Append <uint16_t>(Register.MAR);           // Memory address register
            registers.Append <uint16_t>(Register.MLR);           // Memory length register

            registers.Append <uint64_t>(Register.MDR);           // Memory data register (64-bits)
            registers.Subdivide(Register.MDR, Register.MDR32);   // 32-bit MDR register
            registers.Subdivide(Register.MDR32, Register.MDR16); // 16-bit MDR register
            registers.Subdivide(Register.MDR16, Register.MDR8);  // 8-bit MDR register

            registers.Append <Opcode>(Register.CIR);             // Current instruction register

            registers.Append <uint16_t>(Register.IDT);           // Interrupt Descriptor Table address

            registers.Append <uint64_t>(Register.FLAGS);         // Flags register

            registers.Append <uint32_t>(Register.SVM);

            registers.Append <uint32_t>(Register.EAX);
            registers.Subdivide(Register.EAX, Register.AX);
            registers.Subdivide(Register.AX, Register.AL, Register.AH);

            registers.Append <uint32_t>(Register.EBX);
            registers.Subdivide(Register.EBX, Register.BX);
            registers.Subdivide(Register.BX, Register.BL, Register.BH);

            registers.Append <uint32_t>(Register.ECX);
            registers.Subdivide(Register.ECX, Register.CX);
            registers.Subdivide(Register.CX, Register.CL, Register.CH);

            registers.Append <uint32_t>(Register.EDX);
            registers.Subdivide(Register.EDX, Register.DX);
            registers.Subdivide(Register.DX, Register.DL, Register.DH);

            registers.Append <uint16_t>(Register.ABP);
            registers.Append <uint16_t>(Register.AEI);
            registers.Append <uint16_t>(Register.AEL);
            registers.Append <uint16_t>(Register.AEP);

            registers.BuildMemory();

            //byte[] bin = Assemble();
            byte[] bcmos  = System.IO.File.ReadAllBytes("cmos.bin");
            byte[] bdisk1 = System.IO.File.ReadAllBytes("disk1.bin");

            // Build the VM
            cmosMemory  = new Memory2(bcmos);
            cmos        = new DiskDrive(cmosMemory);
            disk1Memory = new Memory2(bdisk1);
            disk1       = new DiskDrive(disk1Memory);
            sb          = new Southbridge(cmos);
            sb.AddDevice(disk1);
            keyboard = new Keyboard();
            sb.AddDevice(keyboard);
            cpu      = new CPU2();
            graphics = new MonochromeDisplayAdapter();
            nb       = new Northbridge(cpu, sb, new Memory2(64 * 1024), graphics);
            clock    = new ThreadedClock(nb);
            nb.Clock = clock;
            vm       = new VirtualMachine(cpu, clock, nb, sb);

            byte[] state = vm.GetRegisters();
            registers.LoadState(state);

            //graphics.Write(0, Encoding.ASCII.GetBytes("Hello World!"));

            UpdateList();
        }