Browse code

Update snes9x code from 1.53 to 1.6.0.

Notable differences from upstream:
* Did not use the same #include setup for the new byuu apu and instead chose to do things more traditionally, as the latter is also much easier to deal with in Visual Studio than just including .cpp files into other .cpp files...
* MSU1 support not included (I see no need for this in a plugin meant to be used for original SNES music).
* The dynamic rate control on the APU not included (I also see no need for it in this plugin).
* The extra resamplers I added in were removed as the original hermite resampler was folded into a single non-inhertiable resampler.
* Bits of cleanup.

Naram Qashat authored on 2021/04/19 21:20:36
Showing 1 changed files
... ...
@@ -1,179 +1,8 @@
1
-/***********************************************************************************
1
+/*****************************************************************************\
2 2
   Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3
-
4
-  (c) Copyright 1996 - 2002  Gary Henderson (gary.henderson@ntlworld.com),
5
-                             Jerremy Koot (jkoot@snes9x.com)
6
-
7
-  (c) Copyright 2002 - 2004  Matthew Kendora
8
-
9
-  (c) Copyright 2002 - 2005  Peter Bortas (peter@bortas.org)
10
-
11
-  (c) Copyright 2004 - 2005  Joel Yliluoma (http://iki.fi/bisqwit/)
12
-
13
-  (c) Copyright 2001 - 2006  John Weidman (jweidman@slip.net)
14
-
15
-  (c) Copyright 2002 - 2006  funkyass (funkyass@spam.shaw.ca),
16
-                             Kris Bleakley (codeviolation@hotmail.com)
17
-
18
-  (c) Copyright 2002 - 2010  Brad Jorsch (anomie@users.sourceforge.net),
19
-                             Nach (n-a-c-h@users.sourceforge.net),
20
-
21
-  (c) Copyright 2002 - 2011  zones (kasumitokoduck@yahoo.com)
22
-
23
-  (c) Copyright 2006 - 2007  nitsuja
24
-
25
-  (c) Copyright 2009 - 2011  BearOso,
26
-                             OV2
27
-
28
-
29
-  BS-X C emulator code
30
-  (c) Copyright 2005 - 2006  Dreamer Nom,
31
-                             zones
32
-
33
-  C4 x86 assembler and some C emulation code
34
-  (c) Copyright 2000 - 2003  _Demo_ (_demo_@zsnes.com),
35
-                             Nach,
36
-                             zsKnight (zsknight@zsnes.com)
37
-
38
-  C4 C++ code
39
-  (c) Copyright 2003 - 2006  Brad Jorsch,
40
-                             Nach
41
-
42
-  DSP-1 emulator code
43
-  (c) Copyright 1998 - 2006  _Demo_,
44
-                             Andreas Naive (andreasnaive@gmail.com),
45
-                             Gary Henderson,
46
-                             Ivar (ivar@snes9x.com),
47
-                             John Weidman,
48
-                             Kris Bleakley,
49
-                             Matthew Kendora,
50
-                             Nach,
51
-                             neviksti (neviksti@hotmail.com)
52
-
53
-  DSP-2 emulator code
54
-  (c) Copyright 2003         John Weidman,
55
-                             Kris Bleakley,
56
-                             Lord Nightmare (lord_nightmare@users.sourceforge.net),
57
-                             Matthew Kendora,
58
-                             neviksti
59
-
60
-  DSP-3 emulator code
61
-  (c) Copyright 2003 - 2006  John Weidman,
62
-                             Kris Bleakley,
63
-                             Lancer,
64
-                             z80 gaiden
65
-
66
-  DSP-4 emulator code
67
-  (c) Copyright 2004 - 2006  Dreamer Nom,
68
-                             John Weidman,
69
-                             Kris Bleakley,
70
-                             Nach,
71
-                             z80 gaiden
72
-
73
-  OBC1 emulator code
74
-  (c) Copyright 2001 - 2004  zsKnight,
75
-                             pagefault (pagefault@zsnes.com),
76
-                             Kris Bleakley
77
-                             Ported from x86 assembler to C by sanmaiwashi
78
-
79
-  SPC7110 and RTC C++ emulator code used in 1.39-1.51
80
-  (c) Copyright 2002         Matthew Kendora with research by
81
-                             zsKnight,
82
-                             John Weidman,
83
-                             Dark Force
84
-
85
-  SPC7110 and RTC C++ emulator code used in 1.52+
86
-  (c) Copyright 2009         byuu,
87
-                             neviksti
88
-
89
-  S-DD1 C emulator code
90
-  (c) Copyright 2003         Brad Jorsch with research by
91
-                             Andreas Naive,
92
-                             John Weidman
93
-
94
-  S-RTC C emulator code
95
-  (c) Copyright 2001 - 2006  byuu,
96
-                             John Weidman
97
-
98
-  ST010 C++ emulator code
99
-  (c) Copyright 2003         Feather,
100
-                             John Weidman,
101
-                             Kris Bleakley,
102
-                             Matthew Kendora
103
-
104
-  Super FX x86 assembler emulator code
105
-  (c) Copyright 1998 - 2003  _Demo_,
106
-                             pagefault,
107
-                             zsKnight
108
-
109
-  Super FX C emulator code
110
-  (c) Copyright 1997 - 1999  Ivar,
111
-                             Gary Henderson,
112
-                             John Weidman
113
-
114
-  Sound emulator code used in 1.5-1.51
115
-  (c) Copyright 1998 - 2003  Brad Martin
116
-  (c) Copyright 1998 - 2006  Charles Bilyue'
117
-
118
-  Sound emulator code used in 1.52+
119
-  (c) Copyright 2004 - 2007  Shay Green (gblargg@gmail.com)
120
-
121
-  SH assembler code partly based on x86 assembler code
122
-  (c) Copyright 2002 - 2004  Marcus Comstedt (marcus@mc.pp.se)
123
-
124
-  2xSaI filter
125
-  (c) Copyright 1999 - 2001  Derek Liauw Kie Fa
126
-
127
-  HQ2x, HQ3x, HQ4x filters
128
-  (c) Copyright 2003         Maxim Stepin (maxim@hiend3d.com)
129
-
130
-  NTSC filter
131
-  (c) Copyright 2006 - 2007  Shay Green
132
-
133
-  GTK+ GUI code
134
-  (c) Copyright 2004 - 2011  BearOso
135
-
136
-  Win32 GUI code
137
-  (c) Copyright 2003 - 2006  blip,
138
-                             funkyass,
139
-                             Matthew Kendora,
140
-                             Nach,
141
-                             nitsuja
142
-  (c) Copyright 2009 - 2011  OV2
143
-
144
-  Mac OS GUI code
145
-  (c) Copyright 1998 - 2001  John Stiles
146
-  (c) Copyright 2001 - 2011  zones
147
-
148
-
149
-  Specific ports contains the works of other authors. See headers in
150
-  individual files.
151
-
152
-
153
-  Snes9x homepage: http://www.snes9x.com/
154
-
155
-  Permission to use, copy, modify and/or distribute Snes9x in both binary
156
-  and source form, for non-commercial purposes, is hereby granted without
157
-  fee, providing that this license information and copyright notice appear
158
-  with all copies and any derived work.
159
-
160
-  This software is provided 'as-is', without any express or implied
161
-  warranty. In no event shall the authors be held liable for any damages
162
-  arising from the use of this software or it's derivatives.
163
-
164
-  Snes9x is freeware for PERSONAL USE only. Commercial users should
165
-  seek permission of the copyright holders first. Commercial use includes,
166
-  but is not limited to, charging money for Snes9x or software derived from
167
-  Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
168
-  using Snes9x as a promotion for your commercial product.
169
-
170
-  The copyright holders request that bug fixes and improvements to the code
171
-  should be forwarded to them so everyone can benefit from the modifications
172
-  in future versions.
173
-
174
-  Super NES and Super Nintendo Entertainment System are trademarks of
175
-  Nintendo Co., Limited and its subsidiary companies.
176
- ***********************************************************************************/
3
+                This file is licensed under the Snes9x License.
4
+   For further information, consult the LICENSE file in the root directory.
5
+\*****************************************************************************/
177 6
 
