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 | |
15 | struct SOpcodes |
16 | { |
17 | void (*S9xOpcode) (void); |
18 | }; |
19 | |
20 | struct 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 | |
34 | extern struct SICPU ICPU; |
35 | |
36 | extern struct SOpcodes S9xOpcodesE1[256]; |
37 | extern struct SOpcodes S9xOpcodesM1X1[256]; |
38 | extern struct SOpcodes S9xOpcodesM1X0[256]; |
39 | extern struct SOpcodes S9xOpcodesM0X1[256]; |
40 | extern struct SOpcodes S9xOpcodesM0X0[256]; |
41 | extern struct SOpcodes S9xOpcodesSlow[256]; |
42 | extern uint8 S9xOpLengthsM1X1[256]; |
43 | extern uint8 S9xOpLengthsM1X0[256]; |
44 | extern uint8 S9xOpLengthsM0X1[256]; |
45 | extern uint8 S9xOpLengthsM0X0[256]; |
46 | |
47 | void S9xMainLoop (void); |
48 | void S9xReset (void); |
49 | void S9xSoftReset (void); |
50 | void S9xDoHEventProcessing (void); |
51 | |
52 | static 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 | |
60 | static 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 | |
66 | static 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 |