Mapper 30 support
This commit is contained in:
parent
0f894584aa
commit
139974e8a3
5 changed files with 69 additions and 2 deletions
|
@ -723,6 +723,7 @@
|
|||
<ClInclude Include="Unl255in1.h" />
|
||||
<ClInclude Include="Unl43272.h" />
|
||||
<ClInclude Include="UnlPuzzle.h" />
|
||||
<ClInclude Include="UnRom512.h" />
|
||||
<ClInclude Include="VideoHud.h" />
|
||||
<ClInclude Include="VideoRenderer.h" />
|
||||
<ClInclude Include="UnlPci556.h" />
|
||||
|
|
|
@ -1147,6 +1147,9 @@
|
|||
<ClInclude Include="Cheapocabra.h">
|
||||
<Filter>Nes\Mappers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="UnRom512.h">
|
||||
<Filter>Nes\Mappers</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
|
|
|
@ -227,6 +227,7 @@
|
|||
#include "UNROM.h"
|
||||
#include "UnRom_94.h"
|
||||
#include "UnRom_180.h"
|
||||
#include "UnRom512.h"
|
||||
#include "VRC1.h"
|
||||
#include "VRC2_4.h"
|
||||
#include "VRC3.h"
|
||||
|
@ -247,7 +248,7 @@ Supported mappers:
|
|||
??? : No known roms
|
||||
-----------------------------------------------------------------
|
||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15|
|
||||
| 16| 17| 18| 19|...| 21| 22| 23| 24| 25| 26| 27| 28| | | 31|
|
||||
| 16| 17| 18| 19|...| 21| 22| 23| 24| 25| 26| 27| 28| | 30| 31|
|
||||
| 32| 33| 34| 35| 36| 37| 38|---| 40| 41| 42| 43| 44| 45| 46| 47|
|
||||
| 48| 49| 50| 51| 52| 53| 54|???| 56| 57| 58|===| 60| 61| 62| 63|
|
||||
| 64| 65| 66| 67| 68| 69| 70| 71| 72| 73| 74| 75| 76| 77| 78| 79|
|
||||
|
@ -300,6 +301,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
|
|||
case 26: return new VRC6(VRCVariant::VRC6b);
|
||||
case 27: return new VRC2_4();
|
||||
case 28: return new Action53();
|
||||
case 30: return new UnRom512();
|
||||
case 31: return new NsfCart31();
|
||||
case 32: return new IremG101();
|
||||
case 33: return new TaitoTc0190();
|
||||
|
|
|
@ -198,7 +198,16 @@ struct NESHeader
|
|||
MirroringType GetMirroringType()
|
||||
{
|
||||
if(Byte6 & 0x08) {
|
||||
return MirroringType::FourScreens;
|
||||
if(GetRomHeaderVersion() == RomHeaderVersion::Nes2_0) {
|
||||
if(Byte6 & 0x01) {
|
||||
//Based on proposal by rainwarrior/Myask: http://wiki.nesdev.com/w/index.php/Talk:NES_2.0
|
||||
return MirroringType::ScreenAOnly;
|
||||
} else {
|
||||
return MirroringType::FourScreens;
|
||||
}
|
||||
} else {
|
||||
return MirroringType::FourScreens;
|
||||
}
|
||||
} else {
|
||||
return Byte6 & 0x01 ? MirroringType::Vertical : MirroringType::Horizontal;
|
||||
}
|
||||
|
|
52
Core/UnRom512.h
Normal file
52
Core/UnRom512.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
#pragma once
|
||||
#include "stdafx.h"
|
||||
#include "BaseMapper.h"
|
||||
|
||||
//Missing flashing support + only tested on 1 game demo
|
||||
class UnRom512 : public BaseMapper
|
||||
{
|
||||
private:
|
||||
bool _oneScreenMirroring;
|
||||
|
||||
protected:
|
||||
virtual uint16_t GetPRGPageSize() override { return 0x4000; }
|
||||
virtual uint16_t GetCHRPageSize() override { return 0x2000; }
|
||||
virtual uint16_t RegisterStartAddress() override { return 0x8000; }
|
||||
virtual uint16_t RegisterEndAddress() override { return 0xFFFF; }
|
||||
virtual uint32_t GetChrRamSize() override { return 0x8000; }
|
||||
virtual bool HasBusConflicts() override { return !HasBattery(); }
|
||||
|
||||
void InitMapper() override
|
||||
{
|
||||
SelectPRGPage(1, -1);
|
||||
if(IsNes20()) {
|
||||
_oneScreenMirroring = GetMirroringType() == MirroringType::ScreenAOnly;
|
||||
} else {
|
||||
_oneScreenMirroring = GetMirroringType() == MirroringType::FourScreens;
|
||||
}
|
||||
}
|
||||
|
||||
void SetDefaultNametables(uint8_t* nametableA, uint8_t* nametableB) override
|
||||
{
|
||||
BaseMapper::SetDefaultNametables(nametableA, nametableB);
|
||||
if(IsNes20() && !_oneScreenMirroring && _chrRam && _chrRamSize >= 0x8000) {
|
||||
//InfiniteNesLives four-screen mirroring variation, last 8kb of CHR RAM is always mapped to 0x2000-0x3FFF (0x3EFF due to palette)
|
||||
//This "breaks" the "UNROM512_4screen_test" test ROM - was the ROM actually tested on this board? Seems to contradict hardware specs
|
||||
SetPpuMemoryMapping(0x2000, 0x3FFF, _chrRam + 0x6000);
|
||||
}
|
||||
}
|
||||
|
||||
void WriteRegister(uint16_t addr, uint8_t value) override
|
||||
{
|
||||
if(!HasBattery() || addr >= 0xC000) {
|
||||
SelectPRGPage(0, value & 0x1F);
|
||||
SelectCHRPage(0, (value >> 5) & 0x03);
|
||||
|
||||
if(_oneScreenMirroring) {
|
||||
SetMirroringType(value & 0x80 ? MirroringType::ScreenBOnly : MirroringType::ScreenAOnly);
|
||||
}
|
||||
} else {
|
||||
//Unimplemented (flash process)
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Add table
Reference in a new issue