Kaiser boards support (Mapper 56, 142, 171, 175)
This commit is contained in:
parent
bf5ad7439d
commit
23d8992bcb
7 changed files with 205 additions and 4 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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
101
Core/Kaiser202.h
Normal 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
53
Core/Kaiser7022.h
Normal 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
25
Core/Kaiser7058.h
Normal 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;
|
||||
}
|
||||
}
|
||||
};
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue