Skip to content

Commit 7b5691c

Browse files
NovaSquirrelmkwong98
authored andcommitted
Merge pull request SourMesen#119 from negativeExponent/mesenx
mappers
1 parent 7ec1aa6 commit 7b5691c

File tree

6 files changed

+255
-1
lines changed

6 files changed

+255
-1
lines changed

Core/Core.vcxproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,8 @@
775775
<ClInclude Include="Mapper183.h" />
776776
<ClInclude Include="Mapper253.h" />
777777
<ClInclude Include="Mapper271.h" />
778+
<ClInclude Include="Mapper272.h" />
779+
<ClInclude Include="Mapper277.h" />
778780
<ClInclude Include="Mapper541.h" />
779781
<ClInclude Include="Mapper43.h" />
780782
<ClInclude Include="Mapper83.h" />
@@ -800,6 +802,7 @@
800802
<ClInclude Include="Mapper359.h" />
801803
<ClInclude Include="Mapper360.h" />
802804
<ClInclude Include="Mapper362.h" />
805+
<ClInclude Include="Mapper368.h" />
803806
<ClInclude Include="Mapper375.h" />
804807
<ClInclude Include="Mapper380.h" />
805808
<ClInclude Include="Mapper382.h" />

Core/Core.vcxproj.filters

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,12 @@
982982
<ClInclude Include="Mapper271.h">
983983
<Filter>Nes\Mappers\Unnamed</Filter>
984984
</ClInclude>
985+
<ClInclude Include="Mapper272.h">
986+
<Filter>Nes\Mappers\Unnamed</Filter>
987+
</ClInclude>
988+
<ClInclude Include="Mapper277.h">
989+
<Filter>Nes\Mappers\Unnamed</Filter>
990+
</ClInclude>
985991
<ClInclude Include="Sachen_136.h">
986992
<Filter>Nes\Mappers\Sachen</Filter>
987993
</ClInclude>
@@ -1555,6 +1561,9 @@
15551561
<ClInclude Include="Mapper362.h">
15561562
<Filter>Nes\Mappers\Unnamed</Filter>
15571563
</ClInclude>
1564+
<ClInclude Include="Mapper368.h">
1565+
<Filter>Nes\Mappers\Unnamed</Filter>
1566+
</ClInclude>
15581567
<ClInclude Include="Mapper375.h">
15591568
<Filter>Nes\Mappers\Unnamed</Filter>
15601569
</ClInclude>

