- Fixed field masks for device state flags.

- Boot from expansion port if no cartridge is present.
master
Nabile Rahmani 2018-06-14 20:24:19 +02:00
parent 22e54a2333
commit e681227e27
2 changed files with 32 additions and 22 deletions

View File

@ -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

View File

@ -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();