Skip to content

Commit 4deeb7e

Browse files
NovaSquirrelmkwong98
authored andcommitted
Merge pull request SourMesen#112 from negativeExponent/mesenx
corrections and some more mappers
1 parent 1e22782 commit 4deeb7e

File tree

14 files changed

+309
-11
lines changed

14 files changed

+309
-11
lines changed

Core/BmcDs07.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "BaseMapper.h"
4+
5+
class BmcDs07 : public BaseMapper
6+
{
7+
private:
8+
uint8_t _regs[2];
9+
uint8_t _latch;
10+
11+
protected:
12+
uint16_t GetPRGPageSize() override { return 0x4000; }
13+
uint16_t GetCHRPageSize() override { return 0x2000; }
14+
uint16_t RegisterStartAddress() { return 0x6000; }
15+
uint16_t RegisterEndAddress() { return 0xFFFF; }
16+
17+
void InitMapper() override
18+
{
19+
_regs[0] = _regs[1] = -1;
20+
_latch = 0;
21+
UpdateState();
22+
}
23+
24+
void StreamState(bool saving) override
25+
{
26+
BaseMapper::StreamState(saving);
27+
Stream(_regs[0], _regs[1], _latch);
28+
}
29+
30+
void UpdateState()
31+
{
32+
uint8_t base = (_regs[0] & 0xF0) >> 1;
33+
SelectPRGPage(0, base | (_latch & 0x07));
34+
SelectPRGPage(1, base | 0x07);
35+
SetMirroringType((_latch & 0x80) ? MirroringType::Horizontal : MirroringType::Vertical);
36+
}
37+
38+
void WriteRegister(uint16_t addr, uint8_t value) override
39+
{
40+
if(addr < 0x8000) {
41+
_regs[addr & 0x01] = value;
42+
} else {
43+
if((_regs[0] & 0x80) == 0) {
44+
_latch = (_latch & 0xF8) | (value & 0x07);
45+
} else {
46+
_latch = value;
47+
}
48+
}
49+
UpdateState();
50+
}
51+
};

Core/Core.vcxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@
557557
<ClInclude Include="BmcTj03.h" />
558558
<ClInclude Include="BmcCtc09.h" />
559559
<ClInclude Include="BmcCtc12in1.h" />
560+
<ClInclude Include="BmcDs07.h" />
560561
<ClInclude Include="Bmc891227.h" />
561562
<ClInclude Include="Ctc15.h" />
562563
<ClInclude Include="CityFighter.h" />
@@ -851,6 +852,8 @@
851852
<ClInclude Include="MMC3_410.h" />
852853
<ClInclude Include="MMC3_411.h" />
853854
<ClInclude Include="MMC3_412.h" />
855+
<ClInclude Include="MMC3_420.h" />
856+
<ClInclude Include="MMC3_428.h" />
854857
<ClInclude Include="MMC3_422.h" />
855858
<ClInclude Include="MMC3_430.h" />
856859
<ClInclude Include="MMC3_432.h" />
@@ -859,6 +862,7 @@
859862
<ClInclude Include="MMC3_445.h" />
860863
<ClInclude Include="MMC3_534.h" />
861864
<ClInclude Include="MMC3_516.h" />
865+
<ClInclude Include="MMC3_512.h" />
862866
<ClInclude Include="Mapper57.h" />
863867
<ClInclude Include="Mapper61.h" />
864868
<ClInclude Include="Mapper62.h" />

Core/Core.vcxproj.filters

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,9 @@
802802
<ClInclude Include="BmcCtc09.h">
803803
<Filter>Nes\Mappers</Filter>
804804
</ClInclude>
805+
<ClInclude Include="BmcDs07.h">
806+
<Filter>Nes\Mappers</Filter>
807+
</ClInclude>
805808
<ClInclude Include="BmcK3036.h">
806809
<Filter>Nes\Mappers</Filter>
807810
</ClInclude>
@@ -811,15 +814,24 @@
811814
<ClInclude Include="MMC3_245.h">
812815
<Filter>Nes\Mappers\MMC</Filter>
813816
</ClInclude>
817+
<ClInclude Include="MMC3_420.h">
818+
<Filter>Nes\Mappers\MMC</Filter>
819+
</ClInclude>
814820
<ClInclude Include="MMC3_422.h">
815821
<Filter>Nes\Mappers\MMC</Filter>
816822
</ClInclude>
823+
<ClInclude Include="MMC3_428.h">
824+
<Filter>Nes\Mappers\MMC</Filter>
825+
</ClInclude>
817826
<ClInclude Include="MMC3_534.h">
818827
<Filter>Nes\Mappers\MMC</Filter>
819828
</ClInclude>
820829
<ClInclude Include="MMC3_516.h">
821830
<Filter>Nes\Mappers\MMC</Filter>
822831
</ClInclude>
832+
<ClInclude Include="MMC3_512.h">
833+
<Filter>Nes\Mappers\MMC</Filter>
834+
</ClInclude>
823835
<ClInclude Include="Waixing178.h">
824836
<Filter>Nes\Mappers\Waixing</Filter>
825837
</ClInclude>

Core/MMC1_297.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class MMC1_297 : public MMC1
2424

2525
void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
2626
{
27-
BaseMapper::SelectPRGPage(slot, (_mode << 3) & 0x08 | (page & 0x07));
27+
BaseMapper::SelectPRGPage(slot, ((_mode << 3) & 0x08) | (page & 0x07));
2828
}
2929

3030
void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override

Core/MMC3_269.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ class MMC3_269 : public MMC3
7070

7171
case 2:
7272
_chrMask = 0xFF >> (~value & 0xF);
73-
_outerChr = _outerChr & ~0x0F00 | ((value & 0xF0) << 4);
73+
_outerChr = (_outerChr & ~0x0F00) | ((value & 0xF0) << 4);
7474
break;
7575

7676
case 3:
7777
_prgMask = ~value & 0x3F;
78-
_outerPrg = _outerPrg & ~0x0100 | ((value & 0x40) << 2);
79-
_outerChr = _outerChr & ~0x1000 | ((value & 0x40) << 6);
78+
_outerPrg = (_outerPrg & ~0x0100) | ((value & 0x40) << 2);
79+
_outerChr = (_outerChr & ~0x1000) | ((value & 0x40) << 6);
8080
_locked = (value & 0x80) == 0x80;
8181
break;
8282
}

Core/MMC3_369.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class MMC3_369 : public MMC3
4343
Stream(_outerBankReg, _smb2jBank, _m2Counter);
4444
}
4545

46-
void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default)
46+
void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override
4747
{
4848
switch (_outerBankReg) {
4949
case 0x00:
@@ -68,7 +68,7 @@ class MMC3_369 : public MMC3
6868
}
6969
}
7070

