SMS: add mapper and decryption for the game Janggun ui Adeul, add NONE mapper for Pooyan
This commit is contained in:
parent
ab4685f219
commit
63bb982c97
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue