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:
== Official games ==
=='''PSPHD'''==
 
=== PSP Demos on PS4 ===
 
* LocoRoco™2 Remastered Retail Kiosk Demo UP9000-CUSA10806_00-LOCOROCO2DEMO001 or JP9000-CUSA10952_00-LOCOROCO2DEMO001 DRM Free with license, removed from PS Store, present on PS4 IDU Disc
* PaRappa The Rapper™ Remastered 20th Anniversary Demo JP9000-CUSA07156_00-UCJS10046PSXDEMO or UP9000-CUSA07045_00-UCUS98702PSXDEMO or EP9000-CUSA07203_00-UCES00775PSXDEMO DRM Free with license, present on Japan, US and Europe PS Store, present on PS4 IDU Disc
 
=== PSP games available on PS4 PS Store ===
 
* Castlevania Requiem UP0101-CUSA13434_00-CASTLEVANIA00001 2018-10-26. The Dracula X Chronicles versions of Symphony of the Night and Rondo of Blood were re-released for the PlayStation 4 on October 26, 2018 as part of the Castlevania Requiem compilation. A port of Castlevania: Symphony of the Night was included as unlockable bonus content in Castlevania: The Dracula X Chronicles for the PlayStation Portable, which was released in North America on October 23, 2007, in Japan on November 8, 2007, and in Europe on February 18, 2008. Except for the Japanese release, the English translation features a new script and newly recorded voice acting, with the option to use the original Japanese voices. The PSP release is a port of the PlayStation version, but contains some additions and changes.
* Jeanne d'Arc (2006) UP9000-CUSA41018_00-UCUS987000000000 (PS5: UP9000-PPSA13995_00-UCUS987000000000) 2024-07-16
* Ratchet & Clank: Size Matters (2007) UP9000-CUSA41395_00-UCUS986330000000 (PS5: UP9000-PPSA14431_00-UCUS986330000000) 2024-07-16 PS4 11.50
* LEGO Star Wars II: The Original Trilogy UP1082-CUSA41250_00-ULUS101550000000 or EP1006-CUSA41251_00-ULES004790000000 (PS5: UP1082-PPSA14300_00-ULUS101550000000 or UP1082-PPSA14300_00-0804842924824650) 2024-06-18 patch 1.01 requires PS4 11.50 or PS5 9.20
* GODS EATER BURST PS4® & PS5® (PS5: UP0700-PPSA07715_00-GODEATERBURST000 or JP0700-PPSA07713_00-GODEATERBURST000) 2024-03-19
* Daxter UP9000-CUSA36097_00-NPUG803290000000 (PS5: UP9000-PPSA09695_00-NPUG803290000000) 2024-06-18 patch 1.01 requires PS4 11.50 or PS5 9.20
* Jak and Daxter: The Lost Frontier UP9000-CUSA41282_00-NPUG803300000000 (PS5: UP9000-PPSA14325_00-NPUG803300000000) 2024-03-19 patch 1.02 requires PS4 11.50 or PS5 9.00
* Thrillville EP1006-CUSA41330_00-ULES006460000000 or UP1082-CUSA41329_00-ULUS101910000000 (PS5: UP1082-PPSA14358_00-0724668029168071) 2023-12-19
* Thrillville: Off the Rails (PS5: UP1082-PPSA14360_00-0645898243839752) 2023-12-19
* Tekken 6 PS4® & PS5® UP0700-CUSA33754_00-TEKKEN6000000000 or JP0700-CUSA33752_00-TEKKEN6000000000 (PS5: UP0700-PPSA07707_00-ULUS104660000000) 2023-10-17
* Soulcalibur: Broken Destiny PS4® & PS5® UP0700-CUSA33758_00-SOULCALIBURBD000 or JP0700-CUSA33756_00-SOULCALIBURBD000 2023-10-17
* Disney•Pixar Up UP1082-CUSA41345_00-0227660722516578 2023-11-21
* MediEvil Resurrection™ UP9000-CUSA33589_00-UCUS986200000000 2023-08-15
* Ridge Racer 2 PS4 & PS5 UP0700-CUSA33740_00-RIDGERACER200000 or JP0700-CUSA33738_00-RIDGERACER200000 2022-12-20
* Gravity Crash Portable UP9000-CUSA40479_00-NPUG803210000000 or JP9000-CUSA40480_00-NPJG000440000000 2023-07-18
* Killzone: Liberation (2006) EP9000-CUSA37875_00-UCES002790000000 or UP9000-CUSA37874_00-UCUS986460000000 (PS5: UP9000-PPSA11141_00-UCUS986460000000) 2023-06-20 PS5 7.40
* Pursuit Force (2005) UP9000-CUSA37191_00-UCUS986400000000 or EP9000-CUSA37192_00-UCES000190000000 or JP9000-CUSA37932_00-ULJM050970000000 or HP9000-CUSA37193_00-UCKS450160000000 (PS5: UP9000-PPSA10609_00-UCUS986400000000) 2023-05-16
* Pursuit Force: Extreme Justice UP9000-CUSA34853_00-UCUS987030000000 (PS5: UP9000-PPSA08696_00-UCUS987030000000) 2023-08-15
* Blade Dancer: Lineage of Light UP9000-CUSA37870_00-ULUS101240000000 or JP9000-CUSA37872_00-UCJS100210000000 2023-05-16
* Pinball Heroes UP9000-CUSA33617_00-0000000000000000 2022-12-20
* Disney•Pixar Toy Story 3 UP1082-CUSA33343_00-4838282977086414 2022-09-20
* Kingdom of Paradise UP9000-CUSA33573_00-UCUS986230000000 or JP9000-CUSA33575_00-UCJS100100000000 or HP9000-CUSA34893_00-UCAS400230000000 2022-09-20
* No Heroes Allowed! UP9000-CUSA33595_00-NPUG804600000000 2022-07-19
* LocoRoco Midnight Carnival UP9000-CUSA32639_00-0000000000000000 or JP9000-CUSA32641_00-0000000000000000 or EP9000-CUSA32640_00-0000000000000000 2022-07-19
* Ape Escape: On the Loose UP9000-CUSA37860_00-UCUS986090000000 or EP9000-CUSA37861_00-UCES000450000000 or JP9000-CUSA37862_00-UCJS100040000000 2023-08-15 PS4 10.70
* Ape Escape Academy UP9000-CUSA33020_00-UCUS986190000000 or JP9000-CUSA33022_00-UCJS100030000000 2023-10-17
* Ape Academy 2 UP9000-CUSA37900_00-UCES003020000000 or JP9000-CUSA37866_00-UCJS100200000000 2023-03-21
* Secret Agent Clank UP9000-CUSA41276_00-UCUS986970000000 (PS5: UP9000-PPSA14319_00-UCUS986970000000) 2024-09-17
* Syphon Filter: Logan's Shadow (2007) EP9000-CUSA32631_00-UCES007100000000 or UP9000-CUSA32630_00-UCUS986060000000 (PS5: UP9000-PPSA06782_00-UCUS986060000000) 2023-05-16 PS5 9.00
* Syphon Filter: Dark Mirror UP9000-CUSA32633_00-UCUS986410000000 2023-03-21
* echochrome UP9000-CUSA32644_00-NPUG801350000000 or JP9000-CUSA32646_00-UCJS100810000000 2022-06-13
* Super Stardust Portable (2007) EP9000-CUSA33036_00-NPEG000080000000 or UP9000-CUSA33035_00-NPUG802210000000 or JP9000-CUSA33037_00-NPJG000130000000 (PS5: UP9000-PPSA07135_00-NPUG802210000000 or EP9000-PPSA07136_00-NPEG000080000000) 2022-06-13
* echoshift UP9000-CUSA33585_00-NPUG803030000000 or JP9000-CUSA33587_00-UCJS100960000000 2022-07-19
* Resistance: Retribution (2009) EP9000-CUSA32637_00-UCES011840000000 or UP9000-CUSA32636_00-UCUS986680000000 (PS5: EP9000-PPSA06789_00-UCES011840000000 or UP9000-PPSA06788_00-UCUS986680000000 or JP9000-PPSA06790_00-UCJS100900000000) 2024-02-20
* 勇者のくせになまいきだ:3D (What Did I Do to Deserve This, My Lord? 3D) JP9000-CUSA33597_00-UCJS101090000000 2022-07-19
* Coded Soul JP9000-CUSA33571_00-UCJS100610000000 or HP9000-CUSA34502_00-UCAS401800000000 2023-06-20
* Ore no Shikabane o Koete Yuke (PS5: JP9000-PPSA09382_00-UCJS101170000000) 2024-04-16
 
