Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions meka/compat.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"
-----------------------------------------------------------------------------

-----------------------------------------------------------------------------
Expand Down
4 changes: 3 additions & 1 deletion meka/meka.nam
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
21 changes: 21 additions & 0 deletions meka/srcs/machine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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++)
Expand Down
64 changes: 64 additions & 0 deletions meka/srcs/mappers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 5 additions & 1 deletion meka/srcs/mappers.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,16 @@
#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])
#define MAPPER_SMS_Korean_MD_FFF5 (25) // Registers at 0xFFF5 and 0xFFFF (Jaemiissneun Game Mo-eumjip 42/65 Hap [SMS-MD], Pigu Wang Hap ~ Jaemiiss-neun Game Mo-eumjip [SMS-MD])
#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)
Expand Down Expand Up @@ -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);

Expand Down
10 changes: 10 additions & 0 deletions meka/srcs/saves.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down