[SAVEVERSION+] VM struct changes.
- Serial/title is now linked to disc, instead of running ELF.
- Save states can be created during BIOS boot.
- Patches now apply based on the executing CRC, and only after the
entry point starts executing (fixes multi-game discs).
- Add "Fast Forward Boot" option.
- Split achievements download and activation, downloads occur on
initialization, but are not activated until after the ELF loads.
- Prevent HostFS access while in PS1 mode.
- Remove multiple sources of truth for ELF/CRC/etc.
- Move ELF state from global scope to VMManager.
- Prevent game fixes and hw fixes being active while booting game.
- Simplify game update.
- Flush recompilers after ELF loads. No point keeping boot code around
which gets overwritten.
Revert 3ce242886b (Disabled force symbol loading) until solution is found
If this isn't caught when the game is loaded, the symbols will not be properly loaded while the game is running.
DisassemblyManager: Don't spin continuously if the guest CPU is dead
Guest memory is now mapped into a shared memory/file mapping, for use
with fastmem.
64-bit and 128-bit arguments are passed by register/value instead of by
reference/address.
LDL/LDR/SDL/SDR now use 64-bit GPRs instead of SSE.
These have no meaning in x64 (apart from throwing compiler warnings),
and we don't do 32-bit anymore. Also saves needing to include
`Pcsx2Defs.h` in files which don't otherwise need it.
Now, IOP breakpoints work nice and reliably in both interpreter and
recompiler, exiting as soon as possible, without leaving the event state
indeterminate.
Previously, we would either throw an exception (ints), or longjmp out of
the recompiler when the execution state was checked. Unfortunately for
our stability, this happened at the end of the frame, just before it was
pushed to the GS, and in the middle of processing EE events (!).
Doing so not only meant that we executed a bunch of event
testing/exception code twice (once after we paused, again when we
resumed), but it also could potentially leave things in an inconsistent
state.
So instead, let's do it safely with a flag, replacing the old
iopBreakpoint flag, so there's no additional overhead on the hot path.
standardizeBreakpintAddress calls on the IOP just return the address unmodified. Considering this is called at least once every load / store instruction when there is an IOP OR EE memcheck enabled, it's pretty hot.
EE Interpreter: Link Unconditionally on Branch and Link instructions
-Link instructions used to store the return address if the branch was
taken, but the correct behaviour is to store the return address whether
or not the branch is taken.
* game is working :)
Note1: I dissassemble the main exe to search all call of the allocation (unlikely to have more calls)
Note2: it is easier to use the return of the function so allocation is done in the tlb[array] cache
Add GoemonUnloadTlb function that invalidate TLB cache.
Currently the function is only used on the interpreter. It fixes TLB error after a reload of data.
Next step: porting to the recompiler
Disable the debugger and an useless debugI function
* x2 on dbg build :)
* x2.5 on dev build :)
Note: debugger doesn't work yet with the interpreter so no real drawback.
memRead32 could throw a TLB miss exception, however TLB handler expects pc counter to be incremented
Goemon is now really "playable" with the interpreter (disable automatic gamefix)
When a tlb miss is detected current instruction must be skipped. We need
to immediately switch to the handler
Typical instruction bug case:
lw a0, 0x8(a0)
a0 mustn't be loaded if we have a miss
v2: create a dedicated exception for tlb miss
v3:
* rename exception to CancelInstruction
* add a basic state machine on the exec loop so we keep same behavior
for eeloadReplaceOSDSYS and eeGameStarting
v4: remove assert
Tlb mapping is stored @0x3d5580 (GoemonTlb[150])
The function that will populate the tlb is around pc = 0x356250, ra = 0x33ad48
The idea is to add a callback on 0x33ad48 block that will populate the tlb based on
ee mem content.
Note: The hack is based on previous Virtual PS2 => Physical PS2 LUT