Editing PSP Emulation

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

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 PS Plus PSP emulator includes plenty of undiscovered functionalities, it even allows patches directly to the emulated Allegrex cpu.
Not many CLI commands were added this time around. Very few commands have a description to their usage inside of the eboot.bin, everything else is just guesswork from the scene. Plenty of LUA commands need to be understood before the compatibility of games can improve. The PSP emulator has not gained the same popularity as the ps2 emulator due to the existence of an unofficial PPSSPP core in the unofficial Retroarch port for the PS4. As far as the compatibility and performance go, the Retroarch core is yet to be bested. This emulator may hold potential, but the potential can only go so far as it seems not to have support for gamedata installation, which in turn will render many games unplayable.


== 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'''.
=== CLI commands ===
=== config-emu-ps4.txt commands ===
These commands can be added to any of these files:
 
* '''config-title.txt'''
* '''package-ps4.conf'''
{| 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  
|-style="background-color:#FEA15C"
|  || General || ||
|-
|-
| --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]
|-
| --volume || ? || Adjust volume level, seems pretty redundant ||
|-
|-
| --notrophies || || Enable/disable trophies||  
| --notrophies || || Enable/disable trophies||  
|-
| --ps4-trophies  || || ||
|-
|-
| --locale || || ||
| --locale || || ||
Line 25: Line 19:
| --image || umd0 ,disc0 || Set path for disc image ||
| --image || umd0 ,disc0 || Set path for disc image ||
|-
|-
| --vms || ? || ? ||
| --texreplace || Directory || Set directory of texture replacement folder || --texreplace="host0:texreplace"
|-
| --samplereplace || || ||
|-
|-
| --addon || || ||
| --addon || || ||
|-
|-
| --host || Sets host directory || --host="/hostapp/" ||
| --host || host0, flash0 || Set whether the game is using sdcard or internal storage ? ||
|-
|-
| --loglevel || none, all, warn, info, error, debug, trace || debug logging  ||
| --texsave || || ||
|-
|-
| --xobuttonmode || oenter, ocancel || Switcher between x and circle button, made specifically for japanese gamers ||
| --texmissingsave || || ||
|-
| --loglevel || none, all, warn, info, error, debug, trace || debug logging
|-
| --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"
|-
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) ||
|-
| --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
|-
|-
| --savedata-mode || ? || ? ||
| --savedata-mode || ? || ? ||
Line 43: Line 47:
| --multisaves || true, false || Enable Multiple Savegames || --multisaves=true  
| --multisaves || true, false || Enable Multiple Savegames || --multisaves=true  
|-
|-
| --samplesave || ? || ? ||
| --savedatamulti-size-game || || ||
|-style="background-color:#ff99c2"
| || Graphical fixes || ||
|-
|-
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off
| --savedatamulti-size-user || || ||
|-
|-
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo, full || for issues with texture cache (modes lower than full possibly read some textures directly without cache). || --texcachemode=patchworkheroes
| --samplesave || ? || ? ||
|-
|-
| --texclutmode || filter, full || || --texclutmode=full
| --vramcopyback || 0, 10000000 || || --vramcopyback=45
|-
|-
| --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  ||
| --replacementfilter || true, false || This forces alpha blending to on for replaced textures. || --replacementfilter=true
|-
|-
| --depthscalehack || true?, false? || ||--depthscalehack=true
| --clamp-line-thickness-min || ? || ? ||
|-
|-
| --depthscalehack || true?, false? || ||--depthscalehack=true
| --clamp-line-thickness-max || ? || ? ||
|-
|-
| --locorocomeshsmooth || true, false || Custom mesh smoothing for loco roco games(?)|| --locorocomeshsmooth=true
| --spu2Trace || true, false || || --spu2Trace=true
|-
|-
| --locorocomeshsmoothnonindexed || true, false || Turns "locorocomeshsmooth" mesh smoothing into non-indexed(?) ||--locorocomeshsmoothnonindexed=true
| --spu2-c1-memin-to-bgm || true, false || || --spu2-c1-memin-to-bgm=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
| --replacementalpha || true, false || || --replacementalpha=true
|-style="background-color:#D7EF54"
|  || Game fixes || ||
|-
|-
| --godofwarhack || true, false || Likely a performance patch for games that go way above the fps cap. Managed to help '''God Of War - Ghost Of Sparta''' skip intro freeze. it could possibly be used as a speedhack.  [https://github.com/hrydgard/ppsspp/pull/15640 Might be this?]|| --godofwarhack=true
| --parappaalphahack || true, false || || --parappaalphahack=true
|-style="background-color:#03fcc2"
|  || No effect / unknown values || ||
|-
|-
| --texloadcores || 0, 100 || textures to load || texloadcores=2
| --parappajapanesefonthack || true, false || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true
|-
|-
| --smoothlevel || 0, 100 || Mesh smoothing level? || --smoothlevel=0
| --locorocomeshsmooth || true, false || Custom mesh smoothing for loco roco games|| --locorocomeshsmooth=true
|-
|-
| --anisolevel || 0, 100 || Anisotropic filtering level?? ||
| --godofwarhack || true, false || Seems specifically made for god of war, unknown effect || --godofwarhack=true
|-
|-
| --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true
| --locorocomeshsmoothnonindexed || true, false || Non-indexed mesh smoothing ||--locorocomeshsmoothnonindexed=true
|-
|-
| --clamp-line-thickness-min || ? || ? ||
| --gputhread || true, false || Run the PSP GPU on a separate thread || --gputhread=true
|-
|-
| --clamp-line-thickness-max || ? || ? ||
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off
|-
|-
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) ||
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Seems to be a selector of texture caching method|| --texcachemode=patchworkheroes
|-
|-
| --msxxadhoc || true?, false? || ad hoc support ? ||
| --texclutmode || filter, full || || --texclutmode=full
|-
|-
| --parappaalphahack || true?, false? || Doesn't seem to have any effect.|| --parappaalphahack=true
| --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  ||
|-
|-
| --umddelay || ? || Seems to be I/O timing method. Doesn't seem to have any effect  ||
| --texloadcores || 0, 10000 || textures to load || texloadcores=2
|-
|-
| --vramcopyback || 0, 10000000 || for games that download data from GPU to Allegrex || --vramcopyback=45
| --depthscalehack || true, false || ||--depthscalehack=true
|-
|-
|-style="background-color:#7698FF"
| --forcenobilinear || true, false || Turn bilinear filtering on/off ||--forcenobilinear=true
| || Speedhacks / Possible duplicates|| ||
|-
|-
| --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off
| --smoothlevel || 0, 12? || Mesh smoothing level? || --smoothlevel=0
|-
|-
| --texclutmode || full || Turns on filtering of CLUT hashes to avoid repeat indexed textures ||--texclutmode=full
| --anisolevel || || Anisotropic filtering level?? ||
|-
|-
| --texloadcores || 0 || Textures to load ||--texloadcores=12
| --msxxadhoc || true?, false? || ad hoc support ? ||
|-
|-
| --smoothlevel || 0 || Set mesh smooth level||--smoothlevel=0
| --umddelay || true?, false?|| Seems to be I/O timing method [https://github.com/hrydgard/ppsspp/issues/7647 More here]  ||
|-
| --gputhread || true, false || possibly move GPU emulation to another thread. Speedhack, but can decrease compatibility. || --gputhread=true
|-
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Set texture caching method ||--texcachemode=patchworkheroes
|-
|-
| --anisolevel || 0, 100 || Anisotropic filtering level?? ||
|-
| --present || vblankstart, setframebuf, drawsync|| set when frame is presented. Sync issues, flickering screen, tearing, input lag, etc. Doesn't seem to have any effect. ||--present=setframebuf
|-
| --texrecent || true || Optimize texture hashes ||--texrecent=true
|}
|}
====Syphon Filter Dark Mirror====
 
==== Speedhacks ====
 
{| 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   
|-
|-
| --force-native-aspect-ratio || || ||
| --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off
|-
|-
| --use-higher-precision-depth || || ||
| --texclutmode || full || Turns on filtering of CLUT hashes to avoid repeat indexed textures ||--texclutmode=full
|-
|-
| --optimize-fb-self-resolves || || ||
| --texloadcores || 0 || Textures to load ||--texloadcores=12
|-
|-
| --force-dsf-present || || ||
| --smoothlevel || 0 || Set mesh smooth level||--smoothlevel=0
|-
|-
| --bend-30hz-lock|| || ||
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Set texture caching method ||--texcachemode=patchworkheroes
|-
|-
| --setframebuf-auto-vblank-wait-threshold|| || ||
| --present || vblankstart, setframebuf, drawsync|| Display on draw to reduce latency ||--present=setframebuf
|-
|-
| --gpu-renderthread|| || ||
| --texrecent || true || Optimize texture hashes ||--texrecent=true
|-
| --force-triangle-clip-off|| || ||
|-
| --hack-use-sku-vms|| || ||
|-
| --active-sku || || ||
|-
| --psp-right-stick-action || 0,1 || ||--psp-right-stick-action=1
|-
| --psp-right-stick-deadzone-x || || ||--psp-right-stick-deadzone-x=15
|-
| --psp-right-stick-deadzone-y || || ||--psp-right-stick-deadzone-y=15
|-
| --psp-right-stick-deadzone-semicircle-arc || || ||--psp-right-stick-deadzone-semicircle-arc=40
|-
|-
| --umddelay || true || Seems to be Simulate UMD delays option in ppsspp ||--umddelay=true
|}
|}


====Texture replacement====
===XXXXYYYYY_patches.lua===
Your lua can be placed as '''\Image0\Patches\XXXXYYYYY\XXXXYYYYY_patches.lua''' 
<br>'''XXXXYYYYY''' being the game's Region code
<br>'''Requires Cleanup'''.
{| 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 !! Usage !! Notes - Example
|-
| apiRequest || '''apiRequest(<api version>)''' || example: apiRequest(0.1) 
Calling api is mandatory. some commands require higher versions.
|-
! !! getEmuObject class !!  
|-
|-
| --texswitch||true, false|| Enables Texture replacement || --texswitch=true
|getEmuObject || '''local emuObj = getEmuObject()''' || Required for all functions using emuObj
|-
|-
| --texsave || || ||
| AddVsyncHook ||emuObj.AddVsyncHook()|| Set function to be done on every vsync
|-
|-
| --texmissingsave || || ||
| RemoveVsyncHook ||emuObj.RemoveVsyncHook()|| Remove vsynchook
|-
|-
| --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
| AddBootHook ||emuObj.AddBootHook()|| Set function to be done when the game boots up
|-
|-
| --texreplace || Directory || Set directory of texture replacement folder || --texreplace="host0:texreplace"
|RemoveBootHook||emuObj.RemoveBootHook()|| remove function to be done when the game boots up
|-
|-
| --replacementfilter || true, false || This forces alpha blending to on for replaced textures. || --replacementfilter=true
|PadRead || emuObj.PadRead() ||
|-
|-
| --replacementalpha || true, false || || --replacementalpha=true
|PadReadPitch || emuObj.PadReadPitch() ||
|-
|-
|}
|PadReadRoll || emuObj.PadReadRoll()||
 
===XXXXYYYYY_patches.lua===
The lua can be placed as: '''scripts\XXXXYYYYY_patches.lua'''
 
====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
|PadRegisterSamples || emuObj.PadRegisterSamples()||
|-
|-
|LoadSlideshow ||emuObj.LoadSlideshow()||
|LoadSlideshow ||emuObj.LoadSlideshow()||
Line 203: Line 181:
| SaveState ||emuObj.SaveState()||  
| SaveState ||emuObj.SaveState()||  
|-
|-
| SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| 0? 1?
| SetFDExtraDelay ||emuObj.SetFDExtraDelay()||
|-
|-
| MeshSmooth ||emuObj.MeshSmooth()||
| MeshSmooth ||emuObj.MeshSmooth()||
Line 236: Line 214:
|-
|-
| PlayVideo||emuObj.PlayVideo()||
| PlayVideo||emuObj.PlayVideo()||
|-
| AddGPUHook ||emuObj.AddGPUHook()||
|-
|-
| RescaleUForUpscale ||emuObj.RescaleUForUpscale()||
| RescaleUForUpscale ||emuObj.RescaleUForUpscale()||
Line 248: Line 228:
|-
|-
| 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 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.
| 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 256:
|-
|-
| CopyFB || emuObj.CopyFB() ||
| CopyFB || emuObj.CopyFB() ||
|-style="background-color:#c6ecd9"
| Hooks  || ||
|-
|-
| AddVsyncHook ||emuObj.AddVsyncHook()|| Set function to be done on every vsync
! !! getAXObject class !!
|-
|-
| RemoveVsyncHook ||emuObj.RemoveVsyncHook()|| Remove vsynchook
| getAXObject ||'''local axObj = getAXObject()''' || Required for all functions using AXObject
|-
|-
| AddBootHook ||emuObj.AddBootHook()|| Set function to be done when the game boots up
| AddHook || axObj.AddHook() ||
|-
|-
|RemoveBootHook||emuObj.RemoveBootHook()|| remove function to be done when the game boots up
| RemoveHook || axObj.RemoveHook() ||
|-
|-
| AddGPUHook ||emuObj.AddGPUHook()||
|SetPC|| axObj.SetPC() ||
|-
|-
|-style="background-color:#D7EF54"
|GetPC|| axObj.GetPC() ||
|  Pad || ||  
|-
|-
| Pad require ||'''local pad = require("pad")''' || Required for all commands that rely on pad
| ReadMem32 || axObj.ReadMem32() || Read 4 bytes from offset
|-
|-
|PadRead || emuObj.PadRead() ||
| WriteMem32 || axObj.WriteMem32() || Write 4 bytes to offset
<br>L3        = 0x00000002
<br>R3        = 0x00000004
<br>OPTIONS  = 0x00000008
<br>UP        = 0x00000010
<br>RIGHT    = 0x00000020
<br>DOWN      = 0x00000040
<br>LEFT      = 0x00000080
<br>L2        = 0x00000100
<br>R2        = 0x00000200
<br>L1        = 0x00000400
<br>R1        = 0x00000800
<br>TRIANGLE  = 0x00001000
<br>CIRCLE    = 0x00002000
<br>CROSS    = 0x00004000
<br>SQUARE    = 0x00008000
<br>SELECT    = 0x00010000
<br>START    = 0x00020000
|-
|-
|PadReadPitch || emuObj.PadReadPitch() ||
| ReadMem16 || axObj.ReadMem16() || Read 2 bytes from offset
|-
|-
|PadReadRoll || emuObj.PadReadRoll()||
| WriteMem16 || axObj.WriteMem16() || Write 2 bytes to offset
|-
|-
|PadRegisterSamples || emuObj.PadRegisterSamples()||
| ReadMem8 || axObj.ReadMem8() || Read 1 byte from offset
|-
|-
| PadSetButtonsMode || emuObj.PadSetButtonsMode() ||  
| WriteMem8 || axObj.WriteMem8() || Write 1 byte to offset
<br>0 = Touch bar is split in two for Start/Select. Option is unmapped (default behaviour)
<br>1 = Touch bar is Start. Option is Select
<br>2 = Touch bar is Select. Option is Start
|-
|-
| PadVibrate|| emuObj.PadVibrate() || emuObj.PadVibrate(5,180,180)
| ReadMemString || axObj.ReadMemString() ||
|-
|-
|}
| WriteMemString || axObj.WriteMemString() ||
 
====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
| WriteMemStr16 || axObj.WriteMemStr16() ||
|-
|-
| AddHook || axObj.AddHook() ||
|WriteMemStr16Z  ||axObj.WriteMemStr16Z() ||
|-
|-
| RemoveHook || axObj.RemoveHook() ||
| WriteMemStringZ ||axobj.WriteMemStringZ ||
|-
|-
| BurnCycles|| axobj.BurnCycles() || Could be an option to overclock cpu at a hooked offset
|ReadMemFloat || axObj.ReadMemFloat() ||
|-
|-
|AddAOTBlock ||axObj.AddAOTBlock()|| Ahead of time compilation block ?
|WriteMemFloat || axObj.WriteMemFloat() ||
|-
|Overlay ||axObj.Overlay()||
|-style="background-color:#ff8080"
| GPR || ||
|-
| gpr require || '''local gpr = require("ax-gpr-alias")''' || Required for any command that includes gpr registers
|-
|SetPC|| axObj.SetPC() ||
|-
|GetPC|| axObj.GetPC() ||
|-
|-
| GetGpr || axObj.GetGpr() ||
| GetGpr || axObj.GetGpr() ||
Line 367: Line 314:
|-
|-
|GetReg||axObj.GetReg()||
|GetReg||axObj.GetReg()||
|-style="background-color:#D7EF54"
| Memory editing || || Do note that the offsets on PPSSPP are mapped differently than the ones on the PS4
|-
|-
| ReadMem32 || axObj.ReadMem32() || Read 4 bytes from offset
| BurnCycles|| axobj.BurnCycles() || Could be an option to overclock cpu at a hooked offset
|-
|-
| WriteMem32 || axObj.WriteMem32() || Write 4 bytes to offset
|AddAOTBlock ||axObj.AddAOTBlock()|| Ahead of time compilation block ?
|-
|-
| ReadMem16 || axObj.ReadMem16() || Read 2 bytes from offset
|Overlay ||axObj.Overlay()||
|-
| 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() ||
|-
|-
! !! Other/Unknown/Standalone Commands !!
! !! Other/Unknown/Standalone Commands !!
|-
|-
|FuncReplace || axFuncReplace() || axFuncReplace(0x8804670, "__ptmf_scall") Replace allegrex function.
|FuncReplace || axFuncReplace() || axFuncReplace(0x8804670, "__ptmf_scall")
|-
|-
| InsnReplace || axInsnReplace() || Replace allegrex memory
| InsnReplace || axInsnReplace() ||
|-
|-
|}
|}
====Examples====
====Examples====
<br>'''''LUA example:'''''
=====User made lua=====
<br>
''A custom lua made by a user''
<br>Coconut Dodge "NPEZ00164"
<pre>
<pre>
apiRequest(0.1)
local axObj = getAXObject()
local axObj = getAXObject()
local emuObj = getEmuObject()
local emuObj = getEmuObject()
local patcher = function()
local patcher = function()
--Infinite lives
axobj.WriteMem32(0x0053d5d4,0x21c828bd)
axObj.WriteMem32(0x8ACA1A4, 0x3) --0x08ACE1A4 on PPSSPP, PPSSPP addresses need to be reduced by 0x4000 in order to work on PS4
end
end


Line 420: Line 342:
</pre>
</pre>


[https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files More patches can be found here]
=====Patches.lua=====
=====Patches.lua=====
======Syphon Filter: Dark Mirror======
'''An official lua created by sony for Patapon 2'''
 
<pre>
-- Lua 5.3
-- Title: Syphon Filter: Dark Mirror
 
-- Patches for fixing issues with post fx in games using the Syphon Filter/Resistance engine
 
apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
 
local emuObj = getEmuObject()
local cpu = getAXObject()
 
-- The bloom filter uses 1.5 pixel jitter to make a ghetto blur. When up-ressed, this doesn't look good.
-- To compensate, reduce the jitter amount before rendering.
function BloomJitterPlusAdjust()
-- 1.5 pixel "+" pattern
emuObj.AdjustUVJitter(0, 4, 0.0, 1.5)
emuObj.AdjustUVJitter(4, 4, 0.0, -1.5)
emuObj.AdjustUVJitter(8, 4, 1.5, 0.0)
emuObj.AdjustUVJitter(12, 4, -1.5, 0.0)
end
 
function BloomJitterCrossAdjust()
-- 1.5 pixel "x" pattern
emuObj.AdjustUVJitter(0, 4, 1.5, 1.5)
emuObj.AdjustUVJitter(4, 4, -1.5, 1.5)
emuObj.AdjustUVJitter(8, 4, 1.5, -1.5)
emuObj.AdjustUVJitter(12, 4, -1.5, -1.5)
end
 
local jitterFixPlus = emuObj.AddGPUHook(0x40dc000, 0, 16, 0x40d4000, BloomJitterPlusAdjust)
local jitterFixCross = emuObj.AddGPUHook(0x40d4000, 0, 16, 0x40dc000, BloomJitterCrossAdjust)
 
function depthquery()
local querystruct = 0x8eda968 -- this is always in a fixed location
-- the depth query struct is fixed to 24 entries
-- 0..15 seem to be always used for lights, 16..23 are for npcs
for i=0,23 do
local querytype = cpu.ReadMem32(querystruct+0)
local valid = cpu.ReadMem32(querystruct+1*4)
if valid ~= 0xffffffff then
--local queryx = cpu.ReadMem32(querystruct+2*4)
--local queryy = cpu.ReadMem32(querystruct+3*4)
--local querydepth = cpu.ReadMem32(querystruct+4*4)
--local querywidth = cpu.ReadMem32(querystruct+5*4)
--local queryheight = cpu.ReadMem32(querystruct+6*4)
--local param1c = cpu.ReadMem32(querystruct+7*4)
--local param20 = cpu.ReadMem32(querystruct+8*4)
local param24 = cpu.ReadMem32(querystruct+9*4)
--local result = cpu.ReadMemFloat(querystruct+10*4)
if param24 <= 0 then
cpu.WriteMem32(querystruct+1*4, 0xffffffff) -- to be removed from the list -> mark as invalid
else
if querytype == 3 then -- n x n coverage based occlusion used by lights. Object opacity is set to (visible_samples / total_samples)
cpu.WriteMemFloat(querystruct+10*4, 0.0) -- always hide lights
else -- Enemies use a 5-point (corners + center) occlusion check. Object is visible if any of the points is visible.
cpu.WriteMemFloat(querystruct+10*4, 1.0) -- set always visible
end
end
end
querystruct = querystruct + 0x2c
end
end
 
cpu.AddHook(0x8c163d4, 0x27bdff80, depthquery) -- = addiu sp, sp, -0x80
-- the hook code replaces the occlusion function, so just adjust the stack and return
cpu.InsnReplace(0x8c163d8, 0x34040000, 0x27bd0080) -- addiu sp, sp, 0x80
cpu.InsnReplace(0x8c163dc, 0xafa40048, 0x03e00008) -- jr ra
cpu.InsnReplace(0x8c163e0, 0x3c0408ee, 0x00000000) -- nop
</pre>
======Patapon 2'''======
<pre>
<pre>
-- Lua 5.3
-- Lua 5.3
Line 898: Line 748:
</pre>
</pre>


