Merge branch 'feature/lodefmode-moviecart'

This commit is contained in:
Stephen Anthony 2021-08-28 17:17:32 -02:30
commit c2951b3b4d
28 changed files with 1850 additions and 27 deletions

View File

@ -14,6 +14,9 @@
6.5.3 to 6.6 (??? ??, 202?)
* Added preliminary support for 'MVC' bankswitching scheme by
Rob Bairos.
* Added web links for many games
* Debugger: added optional logging of breaks and traps

View File

@ -180,7 +180,7 @@ bool FilesystemNodeZIP::getChildren(AbstractFSList& myList, ListMode mode) const
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
size_t FilesystemNodeZIP::read(ByteBuffer& image) const
size_t FilesystemNodeZIP::read(ByteBuffer& image, size_t) const
{
switch(_error)
{
@ -205,7 +205,7 @@ size_t FilesystemNodeZIP::read(stringstream& image) const
// For now, we just read into a buffer and store in the stream
// TODO: maybe there's a more efficient way to do this?
ByteBuffer buffer;
size_t size = read(buffer);
size_t size = read(buffer, 0);
if(size > 0)
image.write(reinterpret_cast<char*>(buffer.get()), size);

View File

@ -62,8 +62,8 @@ class FilesystemNodeZIP : public AbstractFSNode
bool getChildren(AbstractFSList& list, ListMode mode) const override;
AbstractFSNodePtr getParent() const override;
size_t read(ByteBuffer& image) const override;
size_t read(stringstream& image) const override;
size_t read(ByteBuffer& buffer, size_t size) const override;
size_t read(stringstream& buffer) const override;
size_t write(const ByteBuffer& buffer, size_t size) const override;
size_t write(const stringstream& buffer) const override;

View File

@ -140,6 +140,7 @@ Bankswitch::BSList = {{
{ "FC" , "FC (32K Amiga)" },
{ "FE" , "FE (8K Decathlon)" },
{ "MDM" , "MDM (Menu Driven Megacart)" },
{ "MVC" , "MVC (Movie Cart)" },
{ "SB" , "SB (128-256K SUPERbank)" },
{ "TVBOY" , "TV Boy (512K)" },
{ "UA" , "UA (8K UA Ltd.)" },
@ -226,6 +227,7 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
{ "FC" , Bankswitch::Type::_FC },
{ "FE" , Bankswitch::Type::_FE },
{ "MDM" , Bankswitch::Type::_MDM },
{ "MVC" , Bankswitch::Type::_MVC },
{ "SB" , Bankswitch::Type::_SB },
{ "TVB" , Bankswitch::Type::_TVBOY },
{ "TVBOY" , Bankswitch::Type::_TVBOY },
@ -284,6 +286,7 @@ Bankswitch::NameToTypeMap Bankswitch::ourNameToTypes = {
{ "FC" , Bankswitch::Type::_FC },
{ "FE" , Bankswitch::Type::_FE },
{ "MDM" , Bankswitch::Type::_MDM },
{ "MVC" , Bankswitch::Type::_MVC },
{ "SB" , Bankswitch::Type::_SB },
{ "TVBOY" , Bankswitch::Type::_TVBOY },
{ "UA" , Bankswitch::Type::_UA },

View File

@ -44,8 +44,8 @@ class Bankswitch
_CDF, _CM, _CTY, _CV, _DF, _DFSC, _DPC,
_DPCP, _E0, _E7, _E78K, _EF, _EFSC, _F0,
_F4, _F4SC, _F6, _F6SC, _F8, _F8SC, _FA,
_FA2, _FC, _FE, _MDM, _SB, _TVBOY, _UA,
_UASW, _WD, _WDSW, _X07,
_FA2, _FC, _FE, _MDM, _MVC, _SB, _TVBOY,
_UA, _UASW, _WD, _WDSW, _X07,
#ifdef CUSTOM_ARM
_CUSTOM,
#endif

View File

@ -55,6 +55,7 @@
#include "CartFC.hxx"
#include "CartFE.hxx"
#include "CartMDM.hxx"
#include "CartMVC.hxx"
#include "CartSB.hxx"
#include "CartTVBoy.hxx"
#include "CartUA.hxx"
@ -197,6 +198,10 @@ unique_ptr<Cartridge> CartCreator::create(const FilesystemNode& file,
Bankswitch::typeToName(type) + "'");
break;
case Bankswitch::Type::_MVC:
cartridge = make_unique<CartridgeMVC>(file.getPath(), size, md5, settings);
break;
default:
cartridge = createFromImage(image, size, detectedType, md5, settings);
break;

View File

@ -19,6 +19,7 @@
#include "Logger.hxx"
#include "CartDetector.hxx"
#include "CartMVC.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t size)
@ -242,6 +243,8 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
type = Bankswitch::Type::_3EP;
else if(isProbablyMDM(image, size))
type = Bankswitch::Type::_MDM;
else if(isProbablyMVC(image, size))
type = Bankswitch::Type::_MVC;
// If we get here and autodetection failed, then we force '4K'
if(type == Bankswitch::Type::_AUTO)
@ -691,6 +694,38 @@ bool CartDetector::isProbablyMDM(const ByteBuffer& image, size_t size)
return searchForBytes(image, std::min<size_t>(size, 8_KB), mdmc, 4);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CartDetector::isProbablyMVC(const ByteBuffer& image, size_t size)
{
// MVC version 0
uInt8 sig[] = { 'M', 'V', 'C', 0 };
int sigSize = sizeof(sig);
return searchForBytes(image, std::min<size_t>(size, sigSize+1), sig, sigSize);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
size_t CartDetector::isProbablyMVC(const FilesystemNode& rom)
{
constexpr size_t frameSize = 2 * CartridgeMVC::MVC_FIELD_PAD_SIZE;
if(Bankswitch::typeFromExtension(rom) == Bankswitch::Type::_MVC)
return frameSize;
Serializer s(rom.getPath(), Serializer::Mode::ReadOnly);
if(s)
{
if(s.size() < frameSize)
return 0;
uInt8 image[frameSize];
s.getByteArray(image, frameSize);
uInt8 sig[] = { 'M', 'V', 'C', 0 }; // MVC version 0
return searchForBytes(image, frameSize, sig, 4) ? frameSize : 0;
}
return 0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CartDetector::isProbablySB(const ByteBuffer& image, size_t size)
{

View File

@ -19,6 +19,7 @@
#define CARTRIDGE_DETECTOR_HXX
#include "Bankswitch.hxx"
#include "FSNode.hxx"
#include "bspf.hxx"
/**
@ -40,6 +41,12 @@ class CartDetector
*/
static Bankswitch::Type autodetectType(const ByteBuffer& image, size_t size);
/**
MVC cartridges are of arbitary large length
Returns size of frame if stream is probably an MVC movie cartridge
*/
static size_t isProbablyMVC(const FilesystemNode& rom);
private:
/**
Search the image for the specified byte signature
@ -189,6 +196,11 @@ class CartDetector
*/
static bool isProbablyMDM(const ByteBuffer& image, size_t size);
/**
Returns true if the image is probably an MVC movie cartridge
*/
static bool isProbablyMVC(const ByteBuffer& image, size_t size);
/**
Returns true if the image is probably a SB bankswitching cartridge
*/

1579
src/emucore/CartMVC.cxx Executable file

File diff suppressed because it is too large Load Diff

144
src/emucore/CartMVC.hxx Normal file
View File

@ -0,0 +1,144 @@
//============================================================================
//
// 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-2021 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.
//============================================================================
#ifndef CARTRIDGEMVC_HXX
#define CARTRIDGEMVC_HXX
class System;
class MovieCart;
#include "bspf.hxx"
#include "Cart.hxx"
/**
Implementation of MovieCart.
1K of memory is presented on the bus, but is repeated to fill the 4K image space.
Contents are dynamically altered with streaming image and audio content as specific
128-byte regions are entered.
Original implementation: github.com/lodefmode/moviecart
@author Rob Bairos
*/
class CartridgeMVC : public Cartridge
{
public:
static constexpr uInt32
MVC_FIELD_SIZE = 2560, // round field to nearest 512 byte boundary
MVC_FIELD_PAD_SIZE = 4096; // round to nearest 4K
public:
/**
Create a new cartridge using the specified image
@param path Path to the ROM image file
@param size The size of the ROM image (<= 2048 bytes)
@param md5 The md5sum of the ROM image
@param settings A reference to the various settings (read-only)
@param bsSize The size specified by the bankswitching scheme
*/
CartridgeMVC(const string& path, size_t size, const string& md5,
const Settings& settings, size_t bsSize = 8_KB);
~CartridgeMVC() override;
/**
Reset device to its power-on state
*/
void reset() override;
/**
Install cartridge in the specified system. Invoked by the system
when the cartridge is attached to it.
@param system The system the device should install itself in
*/
void install(System& system) override;
/**
Access the internal ROM image for this cartridge.
@param size Set to the size of the internal ROM image data
@return A reference to the internal ROM image data
*/
const ByteBuffer& getImage(size_t& size) 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;
/**
Get the byte at the specified address.
@return The byte at the specified address
*/
uInt8 peek(uInt16 address) override;
/**
Change the byte at the specified address to the given value
@param address The address where the value should be stored
@param value The value to be stored at the address
@return True if the poke changed the device address space, else false
*/
bool poke(uInt16 address, uInt8 value) override;
/**
Get a descriptor for the device name (used in error checking).
@return The name of the object
*/
string name() const override { return "CartridgeMVC"; }
/**
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;
private:
// Currently not used:
// Pointer to a dynamically allocated ROM image of the cartridge
ByteBuffer myImage{nullptr};
size_t mySize{0};
unique_ptr<MovieCart> myMovie;
string myPath;
private:
// Following constructors and assignment operators not supported
CartridgeMVC() = delete;
CartridgeMVC(const CartridgeMVC&) = delete;
CartridgeMVC(CartridgeMVC&&) = delete;
CartridgeMVC& operator=(const CartridgeMVC&) = delete;
CartridgeMVC& operator=(CartridgeMVC&&) = delete;
};
#endif

View File

@ -17,6 +17,7 @@
#include "FSNodeFactory.hxx"
#include "FSNode.hxx"
#include "CartDetector.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FilesystemNode::FilesystemNode(const AbstractFSNodePtr& realNode)
@ -332,7 +333,7 @@ bool FilesystemNode::rename(const string& newfile)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
size_t FilesystemNode::read(ByteBuffer& buffer) const
size_t FilesystemNode::read(ByteBuffer& buffer, size_t size) const
{
size_t sizeRead = 0;
@ -341,7 +342,7 @@ size_t FilesystemNode::read(ByteBuffer& buffer) const
throw runtime_error("File not found/readable");
// First let the private subclass attempt to open the file
if (_realNode && (sizeRead = _realNode->read(buffer)) > 0)
if (_realNode && (sizeRead = _realNode->read(buffer, size)) > 0)
return sizeRead;
// Otherwise, the default behaviour is to read from a normal C++ ifstream
@ -354,6 +355,8 @@ size_t FilesystemNode::read(ByteBuffer& buffer) const
if (sizeRead == 0)
throw runtime_error("Zero-byte file");
else if (size != 0)
sizeRead = size;
buffer = make_unique<uInt8[]>(sizeRead);
in.read(reinterpret_cast<char*>(buffer.get()), sizeRead);

View File

@ -244,12 +244,13 @@ class FilesystemNode
* Read data (binary format) into the given buffer.
*
* @param buffer The buffer to contain the data (allocated in this method).
* @param size The amount of data to read (0 means read all data).
*
* @return The number of bytes read (0 in the case of failure)
* This method can throw exceptions, and should be used inside
* a try-catch block.
*/
size_t read(ByteBuffer& buffer) const;
size_t read(ByteBuffer& buffer, size_t size = 0) const;
/**
* Read data (text format) into the given stream.
@ -438,12 +439,13 @@ class AbstractFSNode
* Read data (binary format) into the given buffer.
*
* @param buffer The buffer to contain the data (allocated in this method).
* @param size The amount of data to read (0 means read all data).
*
* @return The number of bytes read (0 in the case of failure)
* This method can throw exceptions, and should be used inside
* a try-catch block.
*/
virtual size_t read(ByteBuffer& buffer) const { return 0; }
virtual size_t read(ByteBuffer& buffer, size_t size) const { return 0; }
/**
* Read data (text format) into the given stream.

View File

@ -44,6 +44,7 @@
#include "MD5.hxx"
#include "Cart.hxx"
#include "CartCreator.hxx"
#include "CartDetector.hxx"
#include "FrameBuffer.hxx"
#include "TIASurface.hxx"
#include "TIAConstants.hxx"
@ -689,8 +690,16 @@ ByteBuffer OSystem::openROM(const FilesystemNode& rom, string& md5, size_t& size
// but also adds a properties entry if the one for the ROM doesn't
// contain a valid name
// First check if this is a 'streaming' ROM (one where we only read
// a portion of the file)
size_t sizeToRead = CartDetector::isProbablyMVC(rom);
// Next check if rom is a valid size
// TODO: We should check if ROM is < Cart::maxSize(), but only
// if it's not a ZIP file (that size should be higher; still TBD)
ByteBuffer image;
if((size = rom.read(image)) == 0)
if((size = rom.read(image, sizeToRead)) == 0)
return nullptr;
// If we get to this point, we know we have a valid file to open

View File

@ -77,6 +77,14 @@ Serializer::Serializer()
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Serializer::setPosition(size_t pos)
{
myStream->clear();
myStream->seekg(pos);
myStream->seekp(pos);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Serializer::rewind()
{
@ -86,11 +94,15 @@ void Serializer::rewind()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
size_t Serializer::size() const
size_t Serializer::size()
{
myStream->seekp(0, std::ios::end);
std::streampos oldPos = myStream->tellp();
return myStream->tellp();
myStream->seekp(0, std::ios::end);
size_t s = myStream->tellp();
setPosition(oldPos);
return s;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -59,15 +59,20 @@ class Serializer
*/
explicit operator bool() const { return myStream != nullptr; }
/**
Sets the read/write location to the given offset in the stream.
*/
void setPosition(size_t pos);
/**
Resets the read/write location to the beginning of the stream.
*/
void rewind();
/**
Returns the current write pointer location.
Returns the current total size of the stream.
*/
size_t size() const;
size_t size();
/**
Reads a byte value (unsigned 8-bit) from the current input stream.
@ -220,13 +225,6 @@ class Serializer
unique_ptr<iostream> myStream;
static constexpr uInt8 TruePattern = 0xfe, FalsePattern = 0x01;
private:
// Following constructors and assignment operators not supported
Serializer(const Serializer&) = delete;
Serializer(Serializer&&) = delete;
Serializer& operator=(const Serializer&) = delete;
Serializer& operator=(Serializer&&) = delete;
};
#endif

View File

@ -48,6 +48,7 @@ MODULE_OBJS := \
src/emucore/CartFC.o \
src/emucore/CartFE.o \
src/emucore/CartMDM.o \
src/emucore/CartMVC.o \
src/emucore/CartSB.o \
src/emucore/CartTVBoy.o \
src/emucore/CartUA.o \

View File

@ -92,7 +92,7 @@ AbstractFSNodePtr FilesystemNodeLIBRETRO::getParent() const
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
size_t FilesystemNodeLIBRETRO::read(ByteBuffer& image) const
size_t FilesystemNodeLIBRETRO::read(ByteBuffer& image, size_t) const
{
image = make_unique<uInt8[]>(Cartridge::maxSize());

View File

@ -49,7 +49,7 @@ class FilesystemNodeLIBRETRO : public AbstractFSNode
bool getChildren(AbstractFSList& list, ListMode mode) const override;
AbstractFSNodePtr getParent() const override;
size_t read(ByteBuffer& image) const override;
size_t read(ByteBuffer& image, size_t) const override;
protected:
string _name;

View File

@ -86,6 +86,7 @@ SOURCES_CXX := \
$(CORE_DIR)/emucore/CartFC.cxx \
$(CORE_DIR)/emucore/CartFE.cxx \
$(CORE_DIR)/emucore/CartMDM.cxx \
$(CORE_DIR)/emucore/CartMVC.cxx \
$(CORE_DIR)/emucore/CartMNetwork.cxx \
$(CORE_DIR)/emucore/CartSB.cxx \
$(CORE_DIR)/emucore/CartTVBoy.cxx \

View File

@ -455,6 +455,8 @@
DC8C1BB114B25DE7006440EE /* MindLink.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC8C1BAB14B25DE7006440EE /* MindLink.cxx */; };
DC8C1BB214B25DE7006440EE /* MindLink.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC8C1BAC14B25DE7006440EE /* MindLink.hxx */; };
DC8CF9BD17C15A27004B533D /* ConsoleMediumFont.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC8CF9BC17C15A27004B533D /* ConsoleMediumFont.hxx */; };
DC911C7526333B9200666AC0 /* CartMVC.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC911C7326333B9100666AC0 /* CartMVC.cxx */; };
DC911C7626333B9200666AC0 /* CartMVC.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC911C7426333B9100666AC0 /* CartMVC.hxx */; };
DC932D440F278A5200FEFEFC /* DefProps.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D3F0F278A5200FEFEFC /* DefProps.hxx */; };
DC932D450F278A5200FEFEFC /* Serializable.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D400F278A5200FEFEFC /* Serializable.hxx */; };
DC932D460F278A5200FEFEFC /* SerialPort.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D410F278A5200FEFEFC /* SerialPort.hxx */; };
@ -1266,6 +1268,8 @@
DC8C1BAB14B25DE7006440EE /* MindLink.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MindLink.cxx; sourceTree = "<group>"; };
DC8C1BAC14B25DE7006440EE /* MindLink.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MindLink.hxx; sourceTree = "<group>"; };
DC8CF9BC17C15A27004B533D /* ConsoleMediumFont.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ConsoleMediumFont.hxx; sourceTree = "<group>"; };
DC911C7326333B9100666AC0 /* CartMVC.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CartMVC.cxx; sourceTree = "<group>"; };
DC911C7426333B9100666AC0 /* CartMVC.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartMVC.hxx; sourceTree = "<group>"; };
DC932D3F0F278A5200FEFEFC /* DefProps.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = DefProps.hxx; sourceTree = "<group>"; };
DC932D400F278A5200FEFEFC /* Serializable.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Serializable.hxx; sourceTree = "<group>"; };
DC932D410F278A5200FEFEFC /* SerialPort.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = SerialPort.hxx; sourceTree = "<group>"; };
@ -2056,6 +2060,8 @@
DC6A18FB19B3E67A00DEB242 /* CartMDM.hxx */,
DC71EA9B1FDA06D2008827CB /* CartMNetwork.cxx */,
DC71EA9C1FDA06D2008827CB /* CartMNetwork.hxx */,
DC911C7326333B9100666AC0 /* CartMVC.cxx */,
DC911C7426333B9100666AC0 /* CartMVC.hxx */,
DC0984830D3985160073C852 /* CartSB.cxx */,
DC0984840D3985160073C852 /* CartSB.hxx */,
DC84397A247B294D00C6A4FC /* CartTVBoy.cxx */,
@ -2936,6 +2942,7 @@
DC3EE8631E2C0E6D00905161 /* inffast.h in Headers */,
DC676A501729A0B000E4E73D /* CartE0Widget.hxx in Headers */,
DC676A521729A0B000E4E73D /* CartE7Widget.hxx in Headers */,
DC911C7626333B9200666AC0 /* CartMVC.hxx in Headers */,
DC676A541729A0B000E4E73D /* CartFA2Widget.hxx in Headers */,
DC676A561729A0B000E4E73D /* CartFEWidget.hxx in Headers */,
DC676A5A1729A0B000E4E73D /* CartSBWidget.hxx in Headers */,
@ -3410,6 +3417,7 @@
DCAACAFE188D631500A4D282 /* CartDFSC.cxx in Sources */,
DCAACB0E188D636F00A4D282 /* Cart4KSCWidget.cxx in Sources */,
DCB60AD02543100900A5C1D2 /* FBBackendSDL2.cxx in Sources */,
DC911C7526333B9200666AC0 /* CartMVC.cxx in Sources */,
DCAACB10188D636F00A4D282 /* CartBFSCWidget.cxx in Sources */,
DCC2FDF6255EB82500FA5E81 /* ToolTip.cxx in Sources */,
DCAACB12188D636F00A4D282 /* CartBFWidget.cxx in Sources */,

2
src/windows/Stella.vcxproj Normal file → Executable file
View File

@ -759,6 +759,7 @@
<ClCompile Include="..\emucore\CartMDM.cxx" />
<ClCompile Include="..\emucore\CartMNetwork.cxx" />
<ClCompile Include="..\emucore\CartE78K.cxx" />
<ClCompile Include="..\emucore\CartMVC.cxx" />
<ClCompile Include="..\emucore\CartTVBoy.cxx" />
<ClCompile Include="..\emucore\CartWD.cxx" />
<ClCompile Include="..\emucore\CompuMate.cxx" />
@ -1829,6 +1830,7 @@
<ClInclude Include="..\emucore\CartMDM.hxx" />
<ClInclude Include="..\emucore\CartMNetwork.hxx" />
<ClInclude Include="..\emucore\CartE78K.hxx" />
<ClInclude Include="..\emucore\CartMVC.hxx" />
<ClInclude Include="..\emucore\CartTVBoy.hxx" />
<ClInclude Include="..\emucore\CartWD.hxx" />
<ClInclude Include="..\emucore\CompuMate.hxx" />

View File

@ -1110,6 +1110,9 @@
<ClCompile Include="..\common\repository\CompositeKeyValueRepository.cxx">
<Filter>Source Files\repository</Filter>
</ClCompile>
<ClCompile Include="..\emucore\CartMVC.cxx">
<Filter>Source Files\emucore</Filter>
</ClCompile>
<ClCompile Include="..\emucore\CartARM.cxx">
<Filter>Source Files\emucore</Filter>
</ClCompile>
@ -2288,6 +2291,9 @@
<ClInclude Include="..\emucore\OSystemStandalone.hxx">
<Filter>Header Files\emucore</Filter>
</ClInclude>
<ClInclude Include="..\emucore\CartMVC.hxx">
<Filter>Header Files\emucore</Filter>
</ClInclude>
<ClInclude Include="..\emucore\CartARM.hxx">
<Filter>Header Files\emucore</Filter>
</ClInclude>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.