mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
+ Fixed VRAM read to wait until next available CPU access slot + Fixed NMI triggering on the wrong scanline on SMS + Fixed NMI issues on ColecoVision + Fixed random ram option not working properly on SG-1000 + Added "Mem access" tab to tilemap viewer to see fetch patterns
198 lines
4.7 KiB
C#
198 lines
4.7 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Mesen.Interop;
|
|
|
|
public struct SmsCpuState : BaseState
|
|
{
|
|
public UInt64 CycleCount;
|
|
public UInt16 PC;
|
|
public UInt16 SP;
|
|
|
|
public byte A;
|
|
public byte Flags;
|
|
|
|
public byte B;
|
|
public byte C;
|
|
public byte D;
|
|
public byte E;
|
|
|
|
public byte H;
|
|
public byte L;
|
|
|
|
public byte IXL;
|
|
public byte IXH;
|
|
|
|
public byte IYL;
|
|
public byte IYH;
|
|
|
|
public byte I;
|
|
public byte R;
|
|
|
|
public byte AltA;
|
|
public byte AltFlags;
|
|
public byte AltB;
|
|
public byte AltC;
|
|
public byte AltD;
|
|
public byte AltE;
|
|
public byte AltH;
|
|
public byte AltL;
|
|
|
|
public byte ActiveIrqs;
|
|
[MarshalAs(UnmanagedType.I1)] public bool NmiLevel;
|
|
[MarshalAs(UnmanagedType.I1)] public bool NmiPending;
|
|
[MarshalAs(UnmanagedType.I1)] public bool Halted;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool IFF1;
|
|
[MarshalAs(UnmanagedType.I1)] public bool IFF2;
|
|
public byte IM;
|
|
|
|
public byte FlagsChanged;
|
|
public UInt16 WZ;
|
|
}
|
|
|
|
[Flags]
|
|
public enum SmsCpuFlags : byte
|
|
{
|
|
Carry = 0x01,
|
|
AddSub = 0x02,
|
|
Parity = 0x04,
|
|
F3 = 0x08,
|
|
HalfCarry = 0x10,
|
|
F5 = 0x20,
|
|
Zero = 0x40,
|
|
Sign = 0x80,
|
|
}
|
|
|
|
public struct SmsVdpState : BaseState
|
|
{
|
|
public UInt32 FrameCount;
|
|
public UInt16 Cycle;
|
|
public UInt16 Scanline;
|
|
public UInt16 VCounter;
|
|
|
|
public UInt16 AddressReg;
|
|
public byte CodeReg;
|
|
[MarshalAs(UnmanagedType.I1)] public bool ControlPortMsbToggle;
|
|
|
|
public byte VramBuffer;
|
|
public byte PaletteLatch;
|
|
public byte HCounterLatch;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool VerticalBlankIrqPending;
|
|
[MarshalAs(UnmanagedType.I1)] public bool ScanlineIrqPending;
|
|
[MarshalAs(UnmanagedType.I1)] public bool SpriteOverflow;
|
|
[MarshalAs(UnmanagedType.I1)] public bool SpriteCollision;
|
|
public byte SpriteOverflowIndex;
|
|
|
|
public UInt16 ColorTableAddress;
|
|
public UInt16 BgPatternTableAddress;
|
|
|
|
public UInt16 SpriteTableAddress;
|
|
public UInt16 SpritePatternSelector;
|
|
|
|
public UInt16 NametableHeight;
|
|
public byte VisibleScanlineCount;
|
|
|
|
public byte TextColorIndex;
|
|
public byte BackgroundColorIndex;
|
|
public byte HorizontalScroll;
|
|
public byte HorizontalScrollLatch;
|
|
public byte VerticalScroll;
|
|
public byte VerticalScrollLatch;
|
|
public byte ScanlineCounter;
|
|
public byte ScanlineCounterLatch;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool SyncDisabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool M2_AllowHeightChange;
|
|
[MarshalAs(UnmanagedType.I1)] public bool UseMode4;
|
|
[MarshalAs(UnmanagedType.I1)] public bool ShiftSpritesLeft;
|
|
[MarshalAs(UnmanagedType.I1)] public bool EnableScanlineIrq;
|
|
[MarshalAs(UnmanagedType.I1)] public bool MaskFirstColumn;
|
|
[MarshalAs(UnmanagedType.I1)] public bool HorizontalScrollLock;
|
|
[MarshalAs(UnmanagedType.I1)] public bool VerticalScrollLock;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool Sg16KVramMode;
|
|
[MarshalAs(UnmanagedType.I1)] public bool RenderingEnabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool EnableVerticalBlankIrq;
|
|
[MarshalAs(UnmanagedType.I1)] public bool M1_Use224LineMode;
|
|
[MarshalAs(UnmanagedType.I1)] public bool M3_Use240LineMode;
|
|
[MarshalAs(UnmanagedType.I1)] public bool UseLargeSprites;
|
|
[MarshalAs(UnmanagedType.I1)] public bool EnableDoubleSpriteSize;
|
|
|
|
public UInt16 NametableAddress;
|
|
public UInt16 EffectiveNametableAddress;
|
|
public UInt16 NametableAddressMask;
|
|
public UInt16 EffectiveNametableAddressMask;
|
|
}
|
|
|
|
public struct SmsToneChannelState
|
|
{
|
|
public UInt16 ReloadValue;
|
|
public UInt16 Timer;
|
|
public byte Output;
|
|
public byte Volume;
|
|
}
|
|
|
|
public struct SmsNoiseChannelState
|
|
{
|
|
public UInt16 Timer;
|
|
public UInt16 Lfsr;
|
|
public byte LfsrInputBit;
|
|
public byte Control;
|
|
public byte Output;
|
|
public byte Volume;
|
|
}
|
|
|
|
public struct SmsPsgState
|
|
{
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
|
public SmsToneChannelState[] Tone;
|
|
public SmsNoiseChannelState Noise;
|
|
public byte SelectedReg;
|
|
public byte GameGearPanningReg;
|
|
}
|
|
|
|
public enum SmsRegisterAccess
|
|
{
|
|
None = 0,
|
|
Read = 1,
|
|
Write = 2,
|
|
ReadWrite = 3
|
|
}
|
|
|
|
public struct SmsMemoryManagerState
|
|
{
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x100)]
|
|
public byte[] IsReadRegister;
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x100)]
|
|
public byte[] IsWriteRegister;
|
|
|
|
public byte OpenBus;
|
|
public byte GgExtData;
|
|
public byte GgExtConfig;
|
|
public byte GgSendData;
|
|
public byte GgSerialConfig;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool ExpEnabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool CartridgeEnabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool CardEnabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool WorkRamEnabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool BiosEnabled;
|
|
[MarshalAs(UnmanagedType.I1)] public bool IoEnabled;
|
|
}
|
|
|
|
public struct SmsControlManagerState
|
|
{
|
|
public byte ControlPort;
|
|
}
|
|
|
|
public struct SmsState : BaseState
|
|
{
|
|
public SmsCpuState Cpu;
|
|
public SmsVdpState Vdp;
|
|
public SmsPsgState Psg;
|
|
public SmsMemoryManagerState MemoryManager;
|
|
public SmsControlManagerState ControlManager;
|
|
}
|