SMS: Korean mappers work. Fixes Cyborg Z, Dodgeball King, F1 Spirit, Jang Pang III, Knightmare II, Nemesis, Nemesis 2, Penguin Adventure, Sangokushi 3, Street Master, Wonsiin

This commit is contained in:
beirich 2014-03-14 04:30:01 +00:00
parent b1a37724a1
commit 8496f71812
5 changed files with 120 additions and 8 deletions

View File

@ -1303,12 +1303,12 @@ namespace BizHawk.Client.EmuHawk
ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions; ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions;
HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion; HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion;
SMSFix3DGameDisplayToolStripMenuItem.Visible = SMSEnableFMChipMenuItem.Visible =
SMSFix3DGameDisplayToolStripMenuItem.Visible =
SMSenableBIOSToolStripMenuItem.Visible = SMSenableBIOSToolStripMenuItem.Visible =
Global.Game.System == "SMS"; Global.Game.System == "SMS";
SMSEnableFMChipMenuItem.Visible = SMSOverclockMenuItem.Visible =
SMSOverclockMenuItem.Visible =
SMSForceStereoMenuItem.Visible = SMSForceStereoMenuItem.Visible =
SMS_NTSCToolStripMenuItem.Visible = SMS_NTSCToolStripMenuItem.Visible =
SMS_PALToolStripMenuItem.Visible = SMS_PALToolStripMenuItem.Visible =

View File

@ -435,6 +435,7 @@
<Compile Include="Consoles\Sega\Saturn\FilePiping.cs" /> <Compile Include="Consoles\Sega\Saturn\FilePiping.cs" />
<Compile Include="Consoles\Sega\Saturn\LibYabause.cs" /> <Compile Include="Consoles\Sega\Saturn\LibYabause.cs" />
<Compile Include="Consoles\Sega\Saturn\Yabause.cs" /> <Compile Include="Consoles\Sega\Saturn\Yabause.cs" />
<Compile Include="Consoles\Sega\SMS\MemoryMap.Korea.cs" />
<Compile Include="Consoles\Sega\SMS\MemoryMap.ExtRam.cs" /> <Compile Include="Consoles\Sega\SMS\MemoryMap.ExtRam.cs" />
<Compile Include="Consoles\Sega\SMS\MemoryMap.CodeMasters.cs" /> <Compile Include="Consoles\Sega\SMS\MemoryMap.CodeMasters.cs" />
<Compile Include="Consoles\Sega\SMS\MemoryMap.Sega.cs" /> <Compile Include="Consoles\Sega\SMS\MemoryMap.Sega.cs" />

View File

