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
switch (BurnDrvGetHardwareCode() & 0xff) {
case HARDWARE_SMS_MAPPER_NONE:
cart.mapper = MAPPER_NONE;
break;
case HARDWARE_SMS_MAPPER_CODIES: {
cart.mapper = MAPPER_CODIES;
break;
@ -324,16 +328,23 @@ INT32 SMSInit()
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[2]) sms_mapper8k_w(2, cart.fcr[2]);
if (cart.fcr[1]) sms_mapper8k_w(1, cart.fcr[1]);
if (cart.fcr[0]) sms_mapper8k_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(cart.mapper == MAPPER_KOREA8K) {
if (cart.fcr[3]) sms_mapper8kvirt_w(3, cart.fcr[3]);
if (cart.fcr[2]) sms_mapper8kvirt_w(2, cart.fcr[2]);
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) {
/* 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??",
"Pooyan (Kor)\0", NULL, "HiCom", "Sega Master System",
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,
SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000,
256, 192, 4, 3

View File

@ -14,6 +14,8 @@ UINT8 data_bus_pulldown = 0x00;
UINT8 dummy_write[0xffff];
UINT8 *korean8kmap8000_9fff, *korean8kmapa000_bfff, *korean8kmap4000_5fff, *korean8kmap6000_7fff;
void __fastcall writemem_mapper_sega(UINT16 offset, UINT8 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);
}
void __fastcall writemem_mapper_codies(UINT16 offset, UINT8 data)
{
switch(offset & 0xC000)
@ -46,7 +47,14 @@ void __fastcall writemem_mapper_msx(UINT16 offset, UINT8 data)
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)
@ -82,61 +90,72 @@ void __fastcall writemem_mapper_4pak(UINT16 offset, UINT8 data)
void __fastcall writemem_mapper_korea8k(UINT16 offset, UINT8 data)
{
if (offset == 0x4000) {
sms_mapper8k_w(2, data);
sms_mapper8kvirt_w(2, data);
return;
}
if (offset == 0x6000) {
sms_mapper8k_w(3, data);
sms_mapper8kvirt_w(3, data);
return;
}
if (offset == 0x8000) {
sms_mapper8k_w(0, data);
sms_mapper8kvirt_w(0, data);
return;
}
if (offset == 0xA000) {
sms_mapper8k_w(1, data);
sms_mapper8kvirt_w(1, data);
return;
}
if (offset == 0xFFFE)
{
sms_mapper8k_w(2, (data << 1) & 0xFF);
sms_mapper8k_w(3, (1 + (data << 1)) & 0xFF);
if (offset == 0xFFFE) {
sms_mapper8kvirt_w(2, (data << 1) & 0xFF);
sms_mapper8kvirt_w(3, (1 + (data << 1)) & 0xFF);
}
else if (offset == 0xFFFF)
{
sms_mapper8k_w(0, (data << 1) & 0xFF);
sms_mapper8k_w(1, (1 + (data << 1)) & 0xFF);
else if (offset == 0xFFFF) {
sms_mapper8kvirt_w(0, (data << 1) & 0xFF);
sms_mapper8kvirt_w(1, (1 + (data << 1)) & 0xFF);
}
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)
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 */
UINT8 page = offset >> 14;
/* 16k page */
UINT8 page = offset >> 14;
/* $4000-$7FFFF and $8000-$BFFF area are protected */
if (((page == 1) && (cart.fcr[2] & 0x80)) || ((page == 2) && (cart.fcr[0] & 0x80)))
{
/* bit-swapped value */
data = (((data >> 7) & 0x01) | ((data >> 5) & 0x02) |
((data >> 3) & 0x04) | ((data >> 1) & 0x08) |
((data << 1) & 0x10) | ((data << 3) & 0x20) |
((data << 5) & 0x40) | ((data << 7) & 0x80));
}
/* $4000-$7FFF and $8000-$BFFF area are protected */
if (((page == 1) && (cart.fcr[2] & 0x80)) || ((page == 2) && (cart.fcr[0] & 0x80))) {
/* bit-swapped value */
data = (((data >> 7) & 0x01) | ((data >> 5) & 0x02) |
((data >> 3) & 0x04) | ((data >> 1) & 0x08) |
((data << 1) & 0x10) | ((data << 3) & 0x20) |
((data << 5) & 0x40) | ((data << 7) & 0x80));
}
return data;
return data;
}
void sms_init(void)
@ -159,6 +178,11 @@ void sms_init(void)
bprintf(0, _T("MSX\n"));
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)
{
bprintf(0, _T("Korea\n"));
@ -252,25 +276,37 @@ void sms_reset(void)
cart.fcr[2] = 0x01;
cart.fcr[3] = 0x00;
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);
// Default (0x0000 - 0xbfff) mappings:
if (cart.mapper == MAPPER_KOREA8K) { // aka Janggun ui Adeul (Kor)
ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, 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) {
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM);
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_RAM);
} 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 *)&dummy_write, 0x0000, 0xbfff, MAP_WRITE);
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_READ);
} else
{
// MSX & Korea Mappers
{ // MSX & Korea Mappers
ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, 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;
}
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 */
UINT32 poffset = (data % (cart.pages8k)) << 13;

View File

@ -96,6 +96,7 @@ void sms_reset(void);
void sms_shutdown(void);
void sms_mapper_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 */
UINT8 z80_read_unmapped(void);