Core/Mapper272.h

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "BaseMapper.h"
4+
5+
class Mapper272 : public BaseMapper
6+
{
7+
private:
8+
uint8_t _chrBanks[8];
9+
uint8_t _irqCounter;
10+
bool _irqEnabled;
11+
uint16_t _lastPpuAddr;
12+
13+
protected:
14+
virtual uint16_t GetPRGPageSize() override { return 0x2000; }
15+
virtual uint16_t GetCHRPageSize() override { return 0x0400; }
16+
17+
void InitMapper() override
18+
{
19+
memset(_chrBanks, 0, sizeof(_chrBanks));
20+
21+
_irqEnabled = false;
22+
_irqCounter = 0;
23+
24+
SelectPRGPage(2, -2);
25+
SelectPRGPage(3, -1);
26+
}
27+
28+
void StreamState(bool saving) override
29+
{
30+
BaseMapper::StreamState(saving);
31+
ArrayInfo<uint8_t> chrBanks = { _chrBanks, 8 };
32+
Stream(_irqEnabled, _irqCounter, chrBanks);
33+
}
34+
35+
void WriteRegister(uint16_t addr, uint8_t value) override
36+
{
37+
if((addr >= 0xB000) && (addr <= 0xE003)) {
38+
uint8_t index = ((((addr >> 12) & 0x07) - 3) << 1) + ((addr >> 1) & 0x01);
39+
bool lowBits = (addr & 0x01) == 0x00;
40+
if (lowBits) {
41+
_chrBanks[index] = (_chrBanks[index] & 0xF0) | (value & 0x0F);
42+
} else {
43+
_chrBanks[index] = (_chrBanks[index] & 0x0F) | (value << 4);
44+
}
45+
SelectCHRPage(index, _chrBanks[index]);
46+
} else {
47+
switch(addr & 0xF000) {
48+
case 0x8000:
49+
SelectPRGPage(0, value);
50+
break;
51+
52+
case 0xA000:
53+
SelectPRGPage(1, value);
54+
break;
55+
56+
case 0x9000:
57+
switch(value & 0x01) {
58+
case 0: SetMirroringType(MirroringType::Vertical); break;
59+
case 1: SetMirroringType(MirroringType::Horizontal); break;
60+
}
61+
break;
62+
}
63+
}
64+
65+
switch(addr & 0xC00C) {
66+
case 0x8004:
67+
switch(value & 0x03) {
68+
case 2: SetMirroringType(MirroringType::ScreenAOnly); break;
69+
case 3: SetMirroringType(MirroringType::ScreenBOnly); break;
70+
}
71+
break;
72+
73+
case 0x800C:
74+
_console->GetCpu()->SetIrqSource(IRQSource::External);
75+
break;
76+
77+
case 0xC004:
78+
_console->GetCpu()->ClearIrqSource(IRQSource::External);
79+
break;
80+
81+
case 0xC008:
82+
_irqEnabled = true;
83+
break;
84+
85+
case 0xC00C:
86+
_irqEnabled = false;
87+
_irqCounter = 0;
88+
_console->GetCpu()->ClearIrqSource(IRQSource::External);
89+
break;
90+
}
91+
}
92+
93+
void NotifyVRAMAddressChange(uint16_t addr) override
94+
{
95+
if ((_lastPpuAddr & 0x2000) && !(addr & 0x2000)) {
96+
if(_irqEnabled) {
97+
_irqCounter++;
98+
if(_irqCounter == 84) {
99+
_irqCounter = 0;
100+
_console->GetCpu()->SetIrqSource(IRQSource::External);
101+
}
102+
}
103+
}
104+
105+
_lastPpuAddr = addr;
106+
}
107+
};
108+

Core/Mapper277.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "BaseMapper.h"
4+
5+
class Mapper277 : public BaseMapper
6+
{
7+
private:
8+
bool _locked;
9+
10+
protected:
11+
uint16_t GetPRGPageSize() override { return 0x4000; }
12+
uint16_t GetCHRPageSize() override { return 0x2000; }
13+
14+
void InitMapper() override
15+
{
16+
WriteRegister(0, 0x08);
17+
}
18+
19+
void Reset(bool softReset) override
20+
{
21+
_locked = false;
22+
WriteRegister(0, 0x08);
23+
}
24+
25+
void WriteRegister(uint16_t addr, uint8_t value) override
26+
{
27+
if(!_locked) {
28+
uint8_t prgBank = value & 0x0F;
29+
30+
_locked = (value & 0x20) == 0x20;
31+
32+
if(value & 0x08) {
33+
if(value & 0x01) {
34+
SelectPRGPage(0, prgBank);
35+
SelectPRGPage(1, prgBank);
36+
} else {
37+
SelectPrgPage2x(0, prgBank & 0xFE);
38+
}
39+
} else {
40+
SelectPRGPage(0, prgBank);
41+
SelectPRGPage(1, prgBank | 0x07);
42+
}
43+
44+
SelectCHRPage(0, 0);
45+
SetMirroringType(value & 0x10 ? MirroringType::Horizontal : MirroringType::Vertical);
46+
}
47+
}
48+
};
49+