@ -0,0 +1,89 @@
namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
public partial class SMS
{
// Bank 0: Fixed - Maps $0000 - $3FFF
// Bank 1: Fixed - Maps $4000 - $7FFF
// Bank 2: Control Address $A000 - Maps $8000 - $BFFF
byte ReadMemoryKR(ushort address)
{
if (address < 0x8000) return RomData[address & 0x7FFF];
if (address < 0xC000) return RomData[(RomBank2 * BankSize) + (address & BankSizeMask)];
return SystemRam[address & RamSizeMask];
}
void WriteMemoryKR(ushort address, byte value)
{
if (address >= 0xC000)
SystemRam[address & RamSizeMask] = value;
else if (address == 0xA000)
RomBank2 = (byte)(value % RomBanks);
}
void InitKoreaMapper()
{
Cpu.ReadMemory = ReadMemoryKR;
Cpu.WriteMemory = WriteMemoryKR;
RomBank0 = 0;
RomBank1 = 1;
RomBank2 = 0;
}
// ======================================================================
// MSX mapper & Nemesis mapper
// ======================================================================
byte ReadMemoryMSX(ushort address)
{
if (address < 0x4000) return RomData[address & 0x3FFF];
if (address < 0x6000) return RomData[(RomBank0 * 0x2000) + (address & 0x1FFF)];
if (address < 0x8000) return RomData[(RomBank1 * 0x2000) + (address & 0x1FFF)];
if (address < 0xA000) return RomData[(RomBank2 * 0x2000) + (address & 0x1FFF)];
if (address < 0xC000) return RomData[(RomBank3 * 0x2000) + (address & 0x1FFF)];
return SystemRam[address & RamSizeMask];
}
byte ReadMemoryNemesis(ushort address)
{
if (address < 0x2000) return RomData[(15 * 0x2000) + (address & 0x1FFF)];
if (address < 0x4000) return RomData[address & 0x3FFF];
if (address < 0x6000) return RomData[(RomBank0 * 0x2000) + (address & 0x1FFF)];
if (address < 0x8000) return RomData[(RomBank1 * 0x2000) + (address & 0x1FFF)];
if (address < 0xA000) return RomData[(RomBank2 * 0x2000) + (address & 0x1FFF)];
if (address < 0xC000) return RomData[(RomBank3 * 0x2000) + (address & 0x1FFF)];
return SystemRam[address & RamSizeMask];
}
void WriteMemoryMSX(ushort address, byte value)
{
if (address >= 0xC000)
SystemRam[address & RamSizeMask] = value;
else if (address == 0)
RomBank2 = (byte)(value % (RomBanks*2));
else if (address == 1)
RomBank3 = (byte)(value % (RomBanks * 2));
else if (address == 2)
RomBank0 = (byte)(value % (RomBanks * 2));
else if (address == 3)
RomBank1 = (byte)(value % (RomBanks * 2));
}
void InitMSXMapper()
{
Cpu.ReadMemory = ReadMemoryMSX;
Cpu.WriteMemory = WriteMemoryMSX;
RomBank0 = 0;
RomBank1 = 0;
RomBank2 = 0;
RomBank3 = 0;
}
void InitNemesisMapper()
{
InitMSXMapper();
Cpu.ReadMemory = ReadMemoryNemesis;
}
}
}

View File

