SG1000: work on 8kb ram adapter

This commit is contained in:
alyosha-tas 2021-11-20 21:15:41 -05:00
parent cee3d411b9
commit 792b91f821
5 changed files with 102 additions and 12 deletions

View File

@ -12,6 +12,7 @@ D2B0524A2CF5754C0FA1C900E9ECB06B The Black Onyx (J) SG RPG Japan
0BF5B6959FC1B58D8E37F9647F47A0B3 Bomb Jack (J) SG Japan
A50378ABE2636C5C47966B74A14DD127 Bomb Jack (T) (Chinese Logo) SG Taiwan
8DB486C33C7D688BD5C0E9A81DEE2D29 Bomb Jack (T) (English Logo) SG Taiwan
25044D56BC18AD8B66A726C2F9D0B26B Bomberman Special (Taiwan) SG SG_EX_B Taiwan
25C742E43BC9F1329F3F26502FEFB10A Borderline (JE) SG Europe;Japan
D87DAAD7DE33105D703B613052CCC2DD C_So! (J) SG Japan
25AC91AFC22F7A09FF4543AF653CD281 C_So! (T) SG Taiwan
@ -88,8 +89,11 @@ D7322428A4FB49AC593F80F30D3C7BD3 Home Mahjong (J) SG Puzzle;Mahjong Japan
8BE690D357A99ABD26EBB5378E9C0153 Hustle Chumy (J) SG Japan
D8E6D89D520C91A9EA219291B55284BB Hyper Sports (J) SG Sports Japan
F72F3DEF79FFD82FE2224F4732B2B994 Hyper Sports (T) SG Sports Taiwan
E0321CD713EC1B48FF88F7DF13E3CE28 Knightmare (Taiwan) SG SG_EX_A Taiwan
CFC8E61F51388609421FFE87539CAD44 Legend of Kage, The (Taiwan) SG SG_EX_A Taiwan
4B4F02EB3CF7D5F9DCD1311D72E6D742 Lode Runner (JE) SG Europe;Japan
2BEA9EE88E177A13D7961017DD4F6120 Lode Runner (T) SG Taiwan
C12474E0A2556ADB2478BC4D99FABA51 Magical Kid Wiz (Taiwan) SG SG_EX_B Taiwan
D9DA8A32BD3B18881DFA2B469C85944E Mahjong (J) SG Puzzle;Mahjong Japan
1DBB5C85962C2110FFE35EC536F96329 Mahjong (J) (English Title) SG Puzzle;Mahjong Japan
BB8DA563CB6A38611B736C4973B56E1E Mahjong (T) SG Puzzle;Mahjong Taiwan
@ -123,6 +127,8 @@ C34260B61C6A45BBDD074DF3F3E72C46 Pitfall II - The Lost Caverns (J) (Rev 0) SG
7F841AA0C225662E26CA7A8DF20B2EB8 Pop Flamer (JE) SG Europe;Japan
E5082018FF7CBAC17DB003F159AB2DFB Pop Flamer (T) SG Taiwan
A768A8AE921126300E98F9D918A4A0C9 Q-bert (J) SG Japan
3071F939AAA0911FC0907AAE5DAAA160 Rally-X (Taiwan) (DahJee) SG SG_EX_A Taiwan
E872BBE06FCEE32E53FB9E11B61FE762 Road Fighter (Taiwan) (Jumbo) SG SG_EX_A Taiwan
108FFE4BA5C2C8C5E0459CB7F0CFAC0E Rock n' Bolt (J) SG Japan
F05B48934A7D29AB2719273CBDC45B28 Rock n' Bolt (T) SG Taiwan
F77826F62D943C4A24F7FB9C3BB4A5F9 Safari Hunting (J) SG Japan
@ -162,6 +168,8 @@ ECCAD04698782862F3785FF9708F73E8 Star Jacker (J) SG Japan
0104171ADE3CFEAF10C92926869E2A52 Star Jacker (T) SG Taiwan
59D01BF1093A65E9EC08E533CFBBC5FF Super Tank (J) SG Japan
BCB549A442584255601DC7938ACCD2D6 Super Tank (T) SG Taiwan
DADA9D76F7743089811DCC8EC1543076 Tank Battalion (Taiwan) SG SG_EX_A Taiwan
8C2C0D7E8415AE7B0C577CF947E89E78 TwinBee (Taiwan) SG SG_EX_A Taiwan
BE31A84BFA537117A62EAEB8C0A07BF9 Terebi Oekaki (J) SG Art Japan
76F29FEE0CD3AF921E488A276DACE636 Wonder Boy (J) SG Arcade Japan
D26FABFE84AD40AE04A2CD3DC6CF75DF Wonder Boy (J) (Rev 1) SG Arcade Japan

View File

@ -0,0 +1,47 @@
namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
public partial class SMS
{
private byte ReadMemorySG_EX_A(ushort address)
{
byte ret;
if (address < 0x2000)
ret = RomData[address & RomMask];
else if (address < 0x4000)
ret = ExtRam[address & ExtRamMask];
else if (address < 0xC000)
ret = RomData[address & RomMask];
else
ret = SystemRam[address & 0x3FF]; // only 1 KB
return ret;
}
private CDLog_MapResults MapMemorySG_EX_A(ushort address, bool write)
{
if (address < 0x2000) return new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = address };
if (address < 0x4000) return new CDLog_MapResults { Type = CDLog_AddrType.CartRAM, Address = address & ExtRamMask };
if (address < 0xC000) return new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = address };
return new CDLog_MapResults { Type = CDLog_AddrType.MainRAM, Address = address & RamSizeMask };
}
private void WriteMemorySG_EX_A(ushort address, byte value)
{
if (address < 0x4000 && address >= 0x2000)
ExtRam[address & ExtRamMask] = value;
else if (address >= 0xC000)
SystemRam[address & 0x3FF] = value;
}
private void Init_SG_EX_A()
{
// 2 regions of RAM
ExtRam = new byte[0x2000];
ExtRamMask = 0x1FFF;
ReadMemoryMapper = ReadMemorySG_EX_A;
WriteMemoryMapper = WriteMemorySG_EX_A;
MapMemory = MapMemorySG_EX_A;
}
}
}

View File

@ -0,0 +1,36 @@
namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
public partial class SMS
{
private byte ReadMemorySG_EX_B(ushort address)
{
byte ret;
if (address < 0xC000)
ret = RomData[address & RomMask];
else
ret = SystemRam[address & RamSizeMask];
return ret;
}
private CDLog_MapResults MapMemorySG_EX_B(ushort address, bool write)
{
if (address < 0xC000) return new CDLog_MapResults { Type = CDLog_AddrType.ROM, Address = address & ExtRamMask };
return new CDLog_MapResults { Type = CDLog_AddrType.MainRAM, Address = address & RamSizeMask };
}
private void WriteMemorySG_EX_B(ushort address, byte value)
{
if (address >= 0xC000)
SystemRam[address & RamSizeMask] = value;
}
private void Init_SG_EX_B()
{
ReadMemoryMapper = ReadMemorySG_EX_B;
WriteMemoryMapper = WriteMemorySG_EX_B;
MapMemory = MapMemorySG_EX_B;
}
}
}

View File

@ -48,22 +48,13 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
ser.Sync("old_s_L", ref OldSl);
ser.Sync("old_s_R", ref OldSr);
if (SaveRAM != null)
{
ser.Sync(nameof(SaveRAM), ref SaveRAM, false);
}
if (SaveRAM != null) { ser.Sync(nameof(SaveRAM), ref SaveRAM, false); }
ser.Sync(nameof(SaveRamBank), ref SaveRamBank);
if (ExtRam != null)
{
ser.Sync("ExtRAM", ref ExtRam, true);
}
if (ExtRam != null) { ser.Sync("ExtRAM", ref ExtRam, true); }
if (HasYM2413)
{
YM2413.SyncState(ser);
}
if (HasYM2413) { YM2413.SyncState(ser); }
EEPROM?.SyncState(ser);

View File

@ -40,6 +40,9 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
}
RomBanks = (byte)(RomData.Length / BankSize);
RomMask = RomData.Length - 1;
if (RomMask == 0x5FFF) { RomMask = 0x7FFF; }
if (RomMask == 0xBFFF) { RomMask = 0xFFFF; }
Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region);
if (game["PAL"] && Region != DisplayType.PAL)
@ -135,6 +138,10 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
InitTerebiOekaki();
else if (game["EEPROM"])
InitEEPROMMapper();
else if(game["SG_EX_A"])
Init_SG_EX_A();
else if (game["SG_EX_B"])
Init_SG_EX_B();
else
InitSegaMapper();
@ -234,6 +241,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
// ROM
public byte[] RomData;
public int RomMask;
private byte RomBank0, RomBank1, RomBank2, RomBank3;
private byte Bios_bank;
private readonly byte RomBanks;