/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
#pragma once
inline constexpr uint16_t Carry = 1;
inline constexpr uint16_t Zero = 2;
inline constexpr uint16_t IRQ = 4;
inline constexpr uint16_t Decimal = 8;
inline constexpr uint16_t IndexFlag = 16;
inline constexpr uint16_t MemoryFlag = 32;
inline constexpr uint16_t Overflow = 64;
inline constexpr uint16_t Negative = 128;
inline constexpr uint16_t Emulation = 256;
union pair
{
#ifdef LSB_FIRST
struct { uint8_t l, h; } B;
#else
struct { uint8_t h, l; } B;
#endif
uint16_t W;
};
union PC_t
{
#ifdef LSB_FIRST
struct { uint8_t xPCl, xPCh, xPB, z; } B;
struct { uint16_t xPC, d; } W;
#else
struct { uint8_t z, xPB, xPCh, xPCl; } B;
struct { uint16_t d, xPC; } W;
#endif
uint32_t xPBPC;
};
struct SRegisters
{
uint8_t DB;
pair P;
pair A;
pair D;
pair S;
pair X;
pair Y;
PC_t PC;
};
extern SRegisters Registers;
inline void SetCarry() { ICPU._Carry = 1; }
inline void ClearCarry() { ICPU._Carry = 0; }
inline void SetIRQ() { Registers.P.B.l |= IRQ; }
inline void ClearIRQ() { Registers.P.B.l &= ~IRQ; }
inline void SetDecimal() { Registers.P.B.l |= Decimal; }
inline void ClearDecimal() { Registers.P.B.l &= ~Decimal; }
inline void SetOverflow() { ICPU._Overflow = 1; }
inline void ClearOverflow() { ICPU._Overflow = 0; }
inline bool CheckCarry() { return !!ICPU._Carry; }
inline bool CheckZero() { return !ICPU._Zero; }
inline bool CheckDecimal() { return !!(Registers.P.B.l & Decimal); }
inline bool CheckIndex() { return !!(Registers.P.B.l & IndexFlag); }
inline bool CheckMemory() { return !!(Registers.P.B.l & MemoryFlag); }
inline bool CheckOverflow() { return !!(ICPU._Overflow); }
inline bool CheckNegative() { return !!(ICPU._Negative & 0x80); }
inline bool CheckEmulation() { return !!(Registers.P.W & Emulation); }
inline void SetFlags(uint16_t f) { Registers.P.W |= f; }
inline void ClearFlags(uint16_t f) { Registers.P.W &= ~f; }
inline bool CheckFlag(uint16_t f) { return !!(Registers.P.W & f); }