1 // FinalBurn Neo - Emulator for MC68000/Z80 based arcade games
2 //            Refer to the "license.txt" file for more info
3 
4 // Burner emulation library
5 #ifndef _BURNH_H
6 #define _BURNH_H
7 
8 #ifdef __cplusplus
9  extern "C" {
10 #endif
11 
12 #if !defined (_WIN32)
13  #define __cdecl
14 #endif
15 
16 #if !defined (_MSC_VER) && defined(FASTCALL)
17  #undef __fastcall
18  #define __fastcall __attribute__((fastcall))
19 #endif
20 
21 #ifndef MAX_PATH
22  #define MAX_PATH 	260
23 #endif
24 
25 #include <time.h>
26 
27 extern TCHAR szAppHiscorePath[MAX_PATH];
28 extern TCHAR szAppSamplesPath[MAX_PATH];
29 extern TCHAR szAppHDDPath[MAX_PATH];
30 extern TCHAR szAppBlendPath[MAX_PATH];
31 extern TCHAR szAppEEPROMPath[MAX_PATH];
32 
33 // Macro to determine the size of a struct up to and including "member"
34 #define STRUCT_SIZE_HELPER(type, member) offsetof(type, member) + sizeof(((type*)0)->member)
35 
36 // Enable the MAME logerror() function in debug builds
37 // #define MAME_USE_LOGERROR
38 
39 // Give access to the CPUID function for various compilers
40 #if defined (__GNUC__)
41  #define CPUID(f,ra,rb,rc,rd) __asm__ __volatile__ ("cpuid"											\
42  													: "=a" (ra), "=b" (rb), "=c" (rc), "=d" (rd)	\
43  													: "a"  (f)										\
44  												   );
45 #elif defined (_MSC_VER)
46  #define CPUID(f,ra,rb,rc,rd) __asm { __asm mov		eax, f		\
47 									  __asm cpuid				\
48 									  __asm mov		ra, eax		\
49 									  __asm mov		rb, ebx		\
50 									  __asm mov		rc, ecx		\
51 									  __asm mov		rd, edx }
52 #else
53  #define CPUID(f,ra,rb,rc,rd)
54 #endif
55 
56 #ifndef BUILD_X86_ASM
57  #undef CPUID
58  #define CPUID(f,ra,rb,rc,rd)
59 #endif
60 
61 #ifdef _UNICODE
62  #define SEPERATOR_1 " \u2022 "
63  #define SEPERATOR_2 " \u25E6 "
64 #else
65  #define SEPERATOR_1 " ~ "
66  #define SEPERATOR_2 " ~ "
67 #endif
68 
69 #ifdef _UNICODE
70  #define WRITE_UNICODE_BOM(file) { UINT16 BOM[] = { 0xFEFF }; fwrite(BOM, 2, 1, file); }
71 #else
72  #define WRITE_UNICODE_BOM(file)
73 #endif
74 
75 typedef unsigned char						UINT8;
76 typedef signed char 						INT8;
77 typedef unsigned short						UINT16;
78 typedef signed short						INT16;
79 typedef unsigned int						UINT32;
80 typedef signed int							INT32;
81 #ifdef _MSC_VER
82 typedef signed __int64						INT64;
83 typedef unsigned __int64					UINT64;
84 #else
85 __extension__ typedef unsigned long long	UINT64;
86 __extension__ typedef long long				INT64;
87 #endif
88 
89 #include "state.h"
90 #include "cheat.h"
91 #include "hiscore.h"
92 
93 extern INT32 nBurnVer;						// Version number of the library
94 
95 enum BurnCartrigeCommand { CART_INIT_START, CART_INIT_END, CART_EXIT };
96 
97 // ---------------------------------------------------------------------------
98 // Callbacks
99 
100 // Application-defined rom loading function
101 extern INT32 (__cdecl *BurnExtLoadRom)(UINT8* Dest, INT32* pnWrote, INT32 i);
102 
103 // Application-defined progress indicator functions
104 extern INT32 (__cdecl *BurnExtProgressRangeCallback)(double dProgressRange);
105 extern INT32 (__cdecl *BurnExtProgressUpdateCallback)(double dProgress, const TCHAR* pszText, bool bAbs);
106 
107 // Application-defined catridge initialisation function
108 extern INT32 (__cdecl *BurnExtCartridgeSetupCallback)(BurnCartrigeCommand nCommand);
109 
110 // Application-defined colour conversion function
111 extern UINT32 (__cdecl *BurnHighCol) (INT32 r, INT32 g, INT32 b, INT32 i);
112 
113 // ---------------------------------------------------------------------------
114 
115 extern UINT32 nCurrentFrame;
116 
GetCurrentFrame()117 inline static INT32 GetCurrentFrame() {
118 	return nCurrentFrame;
119 }
120 
SetCurrentFrame(const UINT32 n)121 inline static void SetCurrentFrame(const UINT32 n) {
122 	nCurrentFrame = n;
123 }
124 
125 // ---------------------------------------------------------------------------
126 // Driver info structures
127 
128 // ROMs
129 
130 #define BRF_PRG				(1 << 20)
131 #define BRF_GRA				(1 << 21)
132 #define BRF_SND				(1 << 22)
133 
134 #define BRF_ESS				(1 << 24)
135 #define BRF_BIOS			(1 << 25)
136 #define BRF_SELECT			(1 << 26)
137 #define BRF_OPT				(1 << 27)
138 #define BRF_NODUMP			(1 << 28)
139 
140 struct BurnRomInfo {
141 	char szName[100];
142 	UINT32 nLen;
143 	UINT32 nCrc;
144 	UINT32 nType;
145 };
146 
147 struct BurnSampleInfo {
148 	char szName[100];
149 	UINT32 nFlags;
150 };
151 
152 struct BurnHDDInfo {
153 	char szName[100];
154 	UINT32 nLen;
155 	UINT32 nCrc;
156 };
157 
158 // Inputs
159 
160 #define BIT_DIGITAL			(1)
161 
162 #define BIT_GROUP_ANALOG	(4)
163 #define BIT_ANALOG_REL		(4)
164 #define BIT_ANALOG_ABS		(5)
165 
166 #define BIT_GROUP_CONSTANT	(8)
167 #define BIT_CONSTANT		(8)
168 #define BIT_DIPSWITCH		(9)
169 
170 struct BurnInputInfo {
171 	char* szName;
172 	UINT8 nType;
173 	union {
174 		UINT8* pVal;					// Most inputs use a char*
175 		UINT16* pShortVal;				// All analog inputs use a short*
176 	};
177 	char* szInfo;
178 };
179 
180 // DIPs
181 
182 struct BurnDIPInfo {
183 	INT32 nInput;
184 	UINT8 nFlags;
185 	UINT8 nMask;
186 	UINT8 nSetting;
187 	char* szText;
188 };
189 
190 #define DIP_OFFSET(x) {x, 0xf0, 0xff, 0xff, NULL},
191 
192 // ---------------------------------------------------------------------------
193 // Common CPU definitions
194 
195 // sync to nCyclesDone[]
196 #define CPU_RUN(num,proc) do { nCyclesDone[num] += proc ## Run(((i + 1) * nCyclesTotal[num] / nInterleave) - nCyclesDone[num]); } while (0)
197 #define CPU_IDLE(num,proc) do { nCyclesDone[num] += proc ## Idle(((i + 1) * nCyclesTotal[num] / nInterleave) - nCyclesDone[num]); } while (0)
198 #define CPU_IDLE_NULL(num) do { nCyclesDone[num] += ((i + 1) * nCyclesTotal[num] / nInterleave) - nCyclesDone[num]; } while (0)
199 // sync to cpuTotalCycles()
200 #define CPU_RUN_SYNCINT(num,proc) do { nCyclesDone[num] += proc ## Run(((i + 1) * nCyclesTotal[num] / nInterleave) - proc ## TotalCycles()); } while (0)
201 #define CPU_IDLE_SYNCINT(num,proc) do { nCyclesDone[num] += proc ## Idle(((i + 1) * nCyclesTotal[num] / nInterleave) - proc ## TotalCycles()); } while (0)
202 // sync to timer
203 #define CPU_RUN_TIMER(num) do { BurnTimerUpdate((i + 1) * nCyclesTotal[num] / nInterleave); if (i == nInterleave - 1) BurnTimerEndFrame(nCyclesTotal[num]); } while (0)
204 #define CPU_RUN_TIMER_YM3812(num) do { BurnTimerUpdateYM3812((i + 1) * nCyclesTotal[num] / nInterleave); if (i == nInterleave - 1) BurnTimerEndFrameYM3812(nCyclesTotal[num]); } while (0)
205 #define CPU_RUN_TIMER_YM3526(num) do { BurnTimerUpdateYM3526((i + 1) * nCyclesTotal[num] / nInterleave); if (i == nInterleave - 1) BurnTimerEndFrameYM3526(nCyclesTotal[num]); } while (0)
206 
207 #define CPU_IRQSTATUS_NONE	0
208 #define CPU_IRQSTATUS_ACK	1
209 #define CPU_IRQSTATUS_AUTO	2
210 #define CPU_IRQSTATUS_HOLD	4
211 
212 #define CPU_IRQLINE0		0
213 #define CPU_IRQLINE1		1
214 #define CPU_IRQLINE2		2
215 #define CPU_IRQLINE3		3
216 #define CPU_IRQLINE4		4
217 #define CPU_IRQLINE5		5
218 #define CPU_IRQLINE6		6
219 #define CPU_IRQLINE7		7
220 
221 #define CPU_IRQLINE_IRQ		CPU_IRQLINE0
222 #define CPU_IRQLINE_FIRQ	CPU_IRQLINE1
223 #define CPU_IRQLINE_NMI		0x20
224 
225 #define MAP_READ		1
226 #define MAP_WRITE		2
227 #define MAP_FETCHOP		4
228 #define MAP_FETCHARG		8
229 #define MAP_FETCH		(MAP_FETCHOP|MAP_FETCHARG)
230 #define MAP_ROM			(MAP_READ|MAP_FETCH)
231 #define MAP_RAM			(MAP_ROM|MAP_WRITE)
232 
233 // Macros to Allocate and Free MemIndex
234 #define BurnAllocMemIndex() do {                				\
235 	AllMem = NULL;                                 				\
236 	MemIndex();                                 				\
237 	INT32 nLen = MemEnd - (UINT8 *)0;           				\
238 	if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1;	\
239 	memset(AllMem, 0, nLen);                       				\
240 	MemIndex();                                 				\
241 } while (0)
242 
243 #define BurnFreeMemIndex() do { BurnFree(AllMem); } while (0)
244 
245 // ---------------------------------------------------------------------------
246 
247 extern bool bBurnUseMMX;
248 #ifdef BUILD_A68K
249 extern bool bBurnUseASMCPUEmulation;
250 #endif
251 
252 extern UINT32 nFramesEmulated;
253 extern UINT32 nFramesRendered;
254 extern clock_t starttime;					// system time when emulation started and after roms loaded
255 
256 extern bool bForce60Hz;
257 extern bool bBurnUseBlend;
258 
259 extern INT32 nBurnFPS;
260 extern INT32 nBurnCPUSpeedAdjust;
261 
262 extern UINT32 nBurnDrvCount;			// Count of game drivers
263 extern UINT32 nBurnDrvActive;			// Which game driver is selected
264 extern UINT32 nBurnDrvSelect[8];		// Which games are selected (i.e. loaded but not necessarily active)
265 
266 extern INT32 nMaxPlayers;
267 
268 extern UINT8 *pBurnDraw;			// Pointer to correctly sized bitmap
269 extern INT32 nBurnPitch;						// Pitch between each line
270 extern INT32 nBurnBpp;						// Bytes per pixel (2, 3, or 4)
271 
272 extern UINT8 nBurnLayer;			// Can be used externally to select which layers to show
273 extern UINT8 nSpriteEnable;			// Can be used externally to select which Sprites to show
274 
275 extern INT32 bRunAhead;             // "Run Ahead" lag-reduction technique UI option (on/off)
276 
277 extern INT32 bBurnRunAheadFrame;    // for drivers, hiscore, etc, to recognize that this is the "runahead frame"
278                                     // for instance, you wouldn't want to apply hi-score data on a "runahead frame"
279 
280 extern INT32 nBurnSoundRate;					// Samplerate of sound
281 extern INT32 nBurnSoundLen;					// Length in samples per frame
282 extern INT16* pBurnSoundOut;				// Pointer to output buffer
283 
284 extern INT32 nInterpolation;					// Desired interpolation level for ADPCM/PCM sound
285 extern INT32 nFMInterpolation;				// Desired interpolation level for FM sound
286 
287 extern UINT32 *pBurnDrvPalette;
288 
289 #define PRINT_NORMAL	(0)
290 #define PRINT_UI		(1)
291 #define PRINT_IMPORTANT (2)
292 #define PRINT_ERROR		(3)
293 #define PRINT_LEVEL1	(4)
294 #define PRINT_LEVEL2	(5)
295 #define PRINT_LEVEL3	(6)
296 #define PRINT_LEVEL4	(7)
297 #define PRINT_LEVEL5	(8)
298 #define PRINT_LEVEL6	(9)
299 #define PRINT_LEVEL7	(10)
300 #define PRINT_LEVEL8	(11)
301 #define PRINT_LEVEL9	(12)
302 #define PRINT_LEVEL10	(13)
303 
304 #ifndef bprintf
305 extern INT32 (__cdecl *bprintf) (INT32 nStatus, TCHAR* szFormat, ...);
306 #endif
307 
308 INT32 BurnLibInit();
309 INT32 BurnLibExit();
310 
311 INT32 BurnDrvInit();
312 INT32 BurnDrvExit();
313 
314 INT32 BurnDrvCartridgeSetup(BurnCartrigeCommand nCommand);
315 
316 INT32 BurnDrvFrame();
317 INT32 BurnDrvRedraw();
318 INT32 BurnRecalcPal();
319 INT32 BurnDrvGetPaletteEntries();
320 
321 INT32 BurnSetProgressRange(double dProgressRange);
322 INT32 BurnUpdateProgress(double dProgressStep, const TCHAR* pszText, bool bAbs);
323 
324 void BurnLocalisationSetName(char *szName, TCHAR *szLongName);
325 
326 void BurnGetLocalTime(tm *nTime);                   // Retrieve local-time of machine w/tweaks for netgame and input recordings
327 UINT16 BurnRandom();                                // State-able Random Number Generator (0-32767)
328 void BurnRandomScan(INT32 nAction);                 // Must be called in driver's DrvScan() if BurnRandom() is used
329 void BurnRandomInit();                              // Called automatically in BurnDrvInit() / Internal use only
330 void BurnRandomSetSeed(UINT64 nSeed);               // Set the seed - useful for netgames / input recordings
331 
332 // Handy FM default callbacks
333 INT32 BurnSynchroniseStream(INT32 nSoundRate);
334 double BurnGetTime();
335 
336 // Handy debug binary-file dumper
337 #if defined (FBNEO_DEBUG)
338 void BurnDump_(char *filename, UINT8 *buffer, INT32 bufsize, INT32 append);
339 #define BurnDump(fn, b, bs) do { \
340     bprintf(0, _T("Dumping %S (0x%x bytes) to %S\n"), #b, bs, #fn); \
341     BurnDump_(fn, b, bs, 0); } while (0)
342 
343 #define BurnDumpAppend(fn, b, bs) do { \
344     bprintf(0, _T("Dumping %S (0x%x bytes) to %S (append)\n"), #b, bs, #fn); \
345     BurnDump_(fn, b, bs, 1); } while (0)
346 
347 void BurnDumpLoad_(char *filename, UINT8 *buffer, INT32 bufsize);
348 #define BurnDumpLoad(fn, b, bs) do { \
349     bprintf(0, _T("Loading Dump %S (0x%x bytes) to %S\n"), #fn, bs, #b); \
350     BurnDumpLoad_(fn, b, bs); } while (0)
351 
352 #endif
353 
354 // ---------------------------------------------------------------------------
355 // Retrieve driver information
356 
357 #define DRV_NAME		 (0)
358 #define DRV_DATE		 (1)
359 #define DRV_FULLNAME	 (2)
360 //#define DRV_MEDIUMNAME	 (3)
361 #define DRV_COMMENT		 (4)
362 #define DRV_MANUFACTURER (5)
363 #define DRV_SYSTEM		 (6)
364 #define DRV_PARENT		 (7)
365 #define DRV_BOARDROM	 (8)
366 #define DRV_SAMPLENAME	 (9)
367 
368 #define DRV_NEXTNAME	 (1 << 8)
369 #define DRV_ASCIIONLY	 (1 << 12)
370 #define DRV_UNICODEONLY	 (1 << 13)
371 
372 TCHAR* BurnDrvGetText(UINT32 i);
373 char* BurnDrvGetTextA(UINT32 i);
374 
375 INT32 BurnDrvGetZipName(char** pszName, UINT32 i);
376 INT32 BurnDrvGetRomInfo(struct BurnRomInfo *pri, UINT32 i);
377 INT32 BurnDrvGetRomName(char** pszName, UINT32 i, INT32 nAka);
378 INT32 BurnDrvGetInputInfo(struct BurnInputInfo* pii, UINT32 i);
379 INT32 BurnDrvGetDIPInfo(struct BurnDIPInfo* pdi, UINT32 i);
380 INT32 BurnDrvGetVisibleSize(INT32* pnWidth, INT32* pnHeight);
381 INT32 BurnDrvGetVisibleOffs(INT32* pnLeft, INT32* pnTop);
382 INT32 BurnDrvGetFullSize(INT32* pnWidth, INT32* pnHeight);
383 INT32 BurnDrvGetAspect(INT32* pnXAspect, INT32* pnYAspect);
384 INT32 BurnDrvGetHardwareCode();
385 INT32 BurnDrvGetFlags();
386 bool BurnDrvIsWorking();
387 INT32 BurnDrvGetMaxPlayers();
388 INT32 BurnDrvSetVisibleSize(INT32 pnWidth, INT32 pnHeight);
389 INT32 BurnDrvSetAspect(INT32 pnXAspect, INT32 pnYAspect);
390 INT32 BurnDrvGetGenreFlags();
391 INT32 BurnDrvGetFamilyFlags();
392 INT32 BurnDrvGetSampleInfo(struct BurnSampleInfo *pri, UINT32 i);
393 INT32 BurnDrvGetSampleName(char** pszName, UINT32 i, INT32 nAka);
394 INT32 BurnDrvGetHDDInfo(struct BurnHDDInfo *pri, UINT32 i);
395 INT32 BurnDrvGetHDDName(char** pszName, UINT32 i, INT32 nAka);
396 
397 void Reinitialise();
398 
399 extern bool bDoIpsPatch;
400 extern INT32 nIpsMaxFileLen;
401 void IpsApplyPatches(UINT8* base, char* rom_name);
402 
403 // ---------------------------------------------------------------------------
404 // Flags used with the Burndriver structure
405 
406 // Flags for the flags member
407 #define BDF_GAME_NOT_WORKING							(0)
408 #define BDF_GAME_WORKING								(1 << 0)
409 #define BDF_ORIENTATION_FLIPPED							(1 << 1)
410 #define BDF_ORIENTATION_VERTICAL						(1 << 2)
411 #define BDF_BOARDROM									(1 << 3)
412 #define BDF_CLONE										(1 << 4)
413 #define BDF_BOOTLEG										(1 << 5)
414 #define BDF_PROTOTYPE									(1 << 6)
415 #define BDF_16BIT_ONLY									(1 << 7)
416 #define BDF_HACK										(1 << 8)
417 #define BDF_HOMEBREW									(1 << 9)
418 #define BDF_DEMO										(1 << 10)
419 #define BDF_HISCORE_SUPPORTED							(1 << 11)
420 #define BDF_RUNAHEAD_DRAWSYNC                           (1 << 12)
421 #define BDF_RUNAHEAD_DISABLED                           (1 << 13)
422 
423 // Flags for the hardware member
424 // Format: 0xDDEEFFFF, where DD: Manufacturer, EE: Hardware platform, FFFF: Flags (used by driver)
425 
426 #define HARDWARE_PUBLIC_MASK							(0x7FFF0000)
427 
428 #define HARDWARE_PREFIX_CARTRIDGE						((INT32)0x80000000)
429 
430 #define HARDWARE_PREFIX_MISC_PRE90S						(0x00000000)
431 #define HARDWARE_PREFIX_CAPCOM							(0x01000000)
432 #define HARDWARE_PREFIX_SEGA							(0x02000000)
433 #define HARDWARE_PREFIX_KONAMI							(0x03000000)
434 #define HARDWARE_PREFIX_TOAPLAN							(0x04000000)
435 #define HARDWARE_PREFIX_SNK								(0x05000000)
436 #define HARDWARE_PREFIX_CAVE							(0x06000000)
437 #define HARDWARE_PREFIX_CPS2							(0x07000000)
438 #define HARDWARE_PREFIX_IGS_PGM							(0x08000000)
439 #define HARDWARE_PREFIX_CPS3							(0x09000000)
440 #define HARDWARE_PREFIX_MISC_POST90S					(0x0a000000)
441 #define HARDWARE_PREFIX_TAITO							(0x0b000000)
442 #define HARDWARE_PREFIX_SEGA_MEGADRIVE					(0x0c000000)
443 #define HARDWARE_PREFIX_PSIKYO							(0x0d000000)
444 #define HARDWARE_PREFIX_KANEKO							(0x0e000000)
445 #define HARDWARE_PREFIX_PACMAN							(0x0f000000)
446 #define HARDWARE_PREFIX_GALAXIAN						(0x10000000)
447 #define HARDWARE_PREFIX_IREM							(0x11000000)
448 #define HARDWARE_PREFIX_DATAEAST						(0x13000000)
449 #define HARDWARE_PREFIX_CAPCOM_MISC						(0x14000000)
450 #define HARDWARE_PREFIX_SETA							(0x15000000)
451 #define HARDWARE_PREFIX_TECHNOS							(0x16000000)
452 #define HARDWARE_PREFIX_PCENGINE						(0x17000000)
453 #define HARDWARE_PREFIX_SEGA_MASTER_SYSTEM				(0x18000000)
454 #define HARDWARE_PREFIX_SEGA_SG1000						(0x19000000)
455 #define HARDWARE_PREFIX_COLECO							(0x1A000000)
456 #define HARDWARE_PREFIX_MIDWAY							(0x1B000000)
457 #define HARDWARE_PREFIX_SEGA_GAME_GEAR					(0x12000000)
458 #define HARDWARE_PREFIX_MSX                             (0x1C000000)
459 #define HARDWARE_PREFIX_SPECTRUM                        (0x1D000000)
460 #define HARDWARE_PREFIX_NES                             (0x1E000000)
461 #define HARDWARE_PREFIX_FDS                             (0x1F000000)
462 #define HARDWARE_PREFIX_NGP                             (0x20000000)
463 #define HARDWARE_PREFIX_CHANNELF                        (0x21000000)
464 
465 #define HARDWARE_SNK_NGP								(HARDWARE_PREFIX_NGP | 0x00000000)
466 #define HARDWARE_SNK_NGPC								(HARDWARE_PREFIX_NGP | 0x00000001)
467 
468 #define HARDWARE_MISC_PRE90S							(HARDWARE_PREFIX_MISC_PRE90S)
469 #define HARDWARE_MISC_POST90S							(HARDWARE_PREFIX_MISC_POST90S)
470 
471 #define HARDWARE_CAPCOM_CPS1							(HARDWARE_PREFIX_CAPCOM | 0x00010000)
472 #define HARDWARE_CAPCOM_CPS1_QSOUND 					(HARDWARE_PREFIX_CAPCOM | 0x00020000)
473 #define HARDWARE_CAPCOM_CPS1_GENERIC 					(HARDWARE_PREFIX_CAPCOM | 0x00030000)
474 #define HARDWARE_CAPCOM_CPSCHANGER						(HARDWARE_PREFIX_CAPCOM | 0x00040000)
475 #define HARDWARE_CAPCOM_CPS2							(HARDWARE_PREFIX_CPS2 | 0x00010000)
476 #define HARDWARE_CAPCOM_CPS2_SIMM						(0x0002)
477 
478 #define HARDWARE_SEGA_SYSTEMX							(HARDWARE_PREFIX_SEGA | 0x00010000)
479 #define HARDWARE_SEGA_SYSTEMY							(HARDWARE_PREFIX_SEGA | 0x00020000)
480 #define HARDWARE_SEGA_SYSTEM16A							(HARDWARE_PREFIX_SEGA | 0x00030000)
481 #define HARDWARE_SEGA_SYSTEM16B 						(HARDWARE_PREFIX_SEGA | 0x00040000)
482 #define HARDWARE_SEGA_SYSTEM16M							(HARDWARE_PREFIX_SEGA | 0x00050000)
483 #define HARDWARE_SEGA_SYSTEM18							(HARDWARE_PREFIX_SEGA | 0x00060000)
484 #define HARDWARE_SEGA_HANGON							(HARDWARE_PREFIX_SEGA | 0x00070000)
485 #define HARDWARE_SEGA_OUTRUN							(HARDWARE_PREFIX_SEGA | 0x00080000)
486 #define HARDWARE_SEGA_SYSTEM1							(HARDWARE_PREFIX_SEGA | 0x00090000)
487 #define HARDWARE_SEGA_MISC								(HARDWARE_PREFIX_SEGA | 0x000a0000)
488 #define HARDWARE_SEGA_SYSTEM24							(HARDWARE_PREFIX_SEGA | 0x000b0000)
489 
490 #define HARDWARE_SEGA_PCB_MASK							(0x0f)
491 #define HARDWARE_SEGA_5358								(0x01)
492 #define HARDWARE_SEGA_5358_SMALL						(0x02)
493 #define HARDWARE_SEGA_5704								(0x03)
494 #define HARDWARE_SEGA_5521								(0x04)
495 #define HARDWARE_SEGA_5797								(0x05)
496 #define HARDWARE_SEGA_5704_PS2							(0x06)
497 #define HARDWARE_SEGA_171_SHADOW						(0x07)
498 #define HARDWARE_SEGA_171_5874							(0x08)
499 #define HARDWARE_SEGA_171_5987							(0x09)
500 #define HARDWARE_SEGA_837_7525							(0x0a)
501 
502 #define HARDWARE_SEGA_FD1089A_ENC						(0x0010)
503 #define HARDWARE_SEGA_FD1089B_ENC						(0x0020)
504 #define HARDWARE_SEGA_MC8123_ENC						(0x0040)
505 #define HARDWARE_SEGA_FD1094_ENC						(0x0080)
506 #define HARDWARE_SEGA_SPRITE_LOAD32						(0x0100)
507 #define HARDWARE_SEGA_YM2203							(0x0200)
508 #define HARDWARE_SEGA_INVERT_TILES						(0x0400)
509 #define HARDWARE_SEGA_YM2413							(0x0800)
510 #define HARDWARE_SEGA_FD1094_ENC_CPU2					(0x1000)
511 #define HARDWARE_SEGA_ISGSM								(0x2000)
512 
513 #define HARDWARE_KONAMI_68K_Z80							(HARDWARE_PREFIX_KONAMI | 0x00010000)
514 #define HARDWARE_KONAMI_68K_ONLY						(HARDWARE_PREFIX_KONAMI | 0x00020000)
515 
516 #define HARDWARE_TOAPLAN_RAIZING						(HARDWARE_PREFIX_TOAPLAN | 0x00010000)
517 #define HARDWARE_TOAPLAN_68K_Zx80						(HARDWARE_PREFIX_TOAPLAN | 0x00020000)
518 #define HARDWARE_TOAPLAN_68K_ONLY						(HARDWARE_PREFIX_TOAPLAN | 0x00030000)
519 #define HARDWARE_TOAPLAN_MISC							(HARDWARE_PREFIX_TOAPLAN | 0x00040000)
520 
521 #define HARDWARE_SNK_NEOGEO								(HARDWARE_PREFIX_SNK | 0x00010000)
522 #define HARDWARE_SNK_SWAPP								(0x0001)	// Swap code roms
523 #define HARDWARE_SNK_SWAPV								(0x0002)	// Swap sound roms
524 #define HARDWARE_SNK_SWAPC								(0x0004)	// Swap sprite roms
525 #define HARDWARE_SNK_CMC42								(0x0008)	// CMC42 encryption chip
526 #define HARDWARE_SNK_CMC50								(0x0010)	// CMC50 encryption chip
527 #define HARDWARE_SNK_ALTERNATE_TEXT						(0x0020)	// KOF2000 text layer banks
528 #define HARDWARE_SNK_SMA_PROTECTION						(0x0040)	// SMA protection
529 #define HARDWARE_SNK_KOF2K3								(0x0080)	// KOF2K3 hardware
530 #define HARDWARE_SNK_ENCRYPTED_M1						(0x0100)	// M1 encryption
531 #define HARDWARE_SNK_P32								(0x0200)	// SWAP32 P ROMs
532 #define HARDWARE_SNK_SPRITE32							(0x0400)
533 
534 #define HARDWARE_SNK_CONTROLMASK						(0xF000)
535 #define HARDWARE_SNK_JOYSTICK							(0x0000)	// Uses joysticks
536 #define HARDWARE_SNK_PADDLE								(0x1000)	// Uses joysticks or paddles
537 #define HARDWARE_SNK_TRACKBALL							(0x2000)	// Uses a trackball
538 #define HARDWARE_SNK_4_JOYSTICKS						(0x3000)	// Uses 4 joysticks
539 #define HARDWARE_SNK_MAHJONG							(0x4000)	// Uses a special mahjong controller
540 #define HARDWARE_SNK_GAMBLING							(0x5000)	// Uses gambling controls
541 
542 #define HARDWARE_SNK_MVS								(HARDWARE_PREFIX_SNK | 0x00020000)
543 #define HARDWARE_SNK_NEOCD								(HARDWARE_PREFIX_SNK | 0x00030000)
544 #define HARDWARE_SNK_DEDICATED_PCB						(HARDWARE_PREFIX_SNK | 0x00040000)
545 
546 #define HARDWARE_CAVE_68K_ONLY							(HARDWARE_PREFIX_CAVE)
547 #define HARDWARE_CAVE_68K_Z80							(HARDWARE_PREFIX_CAVE | 0x0001)
548 #define HARDWARE_CAVE_M6295								(0x0002)
549 #define HARDWARE_CAVE_YM2151							(0x0004)
550 
551 #define HARDWARE_IGS_PGM								(HARDWARE_PREFIX_IGS_PGM)
552 #define HARDWARE_IGS_USE_ARM_CPU						(0x0001)
553 
554 #define HARDWARE_CAPCOM_CPS3							(HARDWARE_PREFIX_CPS3)
555 #define HARDWARE_CAPCOM_CPS3_NO_CD   					(0x0001)
556 
557 #define HARDWARE_TAITO_TAITOZ							(HARDWARE_PREFIX_TAITO | 0x00010000)
558 #define HARDWARE_TAITO_TAITOF2							(HARDWARE_PREFIX_TAITO | 0x00020000)
559 #define HARDWARE_TAITO_MISC								(HARDWARE_PREFIX_TAITO | 0x00030000)
560 #define HARDWARE_TAITO_TAITOX							(HARDWARE_PREFIX_TAITO | 0x00040000)
561 #define HARDWARE_TAITO_TAITOB							(HARDWARE_PREFIX_TAITO | 0x00050000)
562 
563 #define HARDWARE_IREM_M62								(HARDWARE_PREFIX_IREM | 0x00010000)
564 #define HARDWARE_IREM_M63								(HARDWARE_PREFIX_IREM | 0x00020000)
565 #define HARDWARE_IREM_M72								(HARDWARE_PREFIX_IREM | 0x00030000)
566 #define HARDWARE_IREM_M90								(HARDWARE_PREFIX_IREM | 0x00040000)
567 #define HARDWARE_IREM_M92								(HARDWARE_PREFIX_IREM | 0x00050000)
568 #define HARDWARE_IREM_MISC								(HARDWARE_PREFIX_IREM | 0x00060000)
569 
570 #define HARDWARE_SEGA_MASTER_SYSTEM						(HARDWARE_PREFIX_SEGA_MASTER_SYSTEM)
571 
572 #define HARDWARE_SMS_MAPPER_CODIES						(0x01)
573 #define HARDWARE_SMS_MAPPER_MSX							(0x02)
574 #define HARDWARE_SMS_MAPPER_MSX_NEMESIS					(0x03)
575 #define HARDWARE_SMS_MAPPER_KOREA    					(0x04)
576 #define HARDWARE_SMS_MAPPER_KOREA8K 					(0x05)
577 #define HARDWARE_SMS_MAPPER_KOREA16K 					(0x06)
578 #define HARDWARE_SMS_MAPPER_4PAK     					(0x07)
579 #define HARDWARE_SMS_MAPPER_XIN1     					(0x08)
580 #define HARDWARE_SMS_MAPPER_NONE     					(0x0F)
581 
582 #define HARDWARE_SMS_NO_CART_HEADER						(0x1000)
583 #define HARDWARE_SMS_GG_SMS_MODE						(0x2000)
584 #define HARDWARE_SMS_DISPLAY_PAL						(0x4000)
585 #define HARDWARE_SMS_JAPANESE							(0x8000)
586 
587 #define HARDWARE_SEGA_GAME_GEAR							(HARDWARE_PREFIX_SEGA_GAME_GEAR)
588 
589 #define HARDWARE_SEGA_MEGADRIVE							(HARDWARE_PREFIX_SEGA_MEGADRIVE)
590 
591 #define HARDWARE_SEGA_SG1000                            (HARDWARE_PREFIX_SEGA_SG1000)
592 #define HARDWARE_SEGA_SG1000_RAMEXP_A                   (0x1000)
593 #define HARDWARE_SEGA_SG1000_RAMEXP_B                   (0x2000)
594 #define HARDWARE_SEGA_SG1000_RAMEXP_2K                  (0x4000)
595 #define HARDWARE_SEGA_SG1000_RAMEXP_8K                  (0x8000)
596 #define HARDWARE_COLECO                                 (HARDWARE_PREFIX_COLECO)
597 
598 #define HARDWARE_MSX                                    (HARDWARE_PREFIX_MSX)
599 #define HARDWARE_MSX_MAPPER_ASCII8                      (0x01)
600 #define HARDWARE_MSX_MAPPER_ASCII8_SRAM                 (0x01)
601 #define HARDWARE_MSX_MAPPER_ASCII16                     (0x02)
602 #define HARDWARE_MSX_MAPPER_ASCII16_SRAM                (0x02)
603 #define HARDWARE_MSX_MAPPER_KONAMI                      (0x03)
604 #define HARDWARE_MSX_MAPPER_KONAMI_SCC                  (0x04)
605 #define HARDWARE_MSX_MAPPER_BASIC                       (0x05)
606 #define HARDWARE_MSX_MAPPER_DOOLY                       (0x06)
607 #define HARDWARE_MSX_MAPPER_RTYPE                       (0x07)
608 #define HARDWARE_MSX_MAPPER_CROSS_BLAIM                 (0x08)
609 #define HARDWARE_MSX_MAPPER_48K                         (0x09)
610 
611 #define HARDWARE_SEGA_MEGADRIVE_PCB_SEGA_EEPROM			(1)
612 #define HARDWARE_SEGA_MEGADRIVE_PCB_SEGA_SRAM			(2)
613 #define HARDWARE_SEGA_MEGADRIVE_PCB_SEGA_FRAM			(3)
614 #define HARDWARE_SEGA_MEGADRIVE_PCB_CM_JCART			(4)
615 #define HARDWARE_SEGA_MEGADRIVE_PCB_CM_JCART_SEPROM		(5)
616 #define HARDWARE_SEGA_MEGADRIVE_PCB_CODE_MASTERS		(6)
617 #define HARDWARE_SEGA_MEGADRIVE_PCB_SSF2				(7)
618 #define HARDWARE_SEGA_MEGADRIVE_PCB_GAME_KANDUME		(8)
619 #define HARDWARE_SEGA_MEGADRIVE_PCB_BEGGAR				(9)
620 #define HARDWARE_SEGA_MEGADRIVE_PCB_NBA_JAM				(10)
621 #define HARDWARE_SEGA_MEGADRIVE_PCB_NBA_JAM_TE			(11)
622 #define HARDWARE_SEGA_MEGADRIVE_PCB_NFL_QB_96			(12)
623 #define HARDWARE_SEGA_MEGADRIVE_PCB_C_SLAM				(13)
624 #define HARDWARE_SEGA_MEGADRIVE_PCB_EA_NHLPA			(14)
625 #define HARDWARE_SEGA_MEGADRIVE_PCB_LIONK3				(15)
626 #define HARDWARE_SEGA_MEGADRIVE_PCB_SDK99				(16)
627 #define HARDWARE_SEGA_MEGADRIVE_PCB_SKINGKONG			(17)
628 #define HARDWARE_SEGA_MEGADRIVE_PCB_REDCL_EN			(18)
629 #define HARDWARE_SEGA_MEGADRIVE_PCB_RADICA				(19)
630 #define HARDWARE_SEGA_MEGADRIVE_PCB_KOF98				(20)
631 #define HARDWARE_SEGA_MEGADRIVE_PCB_KOF99				(21)
632 #define HARDWARE_SEGA_MEGADRIVE_PCB_SOULBLAD			(22)
633 #define HARDWARE_SEGA_MEGADRIVE_PCB_MJLOVER				(23)
634 #define HARDWARE_SEGA_MEGADRIVE_PCB_SQUIRRELK			(24)
635 #define HARDWARE_SEGA_MEGADRIVE_PCB_SMOUSE				(25)
636 #define HARDWARE_SEGA_MEGADRIVE_PCB_SMB					(26)
637 #define HARDWARE_SEGA_MEGADRIVE_PCB_SMB2				(27)
638 #define HARDWARE_SEGA_MEGADRIVE_PCB_KAIJU				(28)
639 #define HARDWARE_SEGA_MEGADRIVE_PCB_CHINFIGHT3			(29)
640 #define HARDWARE_SEGA_MEGADRIVE_PCB_LIONK2				(30)
641 #define HARDWARE_SEGA_MEGADRIVE_PCB_BUGSLIFE			(31)
642 #define HARDWARE_SEGA_MEGADRIVE_PCB_ELFWOR				(32)
643 #define HARDWARE_SEGA_MEGADRIVE_PCB_ROCKMANX3			(33)
644 #define HARDWARE_SEGA_MEGADRIVE_PCB_SBUBBOB				(34)
645 #define HARDWARE_SEGA_MEGADRIVE_PCB_REALTEC				(35)
646 #define HARDWARE_SEGA_MEGADRIVE_PCB_MC_SUP19IN1			(36)
647 #define HARDWARE_SEGA_MEGADRIVE_PCB_MC_SUP15IN1			(37)
648 #define HARDWARE_SEGA_MEGADRIVE_PCB_MC_12IN1			(38)
649 #define HARDWARE_SEGA_MEGADRIVE_PCB_TOPFIGHTER			(39)
650 #define HARDWARE_SEGA_MEGADRIVE_PCB_POKEMON				(40)
651 #define HARDWARE_SEGA_MEGADRIVE_PCB_POKEMON2			(41)
652 #define HARDWARE_SEGA_MEGADRIVE_PCB_MULAN				(42)
653 #define HARDWARE_SEGA_MEGADRIVE_PCB_16ZHANG             (43)
654 #define HARDWARE_SEGA_MEGADRIVE_TEAMPLAYER              (0x40)
655 #define HARDWARE_SEGA_MEGADRIVE_TEAMPLAYER_PORT2        (0x80)
656 #define HARDWARE_SEGA_MEGADRIVE_FOURWAYPLAY             (0xc0)
657 
658 #define HARDWARE_SEGA_MEGADRIVE_SRAM_00400				(0x0100)
659 #define HARDWARE_SEGA_MEGADRIVE_SRAM_00800				(0x0200)
660 #define HARDWARE_SEGA_MEGADRIVE_SRAM_01000				(0x0400)
661 #define HARDWARE_SEGA_MEGADRIVE_SRAM_04000				(0x0800)
662 #define HARDWARE_SEGA_MEGADRIVE_SRAM_10000				(0x1000)
663 #define HARDWARE_SEGA_MEGADRIVE_FRAM_00400				(0x2000)
664 
665 #define HARDWARE_PSIKYO									(HARDWARE_PREFIX_PSIKYO)
666 
667 #define HARDWARE_KANEKO16								(HARDWARE_PREFIX_KANEKO | 0x10000)
668 #define HARDWARE_KANEKO_MISC							(HARDWARE_PREFIX_KANEKO | 0x20000)
669 #define HARDWARE_KANEKO_SKNS							(HARDWARE_PREFIX_KANEKO | 0x30000)
670 
671 #define HARDWARE_PACMAN									(HARDWARE_PREFIX_PACMAN)
672 
673 #define HARDWARE_GALAXIAN								(HARDWARE_PREFIX_GALAXIAN)
674 
675 #define HARWARE_CAPCOM_MISC								(HARDWARE_PREFIX_CAPCOM_MISC)
676 
677 #define HARDWARE_SETA1									(HARDWARE_PREFIX_SETA | 0x10000)
678 #define HARDWARE_SETA2									(HARDWARE_PREFIX_SETA | 0x20000)
679 #define HARDWARE_SETA_SSV								(HARDWARE_PREFIX_SETA | 0x30000)
680 
681 #define HARDWARE_TECHNOS								(HARDWARE_PREFIX_TECHNOS)
682 
683 #define HARDWARE_PCENGINE_PCENGINE						(HARDWARE_PREFIX_PCENGINE | 0x00010000)
684 #define HARDWARE_PCENGINE_TG16							(HARDWARE_PREFIX_PCENGINE | 0x00020000)
685 #define HARDWARE_PCENGINE_SGX							(HARDWARE_PREFIX_PCENGINE | 0x00030000)
686 
687 #define HARDWARE_SPECTRUM								(HARDWARE_PREFIX_SPECTRUM)
688 
689 #define HARDWARE_MIDWAY_KINST							(HARDWARE_PREFIX_MIDWAY | 0x00010000)
690 #define HARDWARE_MIDWAY_TUNIT							(HARDWARE_PREFIX_MIDWAY | 0x00020000)
691 #define HARDWARE_MIDWAY_WUNIT							(HARDWARE_PREFIX_MIDWAY | 0x00030000)
692 #define HARDWARE_MIDWAY_YUNIT							(HARDWARE_PREFIX_MIDWAY | 0x00040000)
693 
694 #define HARDWARE_NES									(HARDWARE_PREFIX_NES)
695 #define HARDWARE_FDS									(HARDWARE_PREFIX_FDS)
696 
697 #define HARDWARE_CHANNELF                               (HARDWARE_PREFIX_CHANNELF)
698 
699 // flags for the genre member
700 #define GBF_HORSHOOT									(1 << 0)
701 #define GBF_VERSHOOT									(1 << 1)
702 #define GBF_SCRFIGHT									(1 << 2)
703 #define GBF_VSFIGHT										(1 << 3)
704 #define GBF_BIOS										(1 << 4)
705 #define GBF_BREAKOUT									(1 << 5)
706 #define GBF_CASINO										(1 << 6)
707 #define GBF_BALLPADDLE									(1 << 7)
708 #define GBF_MAZE										(1 << 8)
709 #define GBF_MINIGAMES									(1 << 9)
710 #define GBF_PINBALL										(1 << 10)
711 #define GBF_PLATFORM									(1 << 11)
712 #define GBF_PUZZLE										(1 << 12)
713 #define GBF_QUIZ										(1 << 13)
714 #define GBF_SPORTSMISC									(1 << 14)
715 #define GBF_SPORTSFOOTBALL								(1 << 15)
716 #define GBF_MISC										(1 << 16)
717 #define GBF_MAHJONG										(1 << 17)
718 #define GBF_RACING										(1 << 18)
719 #define GBF_SHOOT										(1 << 19)
720 #define GBF_ACTION  									(1 << 20)
721 #define GBF_RUNGUN  									(1 << 21)
722 #define GBF_STRATEGY									(1 << 22)
723 #define GBF_VECTOR                                      (1 << 23)
724 #define GBF_RPG                                         (1 << 24)
725 #define GBF_SIM                                         (1 << 25)
726 #define GBF_ADV                                         (1 << 26)
727 
728 // flags for the family member
729 #define FBF_MSLUG										(1 << 0)
730 #define FBF_SF											(1 << 1)
731 #define FBF_KOF											(1 << 2)
732 #define FBF_DSTLK										(1 << 3)
733 #define FBF_FATFURY										(1 << 4)
734 #define FBF_SAMSHO										(1 << 5)
735 #define FBF_19XX										(1 << 6)
736 #define FBF_SONICWI										(1 << 7)
737 #define FBF_PWRINST										(1 << 8)
738 #define FBF_SONIC										(1 << 9)
739 #define FBF_DONPACHI                                    (1 << 10)
740 #define FBF_MAHOU                                       (1 << 11)
741 
742 #ifdef __cplusplus
743  } // End of extern "C"
744 #endif
745 
746 #endif
747