178 7
 #pragma once
179 8
 
... ...
@@ -263,36 +92,3 @@ inline void S9xFixCycles()
263 92
 		}
264 93
 	}
265 94
 }
266
-
267
-inline void S9xCheckInterrupts()
268
-{
269
-	bool thisIRQ = PPU.HTimerEnabled || PPU.VTimerEnabled;
270
-
271
-	if (CPU.IRQLine && thisIRQ)
272
-		CPU.IRQTransition = true;
273
-
274
-	if (PPU.HTimerEnabled)
275
-	{
276
-		int32_t htimepos = PPU.HTimerPosition;
277
-		if (CPU.Cycles >= Timings.H_Max)
278
-			htimepos += Timings.H_Max;
279
-
280
-		if (CPU.PrevCycles >= htimepos || CPU.Cycles < htimepos)
281
-			thisIRQ = false;
282
-	}
283
-
284
-	if (PPU.VTimerEnabled)
285
-	{
286
-		int32_t vcounter = CPU.V_Counter;
287
-		if (CPU.Cycles >= Timings.H_Max)
288
-			++vcounter;
289
-
290
-		if (vcounter != PPU.VTimerPosition)
291
-			thisIRQ = false;
292
-	}
293
-
294
-	if (!CPU.IRQLastState && thisIRQ)
295
-		CPU.IRQLine = true;
296
-
297
-	CPU.IRQLastState = thisIRQ;
298
-}
Browse code

