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