diff --git a/DotN64/PIF/PeripheralInterface.DeviceState.cs b/DotN64/PIF/PeripheralInterface.DeviceState.cs index 0a747a7..714e0aa 100644 --- a/DotN64/PIF/PeripheralInterface.DeviceState.cs +++ b/DotN64/PIF/PeripheralInterface.DeviceState.cs @@ -1,57 +1,57 @@ -using System.Collections.Specialized; - -namespace DotN64 +namespace DotN64 { + using static Helpers.BitHelper; + public partial class PeripheralInterface { private struct DeviceState { #region Fields - private BitVector32 bits; + private uint data; - private static readonly BitVector32.Section ipl2SeedSection = BitVector32.CreateSection(0xFF), - ipl3SeedSection = BitVector32.CreateSection(0xFF, ipl2SeedSection), - resetSection = BitVector32.CreateSection(0x02, ipl3SeedSection), - versionSection = BitVector32.CreateSection(0x02, resetSection), - romSection = BitVector32.CreateSection(0x04, versionSection); + private const byte IPL2SeedShift = 0, IPL2SeedSize = 0xFF; + private const byte IPL3SeedShift = 8, IPL3SeedSize = 0xFF; + private const byte ResetShift = 17, ResetSize = 1; + private const byte VersionShift = 18, VersionSize = 1; + private const byte ROMShift = 19, ROMSize = 1; #endregion #region Properties public byte IPL2Seed { - get => (byte)bits[ipl2SeedSection]; - set => bits[ipl2SeedSection] = value; + get => (byte)Get(data, IPL2SeedShift, IPL2SeedSize); + set => Set(ref data, IPL2SeedShift, IPL2SeedSize, value); } public byte IPL3Seed { - get => (byte)bits[ipl3SeedSection]; - set => bits[ipl3SeedSection] = value; + get => (byte)Get(data, IPL3SeedShift, IPL3SeedSize); + set => Set(ref data, IPL3SeedShift, IPL3SeedSize, value); } public ResetType Reset { - get => (ResetType)bits[resetSection]; - set => bits[resetSection] = (byte)value; + get => (ResetType)Get(data, ResetShift, ResetSize); + set => Set(ref data, ResetShift, ResetSize, (byte)value); } public byte Version { - get => (byte)bits[versionSection]; - set => bits[versionSection] = value; + get => (byte)Get(data, VersionShift, VersionSize); + set => Set(ref data, VersionShift, VersionSize, value); } public ROMType ROM { - get => (ROMType)bits[romSection]; - set => bits[romSection] = (byte)value; + get => (ROMType)Get(data, ROMShift, ROMSize); + set => Set(ref data, ROMShift, ROMSize, (byte)value); } #endregion #region Operators - public static implicit operator DeviceState(uint data) => new DeviceState { bits = new BitVector32((int)data) }; + public static implicit operator DeviceState(uint data) => new DeviceState { data = data }; - public static implicit operator uint(DeviceState state) => (uint)state.bits.Data; + public static implicit operator uint(DeviceState state) => state.data; #endregion #region Enumerations diff --git a/DotN64/PIF/PeripheralInterface.cs b/DotN64/PIF/PeripheralInterface.cs index f1a05bc..0a4fce6 100644 --- a/DotN64/PIF/PeripheralInterface.cs +++ b/DotN64/PIF/PeripheralInterface.cs @@ -137,10 +137,20 @@ namespace DotN64 } } - public void Reset() + private void DetectDevice() { if (nintendo64.Cartridge?.ROM.Length >= Cartridge.HeaderSize + Cartridge.BootstrapSize) DeviceStateFlags = CIC.GetSeed(nintendo64.Cartridge.ROM); + else + DeviceStateFlags = new DeviceState + { + ROM = DeviceState.ROMType.DiskDrive + }; + } + + public void Reset() + { + DetectDevice(); if (BootROM == null) EmulateBootROM();