Use #pragma once instead of include guards.

Naram Qashat authored on 2014/09/08 14:47:36
Showing 1 changed files
... ...
@@ -175,8 +175,7 @@
175 175
   Nintendo Co., Limited and its subsidiary companies.
176 176
  ***********************************************************************************/
177 177
 
178
-#ifndef _CPUEXEC_H_
179
-#define _CPUEXEC_H_
178
+#pragma once
180 179
 
181 180
 #include "ppu.h"
182 181
 
... ...
@@ -297,5 +296,3 @@ inline void S9xCheckInterrupts()
297 296
 
298 297
 	CPU.IRQLastState = thisIRQ;
299 298
 }
300
-
301
-#endif
Browse code

[SNSF] Massive code cleanup, as well as removing as much unused code/variables as possible.

Naram Qashat authored on 2013/05/23 06:02:16
Showing 1 changed files
... ...
@@ -175,14 +175,10 @@
175 175
   Nintendo Co., Limited and its subsidiary companies.
176 176
  ***********************************************************************************/
177 177
 
178
-
179 178
 #ifndef _CPUEXEC_H_
180 179
 #define _CPUEXEC_H_
181 180
 
182 181
 #include "ppu.h"
183
-#ifdef DEBUGGER
184
-#include "debug.h"
185
-#endif
186 182
 
187 183
 struct SOpcodes
188 184
 {
... ...
@@ -191,59 +187,57 @@ struct SOpcodes
191 187
 
192 188
 struct SICPU
193 189
 {
194
-	struct SOpcodes	*S9xOpcodes;
195
-	uint8_t	*S9xOpLengths;
196
-	uint8_t	_Carry;
197
-	uint8_t	_Zero;
198
-	uint8_t	_Negative;
199
-	uint8_t	_Overflow;
200
-	uint32_t	ShiftedPB;
201
-	uint32_t	ShiftedDB;
202
-	uint32_t	Frame;
203
-	uint32_t	FrameAdvanceCount;
190
+	SOpcodes *S9xOpcodes;
191
+	uint8_t *S9xOpLengths;
192
+	uint8_t _Carry;
193
+	uint8_t _Zero;
194
+	uint8_t _Negative;
195
+	uint8_t _Overflow;
196
+	uint32_t ShiftedPB;
197
+	uint32_t ShiftedDB;
204 198
 };
205 199
 
206
-extern struct SICPU		ICPU;
200
+extern SICPU ICPU;
207 201
 
208
-extern struct SOpcodes	S9xOpcodesE1[256];
209
-extern struct SOpcodes	S9xOpcodesM1X1[256];
210
-extern struct SOpcodes	S9xOpcodesM1X0[256];
211
-extern struct SOpcodes	S9xOpcodesM0X1[256];
212
-extern struct SOpcodes	S9xOpcodesM0X0[256];
213
-extern struct SOpcodes	S9xOpcodesSlow[256];
214
-extern uint8_t			S9xOpLengthsM1X1[256];
215
-extern uint8_t			S9xOpLengthsM1X0[256];
216
-extern uint8_t			S9xOpLengthsM0X1[256];
217
-extern uint8_t			S9xOpLengthsM0X0[256];
202
+extern SOpcodes S9xOpcodesE1[256];
203
+extern SOpcodes S9xOpcodesM1X1[256];
204
+extern SOpcodes S9xOpcodesM1X0[256];
205
+extern SOpcodes S9xOpcodesM0X1[256];
206
+extern SOpcodes S9xOpcodesM0X0[256];
207
+extern SOpcodes S9xOpcodesSlow[256];
208
+extern uint8_t S9xOpLengthsM1X1[256];
209
+extern uint8_t S9xOpLengthsM1X0[256];
210
+extern uint8_t S9xOpLengthsM0X1[256];
211
+extern uint8_t S9xOpLengthsM0X0[256];
218 212
 
219 213
 void S9xMainLoop();
220 214
 void S9xReset();
221
-void S9xSoftReset();
222 215
 void S9xDoHEventProcessing();
223 216
 
224
-static inline void S9xUnpackStatus()
217
+#include "65c816.h"
218
+
219
+inline void S9xUnpackStatus()
225 220
 {
226
-	ICPU._Zero = (Registers.PL & Zero) == 0;
227
-	ICPU._Negative = (Registers.PL & Negative);
228
-	ICPU._Carry = (Registers.PL & Carry);
229
-	ICPU._Overflow = (Registers.PL & Overflow) >> 6;
221
+	ICPU._Zero = !(Registers.P.B.l & Zero);
222
+	ICPU._Negative = Registers.P.B.l & Negative;
223
+	ICPU._Carry = Registers.P.B.l & Carry;
224
+	ICPU._Overflow = (Registers.P.B.l & Overflow) >> 6;
230 225
 }
231 226
 
232
-static inline void S9xPackStatus()
227
+inline void S9xPackStatus()
233 228
 {
234
-	Registers.PL &= ~(Zero | Negative | Carry | Overflow);
235
-	Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6);
229
+	Registers.P.B.l &= ~(Zero | Negative | Carry | Overflow);
230
+	Registers.P.B.l |= ICPU._Carry | ((!ICPU._Zero) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6);
236 231
 }
