예제 #1
0
        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();
        }
예제 #2
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);
            }
        }