mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-04-28 19:15:41 -04:00
System: Fix loading of EXEs with sp=0 (leave unchanged)
This commit is contained in:
parent
41404cad47
commit
cda2394287
@ -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, 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, 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, 0xBFC06FFC, UINT32_C(0x379C0000) | (r_gp & UINT32_C(0xFFFF))); // ori $gp, $gp, (r_gp & 0xFFFF)
|
||||||
|
|
||||||
|
if (r_sp != 0)
|
||||||
|
{
|
||||||
PatchBIOS(image, 0xBFC07000, UINT32_C(0x3C1D0000) | r_sp >> 16); // lui $sp, (r_sp >> 16)
|
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, 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, 0xBFC07008, UINT32_C(0x3C1E0000) | r_fp >> 16); // lui $fp, (r_fp >> 16)
|
||||||
PatchBIOS(image, 0xBFC0700C, UINT32_C(0x01000008)); // jr $t0
|
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)
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,9 +386,9 @@ bool System::LoadEXE(const char* filename, std::vector<u8>& bios_image)
|
|||||||
std::fclose(fp);
|
std::fclose(fp);
|
||||||
|
|
||||||
// patch the BIOS to jump to the executable directly
|
// 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_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;
|
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);
|
return BIOS::PatchBIOSForEXE(bios_image, r_pc, r_gp, r_sp, r_fp);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user