mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
#include "pch.h"
|
|
#include "WS/Carts/WsCart.h"
|
|
#include "WS/WsMemoryManager.h"
|
|
#include "WS/WsEeprom.h"
|
|
#include "Utilities/Serializer.h"
|
|
|
|
void WsCart::Map(uint32_t start, uint32_t end, MemoryType type, uint32_t offset, bool readonly)
|
|
{
|
|
_memoryManager->Map(start, end, type, offset, readonly);
|
|
}
|
|
|
|
void WsCart::Unmap(uint32_t start, uint32_t end)
|
|
{
|
|
_memoryManager->Unmap(start, end);
|
|
}
|
|
|
|
WsCart::WsCart()
|
|
{
|
|
_state.SelectedBanks[0] = 0xFF;
|
|
_state.SelectedBanks[1] = 0xFF;
|
|
_state.SelectedBanks[2] = 0xFF;
|
|
_state.SelectedBanks[3] = 0xFF;
|
|
}
|
|
|
|
void WsCart::Init(WsMemoryManager* memoryManager, WsEeprom* cartEeprom)
|
|
{
|
|
_memoryManager = memoryManager;
|
|
_cartEeprom = cartEeprom;
|
|
}
|
|
|
|
void WsCart::RefreshMappings()
|
|
{
|
|
Map(0x10000, 0x1FFFF, MemoryType::WsCartRam, _state.SelectedBanks[1] * 0x10000, false);
|
|
Map(0x20000, 0x2FFFF, MemoryType::WsPrgRom, _state.SelectedBanks[2] * 0x10000, true);
|
|
Map(0x30000, 0x3FFFF, MemoryType::WsPrgRom, _state.SelectedBanks[3] * 0x10000, true);
|
|
Map(0x40000, 0xFFFFF, MemoryType::WsPrgRom, _state.SelectedBanks[0] * 0x100000 + 0x40000, true);
|
|
}
|
|
|
|
uint8_t WsCart::ReadPort(uint16_t port)
|
|
{
|
|
if(port < 0xC4) {
|
|
return _state.SelectedBanks[port - 0xC0];
|
|
} else if(port < 0xC9 && _cartEeprom) {
|
|
return _cartEeprom->ReadPort(port - 0xC4);
|
|
}
|
|
|
|
//TODOWS open bus
|
|
return 0x90;
|
|
}
|
|
|
|
void WsCart::WritePort(uint16_t port, uint8_t value)
|
|
{
|
|
if(port < 0xC4) {
|
|
_state.SelectedBanks[port - 0xC0] = value;
|
|
_memoryManager->RefreshMappings();
|
|
} else if(port < 0xC9 && _cartEeprom) {
|
|
_cartEeprom->WritePort(port - 0xC4, value);
|
|
}
|
|
}
|
|
|
|
void WsCart::Serialize(Serializer& s)
|
|
{
|
|
SVArray(_state.SelectedBanks, 4);
|
|
}
|