Editing PSP Emulation
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
=='''PSPHD'''== | =='''PSPHD'''== | ||
The new ps plus psp emulator has a lot of undiscovered functionalities. It even allows patches directly to the emulated Allegrex cpu. | |||
The | Sadly sony has not made it easy for users to use CLI commands. Since sony mostly uses lua patches for the psp releases, not many cli commands were added. 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 because currently, there is an unofficial PPSSPP core in the unofficial retroarch port for the ps4. and as far as the compatibility and performance goes, the retroarch core is second to no one. This emulator may still hold potential, though sadly it does not seem to have support for gamedata installation. and that has led to many games becoming currently unusable. with an official retroarch release coming into ps4's way it seems delving deeper into the PSPHD emulator and the PS1's new psplus emulator is pretty useless. | ||
== 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 | === config-emu-ps4.txt commands === | ||
''General purpose CLI commands, or unknown usage'' | |||
=== | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | {| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | ||
! Command !! Values !! Notes !! Usage | ! Command !! Values !! Notes !! Usage | ||
Line 74: | Line 16: | ||
|- | |- | ||
| --notrophies || || Enable/disable trophies|| | | --notrophies || || Enable/disable trophies|| | ||
|- | |- | ||
| --locale || || || | | --locale || || || | ||
Line 85: | Line 25: | ||
| --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 100: | Line 40: | ||
|- | |- | ||
| --samplesave || ? || ? || | | --samplesave || ? || ? || | ||
|- | |||
| --vramcopyback || 0, 10000000 || for games that download data from GPU to Allegrex || --vramcopyback=45 | |||
|- | |||
| --msxxadhoc || true?, false? || ad hoc support ? || | |||
|-style="background-color:#ff99c2" | |-style="background-color:#ff99c2" | ||
| || Graphical fixes || || | | || Graphical fixes || || | ||
|- | |||
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) || | |||
|- | |- | ||
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off | | --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off | ||
|- | |||
| --clamp-line-thickness-min || ? || ? || | |||
|- | |||
| --clamp-line-thickness-max || ? || ? || | |||
|- | |- | ||
| --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 | | --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 | ||
Line 113: | Line 63: | ||
| --depthscalehack || true?, false? || ||--depthscalehack=true | | --depthscalehack || true?, false? || ||--depthscalehack=true | ||
|- | |- | ||
| -- | | --texloadcores || 0, 100 || textures to load || texloadcores=2 | ||
|- | |- | ||
| -- | | --smoothlevel || 0, 100 || Mesh smoothing level? || --smoothlevel=0 | ||
|- | |- | ||
| -- | | --anisolevel || 0, 100 || Anisotropic filtering level?? || | ||
|- | |- | ||
| -- | | --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true | ||
|- | |- | ||
| | | --depthscalehack || true?, false? || ||--depthscalehack=true | ||
|- | |- | ||
| -- | | --locorocomeshsmooth || true, false || Custom mesh smoothing for loco roco games|| --locorocomeshsmooth=true | ||
|- | |- | ||
| -- | | --locorocomeshsmoothnonindexed || true, false || Non-indexed mesh smoothing ||--locorocomeshsmoothnonindexed=true | ||
|- | |- | ||
| -- | | --forcenobilinear || true, false || Turn bilinear filtering on/off, setting it to True will fix many graphical glitches in games that use 2D Images ||--forcenobilinear=true | ||
|-style="background-color:#D7EF54" | |||
| || Game fixes || || | |||
|- | |- | ||
| -- | | --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] || | ||
|- | |- | ||
| -- | | --godofwarhack || true?, false? || Seems specifically made for god of war, unknown effect || --godofwarhack=true | ||
|- | |- | ||
| --parappaalphahack || true?, false? || || --parappaalphahack=true | |||
|-style="background-color:#7698FF" | |-style="background-color:#7698FF" | ||
| || Speedhacks | | || Speedhacks || || | ||
|- | |- | ||
| --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off | | --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off | ||
Line 166: | Line 103: | ||
| --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 | | --present || vblankstart, setframebuf, drawsync|| set when frame is presented. Sync issues, flickering screen, tearing, input lag, etc. ||--present=setframebuf | ||
|- | |- | ||
| --texrecent || true || Optimize texture hashes ||--texrecent=true | | --texrecent || true || Optimize texture hashes ||--texrecent=true | ||
|} | |} | ||
==== | |||
====Texture replacement==== | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | {| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | ||
! Command !! Values !! Notes !! Usage | ! Command !! Values !! Notes !! Usage | ||
|- | |- | ||
| -- | | --texswitch||true, false|| Enables Texture replacement || --texswitch=true | ||
|- | |- | ||
| -- | | --texsave || || || | ||
|- | |- | ||
| -- | | --texmissingsave || || || | ||
|- | |- | ||
| -- | | --autoresampler || true, false|| Turns on the auto-resampler. Assumes textures in texreplace are at 8x resolution and resamples them at load, May only work on new LocoRoco Midnight Carnival emu || --autoresampler=true | ||
|- | |- | ||
| --texreplace || Directory || Set directory of texture replacement folder || --texreplace="host0:texreplace" | |||
| --texreplace || Directory || Set directory of texture replacement folder || --texreplace="host0:texreplace" | |||
|- | |- | ||
| --replacementfilter || true, false || This forces alpha blending to on for replaced textures. || --replacementfilter=true | | --replacementfilter || true, false || This forces alpha blending to on for replaced textures. || --replacementfilter=true | ||
Line 225: | Line 129: | ||
===XXXXYYYYY_patches.lua=== | ===XXXXYYYYY_patches.lua=== | ||
Your lua can be placed as '''scripts\XXXXYYYYY_patches.lua''' | |||
<br>'''Requires Cleanup'''. | |||
====Emulator commands==== | ====Emulator commands==== | ||
Line 259: | Line 164: | ||
| SaveState ||emuObj.SaveState()|| | | SaveState ||emuObj.SaveState()|| | ||
|- | |- | ||
| SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| | | SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| | ||
|- | |- | ||
| MeshSmooth ||emuObj.MeshSmooth()|| | | MeshSmooth ||emuObj.MeshSmooth()|| | ||
Line 424: | Line 329: | ||
|GetReg||axObj.GetReg()|| | |GetReg||axObj.GetReg()|| | ||
|-style="background-color:#D7EF54" | |-style="background-color:#D7EF54" | ||
| Memory editing || || Do note that the offsets on PPSSPP are | | Memory editing || || Do note that the offsets on PPSSPP are different than the ones on the PS4 | ||
|- | |- | ||
| ReadMem32 || axObj.ReadMem32() || Read 4 bytes from offset | | ReadMem32 || axObj.ReadMem32() || Read 4 bytes from offset | ||
Line 478: | Line 383: | ||
[https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files More patches can be found here] | [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''' | |||
<pre> | <pre> | ||
-- Lua 5.3 | -- Lua 5.3 | ||
-- Title: | -- Title: Patapon 2 PSP - UCUS-98732 (USA) | ||
-- | |||
apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory. | apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory. | ||
local gpr = require( "ax-gpr-alias" ) -- you can access Allegrex GPR by alias (gpr.a0 / gpr["a0"]) | |||
local gpr = require( "ax-gpr-alias" ) -- you can access Allegrex GPR by alias (gpr.a0 / gpr["a0"]) | |||
local emuObj = getEmuObject() -- emulator | local emuObj = getEmuObject() -- emulator | ||
local axObj = getAXObject() -- allegrex | local axObj = getAXObject() -- allegrex | ||
Line 955: | Line 789: | ||
== Emulators == | == Emulators == | ||
<pre>Every emulator is programmed in a | <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 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;" | {| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | ||
! Emulator !! Usage !! API Version !! Similar emulators ( | ! 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. || ? || ? | ||
Line 972: | Line 806: | ||
|- | |- | ||
| 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 || ? || ? | ||
|- | |- | ||
|} | |} | ||
==Memory mapping== | ==Memory mapping== | ||
<br>'''Note''': The memory | <br>'''Note''': The memory in PPSSPP is 0x4000 values 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;" | ||
! | ! Offset From !! Offset To !! Name | ||
|- | |||
| 0x1008000000 || 0x10887FFFFF || Allegrex memory(?) | |||
|- | |- | ||
| | |} | ||
==Register map== | |||
<br>Registers with (?) are untested. | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | |||
! Register !! Offset | |||
|- | |- | ||
| | | v0 || 0x200414CB0 | ||
|- | |- | ||
| | | v1 || 0x200414CB4 | ||
|- | |- | ||
| | | a0 || 0x200414CB8 | ||
|- | |- | ||
| | | a1 || 0x200414CBC? | ||
|- | |- | ||
| | | a2 || 0x200414CC0? | ||
|- | |- | ||
| | | a3 || 0x200414CC4? | ||
|- | |- | ||
| | | t0 || 0x200414CC8? | ||
|- | |- | ||
| | | t1 || 0x200414CCC? | ||
|- | |- | ||
| | | t2 || 0x200414CD0? | ||
|- | |- | ||
| | | t3 || 0x200414CD4? | ||
|- | |- | ||
| | | t4 || 0x200414CD8? | ||
|- | |- | ||
| | | t5 || 0x200414CDC? | ||
|- | |- | ||
| | | t6 || 0x200414CE0? | ||
|- | |- | ||
| | | t7 || 0x200414CE4? | ||
|- | |- | ||
| | | s0 || 0x200414CE8? | ||
|- | |- | ||
| | | s1 || 0x200414CEC? | ||
|- | |- | ||
| | | s2 || 0x200414CF0? | ||
|- | |- | ||
| | | s3 || 0x200414CF4? | ||
|- | |- | ||
| | | s4 || 0x200414CF8? | ||
|- | |- | ||
| s5 || 0x200414CFC? | |||
| s5 || 0x200414CFC | |||
|- | |- | ||
| s6 || 0x200414D00 | | s6 || 0x200414D00? | ||
|- | |- | ||
| | | s7 || 0x200414D04? | ||
|- | |- | ||
| | | t8 || 0x200414D08? | ||
|- | |- | ||
| | | t9 || 0x200414D0C? | ||
|- | |- | ||
| | | k0 || 0x200414D10 | ||
|- | |- | ||
| | | k1 || 0x200414D14 | ||
|- | |- | ||
| | | gp || 0x200414D18 | ||
|- | |- | ||
| | | sp || 0x200414D1C | ||
|- | |- | ||
| | | fp || 0x200414D20 | ||
= | |-style="background-color:#D7EF54" | ||
| ra || 0x200414D24 | |||
|-style="background-color:#7698FF" | |||
| pc || 0x200414D34 | |||
|- | |||
|} | |||
= Known issues = | |||
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | {| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;" | ||
! | ! Issue !! Games affected !! Solution !! Description | ||
|- | |- | ||
| | | - || || || | ||
|- | |- | ||
| | |} | ||
=LUA include files= | |||
<br>Files that need to be placed in the '''/lua_include/''' folder | |||
'''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> | </pre> | ||
''' | '''multiapp.lua''' | ||
<pre> | <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 | end | ||
mapp[app].boot = func | |||
end | end | ||
mapp.AddHook = function(app, pc, verify, func) | |||
if mapp[app] == nil then | |||
mapp[app] = {} | |||
end | end | ||
if | if mapp[app].hooks == nil then | ||
mapp[app].hooks = {} | |||
mapp[app].hookids = 1 | |||
end | 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) | |||
if | |||
end | end | ||
-- print(string.format("Added Hook for app: %s, pc=%08x, handler=%d", app, pc, localid)) | |||
mapp[app].hooks[localid] = handler | |||
return localid | |||
end | |||
if | 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 | ||
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 | |||
return | -- 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> | </pre> | ||
''' | |||
'''pad.lua''' | |||
<pre> | <pre> | ||
-- Recommended method to import this module: | -- Recommended method to import this module: | ||
-- local | -- 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 | |||
│ └── 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 | |||
--texreplace="host0:texreplace" | |||
; This forces alpha blending to on for replaced textures. (uncomment to enable) | |||
; With this we can freely make use of a normal alpha channel on replacement textures | |||
--replacementalpha=true | |||
; Antialiasing mode. SSAA4x looks best, MSAA4x only smooths edges. | |||
; Choices: off, SSAA4x, MSAA4x | |||
--antialias=SSAA4x | |||
; Enable switching between original and replacement textures at runtime using the L3 button on a DS4 or the 'T' key on Windows | |||
;--texswitch=true | |||
; Turns on the auto-resampler. Assumes textures in texreplace are at 8x resolution and resamples them at load | |||
--autoresampler=true | |||
; Parappa Alpha Hack | |||
--parappaalphahack=true | |||
</pre> | </pre> | ||
==NIDs in HLE== | |||
<pre> | |||
|HLEInterruptManager| | |||
sceKernelRegisterSubIntrHandler | |||
sceKernelReleaseSubIntrHandler | |||
sceKernelEnableSubIntr | |||
|HLEStdioForUser| | |||
sceIoOpen | |||
sceIoClose | |||
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 | |||
|HLELoadExecForUser| | |||
sceKernelCpuSuspendIntr | |||
sceKernelCpuResumeIntr | |||
sceKernelIsCpuIntrEnable | |||
sceKernelExitGame | |||
sceKernelRegisterExitCallback | |||
sceKernelLoadModule | |||
sceKernelUnloadModule | |||
sceKernelStartModule | |||
sceKernelStopModule | |||
sceKernelStopUnloadSelfModule | |||
sceKernelGetModuleIdByAddress | |||
sceKernelStopUnloadSelfModuleWithStatus | |||
sceKernelGetModuleId | |||
|HLEsceAtrac3plus| | |||
sceAtracReinit | |||
sceAtracDecodeData | |||
sceAtracGetNextDecodePosition | |||
sceAtracSetHalfwayBufferAndGetID | |||
sceAtracGetSoundSample | |||
sceAtracGetStreamDataInfo | |||
sceAtracGetRemainFrame | |||
sceAtracSetLoopNum | |||
sceAtracResetPlayPosition | |||
sceAtracReleaseAtracID | |||
sceAtracGetAtracID | |||
sceAtracGetNextSample | |||
sceAtracSetData | |||
sceAtracAddStreamData | |||
|HLEsceAudio| | |||
sceAudioChReserve | |||
sceAudioChRelease | |||
sceAudioOutputBlocking | |||
sceAudioChangeChannelConfig | |||
sceAudioGetChannelRestLength | |||
sceAudioChangeChannelVolume | |||
sceAudioSetChannelDataLen | |||
sceAudioOutputPanned | |||
sceAudioOutputPannedBlocking | |||
sceAudioGetChannelRestLen | |||
sceAudioOutput2Reserve | |||
sceAudioOutput2OutputBlocking | |||
sceAudioOutput2Release | |||
outputCallback | |||
|HLEsceCtrl| | |||
sceCtrlSetSamplingCycle | |||
sceCtrlSetSamplingMode | |||
sceCtrlReadBufferPositive | |||
sceCtrlReadBufferNegative | |||
sceCtrlPeekBufferPositive | |||
sceCtrlPeekBufferNegative | |||
sceCtrlGetIdleCancelThreshold | |||
sceCtrlSetIdleCancelThreshold | |||
sceCtrlReadLatch | |||
sceCtrlPeekLatch | |||
sampleControllerCallback | |||
vibrationControllerCallback | |||
|HLEsceDisplay| | |||
sceDisplaySetMode | |||
sceDisplaySetFramebuf | |||
sceDisplayGetFramebuf | |||
sceDisplayGetVcount | |||
sceDisplayWaitVblankStart | |||
sceDisplayWaitVblankStartCB | |||
sceDisplayGetCurrentHcount | |||
sceDisplayGetAccumulatedHcount | |||
sceDisplayGetFramePerSec | |||
sceDisplayWaitVblank | |||
sceDisplayWaitVblankCB | |||
sceDisplayIsVblank | |||
sceDisplaySetHoldMode | |||
vblankStart | |||
vblankEnd | |||
|HLEsceGe_user| | |||
sceGeEdramGetAddr | |||
sceGeEdramGetSize | |||
sceGeGetCmd | |||
sceGeGetMtx | |||
sceGeListEnQueue | |||
sceGeListEnQueueHead | |||
sceGeListDeQueue | |||
sceGeListSync | |||
sceGeListUpdateStallAddr | |||
sceGeDrawSync | |||
sceGeSetCallback | |||
sceGeUnsetCallback | |||
sceGeBreak | |||
sceGeContinue | |||
interruptCallback | |||
| | |||
|HLEsceImpose| | |||
sceImposeGetLanguageMode | |||
sceImposeSetLanguageMode | |||
sceImposeSetUMDPopup | |||
| | |HLEsceMpeg| | ||
sceMpegInit | |||
sceMpegFinish | |||
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 | |||
|HLEsceNet| | |||
sceNetInit | |||
sceNetInetGetsockopt | |||
sceNetInetSetsockopt | |||
sceNetInetGetErrno | |||
|HLEscePower| | |||
scePowerRegisterCallback | |||
scePowerUnregisterCallback | |||
scePowerSetClockFrequency | |||
scePowerSetCpuClockFrequency | |||
scePowerSetBusClockFrequency | |||
|HLEscePsmf| | |||
scePsmfVerifyPsmf | |||
scePsmfSetPsmf | |||
scePsmfSpecifyStreamWithStreamTypeNumber | |||
scePsmfCheckEPmap | |||
scePsmfGetVideoInfo | |||
scePsmfGetNumberOfStreams | |||
scePsmfGetNumberOfEPentries | |||
scePsmfGetEPWithId | |||
scePsmfGetPsmfVersion | |||
scePsmfGetNumberOfSpecificStreams | |||
scePsmfSpecifyStream | |||
scePsmfGetCurrentStreamType | |||
|HLEscePsmfPlayer| | |||
scePsmfPlayerCreate | |||
scePsmfPlayerDelete | |||
scePsmfPlayerSetPsmf | |||
scePsmfPlayerReleasePsmf | |||
scePsmfPlayerStart | |||
scePsmfPlayerGetAudioOutSize | |||
scePsmfPlayerStop | |||
scePsmfPlayerUpdate | |||
scePsmfPlayerGetVideoData | |||
scePsmfPlayerGetAudioData | |||
scePsmfPlayerGetCurrentStatus | |||
scePsmfPlayerGetPsmfInfo | |||
scePsmfPlayerConfigPlayer | |||
scePsmfPlayerBreak | |||
scePsmfPlayerChangePlayMode | |||
|HLEsceRtc| | |||
sceRtcGetCurrentTick | |||
sceRtcGetAccumulativeTime | |||
sceRtcGetCurrentClockLocalTime | |||
|HLEsceSasCore| | |||
sceSasInit | |||
sceSasCore | |||
sceSasCoreWithMix | |||
sceSasGetEndFlag | |||
sceSasGetPauseFlag | |||
sceSasGetEnvelopeHeight | |||
sceSasGetAllEnvelopeHeights | |||
sceSasGetOutputMode | |||
sceSasSetOutputMode | |||
sceSasGetGrain | |||
sceSasSetGrain | |||
sceSasSetVoice | |||
sceSasSetNoise | |||
sceSasSetPitch | |||
sceSasSetVolume | |||
sceSasSetSimpleADSR | |||
sceSasSetKeyOn | |||
sceSasSetKeyOff | |||
| | sceSasSetPause | ||
sceSasSetSL | |||
sceSasSetADSR | |||
sceSasSetADSRMode | |||
sceSasRevEVOL | |||
sceSasRevType | |||
sceSasRevParam | |||
sceSasRevVON | |||
|HLEsceSuspendForUser| | |||
sceKernelPowerTick | |||
sceKernelPowerLock | |||
sceKernelPowerUnlock | |||
sceKernelVolatileMemTryLock | |||
sceKernelVolatileMemUnlock | |||
sceKernelVolatileMemLock | |||
| | |HLEsceUmdUser| | ||
sceUmdActivate | |||
sceUmdGetDriveStat | |||
sceUmdCheckMedium | |||
sceUmdRegisterUMDCallback | |||
sceUmdUnRegisterUMDCallBack | |||
sceUmdWaitDriveStat | |||
sceUmdWaitDriveStatWithTimer | |||
sceUmdWaitDriveStatCB | |||
sceUmdCancelWaitDriveStat | |||
_UmdWaitDriveTimeout | |||
| | |HLEsceUtility| | ||
sceUtilityLoadModule | |||
sceUtilityUnloadModule | |||
sceUtilityLoadNetModule | |||
sceUtilityUnloadNetModule | |||
sceUtilityLoadAvModule | |||
sceUtilityUnloadAvModule | |||
sceUtilityGetSystemParamInt | |||
sceUtilityGetSystemParamString | |||
sceUtilitySavedataGetStatus | |||
sceUtilitySavedataShutdownStart | |||
sceUtilitySavedataInitStart | |||
sceUtilitySavedataUpdate | |||
sceUtilityMsgDialogGetStatus | |||
sceUtilityMsgDialogShutdownStart | |||
sceUtilityMsgDialogInitStart | |||
sceUtilityMsgDialogUpdate | |||
sceUtilityMsgDialogAbort | |||
sceUtilityOskGetStatus | |||
sceUtilityOskShutdownStart | |||
sceUtilityOskInitStart | |||
sceUtilityOskUpdate | |||
saveDataUpdateCallback | |||
oskUpdateCallback | |||
| | |HLEsceWlanDrv| | ||
sceWlanGetSwitchState | |||
sceWlanGetEtherAddr | |||
| | |HLESysMemUserForUser| | ||
sceKernelMaxFreeMemSize | |||
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 | |||
| | |HLEThreadManForUser| | ||
sceKernelDelayThread | |||
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| | |||
sceKernelIcacheInvalidateRange | |||
| | |HLEUtilsForUser| | ||
sceKernelIcacheInvalidateRange | |||
sceKernelDcacheInvalidateRange | |||
sceKernelDcacheWritebackInvalidateRange | |||
sceKernelDcacheWritebackAll | |||
sceKernelDcacheWritebackRange | |||
sceKernelDcacheWritebackInvalidateAll | |||
sceKernelSetGPO | |||
sceKernelGetGPI | |||
sceKernelLibcClock | |||
sceKernelLibcTime | |||
sceKernelLibcGettimeofday 0x71EC4271 | |||
</pre> | |||
==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 | sceWlanGetEtherAddr unimplemented | ||
sceKernelQueryMemoryInfo() unimplemented | |||
sceKernelGetPTRIG() unimplemented | |||
sceKernelSetPTRIG() unimplemented | |||
sceKernelSetCompiledSdkVersion401_402() unimplemented | |||
sceKernelSetCompiledSdkVersion507() unimplemented | |||
sceKernelQueryMemoryInfo | sceKernelSetCompiledSdkVersion600_602() unimplemented | ||
sceKernelSetCompiledSdkVersion603_605() unimplemented | |||
sceKernelSetUsersystemLibWork() unimplemented | |||
sceKernelGetPTRIG | sceKernelSysMemUserForUser_ACBD88CA() unimplemented | ||
sceKernelSetPTRIG | 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=== | ||
<pre> | |||
|sceIoIoctl| | |||
supported: | |||
0x1010005 (UMD file seek set) | |||
0x1020006 (Get UMD file start sector) | |||
|sceIoDevctl| | |||
supported: | |||
0x1F100A4 (Prepare UMD data into cache) | |||
0x2415821 (MScmRegisterMSInsertEjectCallback) | |||
0x2415822 (MScmUnregisterMSInsertEjectCallback) | |||
0x2025806 (Check if the device is inserted (mscmhc0)) | |||
0x2425823 (Check if FAT enabled) | |||
0x2415823 (Set FAT as enabled), supported | |||
</pre> | |||
==Restricted== | |||
| | |||
</pre> | |||
== | |||
<pre> | <pre> | ||
scePowerRegisterCallback - ignoring | |||
scePowerUnregisterCallback - ignoring | |||
scePowerSetClockFrequency - ignoring | |||
scePowerSetCpuClockFrequency(%d) - ignoring | |||
scePowerSetBusClockFrequency(%d) - ignoring | |||
sceUtilityMsgDialogInitStart ignored | |||
</pre> | </pre> | ||
=== | ===Links=== | ||
* https://forums.ppsspp.org/showthread.php?tid=1473 | |||
* https://forums.ppsspp.org/showthread.php?tid=11961 | |||
* https://github.com/LunaMoo/PPSSPP_workarounds/blob/master/cheat.db | |||
===More Information:=== | |||
** https://pastebin.com/CXRpVLdd (by [[User:DarkElement]]) | |||
== | |||
== | |||
* | |||
* https:// | |||
* https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files | * https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files | ||
* 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 |