=== PSP remaster games available on PS4 PS Store ===
 
Note that some of these remastered games like LocoRoco™ 2 Remastered use a PSP emulator and most original files, but with additional files like replacement textures for example. There are even some features like 60 fps that are available only on PS4 Pro but not on standard PS4.
 
* LocoRoco™ Remastered UP9000-CUSA06090_00-UCUS986620000001 or EP9000-CUSA07286_00-UCES003040000001 or JP9000-CUSA06933_00-UCUS986620000001 2017-05-09
* LocoRoco™ 2 Remastered UP9000-CUSA06091_00-UCUS987310000001 or EP9000-CUSA07695_00-LOCOROCO2HD00001 or JP9000-CUSA06934_00-LOCOROCO2HD00001 2017-12-09
* LUMINES REMASTERED UP0751-CUSA11624_00-LUMINESREMASTERE or JP1049-CUSA11673_00-LUMINESREMASTERE or EP0748-CUSA11647_00-LUMINESREMASTERE 2018-07-10
* Patapon™ Remastered UP9000-CUSA06171_00-UCUS987110000001 or EP9000-CUSA07285_00-UCES009950000001 or JP9000-CUSA06935_00-PATAPON100000001 2017-08-01
* Patapon 2 Remastered UP9000-CUSA07321_00-UCES011770000001 or EP9000-CUSA07694_00-UCES009950000001 or JP9000-CUSA08178_00-PATAPON200000001 2020-01-30
* Patapon 3 UP9000-CUSA41279_00-UCUS987510000000 2025-01-15. Enhanced with up-rendering, rewind, quick save, and custom video filters.
* Metal Slug Double X JP0576-CUSA11717_00-METALSLUGXX00001 or EP0576-CUSA11740_00-METALSLUGXX00001 or UP0576-CUSA11667_00-METALSLUGXX00001 2018-05-30
* PaRappa The Rapper™ Remastered JP9000-CUSA06932_00-UCJS100460000001 or UP9000-CUSA05289_00-UCUS987020000001 or EP9000-CUSA07172_00-UCES007750000001 2017-04-04
 
== '''PSPHD''' ==
 
The PSP emulator for PlayStation 4 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 in the scene as the PS2 emulator due to the existence of an unofficial PPSSPP core in the unofficial Retroarch port for hacked PS4. As far as the compatibility and performance go, the Retroarch core is yet to be bested. This official emulator may hold potential, but the potential can only go so far as it seems not to have support for gamedata installation, which in turn will render many games unplayable.


== Commands ==
== Commands ==


'''Known functions:''' Require cleanup.
=== config-emu-ps4.txt commands ===
 
<br>The rest of the CLI and Lua commands can all be found inside of any PSP emulator'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;"
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Command !! Values !! Notes !! Usage  
! Command !! Values !! Notes !! Usage  
|-style="background-color:#FEA15C"
|  || General || ||
|-
|-
| --boot || || Set directory of psp game's boot.bin || [disc0:/PSP_GAME/SYSDIR/BOOT.BIN]
| --boot || || [disc0:/PSP_GAME/SYSDIR/BOOT.BIN - path (no loaders support like on PS3? vide ct2, psc)] ||
|-
|-
| --notrophies || || Enable/disable trophies||  
| --notrophies || || ||
|-
|-
| --ps4-trophies  || || ||
| --volume || || ? (Adjusting volume level to %d%%) ||
|-
|-
| --locale || || ||
| --image || umd0 ,disc0 || ||
|-
| --image || umd0 ,disc0 || Set path for disc image ||
|-
| --vms || ? || ? ||
|-
|-
| --addon || || ||
| --addon || || ||
|-
|-
| --host || Sets host directory || --host="/hostapp/" ||
| --host || host0, flash0 || ||
|-
|-
| --loglevel || none, all, warn, info, error, debug, trace || debug logging  ||
| --texsave || || ||
|-
|-
| --xobuttonmode || oenter, ocancel || Switcher between x and circle button, made specifically for japanese gamers  ||
| --texmissingsave || || ||
|-
|-
| --lang || Including but not limited to "en" "jp" "fr" "it"  || Language selector || --lang="en"
| --samplesave || || ||
|-
|-
| --savedata-mode || ? || ? ||
| --vramcopyback || 45, Value ? || || --vramcopyback=45
|-
|-
| --securesaves || true, false || Enable/disable encrypted savegames || --securesaves=true
| --replacementfilter || || ||
|-
|-
| --multisaves || true, false || Enable Multiple Savegames || --multisaves=true
| --texreplace || || ||
|-
|-
| --samplesave || ? || ? ||
| --samplereplace || || ||
|-style="background-color:#ff99c2"
| || Graphical fixes || ||
|-
|-
| --antialias || off, MSAA4x, SSAA4x|| Anti-aliasing options || --antialias=off
| --spu2Trace || true || || --spu2Trace=true
|-
|-
| --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
| --spu2-c1-memin-to-bgm || true || || --spu2-c1-memin-to-bgm=true
|-
|-
| --texclutmode || filter, full || || --texclutmode=full
| --replacementalpha || true || || --replacementalpha=true
|-
|-
| --texloadmode || launch, ondemand_lz4 || Seems to be a selector of when to load textures, either before the game requires it, or once the game requires it  ||
| --parappaalphahack || true || || --parappaalphahack=true
|-
|-
| --depthscalehack || true?, false? || ||--depthscalehack=true
| --locorocomeshsmooth || true || || --locorocomeshsmooth=true
|-
|-
| --depthscalehack || true?, false? || ||--depthscalehack=true
| --locorocomeshsmoothnonindexed || true || ||--locorocomeshsmoothnonindexed=true
|-
|-
| --locorocomeshsmooth || true, false || Custom mesh smoothing for loco roco games(?)|| --locorocomeshsmooth=true
| --gputhread || true || ||
|-
|-
| --locorocomeshsmoothnonindexed || true, false || Turns "locorocomeshsmooth" mesh smoothing into non-indexed(?) ||--locorocomeshsmoothnonindexed=true
| --antialias || off, MSAA4x, SSAA4x|| ||
|-
|-
| --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
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || || --texcachemode=patchworkheroes
|-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
| --texclutmode || filter, full || || --texclutmode=full
|-style="background-color:#03fcc2"
|  || No effect / unknown values || ||
|-
| --texloadcores || 0, 100 || textures to load || texloadcores=2
|-
|-
| --smoothlevel || 0, 100 || Mesh smoothing level? || --smoothlevel=0
| --texloadmode || launch, ondemand_lz4 || ||
|-
|-
| --anisolevel || 0, 100 || Anisotropic filtering level?? ||
| --depthscalehack || true || ||--depthscalehack=true
|-
|-
| --parappajapanesefonthack || true?, false? || Enables Support For Japanese Fonts ??|| --parappajapanesefonthack=true
| --forcenobilinear || true || ||--forcenobilinear=true
|-
|-
| --clamp-line-thickness-min || ? || ? ||
| --texloadcores || 2, 12? || || texloadcores=2
|-
|-
| --clamp-line-thickness-max || ? || ? ||
| --smoothlevel || 0, 6? || ||--smoothlevel=0
|-
|-
| --parappareplacecolor || The command expects 8 Hex values || (rgb?) ||
| --parappajapanesefonthack || true? || ||
|-
|-
| --msxxadhoc || true?, false? || ad hoc support ? ||
| --parappareplacecolor || %08x || (rgb?) ||
|-
| --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====
 
