UNIF: Added support for BMC-8157 and BMC-830118C
This commit is contained in:
parent
8c40a4616b
commit
ec9a8d4330
7 changed files with 143 additions and 2 deletions
68
Core/Bmc8157.h
Normal file
68
Core/Bmc8157.h
Normal 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
59
Core/Bmc830118C.h
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -518,6 +518,8 @@
|
||||||
<ClInclude Include="BaseSoundManager.h" />
|
<ClInclude Include="BaseSoundManager.h" />
|
||||||
<ClInclude Include="BatteryManager.h" />
|
<ClInclude Include="BatteryManager.h" />
|
||||||
<ClInclude Include="BattleBox.h" />
|
<ClInclude Include="BattleBox.h" />
|
||||||
|
<ClInclude Include="Bmc8157.h" />
|
||||||
|
<ClInclude Include="Bmc830118C.h" />
|
||||||
<ClInclude Include="Bmc8in1.h" />
|
<ClInclude Include="Bmc8in1.h" />
|
||||||
<ClInclude Include="ControlDeviceState.h" />
|
<ClInclude Include="ControlDeviceState.h" />
|
||||||
<ClInclude Include="DrawScreenBufferCommand.h" />
|
<ClInclude Include="DrawScreenBufferCommand.h" />
|
||||||
|
|
|
@ -1378,6 +1378,12 @@
|
||||||
<ClInclude Include="Bmc8in1.h">
|
<ClInclude Include="Bmc8in1.h">
|
||||||
<Filter>Nes\Mappers\Unif</Filter>
|
<Filter>Nes\Mappers\Unif</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Bmc830118C.h">
|
||||||
|
<Filter>Nes\Mappers\Unif</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Bmc8157.h">
|
||||||
|
<Filter>Nes\Mappers\Unif</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "Bmc11160.h"
|
#include "Bmc11160.h"
|
||||||
#include "Bmc12in1.h"
|
#include "Bmc12in1.h"
|
||||||
#include "Bmc51.h"
|
#include "Bmc51.h"
|
||||||
|
#include "Bmc8157.h"
|
||||||
#include "Bmc63.h"
|
#include "Bmc63.h"
|
||||||
#include "Bmc64in1NoRepeat.h"
|
#include "Bmc64in1NoRepeat.h"
|
||||||
#include "Bmc70in1.h"
|
#include "Bmc70in1.h"
|
||||||
|
@ -26,6 +27,7 @@
|
||||||
#include "Bmc235.h"
|
#include "Bmc235.h"
|
||||||
#include "Bmc255.h"
|
#include "Bmc255.h"
|
||||||
#include "Bmc810544CA1.h"
|
#include "Bmc810544CA1.h"
|
||||||
|
#include "Bmc830118C.h"
|
||||||
#include "Bmc8in1.h"
|
#include "Bmc8in1.h"
|
||||||
#include "BmcG146.h"
|
#include "BmcG146.h"
|
||||||
#include "BmcNtd03.h"
|
#include "BmcNtd03.h"
|
||||||
|
@ -522,6 +524,8 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
|
||||||
case UnifBoards::Bmc70in1B: return new Bmc70in1();
|
case UnifBoards::Bmc70in1B: return new Bmc70in1();
|
||||||
case UnifBoards::Bmc190in1: return new Bmc190in1();
|
case UnifBoards::Bmc190in1: return new Bmc190in1();
|
||||||
case UnifBoards::Bmc810544CA1: return new Bmc810544CA1();
|
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::Bmc8in1: return new Bmc8in1();
|
||||||
case UnifBoards::BmcF15: return new MMC3_BmcF15();
|
case UnifBoards::BmcF15: return new MMC3_BmcF15();
|
||||||
case UnifBoards::BmcG146: return new BmcG146();
|
case UnifBoards::BmcG146: return new BmcG146();
|
||||||
|
|
|
@ -39,6 +39,8 @@ namespace UnifBoards {
|
||||||
Bmc12in1,
|
Bmc12in1,
|
||||||
Bmc64in1NoRepeat,
|
Bmc64in1NoRepeat,
|
||||||
Bmc810544CA1,
|
Bmc810544CA1,
|
||||||
|
Bmc8157,
|
||||||
|
Bmc830118C,
|
||||||
Bmc8in1,
|
Bmc8in1,
|
||||||
BmcF15,
|
BmcF15,
|
||||||
Lh10,
|
Lh10,
|
||||||
|
|
|
@ -17,10 +17,10 @@ std::unordered_map<string, int> UnifLoader::_boardMappings = std::unordered_map<
|
||||||
{ "70in1", UnifBoards::Bmc70in1 },
|
{ "70in1", UnifBoards::Bmc70in1 },
|
||||||
{ "70in1B", UnifBoards::Bmc70in1B },
|
{ "70in1B", UnifBoards::Bmc70in1B },
|
||||||
{ "810544-C-A1", UnifBoards::Bmc810544CA1 },
|
{ "810544-C-A1", UnifBoards::Bmc810544CA1 },
|
||||||
{ "8157", UnifBoards::UnknownBoard },
|
{ "8157", UnifBoards::Bmc8157 },
|
||||||
{ "8237", 215 },
|
{ "8237", 215 },
|
||||||
{ "8237A", UnifBoards::UnknownBoard },
|
{ "8237A", UnifBoards::UnknownBoard },
|
||||||
{ "830118C", UnifBoards::UnknownBoard },
|
{ "830118C", UnifBoards::Bmc830118C },
|
||||||
{ "A65AS", UnifBoards::A65AS },
|
{ "A65AS", UnifBoards::A65AS },
|
||||||
{ "AC08", UnifBoards::Ac08 },
|
{ "AC08", UnifBoards::Ac08 },
|
||||||
{ "ANROM", 7 },
|
{ "ANROM", 7 },
|
||||||
|
|
Loading…
Add table
Reference in a new issue