Path: blob/a-new-beginning/Cherry/Core/include/ActivisionMapper.h
2 views
/*1* Gearcoleco - ColecoVision Emulator2* Copyright (C) 2021 Ignacio Sanchez34* This program is free software: you can redistribute it and/or modify5* it under the terms of the GNU General Public License as published by6* the Free Software Foundation, either version 3 of the License, or7* any later version.89* This program is distributed in the hope that it will be useful,10* but WITHOUT ANY WARRANTY; without even the implied warranty of11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12* GNU General Public License for more details.1314* You should have received a copy of the GNU General Public License15* along with this program. If not, see http://www.gnu.org/licenses/16*17*/1819#ifndef ACTIVISIONMAPPER_H20#define ACTIVISIONMAPPER_H2122#include "Mapper.h"23#include "Cartridge.h"2425class ActivisionMapper : public Mapper26{27public:28ActivisionMapper(Cartridge* pCartridge);29virtual ~ActivisionMapper();3031virtual void Reset();32virtual u8 Read(u16 address);33virtual void Write(u16 address, u8 value);34virtual void SaveState(std::ostream& stream);35virtual void LoadState(std::istream& stream);36virtual u8 GetRomBank() { return m_RomBank; }37virtual u32 GetRomBankAddress() { return m_RomBankAddress; }3839private:40u8 m_RomBank;41u32 m_RomBankAddress;42};4344inline ActivisionMapper::ActivisionMapper(Cartridge* pCartridge) : Mapper(pCartridge)45{46Reset();47}4849inline ActivisionMapper::~ActivisionMapper()50{51}5253inline void ActivisionMapper::Reset()54{55m_RomBank = 0;56m_RomBankAddress = 0;57}5859inline u8 ActivisionMapper::Read(u16 address)60{61u8* pRom = m_pCartridge->GetROM();6263if (address < 0xC000)64{65return pRom[address & 0x3FFF];66}67else68{69#ifdef DEBUG_GEARCOLECO70if (address >= 0xFF80)71{72Debug("--> ** EEPROM read: %X", address);73}74#endif75return pRom[(address & 0x3FFF) + m_RomBankAddress];76}77}7879inline void ActivisionMapper::Write(u16 address, u8 value)80{81if (m_pCartridge->HasSRAM() && (address >= 0xE000) && (address < 0xE800))82{83u8* pRom = m_pCartridge->GetROM();84pRom[(address + 0x800) & 0x7FFF] = value;85}86else if (address >= 0xFF90)87{88if ((address == 0xFF90) || (address == 0xFFA0) || (address == 0xFFB0))89{90m_RomBank = (address >> 4) & (m_pCartridge->GetROMBankCount() - 1);91m_RomBankAddress = m_RomBank << 14;92}93}94else95{96Debug("--> ** Attempting to write on ROM: %X %X", address, value);97}98}99100inline void ActivisionMapper::SaveState(std::ostream& stream)101{102stream.write(reinterpret_cast<const char*> (&m_RomBank), sizeof(m_RomBank));103stream.write(reinterpret_cast<const char*> (&m_RomBankAddress), sizeof(m_RomBankAddress));104}105106inline void ActivisionMapper::LoadState(std::istream& stream)107{108stream.read(reinterpret_cast<char*> (&m_RomBank), sizeof(m_RomBank));109stream.read(reinterpret_cast<char*> (&m_RomBankAddress), sizeof(m_RomBankAddress));110}111112#endif /* ACTIVISIONMAPPER_H */113114115