/*****************************************************************************\ 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 #include "ppu.h" struct SOpcodes { void (*S9xOpcode)(); }; struct SICPU { SOpcodes *S9xOpcodes; uint8_t *S9xOpLengths; uint8_t _Carry; uint8_t _Zero; uint8_t _Negative; uint8_t _Overflow; uint32_t ShiftedPB; uint32_t ShiftedDB; }; extern SICPU ICPU; extern SOpcodes S9xOpcodesE1[256]; extern SOpcodes S9xOpcodesM1X1[256]; extern SOpcodes S9xOpcodesM1X0[256]; extern SOpcodes S9xOpcodesM0X1[256]; extern SOpcodes S9xOpcodesM0X0[256]; extern SOpcodes S9xOpcodesSlow[256]; extern uint8_t S9xOpLengthsM1X1[256]; extern uint8_t S9xOpLengthsM1X0[256]; extern uint8_t S9xOpLengthsM0X1[256]; extern uint8_t S9xOpLengthsM0X0[256]; void S9xMainLoop(); void S9xReset(); void S9xDoHEventProcessing(); #include "65c816.h" inline void S9xUnpackStatus() { ICPU._Zero = !(Registers.P.B.l & Zero); ICPU._Negative = Registers.P.B.l & Negative; ICPU._Carry = Registers.P.B.l & Carry; ICPU._Overflow = (Registers.P.B.l & Overflow) >> 6; } inline void S9xPackStatus() { Registers.P.B.l &= ~(Zero | Negative | Carry | Overflow); Registers.P.B.l |= ICPU._Carry | ((!ICPU._Zero) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6); } inline void S9xFixCycles() { if (CheckEmulation()) { ICPU.S9xOpcodes = S9xOpcodesE1; ICPU.S9xOpLengths = S9xOpLengthsM1X1; } else if (CheckMemory()) { if (CheckIndex()) { ICPU.S9xOpcodes = S9xOpcodesM1X1; ICPU.S9xOpLengths = S9xOpLengthsM1X1; } else { ICPU.S9xOpcodes = S9xOpcodesM1X0; ICPU.S9xOpLengths = S9xOpLengthsM1X0; } } else { if (CheckIndex()) { ICPU.S9xOpcodes = S9xOpcodesM0X1; ICPU.S9xOpLengths = S9xOpLengthsM0X1; } else { ICPU.S9xOpcodes = S9xOpcodesM0X0; ICPU.S9xOpLengths = S9xOpLengthsM0X0; } } }