public void Start() { // Get length int cmos = 1; DiskDriveRequest request = new DiskDriveRequest(DiskDrive.LEN, 0, 0); southbridge.WriteToPort(cmos, request); southbridge.ClockTick(); DiskDriveRequest result = southbridge.ReadFromPort <DiskDriveRequest>(cmos); int length = (int)result.data; int sectorSize = 512; int chunks = length / sectorSize; int rem = length % sectorSize; List <byte> bios = new List <byte>(); // Get BIOS for (int i = 0; i < chunks; i++) { request = new DiskDriveRequest(DiskDrive.READ, (uint)i * 512, 512); southbridge.WriteToPort(cmos, request); southbridge.ClockTick(); result = southbridge.ReadFromPort <DiskDriveRequest>(cmos); bios.AddRange(result.diskData); } if (rem != 0) { request = new DiskDriveRequest(DiskDrive.READ, (uint)chunks * 512, (uint)rem); southbridge.WriteToPort(cmos, request); southbridge.ClockTick(); result = southbridge.ReadFromPort <DiskDriveRequest>(cmos); bios.AddRange(result.diskData); } northbridge.WriteMemory(0, bios.ToArray(), (uint)bios.Count); cpu.Start(); }
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); } }