UNIF: Added support for BMC-8157 and BMC-830118C

This commit is contained in:
Sour 2018-06-16 20:02:07 -04:00
parent 8c40a4616b
commit ec9a8d4330
7 changed files with 143 additions and 2 deletions

68
Core/Bmc8157.h Normal file
View file

@ -0,0 +1,68 @@
#pragma once
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
class Bmc8157 : public BaseMapper
{
private:
uint16_t _lastAddr;
bool _dipSwitch;
protected:
uint16_t GetPRGPageSize() override { return 0x4000; }
uint16_t GetCHRPageSize() override { return 0x2000; }
void InitMapper() override
{
_lastAddr = 0;
UpdateState();
SelectCHRPage(0, 0);
}
void Reset(bool softReset) override
{
_dipSwitch = !_dipSwitch;
}
void StreamState(bool saving) override
{
BaseMapper::StreamState(saving);
Stream(_lastAddr, _dipSwitch);
if(!saving) {
UpdateState();
}
}
void UpdateState()
{
uint8_t innerPrg0 = (_lastAddr >> 2) & 0x07;
uint8_t innerPrg1 = ((_lastAddr >> 7) & 0x01) | ((_lastAddr >> 8) & 0x02);
uint8_t outer128Prg = (_lastAddr >> 5) & 0x03;
uint8_t outer512Prg = (_lastAddr >> 8) & 0x01;
int baseBank;
if(innerPrg1 == 0) {
baseBank = 0;
} else if(innerPrg1 == 1) {
baseBank = innerPrg0;
} else {
baseBank = 7;
}
if(outer512Prg && _prgSize <= 1024 * 512 && _dipSwitch) {
RemoveCpuMemoryMapping(0x8000, 0xFFFF);
} else {
SelectPRGPage(0, (outer512Prg << 6) | (outer128Prg << 3) | innerPrg0);
SelectPRGPage(1, (outer512Prg << 6) | (outer128Prg << 3) | baseBank);
SetMirroringType(_lastAddr & 0x02 ? MirroringType::Horizontal : MirroringType::Vertical);
}
}
void WriteRegister(uint16_t addr, uint8_t value) override
{
_lastAddr = addr;
UpdateState();
}
};

59
Core/Bmc830118C.h Normal file
View file

@ -0,0 +1,59 @@
#pragma once
#include "stdafx.h"
#include "MMC3.h"
class Bmc830118C : public MMC3
{
private:
uint8_t _reg;
protected:
void InitMapper() override
{
_reg = 0;
MMC3::InitMapper();
AddRegisterRange(0x6800, 0x68FF, MemoryOperation::Write);
}
void Reset(bool softReset) override
{
_reg = 0;
MMC3::Reset(softReset);
}
void StreamState(bool saving) override
{
MMC3::StreamState(saving);
Stream(_reg);
}
void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override
{
MMC3::SelectCHRPage(slot, ((_reg & 0x0C) << 5) | (page & 0x7F), memoryType);
}
void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
{
if((_reg & 0x0C) == 0x0C) {
if(slot == 0) {
MMC3::SelectPRGPage(0, ((_reg & 0x0C) << 2) | (page & 0x0F));
MMC3::SelectPRGPage(2, 0x32 | (page & 0x0F));
} else if(slot == 1) {
MMC3::SelectPRGPage(1, ((_reg & 0x0C) << 2) | (page & 0x0F));
MMC3::SelectPRGPage(3, 0x32 | (page & 0x0F));
}
} else {
MMC3::SelectPRGPage(slot, ((_reg & 0x0C) << 2) | (page & 0x0F));
}
}
void WriteRegister(uint16_t addr, uint8_t value) override
{
if(addr < 0x8000) {
_reg = value;
UpdateState();
} else {
MMC3::WriteRegister(addr, value);
}
}
};

View file

@ -518,6 +518,8 @@
<ClInclude Include="BaseSoundManager.h" />
<ClInclude Include="BatteryManager.h" />
<ClInclude Include="BattleBox.h" />
<ClInclude Include="Bmc8157.h" />
<ClInclude Include="Bmc830118C.h" />
<ClInclude Include="Bmc8in1.h" />
<ClInclude Include="ControlDeviceState.h" />
<ClInclude Include="DrawScreenBufferCommand.h" />

View file

@ -1378,6 +1378,12 @@
<ClInclude Include="Bmc8in1.h">
<Filter>Nes\Mappers\Unif</Filter>
</ClInclude>
<ClInclude Include="Bmc830118C.h">
<Filter>Nes\Mappers\Unif</Filter>
</ClInclude>
<ClInclude Include="Bmc8157.h">
<Filter>Nes\Mappers\Unif</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">

View file

@ -19,6 +19,7 @@
#include "Bmc11160.h"
#include "Bmc12in1.h"
#include "Bmc51.h"
#include "Bmc8157.h"
#include "Bmc63.h"
#include "Bmc64in1NoRepeat.h"
#include "Bmc70in1.h"
@ -26,6 +27,7 @@
#include "Bmc235.h"
#include "Bmc255.h"
#include "Bmc810544CA1.h"
#include "Bmc830118C.h"
#include "Bmc8in1.h"
#include "BmcG146.h"
#include "BmcNtd03.h"
@ -522,6 +524,8 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case UnifBoards::Bmc70in1B: return new Bmc70in1();
case UnifBoards::Bmc190in1: return new Bmc190in1();
case UnifBoards::Bmc810544CA1: return new Bmc810544CA1();
case UnifBoards::Bmc830118C: return new Bmc830118C();
case UnifBoards::Bmc8157: return new Bmc8157();
case UnifBoards::Bmc8in1: return new Bmc8in1();
case UnifBoards::BmcF15: return new MMC3_BmcF15();
case UnifBoards::BmcG146: return new BmcG146();

View file

@ -39,6 +39,8 @@ namespace UnifBoards {
Bmc12in1,
Bmc64in1NoRepeat,
Bmc810544CA1,
Bmc8157,
Bmc830118C,
Bmc8in1,
BmcF15,
Lh10,

View file

@ -17,10 +17,10 @@ std::unordered_map<string, int> UnifLoader::_boardMappings = std::unordered_map<
{ "70in1", UnifBoards::Bmc70in1 },
{ "70in1B", UnifBoards::Bmc70in1B },
{ "810544-C-A1", UnifBoards::Bmc810544CA1 },
{ "8157", UnifBoards::UnknownBoard },
{ "8157", UnifBoards::Bmc8157 },
{ "8237", 215 },
{ "8237A", UnifBoards::UnknownBoard },
{ "830118C", UnifBoards::UnknownBoard },
{ "830118C", UnifBoards::Bmc830118C },
{ "A65AS", UnifBoards::A65AS },
{ "AC08", UnifBoards::Ac08 },
{ "ANROM", 7 },