== Emulators ==
====basic====
<pre>Every emulator is programmed in a differently. Sometimes choosing the right emulator is the only possible way to fix a game. Emulators are not provided pre-installed on the ps4, they have to be unpacked from a backup that's downloaded from the ps store from that specific game. This list includes The typical usage of some of The emulators.</pre>
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Emulator !! Usage !! API Version !! Similar emulators (compatibility)
|-
| Echochrome || The default psp emulator for PSPFPKG tool at the time of writing and the best in terms of compatibility. || ? || ?
|-
| LocoRoco Midnight Carnival  || ? || ? || ?
|-
| LocoRoco 1  || ? || ? || ?
|-
| LocoRoco 2  || ? || ? || ?
|-
| Castlevania Requiem  || ? || ? || ?
|-
| Patapon 2 || ? ||  ? || ?
|-
| PaRappa the Rapper || An unofficial emulator developed by sony with very bad compatibility ||  ? || ?
|-
| Syphon Filter: Dark Mirror || ? || ? || ?
|-
|}


==Memory mapping==
*axInsnReplace (mem, org opcode, new opcode) - Replace allegrex memory
<br>'''Note''': The memory on PPSSPP is 0x4000 offsets ahead of the memory on the PS4
*axFuncReplace - Replace allegrex function. Known implemented functions are: I3dVecSet, I3dRender__ReserveTrashQwc, I3dVecAdd, I3dVecScaleXYZ, I3dGuSetMatrix_PSP, patapon_memcpy
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Size !! Offset From -> Offset To !! Name
|-
| || 1008000000 -> 10887FFFFF ||  Allegrex memory(?)
|-
|640.00MB  || 228200000 -> 250200000 ||
|-
|64.00MB  ||  250200000 -> 254200000 ||
|-
|32.00MB  ||  254200000 -> 256200000 ||
|-
|2048.00MB ||  256200000 -> 2d6200000 ||
|-
|16.00MB  ||  2d6200000 -> 2d7200000 ||
|-
|16.00MB  ||  2d7200000 -> 2d8200000 ||
|-
|16.00MB  ||  2d8200000 -> 2d9200000 ||
|-
|16.00MB  ||  2d9200000 -> 2da200000 ||
|-
|}