237 232
 
238
-static inline void S9xFixCycles()
233
+inline void S9xFixCycles()
239 234
 {
240 235
 	if (CheckEmulation())
241 236
 	{
242 237
 		ICPU.S9xOpcodes = S9xOpcodesE1;
243 238
 		ICPU.S9xOpLengths = S9xOpLengthsM1X1;
244 239
 	}
245
-	else
246
-	if (CheckMemory())
240
+	else if (CheckMemory())
247 241
 	{
248 242
 		if (CheckIndex())
249 243
 		{
... ...
@@ -271,16 +265,16 @@ static inline void S9xFixCycles()
271 265
 	}
272 266
 }
273 267
 
274
-static inline void S9xCheckInterrupts()
268
+inline void S9xCheckInterrupts()
275 269
 {
276
-	bool	thisIRQ = PPU.HTimerEnabled || PPU.VTimerEnabled;
270
+	bool thisIRQ = PPU.HTimerEnabled || PPU.VTimerEnabled;
277 271
 
278 272
 	if (CPU.IRQLine && thisIRQ)
279 273
 		CPU.IRQTransition = true;
280 274
 
281 275
 	if (PPU.HTimerEnabled)
282 276
 	{
283
-		int32_t	htimepos = PPU.HTimerPosition;
277
+		int32_t htimepos = PPU.HTimerPosition;
284 278
 		if (CPU.Cycles >= Timings.H_Max)
285 279
 			htimepos += Timings.H_Max;
286 280
 
... ...
@@ -290,22 +284,16 @@ static inline void S9xCheckInterrupts()
290 284
 
291 285
 	if (PPU.VTimerEnabled)
292 286
 	{
293
-		int32_t	vcounter = CPU.V_Counter;
287
+		int32_t vcounter = CPU.V_Counter;
294 288
 		if (CPU.Cycles >= Timings.H_Max)
295
-			vcounter++;
289
+			++vcounter;
296 290
 
297 291
 		if (vcounter != PPU.VTimerPosition)
298 292
 			thisIRQ = false;
299 293
 	}
300 294
 
301 295
 	if (!CPU.IRQLastState && thisIRQ)
302
-	{
303
-#ifdef DEBUGGER
304
-		S9xTraceFormattedMessage("--- /IRQ High->Low  prev HC:%04d  curr HC:%04d  HTimer:%d Pos:%04d  VTimer:%d Pos:%03d",
305
-			CPU.PrevCycles, CPU.Cycles, PPU.HTimerEnabled, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.VTimerPosition);
306
-#endif
307 296
 		CPU.IRQLine = true;
308
-	}
309 297
 
310 298
 	CPU.IRQLastState = thisIRQ;
311 299
 }
Browse code

Import actual code.

Naram Qashat authored on 2013/03/26 02:41:19
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,313 @@
1
+/***********************************************************************************
2
+  Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3
+
4
+  (c) Copyright 1996 - 2002  Gary Henderson (gary.henderson@ntlworld.com),
5
+                             Jerremy Koot (jkoot@snes9x.com)
6
+
7
+  (c) Copyright 2002 - 2004  Matthew Kendora
8
+
9
+  (c) Copyright 2002 - 2005  Peter Bortas (peter@bortas.org)
10
+
11
+  (c) Copyright 2004 - 2005  Joel Yliluoma (http://iki.fi/bisqwit/)
12
+
13
+  (c) Copyright 2001 - 2006  John Weidman (jweidman@slip.net)
14
+
15
+  (c) Copyright 2002 - 2006  funkyass (funkyass@spam.shaw.ca),
16
+                             Kris Bleakley (codeviolation@hotmail.com)
17
+
18
+  (c) Copyright 2002 - 2010  Brad Jorsch (anomie@users.sourceforge.net),
19
+                             Nach (n-a-c-h@users.sourceforge.net),
20
+
21
+  (c) Copyright 2002 - 2011  zones (kasumitokoduck@yahoo.com)
22
+
23
+  (c) Copyright 2006 - 2007  nitsuja
24
+
25
+  (c) Copyright 2009 - 2011  BearOso,
26
+                             OV2
27
+
28
+
29
+  BS-X C emulator code
30
+  (c) Copyright 2005 - 2006  Dreamer Nom,
31
+                             zones
32
+
33
+  C4 x86 assembler and some C emulation code
34
+  (c) Copyright 2000 - 2003  _Demo_ (_demo_@zsnes.com),
35
+                             Nach,
36
+                             zsKnight (zsknight@zsnes.com)
37
+
38
+  C4 C++ code
39
+  (c) Copyright 2003 - 2006  Brad Jorsch,
40
+                             Nach
41
+
42
+  DSP-1 emulator code
43
+  (c) Copyright 1998 - 2006  _Demo_,
44
+                             Andreas Naive (andreasnaive@gmail.com),
45
+                             Gary Henderson,
46
+                             Ivar (ivar@snes9x.com),
47
+                             John Weidman,
48
+                             Kris Bleakley,
49
+                             Matthew Kendora,
50
+                             Nach,
51
+                             neviksti (neviksti@hotmail.com)
52
+
53
+  DSP-2 emulator code
54
+  (c) Copyright 2003         John Weidman,
55
+                             Kris Bleakley,
56
+                             Lord Nightmare (lord_nightmare@users.sourceforge.net),
57
+                             Matthew Kendora,
58
+                             neviksti
59
+
60
+  DSP-3 emulator code
61
+  (c) Copyright 2003 - 2006  John Weidman,
62
+                             Kris Bleakley,
63
+                             Lancer,
64
+                             z80 gaiden
65
+
66
+  DSP-4 emulator code
67
+  (c) Copyright 2004 - 2006  Dreamer Nom,
68
+                             John Weidman,
69
+                             Kris Bleakley,
70
+                             Nach,
71
+                             z80 gaiden
72
+
73
+  OBC1 emulator code
74
+  (c) Copyright 2001 - 2004  zsKnight,
75
+                             pagefault (pagefault@zsnes.com),
76
+                             Kris Bleakley
77
+                             Ported from x86 assembler to C by sanmaiwashi
78
+
79
+  SPC7110 and RTC C++ emulator code used in 1.39-1.51
80
+  (c) Copyright 2002         Matthew Kendora with research by
81
+                             zsKnight,
82
+                             John Weidman,
83
+                             Dark Force
84
+
85
+  SPC7110 and RTC C++ emulator code used in 1.52+
86
+  (c) Copyright 2009         byuu,
87
+                             neviksti
88
+
89
+  S-DD1 C emulator code
90
+  (c) Copyright 2003         Brad Jorsch with research by
91
+                             Andreas Naive,
92
+                             John Weidman
93
+
94
+  S-RTC C emulator code
95
+  (c) Copyright 2001 - 2006  byuu,
96
+                             John Weidman
97
+
98
+  ST010 C++ emulator code
99
+  (c) Copyright 2003         Feather,
100
+                             John Weidman,
101
+                             Kris Bleakley,
102
+                             Matthew Kendora
103
+
104
+  Super FX x86 assembler emulator code
105
+  (c) Copyright 1998 - 2003  _Demo_,
106
+                             pagefault,
107
+                             zsKnight
108
+
109
+  Super FX C emulator code
110
+  (c) Copyright 1997 - 1999  Ivar,
111
+                             Gary Henderson,
112
+                             John Weidman
113
+
114
+  Sound emulator code used in 1.5-1.51
115
+  (c) Copyright 1998 - 2003  Brad Martin
116
+  (c) Copyright 1998 - 2006  Charles Bilyue'
117
+
118
+  Sound emulator code used in 1.52+
119
+  (c) Copyright 2004 - 2007  Shay Green (gblargg@gmail.com)
120
+
121
+  SH assembler code partly based on x86 assembler code
122
+  (c) Copyright 2002 - 2004  Marcus Comstedt (marcus@mc.pp.se)
123
+
124
+  2xSaI filter
125
+  (c) Copyright 1999 - 2001  Derek Liauw Kie Fa
126
+
127
+  HQ2x, HQ3x, HQ4x filters
128
+  (c) Copyright 2003         Maxim Stepin (maxim@hiend3d.com)
129
+
130
+  NTSC filter
131
+  (c) Copyright 2006 - 2007  Shay Green
132
+
133
+  GTK+ GUI code
134
+  (c) Copyright 2004 - 2011  BearOso
135
+
136
+  Win32 GUI code
137
+  (c) Copyright 2003 - 2006  blip,
138
+                             funkyass,
139
+                             Matthew Kendora,
140
+                             Nach,
141
+                             nitsuja
142
+  (c) Copyright 2009 - 2011  OV2
143
+
144
+  Mac OS GUI code
145
+  (c) Copyright 1998 - 2001  John Stiles
146
+  (c) Copyright 2001 - 2011  zones
147
+
148
+
149
+  Specific ports contains the works of other authors. See headers in
150
+  individual files.
151
+
152
+
153
+  Snes9x homepage: http://www.snes9x.com/
154
+
155
+  Permission to use, copy, modify and/or distribute Snes9x in both binary
156
+  and source form, for non-commercial purposes, is hereby granted without
157
+  fee, providing that this license information and copyright notice appear
158
+  with all copies and any derived work.
159
+
160
+  This software is provided 'as-is', without any express or implied
161
+  warranty. In no event shall the authors be held liable for any damages
162
+  arising from the use of this software or it's derivatives.
163
+
164
+  Snes9x is freeware for PERSONAL USE only. Commercial users should
165
+  seek permission of the copyright holders first. Commercial use includes,
166
+  but is not limited to, charging money for Snes9x or software derived from
167
+  Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
168
+  using Snes9x as a promotion for your commercial product.
169
+
170
+  The copyright holders request that bug fixes and improvements to the code
171
+  should be forwarded to them so everyone can benefit from the modifications
172
+  in future versions.
173
+
174
+  Super NES and Super Nintendo Entertainment System are trademarks of
175
+  Nintendo Co., Limited and its subsidiary companies.
176
+ ***********************************************************************************/
177
+
178
+
179
+#ifndef _CPUEXEC_H_
180
+#define _CPUEXEC_H_
181
+
182
+#include "ppu.h"
183
+#ifdef DEBUGGER
184
+#include "debug.h"
185
+#endif
186
+
187
+struct SOpcodes
188
+{
189
+	void (*S9xOpcode)();
190
+};
191
+
192
+struct SICPU
193
+{
194
+	struct SOpcodes	*S9xOpcodes;
195
+	uint8_t	*S9xOpLengths;
196
+	uint8_t	_Carry;
197
+	uint8_t	_Zero;
198
+	uint8_t	_Negative;
199
+	uint8_t	_Overflow;
200
+	uint32_t	ShiftedPB;
201
+	uint32_t	ShiftedDB;
202
+	uint32_t	Frame;
203
+	uint32_t	FrameAdvanceCount;
204
+};
205
+
206
+extern struct SICPU		ICPU;
207
+
208
+extern struct SOpcodes	S9xOpcodesE1[256];
209
+extern struct SOpcodes	S9xOpcodesM1X1[256];
210
+extern struct SOpcodes	S9xOpcodesM1X0[256];
211
+extern struct SOpcodes	S9xOpcodesM0X1[256];
212
+extern struct SOpcodes	S9xOpcodesM0X0[256];
213
+extern struct SOpcodes	S9xOpcodesSlow[256];
214
+extern uint8_t			S9xOpLengthsM1X1[256];
215
+extern uint8_t			S9xOpLengthsM1X0[256];
216
+extern uint8_t			S9xOpLengthsM0X1[256];
217
+extern uint8_t			S9xOpLengthsM0X0[256];
218
+
219
+void S9xMainLoop();
220
+void S9xReset();
221
+void S9xSoftReset();
222
+void S9xDoHEventProcessing();
223
+
224
+static inline void S9xUnpackStatus()
225
+{
226
+	ICPU._Zero = (Registers.PL & Zero) == 0;
227
+	ICPU._Negative = (Registers.PL & Negative);
228
+	ICPU._Carry = (Registers.PL & Carry);
229
+	ICPU._Overflow = (Registers.PL & Overflow) >> 6;
230
+}
231
+
232
+static inline void S9xPackStatus()
233
+{
234
+	Registers.PL &= ~(Zero | Negative | Carry | Overflow);
235
+	Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6);
236
+}
237
+
238
+static inline void S9xFixCycles()
239
+{
240
+	if (CheckEmulation())
241
+	{
242
+		ICPU.S9xOpcodes = S9xOpcodesE1;
243
+		ICPU.S9xOpLengths = S9xOpLengthsM1X1;
244
+	}
245
+	else
246
+	if (CheckMemory())
247
+	{
248
+		if (CheckIndex())
249
+		{
250
+			ICPU.S9xOpcodes = S9xOpcodesM1X1;
251
+			ICPU.S9xOpLengths = S9xOpLengthsM1X1;
252
+		}
253
+		else
254
+		{
255
+			ICPU.S9xOpcodes = S9xOpcodesM1X0;
256
+			ICPU.S9xOpLengths = S9xOpLengthsM1X0;
257
+		}
258
+	}
259
+	else
260
+	{
261
+		if (CheckIndex())
262
+		{
263
+			ICPU.S9xOpcodes = S9xOpcodesM0X1;
264
+			ICPU.S9xOpLengths = S9xOpLengthsM0X1;
265
+		}
266
+		else
267
+		{
268
+			ICPU.S9xOpcodes = S9xOpcodesM0X0;
269
+			ICPU.S9xOpLengths = S9xOpLengthsM0X0;
270
+		}
271
+	}
272
+}
273
+
274
+static inline void S9xCheckInterrupts()
275
+{
276
+	bool	thisIRQ = PPU.HTimerEnabled || PPU.VTimerEnabled;
277
+
278
+	if (CPU.IRQLine && thisIRQ)
279
+		CPU.IRQTransition = true;
280
+
281
+	if (PPU.HTimerEnabled)
282
+	{
283
+		int32_t	htimepos = PPU.HTimerPosition;
284
+		if (CPU.Cycles >= Timings.H_Max)
285
+			htimepos += Timings.H_Max;
286
+
287
+		if (CPU.PrevCycles >= htimepos || CPU.Cycles < htimepos)
288
+			thisIRQ = false;
289
+	}
290
+
291
+	if (PPU.VTimerEnabled)
292
+	{
293
+		int32_t	vcounter = CPU.V_Counter;
294
+		if (CPU.Cycles >= Timings.H_Max)
295
+			vcounter++;
296
+
297
+		if (vcounter != PPU.VTimerPosition)
298
+			thisIRQ = false;
299
+	}
300
+
301
+	if (!CPU.IRQLastState && thisIRQ)
302
+	{
303
+#ifdef DEBUGGER
304
+		S9xTraceFormattedMessage("--- /IRQ High->Low  prev HC:%04d  curr HC:%04d  HTimer:%d Pos:%04d  VTimer:%d Pos:%03d",
305
+			CPU.PrevCycles, CPU.Cycles, PPU.HTimerEnabled, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.VTimerPosition);
306
+#endif
307
+		CPU.IRQLine = true;
308
+	}
309
+
310
+	CPU.IRQLastState = thisIRQ;
311
+}
312
+
313
+#endif