diff --git a/src/core/bios.cpp b/src/core/bios.cpp index 33fee7a29..fe43ff7ba 100644 --- a/src/core/bios.cpp +++ b/src/core/bios.cpp @@ -168,11 +168,30 @@ bool PatchBIOSForEXE(Image& image, u32 r_pc, u32 r_gp, u32 r_sp, u32 r_fp) PatchBIOS(image, 0xBFC06FF4, UINT32_C(0x35080000) | (r_pc & UINT32_C(0xFFFF))); // ori $t0, $t0, (r_pc & 0xFFFF) PatchBIOS(image, 0xBFC06FF8, UINT32_C(0x3C1C0000) | r_gp >> 16); // lui $gp, (r_gp >> 16) PatchBIOS(image, 0xBFC06FFC, UINT32_C(0x379C0000) | (r_gp & UINT32_C(0xFFFF))); // ori $gp, $gp, (r_gp & 0xFFFF) - PatchBIOS(image, 0xBFC07000, UINT32_C(0x3C1D0000) | r_sp >> 16); // lui $sp, (r_sp >> 16) - PatchBIOS(image, 0xBFC07004, UINT32_C(0x37BD0000) | (r_sp & UINT32_C(0xFFFF))); // ori $sp, $sp, (r_sp & 0xFFFF) - PatchBIOS(image, 0xBFC07008, UINT32_C(0x3C1E0000) | r_fp >> 16); // lui $fp, (r_fp >> 16) - PatchBIOS(image, 0xBFC0700C, UINT32_C(0x01000008)); // jr $t0 - PatchBIOS(image, 0xBFC07010, UINT32_C(0x37DE0000) | (r_fp & UINT32_C(0xFFFF))); // ori $fp, $fp, (r_fp & 0xFFFF) + + if (r_sp != 0) + { + PatchBIOS(image, 0xBFC07000, UINT32_C(0x3C1D0000) | r_sp >> 16); // lui $sp, (r_sp >> 16) + PatchBIOS(image, 0xBFC07004, UINT32_C(0x37BD0000) | (r_sp & UINT32_C(0xFFFF))); // ori $sp, $sp, (r_sp & 0xFFFF) + } + else + { + PatchBIOS(image, 0xBFC07000, UINT32_C(0x00000000)); // nop + PatchBIOS(image, 0xBFC07004, UINT32_C(0x00000000)); // nop + } + if (r_fp != 0) + { + PatchBIOS(image, 0xBFC07008, UINT32_C(0x3C1E0000) | r_fp >> 16); // lui $fp, (r_fp >> 16) + PatchBIOS(image, 0xBFC0700C, UINT32_C(0x01000008)); // jr $t0 + PatchBIOS(image, 0xBFC07010, UINT32_C(0x37DE0000) | (r_fp & UINT32_C(0xFFFF))); // ori $fp, $fp, (r_fp & 0xFFFF) + } + else + { + PatchBIOS(image, 0xBFC07008, UINT32_C(0x00000000)); // nop + PatchBIOS(image, 0xBFC0700C, UINT32_C(0x01000008)); // jr $t0 + PatchBIOS(image, 0xBFC07010, UINT32_C(0x00000000)); // nop + } + return true; } diff --git a/src/core/system.cpp b/src/core/system.cpp index 6beef00e5..1e2617a81 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -386,9 +386,9 @@ bool System::LoadEXE(const char* filename, std::vector& bios_image) std::fclose(fp); // patch the BIOS to jump to the executable directly - const u32 r_pc = header.load_address; + const u32 r_pc = header.initial_pc; const u32 r_gp = header.initial_gp; - const u32 r_sp = header.initial_sp_base; + const u32 r_sp = header.initial_sp_base + header.initial_sp_offset; const u32 r_fp = header.initial_sp_base + header.initial_sp_offset; return BIOS::PatchBIOSForEXE(bios_image, r_pc, r_gp, r_sp, r_fp); }