Update memory layout for CDFJ, adapt debugger widget.

This commit is contained in:
Christian Speckner 2019-03-18 22:30:27 +01:00
parent 12d8ed570d
commit 383424983a
4 changed files with 129 additions and 58 deletions

View File

@ -15,11 +15,33 @@
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================ //============================================================================
#include "CartCDF.hxx"
#include "DataGridWidget.hxx" #include "DataGridWidget.hxx"
#include "PopUpWidget.hxx" #include "PopUpWidget.hxx"
#include "CartCDFWidget.hxx" #include "CartCDFWidget.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string CartridgeCDFWidget::describeCDFVersion(CartridgeCDF::CDFSubtype subtype) {
switch (subtype) {
case CartridgeCDF::CDFSubtype::CDF0:
return "CDF (v0)";
case CartridgeCDF::CDFSubtype::CDF1:
return "CDF (v1)";
case CartridgeCDF::CDFSubtype::CDFJ:
return "CDFJ";
default:
throw runtime_error("unreachable");
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CartridgeCDFWidget::isCDFJ() const
{
return myCart.myCDFSubtype == CartridgeCDF::CDFSubtype::CDFJ;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeCDFWidget::CartridgeCDFWidget( CartridgeCDFWidget::CartridgeCDFWidget(
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
@ -30,8 +52,7 @@ CartridgeCDFWidget::CartridgeCDFWidget(
uInt16 size = 8 * 4096; uInt16 size = 8 * 4096;
ostringstream info; ostringstream info;
info << (cart.myCDFSubtype == CartridgeCDF::CDFSubtype::CDFJ ? "CDFJ" : "CDF") info << describeCDFVersion(cart.myCDFSubtype) << " cartridge\n"
<< " cartridge (version " << cart.myCDFVersion << ")\n"
<< "32K ROM, seven 4K banks are accessible to 2600\n" << "32K ROM, seven 4K banks are accessible to 2600\n"
<< "8K CDF RAM\n" << "8K CDF RAM\n"
<< "CDF registers accessible @ $FFF0 - $FFF3\n" << "CDF registers accessible @ $FFF0 - $FFF3\n"
@ -82,10 +103,16 @@ CartridgeCDFWidget::CartridgeCDFWidget(
myDatastreamPointers->setTarget(this); myDatastreamPointers->setTarget(this);
myDatastreamPointers->setEditable(false); myDatastreamPointers->setEditable(false);
myDatastreamPointers2 = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4, ypos+myLineHeight-2 + 8*myLineHeight, 1, 2, 6, 32, Common::Base::F_16_3_2); myCommandStreamPointer = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4, ypos+myLineHeight-2 + 8*myLineHeight, 1, 1, 6, 32, Common::Base::F_16_3_2);
myDatastreamPointers2->setTarget(this); myCommandStreamPointer->setTarget(this);
myDatastreamPointers2->setEditable(false); myCommandStreamPointer->setEditable(false);
if (isCDFJ())
myJumpStreamPointers = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 2 / 4, ypos+myLineHeight-2 + 9*myLineHeight, 2, 1, 6, 32, Common::Base::F_16_3_2);
else
myJumpStreamPointers = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4, ypos+myLineHeight-2 + 9*myLineHeight, 1, 1, 6, 32, Common::Base::F_16_3_2);
myJumpStreamPointers->setTarget(this);
myJumpStreamPointers->setEditable(false);
uInt32 row; uInt32 row;
for(row = 0; row < 8; ++row) for(row = 0; row < 8; ++row)
@ -96,15 +123,17 @@ CartridgeCDFWidget::CartridgeCDFWidget(
myFontWidth*2, myFontHeight, "", TextAlign::Left); myFontWidth*2, myFontHeight, "", TextAlign::Left);
myDatastreamLabels[row]->setLabel(Common::Base::toString(row * 4, Common::Base::F_16_2)); myDatastreamLabels[row]->setLabel(Common::Base::toString(row * 4, Common::Base::F_16_2));
} }
lwidth = _font.getStringWidth("Write Data (stream 20)"); lwidth = _font.getStringWidth("Jump Data (21+22)");
myDatastreamLabels[8] = myDatastreamLabels[8] =
new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "), new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "),
ypos+myLineHeight-2 + 8*myLineHeight + 2, ypos+myLineHeight-2 + 8*myLineHeight + 2,
lwidth, myFontHeight, "Write Data (stream 20)", TextAlign::Left); lwidth, myFontHeight, "Write Data (20)", TextAlign::Left);
myDatastreamLabels[9] = myDatastreamLabels[9] =
new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "), new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "),
ypos+myLineHeight-2 + 9*myLineHeight + 2, ypos+myLineHeight-2 + 9*myLineHeight + 2,
lwidth, myFontHeight, "Jump Data (stream 21)", TextAlign::Left); lwidth, myFontHeight,
isCDFJ() ? "Jmp Data (21+22)" : "Jump Data (21)",
TextAlign::Left);
// Datastream Increments // Datastream Increments
xpos = DS_X + myDatastreamPointers->getWidth() + 20; xpos = DS_X + myDatastreamPointers->getWidth() + 20;
@ -115,9 +144,13 @@ CartridgeCDFWidget::CartridgeCDFWidget(
myDatastreamIncrements->setTarget(this); myDatastreamIncrements->setTarget(this);
myDatastreamIncrements->setEditable(false); myDatastreamIncrements->setEditable(false);
myDatastreamIncrements2 = new DataGridWidget(boss, _nfont, xpos, ypos+myLineHeight-2 + 8*myLineHeight, 1, 2, 5, 32, Common::Base::F_16_2_2); myCommandStreamIncrement = new DataGridWidget(boss, _nfont, xpos, ypos+myLineHeight-2 + 8*myLineHeight, 1, 1, 5, 32, Common::Base::F_16_2_2);
myDatastreamIncrements2->setTarget(this); myCommandStreamIncrement->setTarget(this);
myDatastreamIncrements2->setEditable(false); myCommandStreamIncrement->setEditable(false);
myJumpStreamIncrements = new DataGridWidget(boss, _nfont, xpos, ypos+myLineHeight-2 + 9*myLineHeight, isCDFJ() ? 2 : 1, 1, 5, 32, Common::Base::F_16_2_2);
myJumpStreamIncrements->setTarget(this);
myJumpStreamIncrements->setEditable(false);
// Music counters // Music counters
xpos = 10; ypos += myLineHeight*12 + 4; xpos = 10; ypos += myLineHeight*12 + 4;
@ -194,7 +227,7 @@ void CartridgeCDFWidget::saveOldState()
myOldState.internalram.clear(); myOldState.internalram.clear();
myOldState.samplepointer.clear(); myOldState.samplepointer.clear();
for(uInt32 i = 0; i < 34; ++i) for(uInt32 i = 0; i < (isCDFJ() ? 35 : 34); ++i)
{ {
// Pointers are stored as: // Pointers are stored as:
// PPPFF--- // PPPFF---
@ -262,7 +295,21 @@ void CartridgeCDFWidget::loadConfig()
alist.push_back(0); vlist.push_back(pointervalue); alist.push_back(0); vlist.push_back(pointervalue);
changed.push_back(pointervalue != myOldState.datastreampointers[i]); changed.push_back(pointervalue != myOldState.datastreampointers[i]);
} }
myDatastreamPointers2->setList(alist, vlist, changed);
alist.clear(); vlist.clear(); changed.clear();
alist.push_back(0);
vlist.push_back(myCart.getDatastreamPointer(0x20) >> 12);
changed.push_back(static_cast<Int32>(myCart.getDatastreamPointer(0x20)) != myOldState.datastreampointers[0x20]);
myCommandStreamPointer->setList(alist, vlist, changed);
alist.clear(); vlist.clear(); changed.clear();
for(int i = 0; i < (isCDFJ() ? 2 : 1); ++i)
{
Int32 pointervalue = myCart.getDatastreamPointer(0x21 + i) >> 12;
alist.push_back(0); vlist.push_back(pointervalue);
changed.push_back(pointervalue != myOldState.datastreampointers[0x21 + i]);
}
myJumpStreamPointers->setList(alist, vlist, changed);
alist.clear(); vlist.clear(); changed.clear(); alist.clear(); vlist.clear(); changed.clear();
for(int i = 0; i < 32; ++i) for(int i = 0; i < 32; ++i)
@ -274,13 +321,19 @@ void CartridgeCDFWidget::loadConfig()
myDatastreamIncrements->setList(alist, vlist, changed); myDatastreamIncrements->setList(alist, vlist, changed);
alist.clear(); vlist.clear(); changed.clear(); alist.clear(); vlist.clear(); changed.clear();
for(int i = 32; i < 34; ++i) alist.push_back(0);
vlist.push_back(myCart.getDatastreamIncrement(0x20));
changed.push_back(static_cast<Int32>(myCart.getDatastreamIncrement(0x20)) != myOldState.datastreamincrements[0x20]);
myCommandStreamIncrement->setList(alist, vlist, changed);
alist.clear(); vlist.clear(); changed.clear();
for(int i = 0; i < (isCDFJ() ? 2 : 1); ++i)
{ {
Int32 incrementvalue = myCart.getDatastreamIncrement(i); Int32 pointervalue = myCart.getDatastreamIncrement(0x21 + i) >> 12;
alist.push_back(0); vlist.push_back(incrementvalue); alist.push_back(0); vlist.push_back(pointervalue);
changed.push_back(incrementvalue != myOldState.datastreamincrements[i]); changed.push_back(pointervalue != myOldState.datastreamincrements[0x21 + i]);
} }
myDatastreamIncrements2->setList(alist, vlist, changed); myJumpStreamIncrements->setList(alist, vlist, changed);
alist.clear(); vlist.clear(); changed.clear(); alist.clear(); vlist.clear(); changed.clear();
for(int i = 0; i < 3; ++i) for(int i = 0; i < 3; ++i)

View File

@ -18,12 +18,12 @@
#ifndef CARTRIDGECDF_WIDGET_HXX #ifndef CARTRIDGECDF_WIDGET_HXX
#define CARTRIDGECDF_WIDGET_HXX #define CARTRIDGECDF_WIDGET_HXX
class CartridgeCDF;
class PopUpWidget; class PopUpWidget;
class CheckboxWidget; class CheckboxWidget;
class DataGridWidget; class DataGridWidget;
class StaticTextWidget; class StaticTextWidget;
#include "CartCDF.hxx"
#include "CartDebugWidget.hxx" #include "CartDebugWidget.hxx"
class CartridgeCDFWidget : public CartDebugWidget class CartridgeCDFWidget : public CartDebugWidget
@ -56,8 +56,10 @@ class CartridgeCDFWidget : public CartDebugWidget
DataGridWidget* myDatastreamPointers; DataGridWidget* myDatastreamPointers;
DataGridWidget* myDatastreamIncrements; DataGridWidget* myDatastreamIncrements;
DataGridWidget* myDatastreamPointers2; DataGridWidget* myCommandStreamPointer;
DataGridWidget* myDatastreamIncrements2; DataGridWidget* myCommandStreamIncrement;
DataGridWidget* myJumpStreamPointers;
DataGridWidget* myJumpStreamIncrements;
DataGridWidget* myMusicCounters; DataGridWidget* myMusicCounters;
DataGridWidget* myMusicFrequencies; DataGridWidget* myMusicFrequencies;
DataGridWidget* myMusicWaveforms; DataGridWidget* myMusicWaveforms;
@ -72,6 +74,10 @@ class CartridgeCDFWidget : public CartDebugWidget
enum { kBankChanged = 'bkCH' }; enum { kBankChanged = 'bkCH' };
private: private:
bool isCDFJ() const;
static string describeCDFVersion(CartridgeCDF::CDFSubtype subtype);
void saveOldState() override; void saveOldState() override;
void loadConfig() override; void loadConfig() override;

View File

@ -19,6 +19,7 @@
#ifdef DEBUGGER_SUPPORT #ifdef DEBUGGER_SUPPORT
#include "Debugger.hxx" #include "Debugger.hxx"
#include "CartCDFWidget.hxx"
#endif #endif
#include "System.hxx" #include "System.hxx"
@ -27,14 +28,6 @@
#include "TIA.hxx" #include "TIA.hxx"
#include "exception/FatalEmulationError.hxx" #include "exception/FatalEmulationError.hxx"
namespace {
// Location of data within the RAM copy of the CDF Driver.
// Version 0 1
const uInt16 DSxPTR[] = {0x06E0, 0x00A0};
const uInt16 DSxINC[] = {0x0768, 0x0128};
const uInt16 WAVEFORM[] = {0x07F0, 0x01B0};
}
#define DSRAM 0x0800 #define DSRAM 0x0800
#define COMMSTREAM 0x20 #define COMMSTREAM 0x20
@ -73,8 +66,8 @@ CartridgeCDF::CartridgeCDF(const BytePtr& image, uInt32 size,
bool devSettings = settings.getBool("dev.settings"); bool devSettings = settings.getBool("dev.settings");
myThumbEmulator = make_unique<Thumbulator>( myThumbEmulator = make_unique<Thumbulator>(
reinterpret_cast<uInt16*>(myImage), reinterpret_cast<uInt16*>(myCDFRAM), 32768, reinterpret_cast<uInt16*>(myImage), reinterpret_cast<uInt16*>(myCDFRAM), 32768,
devSettings ? settings.getBool("dev.thumb.trapfatal") : false, myCDFVersion ? devSettings ? settings.getBool("dev.thumb.trapfatal") : false, myCDFSubtype == CDFSubtype::CDF0 ?
Thumbulator::ConfigureFor::CDF1 : Thumbulator::ConfigureFor::CDF, this); Thumbulator::ConfigureFor::CDF : Thumbulator::ConfigureFor::CDF1, this);
setInitialState(); setInitialState();
} }
@ -666,19 +659,45 @@ void CartridgeCDF::setVersion()
} }
} }
if (subversion == 0x4a) { switch (subversion) {
myCDFVersion = 1; case 0x4a:
myCDFSubtype = CDFSubtype::CDFJ; myCDFSubtype = CDFSubtype::CDFJ;
myAmplitudeStream = 0x23; myAmplitudeStream = 0x23;
myFastjumpStreamIndexMask = 0xfe; myFastjumpStreamIndexMask = 0xfe;
} else { myDatastreamBase = 0x0098;
myCDFVersion = subversion; myDatastreamIncrementBase = 0x0124;
myCDFSubtype = CDFSubtype::CDF; myWaveformBase = 0x01b0;
myAmplitudeStream = 0x22;
myFastjumpStreamIndexMask = 0xff;
}
myDatastreamBase = DSxPTR[myCDFVersion]; break;
myDatastreamIncrementBase = DSxINC[myCDFVersion];
myWaveformBase = WAVEFORM[myCDFVersion]; case 0:
myCDFSubtype = CDFSubtype::CDF0;
myAmplitudeStream = 0x22;
myFastjumpStreamIndexMask = 0xf4;
myDatastreamBase = 0x06e0;
myDatastreamIncrementBase = 0x0768;
myWaveformBase = 0x07f0;
break;
default:
myCDFSubtype = CDFSubtype::CDF1;
myAmplitudeStream = 0x22;
myFastjumpStreamIndexMask = 0xf4;
myDatastreamBase = 0x00a0;
myDatastreamIncrementBase = 0x0128;
myWaveformBase = 0x01b0;
}
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#ifdef DEBUGGER_SUPPORT
CartDebugWidget* CartridgeCDF::debugWidget(GuiObject* boss, const GUI::Font& lfont,
const GUI::Font& nfont, int x, int y, int w, int h)
{
return new CartridgeCDFWidget(boss, lfont, nfont, x, y, w, h, *this);
}
#endif

