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 ==
===LUA===
'''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'''.
=== CLI 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;"
! Command !! Values !! Notes !! Usage
|-style="background-color:#FEA15C"
|  || General || ||
|-
| --boot || || Set directory of psp game's boot.bin || [disc0:/PSP_GAME/SYSDIR/BOOT.BIN]
|-
| --notrophies || || Enable/disable trophies||
|-
| --ps4-trophies  || || ||
|-
| --locale || || ||
|-
| --image || umd0 ,disc0 || Set path for disc image ||
|-
| --vms || ? || ? ||
|-
| --addon || || ||
|-
| --host || Sets host directory || --host="/hostapp/" ||
|-
| --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"
|-
| --savedata-mode || ? || ? ||
|-
| --securesaves || true, false || Enable/disable encrypted savegames || --securesaves=true
|-
| --multisaves || true, false || Enable Multiple Savegames || --multisaves=true
|-
| --samplesave || ? || ? ||
|-style="background-color:#ff99c2"
| || Graphical fixes || ||
|-
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off
|-
| --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
|-
| --texclutmode || filter, full || || --texclutmode=full
|-
| --texloadmode || launch, ondemand_lz4 || Seems to be a selector of when to load textures, either before the game requires it, or once the game requires it  ||
|-
| --depthscalehack || true?, false? || ||--depthscalehack=true
|-
| --depthscalehack || true?, false? || ||--depthscalehack=true
|-
| --locorocomeshsmooth || true, false || Custom mesh smoothing for loco roco games(?)|| --locorocomeshsmooth=true
|-
| --locorocomeshsmoothnonindexed || true, false || Turns "locorocomeshsmooth" mesh smoothing into non-indexed(?) ||--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 || ||
|-
| --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
|-style="background-color:#03fcc2"
|  || No effect / unknown values || ||
|-
| --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
|-
| --clamp-line-thickness-min || ? || ? ||
|-
| --clamp-line-thickness-max || ? || ? ||
|-
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) ||
|-
| --msxxadhoc || true?, false? || ad hoc support ? ||
|-
| --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  ||
|-
| --vramcopyback || 0, 10000000 || for games that download data from GPU to Allegrex || --vramcopyback=45
|-
|-style="background-color:#7698FF"
|  || Speedhacks / Possible duplicates|| ||
|-
| --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off
|-
| --texclutmode ||  full || Turns on filtering of CLUT hashes to avoid repeat indexed textures ||--texclutmode=full
|-
| --texloadcores || 0 || Textures to load ||--texloadcores=12
|-
| --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
|-
| --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====
{| 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
|-
|}


====Texture replacement====
====basic====
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Command !! Values !! Notes !! Usage 
|-
| --texswitch||true, false|| Enables Texture replacement || --texswitch=true
|-
| --texsave || || ||
|-
| --texmissingsave || || ||
|-
| --autoresampler || true, false|| Turns on the auto-resampler. Assumes textures in texreplace are at 8x resolution and resamples them at load, May only work on new LocoRoco Midnight Carnival emu || --autoresampler=true
|-
| --texreplace || Directory || Set directory of texture replacement folder || --texreplace="host0:texreplace"
|-
| --replacementfilter || true, false || This forces alpha blending to on for replaced textures. || --replacementfilter=true
|-
| --replacementalpha || true, false || || --replacementalpha=true
|-
|}


===XXXXYYYYY_patches.lua===
*axInsnReplace (mem, org opcode, new opcode) - Replace allegrex memory
The lua can be placed as: '''scripts\XXXXYYYYY_patches.lua'''
*axFuncReplace - Replace allegrex function. Known implemented functions are: I3dVecSet, I3dRender__ReserveTrashQwc, I3dVecAdd, I3dVecScaleXYZ, I3dGuSetMatrix_PSP, patapon_memcpy


