Qt: Fix saving overrides

This commit is contained in:
Jeffrey Pfau 2016-09-20 16:33:56 -07:00
parent bea6235c0a
commit 5c744a3f13
8 changed files with 37 additions and 1 deletions

View File

@ -4,6 +4,7 @@ Bugfixes:
- GB Video: Setting LYC=LY during mode 2 should trigger an IRQ
- GBA Cheats: Fix holding onto pointers that may get invalidated
- Qt: Fix "close" button on Overrides view
- Qt: Fix saving overrides
Misc:
- All: Only update version info if needed

View File

@ -18,6 +18,15 @@ void GBAOverride::apply(struct mCore* core) {
GBAOverrideApply(static_cast<GBA*>(core->board), &override);
}
void GBAOverride::identify(const struct mCore* core) {
if (core->platform(core) != PLATFORM_GBA) {
return;
}
char gameId[8];
core->getGameCode(core, gameId);
memcpy(override.id, &gameId[4], 4);
}
void GBAOverride::save(struct Configuration* config) const {
GBAOverrideSave(config, &override);
}

View File

@ -17,6 +17,7 @@ namespace QGBA {
class GBAOverride : public Override {
public:
void apply(struct mCore*) override;
void identify(const struct mCore*) override;
void save(struct Configuration*) const override;
struct GBACartridgeOverride override;

View File

@ -7,6 +7,8 @@
extern "C" {
#include "core/core.h"
#include "gb/gb.h"
#include "util/crc32.h"
}
using namespace QGBA;
@ -18,6 +20,17 @@ void GBOverride::apply(struct mCore* core) {
GBOverrideApply(static_cast<GB*>(core->board), &override);
}
void GBOverride::identify(const struct mCore* core) {
if (core->platform(core) != PLATFORM_GB) {
return;
}
GB* gb = static_cast<GB*>(core->board);
if (!gb->memory.rom || gb->memory.romSize < sizeof(struct GBCartridge) + 0x100) {
return;
}
override.headerCrc32 = doCrc32(&gb->memory.rom[0x100], sizeof(struct GBCartridge));
}
void GBOverride::save(struct Configuration* config) const {
GBOverrideSave(config, &override);
}

View File

@ -17,6 +17,7 @@ namespace QGBA {
class GBOverride : public Override {
public:
void apply(struct mCore*) override;
void identify(const struct mCore*) override;
void save(struct Configuration*) const override;
struct GBCartridgeOverride override;

View File

@ -284,6 +284,15 @@ void GameController::clearMultiplayerController() {
m_multiplayer = nullptr;
}
void GameController::setOverride(Override* override) {
m_override = override;
if (isLoaded()) {
threadInterrupt();
m_override->identify(m_threadContext.core);
threadContinue();
}
}
void GameController::clearOverride() {
delete m_override;
m_override = nullptr;
@ -437,6 +446,7 @@ void GameController::openGame(bool biosOnly) {
m_vf = nullptr;
if (m_override) {
m_override->identify(m_threadContext.core);
m_override->apply(m_threadContext.core);
}

View File

@ -72,7 +72,7 @@ public:
MultiplayerController* multiplayerController() { return m_multiplayer; }
void clearMultiplayerController();
void setOverride(Override* override) { m_override = override; }
void setOverride(Override* override);
Override* override() { return m_override; }
void clearOverride();

View File

@ -16,6 +16,7 @@ public:
virtual ~Override() {}
virtual void apply(struct mCore*) = 0;
virtual void identify(const struct mCore*) = 0;
virtual void save(struct Configuration*) const = 0;
};