private void PopulateTimingFromRegValue(nForce2XTLibrary.TimingItem item)
        {
            TimingDef def      = GetDefByName(item.Name);
            uint      regValue = ReadPciReg(def.PciDev.GetPciAddressFull());

            item.Value = GetTimingFromRegValue(regValue, def.Offset, def.Bits);
        }
        private int ReadCASValue()
        {
            // Read value for DIMM_B0
            TimingDef def = GetDefByName("CAS");
            uint      reg = ReadPciReg(def.PciDev.GetPciAddressFull());

            // CAS is bits [5:4], bit 6 is Half Latency toggle
            // CAS 2.0 = 010 2
            // CAS 2.5 = 110 5
            // CAS 3.0 = 011 3
            // 001, 101 and 111 are reserved
            uint value = utils.GetBits(reg, def.Offset, def.Bits);

            if (value == 2)
            {
                return(1);            // CAS 2.0
            }
            if (value == 6)
            {
                return(2);            // CAS 2.5
            }
            if (value == 3)
            {
                return(3);            // CAS 3.0
            }
            return(0);
        }
        private void ApplyChipsetTabSettings()
        {
            if (CPUDisconnect.Changed)
            {
                TimingDef def      = GetDefByName(CPUDisconnect.Name);
                uint      regValue = ReadPciReg(def.PciDev.GetPciAddressFull());

                uint selectedValue = Convert.ToUInt32(CPUDisconnect.Value);
                regValue = utils.SetBits(regValue, def.Offset, def.Bits, selectedValue);
                regValue = utils.SetBits(regValue, 31, 1, ~selectedValue);

                ols.WriteIoPortDwordEx(PCI_DATA_PORT, regValue);
            }

            WriteTimings(new nForce2XTLibrary.TimingItem[] { AGPFastWrite });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { AGPSBA });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { AGPControllerLatency });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { AGPBusLatency });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { PCILatency });
        }
        private void WriteTimings(nForce2XTLibrary.TimingItem[] l)
        {
            nForce2XTLibrary.TimingItem[] changed = Array.FindAll(l, x => x.Changed);

            if (changed.Length == 0)
            {
                return;
            }

            TimingDef def      = GetDefByName(changed[0].Name);
            uint      regValue = ReadPciReg(def.PciDev.GetPciAddressFull());

            foreach (nForce2XTLibrary.TimingItem item in changed)
            {
                def      = GetDefByName(item.Name);
                regValue = utils.SetBits(regValue, def.Offset, def.Bits, Convert.ToUInt32(item.Value));
            }

            ols.WriteIoPortDwordEx(PCI_DATA_PORT, regValue);
        }
        private void ApplyDRAMTabSettings()
        {
            WriteTimings(new nForce2XTLibrary.TimingItem[] { TRC, TRFC, TRAS, TRCDR, TRCDW, TRP });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { TDOE, TRRD, TWTP, TWTR, TREXT, TRTP, TRTW });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { TREF });

            WriteTimings(new nForce2XTLibrary.TimingItem[] { AutoPrecharge });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { SuperBypass });
            WriteTimings(new nForce2XTLibrary.TimingItem[] { DataScavengedRate });

            WriteDoubledTimings(new nForce2XTLibrary.TimingItem[] { DIMM0DrvStrA, DIMM1DrvStrA, DIMM0SlewRate, DIMM1SlewRate });
            WriteDoubledTimings(new nForce2XTLibrary.TimingItem[] { DIMM0DrvStrB, DIMM1DrvStrB });
            WriteDoubledTimings(new nForce2XTLibrary.TimingItem[] { DIMM2DrvStrA, DIMM2SlewRate });
            WriteDoubledTimings(new nForce2XTLibrary.TimingItem[] { DIMM2DrvStrB });

            if (BurstMode.Changed)
            {
                // A0, A8, B0
                TimingDef def      = GetDefByName(BurstMode.Name);
                byte      reg      = def.PciDev.Offset;
                uint      pciDev   = def.PciDev.GetPciAddress();
                uint      regValue = ols.ReadPciConfigDword(pciDev, reg);

                uint selectedValue = Convert.ToUInt32(BurstMode.Value);
                regValue = utils.SetBits(regValue, def.Offset, def.Bits, selectedValue);
                //regValue = utils.SetBits(burstMode, 31, 1, 1);
                ols.WritePciConfigDwordEx(pciDev, 0xA0, regValue);
                ols.WritePciConfigDwordEx(pciDev, 0xA8, regValue);
                ols.WritePciConfigDwordEx(pciDev, 0xB0, regValue);
            }

            if (DriveStrengthMode.Changed)
            {
                TimingDef def      = GetDefByName(DriveStrengthMode.Name);
                byte      reg      = def.PciDev.Offset;
                uint      pciDev   = def.PciDev.GetPciAddress();
                uint      regValue = ols.ReadPciConfigDword(pciDev, reg);

                uint selectedValue = Convert.ToUInt32(DriveStrengthMode.Value);
                regValue = utils.SetBits(regValue, def.Offset, def.Bits, selectedValue);

                ols.WritePciConfigDwordEx(pciDev, 0xA4, regValue);
                ols.WritePciConfigDwordEx(pciDev, 0xAC, regValue);
                ols.WritePciConfigDwordEx(pciDev, 0xB4, regValue);
            }

            if (advancedTextBox1.Changed || advancedTextBox2.Changed || advancedTextBox3.Changed)
            {
                uint pciReg  = utils.MakePciAddress(0, 0, 3, 0x64);
                uint romsip1 = ReadPciReg(pciReg);
                romsip1 = utils.SetBits(romsip1, 8, 8, advancedTextBox1.Value);
                romsip1 = utils.SetBits(romsip1, 16, 8, advancedTextBox2.Value);
                romsip1 = utils.SetBits(romsip1, 24, 8, advancedTextBox3.Value);
                WritePciReg(pciReg, romsip1);
            }

            if (advancedTextBox4.Changed || advancedTextBox5.Changed || advancedTextBox6.Changed || advancedTextBox7.Changed)
            {
                uint pciReg  = utils.MakePciAddress(0, 0, 3, 0x68);
                uint romsip2 = ReadPciReg(pciReg);
                romsip2 = utils.SetBits(romsip2, 0, 8, advancedTextBox4.Value);
                romsip2 = utils.SetBits(romsip2, 8, 8, advancedTextBox5.Value);
                romsip2 = utils.SetBits(romsip2, 16, 8, advancedTextBox6.Value);
                romsip2 = utils.SetBits(romsip2, 24, 8, advancedTextBox7.Value);
                WritePciReg(pciReg, romsip2);
            }

            if (advancedTextBox8.Changed || advancedTextBox9.Changed || advancedTextBox10.Changed)
            {
                uint pciReg  = utils.MakePciAddress(0, 0, 3, 0x6C);
                uint romsip3 = ReadPciReg(pciReg);
                romsip3 = utils.SetBits(romsip3, 0, 8, advancedTextBox8.Value);
                romsip3 = utils.SetBits(romsip3, 8, 8, advancedTextBox9.Value);
                romsip3 = utils.SetBits(romsip3, 24, 8, advancedTextBox10.Value);
                WritePciReg(pciReg, romsip3);
            }
        }
        private bool IsDIMMInstalled(TimingDef def)
        {
            uint regValue = ReadPciReg(def.PciDev.GetPciAddressFull());

            return(utils.GetBits(regValue, def.Offset, def.Bits) == 1);
        }