quicknes: support mapper 78. a crappy heuristic is used to guess board type, but it works for both games on it, so there

This commit is contained in:
goyuken 2014-01-17 19:40:25 +00:00
parent 9963518715
commit d8c203a69a
4 changed files with 235 additions and 0 deletions

Binary file not shown.

View File

@ -48,6 +48,48 @@
<ClCompile Include="..\nes_emu\nes_util.cpp" />
<ClCompile Include="..\nes_emu\Nes_Vrc6_Apu.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\fex\blargg_common.h" />
<ClInclude Include="..\fex\blargg_config.h" />
<ClInclude Include="..\fex\blargg_endian.h" />
<ClInclude Include="..\fex\blargg_errors.h" />
<ClInclude Include="..\fex\blargg_source.h" />
<ClInclude Include="..\fex\Data_Reader.h" />
<ClInclude Include="..\nes_emu\abstract_file.h" />
<ClInclude Include="..\nes_emu\apu_state.h" />
<ClInclude Include="..\nes_emu\blargg_common.h" />
<ClInclude Include="..\nes_emu\blargg_config.h" />
<ClInclude Include="..\nes_emu\blargg_endian.h" />
<ClInclude Include="..\nes_emu\blargg_source.h" />
<ClInclude Include="..\nes_emu\Blip_Buffer.h" />
<ClInclude Include="..\nes_emu\Blip_Synth.h" />
<ClInclude Include="..\nes_emu\Effects_Buffer.h" />
<ClInclude Include="..\nes_emu\Multi_Buffer.h" />
<ClInclude Include="..\nes_emu\Nes_Apu.h" />
<ClInclude Include="..\nes_emu\Nes_Buffer.h" />
<ClInclude Include="..\nes_emu\Nes_Cart.h" />
<ClInclude Include="..\nes_emu\Nes_Core.h" />
<ClInclude Include="..\nes_emu\Nes_Cpu.h" />
<ClInclude Include="..\nes_emu\nes_cpu_io.h" />
<ClInclude Include="..\nes_emu\nes_data.h" />
<ClInclude Include="..\nes_emu\Nes_Effects_Buffer.h" />
<ClInclude Include="..\nes_emu\Nes_Emu.h" />
<ClInclude Include="..\nes_emu\Nes_File.h" />
<ClInclude Include="..\nes_emu\Nes_Fme7_Apu.h" />
<ClInclude Include="..\nes_emu\Nes_Mapper.h" />
<ClInclude Include="..\nes_emu\Nes_Namco_Apu.h" />
<ClInclude Include="..\nes_emu\nes_ntsc.h" />
<ClInclude Include="..\nes_emu\nes_ntsc_impl.h" />
<ClInclude Include="..\nes_emu\Nes_Oscs.h" />
<ClInclude Include="..\nes_emu\Nes_Ppu.h" />
<ClInclude Include="..\nes_emu\Nes_Ppu_Bg.h" />
<ClInclude Include="..\nes_emu\Nes_Ppu_Impl.h" />
<ClInclude Include="..\nes_emu\Nes_Ppu_Rendering.h" />
<ClInclude Include="..\nes_emu\Nes_Ppu_Sprites.h" />
<ClInclude Include="..\nes_emu\Nes_State.h" />
<ClInclude Include="..\nes_emu\nes_util.h" />
<ClInclude Include="..\nes_emu\Nes_Vrc6_Apu.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{F07F76D3-08E6-4EBC-82F9-53FF90ABD9A9}</ProjectGuid>
<RootNamespace>libquicknes</RootNamespace>

View File

@ -136,4 +136,126 @@
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\nes_emu\abstract_file.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\apu_state.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\blargg_common.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\blargg_config.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\blargg_endian.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\blargg_source.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Blip_Buffer.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Blip_Synth.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Effects_Buffer.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Multi_Buffer.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Apu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Buffer.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Cart.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Core.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Cpu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\nes_cpu_io.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\nes_data.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Effects_Buffer.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Emu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_File.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Fme7_Apu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Mapper.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Namco_Apu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\nes_ntsc.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\nes_ntsc_impl.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Oscs.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Ppu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Ppu_Bg.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Ppu_Impl.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Ppu_Rendering.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Ppu_Sprites.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_State.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\nes_util.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\nes_emu\Nes_Vrc6_Apu.h">
<Filter>Header Files\nes_emu</Filter>
</ClInclude>
<ClInclude Include="..\fex\blargg_common.h">
<Filter>Header Files\fex</Filter>
</ClInclude>
<ClInclude Include="..\fex\blargg_config.h">
<Filter>Header Files\fex</Filter>
</ClInclude>
<ClInclude Include="..\fex\blargg_endian.h">
<Filter>Header Files\fex</Filter>
</ClInclude>
<ClInclude Include="..\fex\blargg_errors.h">
<Filter>Header Files\fex</Filter>
</ClInclude>
<ClInclude Include="..\fex\blargg_source.h">
<Filter>Header Files\fex</Filter>
</ClInclude>
<ClInclude Include="..\fex\Data_Reader.h">
<Filter>Header Files\fex</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -194,6 +194,75 @@ public:
}
};
class Mapper_78 : public Nes_Mapper {
// lower 8 bits are the reg at 8000:ffff
// next two bits are autodetecting type
// 0 = unknown 1 = cosmo carrier 2 = holy diver
int reg;
void writeinternal(int data, int changed)
{
reg &= 0x300;
reg |= data;
if (changed & 0x07)
set_prg_bank(0x8000, bank_16k, reg & 0x07);
if (changed & 0xf0)
set_chr_bank(0x0000, bank_8k, (reg >> 4) & 0x0f);
if (changed & 0x08)
{
// set mirroring based on memorized board type
if (reg & 0x100)
{
mirror_single((reg >> 3) & 1);
}
else if (reg & 0x200)
{
if (reg & 0x08)
mirror_vert();
else
mirror_horiz();
}
else
{
// if you don't set something here, holy diver dumps with 4sc set will
// savestate as 4k NTRAM. then when you later set H\V mapping, state size mismatch.
mirror_single(1);
}
}
}
public:
Mapper_78()
{
register_state(&reg, 4);
}
virtual void reset_state()
{
reg = 0;
}
virtual void apply_mapping()
{
writeinternal(reg, 0xff);
}
virtual void write( nes_time_t, nes_addr_t addr, int data)
{
// heuristic: if the first write ever to the register is 0,
// we're on holy diver, otherwise, carrier. it works for these two games...
if (!(reg & 0x300))
{
reg |= data ? 0x100 : 0x200;
writeinternal(data, 0xff);
}
else
{
writeinternal(data, reg ^ data);
}
}
};
void register_misc_mappers();
void register_misc_mappers()
{
@ -203,5 +272,7 @@ void register_misc_mappers()
register_mapper<Mapper_Camerica>( 71 );
register_mapper<Mapper_87>( 87 );
register_mapper<Mapper_Quattro>( 232 );
register_mapper<Mapper_78>( 78 );
}