1/*****************************************************************************\
2 Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3 This file is licensed under the Snes9x License.
4 For further information, consult the LICENSE file in the root directory.
5\*****************************************************************************/
6
7#ifndef _CPUEXEC_H_
8#define _CPUEXEC_H_
9
10#include "ppu.h"
11#ifdef DEBUGGER
12#include "debug.h"
13#endif
14
15struct SOpcodes
16{
17 void (*S9xOpcode) (void);
18};
19
20struct SICPU
21{
22 struct SOpcodes *S9xOpcodes;
23 uint8 *S9xOpLengths;
24 uint8 _Carry;
25 uint8 _Zero;
26 uint8 _Negative;
27 uint8 _Overflow;
28 uint32 ShiftedPB;
29 uint32 ShiftedDB;
30 uint32 Frame;
31 uint32 FrameAdvanceCount;
32};
33
34extern struct SICPU ICPU;
35
36extern struct SOpcodes S9xOpcodesE1[256];
37extern struct SOpcodes S9xOpcodesM1X1[256];
38extern struct SOpcodes S9xOpcodesM1X0[256];
39extern struct SOpcodes S9xOpcodesM0X1[256];
40extern struct SOpcodes S9xOpcodesM0X0[256];
41extern struct SOpcodes S9xOpcodesSlow[256];
42extern uint8 S9xOpLengthsM1X1[256];
43extern uint8 S9xOpLengthsM1X0[256];
44extern uint8 S9xOpLengthsM0X1[256];
45extern uint8 S9xOpLengthsM0X0[256];
46
47void S9xMainLoop (void);
48void S9xReset (void);
49void S9xSoftReset (void);
50void S9xDoHEventProcessing (void);
51
52static inline void S9xUnpackStatus (void)
53{
54 ICPU._Zero = (Registers.PL & Zero) == 0;
55 ICPU._Negative = (Registers.PL & Negative);
56 ICPU._Carry = (Registers.PL & Carry);
57 ICPU._Overflow = (Registers.PL & Overflow) >> 6;
58}
59
60static inline void S9xPackStatus (void)
61{
62 Registers.PL &= ~(Zero | Negative | Carry | Overflow);
63 Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6);
64}
65
66static inline void S9xFixCycles (void)
67{
68 if (CheckEmulation())
69 {
70 ICPU.S9xOpcodes = S9xOpcodesE1;
71 ICPU.S9xOpLengths = S9xOpLengthsM1X1;
72 }
73 else
74 if (CheckMemory())
75 {
76 if (CheckIndex())
77 {
78 ICPU.S9xOpcodes = S9xOpcodesM1X1;
79 ICPU.S9xOpLengths = S9xOpLengthsM1X1;
80 }
81 else
82 {
83 ICPU.S9xOpcodes = S9xOpcodesM1X0;
84 ICPU.S9xOpLengths = S9xOpLengthsM1X0;
85 }
86 }
87 else
88 {
89 if (CheckIndex())
90 {
91 ICPU.S9xOpcodes = S9xOpcodesM0X1;
92 ICPU.S9xOpLengths = S9xOpLengthsM0X1;
93 }
94 else
95 {
96 ICPU.S9xOpcodes = S9xOpcodesM0X0;
97 ICPU.S9xOpLengths = S9xOpLengthsM0X0;
98 }
99 }
100}
101
102#endif
103