Editing PSP Emulation
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
=='''PSPHD'''== | =='''PSPHD'''== | ||
The new | <pre>The new ps plus psp emulator has a lot of undiscovered functionality. it even allows patches directly to the Allegrex cpu. | ||
Sadly sony has not made it easy for users to use CLI commands, since sony mostly uses lua patches. that has led to many cli command becoming redundant. very few commands have a description to their usage inside of the eboot.bin. everything else is just guesswork from the scene. The psp emulator has not gained the same popularity as the ps2 emulator since currently there is an unofficial PPSSPP core in the unofficial retroarch port. and as far as the compatibility and performance goes. the retroarch core is second to no one. But this emulator contains great potential. though sadly it does not seem to have support for gamedata installation. and that has lead to many games becoming currently unusable. with an official retroarch release coming our way it seems delving deeper into the PSPHD emulator and the PS1's new psplus emulator is pretty useless.</pre> | |||
== Commands == | == Commands == | ||
'''Known functions:''' Require cleanup. | '''Known functions:''' Require cleanup. | ||
<br>The rest of the cli and lua commands can all be found inside of an emu's decrypted '''eboot.bin'''. | <br>The rest of the cli and lua commands can all be found inside of an emu's decrypted '''eboot.bin'''. | ||
=== | === config-emu-ps4.txt commands === | ||
''General purpose CLI commands, or unknown usage'' | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | {| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | ||
! Command !! Values !! Notes !! Usage | ! Command !! Values !! Notes !! Usage | ||
|- | |- | ||
| --boot || || Set directory of psp game's boot.bin || [disc0:/PSP_GAME/SYSDIR/BOOT.BIN] | | --boot || || Set directory of psp game's boot.bin || [disc0:/PSP_GAME/SYSDIR/BOOT.BIN] | ||
|- | |- | ||
| --notrophies || || Enable/disable trophies|| | | --notrophies || || Enable/disable trophies|| | ||
|- | |- | ||
| --locale || || || | | --locale || || || | ||
Line 29: | Line 23: | ||
| --addon || || || | | --addon || || || | ||
|- | |- | ||
| --host || Sets host directory || --host="/hostapp/" | | --host || || Sets host directory || --host="/hostapp/" | ||
|- | |- | ||
| --loglevel || none, all, warn, info, error, debug, trace || debug logging | | --loglevel || none, all, warn, info, error, debug, trace || debug logging | ||
|- | |- | ||
| --xobuttonmode || oenter, ocancel || Switcher between x and circle button, made specifically for japanese gamers | | --xobuttonmode || oenter, ocancel || Switcher between x and circle button, made specifically for japanese gamers | ||
|- | |- | ||
| --lang || Including but not limited to "en" "jp" "fr" "it" || Language selector || --lang="en" | | --lang || Including but not limited to "en" "jp" "fr" "it" || Language selector || --lang="en" | ||
Line 44: | Line 38: | ||
|- | |- | ||
| --samplesave || ? || ? || | | --samplesave || ? || ? || | ||
|- | |- | ||
| -- | | --vramcopyback || 0, 10000000 || || --vramcopyback=45 | ||
|- | |- | ||
| -- | | --msxxadhoc || true?, false? || ad hoc support ? || | ||
|- | |- | ||
| -- | |} | ||
====Graphics==== | |||
''Commands that serve the purpose of improving / fixing graphics and textures'' | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Command !! Values !! Notes !! Usage | |||
|- | |||
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) || | |||
|- | |- | ||
| -- | | --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off | ||
|- | |- | ||
| -- | | --clamp-line-thickness-min || ? || ? || | ||
|- | |- | ||
| -- | | --clamp-line-thickness-max || ? || ? || | ||
|- | |- | ||
| -- | | --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Seems to be a selector of texture caching method|| --texcachemode=patchworkheroes | ||
|- | |- | ||
| -- | | --texclutmode || filter, full || || --texclutmode=full | ||
|- | |- | ||
| -- | | --texloadmode || launch, ondemand_lz4 || Seems to be a selector of when to load textures, either before the game requires it, or once the game requires it || | ||
|- | |- | ||
| --texloadcores || 0, 100 || textures to load || texloadcores=2 | | --texloadcores || 0, 100 || textures to load || texloadcores=2 | ||
Line 79: | Line 71: | ||
| --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true | | --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true | ||
|- | |- | ||
| -- | | --depthscalehack || true?, false? || ||--depthscalehack=true | ||
|- | |- | ||
| -- | | --locorocomeshsmooth || true, false || Custom mesh smoothing for loco roco games|| --locorocomeshsmooth=true | ||
|- | |- | ||
| -- | | --locorocomeshsmoothnonindexed || true, false || Non-indexed mesh smoothing ||--locorocomeshsmoothnonindexed=true | ||
|- | |- | ||
| -- | | --forcenobilinear || true, false || Turn bilinear filtering on/off, setting it to True will fix many graphical glitches in games that use 2D Images ||--forcenobilinear=true | ||
|- | |- | ||
| | |} | ||
|- | |||
| --umddelay || ? || Seems to be I/O timing method. | ==== Gamefixes / Hacks ==== | ||
''Commands that serve the purpose of fixing broken games'' | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Command !! Values !! Notes !! Usage | |||
|- | |||
| --umddelay || ? || Seems to be I/O timing method, Some games need a delay to work properly. [https://github.com/hrydgard/ppsspp/issues/7647 More here] || | |||
|- | |- | ||
| -- | | --depthscalehack || true?, false? || ||--depthscalehack=true | ||
|- | |- | ||
|- | | --godofwarhack || true?, false? || Seems specifically made for god of war, unknown effect || --godofwarhack=true | ||
| | |- | ||
| --parappaalphahack || true?, false? || || --parappaalphahack=true | |||
|- | |||
|} | |||
==== Speedhacks ==== | |||
''Commands that imrpove the game's performance, it can contain duplicate commands'' | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Command !! Values !! Notes !! Usage | |||
|- | |- | ||
| --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off | | --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off | ||
Line 104: | Line 109: | ||
| --smoothlevel || 0 || Set mesh smooth level||--smoothlevel=0 | | --smoothlevel || 0 || Set mesh smooth level||--smoothlevel=0 | ||
|- | |- | ||
| --gputhread || true, false || | | --gputhread || true, false || Run the PSP GPU on a separate thread || --gputhread=true | ||
|- | |- | ||
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Set texture caching method ||--texcachemode=patchworkheroes | | --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Set texture caching method ||--texcachemode=patchworkheroes | ||
Line 110: | Line 115: | ||
| --anisolevel || 0, 100 || Anisotropic filtering level?? || | | --anisolevel || 0, 100 || Anisotropic filtering level?? || | ||
|- | |- | ||
| --present || vblankstart, setframebuf, drawsync|| | | --present || vblankstart, setframebuf, drawsync|| Display on draw to reduce latency ||--present=setframebuf | ||
|- | |- | ||
| --texrecent || true || Optimize texture hashes ||--texrecent=true | | --texrecent || true || Optimize texture hashes ||--texrecent=true | ||
|} | |} | ||
==== | |||
====Texture replacement==== | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | {| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | ||
! Command !! Values !! Notes !! Usage | ! Command !! Values !! Notes !! Usage | ||
|- | |- | ||
| -- | | --texswitch||true, false|| Enables Texture replacement || --texswitch=true | ||
|- | |- | ||
| -- | | --texsave || || || | ||
|- | |- | ||
| -- | | --texmissingsave || || || | ||
|- | |- | ||
| -- | | --autoresampler || true, false|| Turns on the auto-resampler. Assumes textures in texreplace are at 8x resolution and resamples them at load, May only work on new LocoRoco Midnight Carnival emu || --autoresampler=true | ||
|- | |- | ||
| -- | | --texreplace || Directory || Set directory of texture replacement folder || --texreplace="host0:texreplace" | ||
|- | |- | ||
| -- | | --replacementfilter || true, false || This forces alpha blending to on for replaced textures. || --replacementfilter=true | ||
|- | |- | ||
| -- | | --replacementalpha || true, false || || --replacementalpha=true | ||
|- | |- | ||
| -- | |} | ||
===XXXXYYYYY_patches.lua=== | |||
Your lua can be placed as '''Image0\Patches\XXXXYYYYY\XXXXYYYYY_patches.lua''' | |||
<br>'''Requires Cleanup'''. | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Command !! Usage !! Notes - Example | |||
|- | |- | ||
| | | apiRequest || '''apiRequest(<api version>)''' || example: apiRequest(0.1) | ||
Calling api is mandatory. some commands require higher versions. | |||
|- | |- | ||
| | ====Emulator commands==== | ||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Command !! Usage !! Notes - Example | |||
|- | |- | ||
| | |getEmuObject || '''local emuObj = getEmuObject()''' || Required for all functions using emuObj | ||
|- | |- | ||
| | | AddVsyncHook ||emuObj.AddVsyncHook()|| Set function to be done on every vsync | ||
|- | |- | ||
| | | RemoveVsyncHook ||emuObj.RemoveVsyncHook()|| Remove vsynchook | ||
|- | |- | ||
| | | AddBootHook ||emuObj.AddBootHook()|| Set function to be done when the game boots up | ||
|- | |- | ||
| | |RemoveBootHook||emuObj.RemoveBootHook()|| remove function to be done when the game boots up | ||
|- | |- | ||
| | |PadRead || emuObj.PadRead() || | ||
|- | |- | ||
| | |PadReadPitch || emuObj.PadReadPitch() || | ||
|- | |- | ||
| | |PadReadRoll || emuObj.PadReadRoll()|| | ||
|- | |- | ||
| | |PadRegisterSamples || emuObj.PadRegisterSamples()|| | ||
|- | |- | ||
| | |LoadSlideshow ||emuObj.LoadSlideshow()|| | ||
|- | |- | ||
|StartSlideshow ||emuObj.StartSlideshow()|| | |||
|StartSlideshow ||emuObj.StartSlideshow()|| | |||
|- | |- | ||
|Log ||emuObj.Log()|| | |Log ||emuObj.Log()|| | ||
Line 203: | Line 199: | ||
| SaveState ||emuObj.SaveState()|| | | SaveState ||emuObj.SaveState()|| | ||
|- | |- | ||
| SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| | | SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| | ||
|- | |- | ||
| MeshSmooth ||emuObj.MeshSmooth()|| | | MeshSmooth ||emuObj.MeshSmooth()|| | ||
Line 236: | Line 232: | ||
|- | |- | ||
| PlayVideo||emuObj.PlayVideo()|| | | PlayVideo||emuObj.PlayVideo()|| | ||
|- | |||
| AddGPUHook ||emuObj.AddGPUHook()|| | |||
|- | |- | ||
| RescaleUForUpscale ||emuObj.RescaleUForUpscale()|| | | RescaleUForUpscale ||emuObj.RescaleUForUpscale()|| | ||
Line 248: | Line 246: | ||
|- | |- | ||
| OverrideFBSize||emuObj.OverrideFBSize()|| Override framebuffer size ? | | OverrideFBSize||emuObj.OverrideFBSize()|| Override framebuffer size ? | ||
|- | |||
| PadSetButtonsMode || emuObj.PadSetButtonsMode() || emuObj.PadSetButtonsMode(pad.BUTTONS_MODE_OPTION_IS_SELECT) | |||
|- | |- | ||
|RemapSavedata || emuObj.RemapSavedata() ||emuObj.RemapSavedata("UCUS98711", "CUSA06171", "504e802b04a1838c32b616abbe0b475fbea1c823825ef0df06cc2bad129ce2f7") | |RemapSavedata || emuObj.RemapSavedata() ||emuObj.RemapSavedata("UCUS98711", "CUSA06171", "504e802b04a1838c32b616abbe0b475fbea1c823825ef0df06cc2bad129ce2f7") | ||
|- | |||
| PadVibrate|| emuObj.PadVibrate() || emuObj.PadVibrate(5,180,180) | |||
|- | |- | ||
| NeoMode || emuObj.NeoMode() || Checks whether or not the ps4 is pro | | NeoMode || emuObj.NeoMode() || Checks whether or not the ps4 is pro | ||
|- | |- | ||
| ThrottleMax || emuObj.ThrottleMax() || Disable framelimiter | | ThrottleMax || emuObj.ThrottleMax() || Disable framelimiter During loading screens, This setting can sometimes be harmful when used globally in config files. Loading times are faster, but the game also runs faster than it should when the PS4 has enough free cpu power. | ||
|- | |- | ||
| ThrottleFast|| emuObj.ThrottleFast() || Faster than default, but exact value is unknown. | | ThrottleFast|| emuObj.ThrottleFast() || Faster than default, but exact value is unknown. | ||
Line 272: | Line 274: | ||
|- | |- | ||
| CopyFB || emuObj.CopyFB() || | | CopyFB || emuObj.CopyFB() || | ||
|- | |- | ||
| | |} | ||
====Allegrex commands==== | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Command !! Usage !! Notes - Example | |||
|- | |- | ||
| | | getAXObject ||'''local axObj = getAXObject()''' || Required for all functions using AXObject | ||
|- | |- | ||
| | | AddHook || axObj.AddHook() || | ||
|- | |- | ||
| | | RemoveHook || axObj.RemoveHook() || | ||
|- | |- | ||
| | |SetPC|| axObj.SetPC() || | ||
|- | |- | ||
| | |GetPC|| axObj.GetPC() || | ||
|- | |- | ||
| | | ReadMem32 || axObj.ReadMem32() || Read 4 bytes from offset | ||
|- | |- | ||
| | | WriteMem32 || axObj.WriteMem32() || Write 4 bytes to offset | ||
|- | |- | ||
| | | ReadMem16 || axObj.ReadMem16() || Read 2 bytes from offset | ||
|- | |- | ||
| | | WriteMem16 || axObj.WriteMem16() || Write 2 bytes to offset | ||
|- | |- | ||
| | | ReadMem8 || axObj.ReadMem8() || Read 1 byte from offset | ||
|- | |- | ||
| | | WriteMem8 || axObj.WriteMem8() || Write 1 byte to offset | ||
|- | |- | ||
| | | ReadMemString || axObj.ReadMemString() || | ||
|- | |- | ||
| | | WriteMemString || axObj.WriteMemString() || | ||
|- | |- | ||
| | | WriteMemStr16 || axObj.WriteMemStr16() || | ||
|- | |||
|WriteMemStr16Z ||axObj.WriteMemStr16Z() || | |||
|- | |||
| WriteMemStringZ ||axobj.WriteMemStringZ || | |||
|- | |- | ||
| | |ReadMemFloat || axObj.ReadMemFloat() || | ||
|- | |- | ||
| | |WriteMemFloat || axObj.WriteMemFloat() || | ||
|- | |- | ||
| BurnCycles|| axobj.BurnCycles() || Could be an option to overclock cpu at a hooked offset | | BurnCycles|| axobj.BurnCycles() || Could be an option to overclock cpu at a hooked offset | ||
Line 339: | Line 321: | ||
|- | |- | ||
|Overlay ||axObj.Overlay()|| | |Overlay ||axObj.Overlay()|| | ||
|- | |- | ||
| gpr require || '''local gpr = require("ax-gpr-alias")''' || Required for any command that includes gpr registers | | gpr require || '''local gpr = require("ax-gpr-alias")''' || Required for any command that includes gpr registers | ||
|- | |- | ||
| GetGpr || axObj.GetGpr() || | | GetGpr || axObj.GetGpr() || | ||
Line 367: | Line 343: | ||
|- | |- | ||
|GetReg||axObj.GetReg()|| | |GetReg||axObj.GetReg()|| | ||
|- | |- | ||
! !! Other/Unknown/Standalone Commands !! | |||
|- | |- | ||
| | |FuncReplace || axFuncReplace() || axFuncReplace(0x8804670, "__ptmf_scall") Replace allegrex function. | ||
|- | |- | ||
| | | InsnReplace || axInsnReplace() || Replace allegrex memory | ||
|- | |- | ||
| | |} | ||
=====Examples===== | |||
======User made lua====== | |||
''A custom lua made by a user'' | |||
<pre> | |||
apiRequest(0.1) | |||
local axObj = getAXObject() | |||
local emuObj = getEmuObject() | |||
local patcher = function() | |||
axobj.WriteMem32(0x0053d5d4,0x21c828bd) | |||
end | |||
emuObj.AddVsyncHook(patcher) | |||
</pre> | |||
======Patches.lua====== | |||
'''An official lua created by sony for Patapon 2''' | |||
<pre> | |||
-- Lua 5.3 | |||
-- Title: Patapon 2 PSP - UCUS-98732 (USA) | |||
apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory. | |||
local gpr = require( "ax-gpr-alias" ) -- you can access Allegrex GPR by alias (gpr.a0 / gpr["a0"]) | |||
local emuObj = getEmuObject() -- emulator | |||
local axObj = getAXObject() -- allegrex | |||
local pad = require("pad") | |||
-- Hook memcpy to catch framebuffer effects | |||
axFuncReplace(0x881D194, "patapon_memcpy") | |||
-- Accelerate some functions | |||
-- | axFuncReplace(0x8804670, "__ptmf_scall") | ||
axFuncReplace(0x8892230, "Renderer__makeWorldMatrix__4psysFv") | |||
axFuncReplace(0x88209A8, "patapon_strcmp") | |||
axFuncReplace(0x8815130, "sceGupSetStatus") | |||
axFuncReplace(0x8851D84, "FMtx44__setRow__3PydFv") | |||
axFuncReplace(0x88437F0, "Script__Talk__Controller__setDeltaTime__3PydFv") | |||
axFuncReplace(0x8843B6C, "Script__Talk__Controller__setCmdId__3PydFv") | |||
axFuncReplace(0x88441DC, "Script__Talk__Controller__getArgValuePtr__3PydFv_0") | |||
axFuncReplace(0x89B25B0, "sceGmoCol4Multiply") | |||
axFuncReplace(0x8910A60, "Gfx__CacheModel__getNodeMtx__6SystemFv") | |||
axFuncReplace(0x8911440, "Gfx__StaticGmoModel__getNodeIdx__6SystemFv") | |||
axFuncReplace(0x89114C8, "Gfx__StaticGmoModel__getNodeMtx__6SystemFv") | |||
axFuncReplace(0x891157C, "Gfx__StaticGmoModel__getNodeMtx__6SystemFv_0") | |||
axFuncReplace(0x881462C, "sceGuEnable", 0x8B3C050) -- param = gupbase pointer | |||
axFuncReplace(0x8814684, "sceGuDisable", 0x8B3C050) -- param = gupbase pointer | |||
axFuncReplace(0x89B2D84, "sceGmoFCurveEval_fastpath", 0x89B2D88) -- param = function entry if not fast path | |||
--axFuncReplace(0x88D0788, "Game__Map__Weather__WindLocus__update__4LaboFv_loop", 0x88D0864) -- param = continue address | |||
axFuncReplace(0x890FCBC, "convertLowerString__6SystemFv") | |||
axFuncReplace(0x8877104, "convertLowerString__6SystemFv") -- convertLowerString__21@unnamed@BNDFile_cpp@Fv, same functionality | |||
axFuncReplace(0x897927C, "__extendsfdf2") | |||
axFuncReplace(0x8979AF8, "__muldf3") | |||
axFuncReplace(0x8979A8C, "__adddf3") | |||
axFuncReplace(0x897A750, "__truncdfsf2") | |||
axFuncReplace(0x88CBD64, "RemapPacket", 0x8ACC394) -- param comes from RemapPacketAddr24 & RemapPacketAddr16 | |||
axFuncReplace(0x890FEA0, "patapon_strcmp") -- strcmpFast__6SystemFv ('fast' strcmp) | |||
-- Switch Select command to "Options" button. | |||
emuObj.PadSetButtonsMode(pad.BUTTONS_MODE_OPTION_IS_SELECT) | |||
-- Remove "Transfer Patapon Saved Data" option from New Game option | |||
-- | --axInsnReplace(0x8A46660, 0x24070002, 0x24070001) -- li a3,0x2 (change 2 menu options to 1) | ||
-- | emuObj.RemapSavedata("UCUS98711", "CUSA06171", "504e802b04a1838c32b616abbe0b475fbea1c823825ef0df06cc2bad129ce2f7") | ||
-- | -- Fix "Tree of Life" unaligned lines and shadows | ||
axObj.AddHook(0x884600C, 0x8c850010, function() -- PSP::Gfx::PrimitiveContext::setVertex2f | |||
local context = axObj.GetGpr(gpr.a0) | |||
local cmdCount = axObj.ReadMem32(context + 0x14) | |||
if (cmdCount & 1) == 1 then -- we have at least 2 commands | |||
local cmdBuffer = axObj.ReadMem32(context + 0x10) | |||
local cx = axObj.GetFpr(12) | |||
local cy = axObj.GetFpr(13) | |||
local ox = axObj.ReadMemFloat(cmdBuffer-12) | |||
local oy = axObj.ReadMemFloat(cmdBuffer-8) | |||
if cx == ox then | |||
axObj.SetFpr(12, cx + 0.5) | |||
axObj.WriteMemFloat(cmdBuffer-12, ox + 0.5) | |||
elseif cy == oy then | |||
axObj.SetFpr(13, cy + 0.5) | |||
axObj.WriteMemFloat(cmdBuffer-8, oy + 0.5) | |||
end | |||
end | |||
end) | |||
-- LANGUAGES -- | |||
local langCode = "us" -- default | |||
--local languageList = {"Japanese","English","UK","Italian","German","Spanish","French","Korean","Chinese","ns","nf","Dutch","Portuguese","gr","Belgium"} | |||
--local gameLanguageCode = {"jp","us","uk","it","de","sp","fr","kr","cn","ns","nf","nl","pt","gr","be"} | |||
local languageList = {"","English","","","","","","","","Spanish","French","","","",""} | |||
local gameLanguageCode = {"","us","","","","","","","","ns","nf","","","",""} | |||
-- US: english = 1, spanish = 9, french = 0xA (from Localize__Manager__setDefaultLangage) | |||
-- EU: uk = 2, italian = 3, german = 4, spanish = 5, french = 6 | |||
-- JP: jp = 0 | |||
-- HP: ko = 7, ch = 8, | |||
-- GLOBAL FUNCTIONS -- | |||
-- | local GLOBAL = 0x8B7D088 -- reawakeDeathUnit - offset 0x88A95E8 in $v1 | ||
function | function getGlobalAddr() -- gets Global to user data. | ||
-- address comes from: Labo::Bases::Camp::Controller::reawakeDeathUnit - offset 0x88A95E8 in $v1 | |||
-- add 0x20 to address to align it with the word "none" | |||
local main = axObj.ReadMem32(GLOBAL) -- fixed Global address from: 0x88A95E8 -> 0x8c9fbc0 | |||
if main == 0xFFFFFFFF or main == 0 then | |||
return 0xFFFFFFFF | |||
end | |||
local ptr = axObj.ReadMem32(main + 0x10c0) --> sets to: 0x8d07840 | |||
if ptr == 0xFFFFFFFF or ptr == 0 then | |||
return 0xFFFFFFFF | |||
end | |||
-- the | return ptr | ||
-- | |||
end | end | ||
-- MAIN FUNCTIONS -- | |||
- | |||
local H1 = function() -- Labo::Bases::Camp::Scene::updateTips | |||
local v0 = axObj.GetGpr(gpr.v0) | |||
if v0 > 0 then | |||
emuObj.ThrottleMax() | |||
else | |||
emuObj.ThrottleNormal() | |||
end | |||
end | |||
local | local H2 = function() -- GameSystem__SaveDataController__setStateMessage | ||
local | local ptr = axObj.GetGpr(gpr.a2) | ||
local str = axObj.ReadMemStr16(ptr) | |||
local newStr = "Now loading. Do not turn off the power." | |||
-- english: Now loading./Do not remove the Memory Stick Duo™ /or turn off the system power. | |||
-- | -- spanish: Cargando./No extraigas el Memory Stick Duo™ /ni apagues el sistema. | ||
-- french: Chargement./Ne pas retirer le Memory Stick Duo™ /ou éteindre le système. | |||
-- italian: Caricamento in corso.../Non rimuovere il Memory Stick Duo™ /e non spegnere il sistema. | |||
-- | -- german: Lädt./Bitte den Memory Stick Duo™ nicht entfernen /und das System nicht ausschalten. | ||
-- japanese: システムデータをロード中です。/Memory Stick Duo™を抜き挿ししたり、/電源を切ったりしないでください。 | |||
-- chinese: 系統資料載入中。/請勿插拔Memory Stick Duo™/或是關閉主機的電源。 | |||
-- korean: 시스템 데이터를 불러오는 중입니다./Memory Stick Duo™를 빼거나/전원을 끄지 마십시오. | |||
if string.find(str, "Now loading") then | |||
newStr = "Now loading." -- English: Now loading./Do not remove the Memory Stick Duo™ /or turn off the system power. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Checking Memory Stick") then | |||
newStr = "Please wait." -- English: Checking Memory Stick Duo™. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Now saving")then | |||
newStr = "Now saving." -- English: Now saving./Do not remove the Memory Stick Duo™ /or turn off the system power. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | |||
elseif string.find(str, "Cargando.") then | |||
newStr = "Cargando..." -- Spanish: Cargando./No extraigas el Memory Stick Duo™ /ni apagues el sistema. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Guardando...")then | |||
newStr = "Espera..." -- Spanish: Guardando.../No extraigas el Memory Stick Duo™ /ni apagues el sistema. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Comprobando el Memory Stick") then | |||
newStr = "Guardando..." -- Spanish: Comprobando el Memory Stick Duo™. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | |||
elseif string.find(str, "Chargement.") then | |||
newStr = "Chargement." -- French: Chargement./Ne pas retirer le Memory Stick Duo™ /ou éteindre le système. | |||
-- | axObj.WriteMemStr16Z(ptr, newStr) | ||
elseif string.find(str, "Vérification du Memory Stick")then | |||
newStr = "Veuillez patienter." -- French: Vérification du Memory Stick Duo™. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | elseif string.find(str, "Sauvegarde.") then | ||
newStr = "Sauvegarde en cours." -- French: Sauvegarde./Ne pas retirer le Memory Stick Duo™ /ou éteindre le système. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | -- | ||
axObj. | elseif string.find(str, "Caricamento in corso") then | ||
newStr = "Caricamento in corso." -- Italian: Caricamento in corso.../Non rimuovere il Memory Stick Duo™ /e non spegnere il sistema. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Controllo del Memory Stick")then | |||
newStr = "Attendi." -- Italian: Controllo del Memory Stick Duo™. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Salvataggio in corso") then | |||
newStr = "Salvataggio in corso." -- Italian: Salvataggio in corso.../Non rimuovere il Memory Stick Duo™ /e non spegnere il sistema. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | |||
elseif string.find(str, "Lädt") then | |||
newStr = "Lädt." -- German: Lädt./Bitte den Memory Stick Duo™ nicht entfernen /und das System nicht ausschalten. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Memory Stick Duo™ wird überprüft")then | |||
newStr = "Bitte warten." -- German: Memory Stick Duo™ wird überprüft. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Speichert.") then | |||
newStr = "Speichert." -- German: Speichert./Bitte den Memory Stick Duo™ nicht entfernen und /das System nicht ausschalten. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | |||
elseif string.find(str, "システムデータをロード中です。") then | |||
newStr = "ロード中。" -- Japanese: システムデータをロード中です。/Memory Stick Duo™を抜き挿ししたり、/電源を切ったりしないでください。 | |||
-- | axObj.WriteMemStr16Z(ptr, newStr) | ||
-- | elseif string.find(str, "Memory Stick Duo™のチェック中です。")then | ||
newStr = "お待ちください。" -- Japanese: Memory Stick Duo™のチェック中です。 | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "システムデータをセーブ中です。") then | |||
-- | newStr = "セーブ中。" -- Japanese: システムデータをセーブ中です。/Memory Stick Duo™を抜き挿ししたり、/電源を切ったりしないでください。 | ||
-- | axObj.WriteMemStr16Z(ptr, newStr) | ||
-- | -- | ||
elseif string.find(str, "系統資料載入中。") then | |||
newStr = "載入中。" -- Chinese: 系統資料載入中。/請勿插拔Memory Stick Duo™/或是關閉主機的電源。 | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Memory Stick Duo™確認中。")then | |||
newStr = "請稍候。" -- Chinese: Memory Stick Duo™確認中。 | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "保存中。") then | |||
newStr = "存檔中。" -- Chinese: 保存中。/請勿插拔Memory Stick Duo™/或是關閉主機的電源。 | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
-- | |||
elseif string.find(str, "시스템 데이터를 불러오는 중입니다") then | |||
newStr = "불러오는 중입니다." -- Korean: 시스템 데이터를 불러오는 중입니다./Memory Stick Duo™를 빼거나/전원을 끄지 마십시오. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "Memory Stick Duo™ 체크 중입니다")then | |||
newStr = "잠시 기다려 주십시오." -- Korean: Memory Stick Duo™ 체크 중입니다. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
elseif string.find(str, "시스템 데이터를 저장 중입니다") then | |||
newStr = "저장 중입니다." -- Korean: 시스템 데이터를 저장 중입니다./Memory Stick Duo™를 빼거나,/전원을 끄지 마십시오. | |||
axObj.WriteMemStr16Z(ptr, newStr) | |||
end | end | ||
end | end | ||
-- | local H3 = function() -- Localize__Manager__getLanguageName | ||
local v0 = axObj.GetGpr(gpr.v0) | |||
local langPtr = axObj.ReadMem32(v0) | |||
langCode = axObj.ReadMemStr(langPtr) | |||
end | |||
local bundleFileName = "" | |||
local H4 = function() -- System::Util__BNDFile__doNameCallback | |||
local ptr = axObj.GetGpr(gpr.a0) | |||
bundleFileName = axObj.ReadMemStr(ptr) | |||
end | |||
local | local H5 = function() -- Labo::GameSystem__callbackFunc_MemoryObject | ||
local | local ptr = axObj.GetGpr(gpr.s5) | ||
local dataPtr = axObj.ReadMem32(ptr) | |||
if bundleFileName == "colony_data.pac" then | |||
axObj.WriteMem16(dataPtr + 0x79ba, 4) | |||
end | end | ||
end | end | ||
local | -- Black Smith - Remove "KeyGuide" bug when hit anvil head while quenching -- | ||
local blackSmithRunning = false | |||
local H6 = function() -- Sound__SubGame__Blacksmith__Command__start__4LaboFv | |||
blackSmithRunning = true | |||
end | |||
local H7 = function() -- Sound__BeatCommander__endSubGame__4LaboFv | |||
if blackSmithRunning == true then | |||
local a0 = axObj.GetGpr(gpr.a0) | |||
axObj.WriteMem8(a0 + 0x19c, 1) -- set memory to 1 (instead of 0) otherwise brings up bad "KeyGuide" | |||
end | |||
blackSmithRunning = false | |||
end | |||
-- TIPS System hacks -- | |||
axInsnReplace(0x8A73A44, 0x3C0342A8, 0x3C0342A4) -- change required number of Tips from 84 to 82. | |||
local H8 = function() -- GameSystem__Tips__Viewer__setup__4LaboFv | |||
local global = getGlobalAddr() | |||
if global == 0xFFFFFFFF then | |||
return | |||
end | |||
local unitTable = axObj.ReadMem32(global + 0x1068) --> sets to: 0x8d13580 (unit table) | |||
local tipsPtr = unitTable + 0x1F5E4 | |||
local badTips = axObj.ReadMem32(tipsPtr + 8) | |||
badTips = badTips & 0xFFBBFFFF -- remove tips 0x53 and 0x57 as they referred to Multiplayer | |||
axObj.WriteMem32(tipsPtr + 8, badTips) | |||
end | |||
-- | -- Remove AutoSave menu from initial startup -- | ||
local H9 = function() -- GameSystem__SaveDataController__update__4LaboFv | |||
local s3 = axObj.GetGpr(gpr.s3) | |||
local flg = axObj.ReadMem32(s3 + 0x7eed) | |||
local val = axObj.ReadMem32(s3 + 0x7efc) | |||
axObj. | if flg == 0 and val == 0x14 then | ||
axObj.WriteMem32(s3 + 0x7efc, 0x13) | |||
end | |||
end | |||
-- | |||
-- Change game save name to "Patapon 2 Remastered" -- | |||
local H10 = function() -- Utility__SaveDataUtility__setDataParamsfoString | |||
local ptr = axObj.GetGpr(gpr.s1) | |||
local strPtr = axObj.ReadMem32(ptr) | |||
local newStr = "PATAPON™ 2 Remastered" | |||
axObj.WriteMemStrZ(strPtr, newStr) | |||
end | |||
-- | -- Change description for the "Friendship" weapon to remove game sharing text -- | ||
local itemsTable = {} | |||
itemsTable[1] = "Proof of friendship establish" -- English | |||
itemsTable[2] = "Prueba de la amistad establecida" -- Spanish | |||
itemsTable[3] = "Preuve de l'amitié établie" -- French | |||
itemsTable[4] = "Preuve d'une amitié" -- French alt | |||
function changeStrings(strPtr) -- modify strings | |||
local str = axObj.ReadMemStr16(strPtr) -- ptr to the string | |||
local strFind = string.gsub(str, "/", " ") -- change any slash to space to strings can match. | |||
-- | strFind = string.gsub(strFind, " ", " ") -- change any double spaces due to above change to only 1 space. | ||
for i = 1, #itemsTable do | |||
local startPos, endPos = string.find(strFind, itemsTable[i]) | |||
if startPos ~= nil then | |||
str = string.sub(str, 1, (startPos-1) ) | |||
-- SPECIAL fixes -- | |||
str = string.gsub(str, "Un oiseau avec de bons HP et /une grosse attaque.","Un oiseau qui augmente vos/HP.") -- French incorrect grammar (bird) | |||
str = string.gsub(str, "aumente","augmente") -- French incorrect grammar. | |||
-- | |||
axObj.WriteMemStr16Z(strPtr, str) | |||
end | |||
end | |||
end | |||
local H11 = function() -- from Bases__Item__ExplanationWindow__setItemId | |||
local ptr = axObj.GetGpr(gpr.a0) | |||
local a2 = axObj.GetGpr(gpr.a2) | |||
local valPtr = axObj.ReadMem32(ptr) | |||
-- | local v1 = valPtr + 8 | ||
local v0 = a2 * 4 | |||
v0 = v0 + v1 | |||
local strPtr = axObj.ReadMem32(v0) | |||
strPtr = strPtr + valPtr | |||
changeStrings(strPtr) | |||
end | end | ||
local | -- Skip Memory message when selecting "Delete Save Data" on "Save the adventure" dialogue. | ||
local | local menuSkip = false | ||
local | local H12 = function() -- Bases__Talk__CommandCamp__showDialog | ||
menuSkip = true | |||
end | |||
local H13 = function() -- Bases__Talk__CommandCamp__showDialog | |||
if menuSkip == true then | |||
axObj.SetGpr(gpr.v1, 0) | |||
menuSkip = false | |||
end | |||
end | end | ||
local H14 = function() -- Bases__Talk__CommandCamp__showDialog | |||
local | if menuSkip == true then | ||
axObj.SetPC(0x88D908C) | |||
if | |||
axObj. | |||
end | end | ||
end | end | ||
-- | -- HOOKS -- | ||
local hook1 = axObj.AddHook(0x88E9564, 0x0002102B, H1) -- Labo::Bases__Camp__Scene__updateTips | |||
local H8 = function() -- | local hook2 = axObj.AddHook(0x899E718, 0x00403021, H2) -- GameSystem__SaveDataController__setStateMessage | ||
local | local hook3 = axObj.AddHook(0x897771C, 0x00431021, H3) -- Localize__Manager__getLanguageName | ||
if | local hook4 = axObj.AddHook(0x88774D0, 0x00402821, H4) -- System::Util__BNDFile__doNameCallback | ||
local hook5 = axObj.AddHook(0x886889C, 0x02002021, H5) -- Labo::GameSystem__callbackFunc_MemoryObject | |||
local hook6 = axObj.AddHook(0x898BCDC, 0x27BDFFE0, H6) -- Sound__SubGame__Blacksmith__Command__start__4LaboFv | |||
local hook7 = axObj.AddHook(0x89220F8, 0xAC80019C, H7) -- Sound__BeatCommander__endSubGame__4LaboFv | |||
local hook8 = axObj.AddHook(0x8A734DC, 0x27BDFFC0, H8) -- GameSystem__Tips__Viewer__setup__4LaboFv | |||
local hook9 = axObj.AddHook(0x899CF4C, 0x92637EED, H9) -- GameSystem__SaveDataController__update__4LaboFv | |||
local hook10 = axObj.AddHook(0x88E7E48, 0x2490009C, H10) -- Utility__SaveDataUtility__setDataParamsfoString | |||
local hook11 = axObj.AddHook(0x897CF90, 0x26041718, H11) -- Bases__Item__ExplanationWindow__setItemId | |||
local hook12 = axObj.AddHook(0x88D9114, 0xAEA00014, H12) -- Bases__Talk__CommandCamp__showDialog | |||
local hook13 = axObj.AddHook(0x88D90B4, 0x9063C550, H13) -- Bases__Talk__CommandCamp__showDialog | |||
local hook14 = axObj.AddHook(0x88D907C, 0x8FA2003C, H14) -- Bases__Talk__CommandCamp__showDialog | |||
local hook15 = axObj.AddHook(0x8A394B4, 0x26241718, H11) -- Bases__Organization__Managed__ItemSelectWindow__onSlotChange (note uses H11) | |||
-- US game bug fix. "Paraget" -> "Patagate" -- | |||
axObj.AddHook(0x88DC5F4, 0x00409021, function() -- from Bases__Camp__Person__Behavior__Idle__update__4LaboFv | |||
local strPtr = axObj.GetGpr(gpr.v0) + 0xE -- 0xE skip over X/Y positions. | |||
local str = axObj.ReadMemStr16(strPtr) | |||
if string.find(str, "The Paraget will") then | |||
-- org string: The Paraget will teleport you to/another world… | |||
local newStr = "The Patagate can teleport you to/another world…" | |||
axObj.WriteMemStr16Z(strPtr, newStr) | |||
elseif string.find(str, "Paraget Shrine") then | |||
-- org string: This is the Paraget Shrine./Only <N0> and <N1> can/enter. | |||
local newStr = "This is the Patagate Shrine/Only <N0> and <N1> can/enter." | |||
axObj.WriteMemStr16Z(strPtr, newStr) | |||
end | end | ||
end) | |||
--[[ | |||
axObj.AddHook(0x08982F48, 0x24070001, function() | |||
if emuObj.NeoMode() then | |||
axObj.SetGpr(gpr.a3, 0) -- turn on 60fps mode | |||
end | |||
end) | |||
]]-- | |||
-- | --- MOVIE FIX --- | ||
local | local movieLastTime = 0.0 | ||
local | local movieFix = function() -- Labo::GameSystem__MovieModule__render | ||
local | local t = axObj.GetFpr(0) | ||
if t == 0 and movieLastTime > 0 then | |||
local s0 = axObj.GetGpr(gpr.s0) | |||
axObj.WriteMemFloat(s0 + 0x44, movieLastTime) | |||
elseif t > 0 then | |||
movieLastTime = t | |||
end | end | ||
end | end | ||
-- | axObj.AddHook(0x8A6A1DC, 0xe6000044, movieFix) | ||
local ptr = axObj.GetGpr(gpr. | |||
local | --- PAT2-16 FIX --- | ||
axObj.AddHook(0x890E9E0, 0x02002021, function() -- Labo::Game__Gimmick__WindowAttacher__update | |||
local ptr = axObj.GetGpr(gpr.sp) + 0x28 | |||
local posy = axObj.ReadMemFloat(ptr + 4) | |||
axObj. | if posy < -30 then | ||
end | local obj = axObj.GetGpr(gpr.a0) | ||
axObj.WriteMem8(obj + 0x2a8, 0) | |||
end | |||
end) | |||
</pre> | |||
====LUA paths: ==== | |||
*XXXXYYYYY_patches.lua | |||
<pre> | |||
Image0\patches\XXXXYYYYY_patches.lua | |||
</pre> | |||
*XXXXYYYYY_features.lua | |||
<pre> | |||
Image0\feature_data\*XXXXYYYYY_features.lua | |||
</pre> | |||
*XXXXYYYYY_tooling.lua | |||
<pre> | |||
Image0\tooling\XXXXYYYYY_tooling.lua | |||
</pre> | |||
*XXXXYYYYY_trophies.lua | |||
<pre> | |||
Image0\trophy_data\XXXXYYYYY_trophies.lua | |||
</pre> | |||
== Emulators == | |||
<pre>Every emulator is programmed in a different way, sometimes choosing the right emulator is the only possible way to fix a game, emulators are not provided pre-installed on your ps4, they have to be unpacked from your backup that's downloaded from the ps store from that specific game. this list includes The typical usage of some of The emulators. and by emulator we mean the Eboot.bin</pre> | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Emulator !! Usage !! API Version !! Similar emulators (Usage) | |||
|- | |||
| LocoRoco Midnight Carnival || ? || ? || ? | |||
|- | |||
| Patapon 2 || ? || ? || ? | |||
|- | |||
| PaRappa the Rapper || ? || ? || ? | |||
|- | |||
|} | |||
==Information== | |||
====Other==== | |||
*XXXXYYYYY_config.txt | |||
*videos/ | |||
*.mp4 | |||
*videos/%08x.mp4 | |||
*audio/%08x.ogg | |||
Paths: | |||
*/app0/ | |||
*/download0/ | |||
*/savedata | |||
*/host/ | |||
*/hostapp/ | |||
*/data/ | |||
====Sample==== | |||
<pre>; PS4 configuration file for PSPHD | |||
; Game Image | |||
--image="data/USER_L0.IMG" | |||
; Redirect host0: to a specific directory (uncomment to enable). | |||
; By default it's mapped to either "/hostapp/" if available, or "/app0/" if "/hostapp/" is not available. | |||
;--host="/hostapp/" | |||
; To dump the original video in PMF format, uncomment the --dumpvideos line | |||
; For example, with the current setting, it will save them in a "videos" directory inside the File Serving Directory | |||
;--dumpvideos="host0:videos" | |||
; To dump the original audio in Atrac3 format, uncomment the --dumpaudio line | |||
; For example, with the current setting, it will save them in a "audio" directory inside the File Serving Directory | |||
;--dumpaudio="host0:audio" | |||
; To replace atrac3 audio samples, use this. | |||
--samplereplace="host0:samplereplace" | |||
; To save the in-game textures as the game runs, uncomment the --texsave line | |||
; For example, with the current setting, it will save them in a "texdump" directory inside the File Serving Directory | |||
;--texsave="host0:texdump" | |||
;--texmissingsave="host0:texdump" | |||
; To replace specific textures as the game runs, uncomment the --texreplace line | |||
; For example, with the current setting, it will load them from the "texreplace" directory inside the File Serving Directory | |||
--texreplace="host0:texreplace" | |||
; This forces alpha blending to on for replaced textures. (uncomment to enable) | |||
; With this we can freely make use of a normal alpha channel on replacement textures | |||
--replacementalpha=true | |||
<pre>; PS4 configuration file for PSPHD | |||
; Game Image | |||
--image="data/USER_L0.IMG" | |||
; Redirect host0: to a specific directory (uncomment to enable). | |||
; By default it's mapped to either "/hostapp/" if available, or "/app0/" if "/hostapp/" is not available. | |||
;--host="/hostapp/" | |||
; To dump the original video in PMF format, uncomment the --dumpvideos line | |||
; For example, with the current setting, it will save them in a "videos" directory inside the File Serving Directory | |||
;--dumpvideos="host0:videos" | |||
; To dump the original audio in Atrac3 format, uncomment the --dumpaudio line | |||
; For example, with the current setting, it will save them in a "audio" directory inside the File Serving Directory | |||
;--dumpaudio="host0:audio" | |||
; To replace atrac3 audio samples, use this. | |||
--samplereplace="host0:samplereplace" | |||
; To save the in-game textures as the game runs, uncomment the --texsave line | |||
; For example, with the current setting, it will save them in a "texdump" directory inside the File Serving Directory | |||
;--texsave="host0:texdump" | |||
;--texmissingsave="host0:texdump" | |||
; To replace specific textures as the game runs, uncomment the --texreplace line | |||
; For example, with the current setting, it will load them from the "texreplace" directory inside the File Serving Directory | |||
--texreplace="host0:texreplace" | |||
; This forces alpha blending to on for replaced textures. (uncomment to enable) | |||
; With this we can freely make use of a normal alpha channel on replacement textures | |||
--replacementalpha=true | |||
; Antialiasing mode. SSAA4x looks best, MSAA4x only smooths edges. | ; Antialiasing mode. SSAA4x looks best, MSAA4x only smooths edges. | ||
Line 1,610: | Line 868: | ||
; Parappa Alpha Hack | ; Parappa Alpha Hack | ||
--parappaalphahack=true | --parappaalphahack=true | ||
</pre> | |||
==NIDs in HLE== | ; Adjust overall volume level (does not include pad speaker volume). Range from 0.0 (min) to 1.0 (max) | ||
--volume="0.25"</pre> | |||
===NIDs in HLE=== | |||
<pre> | <pre> | ||
|HLEInterruptManager| | |HLEInterruptManager| | ||
Line 2,081: | Line 1,342: | ||
</pre> | </pre> | ||
==Unimplemented functions== | ===Unimplemented functions=== | ||
<pre> | <pre> | ||
sceIoChdir() unimplemented, ignoring | sceIoChdir() unimplemented, ignoring | ||
Line 2,141: | Line 1,402: | ||
</pre> | </pre> | ||
==Restricted== | ===Restricted=== | ||
<pre> | <pre> | ||
scePowerRegisterCallback - ignoring | scePowerRegisterCallback - ignoring | ||
Line 2,155: | Line 1,416: | ||
* https://forums.ppsspp.org/showthread.php?tid=11961 | * https://forums.ppsspp.org/showthread.php?tid=11961 | ||
* https://github.com/LunaMoo/PPSSPP_workarounds/blob/master/cheat.db | * https://github.com/LunaMoo/PPSSPP_workarounds/blob/master/cheat.db | ||
===More Information:=== | ===More Information:=== |