Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge meh #162

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/core/psxemulator.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,9 @@ class Emulator {
typedef Setting<bool, TYPESTRING("Enabled")> Enabled;
typedef Settings<Filename, FileOffset, LoadOffset, LoadSize, Enabled> type;
};
typedef SettingArray<TYPESTRING("Overlay"), OverlaySetting::type> SettingBiosOverlay;
typedef SettingArray<TYPESTRING("BiosOverlay"), OverlaySetting::type> SettingBiosOverlay;
typedef SettingArray<TYPESTRING("Exp1Overlay"), OverlaySetting::type> SettingExp1Overlay;

typedef Setting<bool, TYPESTRING("Stdout")> SettingStdout;
typedef SettingPath<TYPESTRING("Logfile")> SettingLogfile;
typedef SettingPath<TYPESTRING("Mcd1")> SettingMcd1;
Expand All @@ -142,7 +144,7 @@ class Emulator {
Settings<SettingStdout, SettingLogfile, SettingMcd1, SettingMcd2, SettingBios, SettingPpfDir, SettingPsxExe,
SettingXa, SettingSioIrq, SettingSpuIrq, SettingBnWMdec, SettingAutoVideo, SettingVideo, SettingCDDA,
SettingHLE, SettingFastBoot, SettingDebug, SettingVerbose, SettingRCntFix, SettingIsoPath, SettingLocale,
SettingMcd1Inserted, SettingMcd2Inserted, SettingBiosOverlay>
SettingMcd1Inserted, SettingMcd2Inserted, SettingBiosOverlay, SettingExp1Overlay>
settings;
class PcsxConfig {
public:
Expand Down
89 changes: 88 additions & 1 deletion src/core/psxmem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,9 @@ int PCSX::Memory::psxMemInit() {

void PCSX::Memory::psxMemReset() {
const uint32_t bios_size = 0x00080000;
const uint32_t exp1_size = 0x00010000;
memset(g_psxM, 0, 0x00200000);
memset(g_psxP, 0, 0x00010000);
memset(g_psxP, 0, exp1_size);
memset(g_psxR, 0, bios_size);
g_emulator.m_psxBios->m_realBiosLoaded = false;

Expand Down Expand Up @@ -179,6 +180,92 @@ void PCSX::Memory::psxMemReset() {
}
}
}

for (auto &overlay : g_emulator.settings.get<Emulator::SettingExp1Overlay>()) {
if (!overlay.get<Emulator::OverlaySetting::Enabled>()) continue;
const auto &filename = overlay.get<Emulator::OverlaySetting::Filename>();
auto foffset = overlay.get<Emulator::OverlaySetting::FileOffset>();
auto loffset = overlay.get<Emulator::OverlaySetting::LoadOffset>();
auto lsize = overlay.get<Emulator::OverlaySetting::LoadSize>();
bool failed = false;
File *f = new File(filename);

if (f->failed()) {
PCSX::g_system->message(_("Could not open Expansion 1 Overlay:\"%s\"!\n"), filename.string().c_str());
failed = true;
}

ssize_t fsize;
if (!failed) {
f->seek(0, SEEK_END);
fsize = f->tell();

if (foffset < 0) {
// negative offset means from end of file
foffset = foffset + fsize;

if (foffset < 0) {
// fail if the negative offset is more than the total file size
PCSX::g_system->message(_("Invalid file offset for Expansion 1 Overlay:\"%s\"!\n"),
filename.string().c_str());
failed = true;
}
} else if (foffset > fsize) {
PCSX::g_system->message(_("Invalid file offset for Expansion 1 Overlay:\"%s\"!\n"),
filename.string().c_str());
failed = true;
}
}
if (!failed) {
f->seek(foffset, SEEK_SET);

fsize = fsize - foffset;

if (lsize <= 0) {
// lsize <= 0 means "from file size"

lsize = fsize + lsize;

if (lsize < 0) {
PCSX::g_system->message(_("Invalid load size specified Expansion 1 Overlay:\"%s\"!\n"),
filename.string().c_str());
failed = true;
}
}
}
if (!failed) {
if (lsize > fsize) {
PCSX::g_system->message(_("Invalid load size specified Expansion 1 Overlay:\"%s\"!\n"),
filename.string().c_str());
failed = true;
}
}
if (!failed) {
if (loffset < 0) {
// negative offset means from end of device memory region

loffset = loffset + exp1_size;

if (loffset < 0) {
// fail if the negative offset is more than the Expansion 1 size
PCSX::g_system->message(_("Invalid load offset for Expansion 1 Overlay:\"%s\"!\n"),
filename.string().c_str());
failed = true;
}
} else if (loffset > exp1_size) {
PCSX::g_system->message(_("Invalid load offset for Expansion 1 Overlay:\"%s\"!\n"),
filename.string().c_str());
failed = true;
}
}
if (!failed) {
f->read(g_psxP + loffset, lsize);
PCSX::g_system->printf(_("Loaded Expansion 1 overlay: %s\n"), filename.string().c_str());
}

f->close();
delete f;
}
}

void PCSX::Memory::psxMemShutdown() {
Expand Down
136 changes: 115 additions & 21 deletions src/gui/gui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -406,18 +406,29 @@ void PCSX::GUI::endFrame() {
if (ImGui::BeginMenu(_("Configuration"))) {
if (ImGui::MenuItem(_("Emulation"), nullptr, &m_showCfg)) {
auto& overlays = g_emulator.settings.get<Emulator::SettingBiosOverlay>();
m_overlayFileOffsets.resize(overlays.size());
m_overlayLoadOffsets.resize(overlays.size());
m_overlayLoadSizes.resize(overlays.size());
unsigned counter = 0;
m_biosOverlays.resize(overlays.size());
for (auto& overlay : overlays) {
char str[32];
std::snprintf(str, 32, "0x%08x", overlay.get<Emulator::OverlaySetting::FileOffset>().value);
m_overlayFileOffsets[counter] = str;
m_biosOverlays[counter].fileOffs = str;
std::snprintf(str, 32, "0x%08x", overlay.get<Emulator::OverlaySetting::LoadOffset>().value);
m_overlayLoadOffsets[counter] = str;
m_biosOverlays[counter].loadOffs = str;
std::snprintf(str, 32, "0x%08x", overlay.get<Emulator::OverlaySetting::LoadSize>().value);
m_overlayLoadSizes[counter] = str;
m_biosOverlays[counter].loadSize = str;
counter++;
}

auto &eoverlays = g_emulator.settings.get<Emulator::SettingExp1Overlay>();
m_exp1Overlays.resize(eoverlays.size());
for (auto& overlay : eoverlays) {
char str[32];
std::snprintf(str, 32, "0x%08x", overlay.get<Emulator::OverlaySetting::FileOffset>().value);
m_exp1Overlays[counter].fileOffs = str;
std::snprintf(str, 32, "0x%08x", overlay.get<Emulator::OverlaySetting::LoadOffset>().value);
m_exp1Overlays[counter].loadOffs = str;
std::snprintf(str, 32, "0x%08x", overlay.get<Emulator::OverlaySetting::LoadSize>().value);
m_exp1Overlays[counter].loadSize = str;
counter++;
}
}
Expand Down Expand Up @@ -630,7 +641,10 @@ bool PCSX::GUI::configure() {
bool changed = false;
bool selectBiosDialog = false;
bool selectBiosOverlayDialog = false;
bool selectExp1OverlayDialog = false;

auto& settings = PCSX::g_emulator.settings;

if (!m_showCfg) return false;

ImGui::SetNextWindowPos(ImVec2(50, 30), ImGuiCond_FirstUseEver);
Expand Down Expand Up @@ -714,9 +728,7 @@ bool PCSX::GUI::configure() {
if (ImGui::CollapsingHeader(_("Advanced BIOS patching"))) {
auto& overlays = settings.get<Emulator::SettingBiosOverlay>();
if (ImGui::Button(_("Add one entry"))) overlays.push_back({});
m_overlayFileOffsets.resize(overlays.size());
m_overlayLoadOffsets.resize(overlays.size());
m_overlayLoadSizes.resize(overlays.size());
m_biosOverlays.resize(overlays.size());
int counter = 0;
int overlayToRemove = -1;
int swapMe = -1;
Expand All @@ -732,26 +744,98 @@ bool PCSX::GUI::configure() {
selectBiosOverlayDialog = true;
m_selectedBiosOverlayId = counter;
}
if (ImGui::InputText(_("File Offset"), &m_overlayFileOffsets[counter])) {
if (ImGui::InputText(_("File Offset"), &m_biosOverlays[counter].fileOffs)) {
char* endPtr;
uint32_t offset = strtoul(m_biosOverlays[counter].fileOffs.c_str(), &endPtr, 0);
if (!m_biosOverlays[counter].fileOffs.empty() && !*endPtr) {
overlay.get<Emulator::OverlaySetting::FileOffset>().value = offset;
changed = true;
}
}
if (ImGui::InputText(_("Load Offset"), &m_biosOverlays[counter].loadOffs)) {
char* endPtr;
uint32_t offset = strtoul(m_biosOverlays[counter].loadOffs.c_str(), &endPtr, 0);
if (!m_biosOverlays[counter].loadOffs.empty() && !*endPtr) {
overlay.get<Emulator::OverlaySetting::LoadOffset>().value = offset;
changed = true;
}
}
if (ImGui::InputText(_("Load Size"), &m_biosOverlays[counter].loadSize)) {
char* endPtr;
uint32_t size = strtoul(m_biosOverlays[counter].loadSize.c_str(), &endPtr, 0);
if (!m_biosOverlays[counter].loadSize.empty() && !*endPtr) {
overlay.get<Emulator::OverlaySetting::LoadSize>().value = size;
changed = true;
}
}
if (ImGui::Checkbox(_("Enabled"), &overlay.get<Emulator::OverlaySetting::Enabled>().value))
changed = true;
ImGui::SameLine();
if (ImGui::Button(_("Remove"))) {
overlayToRemove = counter;
}
ImGui::SameLine();
if (ImGui::Button(_("Move up"))) {
swapMe = counter - 1;
}
ImGui::SameLine();
if (ImGui::Button(_("Move down"))) {
swapMe = counter;
}
ImGui::EndChild();
counter++;
}
if (overlayToRemove >= 0) {
overlays.erase(overlays.begin() + overlayToRemove);
changed = true;
}
if ((swapMe >= 0) && (swapMe != (overlays.size() - 1))) {
std::iter_swap(overlays.begin() + swapMe, overlays.begin() + swapMe + 1);
std::iter_swap(m_biosOverlays.begin() + swapMe, m_biosOverlays.begin() + swapMe + 1);
changed = true;
}
}
if (ImGui::CollapsingHeader(_("Advanced Expansion 1 patching"))) {
auto& overlays = settings.get<Emulator::SettingExp1Overlay>();
if (ImGui::Button(_("Add one entry"))) overlays.push_back({});

m_exp1Overlays.resize(overlays.size());

int counter = 0;
int overlayToRemove = -1;
int swapMe = -1;
for (auto& overlay : overlays) {
std::string id = "overlay" + std::to_string(counter);
ImGui::BeginChild(id.c_str(), ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 7.0f), true);
auto overlayFilename = overlay.get<Emulator::OverlaySetting::Filename>().string();
ImGui::InputText(_("Filename"),
const_cast<char*>(reinterpret_cast<const char*>(overlayFilename.c_str())),
overlayFilename.length(), ImGuiInputTextFlags_ReadOnly);
ImGui::SameLine();
if (ImGui::Button("...")) {
selectExp1OverlayDialog = true;
m_selectedExp1OverlayId = counter;
}
if (ImGui::InputText(_("File Offset"), &m_exp1Overlays[counter].fileOffs)) {
char* endPtr;
uint32_t offset = strtoul(m_overlayFileOffsets[counter].c_str(), &endPtr, 0);
if (!m_overlayFileOffsets[counter].empty() && !*endPtr) {
uint32_t offset = strtoul(m_exp1Overlays[counter].fileOffs.c_str(), &endPtr, 0);
if (!m_exp1Overlays[counter].fileOffs.empty() && !*endPtr) {
overlay.get<Emulator::OverlaySetting::FileOffset>().value = offset;
changed = true;
}
}
if (ImGui::InputText(_("Load Offset"), &m_overlayLoadOffsets[counter])) {
if (ImGui::InputText(_("Load Offset"), &m_exp1Overlays[counter].loadOffs)) {
char* endPtr;
uint32_t offset = strtoul(m_overlayLoadOffsets[counter].c_str(), &endPtr, 0);
if (!m_overlayLoadOffsets[counter].empty() && !*endPtr) {
uint32_t offset = strtoul(m_exp1Overlays[counter].loadOffs.c_str(), &endPtr, 0);
if (!m_exp1Overlays[counter].loadOffs.empty() && !*endPtr) {
overlay.get<Emulator::OverlaySetting::LoadOffset>().value = offset;
changed = true;
}
}
if (ImGui::InputText(_("Load Size"), &m_overlayLoadSizes[counter])) {
if (ImGui::InputText(_("Load Size"), &m_exp1Overlays[counter].loadSize)) {
char* endPtr;
uint32_t size = strtoul(m_overlayLoadSizes[counter].c_str(), &endPtr, 0);
if (!m_overlayLoadSizes[counter].empty() && !*endPtr) {
uint32_t size = strtoul(m_exp1Overlays[counter].loadSize.c_str(), &endPtr, 0);
if (!m_exp1Overlays[counter].loadSize.empty() && !*endPtr) {
overlay.get<Emulator::OverlaySetting::LoadSize>().value = size;
changed = true;
}
Expand Down Expand Up @@ -779,9 +863,7 @@ bool PCSX::GUI::configure() {
}
if ((swapMe >= 0) && (swapMe != (overlays.size() - 1))) {
std::iter_swap(overlays.begin() + swapMe, overlays.begin() + swapMe + 1);
std::iter_swap(m_overlayFileOffsets.begin() + swapMe, m_overlayFileOffsets.begin() + swapMe + 1);
std::iter_swap(m_overlayLoadOffsets.begin() + swapMe, m_overlayLoadOffsets.begin() + swapMe + 1);
std::iter_swap(m_overlayLoadSizes.begin() + swapMe, m_overlayLoadSizes.begin() + swapMe + 1);
std::iter_swap(m_exp1Overlays.begin() + swapMe, m_exp1Overlays.begin() + swapMe + 1);
changed = true;
}
}
Expand All @@ -807,6 +889,18 @@ bool PCSX::GUI::configure() {
changed = true;
}
}

if (selectExp1OverlayDialog) m_selectExp1OverlayDialog.openDialog();
if (m_selectExp1OverlayDialog.draw()) {
std::vector<PCSX::u8string> fileToOpen = m_selectExp1OverlayDialog.selected();
if (!fileToOpen.empty()) {
settings.get<Emulator::SettingExp1Overlay>()[m_selectedExp1OverlayId]
.get<Emulator::OverlaySetting::Filename>()
.value = fileToOpen[0];
changed = true;
}
}

return changed;
}

Expand Down
17 changes: 14 additions & 3 deletions src/gui/gui.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@ struct GLFWwindow;

namespace PCSX {

typedef struct Overlay_st
{
std::string fileOffs;
std::string loadOffs;
std::string loadSize;
bool enabled;
} Overlay_t;


class GUI final {
public:
GUI(const flags::args &args) : m_args(args) {}
Expand Down Expand Up @@ -155,11 +164,13 @@ class GUI final {
Widgets::FileDialog m_openIsoFileDialog = {[]() { return _("Open Image"); }};
Widgets::FileDialog m_selectBiosDialog = {[]() { return _("Select BIOS"); }};
Widgets::FileDialog m_selectBiosOverlayDialog = {[]() { return _("Select BIOS Overlay"); }};
Widgets::FileDialog m_selectExp1OverlayDialog = {[]() { return _("Select Expansion 1 Overlay"); }};
int m_selectedBiosOverlayId;
int m_selectedExp1OverlayId;
Widgets::Breakpoints m_breakpoints;
std::vector<std::string> m_overlayFileOffsets;
std::vector<std::string> m_overlayLoadOffsets;
std::vector<std::string> m_overlayLoadSizes;

std::vector<Overlay_t> m_biosOverlays;
std::vector<Overlay_t> m_exp1Overlays;

bool m_showCfg = false;
bool &m_showBiosCounters = {settings.get<ShowBiosCounters>().value};
Expand Down
21 changes: 21 additions & 0 deletions src/gui/widgets/assembly.cc
Original file line number Diff line number Diff line change
Expand Up @@ -438,10 +438,12 @@ void PCSX::Widgets::Assembly::draw(psxRegisters* registers, Memory* memory, cons
float glyphWidth = ImGui::GetFontSize();

bool openSymbolsDialog = false;
bool openDumpDialog = false;

if (ImGui::BeginMenuBar()) {
if (ImGui::BeginMenu(_("File"))) {
openSymbolsDialog = ImGui::MenuItem(_("Load symbols map"));
openDumpDialog = ImGui::MenuItem(_("Dump memory"));
ImGui::EndMenu();
}
if (ImGui::BeginMenu(_("Debug"))) {
Expand Down Expand Up @@ -884,6 +886,7 @@ void PCSX::Widgets::Assembly::draw(psxRegisters* registers, Memory* memory, cons
// oh the irony
file.open(reinterpret_cast<const char *>(fileName.c_str()));
if (!file) continue;

while (!file.eof()) {
std::string addressString;
std::string name;
Expand All @@ -896,4 +899,22 @@ void PCSX::Widgets::Assembly::draw(psxRegisters* registers, Memory* memory, cons
}
}
}

uint32_t dump_addr = 0x00030000;
uint32_t dump_size = 0x000D0000;

if (openDumpDialog) m_dumpFileDialog.openDialog();
if (m_dumpFileDialog.draw()) {
std::vector<PCSX::u8string> filesToOpen = m_dumpFileDialog.selected();
for (auto fileName : filesToOpen) {
std::ofstream file;
file.open(reinterpret_cast<const char *>(fileName.c_str()), std::ios::binary);
if (!file) continue;
file.write(reinterpret_cast<const char*>(m_memory->g_psxM + dump_addr), dump_size);
file.close();
PCSX::g_system->message(_("Dumped 0x%08X-0x%08X to file \"%s\"\n"),
dump_addr, dump_addr + dump_size,
fileName.c_str());
}
}
}
Loading