- Fixed field masks for device state flags.
- Boot from expansion port if no cartridge is present.master
parent
22e54a2333
commit
e681227e27
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue