From bdce6b0fe97733001e243b8c1a6ff78b1a3f7df9 Mon Sep 17 00:00:00 2001 From: dinkc64 <12570148+dinkc64@users.noreply.github.com> Date: Sat, 21 Mar 2015 08:05:16 +0000 Subject: [PATCH] SMS: add mapper for korean 3 in 1 and 8 in 1 carts --- src/burn/drv/sms/d_sms.cpp | 45 +++++++++++++++++++++----------------- src/burn/drv/sms/sms.cpp | 39 +++++++++++++++++++++++++++++++-- src/burn/drv/sms/sms.h | 3 ++- 3 files changed, 64 insertions(+), 23 deletions(-) diff --git a/src/burn/drv/sms/d_sms.cpp b/src/burn/drv/sms/d_sms.cpp index e406ced26..5da2eb928 100644 --- a/src/burn/drv/sms/d_sms.cpp +++ b/src/burn/drv/sms/d_sms.cpp @@ -258,6 +258,11 @@ static INT32 load_rom() break; } + case HARDWARE_SMS_MAPPER_XIN1: { + cart.mapper = MAPPER_XIN1; + break; + } + default: { cart.mapper = MAPPER_SEGA; break; @@ -339,7 +344,7 @@ static void system_load_state() 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 { + } else if (cart.mapper != MAPPER_XIN1 && cart.mapper != MAPPER_NONE) { sms_mapper_w(3, cart.fcr[3]); sms_mapper_w(2, cart.fcr[2]); sms_mapper_w(1, cart.fcr[1]); @@ -357,7 +362,7 @@ static void system_load_state() for(INT32 i = 0; i < PALETTE_SIZE; i++) palette_sync(i, 1); } - viewport_check(); // maybe! - fixes 4pak all action sstates! + viewport_check(); // fixes 4pak all action sstate screen corruption } } @@ -1714,11 +1719,11 @@ static struct BurnRomInfo sms_hicom3aRomDesc[] = { STD_ROM_PICK(sms_hicom3a) STD_ROM_FN(sms_hicom3a) -struct BurnDriverD BurnDrvsms_hicom3a = { +struct BurnDriver BurnDrvsms_hicom3a = { "sms_hicom3a", NULL, NULL, NULL, "1990", "The Best Game Collection - Hang On + Pit Pot + Spy vs Spy (Kor)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom3aRomInfo, sms_hicom3aRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1734,11 +1739,11 @@ static struct BurnRomInfo sms_hicom3bRomDesc[] = { STD_ROM_PICK(sms_hicom3b) STD_ROM_FN(sms_hicom3b) -struct BurnDriverD BurnDrvsms_hicom3b = { +struct BurnDriver BurnDrvsms_hicom3b = { "sms_hicom3b", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection - Great Baseball + Great Soccer + Super Tennis (Kor)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom3bRomInfo, sms_hicom3bRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1754,11 +1759,11 @@ static struct BurnRomInfo sms_hicom3cRomDesc[] = { STD_ROM_PICK(sms_hicom3c) STD_ROM_FN(sms_hicom3c) -struct BurnDriverD BurnDrvsms_hicom3c = { +struct BurnDriver BurnDrvsms_hicom3c = { "sms_hicom3c", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection - Teddy Boy Blues + Pit-Pot + Astro Flash (Kor)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom3cRomInfo, sms_hicom3cRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1774,11 +1779,11 @@ static struct BurnRomInfo sms_hicom3dRomDesc[] = { STD_ROM_PICK(sms_hicom3d) STD_ROM_FN(sms_hicom3d) -struct BurnDriverD BurnDrvsms_hicom3d = { +struct BurnDriver BurnDrvsms_hicom3d = { "sms_hicom3d", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection - Teddy Boy Blues + Great Soccer + Comical Machine Gun Joe (Kor)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom3dRomInfo, sms_hicom3dRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1794,11 +1799,11 @@ static struct BurnRomInfo sms_hicom3eRomDesc[] = { STD_ROM_PICK(sms_hicom3e) STD_ROM_FN(sms_hicom3e) -struct BurnDriverD BurnDrvsms_hicom3e = { +struct BurnDriver BurnDrvsms_hicom3e = { "sms_hicom3e", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection - Ghost House + Teddy Boy Blues + Seishun Scandal (Kor)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom3eRomInfo, sms_hicom3eRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1814,11 +1819,11 @@ static struct BurnRomInfo sms_hicom3fRomDesc[] = { STD_ROM_PICK(sms_hicom3f) STD_ROM_FN(sms_hicom3f) -struct BurnDriverD BurnDrvsms_hicom3f = { +struct BurnDriver BurnDrvsms_hicom3f = { "sms_hicom3f", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection - Satellite-7 + Great Baseball + Seishun Scandal (Kor)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom3fRomInfo, sms_hicom3fRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1834,11 +1839,11 @@ static struct BurnRomInfo sms_hicom8aRomDesc[] = { STD_ROM_PICK(sms_hicom8a) STD_ROM_FN(sms_hicom8a) -struct BurnDriverD BurnDrvsms_hicom8a = { +struct BurnDriver BurnDrvsms_hicom8a = { "sms_hicom8a", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection (Kor, 8 in 1 Ver. A)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom8aRomInfo, sms_hicom8aRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1854,11 +1859,11 @@ static struct BurnRomInfo sms_hicom8bRomDesc[] = { STD_ROM_PICK(sms_hicom8b) STD_ROM_FN(sms_hicom8b) -struct BurnDriverD BurnDrvsms_hicom8b = { +struct BurnDriver BurnDrvsms_hicom8b = { "sms_hicom8b", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection (Kor, 8 in 1 Ver. B)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom8bRomInfo, sms_hicom8bRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -1874,11 +1879,11 @@ static struct BurnRomInfo sms_hicom8cRomDesc[] = { STD_ROM_PICK(sms_hicom8c) STD_ROM_FN(sms_hicom8c) -struct BurnDriverD BurnDrvsms_hicom8c = { +struct BurnDriver BurnDrvsms_hicom8c = { "sms_hicom8c", "sms_hicom3a", NULL, NULL, "1990", "The Best Game Collection (Kor, 8 in 1 Ver. C)\0", NULL, "Hi-Com", "Sega Master System", NULL, NULL, NULL, NULL, - BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, + BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_XIN1, GBF_MISC, 0, SMSGetZipName, sms_hicom8cRomInfo, sms_hicom8cRomName, 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 f08bacab1..fac4dfbf2 100644 --- a/src/burn/drv/sms/sms.cpp +++ b/src/burn/drv/sms/sms.cpp @@ -87,6 +87,30 @@ void __fastcall writemem_mapper_4pak(UINT16 offset, UINT8 data) sms.wram[offset & 0x1fff] = data; } +void __fastcall writemem_mapper_xin1(UINT16 offset, UINT8 data) +{ + if (offset == 0xFFFF) { + sms.wram[0x1fff] = data; + cart.fcr[0] = data % (cart.pages * 2); + return; + } + + sms.wram[offset & 0x1fff] = data; +} + +UINT8 __fastcall readmem_mapper_xin1(UINT16 offset) // HiCom Xin1 +{ + if(offset >= 0xc000 && offset <= 0xffff) + return sms.wram[offset & 0x1fff]; + else + if (offset >= 0x8000) { + return cart.rom[offset & 0x3fff]; + } + + return cart.rom[(cart.fcr[0] * 0x8000) + offset]; +} + + void __fastcall writemem_mapper_korea8k(UINT16 offset, UINT8 data) { if (offset == 0x4000) { @@ -199,6 +223,12 @@ void sms_init(void) bprintf(0, _T("4PAK All Action\n")); ZetSetWriteHandler(writemem_mapper_4pak); } + else if (cart.mapper == MAPPER_XIN1) + { + bprintf(0, _T("Hi Com Xin1\n")); + ZetSetWriteHandler(writemem_mapper_xin1); + ZetSetReadHandler(readmem_mapper_xin1); + } else { bprintf(0, _T("Sega\n")); ZetSetWriteHandler(writemem_mapper_sega); @@ -286,6 +316,10 @@ void sms_reset(void) korean8kmap8000_9fff = cart.rom + 0x8000; korean8kmapa000_bfff = cart.rom + 0xa000; cart.fcr[2] = 0x00; + } else + if (cart.mapper == MAPPER_XIN1) { + // HiCom Xin1 Carts + // Nothing here (uses virtual mapping, see readmem/writemem_mapper_xin1()) } else { ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, MAP_ROM); ZetMapMemory(cart.rom + 0x0400, 0x0400, 0x3fff, MAP_ROM); @@ -298,7 +332,7 @@ void sms_reset(void) ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xc000, 0xdfff, MAP_RAM); ZetMapMemory((UINT8 *)&sms.wram + 0x0000, 0xe000, 0xffff, MAP_RAM); } else - if(cart.mapper == MAPPER_SEGA || cart.mapper == MAPPER_KOREA8K) { + if(cart.mapper == MAPPER_SEGA || cart.mapper == MAPPER_KOREA8K || cart.mapper == MAPPER_XIN1) { 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); @@ -396,6 +430,7 @@ void sms_mapper_w(INT32 address, UINT8 data) { /* Calculate ROM page index */ UINT32 poffset = (data % cart.pages) << 14; + //bprintf(0, _T("address[%X] pof(%X) data[%X],"), address, poffset, data); /* Save frame control register data */ cart.fcr[address & 3] = data; @@ -420,7 +455,7 @@ void sms_mapper_w(INT32 address, UINT8 data) case 1: // page 0 ZetMapMemory(cart.rom + poffset, 0x0000, 0x3fff, MAP_ROM); - if(cart.mapper != MAPPER_CODIES && cart.mapper != MAPPER_4PAK) // first 1k is in the Sega mapper + if(cart.mapper != MAPPER_CODIES && cart.mapper != MAPPER_4PAK && cart.mapper != MAPPER_XIN1) // first 1k is in the Sega mapper ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, MAP_ROM); break; diff --git a/src/burn/drv/sms/sms.h b/src/burn/drv/sms/sms.h index 0f5a83291..56e242339 100644 --- a/src/burn/drv/sms/sms.h +++ b/src/burn/drv/sms/sms.h @@ -17,7 +17,8 @@ enum { MAPPER_MSX_NEMESIS = 4, MAPPER_KOREA = 5, MAPPER_KOREA8K = 6, - MAPPER_4PAK = 7 + MAPPER_4PAK = 7, + MAPPER_XIN1 = 8 }; enum {