===Registers map===
<br>Registers that are marked with '''(?)''' are untested but should be accurate.
<br>*'''Note''': The offsets' positions change as the CLI file's content increases, but the offsets should still be somewhere nearby the offsets listed below and the layout should be the same regardless. The PC pointer script can be used to locate another PC register properly in Echochrome's emulator
{| class=wikitable style="border: none; background: none;"
! scope=col | GPR
! scope=col | Offset
! scope=col | Notes
| rowspan=900 style="border: none; background: none;"|
! scope=col | FPU
! scope=col | Offset
|-
| zero || 0x200414CA8? || || f0 || 0x200414D4C?
|--style="background-color:#EEEFF2"
| at  || 0x200414CAC? || || f1 || 0x200414D50
|-
| v0 || 0x200414CB0  || || f2 || 0x200414D54?
|--style="background-color:#EEEFF2"
| v1 || 0x200414CB4  || || f3 || 0x200414D58?
|-
| a0 || 0x200414CB8  || || f4 || 0x200414D5C?
|--style="background-color:#EEEFF2"
| a1 || 0x200414CBC? || || f5 || 0x200414D60?
|-
| a2 || 0x200414CC0? || || f6 || 0x200414D64?
|--style="background-color:#EEEFF2"
| a3 ||  0x200414CC4? || || f7 || 0x200414D68?
|-
| t0 || 0x200414CC8? || ||f8|| 0x200414D6C?
|--style="background-color:#EEEFF2"
| t1 || 0x200414CCC? || ||f9 || 0x200414D70?
|-
| t2 ||  0x200414CD0? || || f10 || 0x200414D74?
|--style="background-color:#EEEFF2"
| t3 ||  0x200414CD4? || ||f11|| 0x200414D78?
|-
| t4 ||  0x200414CD8? || || f12 || 0x200414D7C?
|--style="background-color:#EEEFF2"
| t5 ||  0x200414CDC? || || f13 || 0x200414D80?
|-
| t6 || 0x200414CE0? || || f14 || 0x200414D84?
|--style="background-color:#EEEFF2"
| t7 || 0x200414CE4? || || f15 || 0x200414D88?
|-
| s0 ||  0x200414CE8? || || f16 || 0x200414D8C?
|--style="background-color:#EEEFF2"
| s1 || 0x200414CEC? || || f17 || 0x200414D90?
|-
| s2 ||  0x200414CF0? || || f18 || 0x200414D94?
|--style="background-color:#EEEFF2"
| s3 || 0x200414CF4? || || f19 || 0x200414D98?
|-
| s4 ||  0x200414CF8? || || f20|| 0x200414D9C?
|--style="background-color:#EEEFF2"
| s5 ||  0x200414CFC? || || f21 || 0x200414DA0?
|-
| s6 ||  0x200414D00? || || f22 || 0x200414DA4?
|--style="background-color:#EEEFF2"
| s7 ||  0x200414D04? || || f23|| 0x200414DA8?
|-
| t8 ||  0x200414D08? || || f24 || 0x200414DAC?
|--style="background-color:#EEEFF2"
| t9 ||  0x200414D0C? || || f25 || 0x200414DB0?
|-
| k0 ||  0x200414D10 || ||f26 || 0x200414DB4?
|--style="background-color:#EEEFF2"
| k1 ||  0x200414D14 || || f27 || 0x200414DB8?
|-
| gp ||  0x200414D18 || || f28|| 0x200414DBC?
|--style="background-color:#EEEFF2"
| sp || 0x200414D1C || || f29 || 0x200414DC0?
|-
| fp || 0x200414D20 ||  || f30 || 0x200414DC4?
|--style="background-color:#EEEFF2"
| {{cellcolors|#D7EF54|#000000}}ra || 0x200414D24 || || f31 || 0x200414DC8
|-
| ? || 0x20AD14D28 || ||  ||
|--style="background-color:#EEEFF2"
| last syscall? || 0x20AD14D2C || ||  ||
|-
| {{cellcolors|#7698FF|#000000}}pc || 0x200414D34 || Will show "0x0", "0x1", "0x5", if the Allegrex cpu is idle(?). || ||
|--style="background-color:#EEEFF2"
| hi || 0x200414D38 || ||  ||
|-
| lo || 0x200414D3C || ||  ||
|--style="background-color:#EEEFF2"
| Memory base? || 0x200414D48 || Shows "0x08800000", could be used as pointer or something?|| ||
|-
|}
====PC pointer====
<br>PS4CHEATER
<br>'''PSP.cht'''
<pre>
1.5|eboot.bin|ID:|VER:01.00|FM:505
simple pointer|pointer|4 bytes|@C6B8C8_2_6B8C8+210+108|data|4 bytes|143011412|0||
</pre>
'''VFPU'''
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Register !! Offset !! Register !! Offset !! Register !! Offset !! Register !! Offset
|-
| S000|| 0x200414DE0 || S001|| 0x200414DE4 || S002|| 0x200414DE8 || S003|| 0x200414DEC
|-
| S010|| 0x200414DF0 || S011|| 0x200414DF4 || S012|| 0x200414DF8  || S013|| 0x200414DFC
|-
| S020|| 0x200414E00 || S021|| 0x200414E04 || S022||  0x200414E08 || S023|| 0x200414E0C
|-
|S030|| 0x200414E10 || S031|| 0x200414E14 || S032|| 0x200414E18  || S033|| 0x200414E1C
|-
|S100|| 0x200414E20  || S101|| 0x200414E24  || S102||  0x200414E28  || S103|| 0x200414E2C
|-
| S110 || 0x200414E30  || S111|| 0x200414E34 || S112||  0x200414E38 || S113||0x200414E3C
|-
| S120|| 0x200414E40  || S121|| 0x200414E44 || S122|| 0x200414E48 || S123|| 0x200414E4C
|-
|S130|| 0x200414E50 || S131||0x200414E54  || S132|| 0x200414E58  || S133|| 0x200414E5C
|-
|S200|| 0x200414E60  || S201|| 0x200414E64 || S202||  0x200414E68 || S203||0x200414E6C
|-
|S210|| 0x200414E70  || S211|| 0x200414E74 || S212||  0x200414E78 || S213|| 0x200414E7C
|-
|S220|| 0x200414E80  || S221|| 0x200414E84 || S222|| 0x200414E88 || S223|| 0x200414E8C
|-
|S230|| 0x200414E90 || S231|| 0x200414E94 || S232||  0x200414E98 || S233|| 0x200414E9C
|-
|S300|| 0x200414EA0  || S301|| 0x200414EA4 || S302||  0x200414EA8 || S303|| 0x200414EAC
|-
|S310|| 0x200414EB0  || S311|| 0x200414EB4 || S312|| 0x200414EB8  || S313|| 0x200414EBC
|-
|S320|| 0x200414EC0  || S321|| 0x200414EC4 || S322|| 0x200414EC8 || S323||0x200414ECC
|-
|S330|| 0x200414ED0 || S331|| 0x200414ED4 || S332|| 0x200414ED8 || S333||0x200414EDC
|-
|S400|| 0x200414EE0  || S401||  0x200414EE4 || S402|| 0x200414EE8 || S403|| 0x200414EEC
|-
|S410|| 0x200414EF0  || S411||  0x200414EF4 || S412||  0x200414EF8 || S413|| 0x200414EFC
|-
|S420|| 0x200414F00 || S421|| 0x200414F04 || S422||  0x200414F08 || S423|| 0x200414F0C
|-
|S430|| 0x200414F10 || S431|| 0x200414F14 || S432||  0x200414F18 || S433|| 0x200414F1C
|-
|S500|| 0x200414F20 || S501|| 0x200414F24|| S502|| 0x200414F28 || S503|| 0x200414F2C
|-
|S510|| 0x200414F30  || S511|| 0x200414F34 || S512|| 0x200414F38 || S513|| 0x200414F3C
|-
|S520|| 0x200414F40 || S521|| 0x200414F44 || S522|| 0x200414F48 || S523||0x200414F4C
|-
|S530 || 0x200414F50|| S531|| 0x200414F54 || S532||  0x200414F58|| S533|| 0x200414F5C
|-
|S600|| 0x200414F60 || S601|| 0x200414F64 || S602|| 0x200414F68 || S603|| 0x200414F6C
|-
|S610|| 0x200414F70  || S611|| 0x200414F74 || S612||  0x200414F78 || S613||0x200414F7C
|-
|S620|| 0x200414F80  || S621|| 0x200414F84 || S622|| 0x200414F88 || S623|| 0x200414F8C
|-
|S630 || 0x200414F90 || S631|| 0x200414F94 || S632||  0x200414F98 || S633|| 0x200414F9C
|-
|S700|| 0x200414FA0 || S701 || 0x200414FA4 || S702|| 0x200414FA8  || S703|| 0x200414FAC
|-
|S710|| 0x200414FB0  || S711|| 0x200414FB4 || S712||  0x200414FB8 || S713|| 0x200414FBC
|-
|S720|| 0x200414FC0  || S721|| 0x200414FC4 || S722|| 0x200414FC8 || S723|| 0x200414FCC
|-
|S730 || 0x200414FD0|| S731|| 0x200414FD4 || S732||  0x200414FD8 || S733|| 0x200414FDC
|-
|}
= Known issues =
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Issue !! Games affected !! Solution !! Description
|-
| No gamdata installation functionality (?)|| || ||
|-
| Highly unoptimized graphics renderer || || || Low fps
|-
| No support for some syscalls || || ||
|-
|}
=LUA include files=
<br>Files that need to be placed in the '''/lua_include/''' folder
'''uv-clamping.lua'''
<pre>
print ("Loading uv-clamping.lua from global scripts")
UV_CLAMPING_ENABLE = true
UV_CLAMPING_DISABLE = false
UV_CLAMPING_USE_ZERO_EDGE_ALPHA = true
UV_CLAMPING_DONT_USE_ZERO_EDGE_ALPHA = false
emuObj = getEmuObject()
-- Turns off UV clamping for the given list of textures.
-- textureTable: A list of texture base addresses.
DisableUvClampingForTextures = function(textureTable)
if emuObj.OverrideUvClampingState then
for _, texAddr in ipairs(textureTable) do
emuObj.OverrideUvClampingState(texAddr, UV_CLAMPING_DISABLE, UV_CLAMPING_DONT_USE_ZERO_EDGE_ALPHA);
end
else
print ("This emulator does not support OverrideUvClampingState()")
end
end
</pre>
'''sce-locale.lua'''
<pre>
print ("Loading sce-locale.lua from global scripts")
-- Language codes
--
-- ja    Japanese
-- en    English (US)
-- fr    French (France)
-- es    Spanish (Spain)
-- de    German
-- it    Italian
-- nl    Dutch
-- pt    Portuguese (Portugal)
-- ru    Russian
-- ko    Korean
-- zh-TW  Chinese (traditional)
-- zh-CN  Chinese (simplified)
-- fi    Finnish
-- sv    Swedish
-- da    Danish
-- no    Norwegian
-- pl    Polish
-- pt-BR  Portuguese (Brazil)
-- en-GB  English (UK)
-- tr    Turkish
-- es-MX  Spanish (Latin America)
-- ar    Arabic
-- fr-CA  French (Canada)
-- cs    Czech
-- hu    Hungarian
-- el    Greek ("Ελληνικά" in the system language menu)
-- ro    Romanian
-- th    Thai
-- vi    Vietnamese
-- id    Indonesian
-- uk    Ukrainian
-- returns locale (en-US) and language only (us), useful for lookups with fallback.
GetLocaleLangPair = function()
local locale, lang
locale = AppHost_GetLocaleTag()
lang = locale:sub(1,2)    -- grab first two digits, eg. en-US -> en
print ("[BOOT] App Host Langauge =", lang)
if locale ~= nil then
print ("[BOOT] App Host Locale =", locale)
else
print ("[BOOT] Deprecated Native Language =", lang)
end
return locale, lang
end
FindLocaleTableKey = function(table, primary, fallback, default)
-- try for a specific Locale, and if that fails fallback on just a language (without region),
-- and if that fails fallback on default.
local keyres = primary
if keyres == nil or table[keyres] == nil then
keyres = fallback
end
if keyres == nil or table[keyres] == nil then
print ("WARNING: No table entry for locale", primary, "or language", fallback, ", using default", default);
keyres = default
else
print ("Found locale table entry", keyres);
end
return keyres
end
</pre>
'''disc-selection.lua'''
<pre>
print ("Loading disc-selection.lua from global scripts")
require "sce-locale"
-- Determines and sets the active SKU.
--
-- sku_map: Cannot be nil.  A table of the form
-- {
-- en = <sku dir name>,
-- fr = <sku dir name>,
-- de = <sku dir name>,
-- it = <sku dir name>,
-- es = <sku dir name>,
--  ...
-- }
--
RegisterSkus = function(sku_map, default_locale)
if default_locale == nil then
default_locale = "en"
end
local locale, lang = GetLocaleLangPair()
local key = FindLocaleTableKey(sku_map, locale, lang, default_locale)
local sku_name = sku_map[key]


if EM_SetActiveSku == nil then
print "EM_SetActiveSku is undefined, use the stable branch of the packager or use a new version of the emulator."
end
EM_SetActiveSku(sku_name)


end
====hooks/registers====


</pre>
Hooks, and registers that can be called in lua api.


'''ax-gpr-alias.lua'''
Emulator (usage - remove EM_):
<pre>


-- Recommended method to import this module:
*EM_PadRead
--  local gpr = require("ax-gpr-alias")
*EM_PadReadPitch
*EM_PadReadRoll
*EM_PadRegisterSamples
*EM_LoadSlideshow
*EM_StartSlideshow


====Standard: ====


gpr = {}
*patches/
 
*XXXXYYYYY_patches.lua
gpr.zero = 0
*feature_data/
gpr.at  = 1
*XXXXYYYYY_features.lua
gpr.v0  = 2
*tooling/
gpr.v1  = 3
*XXXXYYYYY_tooling.lua
gpr.a0  = 4
*trophy_data/
gpr.a1  = 5
*XXXXYYYYY_trophies.lua
gpr.a2  = 6
gpr.a3  = 7
gpr.t0  = 8
gpr.t1  = 9
gpr.t2  = 10
gpr.t3  = 11
gpr.t4  = 12
gpr.t5  = 13
gpr.t6  = 14
gpr.t7  = 15
gpr.s0  = 16
gpr.s1  = 17
gpr.s2  = 18
gpr.s3  = 19
gpr.s4  = 20
gpr.s5  = 21
gpr.s6  = 22
gpr.s7  = 23
gpr.t8  = 24
gpr.t9  = 25
gpr.k0  = 26
gpr.k1  = 27
gpr.gp  = 28
gpr.sp  = 29
gpr.fp  = 30
gpr.ra  = 31
 
return gpr
 
</pre>
'''multiapp.lua'''
<pre>
-- Recommended method to import this module:
--  local mapp = require("mapp")
--
-- Multi-application support module
-- Wraps common hook calls to support multiple executables
--
 
local emuObj = getEmuObject() -- emulator
local axObj = getAXObject() -- allegrex


mapp = {}
==Information==
mapp.curAppName = emuObj.GetAppName()
====other====


mapp.AddBootHook = function(app, func)
*XXXXYYYYY_config.txt
if mapp[app] == nil then
*--vms
mapp[app] = {}
*--autoresampler [true]
end


mapp[app].boot = func
*videos/
end
*.mp4
 
*videos/%08x.mp4
mapp.AddHook = function(app, pc, verify, func)
*audio/%08x.ogg
if mapp[app] == nil then
*--texswitch [original, replacement]
mapp[app] = {}
end
if mapp[app].hooks == nil then
mapp[app].hooks = {}
mapp[app].hookids = 1
end
local localid = mapp[app].hookids
mapp[app].hookids = mapp[app].hookids + 1
local handler = { addr = pc, v = verify, f = func, id = 0 }
if mapp.curAppName == app then
handler.id = axObj.AddHook(pc, verify, func)
end
-- print(string.format("Added Hook for app: %s, pc=%08x, handler=%d", app, pc, localid))
mapp[app].hooks[localid] = handler
return localid
end
 
mapp.RemoveHook = function(app, hookid)
-- print(string.format("RemoveHook for app: %s, id=%d", app, hookid))
if mapp[app] ~= nil then
if mapp[app].hooks ~= nil then
if mapp[app].hooks[hookid] ~= nil then
local id = mapp[app].hooks[hookid].id
mapp[app].hooks[hookid] = nil -- WBD 7/6/2018
if mapp.curAppName == app and id > 0 then
axObj.RemoveHook(id)
end
end
end
end
end
 
mapp.GetHookPC = function(app, hookid)
if mapp[app] ~= nil then
if mapp[app].hooks ~= nil then
if mapp[app].hooks[hookid] ~= nil then
return mapp[app].hooks[hookid].addr
end
end
end
return 0
end
 
mapp.AddVSyncHook = function(app, func)
if mapp[app] == nil then
mapp[app] = {}
end
mapp[app].vsync = func
if mapp.curAppName == app then
emuObj.AddVsyncHook(func)
end
end
 
mapp.RemoveVSyncHook = function(app)
if mapp[app] == nil then
mapp[app] = {}
end
if mapp[app].vsync ~= nil then
table.remove(mapp[app].vsync)
end
if mapp.curAppName == app then
emuObj.RemoveVsyncHook(func)
end
end
 
-- Actual switch functionality
emuObj.AddBootHook(function()
local app = emuObj.GetAppName()
 
if app ~= mapp.curAppName then
-- switch out the old handlers
-- print(string.format("Switching out handlers for app: %s", mapp.curAppName))
if mapp[mapp.curAppName] ~= nil then
if mapp[mapp.curAppName].vsync ~= nil then
emuObj.RemoveVsyncHook()
end
if mapp[mapp.curAppName].hooks ~= nil then
local hooks = mapp[mapp.curAppName].hooks
-- print(string.format("hooks: %d", #hooks))
for k,v in pairs(hooks) do
if v.id > 0 then
axObj.RemoveHook(v.id)
v.id = 0
end
end
end
end
-- switch current app name
mapp.curAppName = app
-- install the new handlers
-- print(string.format("Switching in handlers for app: %s", mapp.curAppName))
if mapp[mapp.curAppName] ~= nil then
if mapp[mapp.curAppName].vsync ~= nil then
emuObj.AddVsyncHook(mapp[mapp.curAppName].vsync)
end
if mapp[mapp.curAppName].hooks ~= nil then
local hooks = mapp[mapp.curAppName].hooks
-- print(string.format("hooks: %d", #hooks))
for k,v in pairs(hooks) do
v.id = axObj.AddHook(v.addr, v.v, v.f)
end
end
end
end
if mapp[mapp.curAppName] ~= nil then
if mapp[mapp.curAppName].boot ~= nil then
mapp[mapp.curAppName].boot()
end
end
end)
 
return mapp
 
</pre>
 
'''pad.lua'''
<pre>
-- Recommended method to import this module:
--  local pad = require("pad")
--
-- Buttons marked PS4 are not used by the emulator, but can be read from Lua
--
-- Read the Pad state with getEmuObject().PadRead()
-- ie:
-- local padstate = getEmuObject().PadRead()
--
 
pad = {}
 
pad.L3        = 0x00000002 -- L3 (PS4)
pad.R3        = 0x00000004 -- R3 (PS4)
pad.OPTIONS  = 0x00000008 -- Options (PS4)
pad.UP        = 0x00000010 -- Up
pad.RIGHT    = 0x00000020 -- Right
pad.DOWN      = 0x00000040 -- Down
pad.LEFT      = 0x00000080 -- Left
pad.L2        = 0x00000100 -- L2 (PS4)
pad.R2        = 0x00000200 -- R2 (PS4)
pad.L1        = 0x00000400 -- L1
pad.R1        = 0x00000800 -- R1
pad.TRIANGLE  = 0x00001000 -- Triangle
pad.CIRCLE    = 0x00002000 -- Circle
pad.CROSS    = 0x00004000 -- Cross
pad.SQUARE    = 0x00008000 -- Square
pad.SELECT    = 0x00010000 -- Select
pad.START    = 0x00020000 -- Start
 
-- Automap SELECT or START to the Options Button, leaving the full touchar for the opposite, with getEmuObject().PadSetButtonsMode(mode)
-- ie:
-- getEmuObject().PadSetButtonsMode(pad.BUTTONS_MODE_OPTION_IS_SELECT)
 
pad.BUTTONS_MODE_NORMAL = 0 -- Touch bar is split in two for Start/Select. Option is unmapped (default behaviour)
pad.BUTTONS_MODE_OPTION_IS_SELECT = 1 -- Touch bar is Start. Option is Select
pad.BUTTONS_MODE_OPTION_IS_START = 2 -- Touch bar is Select. Option is Start
 
return pad
 
</pre>
 
=Information=
Note: Missing entries
==Folder/File layout==
<pre>
├── assets
│  ├── common
│  └── PSPHD
├── app
│  └── USER_L0.IMG
├── lua_include
│  ├── ax-gpr-alias.lua
│  ├── multiapp.lua
│  ├── sce-locale.lua
│  ├── uv-clamping.lua
│  ├── disc-selection.lua
│  └── pad.lua
├── scripts
│  ├──XXXXYYYYY_patches.lua
│  ├──XXXXYYYYY_features.lua
│  ├──XXXXYYYYY_tooling.lua
│  └──XXXXYYYYY_trophies.lua
├── sce_module
├── sce_sys
├── vms
├── trophy_data
├── usermodule
│  └──libfont.lib
├── sce_discmap.plt
├── eboot.bin
├── revision.conf
├── package-ps4.conf
└── config-title.txt
</pre>
 
==Other==
<pre>
XXXXYYYYY_config.txt
videos/
.mp4
videos/%08x.mp4
audio/%08x.ogg


Paths:  
Paths:  


/app0/
*/app0/
/download0/
*/download0/
/savedata
*/savedata
/host/
*/host/
/hostapp/
*/hostapp/
/data/
*/data/
</pre>


==Sample==
====sample====


<pre>; PS4 configuration file for PSPHD
<pre>; PS4 configuration file for PSPHD
Line 1,597: Line 835:
; With this we can freely make use of a normal alpha channel on replacement textures
; With this we can freely make use of a normal alpha channel on replacement textures
--replacementalpha=true
--replacementalpha=true
; This enables bilinear filtering on replaced textures. (uncomment to enable)
--replacementfilter=true
   
   
; Antialiasing mode. SSAA4x looks best, MSAA4x only smooths edges.
; Antialiasing mode. SSAA4x looks best, MSAA4x only smooths edges.
Line 1,610: Line 851:
; 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)
<pre>
--volume="0.25"</pre>
|HLEInterruptManager|
 
===NIDs in HLE===
 
=====HLEInterruptManager=====
 
*sceKernelRegisterSubIntrHandler
*sceKernelReleaseSubIntrHandler
*sceKernelEnableSubIntr
 
=====HLEStdioForUser=====


sceKernelRegisterSubIntrHandler
*sceIoOpen
sceKernelReleaseSubIntrHandler
*sceIoClose
sceKernelEnableSubIntr
*sceIoRead
*sceIoWrite
*sceIoLseek
*sceIoLseek32
*sceIoDopen
*sceIoDread
*sceIoDclose
*sceIoChdir
*sceIoGetstat
*sceIoDevctl
*sceIoRename
*sceIoMkDir
*sceIoChstat
*sceIoRemove
*sceIoRmdir
*sceIoOpenAsync
*sceIoReadAsync
*sceIoIoctlAsync
*sceIoWaitAsync
*sceIoWaitAsyncCB
*sceIoCloseAsync
*sceIoSetAsyncCallback
*sceIoPollAsync
*sceIoLseekAsync
*sceIoGetAsyncStat
*asyncWaitTimerCallback
*asyncCallbackTimerCallback
*sceKernelStdin
*sceKernelStdout
*sceKernelStderr


|HLEStdioForUser|
=====HLELoadExecForUser=====


sceIoOpen
*sceKernelCpuSuspendIntr
sceIoClose
*sceKernelCpuResumeIntr
sceIoRead
*sceKernelIsCpuIntrEnable
sceIoWrite
*sceKernelExitGame
sceIoLseek
*sceKernelRegisterExitCallback
sceIoLseek32
*sceKernelLoadModule
sceIoDopen
*sceKernelUnloadModule
sceIoDread
*sceKernelStartModule
sceIoDclose
*sceKernelStopModule
sceIoChdir
*sceKernelStopUnloadSelfModule
sceIoGetstat
*sceKernelGetModuleIdByAddress
sceIoDevctl
*sceKernelStopUnloadSelfModuleWithStatus
sceIoRename
*sceKernelGetModuleId
sceIoMkDir
sceIoChstat
sceIoRemove
sceIoRmdir
sceIoOpenAsync
sceIoReadAsync
sceIoIoctlAsync
sceIoWaitAsync
sceIoWaitAsyncCB
sceIoCloseAsync
sceIoSetAsyncCallback
sceIoPollAsync
sceIoLseekAsync
sceIoGetAsyncStat
asyncWaitTimerCallback
asyncCallbackTimerCallback
sceKernelStdin
sceKernelStdout
sceKernelStderr


|HLELoadExecForUser|
=====HLEsceAtrac3plus=====


sceKernelCpuSuspendIntr
*sceAtracReinit
sceKernelCpuResumeIntr
*sceAtracDecodeData
sceKernelIsCpuIntrEnable
*sceAtracGetNextDecodePosition
sceKernelExitGame
*sceAtracSetHalfwayBufferAndGetID
sceKernelRegisterExitCallback
*sceAtracGetSoundSample
sceKernelLoadModule
*sceAtracGetStreamDataInfo
sceKernelUnloadModule
*sceAtracGetRemainFrame
sceKernelStartModule
*sceAtracSetLoopNum
sceKernelStopModule
*sceAtracResetPlayPosition
sceKernelStopUnloadSelfModule
*sceAtracReleaseAtracID
sceKernelGetModuleIdByAddress
*sceAtracGetAtracID
sceKernelStopUnloadSelfModuleWithStatus
*sceAtracGetNextSample
sceKernelGetModuleId
*sceAtracSetData
*sceAtracAddStreamData


|HLEsceAtrac3plus|
=====HLEsceAudio=====


sceAtracReinit
*sceAudioChReserve
sceAtracDecodeData
*sceAudioChRelease
sceAtracGetNextDecodePosition
*sceAudioOutputBlocking
sceAtracSetHalfwayBufferAndGetID
*sceAudioChangeChannelConfig
sceAtracGetSoundSample
*sceAudioGetChannelRestLength
sceAtracGetStreamDataInfo
*sceAudioChangeChannelVolume
sceAtracGetRemainFrame
*sceAudioSetChannelDataLen
sceAtracSetLoopNum
*sceAudioOutputPanned
sceAtracResetPlayPosition
*sceAudioOutputPannedBlocking
sceAtracReleaseAtracID
*sceAudioGetChannelRestLen
sceAtracGetAtracID
*sceAudioOutput2Reserve
sceAtracGetNextSample
*sceAudioOutput2OutputBlocking
sceAtracSetData
*sceAudioOutput2Release
sceAtracAddStreamData
*outputCallback


|HLEsceAudio|
=====HLEsceCtrl=====


sceAudioChReserve
*sceCtrlSetSamplingCycle
sceAudioChRelease
*sceCtrlSetSamplingMode
sceAudioOutputBlocking
*sceCtrlReadBufferPositive
sceAudioChangeChannelConfig
*sceCtrlReadBufferNegative
sceAudioGetChannelRestLength
*sceCtrlPeekBufferPositive
sceAudioChangeChannelVolume
*sceCtrlPeekBufferNegative
sceAudioSetChannelDataLen
*sceCtrlGetIdleCancelThreshold
sceAudioOutputPanned
*sceCtrlSetIdleCancelThreshold
sceAudioOutputPannedBlocking
*sceCtrlReadLatch
sceAudioGetChannelRestLen
*sceCtrlPeekLatch
sceAudioOutput2Reserve
*sampleControllerCallback
sceAudioOutput2OutputBlocking
*vibrationControllerCallback
sceAudioOutput2Release
outputCallback


|HLEsceCtrl|
=====HLEsceDisplay=====


sceCtrlSetSamplingCycle
*sceDisplaySetMode
sceCtrlSetSamplingMode
*sceDisplaySetFramebuf
sceCtrlReadBufferPositive
*sceDisplayGetFramebuf
sceCtrlReadBufferNegative
*sceDisplayGetVcount
sceCtrlPeekBufferPositive
*sceDisplayWaitVblankStart
sceCtrlPeekBufferNegative
*sceDisplayWaitVblankStartCB
sceCtrlGetIdleCancelThreshold
*sceDisplayGetCurrentHcount
sceCtrlSetIdleCancelThreshold
*sceDisplayGetAccumulatedHcount
sceCtrlReadLatch
*sceDisplayGetFramePerSec
sceCtrlPeekLatch
*sceDisplayWaitVblank
sampleControllerCallback
*sceDisplayWaitVblankCB
vibrationControllerCallback
*sceDisplayIsVblank
*sceDisplaySetHoldMode
*vblankStart
*vblankEnd


|HLEsceDisplay|
=====HLEsceGe_user=====


sceDisplaySetMode
*sceGeEdramGetAddr
sceDisplaySetFramebuf
*sceGeEdramGetSize
sceDisplayGetFramebuf
*sceGeGetCmd
sceDisplayGetVcount
*sceGeGetMtx
sceDisplayWaitVblankStart
*sceGeListEnQueue
sceDisplayWaitVblankStartCB
*sceGeListEnQueueHead
sceDisplayGetCurrentHcount
*sceGeListDeQueue
sceDisplayGetAccumulatedHcount
*sceGeListSync
sceDisplayGetFramePerSec
*sceGeListUpdateStallAddr
sceDisplayWaitVblank
*sceGeDrawSync
sceDisplayWaitVblankCB
*sceGeSetCallback
sceDisplayIsVblank
*sceGeUnsetCallback
sceDisplaySetHoldMode
*sceGeBreak
vblankStart
*sceGeContinue
vblankEnd
*interruptCallback


|HLEsceGe_user|
=====HLEsceImpose=====


sceGeEdramGetAddr
*sceImposeGetLanguageMode
sceGeEdramGetSize
*sceImposeSetLanguageMode
sceGeGetCmd
*sceImposeSetUMDPopup
sceGeGetMtx
sceGeListEnQueue
sceGeListEnQueueHead
sceGeListDeQueue
sceGeListSync
sceGeListUpdateStallAddr
sceGeDrawSync
sceGeSetCallback
sceGeUnsetCallback
sceGeBreak
sceGeContinue
interruptCallback


|HLEsceImpose|
=====HLEsceMpeg=====


sceImposeGetLanguageMode
*sceMpegInit
sceImposeSetLanguageMode
*sceMpegFinish
sceImposeSetUMDPopup
*sceMpegCreate
*sceMpegDelete
*sceMpegQueryMemSize
*sceMpegMallocAvcEsBuf
*sceMpegFreeAvcEsBuf
*sceMpegInitAu
*sceMpegGetAvcAu
*sceMpegGetAtracAu
*sceMpegQueryAtracEsSize
*sceMpegAtracDecode
*sceMpegRingbufferQueryMemSize
*sceMpegRingbufferConstruct
*sceMpegRingbufferDestruct
*sceMpegRingbufferPut
*sceMpegRingbufferAvailableSize
*sceMpegAvcCsc
*sceMpegAvcDecodeMode
*sceMpegAvcDecodeDetail
*sceMpegAvcDecodeFlush
*sceMpegAvcQueryYCbCrSize
*sceMpegAvcInitYCbCr
*sceMpegAvcDecodeYCbCr
*sceMpegAvcDecodeStopYCbCr
*sceMpegRegistStream
*sceMpegUnRegistStream
*sceMpegQueryStreamSize
*sceMpegQueryStreamOffset
*sceMpegFlushAllStream


|HLEsceMpeg|
=====HLEsceNet=====


sceMpegInit
*sceNetInit
sceMpegFinish
*sceNetInetGetsockopt
sceMpegCreate
*sceNetInetSetsockopt
sceMpegDelete
*sceNetInetGetErrno
sceMpegQueryMemSize
sceMpegMallocAvcEsBuf
sceMpegFreeAvcEsBuf
sceMpegInitAu
sceMpegGetAvcAu
sceMpegGetAtracAu
sceMpegQueryAtracEsSize
sceMpegAtracDecode
sceMpegRingbufferQueryMemSize
sceMpegRingbufferConstruct
sceMpegRingbufferDestruct
sceMpegRingbufferPut
sceMpegRingbufferAvailableSize
sceMpegAvcCsc
sceMpegAvcDecodeMode
sceMpegAvcDecodeDetail
sceMpegAvcDecodeFlush
sceMpegAvcQueryYCbCrSize
sceMpegAvcInitYCbCr
sceMpegAvcDecodeYCbCr
sceMpegAvcDecodeStopYCbCr
sceMpegRegistStream
sceMpegUnRegistStream
sceMpegQueryStreamSize
sceMpegQueryStreamOffset
sceMpegFlushAllStream


|HLEsceNet|
=====HLEscePower=====


sceNetInit
*scePowerRegisterCallback
sceNetInetGetsockopt
*scePowerUnregisterCallback
sceNetInetSetsockopt
*scePowerSetClockFrequency
sceNetInetGetErrno
*scePowerSetCpuClockFrequency
*scePowerSetBusClockFrequency


|HLEscePower|
=====HLEscePsmf=====


scePowerRegisterCallback
*scePsmfVerifyPsmf
scePowerUnregisterCallback
*scePsmfSetPsmf
scePowerSetClockFrequency
*scePsmfSpecifyStreamWithStreamTypeNumber
scePowerSetCpuClockFrequency
*scePsmfCheckEPmap
scePowerSetBusClockFrequency
*scePsmfGetVideoInfo
*scePsmfGetNumberOfStreams
*scePsmfGetNumberOfEPentries
*scePsmfGetEPWithId
*scePsmfGetPsmfVersion
*scePsmfGetNumberOfSpecificStreams
*scePsmfSpecifyStream
*scePsmfGetCurrentStreamType


|HLEscePsmf|
=====HLEscePsmfPlayer=====


scePsmfVerifyPsmf
*scePsmfPlayerCreate
scePsmfSetPsmf
*scePsmfPlayerDelete
scePsmfSpecifyStreamWithStreamTypeNumber
*scePsmfPlayerSetPsmf
scePsmfCheckEPmap
*scePsmfPlayerReleasePsmf
scePsmfGetVideoInfo
*scePsmfPlayerStart
scePsmfGetNumberOfStreams
*scePsmfPlayerGetAudioOutSize
scePsmfGetNumberOfEPentries
*scePsmfPlayerStop
scePsmfGetEPWithId
*scePsmfPlayerUpdate
scePsmfGetPsmfVersion
*scePsmfPlayerGetVideoData
scePsmfGetNumberOfSpecificStreams
*scePsmfPlayerGetAudioData
scePsmfSpecifyStream
*scePsmfPlayerGetCurrentStatus
scePsmfGetCurrentStreamType
*scePsmfPlayerGetPsmfInfo
*scePsmfPlayerConfigPlayer
*scePsmfPlayerBreak
*scePsmfPlayerChangePlayMode


|HLEscePsmfPlayer|
=====HLEsceRtc=====


scePsmfPlayerCreate
*sceRtcGetCurrentTick
scePsmfPlayerDelete
*sceRtcGetAccumulativeTime
scePsmfPlayerSetPsmf
*sceRtcGetCurrentClockLocalTime
scePsmfPlayerReleasePsmf
scePsmfPlayerStart
scePsmfPlayerGetAudioOutSize
scePsmfPlayerStop
scePsmfPlayerUpdate
scePsmfPlayerGetVideoData
scePsmfPlayerGetAudioData
scePsmfPlayerGetCurrentStatus
scePsmfPlayerGetPsmfInfo
scePsmfPlayerConfigPlayer
scePsmfPlayerBreak
scePsmfPlayerChangePlayMode


|HLEsceRtc|
=====HLEsceSasCore=====


sceRtcGetCurrentTick
*sceSasInit
sceRtcGetAccumulativeTime
*sceSasCore
sceRtcGetCurrentClockLocalTime
*sceSasCoreWithMix
*sceSasGetEndFlag
*sceSasGetPauseFlag
*sceSasGetEnvelopeHeight
*sceSasGetAllEnvelopeHeights
*sceSasGetOutputMode
*sceSasSetOutputMode
*sceSasGetGrain
*sceSasSetGrain
*sceSasSetVoice
*sceSasSetNoise
*sceSasSetPitch
*sceSasSetVolume
*sceSasSetSimpleADSR
*sceSasSetKeyOn
*sceSasSetKeyOff
*sceSasSetPause
*sceSasSetSL
*sceSasSetADSR
*sceSasSetADSRMode
*sceSasRevEVOL
*sceSasRevType
*sceSasRevParam
*sceSasRevVON


|HLEsceSasCore|
=====HLEsceSuspendForUser=====


sceSasInit
*sceKernelPowerTick
sceSasCore
*sceKernelPowerLock
sceSasCoreWithMix
*sceKernelPowerUnlock
sceSasGetEndFlag
*sceKernelVolatileMemTryLock
sceSasGetPauseFlag
*sceKernelVolatileMemUnlock
sceSasGetEnvelopeHeight
*sceKernelVolatileMemLock
sceSasGetAllEnvelopeHeights
sceSasGetOutputMode
sceSasSetOutputMode
sceSasGetGrain
sceSasSetGrain
sceSasSetVoice
sceSasSetNoise
sceSasSetPitch
sceSasSetVolume
sceSasSetSimpleADSR
sceSasSetKeyOn
sceSasSetKeyOff
sceSasSetPause
sceSasSetSL
sceSasSetADSR
sceSasSetADSRMode
sceSasRevEVOL
sceSasRevType
sceSasRevParam
sceSasRevVON


|HLEsceSuspendForUser|
=====HLEsceUmdUser=====


sceKernelPowerTick
*sceUmdActivate
sceKernelPowerLock
*sceUmdGetDriveStat
sceKernelPowerUnlock
*sceUmdCheckMedium
sceKernelVolatileMemTryLock
*sceUmdRegisterUMDCallback
sceKernelVolatileMemUnlock
*sceUmdUnRegisterUMDCallBack
sceKernelVolatileMemLock
*sceUmdWaitDriveStat
*sceUmdWaitDriveStatWithTimer
*sceUmdWaitDriveStatCB
*sceUmdCancelWaitDriveStat
*_UmdWaitDriveTimeout


|HLEsceUmdUser|
=====HLEsceUtility=====


sceUmdActivate
*sceUtilityLoadModule
sceUmdGetDriveStat
*sceUtilityUnloadModule
sceUmdCheckMedium
*sceUtilityLoadNetModule
sceUmdRegisterUMDCallback
*sceUtilityUnloadNetModule
sceUmdUnRegisterUMDCallBack
*sceUtilityLoadAvModule
sceUmdWaitDriveStat
*sceUtilityUnloadAvModule
sceUmdWaitDriveStatWithTimer
*sceUtilityGetSystemParamInt
sceUmdWaitDriveStatCB
*sceUtilityGetSystemParamString
sceUmdCancelWaitDriveStat
*sceUtilitySavedataGetStatus
_UmdWaitDriveTimeout
*sceUtilitySavedataShutdownStart
*sceUtilitySavedataInitStart
*sceUtilitySavedataUpdate
*sceUtilityMsgDialogGetStatus
*sceUtilityMsgDialogShutdownStart
*sceUtilityMsgDialogInitStart
*sceUtilityMsgDialogUpdate
*sceUtilityMsgDialogAbort
*sceUtilityOskGetStatus
*sceUtilityOskShutdownStart
*sceUtilityOskInitStart
*sceUtilityOskUpdate
*saveDataUpdateCallback
*oskUpdateCallback


|HLEsceUtility|
=====HLEsceWlanDrv=====


sceUtilityLoadModule
*sceWlanGetSwitchState
sceUtilityUnloadModule
*sceWlanGetEtherAddr
sceUtilityLoadNetModule
sceUtilityUnloadNetModule
sceUtilityLoadAvModule
sceUtilityUnloadAvModule
sceUtilityGetSystemParamInt
sceUtilityGetSystemParamString
sceUtilitySavedataGetStatus
sceUtilitySavedataShutdownStart
sceUtilitySavedataInitStart
sceUtilitySavedataUpdate
sceUtilityMsgDialogGetStatus
sceUtilityMsgDialogShutdownStart
sceUtilityMsgDialogInitStart
sceUtilityMsgDialogUpdate
sceUtilityMsgDialogAbort
sceUtilityOskGetStatus
sceUtilityOskShutdownStart
sceUtilityOskInitStart
sceUtilityOskUpdate
saveDataUpdateCallback
oskUpdateCallback


|HLEsceWlanDrv|
=====HLESysMemUserForUser=====


sceWlanGetSwitchState
*sceKernelMaxFreeMemSize
sceWlanGetEtherAddr
*sceKernelTotalFreeMemSize
*sceKernelQueryMemoryInfo
*sceKernelDevkitVersion
*sceKernelPrintf
*sceKernelGetPTRIG
*sceKernelSetPTRIG
*sceKernelAllocPartitionMemory
*sceKernelFreePartitionMemory
*sceKernelGetBlockHeadAddr
*sceKernelGetMemoryBlockAddr
*sceKernelAllocMemoryBlock
*sceKernelFreeMemoryBlock
*sceKernelSetCompilerVersion
*sceKernelGetCompiledSdkVersion
*sceKernelSetCompiledSdkVersion
*sceKernelSetCompiledSdkVersion370
*sceKernelSetCompiledSdkVersion380_390
*sceKernelSetCompiledSdkVersion395
*sceKernelSetCompiledSdkVersion401_402
*sceKernelSetCompiledSdkVersion500_505
*sceKernelSetCompiledSdkVersion507
*sceKernelSetCompiledSdkVersion600_602
*sceKernelSetCompiledSdkVersion603_605
*sceKernelSetCompiledSdkVersion606
*sceKernelSetUsersystemLibWork
*sceKernelSysMemUserForUser_ACBD88CA
*sceKernelSysMemUserForUser_D8DE5C1E
*sceKernelSysMemUserForUser_945E45DA


|HLESysMemUserForUser|
=====HLEThreadManForUser=====


sceKernelMaxFreeMemSize
*sceKernelDelayThread
sceKernelTotalFreeMemSize
*sceKernelDelayThreadCB
sceKernelQueryMemoryInfo
*sceKernelCreateCallback
sceKernelDevkitVersion
*sceKernelDeleteCallback
sceKernelPrintf
*sceKernelSleepThread
sceKernelGetPTRIG
*sceKernelSleepThreadCB
sceKernelSetPTRIG
*sceKernelWakeupThread
sceKernelAllocPartitionMemory
*sceKernelCreateMsgPipe
sceKernelFreePartitionMemory
*sceKernelDeleteMsgPipe
sceKernelGetBlockHeadAddr
*sceKernelSendMsgPipe
sceKernelGetMemoryBlockAddr
*sceKernelTrySendMsgPipe
sceKernelAllocMemoryBlock
*sceKernelReceiveMsgPipe
sceKernelFreeMemoryBlock
*sceKernelTryReceiveMsgPipe
sceKernelSetCompilerVersion
*sceKernelReferMsgPipeStatus
sceKernelGetCompiledSdkVersion
*sceKernelCreateThread
sceKernelSetCompiledSdkVersion
*sceKernelStartThread
sceKernelSetCompiledSdkVersion370
*sceKernelExitThread
sceKernelSetCompiledSdkVersion380_390
*sceKernelDeleteThread
sceKernelSetCompiledSdkVersion395
*sceKernelExitDeleteThread
sceKernelSetCompiledSdkVersion401_402
*sceKernelGetThreadExitStatus
sceKernelSetCompiledSdkVersion500_505
*sceKernelTerminateThread
sceKernelSetCompiledSdkVersion507
*sceKernelTerminateDeleteThread
sceKernelSetCompiledSdkVersion600_602
*sceKernelWaitThreadEnd
sceKernelSetCompiledSdkVersion603_605
*sceKernelWaitThreadEndCB
sceKernelSetCompiledSdkVersion606
*sceKernelRotateThreadReadyQueue
sceKernelSetUsersystemLibWork
*sceKernelReferThreadStatus
sceKernelSysMemUserForUser_ACBD88CA
*sceKernelSuspendDispatchThread
sceKernelSysMemUserForUser_D8DE5C1E
*sceKernelResumeDispatchThread
sceKernelSysMemUserForUser_945E45DA
*sceKernelSuspendThread
*sceKernelResumeThread
*sceKernelCancelWakeupThread
*sceKernelGetThreadStackFreeSize
*sceKernelGetSystemTimeLow
*sceKernelGetSystemTime
*sceKernelGetSystemTimeWide
*sceKernelGetThreadCurrentPriority
*sceKernelChangeCurrentThreadAttr
*sceKernelGetThreadId
*sceKernelChangeThreadPriority
*sceKernelReferThreadProfiler
*sceKernelCheckCallback
*sceKernelCancelSema
*sceKernelCreateSema
*sceKernelDeleteSema
*sceKernelPollSema
*sceKernelSignalSema
*sceKernelReferSemaStatus
*sceKernelWaitSema
*sceKernelWaitSemaCB
*sceKernelCreateFpl
*sceKernelDeleteFpl
*sceKernelAllocateFpl
*sceKernelAllocateFplCB
*sceKernelTryAllocateFpl
*sceKernelFreeFpl
*sceKernelCancelFpl
*sceKernelReferFplStatus
*sceKernelCreateVpl
*sceKernelDeleteVpl
*sceKernelAllocateVpl
*sceKernelAllocateVplCB
*sceKernelTryAllocateVpl
*sceKernelFreeVpl
*sceKernelCancelVpl
*sceKernelReferVplStatus
*sceKernelCreateEventFlag
*sceKernelSetEventFlag
*sceKernelDeleteEventFlag
*sceKernelClearEventFlag
*sceKernelWaitEventFlag
*sceKernelWaitEventFlagCB
*sceKernelPollEventFlag
*sceKernelCancelEventFlag
*sceKernelReferEventFlagStatus
*sceKernelCreateMbx
*sceKernelDeleteMbx
*sceKernelSendMbx
*sceKernelReceiveMbx
*sceKernelReceiveMbxCB
*sceKernelPollMbx
*sceKernelCancelReceiveMbx
*sceKernelReferMbxStatus
*sceKernelCreateMutex
*sceKernelDeleteMutex
*sceKernelLockMutex
*sceKernelLockMutexCB
*sceKernelTryLockMutex
*sceKernelUnlockMutex
*sceKernelCancelMutex
*sceKernelReferMutexStatus
*_sceKernelDelayThreadCallback
*_sceKernelWaitThreadEndTimeout
*_sceKernelAllocateFplTimeout
*_sceKernelAllocateVplTimeout
*_sceKernelWaitEventFlagTimeout
*_sceKernelMsgPipeTimeout
*_sceKernelLockMutexTimeout


|HLEThreadManForUser|
=====HLEUtilsForKernel=====


sceKernelDelayThread
*sceKernelIcacheInvalidateRange
sceKernelDelayThreadCB
sceKernelCreateCallback
sceKernelDeleteCallback
sceKernelSleepThread
sceKernelSleepThreadCB
sceKernelWakeupThread
sceKernelCreateMsgPipe
sceKernelDeleteMsgPipe
sceKernelSendMsgPipe
sceKernelTrySendMsgPipe
sceKernelReceiveMsgPipe
sceKernelTryReceiveMsgPipe
sceKernelReferMsgPipeStatus
sceKernelCreateThread
sceKernelStartThread
sceKernelExitThread
sceKernelDeleteThread
sceKernelExitDeleteThread
sceKernelGetThreadExitStatus
sceKernelTerminateThread
sceKernelTerminateDeleteThread
sceKernelWaitThreadEnd
sceKernelWaitThreadEndCB
sceKernelRotateThreadReadyQueue
sceKernelReferThreadStatus
sceKernelSuspendDispatchThread
sceKernelResumeDispatchThread
sceKernelSuspendThread
sceKernelResumeThread
sceKernelCancelWakeupThread
sceKernelGetThreadStackFreeSize
sceKernelGetSystemTimeLow
sceKernelGetSystemTime
sceKernelGetSystemTimeWide
sceKernelGetThreadCurrentPriority
sceKernelChangeCurrentThreadAttr
sceKernelGetThreadId
sceKernelChangeThreadPriority
sceKernelReferThreadProfiler
sceKernelCheckCallback
sceKernelCancelSema
sceKernelCreateSema
sceKernelDeleteSema
sceKernelPollSema
sceKernelSignalSema
sceKernelReferSemaStatus
sceKernelWaitSema
sceKernelWaitSemaCB
sceKernelCreateFpl
sceKernelDeleteFpl
sceKernelAllocateFpl
sceKernelAllocateFplCB
sceKernelTryAllocateFpl
sceKernelFreeFpl
sceKernelCancelFpl
sceKernelReferFplStatus
sceKernelCreateVpl
sceKernelDeleteVpl
sceKernelAllocateVpl
sceKernelAllocateVplCB
sceKernelTryAllocateVpl
sceKernelFreeVpl
sceKernelCancelVpl
sceKernelReferVplStatus
sceKernelCreateEventFlag
sceKernelSetEventFlag
sceKernelDeleteEventFlag
sceKernelClearEventFlag
sceKernelWaitEventFlag
sceKernelWaitEventFlagCB
sceKernelPollEventFlag
sceKernelCancelEventFlag
sceKernelReferEventFlagStatus
sceKernelCreateMbx
sceKernelDeleteMbx
sceKernelSendMbx
sceKernelReceiveMbx
sceKernelReceiveMbxCB
sceKernelPollMbx
sceKernelCancelReceiveMbx
sceKernelReferMbxStatus
sceKernelCreateMutex
sceKernelDeleteMutex
sceKernelLockMutex
sceKernelLockMutexCB
sceKernelTryLockMutex
sceKernelUnlockMutex
sceKernelCancelMutex
sceKernelReferMutexStatus
_sceKernelDelayThreadCallback
_sceKernelWaitThreadEndTimeout
_sceKernelAllocateFplTimeout
_sceKernelAllocateVplTimeout
_sceKernelWaitEventFlagTimeout
_sceKernelMsgPipeTimeout
_sceKernelLockMutexTimeout


|HLEUtilsForKernel|
=====HLEUtilsForUser=====


sceKernelIcacheInvalidateRange
*sceKernelIcacheInvalidateRange
*sceKernelDcacheInvalidateRange
*sceKernelDcacheWritebackInvalidateRange
*sceKernelDcacheWritebackAll
*sceKernelDcacheWritebackRange
*sceKernelDcacheWritebackInvalidateAll
*sceKernelSetGPO
*sceKernelGetGPI
*sceKernelLibcClock
*sceKernelLibcTime
*sceKernelLibcGettimeofday 0x71EC4271


|HLEUtilsForUser|
===Unimplemented functions===


sceKernelIcacheInvalidateRange
*sceIoChdir() unimplemented, ignoring
sceKernelDcacheInvalidateRange
*sceIoChstat unimplemented, ignoring
sceKernelDcacheWritebackInvalidateRange
*sceKernelExitGame() unimplemented
sceKernelDcacheWritebackAll
*sceKernelStopUnloadSelfModule() unimplemented
sceKernelDcacheWritebackRange
*sceKernelStopUnloadSelfModuleWithStatus() unimplemented
sceKernelDcacheWritebackInvalidateAll
*sceGeGetMtx() unimplemented
sceKernelSetGPO
*sceGeListDeQueue() unimplemented
sceKernelGetGPI
*sceGeBreak unimplemented
sceKernelLibcClock
*sceGeContinue unimplemented
sceKernelLibcTime
*sceNetInetGetsockopt() unimplemented
sceKernelLibcGettimeofday 0x71EC4271
*sceNetInetSetsockopt() unimplemented
</pre>
*sceNetInetGetErrno() unimplemented
*sceWlanGetEtherAddr unimplemented
*sceKernelQueryMemoryInfo() unimplemented
*sceKernelGetPTRIG() unimplemented
*sceKernelSetPTRIG() unimplemented
*sceKernelSetCompiledSdkVersion401_402() unimplemented
*sceKernelSetCompiledSdkVersion507() unimplemented
*sceKernelSetCompiledSdkVersion600_602() unimplemented
*sceKernelSetCompiledSdkVersion603_605() unimplemented
*sceKernelSetUsersystemLibWork() unimplemented
*sceKernelSysMemUserForUser_ACBD88CA() unimplemented
*sceKernelSysMemUserForUser_D8DE5C1E() unimplemented -- sceKernelSafetyCheck0
*sceKernelSysMemUserForUser_945E45DA() unimplemented
*sceKernelTerminateDeleteThread() unimplemented
*sceKernelCancelSema unimplemented
*sceKernelCancelFpl unimplemented
*sceKernelReferFplStatus unimplemented
*sceKernelCancelVpl unimplemented
*sceKernelCreateMbx unimplemented
*sceKernelDeleteMbx unimplemented
*sceKernelSendMbx unimplemented
*sceKernelReceiveMbx unimplemented
*sceKernelReceiveMbxCB unimplemented
*sceKernelPollMbx unimplemented
*sceKernelCancelReceiveMbx unimplemented
*sceKernelReferMbxStatus unimplemented


==Unimplemented functions==
<pre>
sceIoChdir() unimplemented, ignoring
sceIoChstat unimplemented, ignoring
sceKernelExitGame() unimplemented
sceKernelStopUnloadSelfModule() unimplemented
sceKernelStopUnloadSelfModuleWithStatus() unimplemented
sceGeGetMtx() unimplemented
sceGeListDeQueue() unimplemented
sceGeBreak unimplemented
sceGeContinue unimplemented
sceNetInetGetsockopt() unimplemented
sceNetInetSetsockopt() unimplemented
sceNetInetGetErrno() unimplemented
sceWlanGetEtherAddr unimplemented
sceKernelQueryMemoryInfo() unimplemented
sceKernelGetPTRIG() unimplemented
sceKernelSetPTRIG() unimplemented
sceKernelSetCompiledSdkVersion401_402() unimplemented
sceKernelSetCompiledSdkVersion507() unimplemented
sceKernelSetCompiledSdkVersion600_602() unimplemented
sceKernelSetCompiledSdkVersion603_605() unimplemented
sceKernelSetUsersystemLibWork() unimplemented
sceKernelSysMemUserForUser_ACBD88CA() unimplemented
sceKernelSysMemUserForUser_D8DE5C1E() unimplemented -- sceKernelSafetyCheck0
sceKernelSysMemUserForUser_945E45DA() unimplemented
sceKernelTerminateDeleteThread() unimplemented
sceKernelCancelSema unimplemented
sceKernelCancelFpl unimplemented
sceKernelReferFplStatus unimplemented
sceKernelCancelVpl unimplemented
sceKernelCreateMbx unimplemented
sceKernelDeleteMbx unimplemented
sceKernelSendMbx unimplemented
sceKernelReceiveMbx unimplemented
sceKernelReceiveMbxCB unimplemented
sceKernelPollMbx unimplemented
sceKernelCancelReceiveMbx unimplemented
sceKernelReferMbxStatus unimplemented
</pre>


===Partially Supported===
===Partially Supported===
<pre>
'''sceIoIoctl'''
|sceIoIoctl|


supported:
supported:
0x1010005 (UMD file seek set)
* 0x1010005 (UMD file seek set)
0x1020006 (Get UMD file start sector)  
* 0x1020006 (Get UMD file start sector)  


|sceIoDevctl|
'''sceIoDevctl'''


supported:
supported:
0x1F100A4 (Prepare UMD data into cache)
* 0x1F100A4 (Prepare UMD data into cache)
0x2415821 (MScmRegisterMSInsertEjectCallback)
* 0x2415821 (MScmRegisterMSInsertEjectCallback)
0x2415822 (MScmUnregisterMSInsertEjectCallback)
* 0x2415822 (MScmUnregisterMSInsertEjectCallback)
0x2025806 (Check if the device is inserted (mscmhc0))
* 0x2025806 (Check if the device is inserted (mscmhc0))
0x2425823 (Check if FAT enabled)
* 0x2425823 (Check if FAT enabled)
0x2415823 (Set FAT as enabled), supported
* 0x2415823 (Set FAT as enabled), supported
</pre>
 
==Restricted==
<pre>
scePowerRegisterCallback - ignoring
scePowerUnregisterCallback - ignoring
scePowerSetClockFrequency - ignoring
scePowerSetCpuClockFrequency(%d) - ignoring
scePowerSetBusClockFrequency(%d) - ignoring
sceUtilityMsgDialogInitStart ignored
</pre>


===Links===
===Restricted===
* https://forums.ppsspp.org/showthread.php?tid=1473
*scePowerRegisterCallback - ignoring
* https://forums.ppsspp.org/showthread.php?tid=11961
*scePowerUnregisterCallback - ignoring
* https://github.com/LunaMoo/PPSSPP_workarounds/blob/master/cheat.db
*scePowerSetClockFrequency - ignoring
* https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files
*scePowerSetCpuClockFrequency(%d) - ignoring
* https://www.psdevwiki.com/ps4/PSP_Emulator_Compatibility_List
*scePowerSetBusClockFrequency(%d) - ignoring
*sceUtilityMsgDialogInitStart ignored


===More Information:===
===More Information:===
** https://pastebin.com/CXRpVLdd (by [[User:DarkElement]])
* https://gbatemp.net/threads/wip-psp-injection.503103/
* https://gbatemp.net/threads/wip-psp-injection.503103/
* https://twitter.com/zordon605/status/993758941627772929
* https://twitter.com/zordon605/status/993758941627772929
* https://forums.ppsspp.org/showthread.php?tid=22787
* https://forums.ppsspp.org/showthread.php?tid=22787
** https://pastebin.com/CXRpVLdd (by [[User:DarkElement]])
* https://twitter.com/notzecoxao/status/993950722600460296
* https://twitter.com/notzecoxao/status/993950722600460296
* https://twitter.com/ZiL0G80/status/994112249810866176
* https://twitter.com/ZiL0G80/status/994112249810866176
Please note that all contributions to PS4 Developer wiki are considered to be released under the GNU Free Documentation License 1.2 (see PS4 Developer wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To protect the wiki against automated edit spam, we kindly ask you to solve the following hCaptcha:

Cancel Editing help (opens in new window)