=== Speedhacks ===
 
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
! Command !! Values !! Notes !! Usage   
! Command !! Values !! Notes !! Usage   
|-
|-
| --force-native-aspect-ratio || || ||
| --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off
|-
|-
| --use-higher-precision-depth || || ||
| --texclutmode || filter, full || Turns on filtering of CLUT hashes to avoid repeat indexed textures ||--texclutmode=full
|-
|-
| --optimize-fb-self-resolves || || ||
| --texloadcores || 2, 12?|| Cores to use loading textures (higher count = more memory) ||--texloadcores=12
|-
|-
| --force-dsf-present || || ||
| --smoothlevel || 0,12 ?|| ||--smoothlevel=0
|-
|-
| --bend-30hz-lock|| || ||
| --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || ||--texcachemode=patchworkheroes
|-
|-
| --setframebuf-auto-vblank-wait-threshold|| || ||
| --present || vblankstart, setframebuf, drawsync|| ||--present=setframebuf
|-
|-
| --gpu-renderthread|| || ||
| --texrecent || true || Optimize texture hashes ||--texrecent=true
|-
| --force-triangle-clip-off|| || ||
|-
| --hack-use-sku-vms|| || ||
|-
| --active-sku || || ||
|-
| --psp-right-stick-action || 0,1 || ||--psp-right-stick-action=1
|-
| --psp-right-stick-deadzone-x || || ||--psp-right-stick-deadzone-x=15
|-
| --psp-right-stick-deadzone-y || || ||--psp-right-stick-deadzone-y=15
|-
| --psp-right-stick-deadzone-semicircle-arc || || ||--psp-right-stick-deadzone-semicircle-arc=40
|-
|-
| --umddelay || true || ||--umddelay=true
|}
|}


====Resistance====
==LUA==
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
===Examples===
! Command !! Values !! Notes !! Usage 
====Features.lua====
|-
<pre>
| --fb-tex-detection-mode || first-line, full, exact || ? ||
-- Lua 5.3
|-
-- Title:  Patapon 2 PSP - UCUS-98732 (USA)
| --enable-infected-mode || || ? ||
-- Author:  Adam McInnis
|-
 
| --enable-resistance-retribution-plus-mode || || ? ||
-- Changelog:
|-
 
| --psp-slower-disc-io || %s(%s, %08x) || ? ||
apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
|-
| --force-flip-on-vblank || ? ||
|-
|}


====Texture replacement====
local gpr = require( "ax-gpr-alias" ) -- you can access Allegrex GPR by alias (gpr.a0 / gpr["a0"])
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
local emuObj = getEmuObject() -- emulator
! Command !! Values !! Notes !! Usage 
local axObj = getAXObject() -- allegrex
|-
local pad = require("pad")
| --texswitch||true, false|| Enables Texture replacement || --texswitch=true
local trophyObj = getTrophyObject()
|-
| --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===


The lua can be placed as: '''scripts\XXXXYYYYY_patches.lua'''
-- INIT --
local GLOBAL = 0x8B7D088
local APPLICATION = 0x8B4C8D4
local missionID = 0
local missionRunning = false
local colonyMode = 0


====Emulator commands====


