mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-02-16 17:35:39 +00:00
Changes to game loader interface, added 32-bit word swapping utility function
This commit is contained in:
parent
41105c15d7
commit
1dc360a8b0
18
Src/Game.cpp
18
Src/Game.cpp
|
@ -6,6 +6,14 @@
|
|||
|
||||
#include <iostream>
|
||||
|
||||
void Game::ROM::CopyTo(uint8_t *dest, size_t dest_size) const
|
||||
{
|
||||
if (!data || !size || !dest || !dest_size)
|
||||
return;
|
||||
size_t bytes_to_copy = std::min(size, dest_size);
|
||||
const uint8_t *src = data.get();
|
||||
memcpy(dest, src, bytes_to_copy);
|
||||
}
|
||||
|
||||
bool GameLoader::MissingAttrib(const GameLoader &loader, const Util::Config::Node &node, const std::string &attribute)
|
||||
{
|
||||
|
@ -50,11 +58,12 @@ GameLoader::Region::Ptr_t GameLoader::Region::Create(const GameLoader &loader, c
|
|||
|
||||
static void PopulateGameInfo(Game *game, const Util::Config::Node &game_node)
|
||||
{
|
||||
game->name = game_node["name"].Value();
|
||||
game->title = game_node["identity/title"].Value();
|
||||
game->version = game_node["identity/version"].Value();
|
||||
game->manufacturer = game_node["identity/manufacturer"].Value();
|
||||
game->year = game_node["identity/year"].ValueAsUnsigned();
|
||||
game->stepping = game_node["identity/stepping"].Value();
|
||||
game->stepping = game_node["hardware/stepping"].Value();
|
||||
}
|
||||
|
||||
bool GameLoader::ParseXML(const Util::Config::Node::ConstPtr_t &xml)
|
||||
|
@ -274,7 +283,7 @@ bool GameLoader::LoadRegion(Game::ROM *buffer, const GameLoader::Region::Ptr_t &
|
|||
}
|
||||
}
|
||||
if (region->byte_swap)
|
||||
Util::ByteSwap(buffer->data.get(), buffer->size);
|
||||
Util::FlipEndian16(buffer->data.get(), buffer->size);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -377,3 +386,8 @@ bool GameLoader::Load(Game *game, const std::string &zipfilename)
|
|||
unzClose(m_zf);
|
||||
return error;
|
||||
}
|
||||
|
||||
GameLoader::GameLoader(const Util::Config::Node &config)
|
||||
{
|
||||
LoadDefinitionXML(config["GameXMLFile"].Value());
|
||||
}
|
||||
|
|
14
Src/Game.h
14
Src/Game.h
|
@ -8,6 +8,7 @@
|
|||
|
||||
struct Game
|
||||
{
|
||||
std::string name;
|
||||
std::string title;
|
||||
std::string version;
|
||||
std::string manufacturer;
|
||||
|
@ -18,8 +19,14 @@ struct Game
|
|||
{
|
||||
std::shared_ptr<uint8_t> data;
|
||||
size_t size = 0;
|
||||
void CopyTo(uint8_t *dest, size_t dest_size) const;
|
||||
};
|
||||
std::map<std::string, ROM> roms;
|
||||
ROM get_rom(const std::string ®ion) const
|
||||
{
|
||||
auto it = roms.find(region);
|
||||
return it == roms.end() ? ROM() : it->second;
|
||||
}
|
||||
};
|
||||
|
||||
//TODO: move to separate GameLoader.cpp
|
||||
|
@ -69,13 +76,10 @@ private:
|
|||
bool LoadZippedFile(std::shared_ptr<uint8_t> *buffer, size_t *file_size, const GameLoader::File::Ptr_t &file);
|
||||
bool LoadRegion(Game::ROM *buffer, const GameLoader::Region::Ptr_t ®ion);
|
||||
bool LoadROMs(std::map<std::string, Game::ROM> *roms, const std::string &game_name);
|
||||
bool LoadDefinitionXML(const std::string &filename);
|
||||
|
||||
public:
|
||||
GameLoader()
|
||||
{
|
||||
}
|
||||
|
||||
bool LoadDefinitionXML(const std::string &filename);
|
||||
GameLoader(const Util::Config::Node &config);
|
||||
bool Load(Game *game, const std::string &zipfilename);
|
||||
};
|
||||
|
||||
|
|
|
@ -2,13 +2,26 @@
|
|||
|
||||
namespace Util
|
||||
{
|
||||
void ByteSwap(uint8_t *buffer, size_t size)
|
||||
void FlipEndian16(uint8_t *buffer, size_t size)
|
||||
{
|
||||
for (size_t i = 0; i < (size & ~1); i += 2)
|
||||
{
|
||||
uint8_t x = buffer[i + 0];
|
||||
uint8_t tmp = buffer[i + 0];
|
||||
buffer[i + 0] = buffer[i + 1];
|
||||
buffer[i + 1] = x;
|
||||
buffer[i + 1] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
void FlipEndian32(uint8_t *buffer, size_t size)
|
||||
{
|
||||
for (size_t i = 0; i < (size & ~3); i += 4)
|
||||
{
|
||||
uint8_t tmp1 = buffer[i+0];
|
||||
uint8_t tmp2 = buffer[i+1];
|
||||
buffer[i+0] = buffer[i+3];
|
||||
buffer[i+1] = buffer[i+2];
|
||||
buffer[i+2] = tmp2;
|
||||
buffer[i+3] = tmp1;
|
||||
}
|
||||
}
|
||||
} // Util
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
|
||||
namespace Util
|
||||
{
|
||||
void ByteSwap(uint8_t *buffer, size_t size);
|
||||
void FlipEndian16(uint8_t *buffer, size_t size);
|
||||
void FlipEndian32(uint8_t *buffer, size_t size);
|
||||
} // Util
|
||||
|
||||
#endif // INCLUDED_BYTESWAP_H
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace Util
|
|||
|
||||
const inline std::string &Value() const
|
||||
{
|
||||
//TODO: if empty node, throw exception?
|
||||
//TODO: if empty node, throw exception? Use ValueWithDefault() otherwise.
|
||||
return m_value;
|
||||
}
|
||||
|
||||
|
@ -206,6 +206,7 @@ namespace Util
|
|||
};
|
||||
|
||||
//TODO: CreateEmpty() should take a key that defaults to blank
|
||||
//TODO: define deep-copy assignment operator and get rid of Ptr_t and ConstPtr_t
|
||||
Node::Ptr_t CreateEmpty();
|
||||
Node::Ptr_t FromXML(const std::string &text);
|
||||
Node::Ptr_t FromXMLFile(const std::string &filename);
|
||||
|
|
Loading…
Reference in a new issue