71-
void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom)
71+
void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
7272
{
7373
switch (_outerBankReg) {
7474
case 0x00:

Core/MMC3_420.h

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "MMC3.h"
4+
5+
class MMC3_420 : public MMC3
6+
{
7+
private:
8+
uint8_t _exRegs[4];
9+
10+
protected:
11+
virtual void InitMapper() override
12+
{
13+
AddRegisterRange(0x6000, 0x7FFF, MemoryOperation::Write);
14+
MMC3::InitMapper();
15+
}
16+
17+
virtual void Reset(bool softReset) override
18+
{
19+
memset(_exRegs, 0, sizeof(_exRegs));
20+
21+
if(!softReset) {
22+
MMC3::ResetMmc3();
23+
}
24+
25+
MMC3::UpdateState();
26+
}
27+
28+
virtual void StreamState(bool saving) override
29+
{
30+
MMC3::StreamState(saving);
31+
Stream(_exRegs[0], _exRegs[1], _exRegs[2], _exRegs[3]);
32+
33+
if (!saving) {
34+
MMC3::UpdateState();
35+
}
36+
}
37+
38+
virtual void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override
39+
{
40+
uint16_t mask = 0xFF >> ((_exRegs[1] & 0x80) >> 7);
41+
uint16_t base = ((_exRegs[1] << 1) & 0x100) | ((_exRegs[1] << 5) & 0x80);
42+
43+
MMC3::SelectCHRPage(slot, base | (page & mask), memoryType);
44+
}
45+
46+
virtual void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
47+
{
48+
uint16_t mask;
49+
uint16_t base;
50+
if(_exRegs[0] & 0x80) {
51+
base = ((_exRegs[0] >> 1) & 0x07 | ((_exRegs[3] >> 2) & 0x08)) << 2;
52+
page = slot;
53+
mask = 0x03;
54+
} else {
55+
mask = 0x3F >> (((_exRegs[3] & 0x20) >> 5) | ((_exRegs[0] & 0x20) >> 4));
56+
base = ((_exRegs[3] << 3) & 0x20);
57+
}
58+
59+
MMC3::SelectPRGPage(slot, base | (page & mask), memoryType);
60+
}
61+
62+
void WriteRegister(uint16_t addr, uint8_t value) override
63+
{
64+
if(addr < 0x8000) {
65+
WritePrgRam(addr, value);
66+
_exRegs[addr & 3] = value;
67+
MMC3::UpdatePrgMapping();
68+
MMC3::UpdateChrMapping();
69+
} else {
70+
MMC3::WriteRegister(addr, value);
71+
}
72+
}
73+
};

Core/MMC3_512.h

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "MMC3.h"
4+
5+
class MMC3_512 : public MMC3
6+
{
7+
private:
8+
uint8_t _reg = 0;
9+
10+
protected:
11+
virtual uint32_t GetChrRamSize() override { return 0x2000; }
12+
virtual uint16_t GetChrRamPageSize() override { return 0x0400; }
13+
14+
virtual uint32_t GetWorkRamSize() override { return 0x2000; }
15+
virtual uint32_t GetWorkRamPageSize() override { return 0x2000; }
16+
virtual bool ForceWorkRamSize() override { return true; }
17+
18+
virtual void InitMapper() override
19+
{
20+
AddRegisterRange(0x4100, 0x4FFF, MemoryOperation::Write);
21+
MMC3::InitMapper();
22+
}
23+
24+
virtual void StreamState(bool saving) override
25+
{
26+
MMC3::StreamState(saving);
27+
Stream(_reg);
28+
}
29+
30+
virtual void UpdateMirroring() override
31+
{
32+
if(_reg == 0x01) {
33+
SetPpuMemoryMapping(0x2000, 0x2FFF, 1 << 2, ChrMemoryType::ChrRam, MemoryAccessType::ReadWrite);
34+
} else {
35+
MMC3::UpdateMirroring();
36+
}
37+
}
38+
39+
virtual void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override
40+
{
41+
if(_reg & 0x02) {
42+
memoryType = ChrMemoryType::ChrRam;
43+
page &= 0x03;
44+
}
45+
46+
MMC3::SelectCHRPage(slot, page, memoryType);
47+
}
48+
49+
virtual void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
50+
{
51+
MMC3::SelectPRGPage(slot, page & 0x3F, memoryType);
52+
}
53+
54+
virtual void UpdateState() override
55+
{
56+
MMC3::UpdateState();
57+
58+
// Always enable WRAM
59+
SetCpuMemoryMapping(0x6000, 0x7FFF, 0, HasBattery() ? PrgMemoryType::SaveRam : PrgMemoryType::WorkRam, MemoryAccessType::ReadWrite);
60+
}
61+
62+
void WriteRegister(uint16_t addr, uint8_t value) override
63+
{
64+
if(addr < 0x8000){
65+
if(addr & 0x100) {
66+
_reg = value & 0x03;
67+
UpdateChrMapping();
68+
UpdateMirroring();
69+
}
70+
} else {
71+
MMC3::WriteRegister(addr, value);
72+
}
73+
}
74+
};

Core/Mapper400.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Mapper400 : public BaseMapper
1818

1919
_regs[0] = 0x80;
2020

21-
AddRegisterRange(0x7800, 0x7FFFF, MemoryOperation::Write);
21+
AddRegisterRange(0x7800, 0x7FFF, MemoryOperation::Write);
2222

2323
WriteRegister(0xC000, 0);
2424
}

Core/Mapper428.h

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "BaseMapper.h"
4+
5+
class Mapper428 : public BaseMapper
6+
{
7+
private:
8+
uint8_t _regs[4];
9+
uint8_t _chrLatch;
10+
11+
protected:
12+
uint32_t GetDipSwitchCount() override { return 2; }
13+
uint16_t GetPRGPageSize() override { return 0x4000; }
14+
uint16_t GetCHRPageSize() override { return 0x2000; }
15+
16+
uint16_t RegisterStartAddress() { return 0x6000; }
17+
uint16_t RegisterEndAddress() { return 0xFFFF; }
18+
bool AllowRegisterRead() override { return true; }
19+
20+
void InitMapper() override
21+
{
22+
RemoveRegisterRange(0x8000, 0xFFFF, MemoryOperation::Read);
23+
24+
_chrLatch = 0;
25+
memset(_regs, 0, sizeof(_regs));
26+
UpdateState();
27+
}
28+
29+
void StreamState(bool saving) override
30+
{
31+
BaseMapper::StreamState(saving);
32+
Stream(_regs[0], _regs[1], _regs[2], _regs[3], _chrLatch);
33+
34+
if(!saving) {
35+
UpdateState();
36+
}
37+
}
38+
39+
void Reset(bool softReset) override
40+
{
41+
BaseMapper::Reset(softReset);
42+
43+
_chrLatch = 0;
44+
memset(_regs, 0, sizeof(_regs));
45+
UpdateState();
46+
}
47+
48+
void UpdateState()
49+
{
50+
if (_regs[1] & 0x10) {
51+
SelectPrgPage2x(0, (_regs[1] >> 5) & 0xFE);
52+
} else {
53+
SelectPRGPage(0, _regs[1] >> 5);
54+
SelectPRGPage(1, _regs[1] >> 5);
55+
}
56+
SelectCHRPage(0, ((_regs[1] & 0x07) & ~(_regs[2] >> 6)) | (_chrLatch & (_regs[2] >> 6)));
57+
SetMirroringType((_regs[1] & 0x08) ? MirroringType::Horizontal : MirroringType::Vertical);
58+
}
59+
60+
uint8_t ReadRegister(uint16_t addr) override
61+
{
62+
return (_console->GetMemoryManager()->GetOpenBus() & 0xFC) | (GetDipSwitches() & 0x03);
63+
}
64+
65+
void WriteRegister(uint16_t addr, uint8_t value) override
66+
{
67+
if(addr < 0x8000) {
68+
_regs[addr & 0x03] = value;
69+
} else {
70+
_chrLatch = value;
71+
}
72+
UpdateState();
73+
}
74+
};

0 commit comments

Comments
 (0)