Debugger: GB - Allow saving rom modifications as .gb or .ips files

This commit is contained in:
Sour 2020-06-06 22:34:40 -04:00
parent 704598212a
commit bdecd6270b
6 changed files with 52 additions and 8 deletions

View file

@ -313,6 +313,19 @@ RomInfo BaseCartridge::GetRomInfo()
return info; return info;
} }
vector<uint8_t> BaseCartridge::GetOriginalPrgRom()
{
RomInfo romInfo = GetRomInfo();
shared_ptr<BaseCartridge> originalCart = BaseCartridge::CreateCartridge(_console, romInfo.RomFile, romInfo.PatchFile);
if(originalCart->_gameboy) {
uint8_t* orgPrgRom = originalCart->_gameboy->DebugGetMemory(SnesMemoryType::GbPrgRom);
uint32_t orgRomSize = originalCart->_gameboy->DebugGetMemorySize(SnesMemoryType::GbPrgRom);
return vector<uint8_t>(orgPrgRom, orgPrgRom + orgRomSize);
} else {
return vector<uint8_t>(originalCart->DebugGetPrgRom(), originalCart->DebugGetPrgRom() + originalCart->DebugGetPrgRomSize());
}
}
uint32_t BaseCartridge::GetCrc32() uint32_t BaseCartridge::GetCrc32()
{ {
if(_gameboy) { if(_gameboy) {
@ -594,6 +607,7 @@ bool BaseCartridge::LoadGameboy(VirtualFile &romFile)
} }
_cartInfo = { }; _cartInfo = { };
_headerOffset = Gameboy::HeaderOffset;
_coprocessorType = CoprocessorType::Gameboy; _coprocessorType = CoprocessorType::Gameboy;
SetupCpuHalt(); SetupCpuHalt();
return true; return true;

View file

@ -90,6 +90,7 @@ public:
void Init(MemoryMappings &mm); void Init(MemoryMappings &mm);
RomInfo GetRomInfo(); RomInfo GetRomInfo();
vector<uint8_t> GetOriginalPrgRom();
ConsoleRegion GetRegion(); ConsoleRegion GetRegion();
uint32_t GetCrc32(); uint32_t GetCrc32();
string GetSha1Hash(); string GetSha1Hash();

View file

@ -43,6 +43,7 @@
#include "AluMulDiv.h" #include "AluMulDiv.h"
#include "Assembler.h" #include "Assembler.h"
#include "GbAssembler.h" #include "GbAssembler.h"
#include "GameboyHeader.h"
#include "../Utilities/HexUtilities.h" #include "../Utilities/HexUtilities.h"
#include "../Utilities/FolderUtilities.h" #include "../Utilities/FolderUtilities.h"
#include "../Utilities/IpsPatcher.h" #include "../Utilities/IpsPatcher.h"
@ -621,18 +622,32 @@ void Debugger::SetBreakpoints(Breakpoint breakpoints[], uint32_t length)
void Debugger::SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption) void Debugger::SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption)
{ {
RomInfo romInfo = _cart->GetRomInfo();
vector<uint8_t> rom(_cart->DebugGetPrgRom(), _cart->DebugGetPrgRom() + _cart->DebugGetPrgRomSize());
vector<uint8_t> output; vector<uint8_t> output;
RomInfo romInfo = _cart->GetRomInfo();
Gameboy* gb = _cart->GetGameboy();
vector<uint8_t> rom;
if(gb) {
uint8_t* prgRom = gb->DebugGetMemory(SnesMemoryType::GbPrgRom);
uint32_t prgRomSize = gb->DebugGetMemorySize(SnesMemoryType::GbPrgRom);
rom = vector<uint8_t>(prgRom, prgRom+prgRomSize);
} else {
rom = vector<uint8_t>(_cart->DebugGetPrgRom(), _cart->DebugGetPrgRom() + _cart->DebugGetPrgRomSize());
}
if(saveAsIps) { if(saveAsIps) {
shared_ptr<BaseCartridge> originalCart = BaseCartridge::CreateCartridge(_console.get(), romInfo.RomFile, romInfo.PatchFile); output = IpsPatcher::CreatePatch(_cart->GetOriginalPrgRom(), rom);
vector<uint8_t> originalRom(originalCart->DebugGetPrgRom(), originalCart->DebugGetPrgRom() + originalCart->DebugGetPrgRomSize());
output = IpsPatcher::CreatePatch(originalRom, rom);
} else { } else {
if(stripOption != CdlStripOption::StripNone) { if(stripOption != CdlStripOption::StripNone) {
GetCodeDataLogger()->StripData(rom.data(), stripOption); GetCodeDataLogger()->StripData(rom.data(), stripOption);
//Preserve SNES rom header regardless of CDL file contents
memcpy(rom.data()+romInfo.HeaderOffset, &romInfo.Header, sizeof(SnesCartInformation)); //Preserve rom header regardless of CDL file contents
if(gb) {
GameboyHeader header = gb->GetHeader();
memcpy(rom.data() + romInfo.HeaderOffset, &header, sizeof(GameboyHeader));
} else {
memcpy(rom.data() + romInfo.HeaderOffset, &romInfo.Header, sizeof(SnesCartInformation));
}
} }
output = rom; output = rom;
} }

View file

@ -24,7 +24,7 @@ Gameboy* Gameboy::Create(Console* console, VirtualFile &romFile)
romFile.ReadFile(romData); romFile.ReadFile(romData);
GameboyHeader header; GameboyHeader header;
memcpy(&header, romData.data() + 0x134, sizeof(GameboyHeader)); memcpy(&header, romData.data() + Gameboy::HeaderOffset, sizeof(GameboyHeader));
MessageManager::Log("-----------------------------"); MessageManager::Log("-----------------------------");
MessageManager::Log("File: " + romFile.GetFileName()); MessageManager::Log("File: " + romFile.GetFileName());
@ -257,6 +257,13 @@ int32_t Gameboy::GetRelativeAddress(AddressInfo& absAddress)
return -1; return -1;
} }
GameboyHeader Gameboy::GetHeader()
{
GameboyHeader header;
memcpy(&header, _prgRom + Gameboy::HeaderOffset, sizeof(GameboyHeader));
return header;
}
bool Gameboy::IsCgb() bool Gameboy::IsCgb()
{ {
return _cgbMode; return _cgbMode;

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "stdafx.h" #include "stdafx.h"
#include "DebugTypes.h" #include "DebugTypes.h"
#include "GameboyHeader.h"
#include "../Utilities/ISerializable.h" #include "../Utilities/ISerializable.h"
class Console; class Console;
@ -52,6 +53,8 @@ private:
uint32_t _bootRomSize = 0; uint32_t _bootRomSize = 0;
public: public:
static constexpr int HeaderOffset = 0x134;
static Gameboy* Create(Console* console, VirtualFile& romFile); static Gameboy* Create(Console* console, VirtualFile& romFile);
virtual ~Gameboy(); virtual ~Gameboy();
@ -66,6 +69,7 @@ public:
GbPpu* GetPpu(); GbPpu* GetPpu();
GbCpu* GetCpu(); GbCpu* GetCpu();
GbState GetState(); GbState GetState();
GameboyHeader GetHeader();
uint32_t DebugGetMemorySize(SnesMemoryType type); uint32_t DebugGetMemorySize(SnesMemoryType type);
uint8_t* DebugGetMemory(SnesMemoryType type); uint8_t* DebugGetMemory(SnesMemoryType type);

View file

@ -741,6 +741,9 @@ namespace Mesen.GUI.Debugger
if(saveAsIps) { if(saveAsIps) {
sfd.SetFilter("IPS files (*.ips)|*.ips"); sfd.SetFilter("IPS files (*.ips)|*.ips");
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + ".ips"; sfd.FileName = EmuApi.GetRomInfo().GetRomName() + ".ips";
} else if(_cpuType == CpuType.Gameboy) {
sfd.SetFilter("GB files (*.gb,*.gbc)|*.gb;*.gbc");
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + "_Modified.gb";
} else { } else {
sfd.SetFilter("SFC files (*.sfc)|*.sfc"); sfd.SetFilter("SFC files (*.sfc)|*.sfc");
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + "_Modified.sfc"; sfd.FileName = EmuApi.GetRomInfo().GetRomName() + "_Modified.sfc";