SMS: add mapper and decryption for the game Janggun ui Adeul, add NONE mapper for Pooyan

This commit is contained in:
dinkc64 2015-03-20 21:10:22 +00:00
parent ab4685f219
commit 63bb982c97
3 changed files with 122 additions and 44 deletions

View File

@ -224,6 +224,10 @@ static INT32 load_rom()
// Override mapper from hardware code // Override mapper from hardware code
switch (BurnDrvGetHardwareCode() & 0xff) { switch (BurnDrvGetHardwareCode() & 0xff) {
case HARDWARE_SMS_MAPPER_NONE:
cart.mapper = MAPPER_NONE;
break;
case HARDWARE_SMS_MAPPER_CODIES: { case HARDWARE_SMS_MAPPER_CODIES: {
cart.mapper = MAPPER_CODIES; cart.mapper = MAPPER_CODIES;
break; break;
@ -324,16 +328,23 @@ INT32 SMSInit()
static void system_load_state() static void system_load_state()
{ {
if(cart.mapper == MAPPER_MSX || cart.mapper == MAPPER_MSX_NEMESIS || cart.mapper == MAPPER_KOREA8K) { if(cart.mapper == MAPPER_MSX || cart.mapper == MAPPER_MSX_NEMESIS) {
if (cart.fcr[3]) sms_mapper8k_w(3, cart.fcr[3]); if (cart.fcr[3]) sms_mapper8k_w(3, cart.fcr[3]);
if (cart.fcr[2]) sms_mapper8k_w(2, cart.fcr[2]); if (cart.fcr[2]) sms_mapper8k_w(2, cart.fcr[2]);
if (cart.fcr[1]) sms_mapper8k_w(1, cart.fcr[1]); if (cart.fcr[1]) sms_mapper8k_w(1, cart.fcr[1]);
if (cart.fcr[0]) sms_mapper8k_w(0, cart.fcr[0]); if (cart.fcr[0]) sms_mapper8k_w(0, cart.fcr[0]);
} else { } else {
sms_mapper_w(3, cart.fcr[3]); if(cart.mapper == MAPPER_KOREA8K) {
sms_mapper_w(2, cart.fcr[2]); if (cart.fcr[3]) sms_mapper8kvirt_w(3, cart.fcr[3]);
sms_mapper_w(1, cart.fcr[1]); if (cart.fcr[2]) sms_mapper8kvirt_w(2, cart.fcr[2]);
sms_mapper_w(0, cart.fcr[0]); if (cart.fcr[1]) sms_mapper8kvirt_w(1, cart.fcr[1]);
if (cart.fcr[0]) sms_mapper8kvirt_w(0, cart.fcr[0]);
} else {
sms_mapper_w(3, cart.fcr[3]);
sms_mapper_w(2, cart.fcr[2]);
sms_mapper_w(1, cart.fcr[1]);
sms_mapper_w(0, cart.fcr[0]);
}
if (!smsvdp_tmsmode) { if (!smsvdp_tmsmode) {
/* Force full pattern cache update when not in a TMS9918 mode */ /* Force full pattern cache update when not in a TMS9918 mode */
@ -7307,7 +7318,7 @@ struct BurnDriver BurnDrvsms_pooyan = {
"sms_pooyan", NULL, NULL, NULL, "19??", "sms_pooyan", NULL, NULL, NULL, "19??",
"Pooyan (Kor)\0", NULL, "HiCom", "Sega Master System", "Pooyan (Kor)\0", NULL, "HiCom", "Sega Master System",
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_MSX, GBF_MISC, 0, BDF_GAME_WORKING, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_NONE, GBF_MISC, 0,
SMSGetZipName, sms_pooyanRomInfo, sms_pooyanRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSGetZipName, sms_pooyanRomInfo, sms_pooyanRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo,
SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000,
256, 192, 4, 3 256, 192, 4, 3

View File

@ -14,6 +14,8 @@ UINT8 data_bus_pulldown = 0x00;
UINT8 dummy_write[0xffff]; UINT8 dummy_write[0xffff];
UINT8 *korean8kmap8000_9fff, *korean8kmapa000_bfff, *korean8kmap4000_5fff, *korean8kmap6000_7fff;
void __fastcall writemem_mapper_sega(UINT16 offset, UINT8 data) void __fastcall writemem_mapper_sega(UINT16 offset, UINT8 data)
{ {
sms.wram[offset & 0x1fff] = data; sms.wram[offset & 0x1fff] = data;
@ -22,7 +24,6 @@ void __fastcall writemem_mapper_sega(UINT16 offset, UINT8 data)
sms_mapper_w(offset & 3, data); sms_mapper_w(offset & 3, data);
} }
void __fastcall writemem_mapper_codies(UINT16 offset, UINT8 data) void __fastcall writemem_mapper_codies(UINT16 offset, UINT8 data)
{ {
switch(offset & 0xC000) switch(offset & 0xC000)
@ -46,7 +47,14 @@ void __fastcall writemem_mapper_msx(UINT16 offset, UINT8 data)
return; return;
} }
sms.wram[offset & 0x1fff] = data; if (offset >= 0xc000 && offset <= 0xffff)
sms.wram[offset & 0x1fff] = data;
}
void __fastcall writemem_mapper_none(UINT16 offset, UINT8 data)
{
if (offset >= 0xc000 && offset <= 0xffff)
sms.wram[offset & 0x1fff] = data;
} }
void __fastcall writemem_mapper_korea(UINT16 offset, UINT8 data) void __fastcall writemem_mapper_korea(UINT16 offset, UINT8 data)
@ -82,61 +90,72 @@ void __fastcall writemem_mapper_4pak(UINT16 offset, UINT8 data)
void __fastcall writemem_mapper_korea8k(UINT16 offset, UINT8 data) void __fastcall writemem_mapper_korea8k(UINT16 offset, UINT8 data)
{ {
if (offset == 0x4000) { if (offset == 0x4000) {
sms_mapper8k_w(2, data); sms_mapper8kvirt_w(2, data);
return; return;
} }
if (offset == 0x6000) { if (offset == 0x6000) {
sms_mapper8k_w(3, data); sms_mapper8kvirt_w(3, data);
return; return;
} }
if (offset == 0x8000) { if (offset == 0x8000) {
sms_mapper8k_w(0, data); sms_mapper8kvirt_w(0, data);
return; return;
} }
if (offset == 0xA000) { if (offset == 0xA000) {
sms_mapper8k_w(1, data); sms_mapper8kvirt_w(1, data);
return; return;
} }
if (offset == 0xFFFE) if (offset == 0xFFFE) {
{ sms_mapper8kvirt_w(2, (data << 1) & 0xFF);
sms_mapper8k_w(2, (data << 1) & 0xFF); sms_mapper8kvirt_w(3, (1 + (data << 1)) & 0xFF);
sms_mapper8k_w(3, (1 + (data << 1)) & 0xFF);
} }
else if (offset == 0xFFFF) else if (offset == 0xFFFF) {
{ sms_mapper8kvirt_w(0, (data << 1) & 0xFF);
sms_mapper8k_w(0, (data << 1) & 0xFF); sms_mapper8kvirt_w(1, (1 + (data << 1)) & 0xFF);
sms_mapper8k_w(1, (1 + (data << 1)) & 0xFF);
} }
sms.wram[offset & 0x1fff] = data; sms.wram[offset & 0x1fff] = data;
} }
UINT8 __fastcall readmem_mapper_korea8k(UINT16 offset) // super WIP, Janggun encryption UINT8 __fastcall readmem_mapper_korea8k(UINT16 offset) // aka Janggun
{ {
UINT8 data; UINT8 data = 0;
if(offset >= 0xc000 && offset <= 0xffff) if(offset >= 0xc000 && offset <= 0xffff)
data = sms.wram[offset & 0x1fff]; data = sms.wram[offset & 0x1fff];
else data = ZetReadByte(offset); else
if(offset >= 0x0000 && offset <= 0x3fff)
data = cart.rom[offset];
else
if(offset >= 0x4000 && offset <= 0x5fff)
data = korean8kmap4000_5fff[offset & 0x1fff];
else
if(offset >= 0x6000 && offset <= 0x7fff)
data = korean8kmap6000_7fff[offset & 0x1fff];
else
if(offset >= 0x8000 && offset <= 0x9fff)
data = korean8kmap8000_9fff[offset & 0x1fff];
else
if(offset >= 0xa000 && offset <= 0xbfff)
data = korean8kmapa000_bfff[offset & 0x1fff];
/* 16k page */ /* 16k page */
UINT8 page = offset >> 14; UINT8 page = offset >> 14;
/* $4000-$7FFFF and $8000-$BFFF area are protected */ /* $4000-$7FFF and $8000-$BFFF area are protected */
if (((page == 1) && (cart.fcr[2] & 0x80)) || ((page == 2) && (cart.fcr[0] & 0x80))) if (((page == 1) && (cart.fcr[2] & 0x80)) || ((page == 2) && (cart.fcr[0] & 0x80))) {
{ /* bit-swapped value */
/* bit-swapped value */ data = (((data >> 7) & 0x01) | ((data >> 5) & 0x02) |
data = (((data >> 7) & 0x01) | ((data >> 5) & 0x02) | ((data >> 3) & 0x04) | ((data >> 1) & 0x08) |
((data >> 3) & 0x04) | ((data >> 1) & 0x08) | ((data << 1) & 0x10) | ((data << 3) & 0x20) |
((data << 1) & 0x10) | ((data << 3) & 0x20) | ((data << 5) & 0x40) | ((data << 7) & 0x80));
((data << 5) & 0x40) | ((data << 7) & 0x80)); }
}
return data; return data;
} }
void sms_init(void) void sms_init(void)
@ -159,6 +178,11 @@ void sms_init(void)
bprintf(0, _T("MSX\n")); bprintf(0, _T("MSX\n"));
ZetSetWriteHandler(writemem_mapper_msx); ZetSetWriteHandler(writemem_mapper_msx);
} }
else if (cart.mapper == MAPPER_NONE)
{
bprintf(0, _T("NONE.\n"));
ZetSetWriteHandler(writemem_mapper_none);
}
else if (cart.mapper == MAPPER_KOREA) else if (cart.mapper == MAPPER_KOREA)
{ {
bprintf(0, _T("Korea\n")); bprintf(0, _T("Korea\n"));
@ -252,25 +276,37 @@ void sms_reset(void)
cart.fcr[2] = 0x01; cart.fcr[2] = 0x01;
cart.fcr[3] = 0x00; cart.fcr[3] = 0x00;
ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, MAP_ROM); // Default (0x0000 - 0xbfff) mappings:
ZetMapMemory(cart.rom + 0x0400, 0x0400, 0x3fff, MAP_ROM); if (cart.mapper == MAPPER_KOREA8K) { // aka Janggun ui Adeul (Kor)
ZetMapMemory(cart.rom + 0x4000, 0x4000, 0x7fff, MAP_ROM); ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, MAP_ROM);
ZetMapMemory(cart.rom + 0x8000, 0x8000, 0xbfff, MAP_ROM); ZetMapMemory(cart.rom + 0x0400, 0x0400, 0x3fff, MAP_ROM);
// These are mapped manually due to encryption (see readmem_mapper_korea8k()!)
korean8kmap4000_5fff = cart.rom + 0x4000;
korean8kmap6000_7fff = cart.rom + 0x6000;
korean8kmap8000_9fff = cart.rom + 0x8000;
korean8kmapa000_bfff = cart.rom + 0xa000;
cart.fcr[2] = 0x00;
} else {
ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, MAP_ROM);
ZetMapMemory(cart.rom + 0x0400, 0x0400, 0x3fff, MAP_ROM);
ZetMapMemory(cart.rom + 0x4000, 0x4000, 0x7fff, MAP_ROM);
ZetMapMemory(cart.rom + 0x8000, 0x8000, 0xbfff, MAP_ROM);
}
// Work Ram (0xc000 - 0xffff) mappings:
if(cart.mapper == MAPPER_CODIES || cart.mapper == MAPPER_4PAK) { if(cart.mapper == MAPPER_CODIES || cart.mapper == MAPPER_4PAK) {
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM);
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_RAM); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_RAM);
} else } else
if(cart.mapper == MAPPER_SEGA) { if(cart.mapper == MAPPER_SEGA || cart.mapper == MAPPER_KOREA8K) {
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM);
ZetMapMemory((UINT8 *)&dummy_write, 0x0000, 0xbfff, MAP_WRITE); ZetMapMemory((UINT8 *)&dummy_write, 0x0000, 0xbfff, MAP_WRITE);
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_READ); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_READ);
} else } else
{ { // MSX & Korea Mappers
// MSX & Korea Mappers
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM);
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_RAM); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_RAM);
memset(&sms.wram[1], 0xf0, sizeof(sms.wram) - 1); // this fixes a few korean games memset(&sms.wram[1], 0xf0, sizeof(sms.wram) - 1); // this memory pattern fixes booting of a few korean games
cart.fcr[2] = 0x00; cart.fcr[2] = 0x00;
} }
ZetReset(); ZetReset();
@ -296,7 +332,37 @@ void sms_reset(void)
} }
} }
void sms_mapper8k_w(INT32 address, UINT8 data) // WIP void sms_mapper8kvirt_w(INT32 address, UINT8 data)
{
/* Calculate ROM page index */
UINT32 poffset = (data % (cart.pages8k)) << 13;
/* Save frame control register data */
cart.fcr[address & 3] = data;
//bprintf(0, _T("pof(%X)a%X = %X,"), poffset, address, data);
/* 4 x 8k banks */
switch (address & 3)
{
case 0: /* cartridge ROM bank (8k) at $8000-$9FFF */
korean8kmap8000_9fff = cart.rom + poffset;
break;
case 1: /* cartridge ROM bank (8k) at $A000-$BFFF */
korean8kmapa000_bfff = cart.rom + poffset;
break;
case 2: /* cartridge ROM bank (8k) at $4000-$5FFF */
korean8kmap4000_5fff = cart.rom + poffset;
break;
case 3: /* cartridge ROM bank (8k) at $6000-$7FFF */
korean8kmap6000_7fff = cart.rom + poffset;
break;
}
}
void sms_mapper8k_w(INT32 address, UINT8 data)
{ {
/* Calculate ROM page index */ /* Calculate ROM page index */
UINT32 poffset = (data % (cart.pages8k)) << 13; UINT32 poffset = (data % (cart.pages8k)) << 13;

View File

@ -96,6 +96,7 @@ void sms_reset(void);
void sms_shutdown(void); void sms_shutdown(void);
void sms_mapper_w(INT32 address, UINT8 data); void sms_mapper_w(INT32 address, UINT8 data);
void sms_mapper8k_w(INT32 address, UINT8 data); void sms_mapper8k_w(INT32 address, UINT8 data);
void sms_mapper8kvirt_w(INT32 address, UINT8 data);
/* port-map Function prototypes */ /* port-map Function prototypes */
UINT8 z80_read_unmapped(void); UINT8 z80_read_unmapped(void);