Added OBC1 support
This commit is contained in:
parent
316e22d843
commit
fbc0f2e0de
6 changed files with 158 additions and 9 deletions
|
@ -13,6 +13,7 @@
|
|||
#include "Gsu.h"
|
||||
#include "Sdd1.h"
|
||||
#include "Cx4.h"
|
||||
#include "Obc1.h"
|
||||
#include "../Utilities/HexUtilities.h"
|
||||
#include "../Utilities/VirtualFile.h"
|
||||
#include "../Utilities/FolderUtilities.h"
|
||||
|
@ -374,6 +375,8 @@ void BaseCartridge::InitCoprocessor()
|
|||
} else if(_coprocessorType == CoprocessorType::CX4) {
|
||||
_coprocessor.reset(new Cx4(_console));
|
||||
_cx4 = dynamic_cast<Cx4*>(_coprocessor.get());
|
||||
} else if(_coprocessorType == CoprocessorType::OBC1) {
|
||||
_coprocessor.reset(new Obc1(_console, _saveRam, _saveRamSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -98,6 +98,7 @@
|
|||
<ClInclude Include="NecDspDisUtils.h" />
|
||||
<ClInclude Include="NecDspTypes.h" />
|
||||
<ClInclude Include="NtscFilter.h" />
|
||||
<ClInclude Include="Obc1.h" />
|
||||
<ClInclude Include="PpuTools.h" />
|
||||
<ClInclude Include="RegisterHandlerB.h" />
|
||||
<ClInclude Include="CpuTypes.h" />
|
||||
|
@ -219,6 +220,7 @@
|
|||
<ClCompile Include="NecDspDisUtils.cpp" />
|
||||
<ClCompile Include="NotificationManager.cpp" />
|
||||
<ClCompile Include="NtscFilter.cpp" />
|
||||
<ClCompile Include="Obc1.cpp" />
|
||||
<ClCompile Include="Ppu.cpp" />
|
||||
<ClCompile Include="PpuTools.cpp" />
|
||||
<ClCompile Include="RegisterHandlerB.cpp" />
|
||||
|
|
|
@ -296,12 +296,6 @@
|
|||
<ClInclude Include="BaseCoprocessor.h">
|
||||
<Filter>SNES\Coprocessors</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="NecDsp.h">
|
||||
<Filter>SNES\Coprocessors</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="NecDspTypes.h">
|
||||
<Filter>SNES\Coprocessors</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FirmwareHelper.h">
|
||||
<Filter>Misc</Filter>
|
||||
</ClInclude>
|
||||
|
@ -374,6 +368,15 @@
|
|||
<ClInclude Include="Cx4DisUtils.h">
|
||||
<Filter>Debugger\Disassembler</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="NecDsp.h">
|
||||
<Filter>SNES\Coprocessors\DSP</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="NecDspTypes.h">
|
||||
<Filter>SNES\Coprocessors\DSP</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Obc1.h">
|
||||
<Filter>SNES\Coprocessors\OBC1</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="stdafx.cpp" />
|
||||
|
@ -554,9 +557,6 @@
|
|||
<ClCompile Include="ScriptManager.cpp">
|
||||
<Filter>Debugger\Scripts</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="NecDsp.cpp">
|
||||
<Filter>SNES\Coprocessors</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AluMulDiv.cpp">
|
||||
<Filter>SNES</Filter>
|
||||
</ClCompile>
|
||||
|
@ -608,6 +608,12 @@
|
|||
<ClCompile Include="Cx4DisUtils.cpp">
|
||||
<Filter>Debugger\Disassembler</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="NecDsp.cpp">
|
||||
<Filter>SNES\Coprocessors\DSP</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Obc1.cpp">
|
||||
<Filter>SNES\Coprocessors\OBC1</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="SNES">
|
||||
|
@ -661,5 +667,11 @@
|
|||
<Filter Include="SNES\Coprocessors\CX4">
|
||||
<UniqueIdentifier>{4bf65a17-58bf-4833-a4af-38ddc285f99d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="SNES\Coprocessors\DSP">
|
||||
<UniqueIdentifier>{abf0076b-2ce5-4aac-b6cb-be48829c7489}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="SNES\Coprocessors\OBC1">
|
||||
<UniqueIdentifier>{244dec9a-54e9-478d-91a2-ab3ab5f6db1c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
</Project>
|
98
Core/Obc1.cpp
Normal file
98
Core/Obc1.cpp
Normal file
|
@ -0,0 +1,98 @@
|
|||
#include "stdafx.h"
|
||||
#include "Obc1.h"
|
||||
#include "Console.h"
|
||||
#include "MemoryManager.h"
|
||||
#include "MemoryMappings.h"
|
||||
|
||||
Obc1::Obc1(Console* console, uint8_t* saveRam, uint32_t saveRamSize)
|
||||
{
|
||||
MemoryMappings *mappings = console->GetMemoryManager()->GetMemoryMappings();
|
||||
mappings->RegisterHandler(0x00, 0x3F, 0x6000, 0x7FFF, this);
|
||||
mappings->RegisterHandler(0x80, 0xBF, 0x6000, 0x7FFF, this);
|
||||
|
||||
_ram = saveRam;
|
||||
_mask = saveRamSize - 1;
|
||||
}
|
||||
|
||||
void Obc1::Reset()
|
||||
{
|
||||
}
|
||||
|
||||
uint8_t Obc1::ReadRam(uint16_t addr)
|
||||
{
|
||||
return _ram[addr & _mask];
|
||||
}
|
||||
|
||||
void Obc1::WriteRam(uint16_t addr, uint8_t value)
|
||||
{
|
||||
_ram[addr & _mask] = value;
|
||||
}
|
||||
|
||||
uint8_t Obc1::Read(uint32_t addr)
|
||||
{
|
||||
addr &= 0x1FFF;
|
||||
|
||||
switch(addr) {
|
||||
case 0x1FF0: return ReadRam(GetLowAddress());
|
||||
case 0x1FF1: return ReadRam(GetLowAddress() + 1);
|
||||
case 0x1FF2: return ReadRam(GetLowAddress() + 2);
|
||||
case 0x1FF3: return ReadRam(GetLowAddress() + 3);
|
||||
case 0x1FF4: return ReadRam(GetHighAddress());
|
||||
}
|
||||
return ReadRam(addr);
|
||||
}
|
||||
|
||||
void Obc1::Write(uint32_t addr, uint8_t value)
|
||||
{
|
||||
addr &= 0x1FFF;
|
||||
|
||||
switch(addr) {
|
||||
case 0x1FF0: WriteRam(GetLowAddress(), value); break;
|
||||
case 0x1FF1: WriteRam(GetLowAddress() + 1, value); break;
|
||||
case 0x1FF2: WriteRam(GetLowAddress() + 2, value); break;
|
||||
case 0x1FF3: WriteRam(GetLowAddress() + 3, value); break;
|
||||
case 0x1FF4: {
|
||||
uint8_t shift = (ReadRam(0x1FF6) & 0x03) << 1;
|
||||
WriteRam(GetHighAddress(), ((value & 0x03) << shift) | (ReadRam(GetHighAddress()) & ~(0x03 << shift)));
|
||||
break;
|
||||
}
|
||||
|
||||
default: WriteRam(addr, value); break;
|
||||
}
|
||||
}
|
||||
|
||||
//$1FF5: Base address in bit 0 (0 = $1C00, 1 = $1800)
|
||||
//$1FF6: "OAM" index (0-127) in first 7 bits
|
||||
uint16_t Obc1::GetBaseAddress()
|
||||
{
|
||||
return 0x1800 | ((~ReadRam(0x1FF5) & 0x01) << 10);
|
||||
}
|
||||
|
||||
uint16_t Obc1::GetLowAddress()
|
||||
{
|
||||
return GetBaseAddress() | ((ReadRam(0x1FF6) & 0x7F) << 2);
|
||||
}
|
||||
|
||||
uint16_t Obc1::GetHighAddress()
|
||||
{
|
||||
return (GetBaseAddress() | ((ReadRam(0x1FF6) & 0x7F) >> 2)) + 0x200;
|
||||
}
|
||||
|
||||
void Obc1::Serialize(Serializer &s)
|
||||
{
|
||||
}
|
||||
|
||||
uint8_t Obc1::Peek(uint32_t addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Obc1::PeekBlock(uint8_t *output)
|
||||
{
|
||||
memset(output, 0, 0x1000);
|
||||
}
|
||||
|
||||
AddressInfo Obc1::GetAbsoluteAddress(uint32_t address)
|
||||
{
|
||||
return { -1, SnesMemoryType::Register };
|
||||
}
|
33
Core/Obc1.h
Normal file
33
Core/Obc1.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
#pragma once
|
||||
#include "stdafx.h"
|
||||
#include "BaseCoprocessor.h"
|
||||
|
||||
class Console;
|
||||
|
||||
class Obc1 : public BaseCoprocessor
|
||||
{
|
||||
private:
|
||||
uint8_t *_ram;
|
||||
uint32_t _mask;
|
||||
|
||||
uint16_t GetBaseAddress();
|
||||
uint16_t GetLowAddress();
|
||||
uint16_t GetHighAddress();
|
||||
|
||||
uint8_t ReadRam(uint16_t addr);
|
||||
void WriteRam(uint16_t addr, uint8_t value);
|
||||
|
||||
public:
|
||||
Obc1(Console* console, uint8_t* saveRam, uint32_t saveRamSize);
|
||||
|
||||
void Reset() override;
|
||||
|
||||
uint8_t Read(uint32_t addr) override;
|
||||
void Write(uint32_t addr, uint8_t value) override;
|
||||
|
||||
void Serialize(Serializer & s) override;
|
||||
|
||||
uint8_t Peek(uint32_t addr) override;
|
||||
void PeekBlock(uint8_t * output) override;
|
||||
AddressInfo GetAbsoluteAddress(uint32_t address) override;
|
||||
};
|
|
@ -66,6 +66,7 @@ SOURCES_CXX := $(LIBRETRO_DIR)/libretro.cpp \
|
|||
$(CORE_DIR)/NecDspDisUtils.cpp \
|
||||
$(CORE_DIR)/NotificationManager.cpp \
|
||||
$(CORE_DIR)/NtscFilter.cpp \
|
||||
$(CORE_DIR)/Obc1.cpp \
|
||||
$(CORE_DIR)/Ppu.cpp \
|
||||
$(CORE_DIR)/PpuTools.cpp \
|
||||
$(CORE_DIR)/RegisterHandlerB.cpp \
|
||||
|
|
Loading…
Add table
Reference in a new issue