====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
|-
|LoadSlideshow ||emuObj.LoadSlideshow()||
|-
|StartSlideshow ||emuObj.StartSlideshow()||
|-
|Log ||emuObj.Log()||
|-
| GetLanguage ||emuObj.GetLanguage()|| Get the language the ps4 is using
|-
| GetNativeLanguage ||emuObj.GetNativeLanguage()||
|-
|DisplayManual || emuObj.DisplayManual()||
|-
| DisplayProduct||emuObj.DisplayProduct()||
|-
|LoadConfig ||emuObj.LoadConfig()||
|-
| SaveConfig||emuObj.SaveConfig()||
|-
| LoadMIDI ||emuObj.LoadMIDI()||
|-
| GetMIDINotesAtTick ||emuObj.GetMIDINotesAtTick()||
|-
|LoadState ||emuObj.LoadState()||
|-
| SaveState ||emuObj.SaveState()||
|-
| SetFDExtraDelay ||emuObj.SetFDExtraDelay()|| 0? 1?
|-
| MeshSmooth ||emuObj.MeshSmooth()||
|-
| SetHue ||emuObj.SetHue()||
|-
| SetSaturation ||emuObj.SetSaturation()||
|-
| SetBrightness ||emuObj.SetBrightness()||
|-
| SetContrast ||emuObj.SetContrast()||
|-
| VideoScale ||emuObj.VideoScale()||
|-
| SetOverlay ||emuObj.SetOverlay()||
|-
| DisplayUIOverlay ||emuObj.DisplayUIOverlay()||
|-
| CRC32 ||emuObj.CRC32()||
|-
| SASGetCRC ||emuObj.SASGetCRC()||
|-
| SASGetSampleRate ||emuObj.SASGetSampleRate()
|-
| GetAppName ||emuObj.GetAppName()||
|-
| ReadFile ||emuObj.ReadFile()||
|-
| RemapFB ||emuObj.RemapFB()||
|-
| InvalFB ||emuObj.InvalFB()||
|-
| PlayVideo||emuObj.PlayVideo()||
|-
| RescaleUForUpscale ||emuObj.RescaleUForUpscale()||
|-
| RescaleVForUpscale||emuObj.RescaleVForUpscale()||
|-
| ShrinkUVRect ||emuObj.ShrinkUVRect()||
|-
| ScalePosition ||emuObj.ScalePosition()||
|-
| AdjustUVJitter ||emuObj.AdjustUVJitter()||
|-
| OverrideFBSize||emuObj.OverrideFBSize()|| Override framebuffer size ?
|-
|RemapSavedata || emuObj.RemapSavedata() ||emuObj.RemapSavedata("UCUS98711", "CUSA06171", "504e802b04a1838c32b616abbe0b475fbea1c823825ef0df06cc2bad129ce2f7")
|-
| 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.
|-
| ThrottleFast|| emuObj.ThrottleFast() || Faster than default, but exact value is unknown.
|-
| ThrottleNorm ||emuObj.ThrottleNorm() || Enable default framelimiter (50/60 fps depend on region)
|-
|SetTextureHashMode||emuObj.SetTextureHashMode()||
|-
|SetTextureScaleOffset||emuObj.SetTextureScaleOffset()||
|-
|SetTextureSaveSubdir||emuObj.SetTextureSaveSubdir()||
|-
| SetDrawEDRam || emuObj.SetDrawEDRam() ||
|-
|SetSampleTitle||emuObj.SetSampleTitle()||
|-
|ToggleTextures||emuObj.ToggleTextures()||
|-
| CopyFB || emuObj.CopyFB() ||
|-style="background-color:#c6ecd9"
| Hooks  || ||
|-
| 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
|-
| AddGPUHook ||emuObj.AddGPUHook()||
|-
|-style="background-color:#D7EF54"
|  Pad || ||
|-
| Pad require ||'''local pad = require("pad")''' || Required for all commands that rely on pad
|-
|PadRead || emuObj.PadRead() ||
<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() ||
|-
|PadReadRoll || emuObj.PadReadRoll()||
|-
|PadRegisterSamples || emuObj.PadRegisterSamples()||
|-
| PadSetButtonsMode || emuObj.PadSetButtonsMode() ||
<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)
|-
|}


====Allegrex commands====
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Command !! Usage !! Notes - Example
|-
| getAXObject ||'''local axObj = getAXObject()''' || Required for all functions using AXObject
|-
| AddHook || axObj.AddHook() ||
|-
| RemoveHook || axObj.RemoveHook() ||
|-
| BurnCycles|| axobj.BurnCycles() || Could be an option to overclock cpu at a hooked offset
|-
|AddAOTBlock ||axObj.AddAOTBlock()|| Ahead of time compilation block ?
|-
|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() ||
|-
| SetGpr ||axObj.SetGpr() ||
|-
|SetFpr|| axObj.SetFpr() ||axObj.SetFpr(0)
|-
|GetFpr || axObj.GetFpr() ||
|-
|SetHi|| axObj.SetHi()||
|-
|GetHi|| axObj.GetHi()||
|-
| SetLo || axObj.SetLo()||
|-
| GetLo ||axObj.GetLo()||
|-
| SetReg||axObj.SetReg()||
|-
|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
|-
| WriteMem32 || axObj.WriteMem32() || Write 4 bytes to offset
|-
| ReadMem16 || axObj.ReadMem16() || Read 2 bytes from offset
|-
| WriteMem16 || axObj.WriteMem16() || Write 2 bytes to offset
|-
| ReadMem8 || axObj.ReadMem8() || Read 1 byte from offset
|-
| WriteMem8 || axObj.WriteMem8() || Write 1 byte to offset
|-
| ReadMemString || axObj.ReadMemString() ||
|-
| WriteMemString || axObj.WriteMemString() ||
|-
| WriteMemStr16 || axObj.WriteMemStr16() ||
|-
|WriteMemStr16Z  ||axObj.WriteMemStr16Z() ||
|-
| WriteMemStringZ ||axobj.WriteMemStringZ ||
|-
|ReadMemFloat || axObj.ReadMemFloat() ||
|-
|WriteMemFloat || axObj.WriteMemFloat() ||
|-
! !! Other/Unknown/Standalone Commands !!
|-
|FuncReplace || axFuncReplace() || axFuncReplace(0x8804670, "__ptmf_scall") Replace allegrex function.
|-
| InsnReplace || axInsnReplace() || Replace allegrex memory
|-
|}


====Examples====
====hooks/registers====
<br>'''''LUA example:'''''
<br>
<br>Coconut Dodge "NPEZ00164"
<pre>
local axObj = getAXObject()
local emuObj = getEmuObject()


