I got the game to "work" with a small hack, basically just ignore an exception and continue. The game can hang at random at any time and as you can see in the video I was quick to get past the main menu (with proper looking 3D graphics!).
You can sadly not skip the video that plays after starting a new game, the fade out effect causes some RSX error. Therefore each try at going in game will take about 8 minutes. And the LLVM recompiler doesn't work. But it can go in game, even for just a few seconds as seen in the screenshot below. A faster computer would probably help.
Use OpenGL. Vulkan looks worse than OpenGL and DX12 doesn't work at all, it will fail when reaching the main menu.
Video
A screenshot
Going in game for a few seconds
Settings
OpenGL 1280x720
PPU Decoder: Interpreter (fast)
SPU Decoder: Recompiler (ASMJIT)
XAudio
LLE (yes, it turns out you only need these)
Code:
libfiber.prx
librtc.prx
libspurs_jq.prx
libsre.prx
Log
Hacked build v4 with skippable new game video, no hanging, and a bit better performance.
https://mega.nz/#!g80nmAzJ!Us13wDDgXy3Bk...quuqh6cAKU
Changes made
In \Emu\Cell\PPUThread.cpp change:
Code:
if (context.gpr[1] < context.stack_addr)
{
fmt::throw_exception("Stack overflow (size=0x%x, align=0x%x, SP=0x%llx, stack=*0x%x)" HERE, size, align_v, old_pos, context.stack_addr);
}
else
{
const u32 addr = static_cast<u32>(context.gpr[1]);
vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
std::memset(vm::base(addr), 0, size);
return addr;
}
Into:
Code:
const u32 addr = static_cast<u32>(context.gpr[1]);
vm::ps3::_ref<nse_t<u32>>(addr + size) = old_pos;
std::memset(vm::base(addr), 0, size);
return addr;
(Someone please explain the rationale behind that if-condition, the contents of gpr1 is a
much lower address than stack_addr but the game runs regardless... This error happens right when “CRI FS File Access 0” is created, so it's not something unimportant we are ignoring here. Edit: It actually also happens for like 10 other threads too...)