Fix goofy ahh segfault

This commit is contained in:
SimoneN64
2023-06-05 21:07:28 +02:00
parent 32c66fdf5f
commit 93d7e202d2
3 changed files with 23 additions and 12 deletions

View File

@@ -10,10 +10,17 @@
#define MEMPAK_SIZE 32768 #define MEMPAK_SIZE 32768
namespace n64 { namespace n64 {
void PIF::LoadMempak(fs::path path) { PIF::PIF() {
if (mempak)
free(mempak);
mempak = (u8*)calloc(MEMPAK_SIZE, 1); mempak = (u8*)calloc(MEMPAK_SIZE, 1);
}
void PIF::Reset() {
memset(joybusDevices, 0, sizeof(JoybusDevice) * 6);
memset(bootrom, 0, PIF_BOOTROM_SIZE);
memset(ram, 0, PIF_RAM_SIZE);
}
void PIF::LoadMempak(fs::path path) {
mempakPath = path.replace_extension(".mempak").string(); mempakPath = path.replace_extension(".mempak").string();
FILE* f = fopen(mempakPath.c_str(), "rb"); FILE* f = fopen(mempakPath.c_str(), "rb");
if (!f) { if (!f) {
@@ -79,11 +86,15 @@ void PIF::LoadEeprom(SaveType saveType, fs::path path) {
PIF::~PIF() { PIF::~PIF() {
FILE* f = fopen(mempakPath.c_str(), "wb"); FILE* f = fopen(mempakPath.c_str(), "wb");
fwrite(mempak, 1, MEMPAK_SIZE, f); if(f) {
fclose(f); fwrite(mempak, 1, MEMPAK_SIZE, f);
fclose(f);
}
f = fopen(eepromPath.c_str(), "wb"); f = fopen(eepromPath.c_str(), "wb");
fwrite(eeprom, 1, eepromSize, f); if(f) {
fclose(f); fwrite(eeprom, 1, eepromSize, f);
fclose(f);
}
} }
enum CMDIndexes { enum CMDIndexes {

View File

@@ -91,7 +91,9 @@ enum CICType {
struct CartInfo; struct CartInfo;
struct PIF { struct PIF {
PIF();
~PIF(); ~PIF();
void Reset();
void LoadMempak(fs::path); void LoadMempak(fs::path);
void LoadEeprom(SaveType, fs::path); void LoadEeprom(SaveType, fs::path);
void ProcessCommands(Mem&); void ProcessCommands(Mem&);
@@ -115,13 +117,13 @@ struct PIF {
std::string mempakPath{}, eepromPath{}; std::string mempakPath{}, eepromPath{};
size_t eepromSize{}; size_t eepromSize{};
u8 Read(u32 addr) { FORCE_INLINE u8 Read(u32 addr) {
addr &= 0x7FF; addr &= 0x7FF;
if(addr < 0x7c0) return bootrom[addr]; if(addr < 0x7c0) return bootrom[addr];
return ram[addr & PIF_RAM_DSIZE]; return ram[addr & PIF_RAM_DSIZE];
} }
void Write(u32 addr, u8 val) { FORCE_INLINE void Write(u32 addr, u8 val) {
addr &= 0x7FF; addr &= 0x7FF;
if(addr < 0x7c0) return; if(addr < 0x7c0) return;
ram[addr & PIF_RAM_DSIZE] = val; ram[addr & PIF_RAM_DSIZE] = val;

View File

@@ -11,9 +11,7 @@ void SI::Reset() {
status.raw = 0; status.raw = 0;
dramAddr = 0; dramAddr = 0;
pifAddr = 0; pifAddr = 0;
memset(&pif.joybusDevices, 0, sizeof(JoybusDevice) * 6); pif.Reset();
memset(&pif.bootrom, 0, PIF_BOOTROM_SIZE);
memset(&pif.ram, 0, PIF_RAM_SIZE);
} }
auto SI::Read(MI& mi, u32 addr) const -> u32 { auto SI::Read(MI& mi, u32 addr) const -> u32 {