Kaiser boards support (Mapper 56, 142, 171, 175)

This commit is contained in:
Souryo 2016-07-17 14:07:22 -04:00
parent bf5ad7439d
commit 23d8992bcb
7 changed files with 205 additions and 4 deletions

View file

@ -203,11 +203,11 @@ void Console::ResetComponents(bool softReset)
Movie::Stop();
SoundMixer::StopRecording();
_memoryManager->Reset(softReset);
_ppu->Reset();
_apu->Reset(softReset);
_cpu->Reset(softReset);
_controlManager->Reset(softReset);
_memoryManager->Reset(softReset);
_lagCounter = 0;

View file

@ -432,6 +432,9 @@
<ClInclude Include="JalecoJf13.h" />
<ClInclude Include="JalecoJf16.h" />
<ClInclude Include="JalecoJf17_19.h" />
<ClInclude Include="Kaiser202.h" />
<ClInclude Include="Kaiser7022.h" />
<ClInclude Include="Kaiser7058.h" />
<ClInclude Include="Mapper107.h" />
<ClInclude Include="Mapper112.h" />
<ClInclude Include="Mapper15.h" />

View file

@ -77,6 +77,9 @@
<Filter Include="Nes\Mappers\Waixing">
<UniqueIdentifier>{a47ffe4e-02b9-43a0-a3d6-b4943c9aade4}</UniqueIdentifier>
</Filter>
<Filter Include="Nes\Mappers\Kaiser">
<UniqueIdentifier>{9b0da03f-174e-403b-b988-394f32d4e1d3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="IAudioDevice.h">
@ -736,6 +739,15 @@
<ClInclude Include="Txc22211C.h">
<Filter>Nes\Mappers</Filter>
</ClInclude>
<ClInclude Include="Kaiser7058.h">
<Filter>Nes\Mappers\Kaiser</Filter>
</ClInclude>
<ClInclude Include="Kaiser7022.h">
<Filter>Nes\Mappers\Kaiser</Filter>
</ClInclude>
<ClInclude Include="Kaiser202.h">
<Filter>Nes\Mappers\Kaiser</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">

101
Core/Kaiser202.h Normal file
View file

@ -0,0 +1,101 @@
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
class Kaiser202 : public BaseMapper
{
uint16_t _irqReloadValue;
uint16_t _irqCounter;
bool _irqEnabled;
uint8_t _selectedReg;
uint8_t _prgRegs[4];
protected:
virtual uint16_t GetPRGPageSize() { return 0x2000; }
virtual uint16_t GetCHRPageSize() { return 0x0400; }
void InitMapper()
{
_irqReloadValue = 0;
_irqCounter = 0;
_irqEnabled = 0;
_selectedReg = 0;
memset(_prgRegs, 0, sizeof(_prgRegs));
SelectPRGPage(3, -1);
}
void StreamState(bool saving)
{
BaseMapper::StreamState(saving);
Stream(_irqReloadValue, _irqCounter, _irqEnabled, _selectedReg, _prgRegs[0], _prgRegs[1], _prgRegs[2], _prgRegs[3]);
if(!saving) {
SetCpuMemoryMapping(0x6000, 0x7FFF, _prgRegs[3], PrgMemoryType::PrgRom, MemoryAccessType::ReadWrite);
}
}
void ProcessCpuClock()
{
if(_irqEnabled) {
_irqCounter++;
if(_irqCounter == 0xFFFF) {
_irqCounter = _irqReloadValue;
CPU::SetIRQSource(IRQSource::External);
}
}
}
void WriteRegister(uint16_t addr, uint8_t value)
{
switch(addr & 0xF000) {
case 0x8000: _irqReloadValue = (_irqReloadValue & 0xFFF0) | (value & 0x0F); break;
case 0x9000: _irqReloadValue = (_irqReloadValue & 0xFF0F) | ((value & 0x0F) << 4); break;
case 0xA000: _irqReloadValue = (_irqReloadValue & 0xF0FF) | ((value & 0x0F) << 8); break;
case 0xB000: _irqReloadValue = (_irqReloadValue & 0x0FFF) | ((value & 0x0F) << 12); break;
case 0xC000:
_irqEnabled = (value != 0);
if(_irqEnabled) {
_irqCounter = _irqReloadValue;
}
CPU::ClearIRQSource(IRQSource::External);
break;
case 0xD000: CPU::ClearIRQSource(IRQSource::External); break;
case 0xE000: _selectedReg = (value & 0x0F) - 1; break;
case 0xF000:
if(_selectedReg < 3) {
_prgRegs[_selectedReg] = ((_prgRegs[_selectedReg]) & 0x10) | (value & 0x0F);
} else if(_selectedReg < 4) {
//For Kaiser7032 (Mapper 142)
_prgRegs[_selectedReg] = value;
SetCpuMemoryMapping(0x6000, 0x7FFF, value, PrgMemoryType::PrgRom, MemoryAccessType::ReadWrite);
}
switch(addr & 0xFC00) {
case 0xF000: {
uint8_t bank = addr & 0x03;
if(bank < 3) {
_prgRegs[bank] = (value & 0x10) | (_prgRegs[bank] & 0x0F);
}
break;
}
case 0xF800:
SetMirroringType(value & 0x01 ? MirroringType::Vertical : MirroringType::Horizontal);
break;
case 0xFC00:
SelectCHRPage(addr & 0x07, value);
break;
}
SelectPRGPage(0, _prgRegs[0]);
SelectPRGPage(1, _prgRegs[1]);
SelectPRGPage(2, _prgRegs[2]);
break;
}
}
};

53
Core/Kaiser7022.h Normal file
View file

@ -0,0 +1,53 @@
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
class Kaiser7022 : public BaseMapper
{
private:
uint8_t _reg;
protected:
virtual uint16_t GetPRGPageSize() { return 0x4000; }
virtual uint16_t GetCHRPageSize() { return 0x2000; }
virtual uint16_t RegisterStartAddress() { return 0x8000; }
virtual uint16_t RegisterEndAddress() { return 0xFFFF; }
virtual bool AllowRegisterRead() { return true; }
void InitMapper()
{
_reg = 0;
RemoveRegisterRange(0x8000, 0xFFFF, MemoryOperation::Read);
AddRegisterRange(0xFFFC, 0xFFFC, MemoryOperation::Any);
SelectPRGPage(0, 0);
}
void Reset(bool softReset)
{
_reg = 0;
ReadRegister(0xFFFC);
}
void StreamState(bool saving)
{
BaseMapper::StreamState(saving);
Stream(_reg);
}
uint8_t ReadRegister(uint16_t addr)
{
SelectCHRPage(0, _reg);
SelectPRGPage(0, _reg);
SelectPRGPage(1, _reg);
return InternalReadRam(addr);
}
void WriteRegister(uint16_t addr, uint8_t value)
{
switch(addr) {
case 0x8000: SetMirroringType(value & 0x04 ? MirroringType::Horizontal : MirroringType::Vertical); break;
case 0xA000: _reg = value & 0x0F; break;
}
}
};

25
Core/Kaiser7058.h Normal file
View file

@ -0,0 +1,25 @@
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
class Kaiser7058 : public BaseMapper
{
protected:
virtual uint16_t GetPRGPageSize() { return 0x8000; }
virtual uint16_t GetCHRPageSize() { return 0x1000; }
virtual uint16_t RegisterStartAddress() { return 0xF000; }
virtual uint16_t RegisterEndAddress() { return 0xFFFF; }
void InitMapper()
{
SelectPRGPage(0, 0);
}
void WriteRegister(uint16_t addr, uint8_t value)
{
switch(addr & 0xF080) {
case 0xF000: SelectCHRPage(0, value); break;
case 0xF080: SelectCHRPage(1, value); break;
}
}
};

View file

@ -28,6 +28,9 @@
#include "JalecoJf17_19.h"
#include "JalecoJfxx.h"
#include "JalecoSs88006.h"
#include "Kaiser202.h"
#include "Kaiser7022.h"
#include "Kaiser7058.h"
#include "Mapper15.h"
#include "Mapper40.h"
#include "Mapper42.h"
@ -129,14 +132,14 @@ Supported mappers: (... denotes bad mappers)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| | 15|
| 16| 17| 18| 19|...| 21| 22| 23| 24| 25| 26| 27| 28| | | 31|
| 32| 33| 34| | | 37| 38| | 40| | 42| | 44| 45| 46| 47|
| 48| 49| 50| | 52| | | | | 57| 58| | 60| 61| 62| |
| 48| 49| 50| | 52| | | | 56| 57| 58| | 60| 61| 62| |
| 64| 65| 66| 67| 68| 69| 70| 71| 72| 73| 74| 75| 76| 77| 78| 79|
| 80| | 82| | | 85| 86| 87| 88| 89| | 91| 92| 93| 94| 95|
| | 97| | 99|...|101| | | | | |107| | | | |
|112|113| |115| | |118|119| | | | | | | | |
| | | | |132|133| | | |137|138|139|140|141| |143|
| | | | |132|133| | | |137|138|139|140|141|142|143|
|144|145|146|147|148|149|150|151|152|153|154|155|156|157| |159|
| | | |163|164| | | | | | | |172|173| | |
| | | |163|164| | | | | | |171|172|173| |175|
|176| | | |180| |182| |184|185| | | |189| |191|
|192|193|194|195| | | | |200|201|202|203| |205|206|207|
| | |210| | | | | | | |218| | | | | |
@ -203,6 +206,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case 49: return new MMC3_49();
case 50: return new Mapper50();
case 52: return new MMC3_52();
case 56: return new Kaiser202();
case 57: return new Mapper57();
case 58: return new Mapper58();
case 60: return new Mapper60(); //Partial support?
@ -254,6 +258,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case 139: return new Sachen8259(Sachen8259Variant::Sachen8259C);
case 140: return new JalecoJf11_14();
case 141: return new Sachen8259(Sachen8259Variant::Sachen8259A);
case 142: return new Kaiser202();
case 143: return new Sachen_143();
case 144: return new ColorDreams();
case 145: return new Sachen_145();
@ -272,8 +277,10 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case 159: return new BandaiFcg();
case 163: return new Nanjing();
case 164: return new Waixing164();
case 171: return new Kaiser7058();
case 172: return new Txc22211B();
case 173: return new Txc22211C();
case 175: return new Kaiser7022();
case 176: return new Waixing176();
case 180: return new UnRom_180();
case 182: return new MMC3_182();