mirror of https://github.com/stella-emu/stella.git
refactor CartX07
This commit is contained in:
parent
97ff37392d
commit
245adc721d
|
@ -103,7 +103,7 @@ string CartridgeX07Widget::bankState()
|
||||||
{
|
{
|
||||||
ostringstream& buf = buffer();
|
ostringstream& buf = buffer();
|
||||||
|
|
||||||
buf << "Bank = " << std::dec << myCart.myCurrentBank;
|
buf << "Bank = " << std::dec << myCart.getBank();
|
||||||
|
|
||||||
return buf.str();
|
return buf.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,25 +23,14 @@
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CartridgeX07::CartridgeX07(const ByteBuffer& image, size_t size,
|
CartridgeX07::CartridgeX07(const ByteBuffer& image, size_t size,
|
||||||
const string& md5, const Settings& settings)
|
const string& md5, const Settings& settings)
|
||||||
: Cartridge(settings, md5)
|
: CartridgeEnhanced(image, size, md5, settings)
|
||||||
{
|
{
|
||||||
// Copy the ROM image into my buffer
|
|
||||||
std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin());
|
|
||||||
createRomAccessArrays(myImage.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeX07::reset()
|
|
||||||
{
|
|
||||||
// Upon reset we switch to the startup bank
|
|
||||||
initializeStartBank(0);
|
|
||||||
bank(startBank());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeX07::install(System& system)
|
void CartridgeX07::install(System& system)
|
||||||
{
|
{
|
||||||
mySystem = &system;
|
CartridgeEnhanced::install(system);
|
||||||
|
|
||||||
// Set the page accessing methods for the hot spots
|
// Set the page accessing methods for the hot spots
|
||||||
// The hotspots use almost all addresses below 0x1000, so we simply grab them
|
// The hotspots use almost all addresses below 0x1000, so we simply grab them
|
||||||
|
@ -49,31 +38,42 @@ void CartridgeX07::install(System& system)
|
||||||
System::PageAccess access(this, System::PageAccessType::READWRITE);
|
System::PageAccess access(this, System::PageAccessType::READWRITE);
|
||||||
for(uInt16 addr = 0x00; addr < 0x1000; addr += System::PAGE_SIZE)
|
for(uInt16 addr = 0x00; addr < 0x1000; addr += System::PAGE_SIZE)
|
||||||
mySystem->setPageAccess(addr, access);
|
mySystem->setPageAccess(addr, access);
|
||||||
|
}
|
||||||
|
|
||||||
// Install pages for the startup bank
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bank(startBank());
|
bool CartridgeX07::checkSwitchBank(uInt16 address, uInt8)
|
||||||
|
{
|
||||||
|
// Switch banks if necessary
|
||||||
|
if((address & 0x180f) == 0x080d)
|
||||||
|
{
|
||||||
|
bank((address & 0xf0) >> 4);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if((address & 0x1880) == 0)
|
||||||
|
{
|
||||||
|
if((getBank() & 0xe) == 0xe)
|
||||||
|
{
|
||||||
|
bank(((address & 0x40) >> 6) | 0xe);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt8 CartridgeX07::peek(uInt16 address)
|
uInt8 CartridgeX07::peek(uInt16 address)
|
||||||
{
|
{
|
||||||
uInt8 value = 0;
|
uInt8 value = 0; // JTZ: is this correct?
|
||||||
|
|
||||||
// Check for RAM or TIA mirroring
|
// Check for RAM or TIA mirroring
|
||||||
uInt16 lowAddress = address & 0x3ff;
|
uInt16 lowAddress = address & 0x3ff;
|
||||||
|
|
||||||
if(lowAddress & 0x80)
|
if(lowAddress & 0x80)
|
||||||
value = mySystem->m6532().peek(address);
|
value = mySystem->m6532().peek(address);
|
||||||
else if(!(lowAddress & 0x200))
|
else if(!(lowAddress & 0x200))
|
||||||
value = mySystem->tia().peek(address);
|
value = mySystem->tia().peek(address);
|
||||||
|
|
||||||
// Switch banks if necessary
|
checkSwitchBank(address);
|
||||||
if((address & 0x180f) == 0x080d)
|
|
||||||
bank((address & 0xf0) >> 4);
|
|
||||||
else if((address & 0x1880) == 0)
|
|
||||||
{
|
|
||||||
if((myCurrentBank & 0xe) == 0xe)
|
|
||||||
bank(((address & 0x40) >> 6) | (myCurrentBank & 0xe));
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -83,103 +83,13 @@ bool CartridgeX07::poke(uInt16 address, uInt8 value)
|
||||||
{
|
{
|
||||||
// Check for RAM or TIA mirroring
|
// Check for RAM or TIA mirroring
|
||||||
uInt16 lowAddress = address & 0x3ff;
|
uInt16 lowAddress = address & 0x3ff;
|
||||||
|
|
||||||
if(lowAddress & 0x80)
|
if(lowAddress & 0x80)
|
||||||
mySystem->m6532().poke(address, value);
|
mySystem->m6532().poke(address, value);
|
||||||
else if(!(lowAddress & 0x200))
|
else if(!(lowAddress & 0x200))
|
||||||
mySystem->tia().poke(address, value);
|
mySystem->tia().poke(address, value);
|
||||||
|
|
||||||
// Switch banks if necessary
|
checkSwitchBank(address);
|
||||||
if((address & 0x180f) == 0x080d)
|
|
||||||
bank((address & 0xf0) >> 4);
|
|
||||||
else if((address & 0x1880) == 0)
|
|
||||||
{
|
|
||||||
if((myCurrentBank & 0xe) == 0xe)
|
|
||||||
bank(((address & 0x40) >> 6) | (myCurrentBank & 0xe));
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
bool CartridgeX07::bank(uInt16 bank)
|
|
||||||
{
|
|
||||||
if(bankLocked()) return false;
|
|
||||||
|
|
||||||
// Remember what bank we're in
|
|
||||||
myCurrentBank = (bank & 0x0f);
|
|
||||||
uInt32 offset = myCurrentBank << 12;
|
|
||||||
|
|
||||||
// Setup the page access methods for the current bank
|
|
||||||
System::PageAccess access(this, System::PageAccessType::READ);
|
|
||||||
|
|
||||||
// Map ROM image into the system
|
|
||||||
for(uInt16 addr = 0x1000; addr < 0x2000; addr += System::PAGE_SIZE)
|
|
||||||
{
|
|
||||||
access.directPeekBase = &myImage[offset + (addr & 0x0FFF)];
|
|
||||||
access.romAccessBase = &myRomAccessBase[offset + (addr & 0x0FFF)];
|
|
||||||
access.romPeekCounter = &myRomAccessCounter[offset + (addr & 0x0FFF)];
|
|
||||||
access.romPokeCounter = &myRomAccessCounter[offset + (addr & 0x0FFF) + myAccessSize];
|
|
||||||
mySystem->setPageAccess(addr, access);
|
|
||||||
}
|
|
||||||
return myBankChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt16 CartridgeX07::getBank(uInt16) const
|
|
||||||
{
|
|
||||||
return myCurrentBank;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt16 CartridgeX07::bankCount() const
|
|
||||||
{
|
|
||||||
return 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
bool CartridgeX07::patch(uInt16 address, uInt8 value)
|
|
||||||
{
|
|
||||||
myImage[(myCurrentBank << 12) + (address & 0x0FFF)] = value;
|
|
||||||
return myBankChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
const uInt8* CartridgeX07::getImage(size_t& size) const
|
|
||||||
{
|
|
||||||
size = myImage.size();
|
|
||||||
return myImage.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
bool CartridgeX07::save(Serializer& out) const
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
out.putShort(myCurrentBank);
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
cerr << "ERROR: CartridgeX07::save" << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
bool CartridgeX07::load(Serializer& in)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
myCurrentBank = in.getShort();
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
cerr << "ERROR: CartridgeX07::load" << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remember what bank we were in
|
|
||||||
bank(myCurrentBank);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
class System;
|
class System;
|
||||||
|
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
#include "Cart.hxx"
|
#include "CartEnhanced.hxx"
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
#include "CartX07Widget.hxx"
|
#include "CartX07Widget.hxx"
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,9 +40,9 @@ class System;
|
||||||
|
|
||||||
Note that the latter will hit on almost any TIA access.
|
Note that the latter will hit on almost any TIA access.
|
||||||
|
|
||||||
@author Eckhard Stolberg
|
@author Eckhard Stolberg, Thomas Jentzsch
|
||||||
*/
|
*/
|
||||||
class CartridgeX07 : public Cartridge
|
class CartridgeX07 : public CartridgeEnhanced
|
||||||
{
|
{
|
||||||
friend class CartridgeX07Widget;
|
friend class CartridgeX07Widget;
|
||||||
|
|
||||||
|
@ -60,11 +60,6 @@ class CartridgeX07 : public Cartridge
|
||||||
virtual ~CartridgeX07() = default;
|
virtual ~CartridgeX07() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
|
||||||
Reset device to its power-on state
|
|
||||||
*/
|
|
||||||
void reset() override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Install cartridge in the specified system. Invoked by the system
|
Install cartridge in the specified system. Invoked by the system
|
||||||
when the cartridge is attached to it.
|
when the cartridge is attached to it.
|
||||||
|
@ -73,58 +68,6 @@ class CartridgeX07 : public Cartridge
|
||||||
*/
|
*/
|
||||||
void install(System& system) override;
|
void install(System& system) override;
|
||||||
|
|
||||||
/**
|
|
||||||
Install pages for the specified bank in the system.
|
|
||||||
|
|
||||||
@param bank The bank that should be installed in the system
|
|
||||||
*/
|
|
||||||
bool bank(uInt16 bank) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Get the current bank.
|
|
||||||
|
|
||||||
@param address The address to use when querying the bank
|
|
||||||
*/
|
|
||||||
uInt16 getBank(uInt16 address = 0) const override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Query the number of banks supported by the cartridge.
|
|
||||||
*/
|
|
||||||
uInt16 bankCount() const override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Patch the cartridge ROM.
|
|
||||||
|
|
||||||
@param address The ROM address to patch
|
|
||||||
@param value The value to place into the address
|
|
||||||
@return Success or failure of the patch operation
|
|
||||||
*/
|
|
||||||
bool patch(uInt16 address, uInt8 value) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Access the internal ROM image for this cartridge.
|
|
||||||
|
|
||||||
@param size Set to the size of the internal ROM image data
|
|
||||||
@return A pointer to the internal ROM image data
|
|
||||||
*/
|
|
||||||
const uInt8* getImage(size_t& size) const override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Save the current state of this cart to the given Serializer.
|
|
||||||
|
|
||||||
@param out The Serializer object to use
|
|
||||||
@return False on any errors, else true
|
|
||||||
*/
|
|
||||||
bool save(Serializer& out) const override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Load the current state of this cart from the given Serializer.
|
|
||||||
|
|
||||||
@param in The Serializer object to use
|
|
||||||
@return False on any errors, else true
|
|
||||||
*/
|
|
||||||
bool load(Serializer& in) override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get a descriptor for the device name (used in error checking).
|
Get a descriptor for the device name (used in error checking).
|
||||||
|
|
||||||
|
@ -162,11 +105,7 @@ class CartridgeX07 : public Cartridge
|
||||||
bool poke(uInt16 address, uInt8 value) override;
|
bool poke(uInt16 address, uInt8 value) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The 64K ROM image of the cartridge
|
bool checkSwitchBank(uInt16 address, uInt8 value = 0) override;
|
||||||
std::array<uInt8, 64_KB> myImage;
|
|
||||||
|
|
||||||
// Indicates which bank is currently active
|
|
||||||
uInt16 myCurrentBank{0};
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
Loading…
Reference in New Issue