View File

@ -20,9 +20,7 @@
class System; class System;
class Thumbulator; class Thumbulator;
#ifdef DEBUGGER_SUPPORT class CartridgeCDFWidget;
#include "CartCDFWidget.hxx"
#endif
#include "bspf.hxx" #include "bspf.hxx"
#include "Cart.hxx" #include "Cart.hxx"
@ -42,7 +40,7 @@ class Thumbulator;
*/ */
class CartridgeCDF : public Cartridge class CartridgeCDF : public Cartridge
{ {
friend class CartridgeCDFWidget; friend CartridgeCDFWidget;
friend class CartridgeRamCDFWidget; friend class CartridgeRamCDFWidget;
public: public:
@ -149,10 +147,7 @@ class CartridgeCDF : public Cartridge
of the cart. of the cart.
*/ */
CartDebugWidget* debugWidget(GuiObject* boss, const GUI::Font& lfont, CartDebugWidget* debugWidget(GuiObject* boss, const GUI::Font& lfont,
const GUI::Font& nfont, int x, int y, int w, int h) override const GUI::Font& nfont, int x, int y, int w, int h) override;
{
return new CartridgeCDFWidget(boss, lfont, nfont, x, y, w, h, *this);
}
#endif #endif
public: public:
@ -205,7 +200,8 @@ class CartridgeCDF : public Cartridge
private: private:
enum class CDFSubtype { enum class CDFSubtype {
CDF, CDF0,
CDF1,
CDFJ CDFJ
}; };
@ -302,9 +298,6 @@ class CartridgeCDF : public Cartridge
// The currently selected fastjump stream // The currently selected fastjump stream
uInt8 myFastJumpStream; uInt8 myFastJumpStream;
// CDF version
uInt8 myCDFVersion;
// CDF subtype // CDF subtype
CDFSubtype myCDFSubtype; CDFSubtype myCDFSubtype;