{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
-- GAME FUNCTIONS --
! 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====
local getApplication = function() -- getApplication
{| cellspacing="0" cellpadding="2" border="1" class="wikitable" style="text-align: center;"
local app = axObj.ReadMem32(APPLICATION) --> 0x8c99f60
! Command !! Usage !! Notes - Example
if app == 0 then
|-
return 0
| getAXObject ||'''local axObj = getAXObject()''' || Required for all functions using AXObject
end
|-
return axObj.ReadMem32(app) --> 0x8b8c740
| AddHook || axObj.AddHook() ||
end
|-
| 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
|-
|}


=====User-made examples=====
--- Scenes
<br>'''Coconut Dodge'''
<br>"NPEZ00164"
<pre>
local axObj = getAXObject()
local emuObj = getEmuObject()


local patcher = function()
local getSceneBase = function() -- from Application::initialize
--Infinite lives
local app = getApplication()
axObj.WriteMem32(0x8ACA1A4, 0x3) --0x08ACE1A4 on PPSSPP. PPSSPP addresses need to be reduced by 0x4000 in order to work on PS4
if app == 0 then
return 0
end
return axObj.ReadMem32(app + 0xCB24) -- -0x34DC($v1)
end
end


emuObj.AddVsyncHook(patcher)
local getNextSceneID = function() -- from System::SceneBase::setNextSceneId
</pre>
local base = getSceneBase()
<br>'''Daxter'''
if base == 0 then
<br>"NPUG80329"
return 0
<pre>
end
local axObj = getAXObject()
return axObj.ReadMem32(base + 8)
local emuObj = getEmuObject()
end


local patcher = function()
local getBasesScene = function()
--Performance patch
local scene = getSceneBase()
axObj.WriteMem32(0x08862E40, 0x10000019) --0x08866E40 on PPSSPP. PPSSPP addresses need to be reduced by 0x4000 in order to work on PS4
if scene == 0 then
axObj.WriteMem32(0x08862EAC, 0x0) --0x08866EAC on PPSSPP. PPSSPP addresses need to be reduced by 0x4000 in order to work on PS4
return 0
end
return axObj.ReadMem32(scene + 0xC)
end
end


emuObj.AddVsyncHook(patcher)
local getMissionScene = function()
</pre>
local scene = getBasesScene()
if scene == 0 then
return 0
end
return axObj.ReadMem32(scene + 0xC)
end


[https://www.psdevwiki.com/ps4/Talk:PSP_Emulator_Compatibility_List#Official_PSPemu_Configuration_Files More patches can be found here]
local getGameScene = function()
local scene = getMissionScene()
if scene == 0 then
return 0
end
return axObj.ReadMem32(scene + 0xC)
end


====Patches.lua====
local getSceneID = function(scene)
return axObj.ReadMem32(scene + 0x27354) -- from Labo::Game__Talk__CommandGame__getMissionId
end


======Syphon Filter: Dark Mirror======
local isTitle = function()
return getMissionScene() == 0
end


<pre>
local isCamp = function()
-- Lua 5.3
return isTitle() == false and getGameScene() == 0
-- Title: Syphon Filter: Dark Mirror
end


-- Patches for fixing issues with post fx in games using the Syphon Filter/Resistance engine
local isInMission = function()
if isTitle() == true or isCamp() == true then
return false
end


apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
return getGameScene() ~= 0
end


local emuObj = getEmuObject()
--- Game functions ---
local cpu = getAXObject()


-- The bloom filter uses 1.5 pixel jitter to make a ghetto blur. When up-ressed, this doesn't look good.
local getMissionID = function() -- from Game::Game::initialize
-- To compensate, reduce the jitter amount before rendering.
if isCamp() == true then
function BloomJitterPlusAdjust()
local scene = getMissionScene()
-- 1.5 pixel "+" pattern
return getSceneID(scene)
emuObj.AdjustUVJitter(0, 4, 0.0, 1.5)
elseif isInMission() == true then
emuObj.AdjustUVJitter(4, 4, 0.0, -1.5)
local scene = getGameScene()
emuObj.AdjustUVJitter(8, 4, 1.5, 0.0)
return getSceneID(scene)
emuObj.AdjustUVJitter(12, 4, -1.5, 0.0)
end
return -1
end
end


function BloomJitterCrossAdjust()
function getMissionName() -- from Bases__Talk__CommandCamp__setMissionNameFromVar
-- 1.5 pixel "x" pattern
local missionName = ""
emuObj.AdjustUVJitter(0, 4, 1.5, 1.5)
local index = axObj.ReadMem32(GLOBAL) -- 0x8c9fbc0
emuObj.AdjustUVJitter(4, 4, -1.5, 1.5)
 
emuObj.AdjustUVJitter(8, 4, 1.5, -1.5)
if index == 0 then
emuObj.AdjustUVJitter(12, 4, -1.5, -1.5)
return
end
local offset = axObj.ReadMem32(index + 0x10C0) -- 0x8d07840
 
if offset == 0 then
return
end
local strPtr = axObj.ReadMem32(offset + 0x1070)
local missionNamePtr = strPtr + 0x5FA2 -- is 0x8D38C62
missionName = axObj.ReadMemStr16(missionNamePtr)
return missionName
end
end


local jitterFixPlus = emuObj.AddGPUHook(0x40dc000, 0, 16, 0x40d4000, BloomJitterPlusAdjust)
--[[ vibrate on objects --
local jitterFixCross = emuObj.AddGPUHook(0x40d4000, 0, 16, 0x40dc000, BloomJitterCrossAdjust)
emuObj.PadVibrate() causes the DS4 to vibrate. The parameters are as follow:
1st parameter: Large Motor speed (0=off, 1 to 255=speed)
2nd parameter: Small Motor speed (0=off, 1 to 255=speed)
3rd parameter: Duration of the vibration in milliseconds (1000 = 1 second, Max 6 seconds).
  Once the time has elapsed both motors are turned off automatically.
]]--
 
local ctr = 0
local keyCtr = 0x0
local keyDown = 0
local noteCtr = 0
local playSeq = true
local lastSeq = 0
 
local H1 = function() -- sgxResFindSeq
local id = axObj.GetGpr(gpr.a1)
if playSeq == true then
lastSeq = 0 -- reset
playSeq = false
end
if id == lastSeq then
return -- don't repeat
end
-- allow repeat for "step" sounds: dragon,frog,manbroth,demon,worm,plant,machine,crab,crab,
-- machine,demon dragon,demon dragon,demon dragon,worm,worm,kamen rock
if id ~= 0x41c and id ~= 0x418 and id ~= 0x35c and id ~= 0x7cc and id ~= 0x560 and id ~= 0x470
and id ~= 0x4c4 and id ~= 0x39c and id ~= 0x3c8 and id ~= 0x51c and id ~= 0x800
and id ~= 0x82c and id ~= 0xd54 and id ~= 0x484 and id ~= 0x19c then
if id == lastSeq then
return -- don't repeat
end
end
lastSeq = id
local missionID = getMissionID()
 
-- all levels --
if missionID == 0 then
if id == 0x898 then
emuObj.PadVibrate(0,255,100) -- When a Patapon unit is created for tree of life.
end
end
if id == 0x670 then
emuObj.PadVibrate(50,255,250) -- After the player looses “Fever” mode (whistle down sound)
elseif id == 0x9f0 or id == 0x910 then -- (was 8f0)
emuObj.PadVibrate(0,240,80) -- New Patapon created.
elseif id == 0x3f8 then
emuObj.PadVibrate(20,0,200) -- Kaching collected
end
if missionID > 0 then
if id == 0x568 or id == 0x53c then -- yippe or fireworks after complete. (was 508)
missionRunning = false -- ? 31c 568 3a0
end
if missionRunning == false then
return
end
if missionID < 123 then
----- non-boss levels -----
if id == 0x2d0 or id == 0x354 or id == 0x2a4 or id == 0x80 then
emuObj.PadVibrate(100,10,260) -- falling building/object
elseif id == 0x47c or id == 0x450 then
emuObj.PadVibrate(0,150,100) -- picked up object
elseif id == 0x510 then
emuObj.PadVibrate(0,255,100) -- totem award
elseif id == 0x328 then
emuObj.PadVibrate(16,40,200) -- Stick barrier break
elseif id == 0x170 then
emuObj.PadVibrate(66,180,900) -- Windmill breaking
elseif id == 0x334 then
emuObj.PadVibrate(80,40,200) -- Cannon ball blast
elseif id == 0x2b0 then
emuObj.PadVibrate(120,20,300) -- Gillotine
elseif id == 0x19c then
emuObj.PadVibrate(130,30,300) -- Karmemen Rock Toss
end
if id == 0x124 and missionID == 118 then
emuObj.PadVibrate(55,0,7000) -- Gate collapse
end
if id == 0x13c and missionID == 121 then
emuObj.PadVibrate(55,0,500) -- Fort collapse
end
else
----- boss levels -----
 
-- Dragon --
if id == 0x41c then
emuObj.PadVibrate(10,0,100) -- Dragon step
elseif id == 0x448 then
emuObj.PadVibrate(10,0,200) -- Dragon jump, retreat, etc.
elseif id == 0x4f8 then
emuObj.PadVibrate(10,50,100) -- Dragon jump, retreat, etc.
elseif id == 0x5a8 then
emuObj.PadVibrate(120,0,900) -- Dragon fall/dead
 
-- Demon Dragon --
elseif id == 0x800 then
emuObj.PadVibrate(30,0,100) -- Demon Dragon step
elseif id == 0x82c then
emuObj.PadVibrate(0,130,100) -- Demon Dragon short step
elseif id == 0xd54 then
emuObj.PadVibrate(0,170,50) -- Demon Dragon wing flap
elseif id == 0xb9c then
emuObj.PadVibrate(170,0,250) -- Demon Dragon fireball
elseif id == 0xbf4 then
emuObj.PadVibrate(190,0,900) -- Demon Dragon fall/dead
-- FrogRobot --
elseif id == 0x418 then
emuObj.PadVibrate(15,0,200) -- FrogRobot / Spider step
elseif id == 0x5d0 then
emuObj.PadVibrate(15,0,200) -- FrogRobot jump, crawl
elseif id == 0x4f4 then
emuObj.PadVibrate(15,0,200) -- FrogRobot fist slam
elseif id == 0x4c8 then
emuObj.PadVibrate(0,10,2000) -- FrogRobot laser / Plant gas
elseif id == 0x520 then -- cant use 0x54c
emuObj.PadVibrate(150,0,1000) -- FrogRobot fall/dead
-- Manbroth --
elseif id == 0x35c then
emuObj.PadVibrate(15,0,400) -- Manbroth step
elseif id == 0x388 then
emuObj.PadVibrate(15,0,400) -- Manbroth stomp
elseif id == 0x438 then
emuObj.PadVibrate(0,150,500) -- Manbroth: snow spray / Firebird gas
elseif id == 0x40c then
emuObj.PadVibrate(0,10,500) -- Manbroth: scoop
elseif id == 0x330 then
emuObj.PadVibrate(150,0,700) -- Manbroth: fall/dead
-- Demon --
elseif id == 0x7cc then
emuObj.PadVibrate(45,5,400) -- Demon step 1
elseif id == 0x5d8 or id == 0x9dc or id == 0x9b0 then
emuObj.PadVibrate(85,10,180) -- Demon step 2
elseif id == 0x7a0 then
emuObj.PadVibrate(10,10,180) -- Demon jump
elseif id == 0x7f8 then
emuObj.PadVibrate(0,220,90) -- Demon breath
elseif id == 0x380 then
emuObj.PadVibrate(200,0,150) -- Demon meteors
elseif id == 0x92c then
emuObj.PadVibrate(170,0,2000) -- Demon: fall/dead
-- Firebird --
elseif id == 0x598 then -- or 0x678?
emuObj.PadVibrate(55,5,450) -- Firebird slam
elseif id == 0x540 then
emuObj.PadVibrate(10,160,180) -- Firebird peck
elseif id == 0x6d0 then
emuObj.PadVibrate(10,230,500) -- Firebird gas
elseif id == 0x490 then
emuObj.PadVibrate(200,0,1000) -- Firebird: fall/dead
-- Worm --
elseif id == 0x3d4 or id == 0x400 then
emuObj.PadVibrate(5,55,250) -- Worm burrow
elseif id == 0x534 or id == 0x508 then
emuObj.PadVibrate(5,55,250) -- Worm slide
elseif id == 0x4b0  then
emuObj.PadVibrate(5,155,1100) -- Worm fire
elseif id == 0x484 then
emuObj.PadVibrate(75,10,350) -- Worm slam
elseif id == 0x560 then
emuObj.PadVibrate(175,190,850) -- Worm roll
elseif id == 0x3a8 then
emuObj.PadVibrate(140,0,2000) -- Worm: fall/dead
-- Plant --
elseif id == 0x470 then
emuObj.PadVibrate(5,55,250) -- Plant jump
elseif id == 0x49c then
emuObj.PadVibrate(200,0,800) -- Plant fall/dead
-- Machine --
elseif id == 0x4c4 then
emuObj.PadVibrate(15,0,500) -- Machine step
elseif id == 0x574 then
emuObj.PadVibrate(180,0,400) -- Machine bomb
elseif id == 0x51c then
emuObj.PadVibrate(10,220,200) -- Machine gun
elseif id == 0x6a8 then
emuObj.PadVibrate(255,220,1000) -- Machine cannon
elseif id == 0x5cc then
emuObj.PadVibrate(100,12,300) -- Machine ball & chain
elseif id == 0x498 then
emuObj.PadVibrate(210,0,900) -- Machine fall/dead
-- Crab --
elseif id == 0x39c then
emuObj.PadVibrate(85,10,180) -- Crab step
elseif id == 0x3c8 then
emuObj.PadVibrate(190,0,400) -- Crab jump
elseif id == 0x420 then
emuObj.PadVibrate(5,180,180) -- Crab claw
elseif id == 0x370 then
emuObj.PadVibrate(240,10,600) -- Crab fall/dead
-- Spider --
elseif id == 0x3ec then
emuObj.PadVibrate(210,50,700) -- Spider fall/dead


function depthquery()
-- OTHER --
local querystruct = 0x8eda968 -- this is always in a fixed location
elseif id == 0x65c then
-- the depth query struct is fixed to 24 entries
emuObj.PadVibrate(0,200,80) -- fire (patapon yipe)
-- 0..15 seem to be always used for lights, 16..23 are for npcs
elseif id == 0x5ac then
for i=0,23 do
emuObj.PadVibrate(0,200,80) -- fire burn(patapon yipe)
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
end
end
querystruct = querystruct + 0x2c
end
end
end
end


cpu.AddHook(0x8c163d4, 0x27bdff80, depthquery) -- = addiu sp, sp, -0x80
local H2 = function() -- Labo::Talk::CommandEffect::generateCapEffect
-- the hook code replaces the occlusion function, so just adjust the stack and return
emuObj.PadVibrate(0,255,150) -- When a Patapon unit from the players army is defeated or new special patapon created.
cpu.InsnReplace(0x8c163d8, 0x34040000, 0x27bd0080) -- addiu sp, sp, 0x80
end
cpu.InsnReplace(0x8c163dc, 0xafa40048, 0x03e00008) -- jr ra
 
cpu.InsnReplace(0x8c163e0, 0x3c0408ee, 0x00000000) -- nop
local H3 = function() -- Labo::Talk::CommandEffect::killEffect
</pre>
emuObj.PadVibrate(0,255,250) -- Thunder/Lightning
end
 
local H4 = function() -- MainGame__Mission__MissionScene__initialize__4LaboFv
missionRunning = true
getMissionName()
end


======Patapon 2'''======
--- HOOKS ---
local hook1 = axObj.AddHook(0x8828AA0, 0x8FBF0008, H1) -- sgxResFindSeq
local hook2 = axObj.AddHook(0x8901B84, 0x27BDFFC0, H2) -- Labo::Talk__CommandEffect__generateCapEffect
local hook3 = axObj.AddHook(0x89825B8, 0x27BDFF80, H3) -- Labo::Game__Map__ThunderLayer__generateThunder
local hook4 = axObj.AddHook(0x8914844, 0x27BDFFF0, H4) -- MainGame__Mission__MissionScene__initialize__4LaboFv


</pre>
====Patches.lua====
<pre>
<pre>
-- Lua 5.3
-- Lua 5.3
-- Title:  Patapon 2 PSP - UCUS-98732 (USA)
-- Title:  Patapon 2 PSP - UCUS-98732 (USA)
-- Author:  Ernesto Corvi
-- Changelog:
-- v1.1: US only.  Change the word "Paraget" to "Patagate" in two strings.


apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory.
Line 624: Line 497:
axFuncReplace(0x89B2D84, "sceGmoFCurveEval_fastpath", 0x89B2D88) -- param = function entry if not fast path
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(0x88D0788, "Game__Map__Weather__WindLocus__update__4LaboFv_loop", 0x88D0864) -- param = continue address
axFuncReplace(0x890FCBC, "convertLowerString__6SystemFv")
axFuncReplace(0x890FCBC, "convertLowerString__6SystemFv")
axFuncReplace(0x8877104, "convertLowerString__6SystemFv") -- convertLowerString__21@unnamed@BNDFile_cpp@Fv, same functionality
axFuncReplace(0x8877104, "convertLowerString__6SystemFv") -- convertLowerString__21@unnamed@BNDFile_cpp@Fv, same functionality
Line 632: Line 506:
axFuncReplace(0x88CBD64, "RemapPacket", 0x8ACC394) -- param comes from RemapPacketAddr24 & RemapPacketAddr16
axFuncReplace(0x88CBD64, "RemapPacket", 0x8ACC394) -- param comes from RemapPacketAddr24 & RemapPacketAddr16
axFuncReplace(0x890FEA0, "patapon_strcmp") -- strcmpFast__6SystemFv ('fast' strcmp)
axFuncReplace(0x890FEA0, "patapon_strcmp") -- strcmpFast__6SystemFv ('fast' strcmp)


-- Switch Select command to "Options" button.
-- Switch Select command to "Options" button.
Line 996: Line 871:
</pre>
</pre>


== Emulators ==
====basic====
 
{| 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. || ? || ?
|-
| Resistance: Retribution ||  || ? || ?
|-
| LocoRoco Midnight Carnival || ? || ? || ?
|-
| LocoRoco Remastered || ? || ? || ?
|-
| Loco Roco 2 PSP DEMO - NPJG00011 (JP) Kiosk Demo || ? || ? || ?
|-
| Patapon 2 PSP - UCUS98732 (USA) || ? || ? || ?
|-
| Castlevania Requiem || ? || ? || ?
|-
| Patapon 2 || ? || ? || ?
|-
| PaRappa the Rapper Demo || An unofficial emulator developed by Sony with very bad compatibility || ? || ?
|-
| PaRappa the Rapper || An unofficial emulator developed by Sony with very bad compatibility || ? || ?
|-
| Syphon Filter: Dark Mirror || ? || ? || ?
|}
 
== Memory mapping ==
 
<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 = {}
*axInsnReplace (mem, org opcode, new opcode) - Replace allegrex memory
*axFuncReplace - Replace allegrex function. Known implemented functions are: I3dVecSet, I3dRender__ReserveTrashQwc, I3dVecAdd, I3dVecScaleXYZ, I3dGuSetMatrix_PSP, patapon_memcpy


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)
====hooks/registers====
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
Hooks, and registers that can be called in lua api.


</pre>
Allegrex (usage - remove AX_):


= config-emu-ps4.txt =
*AX_GetPC
*AX_SetPC
*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


Example from Loco Roco 2 Kiosk Demo:
Emulator (usage - remove EM_):  
<pre>
; Windows configuration file for PSPHD


; Game Image
*EM_SetTextureHashMode
--image="data/USER_L0.IMG"
*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


; Redirect host0: to a another directory (uncomment to enable).
====Standard: ====
; By default it's mapped to the working directory where the executable starts
;--host="D:\Sony\PSPHD"


; To dump the original video in PMF format, uncomment the --dumpvideos line
*patches/
; For example, with the current setting, it will save them in a "D:\Sony\PSPHD\videos" directory (make sure the directory exists)
*_patches.lua
;--dumpvideos="host0:videos"
*feature_data/
 
*_features.lua
; To dump the original audio in Atrac3 format, uncomment the --dumpaudio line
*tooling/
; For example, with the current setting, it will save them in a "D:\Sony\PSPHD\audio" directory (make sure the directory exists)
*_tooling.lua
;--dumpaudio="host0:audio"
*trophy_data/
 
*_trophies.lua
; 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 "D:\Sony\PSPHD\texdump" directory (make sure the directory exists)
;--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 "D:\Sony\PSPHD\texreplace" directory
; If the --scale setting is set to 4 or 8, the program will also look for replacement textures on '4x' or '8x' directories within this 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
 
; This enables bilinear filtering on replaced textures. (uncomment to enable)
--replacementfilter=true


; Antialiasing mode. SSAA4x looks best, MSAA4x only smooths edges.
==Information==
; Choices: off, SSAA4x, MSAA4x
====other====
--antialias=SSAA4x


; Enable switching between original and replacement textures at runtime using the L3 button on a DS4 or the 'T' key on Windows
*XXXXYYYYY_config.txt
;--texswitch=true
*--vms
 
*--autoresampler [true]
; Turns on the auto-resampler. Assumes textures in texreplace are at 8x resolution and resamples them at load
--autoresampler=true
 
; Turns on filtering of CLUT hashes to avoid repeat indexed textures
--texclutmode=filter
 
; Enable Multiple Savegames
--multisaves=true
 
; Custom locoroco2 texture hasher
--texcachemode="locoroco2"
 
; X/O button mode. "oenter" sets Circle as enter, "xenter" sets Cross as enter. If not present/enabled, it's selected by the system language (Asian
; languages default to oenter, everything else "xenter"). Notice this only works when the game queries the PSP OS for the button configuration.
--xobuttonmode="oenter"
 
; Use vector fonts for the system fonts
--fontreplace="host0:pspfonts"
 
; Enable encrypted savegames
--securesaves=true
 
; Adjust overall volume level (does not include pad speaker volume). Range from 0.0 (min) to 1.0 (max)
--volume="0.50"


; Use 5 cores to load textures at boot
*videos/
--texloadcores=4
*.mp4
*videos/%08x.mp4
*audio/%08x.ogg
*--texswitch [original, replacement]


; LocoRoco mesh tesselation mode
Paths:
--locorocomeshsmoothnonindexed=true


; Set age restriction
*/app0/
--agerestrict=0
*/download0/
*/savedata
*/host/
*/hostapp/
*/data/


--notrophies=true
====sample====
</pre>


Example from PaRappa the Rapper:
<pre>; PS4 configuration file for PSPHD
<pre>
; PS4 configuration file for PSPHD
   
   
; Game Image
; Game Image
Line 1,732: Line 1,009:
; 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,745: Line 1,025:
; Parappa Alpha Hack
; Parappa Alpha Hack
--parappaalphahack=true
--parappaalphahack=true
</pre>
 
; Adjust overall volume level (does not include pad speaker volume). Range from 0.0 (min) to 1.0 (max)
= Information =
--volume="0.25"
 
   
Note: Missing entries
; 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!!!!!
 
   
==Folder/File layout==
; If you're reading this message, congratulations! you win !!!
 
; we love you so much. you’ve made hacking great again.</pre>
<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 or config-emu-ps4.txt
</pre>
 
= Other files =


<pre>
===NIDs in HLE===
XXXXYYYYY_config.txt
videos/
.mp4
videos/%08x.mp4
audio/%08x.ogg
</pre>


= Paths =
=====HLEInterruptManager=====


<pre>
*sceKernelRegisterSubIntrHandler
/app0/
*sceKernelReleaseSubIntrHandler
/download0/
*sceKernelEnableSubIntr
/savedata
/host/
/hostapp/
/data/
</pre>


== NIDs in HLE ==
=====HLEStdioForUser=====


See also [https://www.psdevwiki.com/ps3/PSP_Emulation#4.46_PS3_PSP_HLE_NIDs 4.46 PS3 PSP HLE NIDs].
*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


<pre>
=====HLELoadExecForUser=====
|HLEInterruptManager|


sceKernelRegisterSubIntrHandler
*sceKernelCpuSuspendIntr
sceKernelReleaseSubIntrHandler
*sceKernelCpuResumeIntr
sceKernelEnableSubIntr
*sceKernelIsCpuIntrEnable
*sceKernelExitGame
*sceKernelRegisterExitCallback
*sceKernelLoadModule
*sceKernelUnloadModule
*sceKernelStartModule
*sceKernelStopModule
*sceKernelStopUnloadSelfModule
*sceKernelGetModuleIdByAddress
*sceKernelStopUnloadSelfModuleWithStatus
*sceKernelGetModuleId


|HLEStdioForUser|
=====HLEsceAtrac3plus=====


sceIoOpen
*sceAtracReinit
sceIoClose
*sceAtracDecodeData
sceIoRead
*sceAtracGetNextDecodePosition
sceIoWrite
*sceAtracSetHalfwayBufferAndGetID
sceIoLseek
*sceAtracGetSoundSample
sceIoLseek32
*sceAtracGetStreamDataInfo
sceIoDopen
*sceAtracGetRemainFrame
sceIoDread
*sceAtracSetLoopNum
sceIoDclose
*sceAtracResetPlayPosition
sceIoChdir
*sceAtracReleaseAtracID
sceIoGetstat
*sceAtracGetAtracID
sceIoDevctl
*sceAtracGetNextSample
sceIoRename
*sceAtracSetData
sceIoMkDir
*sceAtracAddStreamData
sceIoChstat
sceIoRemove
sceIoRmdir
sceIoOpenAsync
sceIoReadAsync
sceIoIoctlAsync
sceIoWaitAsync
sceIoWaitAsyncCB
sceIoCloseAsync
sceIoSetAsyncCallback
sceIoPollAsync
sceIoLseekAsync
sceIoGetAsyncStat
asyncWaitTimerCallback
asyncCallbackTimerCallback
sceKernelStdin
sceKernelStdout
sceKernelStderr


|HLELoadExecForUser|
=====HLEsceAudio=====


sceKernelCpuSuspendIntr
*sceAudioChReserve
sceKernelCpuResumeIntr
*sceAudioChRelease
sceKernelIsCpuIntrEnable
*sceAudioOutputBlocking
sceKernelExitGame
*sceAudioChangeChannelConfig
sceKernelRegisterExitCallback
*sceAudioGetChannelRestLength
sceKernelLoadModule
*sceAudioChangeChannelVolume
sceKernelUnloadModule
*sceAudioSetChannelDataLen
sceKernelStartModule
*sceAudioOutputPanned
sceKernelStopModule
*sceAudioOutputPannedBlocking
sceKernelStopUnloadSelfModule
*sceAudioGetChannelRestLen
sceKernelGetModuleIdByAddress
*sceAudioOutput2Reserve
sceKernelStopUnloadSelfModuleWithStatus
*sceAudioOutput2OutputBlocking
sceKernelGetModuleId
*sceAudioOutput2Release
*outputCallback


|HLEsceAtrac3plus|
=====HLEsceCtrl=====


sceAtracReinit
*sceCtrlSetSamplingCycle
sceAtracDecodeData
*sceCtrlSetSamplingMode
sceAtracGetNextDecodePosition
*sceCtrlReadBufferPositive
sceAtracSetHalfwayBufferAndGetID
*sceCtrlReadBufferNegative
sceAtracGetSoundSample
*sceCtrlPeekBufferPositive
sceAtracGetStreamDataInfo
*sceCtrlPeekBufferNegative
sceAtracGetRemainFrame
*sceCtrlGetIdleCancelThreshold
sceAtracSetLoopNum
*sceCtrlSetIdleCancelThreshold
sceAtracResetPlayPosition
*sceCtrlReadLatch
sceAtracReleaseAtracID
*sceCtrlPeekLatch
sceAtracGetAtracID
*sampleControllerCallback
sceAtracGetNextSample
*vibrationControllerCallback
sceAtracSetData
sceAtracAddStreamData


|HLEsceAudio|
=====HLEsceDisplay=====


sceAudioChReserve
*sceDisplaySetMode
sceAudioChRelease
*sceDisplaySetFramebuf
sceAudioOutputBlocking
*sceDisplayGetFramebuf
sceAudioChangeChannelConfig
*sceDisplayGetVcount
sceAudioGetChannelRestLength
*sceDisplayWaitVblankStart
sceAudioChangeChannelVolume
*sceDisplayWaitVblankStartCB
sceAudioSetChannelDataLen
*sceDisplayGetCurrentHcount
sceAudioOutputPanned
*sceDisplayGetAccumulatedHcount
sceAudioOutputPannedBlocking
*sceDisplayGetFramePerSec
sceAudioGetChannelRestLen
*sceDisplayWaitVblank
sceAudioOutput2Reserve
*sceDisplayWaitVblankCB
sceAudioOutput2OutputBlocking
*sceDisplayIsVblank
sceAudioOutput2Release
*sceDisplaySetHoldMode
outputCallback
*vblankStart
*vblankEnd


|HLEsceCtrl|
=====HLEsceGe_user=====


sceCtrlSetSamplingCycle
*sceGeEdramGetAddr
sceCtrlSetSamplingMode
*sceGeEdramGetSize
sceCtrlReadBufferPositive
*sceGeGetCmd
sceCtrlReadBufferNegative
*sceGeGetMtx
sceCtrlPeekBufferPositive
*sceGeListEnQueue
sceCtrlPeekBufferNegative
*sceGeListEnQueueHead
sceCtrlGetIdleCancelThreshold
*sceGeListDeQueue
sceCtrlSetIdleCancelThreshold
*sceGeListSync
sceCtrlReadLatch
*sceGeListUpdateStallAddr
sceCtrlPeekLatch
*sceGeDrawSync
sampleControllerCallback
*sceGeSetCallback
vibrationControllerCallback
*sceGeUnsetCallback
*sceGeBreak
*sceGeContinue
*interruptCallback


|HLEsceDisplay|
=====HLEsceImpose=====


sceDisplaySetMode
*sceImposeGetLanguageMode
sceDisplaySetFramebuf
*sceImposeSetLanguageMode
sceDisplayGetFramebuf
*sceImposeSetUMDPopup
sceDisplayGetVcount
sceDisplayWaitVblankStart
sceDisplayWaitVblankStartCB
sceDisplayGetCurrentHcount
sceDisplayGetAccumulatedHcount
sceDisplayGetFramePerSec
sceDisplayWaitVblank
sceDisplayWaitVblankCB
sceDisplayIsVblank
sceDisplaySetHoldMode
vblankStart
vblankEnd


|HLEsceGe_user|
=====HLEsceMpeg=====


sceGeEdramGetAddr
*sceMpegInit
sceGeEdramGetSize
*sceMpegFinish
sceGeGetCmd
*sceMpegCreate
sceGeGetMtx
*sceMpegDelete
sceGeListEnQueue
*sceMpegQueryMemSize
sceGeListEnQueueHead
*sceMpegMallocAvcEsBuf
sceGeListDeQueue
*sceMpegFreeAvcEsBuf
sceGeListSync
*sceMpegInitAu
sceGeListUpdateStallAddr
*sceMpegGetAvcAu
sceGeDrawSync
*sceMpegGetAtracAu
sceGeSetCallback
*sceMpegQueryAtracEsSize
sceGeUnsetCallback
*sceMpegAtracDecode
sceGeBreak
*sceMpegRingbufferQueryMemSize
sceGeContinue
*sceMpegRingbufferConstruct
interruptCallback
*sceMpegRingbufferDestruct
*sceMpegRingbufferPut
*sceMpegRingbufferAvailableSize
*sceMpegAvcCsc
*sceMpegAvcDecodeMode
*sceMpegAvcDecodeDetail
*sceMpegAvcDecodeFlush
*sceMpegAvcQueryYCbCrSize
*sceMpegAvcInitYCbCr
*sceMpegAvcDecodeYCbCr
*sceMpegAvcDecodeStopYCbCr
*sceMpegRegistStream
*sceMpegUnRegistStream
*sceMpegQueryStreamSize
*sceMpegQueryStreamOffset
*sceMpegFlushAllStream


|HLEsceImpose|
=====HLEsceNet=====


sceImposeGetLanguageMode
*sceNetInit
sceImposeSetLanguageMode
*sceNetInetGetsockopt
sceImposeSetUMDPopup
*sceNetInetSetsockopt
*sceNetInetGetErrno


|HLEsceMpeg|
=====HLEscePower=====


sceMpegInit
*scePowerRegisterCallback
sceMpegFinish
*scePowerUnregisterCallback
sceMpegCreate
*scePowerSetClockFrequency
sceMpegDelete
*scePowerSetCpuClockFrequency
sceMpegQueryMemSize
*scePowerSetBusClockFrequency
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|
=====HLEscePsmf=====


sceNetInit
*scePsmfVerifyPsmf
sceNetInetGetsockopt
*scePsmfSetPsmf
sceNetInetSetsockopt
*scePsmfSpecifyStreamWithStreamTypeNumber
sceNetInetGetErrno
*scePsmfCheckEPmap
*scePsmfGetVideoInfo
*scePsmfGetNumberOfStreams
*scePsmfGetNumberOfEPentries
*scePsmfGetEPWithId
*scePsmfGetPsmfVersion
*scePsmfGetNumberOfSpecificStreams
*scePsmfSpecifyStream
*scePsmfGetCurrentStreamType


|HLEscePower|
=====HLEscePsmfPlayer=====


scePowerRegisterCallback
*scePsmfPlayerCreate
scePowerUnregisterCallback
*scePsmfPlayerDelete
scePowerSetClockFrequency
*scePsmfPlayerSetPsmf
scePowerSetCpuClockFrequency
*scePsmfPlayerReleasePsmf
scePowerSetBusClockFrequency
*scePsmfPlayerStart
*scePsmfPlayerGetAudioOutSize
*scePsmfPlayerStop
*scePsmfPlayerUpdate
*scePsmfPlayerGetVideoData
*scePsmfPlayerGetAudioData
*scePsmfPlayerGetCurrentStatus
*scePsmfPlayerGetPsmfInfo
*scePsmfPlayerConfigPlayer
*scePsmfPlayerBreak
*scePsmfPlayerChangePlayMode


|HLEscePsmf|
=====HLEsceRtc=====


scePsmfVerifyPsmf
*sceRtcGetCurrentTick
scePsmfSetPsmf
*sceRtcGetAccumulativeTime
scePsmfSpecifyStreamWithStreamTypeNumber
*sceRtcGetCurrentClockLocalTime
scePsmfCheckEPmap
scePsmfGetVideoInfo
scePsmfGetNumberOfStreams
scePsmfGetNumberOfEPentries
scePsmfGetEPWithId
scePsmfGetPsmfVersion
scePsmfGetNumberOfSpecificStreams
scePsmfSpecifyStream
scePsmfGetCurrentStreamType


|HLEscePsmfPlayer|
=====HLEsceSasCore=====


scePsmfPlayerCreate
*sceSasInit
scePsmfPlayerDelete
*sceSasCore
scePsmfPlayerSetPsmf
*sceSasCoreWithMix
scePsmfPlayerReleasePsmf
*sceSasGetEndFlag
scePsmfPlayerStart
*sceSasGetPauseFlag
scePsmfPlayerGetAudioOutSize
*sceSasGetEnvelopeHeight
scePsmfPlayerStop
*sceSasGetAllEnvelopeHeights
scePsmfPlayerUpdate
*sceSasGetOutputMode
scePsmfPlayerGetVideoData
*sceSasSetOutputMode
scePsmfPlayerGetAudioData
*sceSasGetGrain
scePsmfPlayerGetCurrentStatus
*sceSasSetGrain
scePsmfPlayerGetPsmfInfo
*sceSasSetVoice
scePsmfPlayerConfigPlayer
*sceSasSetNoise
scePsmfPlayerBreak
*sceSasSetPitch
scePsmfPlayerChangePlayMode
*sceSasSetVolume
*sceSasSetSimpleADSR
*sceSasSetKeyOn
*sceSasSetKeyOff
*sceSasSetPause
*sceSasSetSL
*sceSasSetADSR
*sceSasSetADSRMode
*sceSasRevEVOL
*sceSasRevType
*sceSasRevParam
*sceSasRevVON


|HLEsceRtc|
=====HLEsceSuspendForUser=====


sceRtcGetCurrentTick
*sceKernelPowerTick
sceRtcGetAccumulativeTime
*sceKernelPowerLock
sceRtcGetCurrentClockLocalTime
*sceKernelPowerUnlock
*sceKernelVolatileMemTryLock
*sceKernelVolatileMemUnlock
*sceKernelVolatileMemLock


|HLEsceSasCore|
=====HLEsceUmdUser=====


sceSasInit
*sceUmdActivate
sceSasCore
*sceUmdGetDriveStat
sceSasCoreWithMix
*sceUmdCheckMedium
sceSasGetEndFlag
*sceUmdRegisterUMDCallback
sceSasGetPauseFlag
*sceUmdUnRegisterUMDCallBack
sceSasGetEnvelopeHeight
*sceUmdWaitDriveStat
sceSasGetAllEnvelopeHeights
*sceUmdWaitDriveStatWithTimer
sceSasGetOutputMode
*sceUmdWaitDriveStatCB
sceSasSetOutputMode
*sceUmdCancelWaitDriveStat
sceSasGetGrain
*_UmdWaitDriveTimeout
sceSasSetGrain
sceSasSetVoice
sceSasSetNoise
sceSasSetPitch
sceSasSetVolume
sceSasSetSimpleADSR
sceSasSetKeyOn
sceSasSetKeyOff
sceSasSetPause
sceSasSetSL
sceSasSetADSR
sceSasSetADSRMode
sceSasRevEVOL
sceSasRevType
sceSasRevParam
sceSasRevVON


|HLEsceSuspendForUser|
=====HLEsceUtility=====


sceKernelPowerTick
*sceUtilityLoadModule
sceKernelPowerLock
*sceUtilityUnloadModule
sceKernelPowerUnlock
*sceUtilityLoadNetModule
sceKernelVolatileMemTryLock
*sceUtilityUnloadNetModule
sceKernelVolatileMemUnlock
*sceUtilityLoadAvModule
sceKernelVolatileMemLock
*sceUtilityUnloadAvModule
*sceUtilityGetSystemParamInt
*sceUtilityGetSystemParamString
*sceUtilitySavedataGetStatus
*sceUtilitySavedataShutdownStart
*sceUtilitySavedataInitStart
*sceUtilitySavedataUpdate
*sceUtilityMsgDialogGetStatus
*sceUtilityMsgDialogShutdownStart
*sceUtilityMsgDialogInitStart
*sceUtilityMsgDialogUpdate
*sceUtilityMsgDialogAbort
*sceUtilityOskGetStatus
*sceUtilityOskShutdownStart
*sceUtilityOskInitStart
*sceUtilityOskUpdate
*saveDataUpdateCallback
*oskUpdateCallback


|HLEsceUmdUser|
=====HLEsceWlanDrv=====


sceUmdActivate
*sceWlanGetSwitchState
sceUmdGetDriveStat
*sceWlanGetEtherAddr
sceUmdCheckMedium
sceUmdRegisterUMDCallback
sceUmdUnRegisterUMDCallBack
sceUmdWaitDriveStat
sceUmdWaitDriveStatWithTimer
sceUmdWaitDriveStatCB
sceUmdCancelWaitDriveStat
_UmdWaitDriveTimeout


|HLEsceUtility|
=====HLESysMemUserForUser=====


sceUtilityLoadModule
*sceKernelMaxFreeMemSize
sceUtilityUnloadModule
*sceKernelTotalFreeMemSize
sceUtilityLoadNetModule
*sceKernelQueryMemoryInfo
sceUtilityUnloadNetModule
*sceKernelDevkitVersion
sceUtilityLoadAvModule
*sceKernelPrintf
sceUtilityUnloadAvModule
*sceKernelGetPTRIG
sceUtilityGetSystemParamInt
*sceKernelSetPTRIG
sceUtilityGetSystemParamString
*sceKernelAllocPartitionMemory
sceUtilitySavedataGetStatus
*sceKernelFreePartitionMemory
sceUtilitySavedataShutdownStart
*sceKernelGetBlockHeadAddr
sceUtilitySavedataInitStart
*sceKernelGetMemoryBlockAddr
sceUtilitySavedataUpdate
*sceKernelAllocMemoryBlock
sceUtilityMsgDialogGetStatus
*sceKernelFreeMemoryBlock
sceUtilityMsgDialogShutdownStart
*sceKernelSetCompilerVersion
sceUtilityMsgDialogInitStart
*sceKernelGetCompiledSdkVersion
sceUtilityMsgDialogUpdate
*sceKernelSetCompiledSdkVersion
sceUtilityMsgDialogAbort
*sceKernelSetCompiledSdkVersion370
sceUtilityOskGetStatus
*sceKernelSetCompiledSdkVersion380_390
sceUtilityOskShutdownStart
*sceKernelSetCompiledSdkVersion395
sceUtilityOskInitStart
*sceKernelSetCompiledSdkVersion401_402
sceUtilityOskUpdate
*sceKernelSetCompiledSdkVersion500_505
saveDataUpdateCallback
*sceKernelSetCompiledSdkVersion507
oskUpdateCallback
*sceKernelSetCompiledSdkVersion600_602
*sceKernelSetCompiledSdkVersion603_605
*sceKernelSetCompiledSdkVersion606
*sceKernelSetUsersystemLibWork
*sceKernelSysMemUserForUser_ACBD88CA
*sceKernelSysMemUserForUser_D8DE5C1E
*sceKernelSysMemUserForUser_945E45DA


|HLEsceWlanDrv|
=====HLEThreadManForUser=====


sceWlanGetSwitchState
*sceKernelDelayThread
sceWlanGetEtherAddr
*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


|HLESysMemUserForUser|
=====HLEUtilsForKernel=====


sceKernelMaxFreeMemSize
*sceKernelIcacheInvalidateRange
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|
=====HLEUtilsForUser=====


sceKernelDelayThread
*sceKernelIcacheInvalidateRange
sceKernelDelayThreadCB
*sceKernelDcacheInvalidateRange
sceKernelCreateCallback
*sceKernelDcacheWritebackInvalidateRange
sceKernelDeleteCallback
*sceKernelDcacheWritebackAll
sceKernelSleepThread
*sceKernelDcacheWritebackRange
sceKernelSleepThreadCB
*sceKernelDcacheWritebackInvalidateAll
sceKernelWakeupThread
*sceKernelSetGPO
sceKernelCreateMsgPipe
*sceKernelGetGPI
sceKernelDeleteMsgPipe
*sceKernelLibcClock
sceKernelSendMsgPipe
*sceKernelLibcTime
sceKernelTrySendMsgPipe
*sceKernelLibcGettimeofday 0x71EC4271
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|
===Unimplemented functions===


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


|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 unimplemented
sceKernelQueryMemoryInfo() unimplemented
sceKernelGetPTRIG() unimplemented
sceKernelSetPTRIG() unimplemented
sceKernelSetCompiledSdkVersion401_402() unimplemented
sceKernelSetCompiledSdkVersion507() unimplemented
sceKernelSetCompiledSdkVersion600_602() unimplemented
sceKernelSetCompiledSdkVersion603_605() unimplemented
sceKernelSetUsersystemLibWork() unimplemented
sceKernelSysMemUserForUser_ACBD88CA() unimplemented
sceKernelSysMemUserForUser_D8DE5C1E() unimplemented -- sceKernelSafetyCheck0
sceKernelSysMemUserForUser_945E45DA() unimplemented
sceKernelTerminateDeleteThread() unimplemented
sceKernelCancelSema unimplemented
sceKernelCancelFpl unimplemented
sceKernelReferFplStatus unimplemented
sceKernelCancelVpl unimplemented
sceKernelCreateMbx unimplemented
sceKernelDeleteMbx unimplemented
sceKernelSendMbx unimplemented
sceKernelReceiveMbx unimplemented
sceKernelReceiveMbxCB unimplemented
sceKernelPollMbx unimplemented
sceKernelCancelReceiveMbx unimplemented
sceKernelReferMbxStatus unimplemented
</pre>


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


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


|sceIoDevctl|
'''sceIoDevctl'''


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


===Links===
===Restricted===
* https://forums.ppsspp.org/showthread.php?tid=1473
*scePowerRegisterCallback - ignoring
* https://forums.ppsspp.org/showthread.php?tid=11961
*scePowerUnregisterCallback - ignoring
* https://github.com/LunaMoo/PPSSPP_workarounds/blob/master/cheat.db
*scePowerSetClockFrequency - ignoring
* https://www.psdevwiki.com/ps4/PSP_Classics_Configuration_Files_(Official)
*scePowerSetCpuClockFrequency(%d) - ignoring
* https://www.psdevwiki.com/ps4/PSP_Classics_Configuration_Files_(Unofficial)
*scePowerSetBusClockFrequency(%d) - ignoring
* https://www.psdevwiki.com/ps4/PSP_Emulator_Compatibility_List
*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)