@ -18,6 +18,8 @@ using BizHawk.Emulation.Cores.Components.Z80;
+ Add Region to GameDB. + Add Region to GameDB.
+ Still need a "disable bios for japan-only games when bios is enabled and region is export" functionality + Still need a "disable bios for japan-only games when bios is enabled and region is export" functionality
+ Or a "force region to japan if game is only for japan" thing. Which one is better? + Or a "force region to japan if game is only for japan" thing. Which one is better?
+ I confess, Mapper system needs some refactoring and love. But right now I want to get all games to work and THEN refactor it.
+ Savestate system.... maybe use a zeromus-like system. Except maintain the text-savestate compatibility. Might give up some speed for improved maintainability tho.
**********************************************************/ **********************************************************/
@ -30,7 +32,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
// ROM // ROM
public byte[] RomData; public byte[] RomData;
public byte RomBank0, RomBank1, RomBank2; public byte RomBank0, RomBank1, RomBank2, RomBank3;
public byte RomBanks; public byte RomBanks;
// SaveRAM // SaveRAM
@ -186,6 +188,12 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
InitCodeMastersMapper(); InitCodeMastersMapper();
else if (game["ExtRam"]) else if (game["ExtRam"])
InitExt2kMapper(int.Parse(game.OptionValue("ExtRam"))); InitExt2kMapper(int.Parse(game.OptionValue("ExtRam")));
else if (game["KoreaMapper"])
InitKoreaMapper();
else if (game["MSXMapper"])
InitMSXMapper();
else if (game["NemesisMapper"])
InitNemesisMapper();
else else
InitSegaMapper(); InitSegaMapper();
@ -313,6 +321,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
writer.WriteLine("Bank0 {0}", RomBank0); writer.WriteLine("Bank0 {0}", RomBank0);
writer.WriteLine("Bank1 {0}", RomBank1); writer.WriteLine("Bank1 {0}", RomBank1);
writer.WriteLine("Bank2 {0}", RomBank2); writer.WriteLine("Bank2 {0}", RomBank2);
writer.WriteLine("Bank3 {0}", RomBank3);
writer.Write("RAM "); writer.Write("RAM ");
SystemRam.SaveAsHex(writer); SystemRam.SaveAsHex(writer);
writer.WriteLine("Port01 {0:X2}", Port01); writer.WriteLine("Port01 {0:X2}", Port01);
@ -352,6 +361,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
RomBank1 = byte.Parse(args[1]); RomBank1 = byte.Parse(args[1]);
else if (args[0] == "Bank2") else if (args[0] == "Bank2")
RomBank2 = byte.Parse(args[1]); RomBank2 = byte.Parse(args[1]);
else if (args[0] == "Bank3")
RomBank3 = byte.Parse(args[1]);
else if (args[0] == "Frame") else if (args[0] == "Frame")
Frame = int.Parse(args[1]); Frame = int.Parse(args[1]);
else if (args[0] == "Lag") else if (args[0] == "Lag")
@ -398,7 +409,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
public byte[] SaveStateBinary() public byte[] SaveStateBinary()
{ {
int buflen = 24808 + 16384 + 16384; int buflen = 24809 + 16384 + 16384;
if (ExtRam != null) if (ExtRam != null)
buflen += ExtRam.Length; buflen += ExtRam.Length;
var buf = new byte[buflen]; var buf = new byte[buflen];
@ -425,6 +436,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
writer.Write(RomBank0); writer.Write(RomBank0);
writer.Write(RomBank1); writer.Write(RomBank1);
writer.Write(RomBank2); writer.Write(RomBank2);
writer.Write(RomBank3);
writer.Write(SystemRam); writer.Write(SystemRam);
writer.Write(SaveRAM); writer.Write(SaveRAM);
writer.Write(Port01); writer.Write(Port01);
@ -448,6 +460,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
RomBank0 = reader.ReadByte(); RomBank0 = reader.ReadByte();
RomBank1 = reader.ReadByte(); RomBank1 = reader.ReadByte();
RomBank2 = reader.ReadByte(); RomBank2 = reader.ReadByte();
RomBank3 = reader.ReadByte();
SystemRam = reader.ReadBytes(SystemRam.Length); SystemRam = reader.ReadBytes(SystemRam.Length);
reader.Read(SaveRAM, 0, SaveRAM.Length); reader.Read(SaveRAM, 0, SaveRAM.Length);
Port01 = reader.ReadByte(); Port01 = reader.ReadByte();

View File

@ -244,6 +244,7 @@ C576C058 T The Cyber Shinobi (FR) SMS Terminus Traduction; v1.00
903AAD36 T Cyborg Hunter (BR) SMS FM 903AAD36 T Cyborg Hunter (BR) SMS FM
BDD034EE T Cyborg Hunter (IT) SMS FM BDD034EE T Cyborg Hunter (IT) SMS FM
0F2E4F1E T Cyborg Hunter (FR) SMS Terminus Traduction; v1.00 FM 0F2E4F1E T Cyborg Hunter (FR) SMS Terminus Traduction; v1.00 FM
77EFE84A Cyborg Z (KR) SMS MSXMapper
7694ED1C D Cycle Counter SMS FluBBa 7694ED1C D Cycle Counter SMS FluBBa
71ABEF27 Daffy Duck in Hollywood SMS 71ABEF27 Daffy Duck in Hollywood SMS
FCEFD481 D Damiana (v1) SMS Heliophobe; Y2Kode entry; accidentally has a very short level FCEFD481 D Damiana (v1) SMS Heliophobe; Y2Kode entry; accidentally has a very short level
@ -264,8 +265,8 @@ D1341667 D Digger Ball SMS Aypok & PlayGeneration; SMS Power Sega 8-bit Coding C
C4CA6878 D Digger Chan SMS Aypok; SMS Power Sega 8-bit Coding Competition 2006 entry C4CA6878 D Digger Chan SMS Aypok; SMS Power Sega 8-bit Coding Competition 2006 entry
EA5C3A6F Dinobasher - Starring Bignose the Caveman [Proto] SMS EA5C3A6F Dinobasher - Starring Bignose the Caveman [Proto] SMS
32F4B791 The Dinosaur Dooley (KR) SMS 32F4B791 The Dinosaur Dooley (KR) SMS
89B79E77 Dodgeball King (KR) SMS 89B79E77 Dodgeball King (KR) SMS KoreaMapper
A672D27C O Dodgeball King (KR) (80KB overdump) SMS A672D27C O Dodgeball King (KR) (80KB overdump) SMS KoreaMapper
A55D89F3 Double Dragon SMS FM A55D89F3 Double Dragon SMS FM
B8CFFA0F F Double Dragon (h) [A] SMS FM B8CFFA0F F Double Dragon (h) [A] SMS FM
3010152A F Double Dragon (h) [B] SMS FM 3010152A F Double Dragon (h) [B] SMS FM
@ -305,6 +306,7 @@ C10FCE39 E-SWAT [B] SMS
AA140C9C THe Excellent Dizzy Collection [SMS-GG] SMS CMMapper AA140C9C THe Excellent Dizzy Collection [SMS-GG] SMS CMMapper
EC788661 F1 SMS EC788661 F1 SMS
8AB10CB4 V F1 (first 128KB only) SMS 8AB10CB4 V F1 (first 128KB only) SMS
06965ED9 F1 Spirit (KR) SMS MSXMapper
EAEBF323 F-16 Fighter SMS EAEBF323 F-16 Fighter SMS
7CE06FCE F-16 Fighting Falcon (JP) SMS 7CE06FCE F-16 Fighting Falcon (JP) SMS
184C23B7 F-16 Fighting Falcon (US) SMS 184C23B7 F-16 Fighting Falcon (US) SMS
@ -500,6 +502,7 @@ BE9A7071 The Incredible Hulk SMS
102D5FEA James Pond II - Codename - Robocod SMS 102D5FEA James Pond II - Codename - Robocod SMS
FEF68275 B James Pond II - Codename - Robocod (bad byte) SMS FEF68275 B James Pond II - Codename - Robocod (bad byte) SMS
76C5BDFB Jang Pung II [SMS-GG] (KR) SMS 76C5BDFB Jang Pung II [SMS-GG] (KR) SMS
18FB98A3 Jang Pang III (KR) SMS KoreaMapper
0A9089E5 Joe Montana Football SMS 0A9089E5 Joe Montana Football SMS
45C50294 Jogos de Verao II (BR) SMS 45C50294 Jogos de Verao II (BR) SMS
EF2F37C9 H Jornada do Krazy SMS Psycho Fox EF2F37C9 H Jornada do Krazy SMS Psycho Fox
@ -529,6 +532,7 @@ b7fe0a9d King's Quest - Quest for the Crown [Proto] (US) SMS
ED15F21E B KLAX (26 bad bytes) SMS ED15F21E B KLAX (26 bad bytes) SMS
BB351118 B KLAX (bad byte) SMS BB351118 B KLAX (bad byte) SMS
97B38E8A V KLAX (bad dump) SMS Blank areas 97B38E8A V KLAX (bad dump) SMS Blank areas
F89AF3CC Knightmare II - The Maze of Galious (KR) SMS MSXMapper
64A585EB Krusty's Fun House SMS 64A585EB Krusty's Fun House SMS
D11D32E4 Kujakuou (JP) SMS D11D32E4 Kujakuou (JP) SMS
68108314 B Kujakuou (JP) (bad byte) SMS 68108314 B Kujakuou (JP) (bad byte) SMS
@ -642,6 +646,8 @@ A06D065C D NanoWars 8k SMS Haroldo O. Pinheiro; v0.7
5B5F9106 Nekyuu Kousien (JP) SMS FM 5B5F9106 Nekyuu Kousien (JP) SMS FM
C660FF34 The New Zealand Story SMS C660FF34 The New Zealand Story SMS
FBC66CBF B The New Zealand Story (bad byte) SMS FBC66CBF B The New Zealand Story (bad byte) SMS
E316C06D Nemesis (KR) SMS NemesisMapper
0A77FA5E Nemesis 2 (KR) SMS MSXMapper
383E7EBD D New Duel SMS losinggeneration; SMS Power 8-bit Coding Comptetition 2011 Entry 383E7EBD D New Duel SMS losinggeneration; SMS Power 8-bit Coding Comptetition 2011 Entry
82AE5ACD D Nine Pixels SMS Heliophobe; SMS Power Sega 8-bit Coding Competition 2006 entry 82AE5ACD D Nine Pixels SMS Heliophobe; SMS Power Sega 8-bit Coding Competition 2006 entry
1B1D8CC2 Ninja Gaiden SMS 1B1D8CC2 Ninja Gaiden SMS
@ -700,6 +706,7 @@ E030E66C Parlour Games SMS FM
9AEFE664 Pat Riley Basketball [Proto] SMS 9AEFE664 Pat Riley Basketball [Proto] SMS
592B8297 D Pause Test SMS FluBBa 592B8297 D Pause Test SMS FluBBa
85060847 D Paws SMS An!mal; SMS Power Sega 8-bit Coding Competition 2006 entry 85060847 D Paws SMS An!mal; SMS Power Sega 8-bit Coding Competition 2006 entry
445525E2 Penguin Adventure (KR) SMS MSXMapper
F97E9875 Penguin Land SMS FM;StereoByte=237 F97E9875 Penguin Land SMS FM;StereoByte=237
F6552DA8 O Penguin Land (4x overdump) SMS FM;StereoByte=237 F6552DA8 O Penguin Land (4x overdump) SMS FM;StereoByte=237
2BCDB8FA Penguin Land (JP) SMS FM;StereoByte=237 2BCDB8FA Penguin Land (JP) SMS FM;StereoByte=237
@ -857,7 +864,7 @@ C0EA7FB7 O Sagaia (2x overdump) SMS
CB5D369B B Sagaia (bad byte) SMS CB5D369B B Sagaia (bad byte) SMS
7CBD4432 D SALY [v1.00] SMS Marc Klemp; v1.00 31/5/03 7CBD4432 D SALY [v1.00] SMS Marc Klemp; v1.00 31/5/03
5D62F2D1 D SALY [v1.00a] SMS Marc Klemp; v1.00 15/12/05 5D62F2D1 D SALY [v1.00a] SMS Marc Klemp; v1.00 15/12/05
97D03541 Sangokushi 3 (KR) SMS 97D03541 Sangokushi 3 (KR) SMS KoreaMapper
890E83E4 Sapo Xule O Mestre do Kung Fu (BR) SMS 890E83E4 Sapo Xule O Mestre do Kung Fu (BR) SMS
7AB2946A Sapo Xule S.O.S. Lagoa Poluida (BR) SMS 7AB2946A Sapo Xule S.O.S. Lagoa Poluida (BR) SMS
9A608327 Sapo Xule Vs Os Invasores do Brejo (BR) SMS 9A608327 Sapo Xule Vs Os Invasores do Brejo (BR) SMS
@ -1021,6 +1028,7 @@ D4B8F66D Star Wars SMS
0F8287EC Street Fighter II' (BR) SMS 0F8287EC Street Fighter II' (BR) SMS
599901BB B Street Fighter II' (BR) (five bad bytes) SMS 599901BB B Street Fighter II' (BR) (five bad bytes) SMS
87AABDFE B Street Fighter II' (BR) (four bad bytes) SMS 87AABDFE B Street Fighter II' (BR) (four bad bytes) SMS
83F0EEDE Street Master (KR) SMS MSXMapper
4AB3790F Streets of Rage SMS 4AB3790F Streets of Rage SMS
ECC18147 T Streets of Rage (FR) SMS ECC18147 T Streets of Rage (FR) SMS
6F2CF48A B Streets of Rage (two bad bytes) SMS 6F2CF48A B Streets of Rage (two bad bytes) SMS
@ -1188,6 +1196,7 @@ CA500A43 H Wonder Boy III DC SMS Wonder Boy III FM
5C87B0AE T Wonder Boy in Monster World (FR) SMS MacroTrads 5C87B0AE T Wonder Boy in Monster World (FR) SMS MacroTrads
81BFF9BB Wonder Boy in Monster World [Proto] SMS 81BFF9BB Wonder Boy in Monster World [Proto] SMS
FA8B5F3D B Wonder Boy in Monster World [Proto] (bad byte) SMS FA8B5F3D B Wonder Boy in Monster World [Proto] (bad byte) SMS
A05258F5 Wonsiin (KR) SMS MSXMapper
315917D4 Woody Pop - Shinjinrui no Block Kuzushi (JP) SMS 315917D4 Woody Pop - Shinjinrui no Block Kuzushi (JP) SMS
C9A449B7 World Class Leader Board SMS C9A449B7 World Class Leader Board SMS
6E1AD6FD World Cup Italia '90 SMS 6E1AD6FD World Cup Italia '90 SMS