OK, got this working, JImmy_Page tipped me off about it being a problem with the cx_decrypt ;)
// Lansquenet 2004 (hack)
static struct BurnRomInfo lans2004RomDesc[] = {
{ "lnsq-p1.bin", 0x200000, 0xb40a879a, 1 | BRF_ESS | BRF_PRG }, // 0 68K code
{ "lnsq-p21.bin", 0x200000, 0xecdb2d42, 1 | BRF_ESS | BRF_PRG }, // 1
{ "lnsq-p22.bin", 0x200000, 0xfac5e2e7, 1 | BRF_ESS | BRF_PRG }, // 2
{ "lnsq-s1.bin", 0x020000, 0x39e82897, 2 | BRF_GRA }, // 3 Text data
{ "lnsq-c1.bin", 0x800000, 0xb83de59f, 3 | BRF_GRA }, // 4 Sprite data
{ "lnsq-c2.bin", 0x800000, 0xe08969fd, 3 | BRF_GRA }, // 5
{ "lnsq-c3.bin", 0x800000, 0x013f2cda, 3 | BRF_GRA }, // 6
{ "lnsq-c4.bin", 0x800000, 0xd8c3a758, 3 | BRF_GRA }, // 7
{ "lnsq-c5.bin", 0x800000, 0x75500b82, 3 | BRF_GRA }, // 8
{ "lnsq-c6.bin", 0x800000, 0x670ac13b, 3 | BRF_GRA }, // 9
{ "246-m1.bin", 0x020000, 0xd0604ad1, 4 | BRF_ESS | BRF_PRG }, // 10 Z80 code
{ "lnsq-v1.bin", 0x400000, 0x4408ebc3, 5 | BRF_SND }, // 11 Sound data
{ "lnsq-v2.bin", 0x400000, 0x3d953975, 5 | BRF_SND }, // 12
{ "lnsq-v3.bin", 0x200000, 0x437d1d8e, 5 | BRF_SND }, // 13
};
STDROMPICKEXT(lans2004, lans2004, neogeo);
STD_ROM_FN(lans2004);
static void lans2004_sx_decrypt()
{
unsigned char* tmp = (unsigned char*)malloc(0x20000);
if (tmp) {
memcpy( tmp, NeoTextROM + 0x20000, 0x20000 );
// descrambling the S1 by dorriGa
for ( int j = 0; j < 0x20000; j += 0x000010 ) {
memcpy( NeoTextROM + 0x20000 + j, tmp + j + 0x000008, 8);
memcpy( NeoTextROM + 0x20000 + j + 0x000008, tmp + j, 8);
}
}
free( tmp );
}
// Thanks to Jimmy_Page for the fix :)
static void lans2004_cx_decrypt()
{
unsigned char* src = NeoSpriteROM;
unsigned char* cso = (unsigned char*)malloc(128);
for (int i=0;i < 0x3000000; i+=128){
memcpy(cso, src+i+64, 64);
memcpy(cso+64, src+i, 64);
memcpy(NeoSpriteROM+i, cso, 128);
}
free(cso);
}
// Thanks to Razoola for the info
static void lans2004_px_decrypt()
{
int i;
unsigned char *src = Neo68KROM;
unsigned short *rom = (unsigned short*)Neo68KROM;
unsigned char *dst = (unsigned char*)malloc(0x600000);
if (dst) {
int sec[8] = { 0x3, 0x8, 0x7, 0xC, 0x1, 0xA, 0x6, 0xD };
for (i = 0; i < 8; i++)
memcpy (dst + i * 0x20000, src + sec[i] * 0x20000, 0x20000);
memcpy (dst + 0x0BBB00, src + 0x045B00, 0x001710);
memcpy (dst + 0x02FFF0, src + 0x1A92BE, 0x000010);
memcpy (dst + 0x100000, src + 0x200000, 0x400000);
memcpy (src, dst, 0x600000);
free (dst);
}
for (i = 0xBBB00/2; i < 0xBE000/2; i++) {
if ((((rom[i]&0xFFBF)==0x4EB9) || ((rom[i]&0xFFBF)==0x43B9)) && (rom[i+1]==0x0000)) {
rom[i + 1] = 0x000B;
rom[i + 2] += 0x6000;
}
}
for (i = 0; i < 0x100000/2; i++)
if ((rom[i]==0xBE79) && (rom[i+1]==0x0010)) rom[i+3] = 0x6002;
rom[0x2D15C/2] = 0x000B;
rom[0x2D15E/2] = 0xBB00;
lans2004_sx_decrypt();
lans2004_cx_decrypt();
}
static int lans2004Init()
{
extern unsigned char* YM2610ADPCMAROM;
pNeoInitCallback = lans2004_px_decrypt;
int nRet = NeoInit();
if (nRet == 0) {
for (int i = 0; i < 0xA00000; i++)
YM2610ADPCMAROM[i] = BITSWAP08(YM2610ADPCMAROM[i], 0, 1, 5, 4, 3, 2, 6, 7);
}
return nRet;
}
struct BurnDriver BurnDrvlans2004 = {
"lans2004", "shocktr2", "neogeo", "2002",
"Lansquenet 2004 (hack)\0", NULL, "Saurus", "Neo Geo",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SNK_NEOGEO,
NULL, lans2004RomInfo, lans2004RomName, neogeoInputInfo, neogeoDIPInfo,
lans2004Init, NeoExit, NeoFrame, NeoRender, NeoScan, &NeoRecalcPalette,
nNeoScreenWidth, 224, 4, 3
};