Core/Mapper368.h

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
#include "BaseMapper.h"
4+
5+
// YUNG-08
6+
7+
class Mapper368 : public BaseMapper
8+
{
9+
private:
10+
uint8_t _latch;
11+
12+
bool _irqEnabled;
13+
uint16_t _irqCounter;
14+
15+
protected:
16+
uint16_t GetPRGPageSize() override { return 0x2000; }
17+
uint16_t GetCHRPageSize() override { return 0x2000; }
18+
uint16_t RegisterStartAddress() override { return 0x4022; }
19+
uint16_t RegisterEndAddress() override { return 0x4FFF; }
20+
bool AllowRegisterRead() override { return true; }
21+
22+
void InitMapper() override
23+
{
24+
_irqEnabled = false;
25+
_irqCounter = 0;
26+
_latch = 0;
27+
28+
SetCpuMemoryMapping(0x6000, 0x7FFF, 0x02, PrgMemoryType::PrgRom);
29+
30+
SelectPRGPage(0, 1);
31+
SelectPRGPage(1, 0);
32+
SelectPRGPage(3, 8);
33+
34+
SelectCHRPage(0, 0);
35+
}
36+
37+
void StreamState(bool saving) override
38+
{
39+
BaseMapper::StreamState(saving);
40+
Stream(_latch, _irqEnabled, _irqCounter);
41+
}
42+
43+
void ProcessCpuClock() override
44+
{
45+
if(_irqEnabled) {
46+
_irqCounter++;
47+
if((_irqCounter & 0xFFF) == 0) {
48+
_console->GetCpu()->SetIrqSource(IRQSource::External);
49+
}
50+
}
51+
}
52+
53+
uint8_t ReadRegister(uint16_t addr) override
54+
{
55+
if((addr & 0x1FF) == 0x122) {
56+
return (0x8A | (_latch & 0x35));
57+
}
58+
return InternalReadRam(addr);
59+
}
60+
61+
void WriteRegister(uint16_t addr, uint8_t value) override
62+
{
63+
switch(addr & 0x1FF) {
64+
case 0x022:
65+
// bank order = { 4, 3, 5, 3, 6, 3, 7, 3 };
66+
SelectPRGPage(2, (value & 0x01) ? 0x03 : (0x04 | value >> 1));
67+
break;
68+
69+
case 0x122:
70+
_latch = value;
71+
_irqEnabled = (value & 0x01) != 0;
72+
if(!_irqEnabled) {
73+
_irqCounter = 0;
74+
_console->GetCpu()->ClearIrqSource(IRQSource::External);
75+
}
76+
break;
77+
}
78+
}
79+
};

Core/MapperFactory.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,16 @@
167167
#include "Mapper246.h"
168168
#include "Mapper253.h"
169169
#include "Mapper271.h"
170+
#include "Mapper272.h"
171+
#include "Mapper277.h"
170172
#include "Mapper319.h"
171173
#include "Mapper326.h"
172174
#include "Mapper330.h"
173175
#include "Mapper359.h"
174176
#include "Mapper357.h"
175177
#include "Mapper360.h"
176178
#include "Mapper362.h"
179+
#include "Mapper368.h"
177180
#include "Mapper375.h"
178181
#include "Mapper380.h"
179182
#include "Mapper382.h"
@@ -712,9 +715,11 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
712715
return new MMC3_269();
713716
//269-270
714717
case 271: return new Mapper271();
715-
//272-273
718+
case 272: return new Mapper272();
719+
//273
716720
case 274: return new Bmc80013B();
717721
//275-282
722+
case 277: return new Mapper277();
718723
case 281: return new JyCompany();
719724
case 282: return new JyCompany();
720725
case 283: return new Gs2004_Gs2013();
@@ -792,6 +797,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
792797
case 362: return new Mapper362();
793798
case 364: return new MMC3_364();
794799
case 366: return new BmcGn45();
800+
case 368: return new Mapper368();
795801
case 369: return new MMC3_369();
796802
case 370: return new MMC3_370();
797803
case 372: return new MMC3_372();

0 commit comments

Comments
 (0)