diff --git a/meka/compat.txt b/meka/compat.txt index 306b6a89..2ce0c97d 100644 --- a/meka/compat.txt +++ b/meka/compat.txt @@ -558,7 +558,9 @@ Super Bubble Bobble (KR) - Ok Super Columns (KR) - Ok Super Futebol II [Game Box Série Esportes] (BR)- Ok - Super Game 45 (KR) - Ok + Super Game 30 [Road Fighter] [Super Game 45] (KR)- *Ok + Super Game 45 [Road Fighter] (KR) - *Ok + Super Game 45 [Teddy Boy] (KR) - Ok Super Game 52 Hap (KR) - Ok Super Game 150 (KR) - *Ok Super Game 180 (KR) - *Ok @@ -676,7 +678,7 @@ Zillion II: The Tri Formation [Proto] FM Ok Zool - Ok ----------------------------------------------------------------------------- - 655 games tested - 651 are "Ok" + 657 games tested - 653 are "Ok" ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- diff --git a/meka/meka.nam b/meka/meka.nam index 35d87c35..62581c8d 100644 --- a/meka/meka.nam +++ b/meka/meka.nam @@ -656,7 +656,9 @@ SMS 4e202aa2 3EE0DA7C01A6786D Super Game 180/COUNTRY=KR/EMU_MAPPER=20 SMS ba5d2776 1EBAD8829E4FF6EB Super Game 200/COUNTRY=KR/EMU_MAPPER=20 SMS d9ef7d69 7A8AA34E6083F137 Super Game 270/COUNTRY=KR/EMU_MAPPER=22 SMS d3056492 1537C90CFD960E3E Super Game 270 Hap ~ Jaemissneun-270/COUNTRY=KR/EMU_MAPPER=18 -SMS edb13847 3EEA007A568DAECD Super Game 45/COUNTRY=KR/EMU_MAPPER=21 +SMS 710bbdb4 2ED70C7D9A4A6A24 Super Game 30 [Road Fighter] [Super Game 45]/COUNTRY=KR/EMU_MAPPER=45 +SMS 4d3db8be 2ED70C7D9A4A6A24 Super Game 45 [Road Fighter]/COUNTRY=KR/EMU_MAPPER=44 +SMS edb13847 3EEA007A568DAECD Super Game 45 [Teddy Boy]/COUNTRY=KR/EMU_MAPPER=21 SMS a841c0b7 82F73F4413D9CF49 Super Game 52 Hap/COUNTRY=KR/EMU_MAPPER=20 SMS ab07ecd4 BA49364933A43F68 Super Game World 260 Hap/COUNTRY=KR/EMU_MAPPER=18 SMS 0cde0938 2DFBC7EBB5C63576 Super Game World 30 Hap/COUNTRY=KR/EMU_MAPPER=18/COMMENT=Variation of "Super World 30 Hap" diff --git a/meka/srcs/machine.cpp b/meka/srcs/machine.cpp index f6adcfdb..ed0e64be 100644 --- a/meka/srcs/machine.cpp +++ b/meka/srcs/machine.cpp @@ -199,6 +199,12 @@ void Machine_Set_Handler_MemRW(void) case MAPPER_SMS_Korean_MSX_SMS_8000: WrZ80 = WrZ80_NoHook = Write_Mapper_SMS_Korean_MSX_SMS_8000; break; + case MAPPER_SMS_Korean_MSX_16KB_BFFE: + WrZ80 = WrZ80_NoHook = Write_Mapper_SMS_Korean_MSX_16KB_BFFE; + break; + case MAPPER_SMS_Korean_MSX_16KB_FFFF: + WrZ80 = WrZ80_NoHook = Write_Mapper_SMS_Korean_MSX_16KB_FFFF; + break; } } @@ -502,6 +508,21 @@ void Machine_Set_Mapping (void) g_machine.mapper_regs[i] = 0; break; + case MAPPER_SMS_Korean_MSX_16KB_BFFE: + case MAPPER_SMS_Korean_MSX_16KB_FFFF: + Map_8k_ROM(0, (0x20 * 2) & tsms.Pages_Mask_8k); + Map_8k_ROM(1, ((0x20 * 2) | 1) & tsms.Pages_Mask_8k); + Map_8k_ROM(2, 0 & tsms.Pages_Mask_8k); + Map_8k_ROM(3, 1 & tsms.Pages_Mask_8k); + Map_8k_ROM(4, 0 & tsms.Pages_Mask_8k); + Map_8k_ROM(5, 1 & tsms.Pages_Mask_8k); + Map_8k_RAM(6, 0); + Map_8k_RAM(7, 0); + g_machine.mapper_regs_count = 1; + for (int i = 0; i != MAPPER_REGS_MAX; i++) + g_machine.mapper_regs[i] = 0; + break; + case MAPPER_SC3000_Survivors_Multicart: g_machine.mapper_regs_count = 1; for (int i = 0; i != MAPPER_REGS_MAX; i++) diff --git a/meka/srcs/mappers.cpp b/meka/srcs/mappers.cpp index 7610fbee..8bc0a050 100644 --- a/meka/srcs/mappers.cpp +++ b/meka/srcs/mappers.cpp @@ -989,6 +989,70 @@ WRITE_FUNC (Write_Mapper_SMS_Korean_MSX_SMS_8000) Write_Error (Addr, Value); } +// Mapper #44 +// Super Game 45 [Road Fighter] (KR) +WRITE_FUNC(Write_Mapper_SMS_Korean_MSX_16KB_BFFE) +{ + if (Addr == 0xBFFE) // Configurable segment ----------------------------------------------- + { + g_machine.mapper_regs[0] = Value; + unsigned int page_mask = ((Value & 0x3f) == 0x21) ? 0x3f : 0x1f; + Map_8k_ROM(2, (((Value & page_mask) * 2)) & tsms.Pages_Mask_8k); + Map_8k_ROM(3, (((Value & page_mask) * 2) | 1) & tsms.Pages_Mask_8k); + if (Value & 0x20) { + // "Namco" mapping: A B B A + Map_8k_ROM(4, (((Value & page_mask) * 2) | 1) & tsms.Pages_Mask_8k); + Map_8k_ROM(5, (((Value & page_mask) * 2)) & tsms.Pages_Mask_8k); + } else { + // normal mapping: A B A B + Map_8k_ROM(4, (((Value & page_mask) * 2)) & tsms.Pages_Mask_8k); + Map_8k_ROM(5, (((Value & page_mask) * 2) | 1) & tsms.Pages_Mask_8k); + } + return; + } + + switch (Addr >> 13) + { + // RAM [0xC000] = [0xE000] ------------------------------------------------ + case 6: Mem_Pages[6][Addr] = Value; return; + case 7: Mem_Pages[7][Addr] = Value; return; + } + + Write_Error(Addr, Value); +} + +// Mapper #45 +// Super Game 30 [Road Fighter] [Super Game 45] (KR) +WRITE_FUNC(Write_Mapper_SMS_Korean_MSX_16KB_FFFF) +{ + if (Addr == 0xFFFF) // Configurable segment ----------------------------------------------- + { + g_machine.mapper_regs[0] = Value; + unsigned int page_mask = ((Value & 0x3f) == 0x21) ? 0x3f : 0x1f; + Map_8k_ROM(2, (((Value & page_mask) * 2)) & tsms.Pages_Mask_8k); + Map_8k_ROM(3, (((Value & page_mask) * 2) | 1) & tsms.Pages_Mask_8k); + if (Value & 0x20) { + // "Namco" mapping: A B B A + Map_8k_ROM(4, (((Value & page_mask) * 2) | 1) & tsms.Pages_Mask_8k); + Map_8k_ROM(5, (((Value & page_mask) * 2)) & tsms.Pages_Mask_8k); + } else { + // normal mapping: A B A B + Map_8k_ROM(4, (((Value & page_mask) * 2)) & tsms.Pages_Mask_8k); + Map_8k_ROM(5, (((Value & page_mask) * 2) | 1) & tsms.Pages_Mask_8k); + } + //return; + } + + switch (Addr >> 13) + { + // RAM [0xC000] = [0xE000] ------------------------------------------------ + case 6: Mem_Pages[6][Addr] = Value; return; + case 7: Mem_Pages[7][Addr] = Value; return; + } + + Write_Error(Addr, Value); +} + // Based on MSX ASCII 8KB mapper? http://bifi.msxnet.org/msxnet/tech/megaroms.html#ascii8 // - This mapper requires 4 registers to save bank switching state. // However, all other mappers so far used only 3 registers, stored as 3 bytes. diff --git a/meka/srcs/mappers.h b/meka/srcs/mappers.h index 0ea32122..5fd759fb 100644 --- a/meka/srcs/mappers.h +++ b/meka/srcs/mappers.h @@ -43,7 +43,7 @@ #define MAPPER_SMS_Korean_MSX_8KB_0300 (18) // Registers at 0x0000,0x0100,0x0200,0x0300 (Super Multi Game Super 75 in 1, Super Game World 75 etc.) #define MAPPER_SMS_Korean_2000_xor_1F (19) // Register at 0x2000 (128 Hap, Game Mo-eumjip 188 Hap etc.) #define MAPPER_SMS_Korean_BFFC (20) // Register at 0xBFFC -#define MAPPER_SMS_Korean_FFFE (21) // Register at 0xFFFE (Super Game 45) +#define MAPPER_SMS_Korean_FFFE (21) // Register at 0xFFFE (Super Game 45 [Teddy Boy]) #define MAPPER_SMS_Korean_FFF3_FFFC (22) // Registers at 0xFFF3 and 0xFFFC (Super Game 150, Super Game 270) #define MAPPER_SMS_Korean_0000_xor_FF (23) // Register at 0x0000 with MSX-oriented paging #define MAPPER_SMS_Korean_MD_FFF0 (24) // Registers at 0xFFF0 and 0xFFFF (Mega Mode Super Game 30 [SMS-MD]) @@ -51,6 +51,8 @@ #define MAPPER_SMS_Korean_MD_FFFA (26) // Registers at 0xFFFA and 0xFFFF (Game Jiphap 30 Hap [SMS-MD]) #define MAPPER_SMS_Korean_MSX_32KB_2000 (27) // Register at 0x2000 (2 Hap in 1 (Moai-ui bomul, David-2)) #define MAPPER_SMS_Korean_MSX_SMS_8000 (40) // Register at 0x8000 with 8KB granularity and both MSX and SMS game support (Zemina Best 88 [MISSING 64K]) +#define MAPPER_SMS_Korean_MSX_16KB_BFFE (44) // Register at 0xBFFE (Super Game 45 [Road Fighter]) +#define MAPPER_SMS_Korean_MSX_16KB_FFFF (45) // Register at 0xFFFF (Super Game 30 [Road Fighter] [Super Game 45]) #define READ_FUNC(_NAME) u8 _NAME(register u16 Addr) #define WRITE_FUNC(_NAME) void _NAME(register u16 Addr, register u8 Value) @@ -98,6 +100,8 @@ WRITE_FUNC (Write_Mapper_SMS_Korean_MD_FFF5); WRITE_FUNC (Write_Mapper_SMS_Korean_MD_FFFA); WRITE_FUNC (Write_Mapper_SMS_Korean_MSX_32KB_2000); WRITE_FUNC (Write_Mapper_SMS_Korean_MSX_SMS_8000); +WRITE_FUNC (Write_Mapper_SMS_Korean_MSX_16KB_BFFE); +WRITE_FUNC (Write_Mapper_SMS_Korean_MSX_16KB_FFFF); //----------------------------------------------------------------------------- void Out_SC3000_SurvivorsMulticarts_DataWrite(u8 v); diff --git a/meka/srcs/saves.cpp b/meka/srcs/saves.cpp index 34012e4e..e6be0d08 100644 --- a/meka/srcs/saves.cpp +++ b/meka/srcs/saves.cpp @@ -151,6 +151,12 @@ void Load_Game_Fixup(void) WrZ80_NoHook(0x8000, mapper_page); } break; + case MAPPER_SMS_Korean_MSX_16KB_BFFE: + WrZ80_NoHook(0xBFFE, g_machine.mapper_regs[0]); + break; + case MAPPER_SMS_Korean_MSX_16KB_FFFF: + WrZ80_NoHook(0xFFFF, g_machine.mapper_regs[0]); + break; } } @@ -347,6 +353,8 @@ int Save_Game_MSV(FILE *f) case MAPPER_SMS_Korean_MD_FFFA: case MAPPER_SMS_Korean_MSX_32KB_2000: case MAPPER_SMS_Korean_MSX_SMS_8000: + case MAPPER_SMS_Korean_MSX_16KB_BFFE: + case MAPPER_SMS_Korean_MSX_16KB_FFFF: default: fwrite (RAM, 0x2000, 1, f); // Do not use g_driver->ram because of g_driver video mode change break; @@ -527,6 +535,8 @@ int Load_Game_MSV(FILE *f) case MAPPER_SMS_Korean_MD_FFFA: case MAPPER_SMS_Korean_MSX_32KB_2000: case MAPPER_SMS_Korean_MSX_SMS_8000: + case MAPPER_SMS_Korean_MSX_16KB_BFFE: + case MAPPER_SMS_Korean_MSX_16KB_FFFF: default: fread (RAM, 0x2000, 1, f); // Do not use g_driver->ram because of g_driver video mode change break;