1 #include "cps.h"
2 // CPS (general)
3 
4 INT32 Cps = 0;							// 1 = CPS1, 2 = CPS2, 3 = CPS Changer
5 INT32 Cps1Qs = 0;
6 INT32 Cps1DisablePSnd = 0;				// Disables the Z80 as well
7 INT32 Cps2DisableQSnd = 0;				// Disables the Z80 as well
8 
9 INT32 nCPS68KClockspeed = 0;
10 INT32 nCpsCycles = 0;						// 68K Cycles per frame
11 INT32	nCpsZ80Cycles;
12 
13 UINT8 *CpsGfx =NULL; UINT32 nCpsGfxLen =0; // All the graphics
14 UINT8 *CpsRom =NULL; UINT32 nCpsRomLen =0; // Program Rom (as in rom)
15 UINT8 *CpsCode=NULL; UINT32 nCpsCodeLen=0; // Program Rom (decrypted)
16 UINT8 *CpsZRom=NULL; UINT32 nCpsZRomLen=0; // Z80 Roms
17 INT8 *CpsQSam=NULL; UINT32 nCpsQSamLen=0;	// QSound Sample Roms
18 UINT8 *CpsAd  =NULL; UINT32 nCpsAdLen  =0; // ADPCM Data
19 UINT8 *CpsStar=NULL;
20 UINT8 *CpsKey=NULL; UINT32 nCpsKeyLen = 0;
21 UINT32 nCpsGfxScroll[4]={0,0,0,0}; // Offset to Scroll tiles
22 UINT32 nCpsGfxMask=0;	  // Address mask
23 
24 // Separate out the bits of a byte
Separate(UINT32 b)25 inline static UINT32 Separate(UINT32 b)
26 {
27 	UINT32 a = b;									// 00000000 00000000 00000000 11111111
28 	a  =((a & 0x000000F0) << 12) | (a & 0x0000000F);	// 00000000 00001111 00000000 00001111
29 	a = ((a & 0x000C000C) <<  6) | (a & 0x00030003);	// 00000011 00000011 00000011 00000011
30 	a = ((a & 0x02020202) <<  3) | (a & 0x01010101);	// 00010001 00010001 00010001 00010001
31 
32 	return a;
33 }
34 
35 // Precalculated table of the Separate function
36 static UINT32 SepTable[256];
37 
SepTableCalc()38 static INT32 SepTableCalc()
39 {
40 	static INT32 bDone = 0;
41 	if (bDone) {
42 		return 0;										// Already done it
43 	}
44 
45 	for (INT32 i = 0; i < 256; i++) {
46 		SepTable[i] = Separate(255 - i);
47 	}
48 
49 	bDone = 1;											// done it
50 	return 0;
51 }
52 
53 // Allocate space and load up a rom
LoadUp(UINT8 ** pRom,INT32 * pnRomLen,INT32 nNum)54 static INT32 LoadUp(UINT8** pRom, INT32* pnRomLen, INT32 nNum)
55 {
56 	UINT8 *Rom;
57 	struct BurnRomInfo ri;
58 
59 	ri.nLen = 0;
60 	BurnDrvGetRomInfo(&ri, nNum);	// Find out how big the rom is
61 	if (ri.nLen <= 0) {
62 		return 1;
63 	}
64 
65 	// Load the rom
66 	Rom = (UINT8*)BurnMalloc(ri.nLen);
67 	if (Rom == NULL) {
68 		return 1;
69 	}
70 
71 	if (BurnLoadRom(Rom,nNum,1)) {
72 		BurnFree(Rom);
73 		return 1;
74 	}
75 
76 	// Success
77 	*pRom = Rom; *pnRomLen = ri.nLen;
78 	return 0;
79 }
80 
LoadUpSplit(UINT8 ** pRom,INT32 * pnRomLen,INT32 nNum,INT32 nNumRomsGroup)81 static INT32 LoadUpSplit(UINT8** pRom, INT32* pnRomLen, INT32 nNum, INT32 nNumRomsGroup)
82 {
83 	UINT8 *Rom;
84 	struct BurnRomInfo ri;
85 	UINT32 nRomSize[8], nTotalRomSize = 0;
86 	INT32 i;
87 
88 	ri.nLen = 0;
89 	for (i = 0; i < nNumRomsGroup; i++) {
90 		BurnDrvGetRomInfo(&ri, nNum + i);
91 		nRomSize[i] = ri.nLen;
92 	}
93 
94 	for (i = 0; i < nNumRomsGroup; i++) {
95 		nTotalRomSize += nRomSize[i];
96 	}
97 	if (!nTotalRomSize) return 1;
98 
99 	Rom = (UINT8*)BurnMalloc(nTotalRomSize);
100 	if (Rom == NULL) return 1;
101 
102 	INT32 Offset = 0;
103 	for (i = 0; i < nNumRomsGroup; i++) {
104 		if (i > 0) Offset += nRomSize[i - 1];
105 		if (BurnLoadRom(Rom + Offset, nNum + i, 1)) {
106 			BurnFree(Rom);
107 			return 1;
108 		}
109 	}
110 
111 	*pRom = Rom;
112 	*pnRomLen = nTotalRomSize;
113 
114 	return 0;
115 }
116 
117 // ----------------------------CPS1--------------------------------
118 // Load 1 rom and interleave in the CPS style:
119 // rom  : aa bb
120 // --ba --ba --ba --ba --ba --ba --ba --ba 8 pixels (four bytes)
121 //                                                  (skip four bytes)
122 
CpsLoadOne(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)123 static INT32 CpsLoadOne(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
124 {
125 	UINT8 *Rom = NULL; INT32 nRomLen=0;
126 	UINT8 *pt = NULL, *pr = NULL;
127 	INT32 i;
128 
129 	LoadUp(&Rom, &nRomLen, nNum);
130 	if (Rom == NULL) {
131 		return 1;
132 	}
133 
134 	nRomLen &= ~1;								// make sure even
135 
136 	for (i = 0, pt = Tile, pr = Rom; i < nRomLen; pt += 8) {
137 		UINT32 Pix;						// Eight pixels
138 		UINT8 b;
139 		b = *pr++; i++; Pix = SepTable[b];
140 		if (nWord) {
141 			b = *pr++; i++; Pix |= SepTable[b] << 1;
142 		}
143 
144 		Pix <<= nShift;
145 		*((UINT32 *)pt) |= Pix;
146 	}
147 
148 	BurnFree(Rom);
149 	return 0;
150 }
151 
CpsLoadOnePang(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)152 static INT32 CpsLoadOnePang(UINT8 *Tile,INT32 nNum,INT32 nWord,INT32 nShift)
153 {
154 	INT32 i=0;
155 	UINT8 *Rom = NULL; INT32 nRomLen = 0;
156 	UINT8 *pt = NULL, *pr = NULL;
157 
158 	LoadUp(&Rom, &nRomLen, nNum);
159 	if (Rom == NULL) {
160 		return 1;
161 	}
162 
163 	nRomLen &= ~1; // make sure even
164 
165 	for (i = 0x100000, pt = Tile, pr = Rom + 0x100000; i < nRomLen; pt += 8) {
166 		UINT32 Pix; // Eight pixels
167 		UINT8 b;
168 		b = *pr++; i++; Pix = SepTable[b];
169 		if (nWord) {
170 			b = *pr++; i++; Pix |= SepTable[b] << 1;
171 		}
172 
173 		Pix <<= nShift;
174 		*((UINT32 *)pt) |= Pix;
175 	}
176 
177 	BurnFree(Rom);
178 	return 0;
179 }
180 
CpsLoadOneHack160(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nType)181 static INT32 CpsLoadOneHack160(UINT8 *Tile, INT32 nNum, INT32 nWord, INT32 nType)
182 {
183 	INT32 i = 0, j = 0;
184 	UINT8 *Rom1 = NULL, *Rom2 = NULL;
185 	INT32 nRomLen1 = 0, nRomLen2 = 0;
186 	UINT8 *pt = NULL, *pr = NULL;
187 
188 	LoadUp(&Rom1, &nRomLen1, nNum);
189 	if (Rom1 == NULL) {
190 		return 1;
191 	}
192 	LoadUp(&Rom2, &nRomLen2, nNum + 1);
193 	if (Rom2 == NULL) {
194 		return 1;
195 	}
196 
197 	INT32 TileOffset[4] = { 0x000000, 0x000004, 0x200000, 0x200004 };
198 	if (nType == 1) {
199 		TileOffset[1] = 0x200000;
200 		TileOffset[2] = 0x000004;
201 	}
202 
203 	for (j = 0; j < 4; j++) {
204 		for (i = 0, pt = Tile + TileOffset[j], pr = Rom1 + (0x80000 * j); i < 0x80000; pt += 8) {
205 			UINT32 Pix;		// Eight pixels
206 			UINT8 b;
207 			b = *pr++; i++; Pix = SepTable[b];
208 			if (nWord) {
209 				b = *pr++; i++; Pix |= SepTable[b] << 1;
210 			}
211 
212 			Pix <<= 0;
213 			*((UINT32 *)pt) |= Pix;
214 		}
215 
216 		for (i = 0, pt = Tile + TileOffset[j], pr = Rom2 + (0x80000 * j); i < 0x80000; pt += 8) {
217 			UINT32 Pix;		// Eight pixels
218 			UINT8 b;
219 			b = *pr++; i++; Pix = SepTable[b];
220 			if (nWord) {
221 				b = *pr++; i++; Pix |= SepTable[b] << 1;
222 			}
223 
224 			Pix <<= 2;
225 			*((UINT32 *)pt) |= Pix;
226 		}
227 	}
228 
229 	BurnFree(Rom2);
230 	BurnFree(Rom1);
231 	return 0;
232 }
233 
CpsLoadOneBootleg(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)234 static INT32 CpsLoadOneBootleg(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
235 {
236 	UINT8 *Rom = NULL; INT32 nRomLen=0;
237 	UINT8 *pt = NULL, *pr = NULL;
238 	INT32 i;
239 
240 	LoadUp(&Rom, &nRomLen, nNum);
241 	if (Rom == NULL) {
242 		return 1;
243 	}
244 	nRomLen &= ~1;								// make sure even
245 
246 	for (i = 0, pt = Tile, pr = Rom; i < 0x40000; pt += 8) {
247 		UINT32 Pix;						// Eight pixels
248 		UINT8 b;
249 		b = *pr++; i++; Pix = SepTable[b];
250 		if (nWord) {
251 			b = *pr++; i++; Pix |= SepTable[b] << 1;
252 		}
253 
254 		Pix <<= nShift;
255 		*((UINT32 *)pt) |= Pix;
256 	}
257 
258 	for (i = 0, pt = Tile + 4, pr = Rom + 0x40000; i < 0x40000; pt += 8) {
259 		UINT32 Pix;						// Eight pixels
260 		UINT8 b;
261 		b = *pr++; i++; Pix = SepTable[b];
262 		if (nWord) {
263 			b = *pr++; i++; Pix |= SepTable[b] << 1;
264 		}
265 
266 		Pix <<= nShift;
267 		*((UINT32 *)pt) |= Pix;
268 	}
269 
270 	BurnFree(Rom);
271 	return 0;
272 }
273 
CpsLoadOneBootlegSmallSingle(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)274 static INT32 CpsLoadOneBootlegSmallSingle(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
275 {
276 	UINT8 *Rom = NULL; INT32 nRomLen=0;
277 	UINT8 *pt = NULL, *pr = NULL;
278 	INT32 i;
279 
280 	LoadUp(&Rom, &nRomLen, nNum);
281 	if (Rom == NULL) {
282 		return 1;
283 	}
284 	nRomLen &= ~1;								// make sure even
285 
286 	for (i = 0, pt = Tile, pr = Rom; i < 0x40000; pt += 8) {
287 		UINT32 Pix;						// Eight pixels
288 		UINT8 b;
289 		b = *pr++; i++; Pix = SepTable[b];
290 		if (nWord) {
291 			b = *pr++; i++; Pix |= SepTable[b] << 1;
292 		}
293 
294 		Pix <<= nShift;
295 		*((UINT32 *)pt) |= Pix;
296 	}
297 
298 	BurnFree(Rom);
299 	return 0;
300 }
301 
CpsLoadOneBootlegType2(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)302 static INT32 CpsLoadOneBootlegType2(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
303 {
304 	UINT8 *Rom = NULL; INT32 nRomLen=0;
305 	UINT8 *pt = NULL, *pr = NULL;
306 	INT32 i;
307 
308 	LoadUp(&Rom, &nRomLen, nNum);
309 	if (Rom == NULL) {
310 		return 1;
311 	}
312 	nRomLen &= ~1;								// make sure even
313 
314 	for (i = 0, pt = Tile, pr = Rom; i < 0x40000; pt += 8) {
315 		UINT32 Pix;						// Eight pixels
316 		UINT8 b;
317 		b = *pr++; i++; Pix = SepTable[b];
318 		if (nWord) {
319 			b = *pr++; i++; Pix |= SepTable[b] << 1;
320 		}
321 
322 		Pix <<= nShift;
323 		*((UINT32 *)pt) |= Pix;
324 	}
325 
326 	for (i = 0, pt = Tile + 4, pr = Rom + 0x40000; i < 0x40000; pt += 8) {
327 		UINT32 Pix;						// Eight pixels
328 		UINT8 b;
329 		b = *pr++; i++; Pix = SepTable[b];
330 		if (nWord) {
331 			b = *pr++; i++; Pix |= SepTable[b] << 1;
332 		}
333 
334 		Pix <<= nShift;
335 		*((UINT32 *)pt) |= Pix;
336 	}
337 
338 	for (i = 0, pt = Tile + 0x200000, pr = Rom + 0x80000; i < 0x40000; pt += 8) {
339 		UINT32 Pix;						// Eight pixels
340 		UINT8 b;
341 		b = *pr++; i++; Pix = SepTable[b];
342 		if (nWord) {
343 			b = *pr++; i++; Pix |= SepTable[b] << 1;
344 		}
345 
346 		Pix <<= nShift;
347 		*((UINT32 *)pt) |= Pix;
348 	}
349 
350 	for (i = 0, pt = Tile + 0x200004, pr = Rom + 0xc0000; i < 0x40000; pt += 8) {
351 		UINT32 Pix;						// Eight pixels
352 		UINT8 b;
353 		b = *pr++; i++; Pix = SepTable[b];
354 		if (nWord) {
355 			b = *pr++; i++; Pix |= SepTable[b] << 1;
356 		}
357 
358 		Pix <<= nShift;
359 		*((UINT32 *)pt) |= Pix;
360 	}
361 
362 	BurnFree(Rom);
363 	return 0;
364 }
365 
CpsLoadOneBootlegType2Small(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)366 static INT32 CpsLoadOneBootlegType2Small(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
367 {
368 	UINT8 *Rom = NULL; INT32 nRomLen=0;
369 	UINT8 *pt = NULL, *pr = NULL;
370 	INT32 i;
371 
372 	LoadUp(&Rom, &nRomLen, nNum);
373 	if (Rom == NULL) {
374 		return 1;
375 	}
376 	nRomLen &= ~1;								// make sure even
377 
378 	for (i = 0, pt = Tile, pr = Rom; i < 0x40000; pt += 8) {
379 		UINT32 Pix;						// Eight pixels
380 		UINT8 b;
381 		b = *pr++; i++; Pix = SepTable[b];
382 		if (nWord) {
383 			b = *pr++; i++; Pix |= SepTable[b] << 1;
384 		}
385 
386 		Pix <<= nShift;
387 		*((UINT32 *)pt) |= Pix;
388 	}
389 
390 	for (i = 0, pt = Tile + 4, pr = Rom + 0x40000; i < 0x40000; pt += 8) {
391 		UINT32 Pix;						// Eight pixels
392 		UINT8 b;
393 		b = *pr++; i++; Pix = SepTable[b];
394 		if (nWord) {
395 			b = *pr++; i++; Pix |= SepTable[b] << 1;
396 		}
397 
398 		Pix <<= nShift;
399 		*((UINT32 *)pt) |= Pix;
400 	}
401 
402 	BurnFree(Rom);
403 	return 0;
404 }
405 
CpsLoadOneBootlegType2SmallSingle(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)406 static INT32 CpsLoadOneBootlegType2SmallSingle(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
407 {
408 	UINT8 *Rom = NULL; INT32 nRomLen=0;
409 	UINT8 *pt = NULL, *pr = NULL;
410 	INT32 i;
411 
412 	LoadUp(&Rom, &nRomLen, nNum);
413 	if (Rom == NULL) {
414 		return 1;
415 	}
416 	nRomLen &= ~1;								// make sure even
417 
418 	for (i = 0, pt = Tile, pr = Rom; i < 0x40000; pt += 8) {
419 		UINT32 Pix;						// Eight pixels
420 		UINT8 b;
421 		b = *pr++; i++; Pix = SepTable[b];
422 		if (nWord) {
423 			b = *pr++; i++; Pix |= SepTable[b] << 1;
424 		}
425 
426 		Pix <<= nShift;
427 		*((UINT32 *)pt) |= Pix;
428 	}
429 
430 	BurnFree(Rom);
431 	return 0;
432 }
433 
CpsLoadOneBootlegType3(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)434 static INT32 CpsLoadOneBootlegType3(UINT8 *Tile, INT32 nNum, INT32 nWord, INT32 nShift)
435 {
436 	UINT8 *Rom = NULL; INT32 nRomLen=0;
437 	UINT8 *pt = NULL, *pr = NULL;
438 	INT32 i;
439 
440 	LoadUp(&Rom, &nRomLen, nNum);
441 	if (Rom == NULL) {
442 		return 1;
443 	}
444 	nRomLen &= ~1;								// make sure even
445 
446 	for (i = 0, pt = Tile, pr = Rom; i < nRomLen; pt += 4) {
447 		UINT32 Pix;						// Eight pixels
448 		UINT8 b;
449 		b = *pr++; i++; Pix = SepTable[b];
450 		if (nWord) {
451 			b = *pr++; i++; Pix |= SepTable[b] << 1;
452 		}
453 
454 		Pix <<= nShift;
455 		*((UINT32 *)pt) |= Pix;
456 	}
457 
458 	BurnFree(Rom);
459 	return 0;
460 }
461 
CpsLoadOneBootlegType3Swap(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)462 static INT32 CpsLoadOneBootlegType3Swap(UINT8 *Tile, INT32 nNum, INT32 nWord, INT32 nShift)
463 {
464 	UINT8 *Rom = NULL; int nRomLen=0;
465 	UINT8 *pt = NULL, *pr = NULL;
466 	INT32 i;
467 
468 	LoadUp(&Rom, &nRomLen, nNum);
469 	if (Rom == NULL) {
470 		return 1;
471 	}
472 	nRomLen &= ~1;								// make sure even
473 
474 	for (i = 0, pt = Tile, pr = Rom; i < nRomLen; pt += 4) {
475 		UINT32 Pix;						// Eight pixels
476 		UINT8 b;
477 		b = *pr++; i++; Pix = SepTable[b];
478 		if (nWord) {
479 			b = *pr++; i++; Pix |= SepTable[b] << 1;
480 		}
481 
482 		Pix <<= nShift;
483 		*((UINT32 *)pt) |= Pix;
484 
485 		b = *pr++; i++; Pix = SepTable[b];
486 		if (nWord) {
487 			b = *pr++; i++; Pix |= SepTable[b] << 1;
488 		}
489 
490 		Pix <<= (nShift + 1);
491 		*((UINT32 *)pt) |= Pix;
492 	}
493 
494 	BurnFree(Rom);
495 	return 0;
496 }
497 
CpsLoadOneBootlegSwap(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)498 static INT32 CpsLoadOneBootlegSwap(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
499 {
500 	UINT8 *Rom = NULL; INT32 nRomLen=0;
501 	UINT8 *pt = NULL, *pr = NULL;
502 	INT32 i;
503 
504 	LoadUp(&Rom, &nRomLen, nNum);
505 	if (Rom == NULL) {
506 		return 1;
507 	}
508 	nRomLen &= ~1;								// make sure even
509 
510 	for (i = 0, pt = Tile + 4, pr = Rom; i < 0x40000; pt += 8) {
511 		UINT32 Pix;						// Eight pixels
512 		UINT8 b;
513 		b = *pr++; i++; Pix = SepTable[b];
514 		if (nWord) {
515 			b = *pr++; i++; Pix |= SepTable[b] << 1;
516 		}
517 
518 		Pix <<= nShift;
519 		*((UINT32 *)pt) |= Pix;
520 	}
521 
522 	for (i = 0, pt = Tile + 0, pr = Rom + 0x40000; i < 0x40000; pt += 8) {
523 		UINT32 Pix;						// Eight pixels
524 		UINT8 b;
525 		b = *pr++; i++; Pix = SepTable[b];
526 		if (nWord) {
527 			b = *pr++; i++; Pix |= SepTable[b] << 1;
528 		}
529 
530 		Pix <<= nShift;
531 		*((UINT32 *)pt) |= Pix;
532 	}
533 
534 	BurnFree(Rom);
535 	return 0;
536 }
537 
CpsLoadOneSf2ebbl(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)538 static INT32 CpsLoadOneSf2ebbl(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
539 {
540 	UINT8 *Rom = NULL; INT32 nRomLen=0;
541 	UINT8 *pt = NULL, *pr = NULL;
542 	INT32 i;
543 
544 	LoadUp(&Rom, &nRomLen, nNum);
545 	if (Rom == NULL) {
546 		return 1;
547 	}
548 	nRomLen &= ~1;								// make sure even
549 
550 	for (i = 0, pt = Tile, pr = Rom; i < 0x10000; pt += 8) {
551 		UINT32 Pix;						// Eight pixels
552 		UINT8 b;
553 		b = *pr++; i++; Pix = SepTable[b];
554 		if (nWord) {
555 			b = *pr++; i++; Pix |= SepTable[b] << 1;
556 		}
557 
558 		Pix <<= nShift;
559 		*((UINT32 *)pt) |= Pix;
560 	}
561 
562 	for (i = 0, pt = Tile + 4, pr = Rom + 0x10000; i < 0x10000; pt += 8) {
563 		UINT32 Pix;						// Eight pixels
564 		UINT8 b;
565 		b = *pr++; i++; Pix = SepTable[b];
566 		if (nWord) {
567 			b = *pr++; i++; Pix |= SepTable[b] << 1;
568 		}
569 
570 		Pix <<= nShift;
571 		*((UINT32 *)pt) |= Pix;
572 	}
573 
574 	BurnFree(Rom);
575 	return 0;
576 }
577 
CpsLoadOneSf2b(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)578 static INT32 CpsLoadOneSf2b(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
579 {
580 	UINT8 *Rom = NULL; INT32 nRomLen=0;
581 	UINT8 *pt = NULL, *pr = NULL;
582 	INT32 i;
583 
584 	LoadUp(&Rom, &nRomLen, nNum);
585 	if (Rom == NULL) {
586 		return 1;
587 	}
588 	nRomLen &= ~1;								// make sure even
589 
590 	for (i = 0, pt = Tile + 4, pr = Rom; i < 0x10000; pt += 8) {
591 		UINT32 Pix;						// Eight pixels
592 		UINT8 b;
593 		b = *pr++; i++; Pix = SepTable[b];
594 		if (nWord) {
595 			b = *pr++; i++; Pix |= SepTable[b] << 1;
596 		}
597 
598 		Pix <<= nShift;
599 		*((UINT32 *)pt) |= Pix;
600 	}
601 
602 	for (i = 0, pt = Tile, pr = Rom + 0x10000; i < 0x10000; pt += 8) {
603 		UINT32 Pix;						// Eight pixels
604 		UINT8 b;
605 		b = *pr++; i++; Pix = SepTable[b];
606 		if (nWord) {
607 			b = *pr++; i++; Pix |= SepTable[b] << 1;
608 		}
609 
610 		Pix <<= nShift;
611 		*((UINT32 *)pt) |= Pix;
612 	}
613 
614 	BurnFree(Rom);
615 	return 0;
616 }
617 
CpsLoadOneSf2koryu(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)618 static INT32 CpsLoadOneSf2koryu(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
619 {
620 	UINT8 *Rom = NULL; INT32 nRomLen=0;
621 	UINT8 *pt = NULL, *pr = NULL;
622 	INT32 i;
623 
624 	LoadUp(&Rom, &nRomLen, nNum);
625 	if (Rom == NULL) {
626 		return 1;
627 	}
628 
629 	nRomLen &= ~1;								// make sure even
630 
631 	for (i = 0, pt = Tile, pr = Rom; i < nRomLen >> 1; pt += 8) {
632 		UINT32 Pix;						// Eight pixels
633 		UINT8 b;
634 		b = *pr++; i++; Pix = SepTable[b];
635 		if (nWord) {
636 			b = *pr++; i++; Pix |= SepTable[b] << 1;
637 		}
638 
639 		Pix <<= nShift;
640 		*((UINT32 *)pt) |= Pix;
641 	}
642 
643 	Tile += 4;
644 
645 	for (i = 0, pt = Tile, pr = Rom + (nRomLen >> 1); i < nRomLen >> 1; pt += 8) {
646 		UINT32 Pix;						// Eight pixels
647 		UINT8 b;
648 		b = *pr++; i++; Pix = SepTable[b];
649 		if (nWord) {
650 			b = *pr++; i++; Pix |= SepTable[b] << 1;
651 		}
652 
653 		Pix <<= nShift;
654 		*((UINT32 *)pt) |= Pix;
655 	}
656 
657 	BurnFree(Rom);
658 	return 0;
659 }
660 
CpsLoadOneSf2stt(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)661 static INT32 CpsLoadOneSf2stt(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
662 {
663 	UINT8 *Rom = NULL; INT32 nRomLen=0;
664 	UINT8 *pt = NULL, *pr = NULL;
665 	INT32 i;
666 
667 	LoadUp(&Rom, &nRomLen, nNum);
668 	if (Rom == NULL) {
669 		return 1;
670 	}
671 
672 	nRomLen &= ~1;								// make sure even
673 
674 	for (i = 0, pt = Tile, pr = Rom + (nRomLen >> 1); i < nRomLen >> 1; pt += 8) {
675 		UINT32 Pix;						// Eight pixels
676 		UINT8 b;
677 		b = *pr++; i++; Pix = SepTable[b];
678 		if (nWord) {
679 			b = *pr++; i++; Pix |= SepTable[b] << 1;
680 		}
681 
682 		Pix <<= nShift;
683 		*((UINT32 *)pt) |= Pix;
684 	}
685 
686 	Tile += 4;
687 
688 	for (i = 0, pt = Tile, pr = Rom; i < nRomLen >> 1; pt += 8) {
689 		UINT32 Pix;						// Eight pixels
690 		UINT8 b;
691 		b = *pr++; i++; Pix = SepTable[b];
692 		if (nWord) {
693 			b = *pr++; i++; Pix |= SepTable[b] << 1;
694 		}
695 
696 		Pix <<= nShift;
697 		*((UINT32 *)pt) |= Pix;
698 	}
699 
700 	BurnFree(Rom);
701 	return 0;
702 }
703 
CpsLoadOneWonder3b(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)704 static INT32 CpsLoadOneWonder3b(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
705 {
706 	UINT8 *Rom = NULL; INT32 nRomLen=0;
707 	UINT8 *pt = NULL, *pr = NULL;
708 	INT32 i;
709 
710 	LoadUp(&Rom, &nRomLen, nNum);
711 	if (Rom == NULL) {
712 		return 1;
713 	}
714 
715 	nRomLen &= ~1;								// make sure even
716 
717 	for (i = 0, pt = Tile, pr = Rom; i < (nRomLen >> 1); pt += 8) {
718 		UINT32 Pix;						// Eight pixels
719 		UINT8 b;
720 		b = *pr++; i++; Pix = SepTable[b];
721 		if (nWord) {
722 			b = *pr++; i++; Pix |= SepTable[b] << 1;
723 		}
724 
725 		Pix <<= nShift;
726 		*((UINT32 *)pt) |= Pix;
727 	}
728 
729 	for (i = 0, pt = Tile + 0x200000, pr = Rom + 0x40000; i < (nRomLen >> 1); pt += 8) {
730 		UINT32 Pix;						// Eight pixels
731 		UINT8 b;
732 		b = *pr++; i++; Pix = SepTable[b];
733 		if (nWord) {
734 			b = *pr++; i++; Pix |= SepTable[b] << 1;
735 		}
736 
737 		Pix <<= nShift;
738 		*((UINT32 *)pt) |= Pix;
739 	}
740 
741 	BurnFree(Rom);
742 	return 0;
743 }
744 
CpsLoadPunisherbTiles(UINT8 * Tile,INT32 nNum)745 static INT32 CpsLoadPunisherbTiles(UINT8* Tile, INT32 nNum)
746 {
747 	UINT8 *Rom = (UINT8*)BurnMalloc(0x400000 * sizeof(UINT8));
748 	UINT8 *pt = NULL, *pr = NULL;
749 	INT32 i, j;
750 
751 	if (Rom == NULL) {
752 		return 1;
753 	}
754 
755 	if (BurnLoadRom(Rom + 0x000000, nNum + 0, 2)) {
756 		BurnFree(Rom);
757 		return 1;
758 	}
759 
760 	if (BurnLoadRom(Rom + 0x000001, nNum + 1, 2)) {
761 		BurnFree(Rom);
762 		return 1;
763 	}
764 
765 	if (BurnLoadRom(Rom + 0x100000, nNum + 2, 2)) {
766 		BurnFree(Rom);
767 		return 1;
768 	}
769 
770 	if (BurnLoadRom(Rom + 0x100001, nNum + 3, 2)) {
771 		BurnFree(Rom);
772 		return 1;
773 	}
774 
775 	if (BurnLoadRom(Rom + 0x200000, nNum + 4, 2)) {
776 		BurnFree(Rom);
777 		return 1;
778 	}
779 
780 	if (BurnLoadRom(Rom + 0x200001, nNum + 5, 2)) {
781 		BurnFree(Rom);
782 		return 1;
783 	}
784 
785 	if (BurnLoadRom(Rom + 0x300000, nNum + 6, 2)) {
786 		BurnFree(Rom);
787 		return 1;
788 	}
789 
790 	if (BurnLoadRom(Rom + 0x300001, nNum + 7, 2)) {
791 		BurnFree(Rom);
792 		return 1;
793 	}
794 
795 	INT32 TileOffset[4] = { 0x000000, 0x200000, 0x000004, 0x200004 };
796 
797 	for (j = 0; j < 4; j++) {
798 		for (i = 0, pt = Tile + TileOffset[j], pr = Rom + (0x80000 * j); i < 0x80000; pt += 8) {
799 			UINT32 Pix;		// Eight pixels
800 			UINT8 b;
801 			b = *pr++; i++; Pix = SepTable[b];
802 			b = *pr++; i++; Pix |= SepTable[b] << 1;
803 
804 			Pix <<= 0;
805 			*((UINT32 *)pt) |= Pix;
806 		}
807 
808 		for (i = 0, pt = Tile + TileOffset[j], pr = Rom + 0x200000 +  (0x80000 * j); i < 0x80000; pt += 8) {
809 			UINT32 Pix;		// Eight pixels
810 			UINT8 b;
811 			b = *pr++; i++; Pix = SepTable[b];
812 			b = *pr++; i++; Pix |= SepTable[b] << 1;
813 
814 			Pix <<= 2;
815 			*((UINT32 *)pt) |= Pix;
816 		}
817 	}
818 
819 	BurnFree(Rom);
820 	return 0;
821 }
822 
CpsLoadSf2ceuab3Tiles(UINT8 * Tile,INT32 nNum)823 static INT32 CpsLoadSf2ceuab3Tiles(UINT8* Tile, INT32 nNum)
824 {
825 	UINT8 *Rom = (UINT8*)BurnMalloc(0x200000 * sizeof(UINT8));
826 	UINT8 *Temp = (UINT8*)BurnMalloc(0x200000 * sizeof(UINT8));
827 	UINT8 *pt = NULL, *pr = NULL;
828 	INT32 i;
829 
830 	if (Rom == NULL) {
831 		return 1;
832 	}
833 
834 	if (BurnLoadRom(Temp + 0x000000, nNum + 0, 1)) {
835 		BurnFree(Rom);
836 		return 1;
837 	}
838 
839 	if (BurnLoadRom(Temp + 0x100000, nNum + 1, 1)) {
840 		BurnFree(Rom);
841 		return 1;
842 	}
843 
844 	for (i = 0; i < 0x100000; i += 2) {
845 		Rom[i + 0x000000] = Temp[i + 0x000000];
846 		Rom[i + 0x000001] = Temp[i + 0x100000];
847 		Rom[i + 0x100000] = Temp[i + 0x000001];
848 		Rom[i + 0x100001] = Temp[i + 0x100001];
849 	}
850 
851 	BurnFree(Temp);
852 
853 	for (i = 0, pt = Tile, pr = Rom; i < 0x80000; pt += 8) {
854 		UINT32 Pix;						// Eight pixels
855 		UINT8 b;
856 		b = *pr++; i++; Pix = SepTable[b];
857 		b = *pr++; i++; Pix |= SepTable[b] << 1;
858 
859 		Pix <<= 0;
860 		*((UINT32 *)pt) |= Pix;
861 	}
862 
863 	for (i = 0, pt = Tile + 4, pr = Rom + 0x80000; i < 0x80000; pt += 8) {
864 		UINT32 Pix;						// Eight pixels
865 		UINT8 b;
866 		b = *pr++; i++; Pix = SepTable[b];
867 		b = *pr++; i++; Pix |= SepTable[b] << 1;
868 
869 		Pix <<= 0;
870 		*((UINT32 *)pt) |= Pix;
871 	}
872 
873 	for (i = 0, pt = Tile, pr = Rom + 0x100000; i < 0x80000; pt += 8) {
874 		UINT32 Pix;						// Eight pixels
875 		UINT8 b;
876 		b = *pr++; i++; Pix = SepTable[b];
877 		b = *pr++; i++; Pix |= SepTable[b] << 1;
878 
879 		Pix <<= 2;
880 		*((UINT32 *)pt) |= Pix;
881 	}
882 
883 	for (i = 0, pt = Tile + 4, pr = Rom + 0x180000; i < 0x80000; pt += 8) {
884 		UINT32 Pix;						// Eight pixels
885 		UINT8 b;
886 		b = *pr++; i++; Pix = SepTable[b];
887 		b = *pr++; i++; Pix |= SepTable[b] << 1;
888 
889 		Pix <<= 2;
890 		*((UINT32 *)pt) |= Pix;
891 	}
892 
893 	BurnFree(Rom);
894 	return 0;
895 }
896 
CpsLoadSf2ceeablTiles(UINT8 * Tile,INT32 nNum)897 static INT32 CpsLoadSf2ceeablTiles(UINT8* Tile, INT32 nNum)
898 {
899 	UINT8 *Rom = (UINT8*)BurnMalloc(0x200000 * sizeof(UINT8));
900 	UINT8 *Temp = (UINT8*)BurnMalloc(0x200000 * sizeof(UINT8));
901 	UINT8 *pt = NULL, *pr = NULL;
902 	INT32 i;
903 
904 	if (Rom == NULL) {
905 		return 1;
906 	}
907 
908 	if (BurnLoadRom(Temp + 0x000000, nNum + 0, 2)) {
909 		BurnFree(Rom);
910 		return 1;
911 	}
912 
913 	if (BurnLoadRom(Temp + 0x000001, nNum + 1, 2)) {
914 		BurnFree(Rom);
915 		return 1;
916 	}
917 
918 	if (BurnLoadRom(Temp + 0x100000, nNum + 2, 2)) {
919 		BurnFree(Rom);
920 		return 1;
921 	}
922 
923 	if (BurnLoadRom(Temp + 0x100001, nNum + 3, 2)) {
924 		BurnFree(Rom);
925 		return 1;
926 	}
927 
928 	for (i = 0; i < 0x100000; i += 2) {
929 		Rom[i + 0x000000] = Temp[i + 0x000000];
930 		Rom[i + 0x000001] = Temp[i + 0x100000];
931 		Rom[i + 0x100000] = Temp[i + 0x000001];
932 		Rom[i + 0x100001] = Temp[i + 0x100001];
933 	}
934 
935 	BurnFree(Temp);
936 
937 	for (i = 0, pt = Tile, pr = Rom; i < 0x80000; pt += 8) {
938 		UINT32 Pix;						// Eight pixels
939 		UINT8 b;
940 		b = *pr++; i++; Pix = SepTable[b];
941 		b = *pr++; i++; Pix |= SepTable[b] << 1;
942 
943 		Pix <<= 0;
944 		*((UINT32 *)pt) |= Pix;
945 	}
946 
947 	for (i = 0, pt = Tile + 4, pr = Rom + 0x80000; i < 0x80000; pt += 8) {
948 		UINT32 Pix;						// Eight pixels
949 		UINT8 b;
950 		b = *pr++; i++; Pix = SepTable[b];
951 		b = *pr++; i++; Pix |= SepTable[b] << 1;
952 
953 		Pix <<= 0;
954 		*((UINT32 *)pt) |= Pix;
955 	}
956 
957 	for (i = 0, pt = Tile, pr = Rom + 0x100000; i < 0x80000; pt += 8) {
958 		UINT32 Pix;						// Eight pixels
959 		UINT8 b;
960 		b = *pr++; i++; Pix = SepTable[b];
961 		b = *pr++; i++; Pix |= SepTable[b] << 1;
962 
963 		Pix <<= 2;
964 		*((UINT32 *)pt) |= Pix;
965 	}
966 
967 	for (i = 0, pt = Tile + 4, pr = Rom + 0x180000; i < 0x80000; pt += 8) {
968 		UINT32 Pix;						// Eight pixels
969 		UINT8 b;
970 		b = *pr++; i++; Pix = SepTable[b];
971 		b = *pr++; i++; Pix |= SepTable[b] << 1;
972 
973 		Pix <<= 2;
974 		*((UINT32 *)pt) |= Pix;
975 	}
976 
977 	BurnFree(Rom);
978 	return 0;
979 }
980 
CpsLoadSf2ceuab7Tiles(UINT8 * Tile,INT32 nNum)981 static INT32 CpsLoadSf2ceuab7Tiles(UINT8* Tile, INT32 nNum)
982 {
983 	UINT8 *Rom = (UINT8*)BurnMalloc(0x200000 * sizeof(UINT8));
984 	UINT8 *Temp = (UINT8*)BurnMalloc(0x200000 * sizeof(UINT8));
985 	UINT8 *pt = NULL, *pr = NULL;
986 	INT32 i;
987 
988 	if (Rom == NULL) {
989 		return 1;
990 	}
991 
992 	if (BurnLoadRom(Temp + 0x000000, nNum + 0, 2)) {
993 		BurnFree(Rom);
994 		return 1;
995 	}
996 
997 	if (BurnLoadRom(Temp + 0x080000, nNum + 1, 2)) {
998 		BurnFree(Rom);
999 		return 1;
1000 	}
1001 
1002 	if (BurnLoadRom(Temp + 0x000001, nNum + 2, 2)) {
1003 		BurnFree(Rom);
1004 		return 1;
1005 	}
1006 
1007 	if (BurnLoadRom(Temp + 0x080001, nNum + 3, 2)) {
1008 		BurnFree(Rom);
1009 		return 1;
1010 	}
1011 
1012 	if (BurnLoadRom(Temp + 0x100000, nNum + 4, 2)) {
1013 		BurnFree(Rom);
1014 		return 1;
1015 	}
1016 
1017 	if (BurnLoadRom(Temp + 0x180000, nNum + 5, 2)) {
1018 		BurnFree(Rom);
1019 		return 1;
1020 	}
1021 
1022 	if (BurnLoadRom(Temp + 0x100001, nNum + 6, 2)) {
1023 		BurnFree(Rom);
1024 		return 1;
1025 	}
1026 
1027 	if (BurnLoadRom(Temp + 0x180001, nNum + 7, 2)) {
1028 		BurnFree(Rom);
1029 		return 1;
1030 	}
1031 
1032 	for (i = 0; i < 0x100000; i += 2) {
1033 		Rom[i + 0x000000] = Temp[i + 0x000000];
1034 		Rom[i + 0x000001] = Temp[i + 0x100000];
1035 		Rom[i + 0x100000] = Temp[i + 0x000001];
1036 		Rom[i + 0x100001] = Temp[i + 0x100001];
1037 	}
1038 
1039 	BurnFree(Temp);
1040 
1041 	for (i = 0, pt = Tile, pr = Rom; i < 0x80000; pt += 8) {
1042 		UINT32 Pix;						// Eight pixels
1043 		UINT8 b;
1044 		b = *pr++; i++; Pix = SepTable[b];
1045 		b = *pr++; i++; Pix |= SepTable[b] << 1;
1046 
1047 		Pix <<= 0;
1048 		*((UINT32 *)pt) |= Pix;
1049 	}
1050 
1051 	for (i = 0, pt = Tile + 4, pr = Rom + 0x80000; i < 0x80000; pt += 8) {
1052 		UINT32 Pix;						// Eight pixels
1053 		UINT8 b;
1054 		b = *pr++; i++; Pix = SepTable[b];
1055 		b = *pr++; i++; Pix |= SepTable[b] << 1;
1056 
1057 		Pix <<= 0;
1058 		*((UINT32 *)pt) |= Pix;
1059 	}
1060 
1061 	for (i = 0, pt = Tile, pr = Rom + 0x100000; i < 0x80000; pt += 8) {
1062 		UINT32 Pix;						// Eight pixels
1063 		UINT8 b;
1064 		b = *pr++; i++; Pix = SepTable[b];
1065 		b = *pr++; i++; Pix |= SepTable[b] << 1;
1066 
1067 		Pix <<= 2;
1068 		*((UINT32 *)pt) |= Pix;
1069 	}
1070 
1071 	for (i = 0, pt = Tile + 4, pr = Rom + 0x180000; i < 0x80000; pt += 8) {
1072 		UINT32 Pix;						// Eight pixels
1073 		UINT8 b;
1074 		b = *pr++; i++; Pix = SepTable[b];
1075 		b = *pr++; i++; Pix |= SepTable[b] << 1;
1076 
1077 		Pix <<= 2;
1078 		*((UINT32 *)pt) |= Pix;
1079 	}
1080 
1081 	BurnFree(Rom);
1082 	return 0;
1083 }
1084 
CpsLoadTiles(UINT8 * Tile,INT32 nStart)1085 INT32 CpsLoadTiles(UINT8* Tile, INT32 nStart)
1086 {
1087 	// left  side of 16x16 tiles
1088 	CpsLoadOne(Tile,     nStart    , 1, 0);
1089 	CpsLoadOne(Tile,     nStart + 1, 1, 2);
1090 	// right side of 16x16 tiles
1091 	CpsLoadOne(Tile + 4, nStart + 2, 1, 0);
1092 	CpsLoadOne(Tile + 4, nStart + 3, 1, 2);
1093 	return 0;
1094 }
1095 
CpsLoadTilesByte(UINT8 * Tile,INT32 nStart)1096 INT32 CpsLoadTilesByte(UINT8* Tile, INT32 nStart)
1097 {
1098 	CpsLoadOne(Tile,     nStart + 0, 0, 0);
1099 	CpsLoadOne(Tile,     nStart + 1, 0, 1);
1100 	CpsLoadOne(Tile,     nStart + 2, 0, 2);
1101 	CpsLoadOne(Tile,     nStart + 3, 0, 3);
1102 	CpsLoadOne(Tile + 4, nStart + 4, 0, 0);
1103 	CpsLoadOne(Tile + 4, nStart + 5, 0, 1);
1104 	CpsLoadOne(Tile + 4, nStart + 6, 0, 2);
1105 	CpsLoadOne(Tile + 4, nStart + 7, 0, 3);
1106 	return 0;
1107 }
1108 
CpsLoadTilesForgottn(INT32 nStart)1109 INT32 CpsLoadTilesForgottn(INT32 nStart)
1110 {
1111 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  0, 0, 0);
1112 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  1, 0, 1);
1113 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  2, 1, 2);
1114 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  3, 0, 0);
1115 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  4, 0, 1);
1116 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  5, 0, 2);
1117 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  6, 0, 3);
1118 	CpsLoadOne(CpsGfx + 0 + 0x100000, nStart +  7, 0, 0);
1119 	CpsLoadOne(CpsGfx + 0 + 0x100000, nStart +  8, 0, 1);
1120 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart +  9, 0, 0);
1121 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart + 10, 0, 1);
1122 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart + 11, 0, 2);
1123 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart + 12, 0, 3);
1124 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 13, 1, 0);
1125 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 14, 0, 2);
1126 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 15, 0, 3);
1127 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 16, 1, 0);
1128 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 17, 0, 2);
1129 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 18, 0, 3);
1130 	CpsLoadOne(CpsGfx + 0 + 0x300000, nStart + 19, 0, 2);
1131 	CpsLoadOne(CpsGfx + 0 + 0x300000, nStart + 20, 0, 3);
1132 	CpsLoadOne(CpsGfx + 4 + 0x300000, nStart + 21, 0, 2);
1133 	CpsLoadOne(CpsGfx + 4 + 0x300000, nStart + 22, 0, 3);
1134 
1135 	return 0;
1136 }
1137 
CpsLoadTilesForgottna(INT32 nStart)1138 INT32 CpsLoadTilesForgottna(INT32 nStart)
1139 {
1140 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  0, 0, 0);
1141 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  1, 0, 1);
1142 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  2, 1, 2);
1143 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  3, 1, 0);
1144 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  4, 0, 2);
1145 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  5, 0, 3);
1146 	CpsLoadOne(CpsGfx + 0 + 0x100000, nStart +  6, 0, 0);
1147 	CpsLoadOne(CpsGfx + 0 + 0x100000, nStart +  7, 0, 1);
1148 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart +  8, 0, 2);
1149 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart +  9, 0, 3);
1150 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 10, 1, 0);
1151 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 11, 0, 2);
1152 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 12, 0, 3);
1153 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 13, 1, 0);
1154 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 14, 0, 2);
1155 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 15, 0, 3);
1156 	CpsLoadOne(CpsGfx + 0 + 0x300000, nStart + 16, 0, 2);
1157 	CpsLoadOne(CpsGfx + 0 + 0x300000, nStart + 17, 0, 3);
1158 	CpsLoadOne(CpsGfx + 4 + 0x300000, nStart + 18, 0, 2);
1159 	CpsLoadOne(CpsGfx + 4 + 0x300000, nStart + 19, 0, 3);
1160 
1161 	return 0;
1162 }
1163 
CpsLoadTilesForgottnu(INT32 nStart)1164 INT32 CpsLoadTilesForgottnu(INT32 nStart)
1165 {
1166 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  0, 0, 0);
1167 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  1, 0, 1);
1168 	CpsLoadOne(CpsGfx + 0 + 0x000000, nStart +  2, 1, 2);
1169 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  3, 1, 0);
1170 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  4, 0, 2);
1171 	CpsLoadOne(CpsGfx + 4 + 0x000000, nStart +  5, 0, 3);
1172 	CpsLoadOne(CpsGfx + 0 + 0x100000, nStart +  6, 0, 0);
1173 	CpsLoadOne(CpsGfx + 0 + 0x100000, nStart +  7, 0, 1);
1174 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart +  8, 0, 2);
1175 	CpsLoadOne(CpsGfx + 4 + 0x100000, nStart +  9, 0, 3);
1176 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 10, 1, 0);
1177 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 11, 0, 2);
1178 	CpsLoadOne(CpsGfx + 0 + 0x200000, nStart + 12, 0, 3);
1179 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 13, 1, 0);
1180 	CpsLoadOne(CpsGfx + 4 + 0x200000, nStart + 14, 1, 2);
1181 	CpsLoadOne(CpsGfx + 0 + 0x300000, nStart + 15, 0, 2);
1182 	CpsLoadOne(CpsGfx + 0 + 0x300000, nStart + 16, 0, 3);
1183 
1184 	return 0;
1185 }
1186 
CpsLoadTilesPang(UINT8 * Tile,INT32 nStart)1187 INT32 CpsLoadTilesPang(UINT8* Tile, INT32 nStart)
1188 {
1189 	CpsLoadOne(    Tile,     nStart,     1, 0);
1190 	CpsLoadOne(    Tile,     nStart + 1, 1, 2);
1191 	CpsLoadOnePang(Tile + 4, nStart,     1, 0);
1192 	CpsLoadOnePang(Tile + 4, nStart + 1, 1, 2);
1193 
1194 	return 0;
1195 }
1196 
CpsLoadTilesBootleg(UINT8 * Tile,INT32 nStart)1197 static INT32 CpsLoadTilesBootleg(UINT8 *Tile, INT32 nStart)
1198 {
1199 	CpsLoadOneBootleg(Tile, nStart + 0, 0, 0);
1200 	CpsLoadOneBootleg(Tile, nStart + 1, 0, 1);
1201 	CpsLoadOneBootleg(Tile, nStart + 2, 0, 2);
1202 	CpsLoadOneBootleg(Tile, nStart + 3, 0, 3);
1203 
1204 	return 0;
1205 }
1206 
CpsLoadTilesBootlegSwap(UINT8 * Tile,INT32 nStart)1207 static INT32 CpsLoadTilesBootlegSwap(UINT8 *Tile, INT32 nStart)
1208 {
1209 	CpsLoadOneBootlegSwap(Tile, nStart + 0, 0, 0);
1210 	CpsLoadOneBootlegSwap(Tile, nStart + 1, 0, 1);
1211 	CpsLoadOneBootlegSwap(Tile, nStart + 2, 0, 2);
1212 	CpsLoadOneBootlegSwap(Tile, nStart + 3, 0, 3);
1213 
1214 	return 0;
1215 }
1216 
CpsLoadTilesSf2ebbl(UINT8 * Tile,INT32 nStart)1217 INT32 CpsLoadTilesSf2ebbl(UINT8 *Tile, INT32 nStart)
1218 {
1219 	CpsLoadOneSf2ebbl(Tile, nStart + 0, 0, 0);
1220 	CpsLoadOneSf2ebbl(Tile, nStart + 1, 0, 2);
1221 	CpsLoadOneSf2ebbl(Tile, nStart + 2, 0, 1);
1222 	CpsLoadOneSf2ebbl(Tile, nStart + 3, 0, 3);
1223 
1224 	return 0;
1225 }
1226 
CpsLoadTilesSf2b(UINT8 * Tile,INT32 nStart)1227 INT32 CpsLoadTilesSf2b(UINT8 *Tile, INT32 nStart)
1228 {
1229 	CpsLoadOneSf2b(Tile, nStart + 0, 0, 0);
1230 	CpsLoadOneSf2b(Tile, nStart + 1, 0, 2);
1231 	CpsLoadOneSf2b(Tile, nStart + 2, 0, 1);
1232 	CpsLoadOneSf2b(Tile, nStart + 3, 0, 3);
1233 
1234 	return 0;
1235 }
1236 
CpsLoadTilesSf2koryuExtra(UINT8 * Tile,INT32 nStart)1237 INT32 CpsLoadTilesSf2koryuExtra(UINT8* Tile, INT32 nStart)
1238 {
1239 	CpsLoadOneSf2koryu(Tile, nStart + 0, 1, 0);
1240 	CpsLoadOneSf2koryu(Tile, nStart + 1, 1, 2);
1241 
1242 	return 0;
1243 }
1244 
CpsLoadTilesBootlegType3(UINT8 * Tile,INT32 nStart)1245 static INT32 CpsLoadTilesBootlegType3(UINT8 *Tile, INT32 nStart)
1246 {
1247 	CpsLoadOneBootlegType3(Tile, nStart +  0, 0, 0);
1248 	CpsLoadOneBootlegType3(Tile, nStart +  1, 0, 1);
1249 	CpsLoadOneBootlegType3(Tile, nStart +  2, 0, 2);
1250 	CpsLoadOneBootlegType3(Tile, nStart +  3, 0, 3);
1251 
1252 	return 0;
1253 }
1254 
CpsLoadTilesHack160(INT32 nStart)1255 INT32 CpsLoadTilesHack160(INT32 nStart)
1256 {
1257 	CpsLoadOneHack160(CpsGfx, nStart, 1, 0);
1258 
1259 	return 0;
1260 }
1261 
CpsLoadTilesHack160Alt(INT32 nStart)1262 INT32 CpsLoadTilesHack160Alt(INT32 nStart)
1263 {
1264 	CpsLoadOneHack160(CpsGfx, nStart, 1, 1);
1265 
1266 	return 0;
1267 }
1268 
CpsLoadTilesSf2koryu(INT32 nStart)1269 INT32 CpsLoadTilesSf2koryu(INT32 nStart)
1270 {
1271 	CpsLoadOneSf2koryu(CpsGfx + 0x000000, nStart + 0, 1, 0);
1272 	CpsLoadOneSf2koryu(CpsGfx + 0x000000, nStart + 1, 1, 2);
1273 	CpsLoadOneSf2koryu(CpsGfx + 0x200000, nStart + 2, 1, 0);
1274 	CpsLoadOneSf2koryu(CpsGfx + 0x200000, nStart + 3, 1, 2);
1275 	CpsLoadOneSf2koryu(CpsGfx + 0x400000, nStart + 4, 1, 0);
1276 	CpsLoadOneSf2koryu(CpsGfx + 0x400000, nStart + 5, 1, 2);
1277 
1278 	return 0;
1279 }
1280 
CpsLoadTilesSf2stt(INT32 nStart)1281 INT32 CpsLoadTilesSf2stt(INT32 nStart)
1282 {
1283 	CpsLoadOneSf2stt(CpsGfx + 0x000000, nStart + 0, 1, 0);
1284 	CpsLoadOneSf2stt(CpsGfx + 0x000000, nStart + 1, 1, 2);
1285 	CpsLoadOneSf2stt(CpsGfx + 0x200000, nStart + 2, 1, 0);
1286 	CpsLoadOneSf2stt(CpsGfx + 0x200000, nStart + 3, 1, 2);
1287 	CpsLoadOneSf2stt(CpsGfx + 0x400000, nStart + 4, 1, 0);
1288 	CpsLoadOneSf2stt(CpsGfx + 0x400000, nStart + 5, 1, 2);
1289 
1290 	return 0;
1291 }
1292 
CpsLoadTilesSf2mdt(INT32 nStart)1293 INT32 CpsLoadTilesSf2mdt(INT32 nStart)
1294 {
1295 	CpsLoadTilesBootlegType3(CpsGfx + 0x000000, nStart + 0);
1296 	CpsLoadTilesBootlegType3(CpsGfx + 0x200000, nStart + 4);
1297 	CpsLoadTilesBootlegType3(CpsGfx + 0x400000, nStart + 8);
1298 
1299 	return 0;
1300 }
1301 
CpsLoadTilesSf2mdta(INT32 nStart)1302 INT32 CpsLoadTilesSf2mdta(INT32 nStart)
1303 {
1304 	CpsLoadOneBootlegType3Swap(CpsGfx + 0x000000, nStart +  0, 0, 0);
1305 	CpsLoadOneBootlegType3Swap(CpsGfx + 0x000000, nStart +  1, 0, 2);
1306 	CpsLoadOneBootlegType3Swap(CpsGfx + 0x200000, nStart +  2, 0, 0);
1307 	CpsLoadOneBootlegType3Swap(CpsGfx + 0x200000, nStart +  3, 0, 2);
1308 	CpsLoadOneBootlegType3Swap(CpsGfx + 0x400000, nStart +  4, 0, 0);
1309 	CpsLoadOneBootlegType3Swap(CpsGfx + 0x400000, nStart +  5, 0, 2);
1310 
1311 	return 0;
1312 }
1313 
CpsLoadTilesSf2ceuab3(INT32 nStart)1314 INT32 CpsLoadTilesSf2ceuab3(INT32 nStart)
1315 {
1316 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 0, 0, 0);
1317 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 1, 0, 1);
1318 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 2, 0, 2);
1319 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 3, 0, 3);
1320 	// The last two roms are a complete pain, handled by this custom function
1321 	CpsLoadSf2ceuab3Tiles(CpsGfx + 0x400000, nStart + 4);
1322 
1323 	return 0;
1324 }
1325 
CpsLoadTilesSf2ceeabl(INT32 nStart)1326 INT32 CpsLoadTilesSf2ceeabl(INT32 nStart)
1327 {
1328 	CpsLoadOneBootlegType2Small(CpsGfx + 0x000000, nStart + 0, 0, 0);
1329 	CpsLoadOneBootlegType2Small(CpsGfx + 0x200000, nStart + 1, 0, 0);
1330 	CpsLoadOneBootlegType2Small(CpsGfx + 0x000000, nStart + 2, 0, 1);
1331 	CpsLoadOneBootlegType2Small(CpsGfx + 0x200000, nStart + 3, 0, 1);
1332 	CpsLoadOneBootlegType2Small(CpsGfx + 0x000000, nStart + 4, 0, 2);
1333 	CpsLoadOneBootlegType2Small(CpsGfx + 0x200000, nStart + 5, 0, 2);
1334 	CpsLoadOneBootlegType2Small(CpsGfx + 0x000000, nStart + 6, 0, 3);
1335 	CpsLoadOneBootlegType2Small(CpsGfx + 0x200000, nStart + 7, 0, 3);
1336 	// The last four roms are a complete pain, handled by this custom function
1337 	CpsLoadSf2ceeablTiles(CpsGfx + 0x400000, nStart + 8);
1338 
1339 	return 0;
1340 }
1341 
CpsLoadTilesSf2ceuab7(INT32 nStart)1342 INT32 CpsLoadTilesSf2ceuab7(INT32 nStart)
1343 {
1344 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000000, nStart +  0, 0, 0);
1345 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000004, nStart +  1, 0, 0);
1346 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200000, nStart +  2, 0, 0);
1347 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200004, nStart +  3, 0, 0);
1348 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000000, nStart +  4, 0, 1);
1349 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000004, nStart +  5, 0, 1);
1350 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200000, nStart +  6, 0, 1);
1351 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200004, nStart +  7, 0, 1);
1352 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000000, nStart +  8, 0, 2);
1353 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000004, nStart +  9, 0, 2);
1354 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200000, nStart + 10, 0, 2);
1355 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200004, nStart + 11, 0, 2);
1356 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000000, nStart + 12, 0, 3);
1357 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x000004, nStart + 13, 0, 3);
1358 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200000, nStart + 14, 0, 3);
1359 	CpsLoadOneBootlegType2SmallSingle(CpsGfx + 0x200004, nStart + 15, 0, 3);
1360 
1361 	// The last eight roms are a complete pain, handled by this custom function
1362 	CpsLoadSf2ceuab7Tiles(CpsGfx + 0x400000, nStart + 16);
1363 
1364 	return 0;
1365 }
1366 
CpsLoadTilesSf2ebbl3(INT32 nStart)1367 INT32 CpsLoadTilesSf2ebbl3(INT32 nStart)
1368 {
1369 	CpsLoadOne(CpsGfx + 0x000000, nStart     , 1, 0);
1370 	CpsLoadOne(CpsGfx + 0x000000, nStart +  1, 1, 2);
1371 	CpsLoadOne(CpsGfx + 0x000004, nStart +  2, 0, 0);
1372 	CpsLoadOne(CpsGfx + 0x000004, nStart +  3, 0, 1);
1373 	CpsLoadOne(CpsGfx + 0x000004, nStart +  4, 0, 2);
1374 	CpsLoadOne(CpsGfx + 0x000004, nStart +  5, 0, 3);
1375 	CpsLoadOne(CpsGfx + 0x200000, nStart +  6, 0, 0);
1376 	CpsLoadOne(CpsGfx + 0x200000, nStart +  7, 0, 1);
1377 	CpsLoadOne(CpsGfx + 0x200000, nStart +  8, 1, 2);
1378 	CpsLoadOne(CpsGfx + 0x200004, nStart +  9, 1, 0);
1379 	CpsLoadOne(CpsGfx + 0x200004, nStart + 10, 0, 2);
1380 	CpsLoadOne(CpsGfx + 0x200004, nStart + 11, 0, 3);
1381 	CpsLoadOne(CpsGfx + 0x400000, nStart + 12, 1, 0);
1382 	CpsLoadOne(CpsGfx + 0x400000, nStart + 13, 1, 2);
1383 	CpsLoadOne(CpsGfx + 0x400004, nStart + 14, 1, 0);
1384 	CpsLoadOne(CpsGfx + 0x400004, nStart + 15, 1, 2);
1385 
1386 	return 0;
1387 }
1388 
CpsLoadTilesFcrash(INT32 nStart)1389 INT32 CpsLoadTilesFcrash(INT32 nStart)
1390 {
1391 	CpsLoadTilesBootlegType3(CpsGfx + 0x000000, nStart +  0);
1392 	CpsLoadTilesBootlegType3(CpsGfx + 0x080000, nStart +  4);
1393 	CpsLoadTilesBootlegType3(CpsGfx + 0x100000, nStart +  8);
1394 	CpsLoadTilesBootlegType3(CpsGfx + 0x180000, nStart + 12);
1395 
1396 	return 0;
1397 }
1398 
CpsLoadTilesCawingbl(INT32 nStart)1399 INT32 CpsLoadTilesCawingbl(INT32 nStart)
1400 {
1401 	CpsLoadTilesBootlegType3(CpsGfx + 0x000000, nStart + 0);
1402 
1403 	return 0;
1404 }
1405 
CpsLoadTilesCaptcommb(INT32 nStart)1406 INT32 CpsLoadTilesCaptcommb(INT32 nStart)
1407 {
1408 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 0, 0, 0);
1409 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 1, 0, 1);
1410 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 2, 0, 2);
1411 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 3, 0, 3);
1412 
1413 	return 0;
1414 }
1415 
CpsLoadTilesDinopic(INT32 nStart)1416 INT32 CpsLoadTilesDinopic(INT32 nStart)
1417 {
1418 	CpsLoadTilesBootleg(CpsGfx + 0x000000, nStart + 0);
1419 	CpsLoadTilesBootleg(CpsGfx + 0x200000, nStart + 4);
1420 
1421 	return 0;
1422 }
1423 
CpsLoadTilesDinopic4(INT32 nStart)1424 INT32 CpsLoadTilesDinopic4(INT32 nStart)
1425 {
1426 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000000, nStart +  0, 0, 0);
1427 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000004, nStart +  1, 0, 0);
1428 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000000, nStart +  2, 0, 1);
1429 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000004, nStart +  3, 0, 1);
1430 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000000, nStart +  4, 0, 2);
1431 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000004, nStart +  5, 0, 2);
1432 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000000, nStart +  6, 0, 3);
1433 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x000004, nStart +  7, 0, 3);
1434 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200000, nStart +  8, 0, 0);
1435 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200004, nStart +  9, 0, 0);
1436 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200000, nStart + 10, 0, 1);
1437 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200004, nStart + 11, 0, 1);
1438 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200000, nStart + 12, 0, 2);
1439 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200004, nStart + 13, 0, 2);
1440 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200000, nStart + 14, 0, 3);
1441 	CpsLoadOneBootlegSmallSingle(CpsGfx + 0x200004, nStart + 15, 0, 3);
1442 
1443 	return 0;
1444 }
1445 
CpsLoadTilesSlampic(INT32 nStart)1446 INT32 CpsLoadTilesSlampic(INT32 nStart)
1447 {
1448 	CpsLoadTilesBootleg(CpsGfx + 0x000000, nStart + 0);
1449 	CpsLoadTilesBootleg(CpsGfx + 0x200000, nStart + 4);
1450 	CpsLoadTilesBootleg(CpsGfx + 0x400000, nStart + 8);
1451 
1452 	return 0;
1453 }
1454 
CpsLoadTilesKodb(INT32 nStart)1455 INT32 CpsLoadTilesKodb(INT32 nStart)
1456 {
1457 	CpsLoadTilesByte(CpsGfx, nStart);
1458 
1459 	return 0;
1460 }
1461 
CpsLoadTilesWonder3b(INT32 nStart)1462 INT32 CpsLoadTilesWonder3b(INT32 nStart)
1463 {
1464 	CpsLoadOneWonder3b(CpsGfx + 0x000000, nStart + 0, 0, 0);
1465 	CpsLoadOneWonder3b(CpsGfx + 0x000000, nStart + 1, 0, 2);
1466 	CpsLoadOneWonder3b(CpsGfx + 0x000004, nStart + 2, 0, 0);
1467 	CpsLoadOneWonder3b(CpsGfx + 0x000004, nStart + 3, 0, 2);
1468 	CpsLoadOneWonder3b(CpsGfx + 0x000000, nStart + 4, 0, 1);
1469 	CpsLoadOneWonder3b(CpsGfx + 0x000000, nStart + 5, 0, 3);
1470 	CpsLoadOneWonder3b(CpsGfx + 0x000004, nStart + 6, 0, 1);
1471 	CpsLoadOneWonder3b(CpsGfx + 0x000004, nStart + 7, 0, 3);
1472 
1473 	return 0;
1474 }
1475 
CpsLoadTilesPang3r1a(INT32 nStart)1476 INT32 CpsLoadTilesPang3r1a(INT32 nStart)
1477 {
1478 	CpsLoadOne(CpsGfx + 0x000000, nStart + 0, 1, 0);
1479 	CpsLoadOne(CpsGfx + 0x200000, nStart + 1, 1, 0);
1480 	CpsLoadOne(CpsGfx + 0x000004, nStart + 2, 1, 0);
1481 	CpsLoadOne(CpsGfx + 0x200004, nStart + 3, 1, 0);
1482 	CpsLoadOne(CpsGfx + 0x000000, nStart + 4, 1, 2);
1483 	CpsLoadOne(CpsGfx + 0x200000, nStart + 5, 1, 2);
1484 	CpsLoadOne(CpsGfx + 0x000004, nStart + 6, 1, 2);
1485 	CpsLoadOne(CpsGfx + 0x200004, nStart + 7, 1, 2);
1486 
1487 	return 0;
1488 }
1489 
CpsLoadTilesPunisherb(INT32 nStart)1490 INT32 CpsLoadTilesPunisherb(INT32 nStart)
1491 {
1492 	CpsLoadPunisherbTiles(CpsGfx, nStart);
1493 
1494 	return 0;
1495 }
1496 
CpsLoadTilesKnightsb2(INT32 nStart)1497 INT32 CpsLoadTilesKnightsb2(INT32 nStart)
1498 {
1499 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 0, 0, 0);
1500 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 1, 0, 1);
1501 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 2, 0, 2);
1502 	CpsLoadOneBootlegType2(CpsGfx + 0x000000, nStart + 3, 0, 3);
1503 
1504 	return 0;
1505 }
1506 
CpsLoadTilesMtwinsb(INT32 nStart)1507 INT32 CpsLoadTilesMtwinsb(INT32 nStart)
1508 {
1509 	CpsLoadTilesBootlegSwap(CpsGfx + 0x000000, nStart + 0);
1510 
1511 	return 0;
1512 }
1513 
CpsLoadTilesWofabl(INT32 nStart)1514 INT32 CpsLoadTilesWofabl(INT32 nStart)
1515 {
1516 	CpsLoadTilesBootlegType3(CpsGfx + 0x000000, nStart + 0);
1517 	CpsLoadTilesBootlegType3(CpsGfx + 0x200000, nStart + 4);
1518 
1519 	return 0;
1520 }
1521 
CpsLoadStars(UINT8 * pStar,INT32 nStart)1522 INT32 CpsLoadStars(UINT8* pStar, INT32 nStart)
1523 {
1524 	UINT8* pTemp[2] = { NULL, NULL};
1525 	INT32 nLen;
1526 
1527 	for (INT32 i = 0; i < 2; i++) {
1528 		if (LoadUp(&pTemp[i], &nLen, nStart + (i << 1))) {
1529 			BurnFree(pTemp[0]);
1530 			BurnFree(pTemp[1]);
1531 		}
1532 	}
1533 
1534 	for (INT32 i = 0; i < 0x1000; i++) {
1535 		pStar[i] = pTemp[0][i << 1];
1536 		pStar[0x01000 + i] = pTemp[1][i << 1];
1537 	}
1538 
1539 	BurnFree(pTemp[0]);
1540 	BurnFree(pTemp[1]);
1541 
1542 	return 0;
1543 }
1544 
CpsLoadStarsByte(UINT8 * pStar,INT32 nStart)1545 INT32 CpsLoadStarsByte(UINT8* pStar, INT32 nStart)
1546 {
1547 	UINT8* pTemp[2] = { NULL, NULL};
1548 	INT32 nLen;
1549 
1550 	for (INT32 i = 0; i < 2; i++) {
1551 		if (LoadUp(&pTemp[i], &nLen, nStart + (i * 4))) {
1552 			BurnFree(pTemp[0]);
1553 			BurnFree(pTemp[1]);
1554 		}
1555 	}
1556 
1557 	for (INT32 i = 0; i < 0x1000; i++) {
1558 		pStar[i] = pTemp[0][i];
1559 		pStar[0x01000 + i] = pTemp[1][i];
1560 	}
1561 
1562 	BurnFree(pTemp[0]);
1563 	BurnFree(pTemp[1]);
1564 
1565 	return 0;
1566 }
1567 
CpsLoadStarsForgottnAlt(UINT8 * pStar,INT32 nStart)1568 INT32 CpsLoadStarsForgottnAlt(UINT8* pStar, INT32 nStart)
1569 {
1570 	UINT8* pTemp[2] = { NULL, NULL};
1571 	INT32 nLen;
1572 
1573 	for (INT32 i = 0; i < 2; i++) {
1574 		if (LoadUp(&pTemp[i], &nLen, nStart + (i * 3))) {
1575 			BurnFree(pTemp[0]);
1576 			BurnFree(pTemp[1]);
1577 		}
1578 	}
1579 
1580 	for (INT32 i = 0; i < 0x1000; i++) {
1581 		pStar[i] = pTemp[0][i << 1];
1582 		pStar[0x01000 + i] = pTemp[1][i << 1];
1583 	}
1584 
1585 	BurnFree(pTemp[0]);
1586 	BurnFree(pTemp[1]);
1587 
1588 	return 0;
1589 }
1590 
1591 // ----------------------------CPS2--------------------------------
1592 // Load 1 rom and interleve in the CPS2 style:
1593 // rom  : aa bb -- -- (4 bytes)
1594 // --ba --ba --ba --ba --ba --ba --ba --ba 8 pixels (four bytes)
1595 //                                                  (skip four bytes)
1596 
1597 // memory 000000-100000 are in even word fields of first 080000 section
1598 // memory 100000-200000 are in  odd word fields of first 080000 section
1599 // i = ABCD nnnn nnnn nnnn nnnn n000
1600 // s = 00AB Cnnn nnnn nnnn nnnn nnD0
1601 
Cps2Load100000(UINT8 * Tile,UINT8 * Sect,INT32 nShift)1602 inline static void Cps2Load100000(UINT8* Tile, UINT8* Sect, INT32 nShift)
1603 {
1604 	UINT8 *pt, *pEnd, *ps;
1605 	pt = Tile; pEnd = Tile + 0x100000; ps = Sect;
1606 
1607 	do {
1608 		UINT32 Pix;				// Eight pixels
1609 		Pix  = SepTable[ps[0]];
1610 		Pix |= SepTable[ps[1]] << 1;
1611 		Pix <<= nShift;
1612 		*((UINT32*)pt) |= Pix;
1613 
1614 		pt += 8; ps += 4;
1615 	}
1616 	while (pt < pEnd);
1617 }
1618 
Cps2LoadOne(UINT8 * Tile,INT32 nNum,INT32 nWord,INT32 nShift)1619 static INT32 Cps2LoadOne(UINT8* Tile, INT32 nNum, INT32 nWord, INT32 nShift)
1620 {
1621 	UINT8 *Rom = NULL; INT32 nRomLen = 0;
1622 	UINT8 *pt, *pr;
1623 
1624 	LoadUp(&Rom, &nRomLen, nNum);
1625 	if (Rom == NULL) {
1626 		return 1;
1627 	}
1628 
1629 	if (nWord == 0) {
1630 		UINT8*Rom2 = NULL; INT32 nRomLen2 = 0;
1631 		UINT8*Rom3 = Rom;
1632 
1633 		LoadUp(&Rom2, &nRomLen2, nNum + 1);
1634 		if (Rom2 == NULL) {
1635 			return 1;
1636 		}
1637 
1638 		nRomLen <<= 1;
1639 		Rom = (UINT8*)BurnMalloc(nRomLen);
1640 		if (Rom == NULL) {
1641 			BurnFree(Rom2);
1642 			BurnFree(Rom3);
1643 			return 1;
1644 		}
1645 
1646 		for (INT32 i = 0; i < nRomLen2; i++) {
1647 			Rom[(i << 1) + 0] = Rom3[i];
1648 			Rom[(i << 1) + 1] = Rom2[i];
1649 		}
1650 
1651 		BurnFree(Rom2);
1652 		BurnFree(Rom3);
1653 	}
1654 
1655 	// Go through each section
1656 	pt = Tile; pr = Rom;
1657 	for (INT32 b = 0; b < nRomLen >> 19; b++) {
1658 		Cps2Load100000(pt, pr,     nShift); pt += 0x100000;
1659 		Cps2Load100000(pt, pr + 2, nShift); pt += 0x100000;
1660 		pr += 0x80000;
1661 	}
1662 
1663 	BurnFree(Rom);
1664 
1665 	return 0;
1666 }
1667 
Cps2LoadSplit(UINT8 * Tile,INT32 nNum,INT32 nShift,INT32 nNumRomsGroup)1668 static INT32 Cps2LoadSplit(UINT8* Tile, INT32 nNum, INT32 nShift, INT32 nNumRomsGroup)
1669 {
1670 	UINT8 *Rom = NULL; INT32 nRomLen = 0;
1671 	UINT8 *pt, *pr;
1672 
1673 	LoadUpSplit(&Rom, &nRomLen, nNum, nNumRomsGroup);
1674 	if (Rom == NULL) {
1675 		return 1;
1676 	}
1677 
1678 	// Go through each section
1679 	pt = Tile; pr = Rom;
1680 	for (INT32 b = 0; b < nRomLen >> 19; b++) {
1681 		Cps2Load100000(pt, pr,     nShift); pt += 0x100000;
1682 		Cps2Load100000(pt, pr + 2, nShift); pt += 0x100000;
1683 		pr += 0x80000;
1684 	}
1685 
1686 	BurnFree(Rom);
1687 
1688 	return 0;
1689 }
1690 
Cps2LoadTiles(UINT8 * Tile,INT32 nStart)1691 INT32 Cps2LoadTiles(UINT8* Tile, INT32 nStart)
1692 {
1693 	// left  side of 16x16 tiles
1694 	Cps2LoadOne(Tile,     nStart,     1, 0);
1695 	Cps2LoadOne(Tile,     nStart + 1, 1, 2);
1696 	// right side of 16x16 tiles
1697 	Cps2LoadOne(Tile + 4, nStart + 2, 1, 0);
1698 	Cps2LoadOne(Tile + 4, nStart + 3, 1, 2);
1699 
1700 	return 0;
1701 }
1702 
Cps2LoadTilesSplit4(UINT8 * Tile,INT32 nStart)1703 INT32 Cps2LoadTilesSplit4(UINT8* Tile, INT32 nStart)
1704 {
1705 	// left  side of 16x16 tiles
1706 	Cps2LoadSplit(Tile,     nStart +  0, 0, 4);
1707 	Cps2LoadSplit(Tile,     nStart +  4, 2, 4);
1708 	// right side of 16x16 tiles
1709 	Cps2LoadSplit(Tile + 4, nStart +  8, 0, 4);
1710 	Cps2LoadSplit(Tile + 4, nStart + 12, 2, 4);
1711 
1712 	return 0;
1713 }
1714 
Cps2LoadTilesSplit8(UINT8 * Tile,INT32 nStart)1715 INT32 Cps2LoadTilesSplit8(UINT8* Tile, INT32 nStart)
1716 {
1717 	// left  side of 16x16 tiles
1718 	Cps2LoadSplit(Tile,     nStart +  0, 0, 8);
1719 	Cps2LoadSplit(Tile,     nStart +  8, 2, 8);
1720 	// right side of 16x16 tiles
1721 	Cps2LoadSplit(Tile + 4, nStart + 16, 0, 8);
1722 	Cps2LoadSplit(Tile + 4, nStart + 24, 2, 8);
1723 
1724 	return 0;
1725 }
1726 
Cps2LoadTilesSIM(UINT8 * Tile,INT32 nStart)1727 INT32 Cps2LoadTilesSIM(UINT8* Tile, INT32 nStart)
1728 {
1729 	Cps2LoadOne(Tile,     nStart,     0, 0);
1730 	Cps2LoadOne(Tile,     nStart + 2, 0, 2);
1731 	Cps2LoadOne(Tile + 4, nStart + 4, 0, 0);
1732 	Cps2LoadOne(Tile + 4, nStart + 6, 0, 2);
1733 
1734 	return 0;
1735 }
1736 
Cps2LoadTiles19xxj(UINT8 * Tile,INT32 nStart)1737 INT32 Cps2LoadTiles19xxj(UINT8* Tile, INT32 nStart)
1738 {
1739 	// left
1740 	Cps2LoadOne(Tile + 0x000000, nStart +  0, 1, 0);
1741 	Cps2LoadOne(Tile + 0x000000, nStart +  1, 1, 2);
1742 
1743 	// right
1744 	Cps2LoadOne(Tile + 0x000004, nStart +  2, 1, 0);
1745 	Cps2LoadOne(Tile + 0x000004, nStart +  3, 1, 2);
1746 
1747 	// left
1748 	Cps2LoadOne(Tile + 0x800000, nStart +  4, 1, 0);
1749 	Cps2LoadOne(Tile + 0xa00000, nStart +  5, 1, 0);
1750 	Cps2LoadOne(Tile + 0xc00000, nStart +  6, 1, 0);
1751 	Cps2LoadOne(Tile + 0xe00000, nStart +  7, 1, 0);
1752 	Cps2LoadOne(Tile + 0x800000, nStart +  8, 1, 2);
1753 	Cps2LoadOne(Tile + 0xa00000, nStart +  9, 1, 2);
1754 	Cps2LoadOne(Tile + 0xc00000, nStart + 10, 1, 2);
1755 	Cps2LoadOne(Tile + 0xe00000, nStart + 11, 1, 2);
1756 
1757 	// right
1758 	Cps2LoadOne(Tile + 0x800004, nStart + 12, 1, 0);
1759 	Cps2LoadOne(Tile + 0xa00004, nStart + 13, 1, 0);
1760 	Cps2LoadOne(Tile + 0xc00004, nStart + 14, 1, 0);
1761 	Cps2LoadOne(Tile + 0xe00004, nStart + 15, 1, 0);
1762 	Cps2LoadOne(Tile + 0x800004, nStart + 16, 1, 2);
1763 	Cps2LoadOne(Tile + 0xa00004, nStart + 17, 1, 2);
1764 	Cps2LoadOne(Tile + 0xc00004, nStart + 18, 1, 2);
1765 	Cps2LoadOne(Tile + 0xe00004, nStart + 19, 1, 2);
1766 
1767 	return 0;
1768 }
1769 
Cps2LoadTilesGigaman2(UINT8 * Tile,UINT8 * pSrc)1770 INT32 Cps2LoadTilesGigaman2(UINT8 *Tile, UINT8 *pSrc)
1771 {
1772 	UINT8 *pt = Tile;
1773 	UINT8 *pr = pSrc;
1774 	for (INT32 b = 0; b < 0x200000 >> 19; b++) {
1775 		Cps2Load100000(pt, pr,     0); pt += 0x100000;
1776 		Cps2Load100000(pt, pr + 2, 0); pt += 0x100000;
1777 		pr += 0x80000;
1778 	}
1779 
1780 	pt = Tile;
1781 	pr = pSrc + 0x200000;
1782 	for (INT32 b = 0; b < 0x200000 >> 19; b++) {
1783 		Cps2Load100000(pt, pr,     2); pt += 0x100000;
1784 		Cps2Load100000(pt, pr + 2, 2); pt += 0x100000;
1785 		pr += 0x80000;
1786 	}
1787 
1788 	pt = Tile + 4;
1789 	pr = pSrc + 0x400000;
1790 	for (INT32 b = 0; b < 0x200000 >> 19; b++) {
1791 		Cps2Load100000(pt, pr,     0); pt += 0x100000;
1792 		Cps2Load100000(pt, pr + 2, 0); pt += 0x100000;
1793 		pr += 0x80000;
1794 	}
1795 
1796 	pt = Tile + 4;
1797 	pr = pSrc + 0x600000;
1798 	for (INT32 b = 0; b < 0x200000 >> 19; b++) {
1799 		Cps2Load100000(pt, pr,     2); pt += 0x100000;
1800 		Cps2Load100000(pt, pr + 2, 2); pt += 0x100000;
1801 		pr += 0x80000;
1802 	}
1803 
1804 	return 0;
1805 }
1806 
1807 // ----------------------------------------------------------------
1808 
1809 // The file extension indicates the data contained in a file.
1810 // it consists of 2 numbers optionally followed by a single letter.
1811 // The letter indicates the version. The meaning for the nubmers
1812 // is as follows:
1813 // 01 - 02 : Z80 program
1814 // 03 - 10 : 68K program (filenames ending with x contain the XOR table)
1815 // 11 - 12 : QSound sample data
1816 // 13 - nn : Graphics data
1817 
1818 static UINT32 nGfxMaxSize;
1819 
CpsGetROMs(bool bLoad)1820 static INT32 CpsGetROMs(bool bLoad)
1821 {
1822 	struct BurnRomInfo ri;
1823 
1824 	UINT8* CpsCodeLoad = CpsCode;
1825 	UINT8* CpsRomLoad = CpsRom;
1826 	UINT8* CpsGfxLoad = CpsGfx;
1827 	UINT8* CpsZRomLoad = CpsZRom;
1828 	UINT8* CpsQSamLoad = (UINT8*)CpsQSam;
1829 	UINT8* CpsKeyLoad = CpsKey;
1830 
1831 	INT32 nGfxNum = 0;
1832 
1833 	if (bLoad) {
1834 		if (!CpsCodeLoad || !CpsRomLoad || !CpsGfxLoad || !CpsZRomLoad || !CpsQSamLoad) {
1835 			return 1;
1836 		}
1837 	} else {
1838 		nCpsCodeLen = nCpsRomLen = nCpsGfxLen = nCpsZRomLen = nCpsQSamLen = 0;
1839 
1840 		nGfxMaxSize = 0;
1841 		if (BurnDrvGetHardwareCode() & HARDWARE_CAPCOM_CPS2_SIMM) {
1842 			nGfxMaxSize = ~0U;
1843 		}
1844 	}
1845 
1846 	INT32 i = 0;
1847 	do {
1848 		ri.nLen = 0;
1849 		ri.nType = 0;
1850 		BurnDrvGetRomInfo(&ri, i);
1851 
1852 		if ((ri.nType & 0x0f) == CPS2_PRG_68K) {
1853 			if (bLoad) {
1854 				if (BurnLoadRom(CpsRomLoad, i, 1)) return 1;
1855 				CpsRomLoad += ri.nLen;
1856 			} else {
1857 				nCpsRomLen += ri.nLen;
1858 			}
1859 			i++;
1860 		}
1861 
1862 		if ((ri.nType & 0x0f) == CPS2_PRG_68K_SIMM) {
1863 			if (bLoad) {
1864 				if (BurnLoadRom(CpsRomLoad + 0x000001, i + 0, 2)) return 1;
1865 				if (BurnLoadRom(CpsRomLoad + 0x000000, i + 1, 2)) return 1;
1866 				CpsRomLoad += ri.nLen * 2;
1867 				i += 2;
1868 			} else {
1869 				nCpsRomLen += ri.nLen;
1870 				i++;
1871 			}
1872 		}
1873 
1874 		if ((ri.nType & 0x0f) == CPS2_PRG_68K_XOR_TABLE) {
1875 			if (bLoad) {
1876 				if (BurnLoadRom(CpsCodeLoad, i, 1)) return 1;
1877 				CpsCodeLoad += ri.nLen;
1878 			} else {
1879 				nCpsCodeLen += ri.nLen;
1880 			}
1881 			i++;
1882 		}
1883 
1884 		if ((ri.nType & 0x0f) == CPS2_GFX) {
1885 			if (bLoad) {
1886 				Cps2LoadTiles(CpsGfxLoad, i);
1887 				CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 4;
1888 				i += 4;
1889 			} else {
1890 				if (ri.nLen > nGfxMaxSize) {
1891 					nGfxMaxSize = ri.nLen;
1892 				}
1893 				if (ri.nLen < nGfxMaxSize) {
1894 					nGfxMaxSize = ~0U;
1895 				}
1896 				nCpsGfxLen += ri.nLen;
1897 				nGfxNum++;
1898 				i++;
1899 			}
1900 		}
1901 
1902 		if ((ri.nType & 0x0f) == CPS2_GFX_SIMM) {
1903 			if (bLoad) {
1904 				Cps2LoadTilesSIM(CpsGfxLoad, i);
1905 				CpsGfxLoad += ri.nLen * 8;
1906 				i += 8;
1907 			} else {
1908 				nCpsGfxLen += ri.nLen;
1909 				i++;
1910 			}
1911 		}
1912 
1913 		if ((ri.nType & 0x0f) == CPS2_GFX_SPLIT4) {
1914 			if (bLoad) {
1915 				Cps2LoadTilesSplit4(CpsGfxLoad, i);
1916 				CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 16;
1917 				i += 16;
1918 			} else {
1919 				if (ri.nLen > nGfxMaxSize) {
1920 					nGfxMaxSize = ri.nLen;
1921 				}
1922 				if (ri.nLen < nGfxMaxSize) {
1923 					nGfxMaxSize = ~0U;
1924 				}
1925 				nCpsGfxLen += ri.nLen;
1926 				nGfxNum++;
1927 				i++;
1928 			}
1929 		}
1930 
1931 		if ((ri.nType & 0x0f) == CPS2_GFX_SPLIT8) {
1932 			if (bLoad) {
1933 				Cps2LoadTilesSplit8(CpsGfxLoad, i);
1934 				CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 32;
1935 				i += 32;
1936 			} else {
1937 				if (ri.nLen > nGfxMaxSize) {
1938 					nGfxMaxSize = ri.nLen;
1939 				}
1940 				if (ri.nLen < nGfxMaxSize) {
1941 					nGfxMaxSize = ~0U;
1942 				}
1943 				nCpsGfxLen += ri.nLen;
1944 				nGfxNum++;
1945 				i++;
1946 			}
1947 		}
1948 
1949 		if ((ri.nType & 0x0f) == CPS2_GFX_19XXJ) {
1950 			if (bLoad) {
1951 				Cps2LoadTiles19xxj(CpsGfxLoad, i);
1952 				CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 20;
1953 				i += 20;
1954 			} else {
1955 				nGfxMaxSize = 0xcd000;
1956 				nCpsGfxLen += ri.nLen;
1957 				nGfxNum++;
1958 				i++;
1959 			}
1960 		}
1961 
1962 		if ((ri.nType & 0x0f) == CPS2_PRG_Z80) {
1963 			if (bLoad) {
1964 				BurnLoadRom(CpsZRomLoad, i, 1);
1965 				CpsZRomLoad += ri.nLen;
1966 			} else {
1967 				nCpsZRomLen += ri.nLen;
1968 			}
1969 			i++;
1970 		}
1971 
1972 		if ((ri.nType & 0x0f) == CPS2_QSND) {
1973 			if (bLoad) {
1974 				BurnLoadRom(CpsQSamLoad, i, 1);
1975 				BurnByteswap(CpsQSamLoad, ri.nLen);
1976 				CpsQSamLoad += ri.nLen;
1977 			} else {
1978 				nCpsQSamLen += ri.nLen;
1979 			}
1980 			i++;
1981 		}
1982 
1983 		if ((ri.nType & 0x0f) == CPS2_QSND_SIMM) {
1984 			if (bLoad) {
1985 				BurnLoadRom(CpsQSamLoad, i, 1);
1986 				BurnByteswap(CpsQSamLoad, ri.nLen);
1987 				CpsQSamLoad += ri.nLen;
1988 			} else {
1989 				nCpsQSamLen += ri.nLen;
1990 			}
1991 			i++;
1992 		}
1993 
1994 		if ((ri.nType & 0x0f) == CPS2_QSND_SIMM_BYTESWAP) {
1995 			if (bLoad) {
1996 				BurnLoadRom(CpsQSamLoad + 1, i + 0, 2);
1997 				BurnLoadRom(CpsQSamLoad + 0, i + 1, 2);
1998 				i += 2;
1999 			} else {
2000 				nCpsQSamLen += ri.nLen;
2001 				i++;
2002 			}
2003 		}
2004 
2005 		if ((ri.nType & 0x0f) == CPS2_ENCRYPTION_KEY) {
2006 			if (bLoad) {
2007 				if (BurnLoadRom(CpsKeyLoad, i, 1)) return 1;
2008 				CpsKeyLoad += ri.nLen;
2009 			} else {
2010 				nCpsKeyLen += ri.nLen;
2011 			}
2012 			i++;
2013 		}
2014 	} while (ri.nLen);
2015 
2016 	if (bLoad) {
2017 #if 0
2018 		for (UINT32 i = 0; i < nCpsCodeLen / 4; i++) {
2019 			((UINT32*)CpsCode)[i] ^= ((UINT32*)CpsRom)[i];
2020 		}
2021 #endif
2022 		cps2_decrypt_game_data();
2023 
2024 //		if (!nCpsCodeLen) return 1;
2025 	} else {
2026 
2027 		if (nGfxMaxSize != ~0U) {
2028 			nCpsGfxLen = nGfxNum * nGfxMaxSize;
2029 		}
2030 
2031 #if 1 && defined FBA_DEBUG
2032 		if (!nCpsCodeLen) {
2033 			bprintf(PRINT_IMPORTANT, _T("  - 68K ROM size:\t0x%08X (Decrypted with key)\n"), nCpsRomLen);
2034 		} else {
2035 			bprintf(PRINT_IMPORTANT, _T("  - 68K ROM size:\t0x%08X (XOR table size: 0x%08X)\n"), nCpsRomLen, nCpsCodeLen);
2036 		}
2037 		bprintf(PRINT_IMPORTANT, _T("  - Z80 ROM size:\t0x%08X\n"), nCpsZRomLen);
2038 		bprintf(PRINT_IMPORTANT, _T("  - Graphics data:\t0x%08X\n"), nCpsGfxLen);
2039 		bprintf(PRINT_IMPORTANT, _T("  - QSound data:\t0x%08X\n"), nCpsQSamLen);
2040 		bprintf(PRINT_IMPORTANT, _T("  - Key data:\t\t0x%08X\n"), nCpsKeyLen);
2041 #endif
2042 
2043 		if (/*!nCpsCodeLen ||*/ !nCpsRomLen || !nCpsGfxLen || !nCpsZRomLen || ! nCpsQSamLen) {
2044 			return 1;
2045 		}
2046 	}
2047 
2048 	return 0;
2049 }
2050 
2051 // ----------------------------------------------------------------
2052 
CpsInit()2053 INT32 CpsInit()
2054 {
2055 	INT32 nMemLen, i;
2056 
2057 	if (Cps == 1) {
2058 		BurnSetRefreshRate(59.63);
2059 	} else {
2060 		if (Cps == 2) {
2061 			BurnSetRefreshRate(59.63);
2062 		}
2063 	}
2064 
2065 	if (!nCPS68KClockspeed) {
2066 		if (!(Cps & 1)) {
2067 			nCPS68KClockspeed = 11800000;
2068 		} else {
2069 			nCPS68KClockspeed = 10000000;
2070 		}
2071 	}
2072 	nCPS68KClockspeed = nCPS68KClockspeed * 100 / nBurnFPS;
2073 
2074 	nMemLen = nCpsGfxLen + nCpsRomLen + nCpsCodeLen + nCpsZRomLen + nCpsQSamLen + nCpsAdLen + nCpsKeyLen;
2075 
2076 	if (Cps1Qs == 1) {
2077 		nMemLen += nCpsZRomLen * 2;
2078 	}
2079 
2080 	// Allocate Gfx, Rom and Z80 Roms
2081 	CpsGfx = (UINT8*)BurnMalloc(nMemLen);
2082 	if (CpsGfx == NULL) {
2083 		return 1;
2084 	}
2085 	memset(CpsGfx, 0, nMemLen);
2086 
2087 	CpsRom  = CpsGfx + nCpsGfxLen;
2088 	CpsCode = CpsRom + nCpsRomLen;
2089 	if (Cps1Qs == 1) {
2090 		CpsEncZRom = CpsCode + nCpsCodeLen;
2091 		CpsZRom = CpsEncZRom + nCpsZRomLen * 2;
2092 	} else {
2093 		CpsZRom = CpsCode + nCpsCodeLen;
2094 	}
2095 	CpsQSam =(INT8*)(CpsZRom + nCpsZRomLen);
2096 	CpsAd   =(UINT8*)(CpsQSam + nCpsQSamLen);
2097 	CpsKey  =(UINT8*)(CpsAd + nCpsAdLen);
2098 
2099 	// Create Gfx addr mask
2100 	for (i = 0; i < 31; i++) {
2101 		if ((1 << i) >= (INT32)nCpsGfxLen) {
2102 			break;
2103 		}
2104 	}
2105 	nCpsGfxMask = (1 << i) - 1;
2106 
2107 	// Offset to Scroll tiles
2108 	if (!(Cps & 1)) {
2109 		nCpsGfxScroll[1] = nCpsGfxScroll[2] = nCpsGfxScroll[3] = 0x800000;
2110 	} else {
2111 		nCpsGfxScroll[1] = nCpsGfxScroll[2] = nCpsGfxScroll[3] = 0;
2112 	}
2113 
2114 #if 0
2115 	if (nCpsZRomLen>=5) {
2116 		// 77->cfff and rst 00 in case driver doesn't load
2117 		CpsZRom[0] = 0x3E; CpsZRom[1] = 0x77;
2118 		CpsZRom[2] = 0x32; CpsZRom[3] = 0xFF; CpsZRom[4] = 0xCF;
2119 		CpsZRom[5] = 0xc7;
2120 	}
2121 #endif
2122 
2123 	SepTableCalc();									  // Precalc the separate table
2124 
2125 	CpsReset = 0; Cpi01A = Cpi01C = Cpi01E = 0;		  // blank other inputs
2126 
2127 	// Use this as default - all CPS-2 games use it
2128 	SetCpsBId(CPS_B_21_DEF, 0);
2129 
2130 	return 0;
2131 }
2132 
Cps2Init()2133 INT32 Cps2Init()
2134 {
2135 	Cps = 2;
2136 
2137 	if (CpsGetROMs(false)) {
2138 		return 1;
2139 	}
2140 
2141 	CpsInit();
2142 
2143 	if (CpsGetROMs(true)) {
2144 		return 1;
2145 	}
2146 
2147 	return CpsRunInit();
2148 }
2149 
CpsExit()2150 INT32 CpsExit()
2151 {
2152 	if (!(Cps & 1)) {
2153 		CpsRunExit();
2154 	}
2155 
2156 	CpsLayEn[1] = CpsLayEn[2] = CpsLayEn[3] = CpsLayEn[4] = CpsLayEn[5] = 0;
2157 	nCpsLcReg = 0;
2158 	nCpsGfxScroll[1] = nCpsGfxScroll[2] = nCpsGfxScroll[3] = 0;
2159 	nCpsGfxMask = 0;
2160 
2161 	Scroll1TileMask = 0;
2162 	Scroll2TileMask = 0;
2163 	Scroll3TileMask = 0;
2164 
2165 	nCpsCodeLen = nCpsRomLen = nCpsGfxLen = nCpsZRomLen = nCpsQSamLen = nCpsAdLen = nCpsKeyLen = 0;
2166 	CpsRom = CpsZRom = CpsAd = CpsStar = NULL;
2167 	CpsQSam = NULL;
2168 	CpsKey = NULL;
2169 
2170 	// All Memory is allocated to this (this is the only one we can free)
2171 	BurnFree(CpsGfx);
2172 
2173 	BurnFree(CpsCode);
2174 
2175 	bCpsUpdatePalEveryFrame = 0;
2176 
2177 	nCPS68KClockspeed = 0;
2178 	Cps = 0;
2179 	nCpsNumScanlines = 262;
2180 
2181 	return 0;
2182 }
2183