local patcher = function()
Hooks, and registers that can be called in lua api.
--Infinite lives
axObj.WriteMem32(0x8ACA1A4, 0x3) --0x08ACE1A4 on PPSSPP, PPSSPP addresses need to be reduced by 0x4000 in order to work on PS4
end


emuObj.AddVsyncHook(patcher)
Allegrex (usage - remove AX_):
</pre>


[https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files More patches can be found here]
*AX_GetPC
=====Patches.lua=====
*AX_SetPC
======Syphon Filter: Dark Mirror======
*AX_GetHi
*AX_SetHi
*AX_GetLo
*AX_SetLo
*AX_GetReg
*AX_SetReg
*AX_GetFpr
*AX_SetFpr
*AX_ReadMem8
*AX_ReadMem16
*AX_ReadMem32
*AX_ReadMemFloat
*AX_ReadMemString
*AX_WriteMem8
*AX_WriteMem16
*AX_WriteMem32
*AX_WriteMemFloat
*AX_WriteMemString
*AX_WriteMemStringZ
*AX_AddHook
*AX_RemoveHook
*AX_Overlay
*AX_InsnReplace
*AX_FuncReplace


<pre>
Emulator (usage - remove EM_):  
-- Lua 5.3
-- Title: Syphon Filter: Dark Mirror


-- Patches for fixing issues with post fx in games using the Syphon Filter/Resistance engine
*EM_SetTextureHashMode
*EM_SetTextureScaleOffset
*EM_SetTextureSaveSubdir
*EM_SetSampleTitle
*EM_SetDrawEDRam
*EM_ToggleTextures
*EM_PadRead
*EM_PadReadPitch
*EM_PadReadRoll
*EM_PadVibrate
*EM_PadRegisterSamples
*EM_PadSetButtonsMode
*EM_AddVsyncHook
*EM_RemoveVsyncHook
*EM_ThrottleMax
*EM_ThrottleNormal
*EM_Log
*EM_GetLanguage
*EM_GetNativeLanguage
*EM_DisplayManual
*EM_LoadConfig
*EM_SaveConfig
*EM_LoadMIDI
*EM_GetMIDINotesAtTick
*EM_LoadSlideshow
*EM_StartSlideshow
*EM_LoadState
*EM_SaveState


apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
===config psp===


local emuObj = getEmuObject()
Desc: https://pastebin.com/CXRpVLdd
local cpu = getAXObject()
<br>1,0 is done by true/false commands.


-- The bloom filter uses 1.5 pixel jitter to make a ghetto blur. When up-ressed, this doesn't look good.
*--boot [disc0:/PSP_GAME/SYSDIR/BOOT.BIN - path (no loaders support like on PS3? vide ct2, psc)]
-- To compensate, reduce the jitter amount before rendering.
*--notrophies
function BloomJitterPlusAdjust()
*--texsave
-- 1.5 pixel "+" pattern
*--texmissingsave
emuObj.AdjustUVJitter(0, 4, 0.0, 1.5)
*--samplesave
emuObj.AdjustUVJitter(4, 4, 0.0, -1.5)
*--texreplace
emuObj.AdjustUVJitter(8, 4, 1.5, 0.0)
*--samplereplace
emuObj.AdjustUVJitter(12, 4, -1.5, 0.0)
*--replacementalpha [true]
end
*--parappaalphahack
*--locorocomeshsmooth
*--replacementfilter
*--gputhread
*--antialias [MSAA4x, SSAA4x]
*--texcachemode [drawbounds, drawboundsloco]
*--texclutmode [filter, full]
*--texloadmode [launch, ondemand_lz4]
*--parappajapanesefonthack
*--parappareplacecolor [%08x (rgb?)]
*--volume [  ? (Adjusting volume level to %d%%)]
*--image [umd0 ,disc0]
*--addon
*--host [host0, flash0]


function BloomJitterCrossAdjust()
====Standard: ====
-- 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)
*patches/
local jitterFixCross = emuObj.AddGPUHook(0x40d4000, 0, 16, 0x40dc000, BloomJitterCrossAdjust)
*_patches.lua
*feature_data/
*_features.lua
*tooling/
*_tooling.lua
*trophy_data/
*_trophies.lua


