Make SVGPCB work. rtw, haze, iq_132

This commit is contained in:
iq_132 2013-12-10 00:42:30 +00:00
parent 832bf71c96
commit a933eabb13
3 changed files with 40 additions and 27 deletions

View File

@ -3040,13 +3040,11 @@ static struct BurnRomInfo thegladRomDesc[] = {
STDROMPICKEXT(theglad, theglad, pgm)
STD_ROM_FN(theglad)
static void thegladPatch()
static void pgm_create_theglad_E0_data()
{
pgm_decrypt_theglad();
// Replace undumpable area of the arm7 internal rom with a custom-built
// version created by David Haywood in order to make game playable
static UINT16 thegladEOHackData[0x188/2] = {
static const UINT16 thegladEOHackData[0x188/2] = {
0x000a, 0xea00, 0xfffe, 0xeaff, 0xfffe, 0xeaff, 0xfffe, 0xeaff,
0xfffe, 0xeaff, 0xfffe, 0xeaff, 0xfffe, 0xeaff, 0xf000, 0xe59f,
0x0010, 0x0800, 0x0010, 0x0800, 0xfffe, 0xeaff, 0xfffe, 0xeaff,
@ -3074,14 +3072,13 @@ static void thegladPatch()
0xfffe, 0xeaff, 0x105c, 0xe59f
};
// byte swap for Big Endian arch
for (int i = 0; i < 0x188/2; i++)
{
thegladEOHackData[i] = BURN_ENDIAN_SWAP_INT16(thegladEOHackData[i]);
memcpy (PGMARMROM, thegladEOHackData, 0x188);
}
memmove (PGMARMROM + 0x188, PGMARMROM, 0x4000-0x188);
memcpy (PGMARMROM, thegladEOHackData, 0x188);
static void thegladPatch()
{
pgm_decrypt_theglad();
pgm_create_theglad_E0_data();
}
static INT32 thegladInit()
@ -3171,7 +3168,8 @@ STD_ROM_FN(theglad100)
static void theglad100Patch()
{
thegladPatch();
pgm_decrypt_theglad();
pgm_create_theglad_E0_data();
// Hack the jump table in the external rom to work correctly with the internal rom we have...
static const UINT16 subroutine_addresses[] = {
@ -4199,29 +4197,43 @@ static struct BurnRomInfo svgpcbRomDesc[] = {
{ "w05601b064.bin", 0x800000, 0xbfe61a71, 5 | BRF_SND }, // 8 Samples
{ "w05602b032.bin", 0x400000, 0x0685166d, 5 | BRF_SND }, // 9
{ "svg_igs027a.bin", 0x004000, 0x00000000, 7 | BRF_PRG | BRF_ESS | BRF_NODUMP }, // 10 Internal ARM7 Rom
// { "svg_igs027a.bin", 0x004000, 0x00000000, 7 | BRF_PRG | BRF_ESS | BRF_NODUMP }, // 10 Internal ARM7 Rom
{ "svg_igs027a_execute_only_area", 0x000188, 0x00000000, 0 | BRF_OPT | BRF_NODUMP }, // 10 Internal ARM7 Rom
{ "svgcpb_igs027a_v100_japan.bin", 0x003e78, 0x7a59da5d, 7 | BRF_PRG | BRF_ESS }, // 11 Internal ARM7 Rom
{ "svg_v100jp.u64", 0x400000, 0x399d4a8b, 8 | BRF_PRG | BRF_ESS }, // 11 External ARM7 Rom
{ "svg_v100jp.u65", 0x400000, 0x6e1c33b1, 8 | BRF_PRG | BRF_ESS }, // 12
{ "svg_v100jp.u64", 0x400000, 0x399d4a8b, 8 | BRF_PRG | BRF_ESS }, // 12 External ARM7 Rom
{ "svg_v100jp.u65", 0x400000, 0x6e1c33b1, 8 | BRF_PRG | BRF_ESS }, // 13
};
STDROMPICKEXT(svgpcb, svgpcb, svgpcbBIOS) // custom bios
STD_ROM_FN(svgpcb)
static void svgpcbPatch()
{
pgm_decrypt_svgpcb();
pgm_create_theglad_E0_data();
}
static INT32 svgpcbInit()
{
pPgmInitCallback = pgm_decrypt_svgpcb;
// pPgmProtCallback = install_protection_asic27a_svg;
pPgmInitCallback = svgpcbPatch;
pPgmProtCallback = install_protection_asic27a_svg;
return pgmInit();
nPgmAsicRegionHackAddress = 0x3a8e;
INT32 nRet = pgmInit();
Arm7SetIdleLoopAddress(0x00009e0);
return nRet;
}
struct BurnDriverD BurnDrvSvgpcb = {
"svgpcb", "svg", NULL, NULL, "2005",
"S.V.G. - Spectral vs Generation (V100, Japan, Single PCB Version)\0", "Incomplete Dump", "IGS", "PolyGameMaster",
NULL, NULL, NULL, NULL,
BDF_CLONE, 4, HARDWARE_IGS_PGM/* | HARDWARE_IGS_USE_ARM_CPU*/, GBF_SCRFIGHT, 0,
NULL, svgpcbRomInfo, svgpcbRomName, NULL, NULL, pgmInputInfo, jammaDIPInfo,
BDF_CLONE, 4, HARDWARE_IGS_PGM | HARDWARE_IGS_USE_ARM_CPU, GBF_SCRFIGHT, 0,
NULL, svgpcbRomInfo, svgpcbRomName, NULL, NULL, pgmInputInfo, thegladpcbDIPInfo,
svgpcbInit, pgmExit, pgmFrame, pgmDraw, pgmScan, &nPgmPalRecalc, 0x900,
448, 224, 4, 3
};

View File

@ -481,7 +481,7 @@ void pgm_decrypt_svg()
}
}
static const UINT8 svgpcb_tab[0x100] = { // not checked
static const UINT8 svgpcb_tab[0x100] = {
0x49, 0x47, 0x53, 0x30, 0x30, 0x31, 0x37, 0x52, 0x44, 0x31, 0x30, 0x35, 0x30, 0x35, 0x30, 0x34,
0x75, 0x0B, 0xF1, 0x6B, 0x6D, 0xD7, 0xA8, 0xE7, 0x0C, 0xC5, 0x28, 0x81, 0x1F, 0xCF, 0x30, 0x15,
0xA8, 0x0D, 0xDA, 0x76, 0xF8, 0x7D, 0xD6, 0xE1, 0x0A, 0x11, 0xE3, 0xA4, 0x23, 0xFF, 0x8E, 0x0B,
@ -507,12 +507,11 @@ void pgm_decrypt_svgpcb()
for (INT32 i = 0; i < nPGMExternalARMLen/2; i++) {
UINT16 x = BURN_ENDIAN_SWAP_INT16(src[i]);
// preliminary!
if ((i & 0x040080) != 0x000080) x ^= 0x0001;
if ((i & 0x084008) == 0x084008) x ^= 0x0002;
if ((i & 0x104008) == 0x104008) x ^= 0x0002;
if ((i & 0x080030) == 0x080010) x ^= 0x0004;
if ((i & 0x000242) != 0x000042) x ^= 0x0008;
if ((i & 0x048100) == 0x048000) x ^= 0x0010;
if ((i & 0x008100) == 0x008000) x ^= 0x0010;
if ((i & 0x022004) != 0x000004) x ^= 0x0020;
if ((i & 0x011800) != 0x010000) x ^= 0x0040;
if ((i & 0x000820) == 0x000820) x ^= 0x0080;

View File

@ -118,6 +118,7 @@ static INT32 pgmGetRoms(bool bLoad)
UINT8 *PGMTileROMLoad = PGMTileROM + 0x180000;
UINT8 *PGMSPRMaskROMLoad = PGMSPRMaskROM;
UINT8 *PGMSNDROMLoad = ICSSNDROM + 0x400000;
UINT8 *PGMARMROMLoad = PGMARMROM;
if (kov2 && bLoad) {
PGMSNDROMLoad += 0x400000;
@ -200,7 +201,8 @@ static INT32 pgmGetRoms(bool bLoad)
{
if (bLoad) {
if (BurnDrvGetHardwareCode() & HARDWARE_IGS_USE_ARM_CPU) {
BurnLoadRom(PGMARMROM, i, 1);
if (ri.nLen == 0x3e78) PGMARMROMLoad += 0x188;
BurnLoadRom(PGMARMROMLoad, i, 1);
}
}
continue;
@ -210,7 +212,7 @@ static INT32 pgmGetRoms(bool bLoad)
{
if (BurnDrvGetHardwareCode() & HARDWARE_IGS_USE_ARM_CPU) {
if (bLoad) {
BurnLoadRom(PGMUSER0, i, 1);
BurnLoadRom(PGMUSER0Load, i, 1);
PGMUSER0Load += ri.nLen;
} else {
nPGMExternalARMLen += ri.nLen;