diff --git a/src/burn/drv/sms/d_sms.cpp b/src/burn/drv/sms/d_sms.cpp index f39a7a1d1..e406ced26 100644 --- a/src/burn/drv/sms/d_sms.cpp +++ b/src/burn/drv/sms/d_sms.cpp @@ -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 diff --git a/src/burn/drv/sms/sms.cpp b/src/burn/drv/sms/sms.cpp index 6bb04f310..f08bacab1 100644 --- a/src/burn/drv/sms/sms.cpp +++ b/src/burn/drv/sms/sms.cpp @@ -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; diff --git a/src/burn/drv/sms/sms.h b/src/burn/drv/sms/sms.h index 5faa0d804..0f5a83291 100644 --- a/src/burn/drv/sms/sms.h +++ b/src/burn/drv/sms/sms.h @@ -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);