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(); } }
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); }
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); }
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; }
public static void Step(Northbridge nb) { if (nb.CPU.Enabled) { if (!nb.CPU.Busy) { nb.ClockTick(); RaiseTick(); } } }
public static void ClockTick(object nb) { Northbridge _nb = (Northbridge)nb; while (_nb.CPU.Enabled & ClockEnabled) { if (!_nb.CPU.Busy) { _nb.ClockTick(); RaiseTick(); } } }
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); } }
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; } } }
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); } }
public ThreadedClock(Northbridge northbridge) : base(northbridge) { }
public ClockGenerator(Northbridge northbridge) { this.northbridge = northbridge; }
public DebugStepping(Northbridge northbridge) : base(northbridge) { }
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(); }