function depthquery()
====other====
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
*XXXXYYYYY_config.txt
-- the hook code replaces the occlusion function, so just adjust the stack and return
*--vms
cpu.InsnReplace(0x8c163d8, 0x34040000, 0x27bd0080) -- addiu sp, sp, 0x80
*--autoresampler [true]
cpu.InsnReplace(0x8c163dc, 0xafa40048, 0x03e00008) -- jr ra
cpu.InsnReplace(0x8c163e0, 0x3c0408ee, 0x00000000) -- nop
</pre>
======Patapon 2'''======
<pre>
-- Lua 5.3
-- Title:  Patapon 2 PSP - UCUS-98732 (USA)


apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
*videos/
 
*.mp4
local gpr = require( "ax-gpr-alias" ) -- you can access Allegrex GPR by alias (gpr.a0 / gpr["a0"])
*videos/%08x.mp4
local emuObj = getEmuObject() -- emulator
*audio/%08x.ogg
local axObj = getAXObject() -- allegrex
*--texswitch [original, replacement]
local pad = require("pad")
 
-- Hook memcpy to catch framebuffer effects
axFuncReplace(0x881D194, "patapon_memcpy")
 
-- Accelerate some functions
axFuncReplace(0x8804670, "__ptmf_scall")
axFuncReplace(0x8892230, "Renderer__makeWorldMatrix__4psysFv")
axFuncReplace(0x88209A8, "patapon_strcmp")
axFuncReplace(0x8815130, "sceGupSetStatus")
axFuncReplace(0x8851D84, "FMtx44__setRow__3PydFv")
axFuncReplace(0x88437F0, "Script__Talk__Controller__setDeltaTime__3PydFv")
axFuncReplace(0x8843B6C, "Script__Talk__Controller__setCmdId__3PydFv")
axFuncReplace(0x88441DC, "Script__Talk__Controller__getArgValuePtr__3PydFv_0")
axFuncReplace(0x89B25B0, "sceGmoCol4Multiply")
axFuncReplace(0x8910A60, "Gfx__CacheModel__getNodeMtx__6SystemFv")
axFuncReplace(0x8911440, "Gfx__StaticGmoModel__getNodeIdx__6SystemFv")
axFuncReplace(0x89114C8, "Gfx__StaticGmoModel__getNodeMtx__6SystemFv")
axFuncReplace(0x891157C, "Gfx__StaticGmoModel__getNodeMtx__6SystemFv_0")
axFuncReplace(0x881462C, "sceGuEnable", 0x8B3C050) -- param = gupbase pointer
axFuncReplace(0x8814684, "sceGuDisable", 0x8B3C050) -- param = gupbase pointer
axFuncReplace(0x89B2D84, "sceGmoFCurveEval_fastpath", 0x89B2D88) -- param = function entry if not fast path
--axFuncReplace(0x88D0788, "Game__Map__Weather__WindLocus__update__4LaboFv_loop", 0x88D0864) -- param = continue address
axFuncReplace(0x890FCBC, "convertLowerString__6SystemFv")
axFuncReplace(0x8877104, "convertLowerString__6SystemFv") -- convertLowerString__21@unnamed@BNDFile_cpp@Fv, same functionality
axFuncReplace(0x897927C, "__extendsfdf2")
axFuncReplace(0x8979AF8, "__muldf3")
axFuncReplace(0x8979A8C, "__adddf3")
axFuncReplace(0x897A750, "__truncdfsf2")
axFuncReplace(0x88CBD64, "RemapPacket", 0x8ACC394) -- param comes from RemapPacketAddr24 & RemapPacketAddr16
axFuncReplace(0x890FEA0, "patapon_strcmp") -- strcmpFast__6SystemFv ('fast' strcmp)
 
-- Switch Select command to "Options" button.
emuObj.PadSetButtonsMode(pad.BUTTONS_MODE_OPTION_IS_SELECT)
 
-- Remove "Transfer Patapon Saved Data" option from New Game option
--axInsnReplace(0x8A46660, 0x24070002, 0x24070001) -- li  a3,0x2  (change 2 menu options to 1)
emuObj.RemapSavedata("UCUS98711", "CUSA06171", "504e802b04a1838c32b616abbe0b475fbea1c823825ef0df06cc2bad129ce2f7")
 
-- Fix "Tree of Life" unaligned lines and shadows
axObj.AddHook(0x884600C, 0x8c850010, function() -- PSP::Gfx::PrimitiveContext::setVertex2f
local context = axObj.GetGpr(gpr.a0)
local cmdCount = axObj.ReadMem32(context + 0x14)
if (cmdCount & 1) == 1 then -- we have at least 2 commands
local cmdBuffer = axObj.ReadMem32(context + 0x10)
local cx = axObj.GetFpr(12)
local cy = axObj.GetFpr(13)
local ox = axObj.ReadMemFloat(cmdBuffer-12)
local oy = axObj.ReadMemFloat(cmdBuffer-8)
if cx == ox then
axObj.SetFpr(12, cx + 0.5)
axObj.WriteMemFloat(cmdBuffer-12, ox + 0.5)
elseif cy == oy then
axObj.SetFpr(13, cy + 0.5)
axObj.WriteMemFloat(cmdBuffer-8, oy + 0.5)
end
end
end)
 
-- LANGUAGES --
local langCode = "us" -- default
--local languageList = {"Japanese","English","UK","Italian","German","Spanish","French","Korean","Chinese","ns","nf","Dutch","Portuguese","gr","Belgium"}
--local gameLanguageCode = {"jp","us","uk","it","de","sp","fr","kr","cn","ns","nf","nl","pt","gr","be"}
local languageList = {"","English","","","","","","","","Spanish","French","","","",""}
local gameLanguageCode = {"","us","","","","","","","","ns","nf","","","",""}
 
-- US: english = 1, spanish = 9, french = 0xA (from Localize__Manager__setDefaultLangage)
-- EU: uk = 2, italian = 3, german = 4, spanish = 5, french = 6
-- JP: jp = 0
-- HP: ko = 7, ch = 8,
-- GLOBAL FUNCTIONS --
 
local GLOBAL = 0x8B7D088 -- reawakeDeathUnit - offset 0x88A95E8 in $v1
 
function getGlobalAddr() -- gets Global to user data.
-- address comes from: Labo::Bases::Camp::Controller::reawakeDeathUnit - offset 0x88A95E8 in $v1
-- add 0x20 to address to align it with the word "none"
local main = axObj.ReadMem32(GLOBAL) -- fixed Global address from: 0x88A95E8 -> 0x8c9fbc0
if main == 0xFFFFFFFF or main == 0 then
return 0xFFFFFFFF
end
local ptr = axObj.ReadMem32(main + 0x10c0) --> sets to: 0x8d07840
if ptr == 0xFFFFFFFF or ptr == 0 then
return 0xFFFFFFFF
end
 
return ptr
end
 
-- MAIN FUNCTIONS --
 
local H1 = function() -- Labo::Bases::Camp::Scene::updateTips
local v0 = axObj.GetGpr(gpr.v0)
if v0 > 0 then
emuObj.ThrottleMax()
else
emuObj.ThrottleNormal()
end
end
 
local H2 = function() -- GameSystem__SaveDataController__setStateMessage
local ptr = axObj.GetGpr(gpr.a2)
local str = axObj.ReadMemStr16(ptr)
local newStr = "Now loading. Do not turn off the power."
-- english: Now loading./Do not remove the Memory Stick Duo™ /or turn off the system power.
-- spanish: Cargando./No extraigas el Memory Stick Duo™ /ni apagues el sistema.
-- french: Chargement./Ne pas retirer le Memory Stick Duo™ /ou éteindre le système.
-- italian: Caricamento in corso.../Non rimuovere il Memory Stick Duo™ /e non spegnere il sistema.
-- german: Lädt./Bitte den Memory Stick Duo™ nicht entfernen /und das System nicht ausschalten.
-- japanese: システムデータをロード中です。/Memory Stick Duo™を抜き挿ししたり、/電源を切ったりしないでください。
-- chinese: 系統資料載入中。/請勿插拔Memory Stick Duo™/或是關閉主機的電源。
-- korean: 시스템 데이터를 불러오는 중입니다./Memory Stick Duo™를 빼거나/전원을 끄지 마십시오.
if string.find(str, "Now loading") then
newStr = "Now loading." -- English: Now loading./Do not remove the Memory Stick Duo™ /or turn off the system power.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Checking Memory Stick") then
newStr = "Please wait." -- English: Checking Memory Stick Duo™.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Now saving")then
newStr = "Now saving." -- English: Now saving./Do not remove the Memory Stick Duo™ /or turn off the system power.
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "Cargando.") then
newStr = "Cargando..." -- Spanish: Cargando./No extraigas el Memory Stick Duo™ /ni apagues el sistema.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Guardando...")then
newStr = "Espera..." -- Spanish: Guardando.../No extraigas el Memory Stick Duo™ /ni apagues el sistema.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Comprobando el Memory Stick") then
newStr = "Guardando..." -- Spanish: Comprobando el Memory Stick Duo™.
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "Chargement.") then
newStr = "Chargement." -- French: Chargement./Ne pas retirer le Memory Stick Duo™ /ou éteindre le système.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Vérification du Memory Stick")then
newStr = "Veuillez patienter." -- French: Vérification du Memory Stick Duo™.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Sauvegarde.") then
newStr = "Sauvegarde en cours." -- French: Sauvegarde./Ne pas retirer le Memory Stick Duo™ /ou éteindre le système.
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "Caricamento in corso") then
newStr = "Caricamento in corso." -- Italian: Caricamento in corso.../Non rimuovere il Memory Stick Duo™ /e non spegnere il sistema.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Controllo del Memory Stick")then
newStr = "Attendi." -- Italian: Controllo del Memory Stick Duo™.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Salvataggio in corso") then
newStr = "Salvataggio in corso." -- Italian: Salvataggio in corso.../Non rimuovere il Memory Stick Duo™ /e non spegnere il sistema.
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "Lädt") then
newStr = "Lädt." -- German: Lädt./Bitte den Memory Stick Duo™ nicht entfernen /und das System nicht ausschalten.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Memory Stick Duo™ wird überprüft")then
newStr = "Bitte warten." -- German: Memory Stick Duo™ wird überprüft.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Speichert.") then
newStr = "Speichert." -- German: Speichert./Bitte den Memory Stick Duo™ nicht entfernen und /das System nicht ausschalten.
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "システムデータをロード中です。") then
newStr = "ロード中。" -- Japanese: システムデータをロード中です。/Memory Stick Duo™を抜き挿ししたり、/電源を切ったりしないでください。
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Memory Stick Duo™のチェック中です。")then
newStr = "お待ちください。" -- Japanese: Memory Stick Duo™のチェック中です。
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "システムデータをセーブ中です。") then
newStr = "セーブ中。" -- Japanese: システムデータをセーブ中です。/Memory Stick Duo™を抜き挿ししたり、/電源を切ったりしないでください。
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "系統資料載入中。") then
newStr = "載入中。" -- Chinese: 系統資料載入中。/請勿插拔Memory Stick Duo™/或是關閉主機的電源。
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Memory Stick Duo™確認中。")then
newStr = "請稍候。" -- Chinese: Memory Stick Duo™確認中。
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "保存中。") then
newStr = "存檔中。" -- Chinese: 保存中。/請勿插拔Memory Stick Duo™/或是關閉主機的電源。
axObj.WriteMemStr16Z(ptr, newStr)
--
elseif string.find(str, "시스템 데이터를 불러오는 중입니다") then
newStr = "불러오는 중입니다." -- Korean: 시스템 데이터를 불러오는 중입니다./Memory Stick Duo™를 빼거나/전원을 끄지 마십시오.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "Memory Stick Duo™ 체크 중입니다")then
newStr = "잠시 기다려 주십시오." -- Korean: Memory Stick Duo™ 체크 중입니다.
axObj.WriteMemStr16Z(ptr, newStr)
elseif string.find(str, "시스템 데이터를 저장 중입니다") then
newStr = "저장 중입니다." -- Korean: 시스템 데이터를 저장 중입니다./Memory Stick Duo™를 빼거나,/전원을 끄지 마십시오.
axObj.WriteMemStr16Z(ptr, newStr)
end
end
 
local H3 = function() -- Localize__Manager__getLanguageName
local v0 = axObj.GetGpr(gpr.v0)
local langPtr = axObj.ReadMem32(v0)
langCode = axObj.ReadMemStr(langPtr)
end
 
local bundleFileName = ""
local H4 = function() -- System::Util__BNDFile__doNameCallback
local ptr = axObj.GetGpr(gpr.a0)
bundleFileName = axObj.ReadMemStr(ptr)
end
 
local H5 = function() -- Labo::GameSystem__callbackFunc_MemoryObject
local ptr = axObj.GetGpr(gpr.s5)
local dataPtr = axObj.ReadMem32(ptr)
if bundleFileName == "colony_data.pac" then
axObj.WriteMem16(dataPtr + 0x79ba, 4)
end
end
 
-- Black Smith - Remove "KeyGuide" bug when hit anvil head while quenching --
local blackSmithRunning = false
local H6 = function() -- Sound__SubGame__Blacksmith__Command__start__4LaboFv
blackSmithRunning = true
end
local H7 = function() -- Sound__BeatCommander__endSubGame__4LaboFv
if blackSmithRunning == true then
local a0 = axObj.GetGpr(gpr.a0)
axObj.WriteMem8(a0 + 0x19c, 1) -- set memory to 1 (instead of 0) otherwise brings up bad "KeyGuide"
end
blackSmithRunning = false
end
 
-- TIPS System hacks --
axInsnReplace(0x8A73A44, 0x3C0342A8, 0x3C0342A4) -- change required number of Tips from 84 to 82.
local H8 = function() -- GameSystem__Tips__Viewer__setup__4LaboFv
local global = getGlobalAddr()
if global == 0xFFFFFFFF then
return
end
 
local unitTable = axObj.ReadMem32(global + 0x1068) --> sets to: 0x8d13580 (unit table)
local tipsPtr = unitTable + 0x1F5E4
local badTips = axObj.ReadMem32(tipsPtr + 8)
badTips = badTips & 0xFFBBFFFF -- remove tips 0x53 and 0x57 as they referred to Multiplayer
axObj.WriteMem32(tipsPtr + 8, badTips)
end
 
-- Remove AutoSave menu from initial startup --
local H9 = function() -- GameSystem__SaveDataController__update__4LaboFv
local s3 = axObj.GetGpr(gpr.s3)
local flg = axObj.ReadMem32(s3 + 0x7eed)
local val = axObj.ReadMem32(s3 + 0x7efc)
if flg == 0 and val == 0x14 then
axObj.WriteMem32(s3 + 0x7efc, 0x13)
end
end
 
-- Change game save name to "Patapon 2 Remastered" --
local H10 = function() -- Utility__SaveDataUtility__setDataParamsfoString
local ptr = axObj.GetGpr(gpr.s1)
local strPtr = axObj.ReadMem32(ptr)
local newStr = "PATAPON™ 2 Remastered"
axObj.WriteMemStrZ(strPtr, newStr)
end
 
-- Change description for the "Friendship" weapon to remove game sharing text --
local itemsTable = {}
itemsTable[1] = "Proof of friendship establish" -- English
itemsTable[2] = "Prueba de la amistad establecida" -- Spanish
itemsTable[3] = "Preuve de l'amitié établie" -- French
itemsTable[4] = "Preuve d'une amitié" -- French alt
function changeStrings(strPtr) -- modify strings
local str = axObj.ReadMemStr16(strPtr) -- ptr to the string
local strFind = string.gsub(str, "/", " ") -- change any slash to space to strings can match.
strFind = string.gsub(strFind, "  ", " ") -- change any double spaces due to above change to only 1 space.
for i = 1, #itemsTable do
local startPos, endPos = string.find(strFind, itemsTable[i])
if startPos ~= nil then
str = string.sub(str, 1, (startPos-1) )
-- SPECIAL fixes --
str = string.gsub(str, "Un oiseau avec de bons HP et /une grosse attaque.","Un oiseau qui augmente vos/HP.") -- French incorrect grammar (bird)
str = string.gsub(str, "aumente","augmente") -- French incorrect grammar.
 
axObj.WriteMemStr16Z(strPtr, str)
end
end
end
local H11 = function() -- from Bases__Item__ExplanationWindow__setItemId
local ptr = axObj.GetGpr(gpr.a0)
local a2 = axObj.GetGpr(gpr.a2)
local valPtr = axObj.ReadMem32(ptr)
local v1 = valPtr + 8
local v0 = a2 * 4
v0 = v0 + v1
local strPtr = axObj.ReadMem32(v0)
strPtr = strPtr + valPtr
 
changeStrings(strPtr)
end
 
-- Skip Memory message when selecting "Delete Save Data" on "Save the adventure" dialogue.
local menuSkip = false
local H12 = function() -- Bases__Talk__CommandCamp__showDialog
menuSkip = true
end
local H13 = function() -- Bases__Talk__CommandCamp__showDialog
if menuSkip == true then
axObj.SetGpr(gpr.v1, 0)
menuSkip = false
end
end
local H14 = function() -- Bases__Talk__CommandCamp__showDialog
if menuSkip == true then
axObj.SetPC(0x88D908C)
end
end
 
 
-- HOOKS --
local hook1  = axObj.AddHook(0x88E9564, 0x0002102B, H1) -- Labo::Bases__Camp__Scene__updateTips
local hook2  = axObj.AddHook(0x899E718, 0x00403021, H2) -- GameSystem__SaveDataController__setStateMessage
local hook3  = axObj.AddHook(0x897771C, 0x00431021, H3) -- Localize__Manager__getLanguageName
local hook4  = axObj.AddHook(0x88774D0, 0x00402821, H4) -- System::Util__BNDFile__doNameCallback
local hook5  = axObj.AddHook(0x886889C, 0x02002021, H5) -- Labo::GameSystem__callbackFunc_MemoryObject
local hook6  = axObj.AddHook(0x898BCDC, 0x27BDFFE0, H6) -- Sound__SubGame__Blacksmith__Command__start__4LaboFv
local hook7  = axObj.AddHook(0x89220F8, 0xAC80019C, H7) -- Sound__BeatCommander__endSubGame__4LaboFv
local hook8  = axObj.AddHook(0x8A734DC, 0x27BDFFC0, H8) -- GameSystem__Tips__Viewer__setup__4LaboFv
local hook9  = axObj.AddHook(0x899CF4C, 0x92637EED, H9) -- GameSystem__SaveDataController__update__4LaboFv
local hook10 = axObj.AddHook(0x88E7E48, 0x2490009C, H10) -- Utility__SaveDataUtility__setDataParamsfoString
local hook11 = axObj.AddHook(0x897CF90, 0x26041718, H11) -- Bases__Item__ExplanationWindow__setItemId
local hook12 = axObj.AddHook(0x88D9114, 0xAEA00014, H12) -- Bases__Talk__CommandCamp__showDialog
local hook13 = axObj.AddHook(0x88D90B4, 0x9063C550, H13) -- Bases__Talk__CommandCamp__showDialog
local hook14 = axObj.AddHook(0x88D907C, 0x8FA2003C, H14) -- Bases__Talk__CommandCamp__showDialog
local hook15 = axObj.AddHook(0x8A394B4, 0x26241718, H11) -- Bases__Organization__Managed__ItemSelectWindow__onSlotChange (note uses H11)
 
 
-- US game bug fix.  "Paraget" -> "Patagate" --
axObj.AddHook(0x88DC5F4, 0x00409021, function() -- from Bases__Camp__Person__Behavior__Idle__update__4LaboFv
local strPtr = axObj.GetGpr(gpr.v0) + 0xE -- 0xE skip over X/Y positions.
local str = axObj.ReadMemStr16(strPtr)
if string.find(str, "The Paraget will") then
-- org string: The Paraget will teleport you to/another world…
local newStr = "The Patagate can teleport you to/another world…"
axObj.WriteMemStr16Z(strPtr, newStr)
elseif string.find(str, "Paraget Shrine") then
-- org string: This is the Paraget Shrine./Only <N0> and <N1> can/enter.
local newStr = "This is the Patagate Shrine/Only <N0> and <N1> can/enter."
axObj.WriteMemStr16Z(strPtr, newStr)
end
end)
 
--[[
axObj.AddHook(0x08982F48, 0x24070001, function()
if emuObj.NeoMode() then
axObj.SetGpr(gpr.a3, 0) -- turn on 60fps mode
end
end)
]]--
 
--- MOVIE FIX ---
local movieLastTime = 0.0
local movieFix = function() -- Labo::GameSystem__MovieModule__render
local t = axObj.GetFpr(0)
if t == 0 and movieLastTime > 0 then
local s0 = axObj.GetGpr(gpr.s0)
axObj.WriteMemFloat(s0 + 0x44, movieLastTime)
elseif t > 0 then
movieLastTime = t
end
end
 
axObj.AddHook(0x8A6A1DC, 0xe6000044, movieFix)
 
 
--- PAT2-16 FIX ---
axObj.AddHook(0x890E9E0, 0x02002021, function() -- Labo::Game__Gimmick__WindowAttacher__update
local ptr = axObj.GetGpr(gpr.sp) + 0x28
local posy = axObj.ReadMemFloat(ptr + 4)
if posy < -30 then
local obj = axObj.GetGpr(gpr.a0)
axObj.WriteMem8(obj + 0x2a8, 0)
end
end)
</pre>
 
== 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>
{| 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==
<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;"
! 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
 
</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:  
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 168:
; 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 184:
; 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"
|HLEInterruptManager|
; Special thanks to Matsuura, Rodney, Allan and all the awesome people at Japan Studio! Also HUUUUGE thanks to Ernesto, Adam, Henrick, Taku, Tim, Nick, Mayene, Tyler, Dave Thach and Scott Rohde whose support made this project of love possible! PaRappa-4-Ever!!!!!
; If you're reading this message, congratulations! you win !!!
; we love you so much. you’ve made hacking great again.</pre>


sceKernelRegisterSubIntrHandler
===NIDs in HLE===
sceKernelReleaseSubIntrHandler
sceKernelEnableSubIntr


|HLEStdioForUser|
=====HLEInterruptManager=====


sceIoOpen
*sceKernelRegisterSubIntrHandler
sceIoClose
*sceKernelReleaseSubIntrHandler
sceIoRead
*sceKernelEnableSubIntr
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|
=====HLEStdioForUser=====


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


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


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


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


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


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


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


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


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


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


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


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


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


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


sceMpegInit
*sceImposeGetLanguageMode
sceMpegFinish
*sceImposeSetLanguageMode
sceMpegCreate
*sceImposeSetUMDPopup
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|
=====HLEsceMpeg=====


sceNetInit
*sceMpegInit
sceNetInetGetsockopt
*sceMpegFinish
sceNetInetSetsockopt
*sceMpegCreate
sceNetInetGetErrno
*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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


sceKernelMaxFreeMemSize
*sceWlanGetSwitchState
sceKernelTotalFreeMemSize
*sceWlanGetEtherAddr
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|
=====HLESysMemUserForUser=====


sceKernelDelayThread
*sceKernelMaxFreeMemSize
sceKernelDelayThreadCB
*sceKernelTotalFreeMemSize
sceKernelCreateCallback
*sceKernelQueryMemoryInfo
sceKernelDeleteCallback
*sceKernelDevkitVersion
sceKernelSleepThread
*sceKernelPrintf
sceKernelSleepThreadCB
*sceKernelGetPTRIG
sceKernelWakeupThread
*sceKernelSetPTRIG
sceKernelCreateMsgPipe
*sceKernelAllocPartitionMemory
sceKernelDeleteMsgPipe
*sceKernelFreePartitionMemory
sceKernelSendMsgPipe
*sceKernelGetBlockHeadAddr
sceKernelTrySendMsgPipe
*sceKernelGetMemoryBlockAddr
sceKernelReceiveMsgPipe
*sceKernelAllocMemoryBlock
sceKernelTryReceiveMsgPipe
*sceKernelFreeMemoryBlock
sceKernelReferMsgPipeStatus
*sceKernelSetCompilerVersion
sceKernelCreateThread
*sceKernelGetCompiledSdkVersion
sceKernelStartThread
*sceKernelSetCompiledSdkVersion
sceKernelExitThread
*sceKernelSetCompiledSdkVersion370
sceKernelDeleteThread
*sceKernelSetCompiledSdkVersion380_390
sceKernelExitDeleteThread
*sceKernelSetCompiledSdkVersion395
sceKernelGetThreadExitStatus
*sceKernelSetCompiledSdkVersion401_402
sceKernelTerminateThread
*sceKernelSetCompiledSdkVersion500_505
sceKernelTerminateDeleteThread
*sceKernelSetCompiledSdkVersion507
sceKernelWaitThreadEnd
*sceKernelSetCompiledSdkVersion600_602
sceKernelWaitThreadEndCB
*sceKernelSetCompiledSdkVersion603_605
sceKernelRotateThreadReadyQueue
*sceKernelSetCompiledSdkVersion606
sceKernelReferThreadStatus
*sceKernelSetUsersystemLibWork
sceKernelSuspendDispatchThread
*sceKernelSysMemUserForUser_ACBD88CA
sceKernelResumeDispatchThread
*sceKernelSysMemUserForUser_D8DE5C1E
sceKernelSuspendThread
*sceKernelSysMemUserForUser_945E45DA
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|
=====HLEThreadManForUser=====


sceKernelIcacheInvalidateRange
*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


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


sceKernelIcacheInvalidateRange
*sceKernelIcacheInvalidateRange
sceKernelDcacheInvalidateRange
sceKernelDcacheWritebackInvalidateRange
sceKernelDcacheWritebackAll
sceKernelDcacheWritebackRange
sceKernelDcacheWritebackInvalidateAll
sceKernelSetGPO
sceKernelGetGPI
sceKernelLibcClock
sceKernelLibcTime
sceKernelLibcGettimeofday 0x71EC4271
</pre>


==Unimplemented functions==
=====HLEUtilsForUser=====
<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===
*sceKernelIcacheInvalidateRange
<pre>
*sceKernelDcacheInvalidateRange
|sceIoIoctl|
*sceKernelDcacheWritebackInvalidateRange
*sceKernelDcacheWritebackAll
*sceKernelDcacheWritebackRange
*sceKernelDcacheWritebackInvalidateAll
*sceKernelSetGPO
*sceKernelGetGPI
*sceKernelLibcClock
*sceKernelLibcTime
*sceKernelLibcGettimeofday 0x71EC4271


supported:
===Unimplemented functions===
0x1010005 (UMD file seek set)
0x1020006 (Get UMD file start sector)


|sceIoDevctl|
*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


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==
===Partially Supported===
<pre>
* sceIoIoctl: only 0x1010005 (UMD file seek set), 0x1020006 (Get UMD file start sector) supported
scePowerRegisterCallback - ignoring
* sceIoDevctl: only 0x1F100A4, 0x2415821, 0x2415822, 0x2025806, 0x2425823, 0x2415823, supported
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://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)