stella/src/emucore/CartX07.cxx

97 lines
2.9 KiB
C++
Raw Normal View History

//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2024 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#include "System.hxx"
#include "M6532.hxx"
#include "TIA.hxx"
#include "CartX07.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeX07::CartridgeX07(const ByteBuffer& image, size_t size,
string_view md5, const Settings& settings,
size_t bsSize)
: CartridgeEnhanced(image, size, md5, settings, bsSize)
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CartridgeX07::install(System& system)
{
2020-04-09 14:07:38 +00:00
CartridgeEnhanced::install(system);
// Set the page accessing methods for the hot spots
// The hotspots use almost all addresses below 0x1000, so we simply grab them
// all and forward the TIA/RIOT calls from the peek and poke methods.
const System::PageAccess access(this, System::PageAccessType::READWRITE);
for(uInt16 addr = 0x00; addr < 0x1000; addr += System::PAGE_SIZE)
mySystem->setPageAccess(addr, access);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2020-04-09 14:07:38 +00:00
bool CartridgeX07::checkSwitchBank(uInt16 address, uInt8)
{
// Switch banks if necessary
if((address & 0x180f) == 0x080d)
2020-04-09 14:07:38 +00:00
{
bank((address & 0xf0) >> 4);
2020-04-09 14:07:38 +00:00
return true;
}
else if((address & 0x1880) == 0)
{
2020-04-09 14:07:38 +00:00
if((getBank() & 0xe) == 0xe)
{
bank(((address & 0x40) >> 6) | 0xe);
return true;
}
}
2020-04-09 14:07:38 +00:00
return false;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2020-04-09 14:07:38 +00:00
uInt8 CartridgeX07::peek(uInt16 address)
{
2020-04-09 14:07:38 +00:00
uInt8 value = 0; // JTZ: is this correct?
// Check for RAM or TIA mirroring
const uInt16 lowAddress = address & 0x3ff;
2020-04-09 14:07:38 +00:00
if(lowAddress & 0x80)
2020-04-09 14:07:38 +00:00
value = mySystem->m6532().peek(address);
else if(!(lowAddress & 0x200))
2020-04-09 14:07:38 +00:00
value = mySystem->tia().peek(address);
checkSwitchBank(address, 0);
2020-04-09 14:07:38 +00:00
return value;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2020-04-09 14:07:38 +00:00
bool CartridgeX07::poke(uInt16 address, uInt8 value)
{
2020-04-09 14:07:38 +00:00
// Check for RAM or TIA mirroring
const uInt16 lowAddress = address & 0x3ff;
2020-04-09 14:07:38 +00:00
if(lowAddress & 0x80)
mySystem->m6532().poke(address, value);
else if(!(lowAddress & 0x200))
mySystem->tia().poke(address, value);
checkSwitchBank(address, 0);
2020-04-09 14:07:38 +00:00
return false;
}