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:
parent
9963518715
commit
d8c203a69a
Binary file not shown.
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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(®, 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 );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue