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.
<pre>The new ps plus psp emulator has a lot of undiscovered functionality. it even allows patches directly to the 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.
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'''.
=== CLI commands ===
=== config-emu-ps4.txt commands ===
These commands can be added to any of these files:
''General purpose CLI commands, or unknown usage''
* '''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]
|-
|-
| --notrophies || || Enable/disable trophies||  
| --notrophies || || Enable/disable trophies||  
|-
| --ps4-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 || ? || ? ||
|-style="background-color:#ff99c2"
| || Graphical fixes || ||
|-
|-
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off
| --vramcopyback || 0, 10000000 || || --vramcopyback=45
|-
|-
| --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
| --msxxadhoc || true?, false? || ad hoc support ? ||
|-
|-
| --texclutmode || filter, full || || --texclutmode=full
|}
====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?) ||
|-
|-
| --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  ||
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off
|-
|-
| --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
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || Seems to be a selector of texture caching method|| --texcachemode=patchworkheroes
|-
|-
| --locorocomeshsmoothnonindexed || true, false || Turns "locorocomeshsmooth" mesh smoothing into non-indexed(?) ||--locorocomeshsmoothnonindexed=true
| --texclutmode || filter, full || || --texclutmode=full
|-
|-
| --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
| --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  ||
|-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
| --depthscalehack || true?, false? || ||--depthscalehack=true
|-style="background-color:#03fcc2"
|  || No effect / unknown values || ||
|-
|-
| --texloadcores || 0, 100 || textures to load || texloadcores=2
| --texloadcores || 0, 100 || textures to load || texloadcores=2
Line 79: Line 73:
| --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true
| --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=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
|-
|-
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) ||
| --locorocomeshsmoothnonindexed || true, false || Non-indexed mesh smoothing ||--locorocomeshsmoothnonindexed=true
|-
|-
| --msxxadhoc || true?, false? || ad hoc support ? ||
| --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
|-
|-
| --parappaalphahack || true?, false? || Doesn't seem to have any effect.|| --parappaalphahack=true
|}
|-
 
| --umddelay || ? || Seems to be I/O timing method. Doesn't seem to have any effect ||
==== 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] ||
|-
|-
| --vramcopyback || 0, 10000000 || for games that download data from GPU to Allegrex || --vramcopyback=45
| --godofwarhack || true?, false? || Seems specifically made for god of war, unknown effect || --godofwarhack=true
|-
|-
|-style="background-color:#7698FF"
| --parappaalphahack || true?, false? || || --parappaalphahack=true
| || Speedhacks / Possible duplicates|| ||
|-
|}
 
==== 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 || possibly move GPU emulation to another thread. Speedhack, but can decrease compatibility. || --gputhread=true
| --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|| set when frame is presented. Sync issues, flickering screen, tearing, input lag, etc. Doesn't seem to have any effect. ||--present=setframebuf
| --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
|}
====Syphon Filter Dark Mirror====
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Command !! Values !! Notes !! Usage 
|-
| --force-native-aspect-ratio || || ||
|-
| --use-higher-precision-depth || || ||
|-
| --optimize-fb-self-resolves || || ||
|-
| --force-dsf-present || || ||
|-
| --bend-30hz-lock|| || ||
|-
| --setframebuf-auto-vblank-wait-threshold|| || ||
|-
| --gpu-renderthread|| || ||
|-
| --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
|-
|}
|}


Line 169: Line 141:


===XXXXYYYYY_patches.lua===
===XXXXYYYYY_patches.lua===
The lua can be placed as: '''scripts\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====
====Emulator commands====
Line 176: Line 156:
|-
|-
|getEmuObject || '''local emuObj = getEmuObject()''' || Required for all functions using emuObj
|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()||
|LoadSlideshow ||emuObj.LoadSlideshow()||
Line 203: Line 199:
| SaveState ||emuObj.SaveState()||  
| SaveState ||emuObj.SaveState()||  
|-
|-
| SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| 0? 1?
| 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 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 274:
|-
|-
| CopyFB || emuObj.CopyFB() ||
| CopyFB || emuObj.CopyFB() ||
|-style="background-color:#c6ecd9"
| Hooks  || ||
|-
|-
| AddVsyncHook ||emuObj.AddVsyncHook()|| Set function to be done on every vsync
|}
====Allegrex commands====
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Command !! Usage !! Notes - Example
|-
|-
| 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====
| WriteMemStr16 || axObj.WriteMemStr16() ||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
|-
! Command !! Usage !! Notes - Example
|WriteMemStr16Z  ||axObj.WriteMemStr16Z() ||
|-
|-
| getAXObject ||'''local axObj = getAXObject()''' || Required for all functions using AXObject
| WriteMemStringZ ||axobj.WriteMemStringZ ||
|-
|-
| AddHook || axObj.AddHook() ||
|ReadMemFloat || axObj.ReadMemFloat() ||
|-
|-
| RemoveHook || axObj.RemoveHook() ||
|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()||
|-style="background-color:#ff8080"
| GPR || ||
|-
|-
| 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
|-
|SetPC|| axObj.SetPC() ||
|-
|GetPC|| axObj.GetPC() ||
|-
|-
| GetGpr || axObj.GetGpr() ||
| GetGpr || axObj.GetGpr() ||
Line 367: Line 343:
|-
|-
|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
! !! Other/Unknown/Standalone Commands !!
|-
|-
| WriteMem32 || axObj.WriteMem32() || Write 4 bytes to offset
|FuncReplace || axFuncReplace() || axFuncReplace(0x8804670, "__ptmf_scall") Replace allegrex function.
|-
|-
| ReadMem16 || axObj.ReadMem16() || Read 2 bytes from offset
| InsnReplace || axInsnReplace() || Replace allegrex memory
|-
| 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 !!
|-
|FuncReplace || axFuncReplace() || axFuncReplace(0x8804670, "__ptmf_scall") Replace allegrex function.
|-
| InsnReplace || axInsnReplace() || Replace allegrex memory
|-
|-
|}
|}
 
=====Examples=====
====Examples====
======User made lua======
<br>'''''LUA example:'''''
''A custom lua made by a user''
<br>
<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 365:
</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=====
'''An official lua created by sony for Patapon 2'''
======Syphon Filter: Dark Mirror======
 
<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 899: Line 772:


== Emulators ==
== Emulators ==
<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>
<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;"
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Emulator !! Usage !! API Version !! Similar emulators (compatibility)
! Emulator !! Usage !! API Version !! Similar emulators (Usage)
|-
|-
| Echochrome || The default psp emulator for PSPFPKG tool at the time of writing and the best in terms of compatibility. || ? || ?
| Echochrome || The default psp emulator for PSPFPKG tool at the time of writing and the best in terms of compatibility so far. || ? || ?
|-
|-
| LocoRoco Midnight Carnival  || ? || ? || ?
| LocoRoco Midnight Carnival  || ? || ? || ?
Line 916: Line 789:
|-
|-
| PaRappa the Rapper || An unofficial emulator developed by sony with very bad compatibility ||  ? || ?
| PaRappa the Rapper || An unofficial emulator developed by sony with very bad compatibility ||  ? || ?
|-
| Syphon Filter: Dark Mirror || ? || ? || ?
|-
|-
|}
|}


==Memory mapping==
==Memory mapping==
<br>'''Note''': The memory on PPSSPP is 0x4000 offsets ahead of the memory on the PS4
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Size !! Offset From -> Offset To !! Name
! Offset From !! Offset To !! Name
|-
|-
| || 1008000000 -> 10887FFFFF ||   Allegrex memory(?)
| 0x1008000000 || 0x10887FFFFF  || Allegrex memory(?)
|-
|-
|640.00MB  || 228200000 -> 250200000 ||
|}
|-
 
|64.00MB  ||  250200000 -> 254200000 ||
==Information==
|-
Note: Missing entries
|32.00MB  ||  254200000 -> 256200000 ||
====Folder/File layout====
|-
=====Echochrome=====
|2048.00MB ||  256200000 -> 2d6200000 ||
<pre>
|-
├── assets
|16.00MB  ||  2d6200000 -> 2d7200000 ||
├── iso
|-
├── lua_include
|16.00MB  ||  2d7200000 -> 2d8200000 ||
├── sce_module
|-
├── sce_sys
|16.00MB  ||  2d8200000 -> 2d9200000 ||
├── SIEA
|-
│  └── data
|16.00MB  ||  2d9200000 -> 2da200000 ||
│  └── USER_L0.IMG
|-
├── usermodule
|}
│  └──libfont.lib
 
├── sce_discmap.plt
===Registers map===
├── config-title.txt
<br>Registers that are marked with '''(?)''' are untested but should be accurate.
├── package-ps4.conf
<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
├── eboot.bin
{| class=wikitable style="border: none; background: none;"
├── revision.conf
! scope=col | GPR
└── config-title.txt
! scope=col | Offset
</pre>
! scope=col | Notes
=====Old emulators=====
| 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>
<pre>
1.5|eboot.bin|ID:|VER:01.00|FM:505
├── assets
simple pointer|pointer|4 bytes|@C6B8C8_2_6B8C8+210+108|data|4 bytes|143011412|0||
├── flash0
</pre>
├── iso
'''VFPU'''
├── lua_include
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
├── Patches
! Register !! Offset !! Register !! Offset !! Register !! Offset !! Register !! Offset
├──XXXXYYYYY_patches.lua
|-
├──XXXXYYYYY_features.lua
| S000|| 0x200414DE0 || S001|| 0x200414DE4 || S002|| 0x200414DE8 || S003|| 0x200414DEC
├──XXXXYYYYY_tooling.lua
|-
└──XXXXYYYYY_trophies.lua
| S010|| 0x200414DF0 || S011|| 0x200414DF4 || S012|| 0x200414DF8 || S013|| 0x200414DFC
├── pspfonts
|-
├── sce_module
| S020|| 0x200414E00 || S021|| 0x200414E04 || S022|| 0x200414E08 || S023|| 0x200414E0C
├── sce_sys
|-
├── trophy_data
|S030|| 0x200414E10 || S031|| 0x200414E14 || S032|| 0x200414E18  || S033|| 0x200414E1C
├── usermodule
|-
  └──libfont.lib
|S100|| 0x200414E20 || S101|| 0x200414E24  || S102||  0x200414E28  || S103|| 0x200414E2C
├── sce_discmap.plt
|-
├── eboot.bin
| S110 || 0x200414E30 || S111|| 0x200414E34 || S112||  0x200414E38 || S113||0x200414E3C
├── revision.conf
|-
└── config-title.txt
| S120|| 0x200414E40  || S121|| 0x200414E44 || S122|| 0x200414E48 || S123|| 0x200414E4C
</pre>
|-
 
|S130|| 0x200414E50 || S131||0x200414E54  || S132|| 0x200414E58  || S133|| 0x200414E5C
====Other====
|-
<pre>
|S200|| 0x200414E60  || S201|| 0x200414E64 || S202||  0x200414E68 || S203||0x200414E6C
XXXXYYYYY_config.txt
|-
videos/
|S210|| 0x200414E70  || S211|| 0x200414E74 || S212||  0x200414E78 || S213|| 0x200414E7C
.mp4
|-
videos/%08x.mp4
|S220|| 0x200414E80  || S221|| 0x200414E84 || S222|| 0x200414E88 || S223|| 0x200414E8C
audio/%08x.ogg
|-
|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 =
Paths:  
{| 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


/app0/
/download0/
/savedata
/host/
/hostapp/
/data/
</pre>
</pre>
'''sce-locale.lua'''
<pre>
print ("Loading sce-locale.lua from global scripts")


-- Language codes
====Sample====
--
-- 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.
<pre>; PS4 configuration file for PSPHD
GetLocaleLangPair = function()
   
local locale, lang
; Game Image
locale = AppHost_GetLocaleTag()
--image="data/USER_L0.IMG"
lang = locale:sub(1,2)    -- grab first two digits, eg. en-US -> en
   
 
; Redirect host0: to a specific directory (uncomment to enable).
print ("[BOOT] App Host Langauge =", lang)
; By default it's mapped to either "/hostapp/" if available, or "/app0/" if "/hostapp/" is not available.
 
;--host="/hostapp/"
if locale ~= nil then
   
print ("[BOOT] App Host Locale =", locale)
; To dump the original video in PMF format, uncomment the --dumpvideos line
else
; For example, with the current setting, it will save them in a "videos" directory inside the File Serving Directory
print ("[BOOT] Deprecated Native Language =", lang)
;--dumpvideos="host0:videos"
end
   
 
; To dump the original audio in Atrac3 format, uncomment the --dumpaudio line
return locale, lang
; For example, with the current setting, it will save them in a "audio" directory inside the File Serving Directory
end
;--dumpaudio="host0:audio"
 
   
FindLocaleTableKey = function(table, primary, fallback, default)
; To replace atrac3 audio samples, use this.
-- try for a specific Locale, and if that fails fallback on just a language (without region),
--samplereplace="host0:samplereplace"
-- and if that fails fallback on default.
   
 
; To save the in-game textures as the game runs, uncomment the --texsave line
local keyres = primary
; For example, with the current setting, it will save them in a "texdump" directory inside the File Serving Directory
if keyres == nil or table[keyres] == nil then
;--texsave="host0:texdump"
keyres = fallback
;--texmissingsave="host0:texdump"
end
   
 
; To replace specific textures as the game runs, uncomment the --texreplace line
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
 
</pre>
 
'''ax-gpr-alias.lua'''
<pre>
 
-- Recommended method to import this module:
--  local gpr = require("ax-gpr-alias")
 
 
gpr = {}
 
gpr.zero = 0
gpr.at  = 1
gpr.v0  = 2
gpr.v1  = 3
gpr.a0  = 4
gpr.a1  = 5
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 = {}
mapp.curAppName = emuObj.GetAppName()
 
mapp.AddBootHook = function(app, func)
if mapp[app] == nil then
mapp[app] = {}
end
 
mapp[app].boot = func
end
 
mapp.AddHook = function(app, pc, verify, func)
if mapp[app] == nil then
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:
 
/app0/
/download0/
/savedata
/host/
/hostapp/
/data/
</pre>
 
==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
; For example, with the current setting, it will load them from the "texreplace" directory inside the File Serving Directory
--texreplace="host0:texreplace"
--texreplace="host0:texreplace"
Line 1,610: Line 910:
; Parappa Alpha Hack
; Parappa Alpha Hack
--parappaalphahack=true
--parappaalphahack=true
</pre>
 
==NIDs in HLE==
===NIDs in HLE===
<pre>
<pre>
|HLEInterruptManager|
|HLEInterruptManager|
Line 2,081: Line 1,381:
</pre>
</pre>


==Unimplemented functions==
===Unimplemented functions===
<pre>
<pre>
sceIoChdir() unimplemented, ignoring
sceIoChdir() unimplemented, ignoring
Line 2,141: Line 1,441:
</pre>
</pre>


==Restricted==
===Restricted===
<pre>
<pre>
scePowerRegisterCallback - ignoring
scePowerRegisterCallback - ignoring
Line 2,155: Line 1,455:
* 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
* https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files
* https://www.psdevwiki.com/ps4/PSP_Emulator_Compatibility_List


===More Information:===
===More Information:===
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)