mirror of https://github.com/stella-emu/stella.git
Add romSize and ramSize functions
This commit is contained in:
parent
8dcf3be270
commit
71a66ec9ba
|
@ -20,6 +20,7 @@ build/
|
||||||
src/macosx/M6502.ins
|
src/macosx/M6502.ins
|
||||||
*.dSYM
|
*.dSYM
|
||||||
.vscode/c_cpp_properties.json
|
.vscode/c_cpp_properties.json
|
||||||
|
.vscode/settings.json
|
||||||
src/windows/sdl/*
|
src/windows/sdl/*
|
||||||
src/windows/x64/*
|
src/windows/x64/*
|
||||||
src/windows/Win32/*
|
src/windows/Win32/*
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
{
|
|
||||||
"files.associations": {
|
|
||||||
"array": "cpp",
|
|
||||||
"bitset": "cpp",
|
|
||||||
"string_view": "cpp",
|
|
||||||
"initializer_list": "cpp",
|
|
||||||
"regex": "cpp",
|
|
||||||
"utility": "cpp",
|
|
||||||
"memory": "cpp",
|
|
||||||
"random": "cpp",
|
|
||||||
"optional": "cpp",
|
|
||||||
"atomic": "cpp",
|
|
||||||
"*.tcc": "cpp",
|
|
||||||
"cctype": "cpp",
|
|
||||||
"chrono": "cpp",
|
|
||||||
"clocale": "cpp",
|
|
||||||
"cmath": "cpp",
|
|
||||||
"condition_variable": "cpp",
|
|
||||||
"cstdarg": "cpp",
|
|
||||||
"cstddef": "cpp",
|
|
||||||
"cstdint": "cpp",
|
|
||||||
"cstdio": "cpp",
|
|
||||||
"cstdlib": "cpp",
|
|
||||||
"cstring": "cpp",
|
|
||||||
"ctime": "cpp",
|
|
||||||
"cwchar": "cpp",
|
|
||||||
"cwctype": "cpp",
|
|
||||||
"deque": "cpp",
|
|
||||||
"list": "cpp",
|
|
||||||
"unordered_map": "cpp",
|
|
||||||
"vector": "cpp",
|
|
||||||
"exception": "cpp",
|
|
||||||
"algorithm": "cpp",
|
|
||||||
"functional": "cpp",
|
|
||||||
"iterator": "cpp",
|
|
||||||
"map": "cpp",
|
|
||||||
"memory_resource": "cpp",
|
|
||||||
"numeric": "cpp",
|
|
||||||
"ratio": "cpp",
|
|
||||||
"set": "cpp",
|
|
||||||
"string": "cpp",
|
|
||||||
"system_error": "cpp",
|
|
||||||
"tuple": "cpp",
|
|
||||||
"type_traits": "cpp",
|
|
||||||
"fstream": "cpp",
|
|
||||||
"iomanip": "cpp",
|
|
||||||
"iosfwd": "cpp",
|
|
||||||
"iostream": "cpp",
|
|
||||||
"istream": "cpp",
|
|
||||||
"limits": "cpp",
|
|
||||||
"mutex": "cpp",
|
|
||||||
"new": "cpp",
|
|
||||||
"ostream": "cpp",
|
|
||||||
"sstream": "cpp",
|
|
||||||
"stdexcept": "cpp",
|
|
||||||
"streambuf": "cpp",
|
|
||||||
"thread": "cpp",
|
|
||||||
"cinttypes": "cpp",
|
|
||||||
"typeinfo": "cpp"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -23,27 +23,15 @@ CartridgeCDFInfoWidget::CartridgeCDFInfoWidget(
|
||||||
int x, int y, int w, int h, CartridgeCDF& cart)
|
int x, int y, int w, int h, CartridgeCDF& cart)
|
||||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h)
|
: CartDebugWidget(boss, lfont, nfont, x, y, w, h)
|
||||||
{
|
{
|
||||||
uInt32 size;
|
|
||||||
ostringstream info;
|
ostringstream info;
|
||||||
|
|
||||||
if (cart.myCDFSubtype == CartridgeCDF::CDFSubtype::CDFJplus) {
|
info << describeCDFVersion(cart.myCDFSubtype) << " cartridge\n"
|
||||||
size = 512 * 1024;
|
<< (cart.romSize() / 1024) << "K ROM\n"
|
||||||
info << describeCDFVersion(cart.myCDFSubtype) << " cartridge\n"
|
<< (cart.ramSize() / 1024) << "K RAM\n"
|
||||||
<< "512K ROM (seven 4K banks are accessible to 2600)\n"
|
<< "Seven 4K banks are available to 2600\n"
|
||||||
<< "32K RAM\n"
|
<< "Functions accessible @ $FFF0 - $FFF3\n"
|
||||||
<< "Functions accessible @ $FFF0 - $FFF3\n"
|
<< (cart.isCDFJplus() ? "Banks accessible @ $FFF4 to $FFFA\n" : "Banks accessible @ $FFF5 to $FFFB\n")
|
||||||
<< "Banks accessible @ $FFF4 to $FFFB\n"
|
<< "Startup bank = " << cart.startBank() << "\n";
|
||||||
<< "Startup bank = " << cart.startBank() << "\n";
|
|
||||||
|
|
||||||
} else {
|
|
||||||
size = 8 * 4096;
|
|
||||||
info << describeCDFVersion(cart.myCDFSubtype) << " cartridge\n"
|
|
||||||
<< "32K ROM (seven 4K banks are accessible to 2600)\n"
|
|
||||||
<< "8K RAM\n"
|
|
||||||
<< "Functions accessible @ $FFF0 - $FFF3\n"
|
|
||||||
<< "Banks accessible @ $FFF4 to $FFFB\n"
|
|
||||||
<< "Startup bank = " << cart.startBank() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Eventually, we should query this from the debugger/disassembler
|
// Eventually, we should query this from the debugger/disassembler
|
||||||
|
@ -56,7 +44,7 @@ CartridgeCDFInfoWidget::CartridgeCDFInfoWidget(
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
addBaseInformation(size, "AtariAge", info.str());
|
addBaseInformation(cart.romSize(), "AtariAge", info.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -410,7 +410,7 @@ string CartridgeCDFWidget::bankState()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt32 CartridgeCDFWidget::internalRamSize()
|
uInt32 CartridgeCDFWidget::internalRamSize()
|
||||||
{
|
{
|
||||||
return isCDFJplus() ? 32*1024 : 8*1024;
|
return myCart.ramSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -502,5 +502,5 @@ bool CartridgeCDFWidget::isCDFJ() const
|
||||||
|
|
||||||
bool CartridgeCDFWidget::isCDFJplus() const
|
bool CartridgeCDFWidget::isCDFJplus() const
|
||||||
{
|
{
|
||||||
return (myCart.myCDFSubtype == CartridgeCDF::CDFSubtype::CDFJplus);
|
return (myCart.isCDFJplus());
|
||||||
}
|
}
|
|
@ -75,15 +75,12 @@ CartridgeCDF::CartridgeCDF(const ByteBuffer& image, size_t size,
|
||||||
// Detect cart version
|
// Detect cart version
|
||||||
setupVersion();
|
setupVersion();
|
||||||
|
|
||||||
// CDFJ+ has different settings
|
|
||||||
bool cdfjPlus = (myCDFSubtype == CDFSubtype::CDFJplus);
|
|
||||||
|
|
||||||
// The lowest 2K is not accessible to the debugger
|
// The lowest 2K is not accessible to the debugger
|
||||||
createRomAccessArrays(cdfjPlus ? 510_KB : 28_KB);
|
createRomAccessArrays(isCDFJplus() ? 510_KB : 28_KB);
|
||||||
|
|
||||||
// Pointer to the program ROM
|
// Pointer to the program ROM
|
||||||
// which starts after the 2K driver (and 2K C Code for CDF)
|
// which starts after the 2K driver (and 2K C Code for CDF)
|
||||||
myProgramImage = myImage.get() + (cdfjPlus ? 2_KB : 4_KB);
|
myProgramImage = myImage.get() + (isCDFJplus() ? 2_KB : 4_KB);
|
||||||
|
|
||||||
// Pointer to CDF driver in RAM
|
// Pointer to CDF driver in RAM
|
||||||
myDriverImage = myRAM.data();
|
myDriverImage = myRAM.data();
|
||||||
|
@ -93,7 +90,7 @@ CartridgeCDF::CartridgeCDF(const ByteBuffer& image, size_t size,
|
||||||
|
|
||||||
// C addresses
|
// C addresses
|
||||||
uInt32 cBase, cStart, cStack;
|
uInt32 cBase, cStart, cStack;
|
||||||
if (cdfjPlus) {
|
if (isCDFJplus()) {
|
||||||
cBase = getUInt32(myImage.get(), 0x17F8) & 0xFFFFFFFE; // C Base Address
|
cBase = getUInt32(myImage.get(), 0x17F8) & 0xFFFFFFFE; // C Base Address
|
||||||
cStart = cBase; // C Start Address
|
cStart = cBase; // C Start Address
|
||||||
cStack = getUInt32(myImage.get(), 0x17F4); // C Stack
|
cStack = getUInt32(myImage.get(), 0x17F4); // C Stack
|
||||||
|
@ -123,7 +120,7 @@ void CartridgeCDF::reset()
|
||||||
initializeRAM(myRAM.data()+2_KB, myRAM.size()-2_KB);
|
initializeRAM(myRAM.data()+2_KB, myRAM.size()-2_KB);
|
||||||
|
|
||||||
// CDF always starts in bank 6, CDFJ+ in bank 0
|
// CDF always starts in bank 6, CDFJ+ in bank 0
|
||||||
initializeStartBank((myCDFSubtype == CDFSubtype::CDFJplus) ? 0 : 6);
|
initializeStartBank(isCDFJplus() ? 0 : 6);
|
||||||
|
|
||||||
myAudioCycles = myARMCycles = 0;
|
myAudioCycles = myARMCycles = 0;
|
||||||
myFractionalClocks = 0.0;
|
myFractionalClocks = 0.0;
|
||||||
|
@ -218,8 +215,6 @@ inline void CartridgeCDF::callFunction(uInt8 value)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt8 CartridgeCDF::peek(uInt16 address)
|
uInt8 CartridgeCDF::peek(uInt16 address)
|
||||||
{
|
{
|
||||||
bool cdfjPlus = (myCDFSubtype == CDFSubtype::CDFJplus);
|
|
||||||
|
|
||||||
address &= 0x0FFF;
|
address &= 0x0FFF;
|
||||||
uInt8 peekvalue = myProgramImage[myBankOffset + address];
|
uInt8 peekvalue = myProgramImage[myBankOffset + address];
|
||||||
|
|
||||||
|
@ -239,7 +234,7 @@ uInt8 CartridgeCDF::peek(uInt16 address)
|
||||||
++myJMPoperandAddress;
|
++myJMPoperandAddress;
|
||||||
|
|
||||||
pointer = getDatastreamPointer(myFastJumpStream);
|
pointer = getDatastreamPointer(myFastJumpStream);
|
||||||
if (cdfjPlus) {
|
if (isCDFJplus()) {
|
||||||
value = myDisplayImage[ pointer >> 16 ];
|
value = myDisplayImage[ pointer >> 16 ];
|
||||||
pointer += 0x00010000; // always increment by 1
|
pointer += 0x00010000; // always increment by 1
|
||||||
} else {
|
} else {
|
||||||
|
@ -316,35 +311,35 @@ uInt8 CartridgeCDF::peek(uInt16 address)
|
||||||
switch(address)
|
switch(address)
|
||||||
{
|
{
|
||||||
case 0x0FF4:
|
case 0x0FF4:
|
||||||
bank(cdfjPlus ? 0 : 6);
|
bank(isCDFJplus() ? 0 : 6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF5:
|
case 0x0FF5:
|
||||||
bank(cdfjPlus ? 1 : 0);
|
bank(isCDFJplus() ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF6:
|
case 0x0FF6:
|
||||||
bank(cdfjPlus ? 2 : 1);
|
bank(isCDFJplus() ? 2 : 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF7:
|
case 0x0FF7:
|
||||||
bank(cdfjPlus ? 3 : 2);
|
bank(isCDFJplus() ? 3 : 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF8:
|
case 0x0FF8:
|
||||||
bank(cdfjPlus ? 4 : 3);
|
bank(isCDFJplus() ? 4 : 3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF9:
|
case 0x0FF9:
|
||||||
bank(cdfjPlus ? 5 : 4);
|
bank(isCDFJplus() ? 5 : 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FFA:
|
case 0x0FFA:
|
||||||
bank(cdfjPlus ? 6 : 5);
|
bank(isCDFJplus() ? 6 : 5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FFB:
|
case 0x0FFB:
|
||||||
bank(cdfjPlus ? 0 : 6);
|
bank(isCDFJplus() ? 0 : 6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -361,14 +356,13 @@ uInt8 CartridgeCDF::peek(uInt16 address)
|
||||||
bool CartridgeCDF::poke(uInt16 address, uInt8 value)
|
bool CartridgeCDF::poke(uInt16 address, uInt8 value)
|
||||||
{
|
{
|
||||||
uInt32 pointer;
|
uInt32 pointer;
|
||||||
bool cdfjPlus = (myCDFSubtype == CDFSubtype::CDFJplus);
|
|
||||||
|
|
||||||
address &= 0x0FFF;
|
address &= 0x0FFF;
|
||||||
switch(address)
|
switch(address)
|
||||||
{
|
{
|
||||||
case 0x0FF0: // DSWRITE
|
case 0x0FF0: // DSWRITE
|
||||||
pointer = getDatastreamPointer(COMMSTREAM);
|
pointer = getDatastreamPointer(COMMSTREAM);
|
||||||
if (cdfjPlus) {
|
if (isCDFJplus()) {
|
||||||
myDisplayImage[ pointer >> 16 ] = value;
|
myDisplayImage[ pointer >> 16 ] = value;
|
||||||
pointer += 0x00010000; // always increment by 1 when writing
|
pointer += 0x00010000; // always increment by 1 when writing
|
||||||
} else {
|
} else {
|
||||||
|
@ -381,7 +375,7 @@ bool CartridgeCDF::poke(uInt16 address, uInt8 value)
|
||||||
case 0x0FF1: // DSPTR
|
case 0x0FF1: // DSPTR
|
||||||
pointer = getDatastreamPointer(COMMSTREAM);
|
pointer = getDatastreamPointer(COMMSTREAM);
|
||||||
pointer <<= 8;
|
pointer <<= 8;
|
||||||
if (cdfjPlus) {
|
if (isCDFJplus()) {
|
||||||
pointer &= 0xff000000;
|
pointer &= 0xff000000;
|
||||||
pointer |= (value << 16);
|
pointer |= (value << 16);
|
||||||
} else {
|
} else {
|
||||||
|
@ -400,35 +394,35 @@ bool CartridgeCDF::poke(uInt16 address, uInt8 value)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x00FF4:
|
case 0x00FF4:
|
||||||
bank(cdfjPlus ? 0 : 6);
|
bank(isCDFJplus() ? 0 : 6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF5:
|
case 0x0FF5:
|
||||||
bank(cdfjPlus ? 1 : 0);
|
bank(isCDFJplus() ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF6:
|
case 0x0FF6:
|
||||||
bank(cdfjPlus ? 2 : 1);
|
bank(isCDFJplus() ? 2 : 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF7:
|
case 0x0FF7:
|
||||||
bank(cdfjPlus ? 3 : 2);
|
bank(isCDFJplus() ? 3 : 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF8:
|
case 0x0FF8:
|
||||||
bank(cdfjPlus ? 4 : 3);
|
bank(isCDFJplus() ? 4 : 3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FF9:
|
case 0x0FF9:
|
||||||
bank(cdfjPlus ? 5 : 4);
|
bank(isCDFJplus() ? 5 : 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FFA:
|
case 0x0FFA:
|
||||||
bank(cdfjPlus ? 6 : 5);
|
bank(isCDFJplus() ? 6 : 5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0FFB:
|
case 0x0FFB:
|
||||||
bank(cdfjPlus ? 0 : 6);
|
bank(isCDFJplus() ? 0 : 6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -654,7 +648,7 @@ uInt32 CartridgeCDF::getWaveform(uInt8 index) const
|
||||||
|
|
||||||
result -= (0x40000000 + 2_KB);
|
result -= (0x40000000 + 2_KB);
|
||||||
|
|
||||||
if (myCDFSubtype != CDFSubtype::CDFJplus) {
|
if (!isCDFJplus()) {
|
||||||
if (result >= 4096) {
|
if (result >= 4096) {
|
||||||
result &= 4095;
|
result &= 4095;
|
||||||
}
|
}
|
||||||
|
@ -698,8 +692,7 @@ uInt8 CartridgeCDF::readFromDatastream(uInt8 index)
|
||||||
uInt16 increment = getDatastreamIncrement(index);
|
uInt16 increment = getDatastreamIncrement(index);
|
||||||
|
|
||||||
uInt8 value;
|
uInt8 value;
|
||||||
bool cdfjPlus = (myCDFSubtype == CDFSubtype::CDFJplus);
|
if (isCDFJplus()) {
|
||||||
if (cdfjPlus) {
|
|
||||||
value = myDisplayImage[ pointer >> 16 ];
|
value = myDisplayImage[ pointer >> 16 ];
|
||||||
pointer += (increment << 8);
|
pointer += (increment << 8);
|
||||||
} else {
|
} else {
|
||||||
|
@ -794,6 +787,22 @@ string CartridgeCDF::name() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool CartridgeCDF::isCDFJplus() const
|
||||||
|
{
|
||||||
|
return (myCDFSubtype == CDFSubtype::CDFJplus);
|
||||||
|
}
|
||||||
|
|
||||||
|
uInt32 CartridgeCDF::ramSize() const
|
||||||
|
{
|
||||||
|
return isCDFJplus() ? 32_KB : 8_KB;
|
||||||
|
}
|
||||||
|
|
||||||
|
uInt32 CartridgeCDF::romSize() const
|
||||||
|
{
|
||||||
|
return isCDFJplus() ? 512_KB : 32_KB;
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
CartDebugWidget* CartridgeCDF::debugWidget(GuiObject* boss, const GUI::Font& lfont,
|
CartDebugWidget* CartridgeCDF::debugWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
|
|
@ -154,6 +154,21 @@ class CartridgeCDF : public Cartridge
|
||||||
*/
|
*/
|
||||||
uInt32 thumbCallback(uInt8 function, uInt32 value1, uInt32 value2) override;
|
uInt32 thumbCallback(uInt8 function, uInt32 value1, uInt32 value2) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set if we are using CDFJ+ bankswitching
|
||||||
|
*/
|
||||||
|
bool isCDFJplus() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Size of SRAM (RAM) area in cart
|
||||||
|
*/
|
||||||
|
uInt32 ramSize() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Size of Flash memory (ROM) area in cart
|
||||||
|
*/
|
||||||
|
uInt32 romSize() const;
|
||||||
|
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
/**
|
/**
|
||||||
Get debugger widget responsible for accessing the inner workings
|
Get debugger widget responsible for accessing the inner workings
|
||||||
|
|
Loading…
Reference in New Issue