mirror of https://github.com/stella-emu/stella.git
Merge branch 'feature/lodefmode-moviecart'
This commit is contained in:
commit
c2951b3b4d
|
@ -14,6 +14,9 @@
|
||||||
|
|
||||||
6.5.3 to 6.6 (??? ??, 202?)
|
6.5.3 to 6.6 (??? ??, 202?)
|
||||||
|
|
||||||
|
* Added preliminary support for 'MVC' bankswitching scheme by
|
||||||
|
Rob Bairos.
|
||||||
|
|
||||||
* Added web links for many games
|
* Added web links for many games
|
||||||
|
|
||||||
* Debugger: added optional logging of breaks and traps
|
* Debugger: added optional logging of breaks and traps
|
||||||
|
|
|
@ -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)
|
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
|
// For now, we just read into a buffer and store in the stream
|
||||||
// TODO: maybe there's a more efficient way to do this?
|
// TODO: maybe there's a more efficient way to do this?
|
||||||
ByteBuffer buffer;
|
ByteBuffer buffer;
|
||||||
size_t size = read(buffer);
|
size_t size = read(buffer, 0);
|
||||||
if(size > 0)
|
if(size > 0)
|
||||||
image.write(reinterpret_cast<char*>(buffer.get()), size);
|
image.write(reinterpret_cast<char*>(buffer.get()), size);
|
||||||
|
|
||||||
|
|
|
@ -62,8 +62,8 @@ class FilesystemNodeZIP : public AbstractFSNode
|
||||||
bool getChildren(AbstractFSList& list, ListMode mode) const override;
|
bool getChildren(AbstractFSList& list, ListMode mode) const override;
|
||||||
AbstractFSNodePtr getParent() const override;
|
AbstractFSNodePtr getParent() const override;
|
||||||
|
|
||||||
size_t read(ByteBuffer& image) const override;
|
size_t read(ByteBuffer& buffer, size_t size) const override;
|
||||||
size_t read(stringstream& image) const override;
|
size_t read(stringstream& buffer) const override;
|
||||||
size_t write(const ByteBuffer& buffer, size_t size) const override;
|
size_t write(const ByteBuffer& buffer, size_t size) const override;
|
||||||
size_t write(const stringstream& buffer) const override;
|
size_t write(const stringstream& buffer) const override;
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,7 @@ Bankswitch::BSList = {{
|
||||||
{ "FC" , "FC (32K Amiga)" },
|
{ "FC" , "FC (32K Amiga)" },
|
||||||
{ "FE" , "FE (8K Decathlon)" },
|
{ "FE" , "FE (8K Decathlon)" },
|
||||||
{ "MDM" , "MDM (Menu Driven Megacart)" },
|
{ "MDM" , "MDM (Menu Driven Megacart)" },
|
||||||
|
{ "MVC" , "MVC (Movie Cart)" },
|
||||||
{ "SB" , "SB (128-256K SUPERbank)" },
|
{ "SB" , "SB (128-256K SUPERbank)" },
|
||||||
{ "TVBOY" , "TV Boy (512K)" },
|
{ "TVBOY" , "TV Boy (512K)" },
|
||||||
{ "UA" , "UA (8K UA Ltd.)" },
|
{ "UA" , "UA (8K UA Ltd.)" },
|
||||||
|
@ -226,6 +227,7 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
|
||||||
{ "FC" , Bankswitch::Type::_FC },
|
{ "FC" , Bankswitch::Type::_FC },
|
||||||
{ "FE" , Bankswitch::Type::_FE },
|
{ "FE" , Bankswitch::Type::_FE },
|
||||||
{ "MDM" , Bankswitch::Type::_MDM },
|
{ "MDM" , Bankswitch::Type::_MDM },
|
||||||
|
{ "MVC" , Bankswitch::Type::_MVC },
|
||||||
{ "SB" , Bankswitch::Type::_SB },
|
{ "SB" , Bankswitch::Type::_SB },
|
||||||
{ "TVB" , Bankswitch::Type::_TVBOY },
|
{ "TVB" , Bankswitch::Type::_TVBOY },
|
||||||
{ "TVBOY" , Bankswitch::Type::_TVBOY },
|
{ "TVBOY" , Bankswitch::Type::_TVBOY },
|
||||||
|
@ -284,6 +286,7 @@ Bankswitch::NameToTypeMap Bankswitch::ourNameToTypes = {
|
||||||
{ "FC" , Bankswitch::Type::_FC },
|
{ "FC" , Bankswitch::Type::_FC },
|
||||||
{ "FE" , Bankswitch::Type::_FE },
|
{ "FE" , Bankswitch::Type::_FE },
|
||||||
{ "MDM" , Bankswitch::Type::_MDM },
|
{ "MDM" , Bankswitch::Type::_MDM },
|
||||||
|
{ "MVC" , Bankswitch::Type::_MVC },
|
||||||
{ "SB" , Bankswitch::Type::_SB },
|
{ "SB" , Bankswitch::Type::_SB },
|
||||||
{ "TVBOY" , Bankswitch::Type::_TVBOY },
|
{ "TVBOY" , Bankswitch::Type::_TVBOY },
|
||||||
{ "UA" , Bankswitch::Type::_UA },
|
{ "UA" , Bankswitch::Type::_UA },
|
||||||
|
|
|
@ -44,8 +44,8 @@ class Bankswitch
|
||||||
_CDF, _CM, _CTY, _CV, _DF, _DFSC, _DPC,
|
_CDF, _CM, _CTY, _CV, _DF, _DFSC, _DPC,
|
||||||
_DPCP, _E0, _E7, _E78K, _EF, _EFSC, _F0,
|
_DPCP, _E0, _E7, _E78K, _EF, _EFSC, _F0,
|
||||||
_F4, _F4SC, _F6, _F6SC, _F8, _F8SC, _FA,
|
_F4, _F4SC, _F6, _F6SC, _F8, _F8SC, _FA,
|
||||||
_FA2, _FC, _FE, _MDM, _SB, _TVBOY, _UA,
|
_FA2, _FC, _FE, _MDM, _MVC, _SB, _TVBOY,
|
||||||
_UASW, _WD, _WDSW, _X07,
|
_UA, _UASW, _WD, _WDSW, _X07,
|
||||||
#ifdef CUSTOM_ARM
|
#ifdef CUSTOM_ARM
|
||||||
_CUSTOM,
|
_CUSTOM,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
#include "CartFC.hxx"
|
#include "CartFC.hxx"
|
||||||
#include "CartFE.hxx"
|
#include "CartFE.hxx"
|
||||||
#include "CartMDM.hxx"
|
#include "CartMDM.hxx"
|
||||||
|
#include "CartMVC.hxx"
|
||||||
#include "CartSB.hxx"
|
#include "CartSB.hxx"
|
||||||
#include "CartTVBoy.hxx"
|
#include "CartTVBoy.hxx"
|
||||||
#include "CartUA.hxx"
|
#include "CartUA.hxx"
|
||||||
|
@ -197,6 +198,10 @@ unique_ptr<Cartridge> CartCreator::create(const FilesystemNode& file,
|
||||||
Bankswitch::typeToName(type) + "'");
|
Bankswitch::typeToName(type) + "'");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Bankswitch::Type::_MVC:
|
||||||
|
cartridge = make_unique<CartridgeMVC>(file.getPath(), size, md5, settings);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
cartridge = createFromImage(image, size, detectedType, md5, settings);
|
cartridge = createFromImage(image, size, detectedType, md5, settings);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "Logger.hxx"
|
#include "Logger.hxx"
|
||||||
|
|
||||||
#include "CartDetector.hxx"
|
#include "CartDetector.hxx"
|
||||||
|
#include "CartMVC.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t size)
|
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;
|
type = Bankswitch::Type::_3EP;
|
||||||
else if(isProbablyMDM(image, size))
|
else if(isProbablyMDM(image, size))
|
||||||
type = Bankswitch::Type::_MDM;
|
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 we get here and autodetection failed, then we force '4K'
|
||||||
if(type == Bankswitch::Type::_AUTO)
|
if(type == Bankswitch::Type::_AUTO)
|
||||||
|
@ -455,7 +458,7 @@ bool CartDetector::isProbablyCDF(const ByteBuffer& image, size_t size)
|
||||||
// 0x10adab1e (LOADABLE) if needed for future improvement
|
// 0x10adab1e (LOADABLE) if needed for future improvement
|
||||||
uInt8 cdf[] = { 'C', 'D', 'F' };
|
uInt8 cdf[] = { 'C', 'D', 'F' };
|
||||||
uInt8 cdfjplus[] = { 'P', 'L', 'U', 'S', 'C', 'D', 'F', 'J' };
|
uInt8 cdfjplus[] = { 'P', 'L', 'U', 'S', 'C', 'D', 'F', 'J' };
|
||||||
return (searchForBytes(image, size, cdf, 3, 3) ||
|
return (searchForBytes(image, size, cdf, 3, 3) ||
|
||||||
searchForBytes(image, size, cdfjplus, 8, 1));
|
searchForBytes(image, size, cdfjplus, 8, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
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)
|
bool CartDetector::isProbablySB(const ByteBuffer& image, size_t size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define CARTRIDGE_DETECTOR_HXX
|
#define CARTRIDGE_DETECTOR_HXX
|
||||||
|
|
||||||
#include "Bankswitch.hxx"
|
#include "Bankswitch.hxx"
|
||||||
|
#include "FSNode.hxx"
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,6 +41,12 @@ class CartDetector
|
||||||
*/
|
*/
|
||||||
static Bankswitch::Type autodetectType(const ByteBuffer& image, size_t size);
|
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:
|
private:
|
||||||
/**
|
/**
|
||||||
Search the image for the specified byte signature
|
Search the image for the specified byte signature
|
||||||
|
@ -189,6 +196,11 @@ class CartDetector
|
||||||
*/
|
*/
|
||||||
static bool isProbablyMDM(const ByteBuffer& image, size_t size);
|
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
|
Returns true if the image is probably a SB bankswitching cartridge
|
||||||
*/
|
*/
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "FSNodeFactory.hxx"
|
#include "FSNodeFactory.hxx"
|
||||||
#include "FSNode.hxx"
|
#include "FSNode.hxx"
|
||||||
|
#include "CartDetector.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
FilesystemNode::FilesystemNode(const AbstractFSNodePtr& realNode)
|
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;
|
size_t sizeRead = 0;
|
||||||
|
|
||||||
|
@ -341,7 +342,7 @@ size_t FilesystemNode::read(ByteBuffer& buffer) const
|
||||||
throw runtime_error("File not found/readable");
|
throw runtime_error("File not found/readable");
|
||||||
|
|
||||||
// First let the private subclass attempt to open the file
|
// 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;
|
return sizeRead;
|
||||||
|
|
||||||
// Otherwise, the default behaviour is to read from a normal C++ ifstream
|
// 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)
|
if (sizeRead == 0)
|
||||||
throw runtime_error("Zero-byte file");
|
throw runtime_error("Zero-byte file");
|
||||||
|
else if (size != 0)
|
||||||
|
sizeRead = size;
|
||||||
|
|
||||||
buffer = make_unique<uInt8[]>(sizeRead);
|
buffer = make_unique<uInt8[]>(sizeRead);
|
||||||
in.read(reinterpret_cast<char*>(buffer.get()), sizeRead);
|
in.read(reinterpret_cast<char*>(buffer.get()), sizeRead);
|
||||||
|
|
|
@ -244,12 +244,13 @@ class FilesystemNode
|
||||||
* Read data (binary format) into the given buffer.
|
* Read data (binary format) into the given buffer.
|
||||||
*
|
*
|
||||||
* @param buffer The buffer to contain the data (allocated in this method).
|
* @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)
|
* @return The number of bytes read (0 in the case of failure)
|
||||||
* This method can throw exceptions, and should be used inside
|
* This method can throw exceptions, and should be used inside
|
||||||
* a try-catch block.
|
* 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.
|
* Read data (text format) into the given stream.
|
||||||
|
@ -438,12 +439,13 @@ class AbstractFSNode
|
||||||
* Read data (binary format) into the given buffer.
|
* Read data (binary format) into the given buffer.
|
||||||
*
|
*
|
||||||
* @param buffer The buffer to contain the data (allocated in this method).
|
* @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)
|
* @return The number of bytes read (0 in the case of failure)
|
||||||
* This method can throw exceptions, and should be used inside
|
* This method can throw exceptions, and should be used inside
|
||||||
* a try-catch block.
|
* 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.
|
* Read data (text format) into the given stream.
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "MD5.hxx"
|
#include "MD5.hxx"
|
||||||
#include "Cart.hxx"
|
#include "Cart.hxx"
|
||||||
#include "CartCreator.hxx"
|
#include "CartCreator.hxx"
|
||||||
|
#include "CartDetector.hxx"
|
||||||
#include "FrameBuffer.hxx"
|
#include "FrameBuffer.hxx"
|
||||||
#include "TIASurface.hxx"
|
#include "TIASurface.hxx"
|
||||||
#include "TIAConstants.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
|
// but also adds a properties entry if the one for the ROM doesn't
|
||||||
// contain a valid name
|
// 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;
|
ByteBuffer image;
|
||||||
if((size = rom.read(image)) == 0)
|
if((size = rom.read(image, sizeToRead)) == 0)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// If we get to this point, we know we have a valid file to open
|
// If we get to this point, we know we have a valid file to open
|
||||||
|
|
|
@ -77,6 +77,14 @@ Serializer::Serializer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void Serializer::setPosition(size_t pos)
|
||||||
|
{
|
||||||
|
myStream->clear();
|
||||||
|
myStream->seekg(pos);
|
||||||
|
myStream->seekp(pos);
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Serializer::rewind()
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -59,15 +59,20 @@ class Serializer
|
||||||
*/
|
*/
|
||||||
explicit operator bool() const { return myStream != nullptr; }
|
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.
|
Resets the read/write location to the beginning of the stream.
|
||||||
*/
|
*/
|
||||||
void rewind();
|
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.
|
Reads a byte value (unsigned 8-bit) from the current input stream.
|
||||||
|
@ -220,13 +225,6 @@ class Serializer
|
||||||
unique_ptr<iostream> myStream;
|
unique_ptr<iostream> myStream;
|
||||||
|
|
||||||
static constexpr uInt8 TruePattern = 0xfe, FalsePattern = 0x01;
|
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
|
#endif
|
||||||
|
|
|
@ -48,6 +48,7 @@ MODULE_OBJS := \
|
||||||
src/emucore/CartFC.o \
|
src/emucore/CartFC.o \
|
||||||
src/emucore/CartFE.o \
|
src/emucore/CartFE.o \
|
||||||
src/emucore/CartMDM.o \
|
src/emucore/CartMDM.o \
|
||||||
|
src/emucore/CartMVC.o \
|
||||||
src/emucore/CartSB.o \
|
src/emucore/CartSB.o \
|
||||||
src/emucore/CartTVBoy.o \
|
src/emucore/CartTVBoy.o \
|
||||||
src/emucore/CartUA.o \
|
src/emucore/CartUA.o \
|
||||||
|
|
|
@ -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());
|
image = make_unique<uInt8[]>(Cartridge::maxSize());
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ class FilesystemNodeLIBRETRO : public AbstractFSNode
|
||||||
bool getChildren(AbstractFSList& list, ListMode mode) const override;
|
bool getChildren(AbstractFSList& list, ListMode mode) const override;
|
||||||
AbstractFSNodePtr getParent() const override;
|
AbstractFSNodePtr getParent() const override;
|
||||||
|
|
||||||
size_t read(ByteBuffer& image) const override;
|
size_t read(ByteBuffer& image, size_t) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
string _name;
|
string _name;
|
||||||
|
|
|
@ -86,6 +86,7 @@ SOURCES_CXX := \
|
||||||
$(CORE_DIR)/emucore/CartFC.cxx \
|
$(CORE_DIR)/emucore/CartFC.cxx \
|
||||||
$(CORE_DIR)/emucore/CartFE.cxx \
|
$(CORE_DIR)/emucore/CartFE.cxx \
|
||||||
$(CORE_DIR)/emucore/CartMDM.cxx \
|
$(CORE_DIR)/emucore/CartMDM.cxx \
|
||||||
|
$(CORE_DIR)/emucore/CartMVC.cxx \
|
||||||
$(CORE_DIR)/emucore/CartMNetwork.cxx \
|
$(CORE_DIR)/emucore/CartMNetwork.cxx \
|
||||||
$(CORE_DIR)/emucore/CartSB.cxx \
|
$(CORE_DIR)/emucore/CartSB.cxx \
|
||||||
$(CORE_DIR)/emucore/CartTVBoy.cxx \
|
$(CORE_DIR)/emucore/CartTVBoy.cxx \
|
||||||
|
|
|
@ -455,6 +455,8 @@
|
||||||
DC8C1BB114B25DE7006440EE /* MindLink.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC8C1BAB14B25DE7006440EE /* MindLink.cxx */; };
|
DC8C1BB114B25DE7006440EE /* MindLink.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC8C1BAB14B25DE7006440EE /* MindLink.cxx */; };
|
||||||
DC8C1BB214B25DE7006440EE /* MindLink.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC8C1BAC14B25DE7006440EE /* MindLink.hxx */; };
|
DC8C1BB214B25DE7006440EE /* MindLink.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC8C1BAC14B25DE7006440EE /* MindLink.hxx */; };
|
||||||
DC8CF9BD17C15A27004B533D /* ConsoleMediumFont.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC8CF9BC17C15A27004B533D /* ConsoleMediumFont.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 */; };
|
DC932D440F278A5200FEFEFC /* DefProps.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D3F0F278A5200FEFEFC /* DefProps.hxx */; };
|
||||||
DC932D450F278A5200FEFEFC /* Serializable.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D400F278A5200FEFEFC /* Serializable.hxx */; };
|
DC932D450F278A5200FEFEFC /* Serializable.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D400F278A5200FEFEFC /* Serializable.hxx */; };
|
||||||
DC932D460F278A5200FEFEFC /* SerialPort.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC932D410F278A5200FEFEFC /* SerialPort.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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
DC932D410F278A5200FEFEFC /* SerialPort.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = SerialPort.hxx; sourceTree = "<group>"; };
|
||||||
|
@ -2056,6 +2060,8 @@
|
||||||
DC6A18FB19B3E67A00DEB242 /* CartMDM.hxx */,
|
DC6A18FB19B3E67A00DEB242 /* CartMDM.hxx */,
|
||||||
DC71EA9B1FDA06D2008827CB /* CartMNetwork.cxx */,
|
DC71EA9B1FDA06D2008827CB /* CartMNetwork.cxx */,
|
||||||
DC71EA9C1FDA06D2008827CB /* CartMNetwork.hxx */,
|
DC71EA9C1FDA06D2008827CB /* CartMNetwork.hxx */,
|
||||||
|
DC911C7326333B9100666AC0 /* CartMVC.cxx */,
|
||||||
|
DC911C7426333B9100666AC0 /* CartMVC.hxx */,
|
||||||
DC0984830D3985160073C852 /* CartSB.cxx */,
|
DC0984830D3985160073C852 /* CartSB.cxx */,
|
||||||
DC0984840D3985160073C852 /* CartSB.hxx */,
|
DC0984840D3985160073C852 /* CartSB.hxx */,
|
||||||
DC84397A247B294D00C6A4FC /* CartTVBoy.cxx */,
|
DC84397A247B294D00C6A4FC /* CartTVBoy.cxx */,
|
||||||
|
@ -2936,6 +2942,7 @@
|
||||||
DC3EE8631E2C0E6D00905161 /* inffast.h in Headers */,
|
DC3EE8631E2C0E6D00905161 /* inffast.h in Headers */,
|
||||||
DC676A501729A0B000E4E73D /* CartE0Widget.hxx in Headers */,
|
DC676A501729A0B000E4E73D /* CartE0Widget.hxx in Headers */,
|
||||||
DC676A521729A0B000E4E73D /* CartE7Widget.hxx in Headers */,
|
DC676A521729A0B000E4E73D /* CartE7Widget.hxx in Headers */,
|
||||||
|
DC911C7626333B9200666AC0 /* CartMVC.hxx in Headers */,
|
||||||
DC676A541729A0B000E4E73D /* CartFA2Widget.hxx in Headers */,
|
DC676A541729A0B000E4E73D /* CartFA2Widget.hxx in Headers */,
|
||||||
DC676A561729A0B000E4E73D /* CartFEWidget.hxx in Headers */,
|
DC676A561729A0B000E4E73D /* CartFEWidget.hxx in Headers */,
|
||||||
DC676A5A1729A0B000E4E73D /* CartSBWidget.hxx in Headers */,
|
DC676A5A1729A0B000E4E73D /* CartSBWidget.hxx in Headers */,
|
||||||
|
@ -3410,6 +3417,7 @@
|
||||||
DCAACAFE188D631500A4D282 /* CartDFSC.cxx in Sources */,
|
DCAACAFE188D631500A4D282 /* CartDFSC.cxx in Sources */,
|
||||||
DCAACB0E188D636F00A4D282 /* Cart4KSCWidget.cxx in Sources */,
|
DCAACB0E188D636F00A4D282 /* Cart4KSCWidget.cxx in Sources */,
|
||||||
DCB60AD02543100900A5C1D2 /* FBBackendSDL2.cxx in Sources */,
|
DCB60AD02543100900A5C1D2 /* FBBackendSDL2.cxx in Sources */,
|
||||||
|
DC911C7526333B9200666AC0 /* CartMVC.cxx in Sources */,
|
||||||
DCAACB10188D636F00A4D282 /* CartBFSCWidget.cxx in Sources */,
|
DCAACB10188D636F00A4D282 /* CartBFSCWidget.cxx in Sources */,
|
||||||
DCC2FDF6255EB82500FA5E81 /* ToolTip.cxx in Sources */,
|
DCC2FDF6255EB82500FA5E81 /* ToolTip.cxx in Sources */,
|
||||||
DCAACB12188D636F00A4D282 /* CartBFWidget.cxx in Sources */,
|
DCAACB12188D636F00A4D282 /* CartBFWidget.cxx in Sources */,
|
||||||
|
|
|
@ -759,6 +759,7 @@
|
||||||
<ClCompile Include="..\emucore\CartMDM.cxx" />
|
<ClCompile Include="..\emucore\CartMDM.cxx" />
|
||||||
<ClCompile Include="..\emucore\CartMNetwork.cxx" />
|
<ClCompile Include="..\emucore\CartMNetwork.cxx" />
|
||||||
<ClCompile Include="..\emucore\CartE78K.cxx" />
|
<ClCompile Include="..\emucore\CartE78K.cxx" />
|
||||||
|
<ClCompile Include="..\emucore\CartMVC.cxx" />
|
||||||
<ClCompile Include="..\emucore\CartTVBoy.cxx" />
|
<ClCompile Include="..\emucore\CartTVBoy.cxx" />
|
||||||
<ClCompile Include="..\emucore\CartWD.cxx" />
|
<ClCompile Include="..\emucore\CartWD.cxx" />
|
||||||
<ClCompile Include="..\emucore\CompuMate.cxx" />
|
<ClCompile Include="..\emucore\CompuMate.cxx" />
|
||||||
|
@ -1829,6 +1830,7 @@
|
||||||
<ClInclude Include="..\emucore\CartMDM.hxx" />
|
<ClInclude Include="..\emucore\CartMDM.hxx" />
|
||||||
<ClInclude Include="..\emucore\CartMNetwork.hxx" />
|
<ClInclude Include="..\emucore\CartMNetwork.hxx" />
|
||||||
<ClInclude Include="..\emucore\CartE78K.hxx" />
|
<ClInclude Include="..\emucore\CartE78K.hxx" />
|
||||||
|
<ClInclude Include="..\emucore\CartMVC.hxx" />
|
||||||
<ClInclude Include="..\emucore\CartTVBoy.hxx" />
|
<ClInclude Include="..\emucore\CartTVBoy.hxx" />
|
||||||
<ClInclude Include="..\emucore\CartWD.hxx" />
|
<ClInclude Include="..\emucore\CartWD.hxx" />
|
||||||
<ClInclude Include="..\emucore\CompuMate.hxx" />
|
<ClInclude Include="..\emucore\CompuMate.hxx" />
|
||||||
|
|
|
@ -1110,6 +1110,9 @@
|
||||||
<ClCompile Include="..\common\repository\CompositeKeyValueRepository.cxx">
|
<ClCompile Include="..\common\repository\CompositeKeyValueRepository.cxx">
|
||||||
<Filter>Source Files\repository</Filter>
|
<Filter>Source Files\repository</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\emucore\CartMVC.cxx">
|
||||||
|
<Filter>Source Files\emucore</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\emucore\CartARM.cxx">
|
<ClCompile Include="..\emucore\CartARM.cxx">
|
||||||
<Filter>Source Files\emucore</Filter>
|
<Filter>Source Files\emucore</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -2288,6 +2291,9 @@
|
||||||
<ClInclude Include="..\emucore\OSystemStandalone.hxx">
|
<ClInclude Include="..\emucore\OSystemStandalone.hxx">
|
||||||
<Filter>Header Files\emucore</Filter>
|
<Filter>Header Files\emucore</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\emucore\CartMVC.hxx">
|
||||||
|
<Filter>Header Files\emucore</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\emucore\CartARM.hxx">
|
<ClInclude Include="..\emucore\CartARM.hxx">
|
||||||
<Filter>Header Files\emucore</Filter>
|
<Filter>Header Files\emucore</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -2306,4 +2312,4 @@
|
||||||
<Filter>Resource Files</Filter>
|
<Filter>Resource Files</Filter>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue