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);
			}
		}