Please do not remove this header
Document and some code by IQ_132
Drivers contain code from:
BMS888, Dorriga, Halrin, Jimmy_Page, and a few other sources
src/burn/neogeo/neo_run.cpp
Find this:
static unsigned char *Neo68KBIOS, *Neo68KVectors, *NeoZ80BIOS;
Replace with this:
unsigned char *Neo68KBIOS, *Neo68KVectors, *NeoZ80BIOS;
Find this:
Neo68KBIOS = Next; Next += 0x020000; // 68K boardROM
replace with:
Neo68KBIOS = Next; Next += 0x080000; // 68K boardROM
Find this:
if ((BurnDrvGetHardwareCode() & HARDWARE_SNK_CONTROLMASK) != HARDWARE_SNK_GAMBLING) {
SekMapMemory(Neo68KROM + nNeo68KROMBank, 0x200000, 0x2FFFFF, SM_ROM);
}
replace with:
if ((BurnDrvGetHardwareCode() & HARDWARE_SNK_CONTROLMASK) != HARDWARE_SNK_GAMBLING) {
if (!(BurnDrvGetHardwareCode() & HARDWARE_SNK_NEWBANKSYSTEM)) {
SekMapMemory(Neo68KROM + nNeo68KROMBank, 0x200000, 0x2FFFFF, SM_ROM);
}
}
Find this:
SekMapMemory(Neo68KBIOS, 0xC00000, 0xC1FFFF, SM_ROM); // BIOS ROM
replace with:
SekMapMemory(Neo68KBIOS, 0xC00000, 0xC7FFFF, SM_ROM); // BIOS ROM
src/burn/neogeo/neogeo.h
Find this:
// neo_run.cpp
add this after:
#define HARDWARE_SNK_NEWBANKSYSTEM 0x0200
extern unsigned char *Neo68KBIOS;
void svcchaos_cx_decrypt(unsigned char *src); // Decrypt SVCCHAOS's C roms
src/burn/neogeo/neo_decrypt.cpp
Find this:
include "neogeo.h"
Add this after:
#include "bitswap.h"
Find this:
void NeoExtractSData(unsigned char* rom, unsigned char* sdata, int rom_size, int sdata_size)
{
/* the S data comes from the end fo the C data */
rom += rom_size - sdata_size;
for (int i = 0; i < sdata_size; i++) {
sdata[i] = rom[(i & ~0x1F) + ((i & 7) << 2) + ((~i & 8) >> 2) + ((i & 0x10) >> 4)];
}
}
Replace with:
void NeoExtractSData(unsigned char* rom, unsigned char* sdata, int rom_size, int sdata_size)
{
int i;
if (sdata_size != 0x100000)
{
rom += rom_size - sdata_size;
for (i = 0; i < sdata_size; i++) {
sdata[i] = rom[(i & ~0x1F) + ((i & 7) << 2) + ((~i & 8) >> 2) + ((i & 0x10) >> 4)];
}
} else {
rom += rom_size - sdata_size /2;
for (i = 0; i < sdata_size / 2; i++) {
sdata[i + 0] = rom[(i & ~0x1F) + ((i & 7) << 2) + ((~i & 8) >> 2) + ((i & 0x10) >> 4) - 0x1000000 ];
sdata[i + sdata_size / 2] = rom[(i & ~0x1F) + ((i & 7) << 2) + ((~i & 8) >> 2) + ((i & 0x10) >> 4)];
}
}
}
Add this to the bottom:
// Original MAME by HalRIN - http://www52.tok2.com/home/foge/
// Ported to FBA by IQ_132 - http://www.freepgs.com/iq_132/
void svcchaos_cx_decrypt(unsigned char* src)
{
const unsigned char xor1[ 4 ] = {
0x34, 0x21, 0xc4, 0xe9,
};
int i;
int ofst;
int len = 0x4000000;
unsigned char *dst = (unsigned char*)malloc( len );
for( i = 0; i < len; i++ ){
src[ i ] ^= xor1[ (i % 4) ];
}
for( i = 0; i < len; i += 4 ){
UINT32 *src32 = (UINT32*)&src[ i ];
*src32 = BITSWAP32( *src32, 0x09, 0x0d, 0x13, 0x00, 0x17, 0x0f, 0x03, 0x05,
0x04, 0x0c, 0x11, 0x1e, 0x12, 0x15, 0x0b, 0x06,
0x1b, 0x0a, 0x1a, 0x1c, 0x14, 0x02, 0x0e, 0x1d,
0x18, 0x08, 0x01, 0x10, 0x19, 0x1f, 0x07, 0x16 );
}
memcpy( dst, src, len );
for( i = 0; i < len / 4; i++ ){
ofst = BITSWAP24( (i & 0x1fffff), 0x17, 0x16, 0x15, 0x04, 0x0b, 0x0e, 0x08, 0x0c,
0x10, 0x00, 0x0a, 0x13, 0x03, 0x06, 0x02, 0x07,
0x0d, 0x01, 0x11, 0x09, 0x14, 0x0f, 0x12, 0x05 );
ofst ^= 0x0c8923;
ofst += (i & 0xffe00000);
memcpy( &src[ i * 4 ], &dst[ ofst * 4 ], 0x04 );
}
free( dst );
}
src/burn/neogeo/neogeo.cpp
Find this:
for (int i = 0; i < (nNum >> 1); i++) {
BurnLoadRom(pBuf + 0, nOffset + (i << 1), 2);
BurnLoadRom(pBuf + 1, nOffset + 1 + (i << 1), 2);
for (int j = 0; j < 4; j++) {
BurnUpdateProgress(1.0 / ((double)nNum * 8.0 / 3.0), j ? NULL : "Decrypting graphics...", 0);
NeoGfxDecryptDoBlock(nNeoProtectionXor, pBuf + j * 0x400000, i * 0x800000 * 2 + j * 0x400000, 0x400000, nSpriteSize);
}
}
Replace with this:
for (int i = 0; i < (nNum >> 1); i++)
{
int k = 4, n = i;
if ((nSpriteSize == 0x4000000) && (nNum == 2))
{
pBuf = (UINT8*)malloc(nSpriteSize);
BurnLoadRom(pBuf + 0x0000000, nOffset + (i << 1), 1);
BurnLoadRom(pBuf + 0x2000000, nOffset + 1 + (i << 1), 1);
k = 16, n = 0, i = 2;
svcchaos_cx_decrypt(pBuf);
} else {
BurnLoadRom(pBuf + 0, nOffset + (i << 1), 2);
BurnLoadRom(pBuf + 1, nOffset + 1 + (i << 1), 2);
}
for (int j = 0; j < k; j++) {
BurnUpdateProgress(1.0 / ((double)nNum * 8.0 / 3.0), j ? NULL : _T("Decrypting graphics..."), 0);
NeoGfxDecryptDoBlock(nNeoProtectionXor, pBuf + j * 0x400000, n * 0x800000 * 2 + j * 0x400000, 0x400000, nSpriteSize);
}
}