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 _SNES9X_H_ |
8 | #define _SNES9X_H_ |
9 | |
10 | #ifndef VERSION |
11 | #define VERSION "1.60" |
12 | #endif |
13 | |
14 | #include "port.h" |
15 | #include "65c816.h" |
16 | #include "messages.h" |
17 | |
18 | #ifdef ZLIB |
19 | #include <zlib.h> |
20 | #define FSTREAM gzFile |
21 | #define READ_FSTREAM(p, l, s) gzread(s, p, l) |
22 | #define WRITE_FSTREAM(p, l, s) gzwrite(s, p, l) |
23 | #define GETS_FSTREAM(p, l, s) gzgets(s, p, l) |
24 | #define GETC_FSTREAM(s) gzgetc(s) |
25 | #define OPEN_FSTREAM(f, m) gzopen(f, m) |
26 | #define REOPEN_FSTREAM(f, m) gzdopen(f, m) |
27 | #define FIND_FSTREAM(f) gztell(f) |
28 | #define REVERT_FSTREAM(s, o, p) gzseek(s, o, p) |
29 | #define CLOSE_FSTREAM(s) gzclose(s) |
30 | #else |
31 | #define FSTREAM FILE * |
32 | #define READ_FSTREAM(p, l, s) fread(p, 1, l, s) |
33 | #define WRITE_FSTREAM(p, l, s) fwrite(p, 1, l, s) |
34 | #define GETS_FSTREAM(p, l, s) fgets(p, l, s) |
35 | #define GETC_FSTREAM(s) fgetc(s) |
36 | #define OPEN_FSTREAM(f, m) fopen(f, m) |
37 | #define REOPEN_FSTREAM(f, m) fdopen(f, m) |
38 | #define FIND_FSTREAM(s) ftell(s) |
39 | #define REVERT_FSTREAM(s, o, p) fseek(s, o, p) |
40 | #define CLOSE_FSTREAM(s) fclose(s) |
41 | #endif |
42 | |
43 | #include "stream.h" |
44 | |
45 | #define STREAM Stream * |
46 | #define READ_STREAM(p, l, s) s->read(p,l) |
47 | #define WRITE_STREAM(p, l, s) s->write(p,l) |
48 | #define GETS_STREAM(p, l, s) s->gets(p,l) |
49 | #define GETC_STREAM(s) s->get_char() |
50 | #define OPEN_STREAM(f, m) openStreamFromFSTREAM(f, m) |
51 | #define REOPEN_STREAM(f, m) reopenStreamFromFd(f, m) |
52 | #define FIND_STREAM(s) s->pos() |
53 | #define REVERT_STREAM(s, o, p) s->revert(p, o) |
54 | #define CLOSE_STREAM(s) s->closeStream() |
55 | |
56 | #define SNES_WIDTH 256 |
57 | #define SNES_HEIGHT 224 |
58 | #define SNES_HEIGHT_EXTENDED 239 |
59 | #define MAX_SNES_WIDTH (SNES_WIDTH * 2) |
60 | #define MAX_SNES_HEIGHT (SNES_HEIGHT_EXTENDED * 2) |
61 | #define IMAGE_WIDTH (Settings.SupportHiRes ? MAX_SNES_WIDTH : SNES_WIDTH) |
62 | #define IMAGE_HEIGHT (Settings.SupportHiRes ? MAX_SNES_HEIGHT : SNES_HEIGHT_EXTENDED) |
63 | |
64 | #define NTSC_MASTER_CLOCK 21477272.727272 // 21477272 + 8/11 exact |
65 | #define PAL_MASTER_CLOCK 21281370.0 |
66 | |
67 | #define SNES_MAX_NTSC_VCOUNTER 262 |
68 | #define SNES_MAX_PAL_VCOUNTER 312 |
69 | #define SNES_HCOUNTER_MAX 341 |
70 | |
71 | #ifndef ALLOW_CPU_OVERCLOCK |
72 | #define ONE_CYCLE 6 |
73 | #define SLOW_ONE_CYCLE 8 |
74 | #define TWO_CYCLES 12 |
75 | #else |
76 | #define ONE_CYCLE (Settings.OneClockCycle) |
77 | #define SLOW_ONE_CYCLE (Settings.OneSlowClockCycle) |
78 | #define TWO_CYCLES (Settings.TwoClockCycles) |
79 | #endif |
80 | #define ONE_DOT_CYCLE 4 |
81 | |
82 | #define SNES_CYCLES_PER_SCANLINE (SNES_HCOUNTER_MAX * ONE_DOT_CYCLE) |
83 | #define SNES_SCANLINE_TIME (SNES_CYCLES_PER_SCANLINE / NTSC_MASTER_CLOCK) |
84 | |
85 | #define SNES_WRAM_REFRESH_HC_v1 530 |
86 | #define SNES_WRAM_REFRESH_HC_v2 538 |
87 | #define SNES_WRAM_REFRESH_CYCLES 40 |
88 | |
89 | #define SNES_HBLANK_START_HC 1096 // H=274 |
90 | #define SNES_HDMA_START_HC 1106 // FIXME: not true |
91 | #define SNES_HBLANK_END_HC 4 // H=1 |
92 | #define SNES_HDMA_INIT_HC 20 // FIXME: not true |
93 | #define SNES_RENDER_START_HC (128 * ONE_DOT_CYCLE) // FIXME: Snes9x renders a line at a time. |
94 | |
95 | #define SNES_TR_MASK (1 << 4) |
96 | #define SNES_TL_MASK (1 << 5) |
97 | #define SNES_X_MASK (1 << 6) |
98 | #define SNES_A_MASK (1 << 7) |
99 | #define SNES_RIGHT_MASK (1 << 8) |
100 | #define SNES_LEFT_MASK (1 << 9) |
101 | #define SNES_DOWN_MASK (1 << 10) |
102 | #define SNES_UP_MASK (1 << 11) |
103 | #define SNES_START_MASK (1 << 12) |
104 | #define SNES_SELECT_MASK (1 << 13) |
105 | #define SNES_Y_MASK (1 << 14) |
106 | #define SNES_B_MASK (1 << 15) |
107 | |
108 | #define DEBUG_MODE_FLAG (1 << 0) // debugger |
109 | #define TRACE_FLAG (1 << 1) // debugger |
110 | #define SINGLE_STEP_FLAG (1 << 2) // debugger |
111 | #define BREAK_FLAG (1 << 3) // debugger |
112 | #define SCAN_KEYS_FLAG (1 << 4) // CPU |
113 | #define HALTED_FLAG (1 << 12) // APU |
114 | #define FRAME_ADVANCE_FLAG (1 << 9) |
115 | |
116 | #define ROM_NAME_LEN 23 |
117 | #define AUTO_FRAMERATE 200 |
118 | |
119 | struct SCPUState |
120 | { |
121 | uint32 Flags; |
122 | int32 Cycles; |
123 | int32 PrevCycles; |
124 | int32 V_Counter; |
125 | uint8 *PCBase; |
126 | bool8 NMIPending; |
127 | bool8 IRQLine; |
128 | bool8 IRQTransition; |
129 | bool8 IRQLastState; |
130 | bool8 IRQExternal; |
131 | int32 IRQPending; |
132 | int32 MemSpeed; |
133 | int32 MemSpeedx2; |
134 | int32 FastROMSpeed; |
135 | bool8 InDMA; |
136 | bool8 InHDMA; |
137 | bool8 InDMAorHDMA; |
138 | bool8 InWRAMDMAorHDMA; |
139 | uint8 HDMARanInDMA; |
140 | int32 CurrentDMAorHDMAChannel; |
141 | uint8 WhichEvent; |
142 | int32 NextEvent; |
143 | bool8 WaitingForInterrupt; |
144 | uint32 AutoSaveTimer; |
145 | bool8 SRAMModified; |
146 | }; |
147 | |
148 | enum |
149 | { |
150 | HC_HBLANK_START_EVENT = 1, |
151 | HC_HDMA_START_EVENT = 2, |
152 | HC_HCOUNTER_MAX_EVENT = 3, |
153 | HC_HDMA_INIT_EVENT = 4, |
154 | HC_RENDER_EVENT = 5, |
155 | HC_WRAM_REFRESH_EVENT = 6 |
156 | }; |
157 | |
158 | enum |
159 | { |
160 | IRQ_NONE = 0x0, |
161 | IRQ_SET_FLAG = 0x1, |
162 | IRQ_CLEAR_FLAG = 0x2, |
163 | IRQ_TRIGGER_NMI = 0x4 |
164 | }; |
165 | |
166 | struct STimings |
167 | { |
168 | int32 H_Max_Master; |
169 | int32 H_Max; |
170 | int32 V_Max_Master; |
171 | int32 V_Max; |
172 | int32 HBlankStart; |
173 | int32 HBlankEnd; |
174 | int32 HDMAInit; |
175 | int32 HDMAStart; |
176 | int32 NMITriggerPos; |
177 | int32 NextIRQTimer; |
178 | int32 IRQTriggerCycles; |
179 | int32 WRAMRefreshPos; |
180 | int32 RenderPos; |
181 | bool8 InterlaceField; |
182 | int32 DMACPUSync; // The cycles to synchronize DMA and CPU. Snes9x cannot emulate correctly. |
183 | int32 NMIDMADelay; // The delay of NMI trigger after DMA transfers. Snes9x cannot emulate correctly. |
184 | int32 IRQFlagChanging; // This value is just a hack. |
185 | int32 APUSpeedup; |
186 | bool8 APUAllowTimeOverflow; |
187 | }; |
188 | |
189 | struct SSettings |
190 | { |
191 | bool8 TraceDMA; |
192 | bool8 TraceHDMA; |
193 | bool8 TraceVRAM; |
194 | bool8 TraceUnknownRegisters; |
195 | bool8 TraceDSP; |
196 | bool8 TraceHCEvent; |
197 | bool8 TraceSMP; |
198 | |
199 | bool8 SuperFX; |
200 | uint8 DSP; |
201 | bool8 SA1; |
202 | bool8 C4; |
203 | bool8 SDD1; |
204 | bool8 SPC7110; |
205 | bool8 SPC7110RTC; |
206 | bool8 OBC1; |
207 | uint8 SETA; |
208 | bool8 SRTC; |
209 | bool8 BS; |
210 | bool8 BSXItself; |
211 | bool8 BSXBootup; |
212 | bool8 MSU1; |
213 | bool8 MouseMaster; |
214 | bool8 SuperScopeMaster; |
215 | bool8 JustifierMaster; |
216 | bool8 MultiPlayer5Master; |
217 | bool8 MacsRifleMaster; |
218 | |
219 | bool8 ForceLoROM; |
220 | bool8 ForceHiROM; |
221 | bool8 ; |
222 | bool8 ; |
223 | bool8 ForceInterleaved; |
224 | bool8 ForceInterleaved2; |
225 | bool8 ForceInterleaveGD24; |
226 | bool8 ForceNotInterleaved; |
227 | bool8 ForcePAL; |
228 | bool8 ForceNTSC; |
229 | bool8 PAL; |
230 | uint32 FrameTimePAL; |
231 | uint32 FrameTimeNTSC; |
232 | uint32 FrameTime; |
233 | |
234 | bool8 SoundSync; |
235 | bool8 SixteenBitSound; |
236 | uint32 SoundPlaybackRate; |
237 | uint32 SoundInputRate; |
238 | bool8 Stereo; |
239 | bool8 ReverseStereo; |
240 | bool8 Mute; |
241 | bool8 DynamicRateControl; |
242 | int32 DynamicRateLimit; /* Multiplied by 1000 */ |
243 | int32 InterpolationMethod; |
244 | |
245 | bool8 SupportHiRes; |
246 | bool8 Transparency; |
247 | uint8 BG_Forced; |
248 | bool8 DisableGraphicWindows; |
249 | |
250 | bool8 DisplayTime; |
251 | bool8 DisplayFrameRate; |
252 | bool8 DisplayWatchedAddresses; |
253 | bool8 DisplayPressedKeys; |
254 | bool8 DisplayMovieFrame; |
255 | bool8 AutoDisplayMessages; |
256 | uint32 InitialInfoStringTimeout; |
257 | uint16 DisplayColor; |
258 | bool8 BilinearFilter; |
259 | |
260 | bool8 Multi; |
261 | char CartAName[PATH_MAX + 1]; |
262 | char CartBName[PATH_MAX + 1]; |
263 | |
264 | bool8 DisableGameSpecificHacks; |
265 | bool8 BlockInvalidVRAMAccessMaster; |
266 | bool8 BlockInvalidVRAMAccess; |
267 | int32 HDMATimingHack; |
268 | |
269 | bool8 ForcedPause; |
270 | bool8 Paused; |
271 | bool8 StopEmulation; |
272 | |
273 | uint32 SkipFrames; |
274 | uint32 TurboSkipFrames; |
275 | uint32 AutoMaxSkipFrames; |
276 | bool8 TurboMode; |
277 | uint32 HighSpeedSeek; |
278 | bool8 FrameAdvance; |
279 | bool8 Rewinding; |
280 | |
281 | bool8 NetPlay; |
282 | bool8 NetPlayServer; |
283 | char ServerName[128]; |
284 | int Port; |
285 | |
286 | bool8 MovieTruncate; |
287 | bool8 MovieNotifyIgnored; |
288 | bool8 WrongMovieStateProtection; |
289 | bool8 DumpStreams; |
290 | int DumpStreamsMaxFrames; |
291 | |
292 | bool8 TakeScreenshot; |
293 | int8 StretchScreenshots; |
294 | bool8 SnapshotScreenshots; |
295 | char InitialSnapshotFilename[PATH_MAX + 1]; |
296 | bool8 FastSavestates; |
297 | |
298 | bool8 ApplyCheats; |
299 | bool8 NoPatch; |
300 | bool8 IgnorePatchChecksum; |
301 | bool8 IsPatched; |
302 | int32 AutoSaveDelay; |
303 | bool8 DontSaveOopsSnapshot; |
304 | bool8 UpAndDown; |
305 | |
306 | bool8 OpenGLEnable; |
307 | |
308 | bool8 SeparateEchoBuffer; |
309 | uint32 SuperFXClockMultiplier; |
310 | int OverclockMode; |
311 | int OneClockCycle; |
312 | int OneSlowClockCycle; |
313 | int TwoClockCycles; |
314 | int MaxSpriteTilesPerLine; |
315 | }; |
316 | |
317 | struct SSNESGameFixes |
318 | { |
319 | uint8 SRAMInitialValue; |
320 | uint8 Uniracers; |
321 | }; |
322 | |
323 | enum |
324 | { |
325 | PAUSE_NETPLAY_CONNECT = (1 << 0), |
326 | PAUSE_TOGGLE_FULL_SCREEN = (1 << 1), |
327 | PAUSE_EXIT = (1 << 2), |
328 | = (1 << 3), |
329 | PAUSE_INACTIVE_WINDOW = (1 << 4), |
330 | PAUSE_WINDOW_ICONISED = (1 << 5), |
331 | PAUSE_RESTORE_GUI = (1 << 6), |
332 | PAUSE_FREEZE_FILE = (1 << 7) |
333 | }; |
334 | |
335 | void S9xSetPause(uint32); |
336 | void S9xClearPause(uint32); |
337 | void S9xExit(void); |
338 | void S9xMessage(int, int, const char *); |
339 | |
340 | extern struct SSettings Settings; |
341 | extern struct SCPUState CPU; |
342 | extern struct STimings Timings; |
343 | extern struct SSNESGameFixes SNESGameFixes; |
344 | extern char String[513]; |
345 | |
346 | #endif |
347 | |