mirror of https://github.com/stella-emu/stella.git
Update memory layout for CDFJ, adapt debugger widget.
This commit is contained in:
parent
12d8ed570d
commit
383424983a
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue