diff --git a/src/burn/drv/sms/d_sms.cpp b/src/burn/drv/sms/d_sms.cpp index ebfbff975..5a7e1028c 100644 --- a/src/burn/drv/sms/d_sms.cpp +++ b/src/burn/drv/sms/d_sms.cpp @@ -177,23 +177,16 @@ void system_manage_sram(UINT8 */*sram*/, INT32 /*slot*/, INT32 /*mode*/) } // Notes: -// X-prefix = not working, possibly a different mapper(?) -// Sangokushi 3 (Kor) is broke. maybe its a korean 8k mapper? -// Super Arkanoid - no input?? -// Dinobasher - weird! -// Earthworm Jim - crashes after title -// GP Rider - goes mental in-game -// Jang Pung 3 - goes mental @ boot -// Space Gun - won't boot -// Shadow Dancer - won't boot +// Super Arkanoid / Woody Pop - no input (needs paddle controller) +// Back to the Future II - bottom of the screen is corrupt +// Space Gun - won't boot (needs lightgun) // Street Fighter II - reboots @ game start -// Spiderman - Sinister Six - won't boot // The Best Game Collection - don't work // GG: -// Terminator 1 and 2 - weird issues, weird graphics at boot +// Terminator 1 and 2 - weird issues in game, weird graphics at boot // Surf ninjas - weird graphics at boot -// Tarzan - freezes at game start +// Tarzan - weird graphics at bottom of the screen static INT32 load_rom() { @@ -334,26 +327,27 @@ INT32 SMSInit() static void system_load_state() { if(cart.mapper == MAPPER_MSX || cart.mapper == MAPPER_MSX_NEMESIS || cart.mapper == MAPPER_KOREA8K) { - sms_mapper8k_w(3, cart.fcr[3]); - sms_mapper8k_w(2, cart.fcr[2]); - sms_mapper8k_w(1, cart.fcr[1]); - sms_mapper8k_w(0, cart.fcr[0]); + 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]); - /* Force full pattern cache update */ - bg_list_index = 0x200; - for(INT32 i = 0; i < 0x200; i++) { - bg_name_list[i] = i; - bg_name_dirty[i] = (UINT8)-1; + if (!smsvdp_tmsmode) { + /* Force full pattern cache update when not in a TMS9918 mode */ + bg_list_index = 0x200; + for(INT32 i = 0; i < 0x200; i++) { + bg_name_list[i] = i; + bg_name_dirty[i] = (UINT8)-1; + } + /* Restore palette */ + for(INT32 i = 0; i < PALETTE_SIZE; i++) + palette_sync(i, 1); } - - /* Restore palette */ - for(INT32 i = 0; i < PALETTE_SIZE; i++) - palette_sync(i, 1); } } @@ -450,7 +444,7 @@ static struct BurnRomInfo sms_4pakRomDesc[] = { STD_ROM_PICK(sms_4pak) STD_ROM_FN(sms_4pak) -struct BurnDriver BurnDrvsms_4pak = { +struct BurnDriverD BurnDrvsms_4pak = { "sms_4pak", NULL, NULL, NULL, "1995", "4 PAK All Action (Aus)\0", NULL, "HES", "Sega Master System", NULL, NULL, NULL, NULL, @@ -470,7 +464,7 @@ static struct BurnRomInfo sms_20em1RomDesc[] = { STD_ROM_PICK(sms_20em1) STD_ROM_FN(sms_20em1) -struct BurnDriver BurnDrvsms_20em1 = { +struct BurnDriverD BurnDrvsms_20em1 = { "sms_20em1", NULL, NULL, NULL, "1995", "20 em 1 (Bra)\0", NULL, "Tec Toy", "Sega Master System", NULL, NULL, NULL, NULL, @@ -492,7 +486,7 @@ STD_ROM_FN(sms_3dragon) struct BurnDriver BurnDrvsms_3dragon = { "sms_3dragon", NULL, NULL, NULL, "19??", - "The Three Dragon Story (Kor)\0", NULL, "Zemina?", "Sega Master System", + "The Three Dragon Story (Kor)\0", NULL, "Zemina", "Sega Master System", NULL, NULL, NULL, NULL, BDF_GAME_WORKING, 2, HARDWARE_SEGA_MASTER_SYSTEM, GBF_MISC, 0, SMSGetZipName, sms_3dragonRomInfo, sms_3dragonRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, @@ -1710,7 +1704,7 @@ static struct BurnRomInfo sms_hicom3aRomDesc[] = { STD_ROM_PICK(sms_hicom3a) STD_ROM_FN(sms_hicom3a) -struct BurnDriver BurnDrvsms_hicom3a = { +struct BurnDriverD 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, @@ -1730,7 +1724,7 @@ static struct BurnRomInfo sms_hicom3bRomDesc[] = { STD_ROM_PICK(sms_hicom3b) STD_ROM_FN(sms_hicom3b) -struct BurnDriver BurnDrvsms_hicom3b = { +struct BurnDriverD 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, @@ -1750,7 +1744,7 @@ static struct BurnRomInfo sms_hicom3cRomDesc[] = { STD_ROM_PICK(sms_hicom3c) STD_ROM_FN(sms_hicom3c) -struct BurnDriver BurnDrvsms_hicom3c = { +struct BurnDriverD 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, @@ -1770,7 +1764,7 @@ static struct BurnRomInfo sms_hicom3dRomDesc[] = { STD_ROM_PICK(sms_hicom3d) STD_ROM_FN(sms_hicom3d) -struct BurnDriver BurnDrvsms_hicom3d = { +struct BurnDriverD 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, @@ -1790,7 +1784,7 @@ static struct BurnRomInfo sms_hicom3eRomDesc[] = { STD_ROM_PICK(sms_hicom3e) STD_ROM_FN(sms_hicom3e) -struct BurnDriver BurnDrvsms_hicom3e = { +struct BurnDriverD 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, @@ -1810,7 +1804,7 @@ static struct BurnRomInfo sms_hicom3fRomDesc[] = { STD_ROM_PICK(sms_hicom3f) STD_ROM_FN(sms_hicom3f) -struct BurnDriver BurnDrvsms_hicom3f = { +struct BurnDriverD 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, @@ -1830,7 +1824,7 @@ static struct BurnRomInfo sms_hicom8aRomDesc[] = { STD_ROM_PICK(sms_hicom8a) STD_ROM_FN(sms_hicom8a) -struct BurnDriver BurnDrvsms_hicom8a = { +struct BurnDriverD 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, @@ -1850,7 +1844,7 @@ static struct BurnRomInfo sms_hicom8bRomDesc[] = { STD_ROM_PICK(sms_hicom8b) STD_ROM_FN(sms_hicom8b) -struct BurnDriver BurnDrvsms_hicom8b = { +struct BurnDriverD 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, @@ -1870,7 +1864,7 @@ static struct BurnRomInfo sms_hicom8cRomDesc[] = { STD_ROM_PICK(sms_hicom8c) STD_ROM_FN(sms_hicom8c) -struct BurnDriver BurnDrvsms_hicom8c = { +struct BurnDriverD 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, @@ -3114,7 +3108,7 @@ struct BurnDriver BurnDrvsms_dinobash = { "sms_dinobash", NULL, NULL, NULL, "19??", "Dinobasher Starring Bignose the Caveman (Euro, Prototype)\0", NULL, "Codemasters", "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_CODIES | HARDWARE_SMS_DISPLAY_PAL, GBF_MISC, 0, SMSGetZipName, sms_dinobashRomInfo, sms_dinobashRomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, SMSInit, SMSExit, SMSFrame, SMSDraw, SMSScan, &SMSPaletteRecalc, 0x1000, 256, 192, 4, 3 @@ -5712,7 +5706,7 @@ STD_ROM_FN(sms_knightm2) struct BurnDriver BurnDrvsms_knightm2 = { "sms_knightm2", NULL, NULL, NULL, "199?", - "Knightmare II - The Maze of Galious (Kor)\0", NULL, "Zemina?", "Sega Master System", + "Knightmare II - The Maze of Galious (Kor)\0", NULL, "Zemina", "Sega Master System", NULL, NULL, NULL, NULL, BDF_GAME_WORKING, 2, HARDWARE_SEGA_MASTER_SYSTEM | HARDWARE_SMS_MAPPER_MSX, GBF_MISC, 0, SMSGetZipName, sms_knightm2RomInfo, sms_knightm2RomName, NULL, NULL, SMSInputInfo, SMSDIPInfo, diff --git a/src/burn/drv/sms/sms.cpp b/src/burn/drv/sms/sms.cpp index bd578542b..51e38ebc8 100644 --- a/src/burn/drv/sms/sms.cpp +++ b/src/burn/drv/sms/sms.cpp @@ -222,6 +222,11 @@ void sms_reset(void) if (IS_SMS) sms.wram[0] = 0xA8; // BIOS usually sets this. (memory control register) + cart.fcr[0] = 0x00; + cart.fcr[1] = 0x00; + 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); @@ -241,15 +246,11 @@ void sms_reset(void) 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 + cart.fcr[2] = 0x00; } ZetReset(); ZetClose(); - cart.fcr[0] = 0x00; - cart.fcr[1] = 0x00; - cart.fcr[2] = 0x01; - cart.fcr[3] = 0x00; - switch (cart.mapper) { case MAPPER_MSX_NEMESIS: { @@ -277,6 +278,7 @@ void sms_mapper8k_w(INT32 address, UINT8 data) // WIP /* 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) @@ -327,6 +329,8 @@ 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) // first 1k is in the Sega mapper + ZetMapMemory(cart.rom + 0x0000, 0x0000, 0x03ff, MAP_ROM); break; case 2: // page 1 diff --git a/src/burn/drv/sms/smsvdp.cpp b/src/burn/drv/sms/smsvdp.cpp index bff0c56d4..ea7a6c29f 100644 --- a/src/burn/drv/sms/smsvdp.cpp +++ b/src/burn/drv/sms/smsvdp.cpp @@ -14,6 +14,11 @@ static const UINT8 tms_crom[] = 0x04, 0x33, 0x15, 0x3F }; +static UINT32 TMS9928A_palette[16] = { + 0x000000, 0x000000, 0x21c842, 0x5edc78, 0x5455ed, 0x7d76fc, 0xd4524d, 0x42ebf5, + 0xfc5554, 0xff7978, 0xd4c154, 0xe6ce80, 0x21b03b, 0xc95bba, 0xcccccc, 0xffffff +}; + /* Mark a pattern as dirty */ #define MARK_BG_DIRTY(addr) \ { \ @@ -29,7 +34,7 @@ static const UINT8 tms_crom[] = /* VDP context */ vdp_t vdp; - +UINT32 smsvdp_tmsmode; /* Initialize VDP emulation */ void vdp_init(void) @@ -86,7 +91,8 @@ void viewport_check(void) { if(m4) { - /* Restore SMS palette */ + smsvdp_tmsmode = 0; + /* Restore SMS palette */ for(i = 0; i < PALETTE_SIZE; i++) { palette_sync(i, 1); @@ -94,26 +100,30 @@ void viewport_check(void) } else { + smsvdp_tmsmode = 1; /* Load TMS9918 palette */ for(i = 0; i < PALETTE_SIZE; i++) { - INT32 r, g, b; - - r = (tms_crom[i & 0x0F] >> 0) & 3; - g = (tms_crom[i & 0x0F] >> 2) & 3; - b = (tms_crom[i & 0x0F] >> 4) & 3; - - r = sms_cram_expand_table[r]; - g = sms_cram_expand_table[g]; - b = sms_cram_expand_table[b]; - - bitmap.pal.color[i][0] = r; - bitmap.pal.color[i][1] = g; - bitmap.pal.color[i][2] = b; - - pixel[i] = MAKE_PIXEL(r, g, b); - - bitmap.pal.dirty[i] = bitmap.pal.update = 1; + INT32 r, g, b; + + /*r = (tms_crom[i & 0x0F] >> 0) & 3; + g = (tms_crom[i & 0x0F] >> 2) & 3; + b = (tms_crom[i & 0x0F] >> 4) & 3; + + r = sms_cram_expand_table[r]; + g = sms_cram_expand_table[g]; + b = sms_cram_expand_table[b];*/ + r = TMS9928A_palette[i & 0x0f] >> 16; + g = TMS9928A_palette[i & 0x0f] >> 8; + b = TMS9928A_palette[i & 0x0f] >> 0; + + bitmap.pal.color[i][0] = r; + bitmap.pal.color[i][1] = g; + bitmap.pal.color[i][2] = b; + + pixel[i] = MAKE_PIXEL(r, g, b); + + bitmap.pal.dirty[i] = bitmap.pal.update = 1; } } } diff --git a/src/burn/drv/sms/smsvdp.h b/src/burn/drv/sms/smsvdp.h index f6b8f6c4e..e8d316883 100644 --- a/src/burn/drv/sms/smsvdp.h +++ b/src/burn/drv/sms/smsvdp.h @@ -49,6 +49,7 @@ typedef struct /* Global data */ extern vdp_t vdp; +extern UINT32 smsvdp_tmsmode; /* Function prototypes */ void vdp_init(void);