Editing PSP Emulation
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
=='''PSPHD'''== | =='''PSPHD'''== | ||
== Commands == | == Commands == | ||
=== config-emu-ps4.txt commands === | |||
{| 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 | ||
|- | |- | ||
| -- | | --boot || || [disc0:/PSP_GAME/SYSDIR/BOOT.BIN - path (no loaders support like on PS3? vide ct2, psc)] || | ||
|- | |- | ||
| -- | | --notrophies || || || | ||
|- | |- | ||
| -- | | --volume || || ? (Adjusting volume level to %d%%) || | ||
|- | |- | ||
| -- | | --image || umd0 ,disc0 || || | ||
|- | |- | ||
| --addon || || || | | --addon || || || | ||
|- | |- | ||
| --host || | | --host || host0, flash0 || || | ||
|- | |- | ||
| -- | | --texsave || || || | ||
|- | |- | ||
| -- | | --texmissingsave || || || | ||
|- | |- | ||
| -- | | --samplesave || || || | ||
|- | |- | ||
| -- | | --vramcopyback || 45, Value ? || || --vramcopyback=45 | ||
|- | |- | ||
| -- | | --replacementfilter || || || | ||
|- | |- | ||
| -- | | --texreplace || || || | ||
|- | |- | ||
| -- | | --samplereplace || || || | ||
|- | |- | ||
| -- | | --spu2Trace || true || || --spu2Trace=true | ||
|- | |- | ||
| -- | | --spu2-c1-memin-to-bgm || true || || --spu2-c1-memin-to-bgm=true | ||
|- | |- | ||
| -- | | --replacementalpha || true || || --replacementalpha=true | ||
|- | |- | ||
| -- | | --parappaalphahack || true || || --parappaalphahack=true | ||
|- | |- | ||
| -- | | --locorocomeshsmooth || true || || --locorocomeshsmooth=true | ||
|- | |- | ||
| -- | | --locorocomeshsmoothnonindexed || true || ||--locorocomeshsmoothnonindexed=true | ||
|- | |- | ||
| -- | | --gputhread || true || || | ||
|- | |- | ||
| -- | | --antialias || off, MSAA4x, SSAA4x|| || | ||
|- | |- | ||
| -- | | --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || || --texcachemode=patchworkheroes | ||
|- | |- | ||
| -- | | --texclutmode || filter, full || || --texclutmode=full | ||
|- | |- | ||
| -- | | --texloadmode || launch, ondemand_lz4 || || | ||
|- | |- | ||
| -- | | --depthscalehack || true || ||--depthscalehack=true | ||
|- | |- | ||
| -- | | --forcenobilinear || true || ||--forcenobilinear=true | ||
|- | |- | ||
| -- | | --texloadcores || 2, 12? || || texloadcores=2 | ||
|- | |- | ||
| -- | | --smoothlevel || 0, 12? || ||--smoothlevel=0 | ||
|- | |- | ||
| -- | | --parappajapanesefonthack || true? || Enables Support For Japanese Fonts ??|| | ||
|- | |- | ||
| -- | | --parappareplacecolor || %08x || (rgb?) || | ||
|} | |} | ||
==== | |||
==== 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 | ||
|- | |- | ||
| -- | | --antialias || off || Turning Anti-Alias Off Improves Performance||--antialias=off | ||
|- | |- | ||
| -- | | --texclutmode || filter, full || Turns on filtering of CLUT hashes to avoid repeat indexed textures ||--texclutmode=full | ||
|- | |- | ||
| -- | | --texloadcores || 2, 12?|| Cores to use loading textures (higher count = more memory) ||--texloadcores=12 | ||
|- | |- | ||
| -- | | --smoothlevel || 0,12 ?|| ||--smoothlevel=0 | ||
|- | |- | ||
| -- | | --texcachemode || patchworkheroes drawbounds, drawboundsloco, patchworkheroes, locoroco2, rondo || ||--texcachemode=patchworkheroes | ||
|- | |- | ||
| -- | | --present || vblankstart, setframebuf, drawsync|| ||--present=setframebuf | ||
|- | |- | ||
| -- | | --texrecent || true || Optimize texture hashes ||--texrecent=true | ||
| | |||
| | |||
|- | |- | ||
| --umddelay || true || ||--umddelay=true | |||
|} | |} | ||
==== | ===LUA=== | ||
====Examples==== | |||
=====Features.lua===== | |||
<pre> | |||
-- Lua 5.3 | |||
-- Title: Patapon 2 PSP - UCUS-98732 (USA) | |||
-- Author: Adam McInnis | |||
-- Changelog: | |||
apiRequest(1.0) -- request version 1.0 API. Calling apiRequest() is mandatory. | |||
local gpr = require( "ax-gpr-alias" ) -- you can access Allegrex GPR by alias (gpr.a0 / gpr["a0"]) | |||
local emuObj = getEmuObject() -- emulator | |||
local axObj = getAXObject() -- allegrex | |||
local pad = require("pad") | |||
local trophyObj = getTrophyObject() | |||
-- INIT -- | |||
local GLOBAL = 0x8B7D088 | |||
local APPLICATION = 0x8B4C8D4 | |||
local missionID = 0 | |||
local missionRunning = false | |||
local colonyMode = 0 | |||
-- GAME FUNCTIONS -- | |||
local getApplication = function() -- getApplication | |||
local app = axObj.ReadMem32(APPLICATION) --> 0x8c99f60 | |||
if app == 0 then | |||
return 0 | |||
end | |||
return axObj.ReadMem32(app) --> 0x8b8c740 | |||
end | |||
--- Scenes | |||
== | local getSceneBase = function() -- from Application::initialize | ||
local app = getApplication() | |||
if app == 0 then | |||
return 0 | |||
end | |||
return axObj.ReadMem32(app + 0xCB24) -- -0x34DC($v1) | |||
end | |||
local getNextSceneID = function() -- from System::SceneBase::setNextSceneId | |||
local base = getSceneBase() | |||
if base == 0 then | |||
return 0 | |||
end | |||
return axObj.ReadMem32(base + 8) | |||
end | |||
local getBasesScene = function() | |||
local scene = getSceneBase() | |||
if scene == 0 then | |||
return 0 | |||
end | |||
return axObj.ReadMem32(scene + 0xC) | |||
end | |||
==== | local getMissionScene = function() | ||
local scene = getBasesScene() | |||
if scene == 0 then | |||
return 0 | |||
end | |||
return axObj.ReadMem32(scene + 0xC) | |||
end | |||
local | local getGameScene = function() | ||
local scene = getMissionScene() | |||
axObj. | if scene == 0 then | ||
return 0 | |||
end | |||
return axObj.ReadMem32(scene + 0xC) | |||
end | end | ||
local getSceneID = function(scene) | |||
return axObj.ReadMem32(scene + 0x27354) -- from Labo::Game__Talk__CommandGame__getMissionId | |||
end | |||
local isTitle = function() | |||
== | return getMissionScene() == 0 | ||
end | |||
local isCamp = function() | |||
return isTitle() == false and getGameScene() == 0 | |||
end | |||
local isInMission = function() | |||
if isTitle() == true or isCamp() == true then | |||
return false | |||
end | |||
return getGameScene() ~= 0 | |||
end | |||
--- Game functions --- | |||
-- | local getMissionID = function() -- from Game::Game::initialize | ||
if isCamp() == true then | |||
local scene = getMissionScene() | |||
return getSceneID(scene) | |||
elseif isInMission() == true then | |||
local scene = getGameScene() | |||
return getSceneID(scene) | |||
end | |||
return -1 | |||
end | end | ||
function | function getMissionName() -- from Bases__Talk__CommandCamp__setMissionNameFromVar | ||
local missionName = "" | |||
local index = axObj.ReadMem32(GLOBAL) -- 0x8c9fbc0 | |||
if index == 0 then | |||
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 | ||
--[[ vibrate on objects -- | |||
local | 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 | |||
function | local H1 = function() -- sgxResFindSeq | ||
local | local id = axObj.GetGpr(gpr.a1) | ||
-- the | if playSeq == true then | ||
-- 0.. | 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 | |||
-- OTHER -- | |||
elseif id == 0x65c then | |||
emuObj.PadVibrate(0,200,80) -- fire (patapon yipe) | |||
elseif id == 0x5ac then | |||
emuObj.PadVibrate(0,200,80) -- fire burn(patapon yipe) | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
local H2 = function() -- Labo::Talk::CommandEffect::generateCapEffect | |||
-- | emuObj.PadVibrate(0,255,150) -- When a Patapon unit from the players army is defeated or new special patapon created. | ||
end | |||
local H3 = function() -- Labo::Talk::CommandEffect::killEffect | |||
emuObj.PadVibrate(0,255,250) -- Thunder/Lightning | |||
end | |||
local H4 = function() -- MainGame__Mission__MissionScene__initialize__4LaboFv | |||
missionRunning = true | |||
getMissionName() | |||
end | |||
--- 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> | </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 582: | 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 590: | 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 954: | Line 871: | ||
</pre> | </pre> | ||
== | ====basic==== | ||
*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 | |||
====hooks/registers==== | |||
Hooks, and registers that can be called in lua api. | |||
Allegrex (usage - remove AX_): | |||
*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 | |||
Emulator (usage - remove EM_): | |||
*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 | |||
====Standard: ==== | |||
*patches/ | |||
*_patches.lua | |||
*feature_data/ | |||
*_features.lua | |||
*tooling/ | |||
*_tooling.lua | |||
*trophy_data/ | |||
*_trophies.lua | |||
==Information== | |||
====other==== | |||
*XXXXYYYYY_config.txt | |||
*--vms | |||
*--autoresampler [true] | |||
*videos/ | |||
*.mp4 | |||
*videos/%08x.mp4 | |||
videos/ | *audio/%08x.ogg | ||
.mp4 | *--texswitch [original, replacement] | ||
videos/%08x.mp4 | |||
audio/%08x.ogg | |||
Paths: | Paths: | ||
/app0/ | */app0/ | ||
/download0/ | */download0/ | ||
/savedata | */savedata | ||
/host/ | */host/ | ||
/hostapp/ | */hostapp/ | ||
/data/ | */data/ | ||
== | ====sample==== | ||
<pre>; PS4 configuration file for PSPHD | <pre>; PS4 configuration file for PSPHD | ||
Line 1,653: | 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,666: | Line 1,025: | ||
; 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) | ||
--volume="0.25" | |||
; 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> | |||
===NIDs in HLE=== | |||
=====HLEInterruptManager===== | |||
*sceKernelRegisterSubIntrHandler | |||
*sceKernelReleaseSubIntrHandler | |||
*sceKernelEnableSubIntr | |||
=====HLEStdioForUser===== | |||
*sceIoOpen | |||
*sceIoClose | |||
*sceIoRead | |||
*sceIoWrite | |||
*sceIoLseek | |||
*sceIoLseek32 | |||
*sceIoDopen | |||
*sceIoDread | |||
*sceIoDclose | |||
*sceIoChdir | |||
*sceIoGetstat | |||
*sceIoDevctl | |||
*sceIoRename | |||
*sceIoMkDir | |||
*sceIoChstat | |||
*sceIoRemove | |||
*sceIoRmdir | |||
*sceIoOpenAsync | |||
*sceIoReadAsync | |||
*sceIoIoctlAsync | |||
*sceIoWaitAsync | |||
*sceIoWaitAsyncCB | |||
*sceIoCloseAsync | |||
*sceIoSetAsyncCallback | |||
*sceIoPollAsync | |||
*sceIoLseekAsync | |||
*sceIoGetAsyncStat | |||
*asyncWaitTimerCallback | |||
*asyncCallbackTimerCallback | |||
*sceKernelStdin | |||
*sceKernelStdout | |||
*sceKernelStderr | |||
=====HLELoadExecForUser===== | |||
*sceKernelCpuSuspendIntr | |||
*sceKernelCpuResumeIntr | |||
*sceKernelIsCpuIntrEnable | |||
*sceKernelExitGame | |||
*sceKernelRegisterExitCallback | |||
*sceKernelLoadModule | |||
*sceKernelUnloadModule | |||
*sceKernelStartModule | |||
*sceKernelStopModule | |||
*sceKernelStopUnloadSelfModule | |||
*sceKernelGetModuleIdByAddress | |||
*sceKernelStopUnloadSelfModuleWithStatus | |||
*sceKernelGetModuleId | |||
=====HLEsceAtrac3plus===== | |||
*sceAtracReinit | |||
*sceAtracDecodeData | |||
*sceAtracGetNextDecodePosition | |||
*sceAtracSetHalfwayBufferAndGetID | |||
*sceAtracGetSoundSample | |||
*sceAtracGetStreamDataInfo | |||
*sceAtracGetRemainFrame | |||
*sceAtracSetLoopNum | |||
*sceAtracResetPlayPosition | |||
*sceAtracReleaseAtracID | |||
*sceAtracGetAtracID | |||
*sceAtracGetNextSample | |||
*sceAtracSetData | |||
*sceAtracAddStreamData | |||
=====HLEsceAudio===== | |||
*sceAudioChReserve | |||
*sceAudioChRelease | |||
*sceAudioOutputBlocking | |||
*sceAudioChangeChannelConfig | |||
*sceAudioGetChannelRestLength | |||
*sceAudioChangeChannelVolume | |||
*sceAudioSetChannelDataLen | |||
*sceAudioOutputPanned | |||
*sceAudioOutputPannedBlocking | |||
*sceAudioGetChannelRestLen | |||
*sceAudioOutput2Reserve | |||
*sceAudioOutput2OutputBlocking | |||
*sceAudioOutput2Release | |||
*outputCallback | |||
=====HLEsceCtrl===== | |||
*sceCtrlSetSamplingCycle | |||
*sceCtrlSetSamplingMode | |||
*sceCtrlReadBufferPositive | |||
*sceCtrlReadBufferNegative | |||
*sceCtrlPeekBufferPositive | |||
*sceCtrlPeekBufferNegative | |||
*sceCtrlGetIdleCancelThreshold | |||
*sceCtrlSetIdleCancelThreshold | |||
*sceCtrlReadLatch | |||
*sceCtrlPeekLatch | |||
*sampleControllerCallback | |||
*vibrationControllerCallback | |||
=====HLEsceDisplay===== | |||
*sceDisplaySetMode | |||
*sceDisplaySetFramebuf | |||
*sceDisplayGetFramebuf | |||
*sceDisplayGetVcount | |||
*sceDisplayWaitVblankStart | |||
*sceDisplayWaitVblankStartCB | |||
*sceDisplayGetCurrentHcount | |||
*sceDisplayGetAccumulatedHcount | |||
*sceDisplayGetFramePerSec | |||
*sceDisplayWaitVblank | |||
*sceDisplayWaitVblankCB | |||
*sceDisplayIsVblank | |||
*sceDisplaySetHoldMode | |||
*vblankStart | |||
*vblankEnd | |||
=====HLEsceGe_user===== | |||
*sceGeEdramGetAddr | |||
*sceGeEdramGetSize | |||
*sceGeGetCmd | |||
*sceGeGetMtx | |||
*sceGeListEnQueue | |||
*sceGeListEnQueueHead | |||
*sceGeListDeQueue | |||
*sceGeListSync | |||
*sceGeListUpdateStallAddr | |||
*sceGeDrawSync | |||
*sceGeSetCallback | |||
*sceGeUnsetCallback | |||
*sceGeBreak | |||
*sceGeContinue | |||
*interruptCallback | |||
=====HLEsceImpose===== | |||
*sceImposeGetLanguageMode | |||
*sceImposeSetLanguageMode | |||
*sceImposeSetUMDPopup | |||
=====HLEsceMpeg===== | |||
*sceMpegInit | |||
*sceMpegFinish | |||
*sceMpegCreate | |||
*sceMpegDelete | |||
*sceMpegQueryMemSize | |||
*sceMpegMallocAvcEsBuf | |||
*sceMpegFreeAvcEsBuf | |||
*sceMpegInitAu | |||
*sceMpegGetAvcAu | |||
*sceMpegGetAtracAu | |||
*sceMpegQueryAtracEsSize | |||
*sceMpegAtracDecode | |||
*sceMpegRingbufferQueryMemSize | |||
*sceMpegRingbufferConstruct | |||
*sceMpegRingbufferDestruct | |||
*sceMpegRingbufferPut | |||
*sceMpegRingbufferAvailableSize | |||
*sceMpegAvcCsc | |||
*sceMpegAvcDecodeMode | |||
*sceMpegAvcDecodeDetail | |||
*sceMpegAvcDecodeFlush | |||
*sceMpegAvcQueryYCbCrSize | |||
*sceMpegAvcInitYCbCr | |||
*sceMpegAvcDecodeYCbCr | |||
*sceMpegAvcDecodeStopYCbCr | |||
*sceMpegRegistStream | |||
*sceMpegUnRegistStream | |||
*sceMpegQueryStreamSize | |||
*sceMpegQueryStreamOffset | |||
*sceMpegFlushAllStream | |||
=====HLEsceNet===== | |||
*sceNetInit | |||
*sceNetInetGetsockopt | |||
*sceNetInetSetsockopt | |||
*sceNetInetGetErrno | |||
=====HLEscePower===== | |||
*scePowerRegisterCallback | |||
*scePowerUnregisterCallback | |||
*scePowerSetClockFrequency | |||
*scePowerSetCpuClockFrequency | |||
*scePowerSetBusClockFrequency | |||
=====HLEscePsmf===== | |||
*scePsmfVerifyPsmf | |||
*scePsmfSetPsmf | |||
*scePsmfSpecifyStreamWithStreamTypeNumber | |||
*scePsmfCheckEPmap | |||
*scePsmfGetVideoInfo | |||
*scePsmfGetNumberOfStreams | |||
*scePsmfGetNumberOfEPentries | |||
*scePsmfGetEPWithId | |||
*scePsmfGetPsmfVersion | |||
*scePsmfGetNumberOfSpecificStreams | |||
*scePsmfSpecifyStream | |||
*scePsmfGetCurrentStreamType | |||
=====HLEscePsmfPlayer===== | |||
*scePsmfPlayerCreate | |||
*scePsmfPlayerDelete | |||
*scePsmfPlayerSetPsmf | |||
*scePsmfPlayerReleasePsmf | |||
*scePsmfPlayerStart | |||
*scePsmfPlayerGetAudioOutSize | |||
*scePsmfPlayerStop | |||
*scePsmfPlayerUpdate | |||
*scePsmfPlayerGetVideoData | |||
*scePsmfPlayerGetAudioData | |||
*scePsmfPlayerGetCurrentStatus | |||
*scePsmfPlayerGetPsmfInfo | |||
*scePsmfPlayerConfigPlayer | |||
*scePsmfPlayerBreak | |||
*scePsmfPlayerChangePlayMode | |||
=====HLEsceRtc===== | |||
*sceRtcGetCurrentTick | |||
*sceRtcGetAccumulativeTime | |||
*sceRtcGetCurrentClockLocalTime | |||
=====HLEsceSasCore===== | |||
*sceSasInit | |||
*sceSasCore | |||
*sceSasCoreWithMix | |||
*sceSasGetEndFlag | |||
*sceSasGetPauseFlag | |||
*sceSasGetEnvelopeHeight | |||
*sceSasGetAllEnvelopeHeights | |||
*sceSasGetOutputMode | |||
*sceSasSetOutputMode | |||
*sceSasGetGrain | |||
*sceSasSetGrain | |||
*sceSasSetVoice | |||
*sceSasSetNoise | |||
*sceSasSetPitch | |||
*sceSasSetVolume | |||
*sceSasSetSimpleADSR | |||
*sceSasSetKeyOn | |||
*sceSasSetKeyOff | |||
*sceSasSetPause | |||
*sceSasSetSL | |||
*sceSasSetADSR | |||
*sceSasSetADSRMode | |||
*sceSasRevEVOL | |||
*sceSasRevType | |||
*sceSasRevParam | |||
*sceSasRevVON | |||
=====HLEsceSuspendForUser===== | |||
*sceKernelPowerTick | |||
*sceKernelPowerLock | |||
*sceKernelPowerUnlock | |||
*sceKernelVolatileMemTryLock | |||
*sceKernelVolatileMemUnlock | |||
*sceKernelVolatileMemLock | |||
=====HLEsceUmdUser===== | |||
*sceUmdActivate | |||
*sceUmdGetDriveStat | |||
*sceUmdCheckMedium | |||
*sceUmdRegisterUMDCallback | |||
*sceUmdUnRegisterUMDCallBack | |||
*sceUmdWaitDriveStat | |||
*sceUmdWaitDriveStatWithTimer | |||
*sceUmdWaitDriveStatCB | |||
*sceUmdCancelWaitDriveStat | |||
*_UmdWaitDriveTimeout | |||
=====HLEsceUtility===== | |||
*sceUtilityLoadModule | |||
*sceUtilityUnloadModule | |||
*sceUtilityLoadNetModule | |||
*sceUtilityUnloadNetModule | |||
*sceUtilityLoadAvModule | |||
*sceUtilityUnloadAvModule | |||
*sceUtilityGetSystemParamInt | |||
*sceUtilityGetSystemParamString | |||
*sceUtilitySavedataGetStatus | |||
*sceUtilitySavedataShutdownStart | |||
*sceUtilitySavedataInitStart | |||
*sceUtilitySavedataUpdate | |||
*sceUtilityMsgDialogGetStatus | |||
*sceUtilityMsgDialogShutdownStart | |||
*sceUtilityMsgDialogInitStart | |||
*sceUtilityMsgDialogUpdate | |||
*sceUtilityMsgDialogAbort | |||
*sceUtilityOskGetStatus | |||
*sceUtilityOskShutdownStart | |||
*sceUtilityOskInitStart | |||
*sceUtilityOskUpdate | |||
*saveDataUpdateCallback | |||
*oskUpdateCallback | |||
=====HLEsceWlanDrv===== | |||
*sceWlanGetSwitchState | |||
*sceWlanGetEtherAddr | |||
=====HLESysMemUserForUser===== | |||
*sceKernelMaxFreeMemSize | |||
*sceKernelTotalFreeMemSize | |||
*sceKernelQueryMemoryInfo | |||
*sceKernelDevkitVersion | |||
*sceKernelPrintf | |||
*sceKernelGetPTRIG | |||
*sceKernelSetPTRIG | |||
*sceKernelAllocPartitionMemory | |||
*sceKernelFreePartitionMemory | |||
*sceKernelGetBlockHeadAddr | |||
*sceKernelGetMemoryBlockAddr | |||
*sceKernelAllocMemoryBlock | |||
*sceKernelFreeMemoryBlock | |||
*sceKernelSetCompilerVersion | |||
*sceKernelGetCompiledSdkVersion | |||
*sceKernelSetCompiledSdkVersion | |||
*sceKernelSetCompiledSdkVersion370 | |||
*sceKernelSetCompiledSdkVersion380_390 | |||
*sceKernelSetCompiledSdkVersion395 | |||
*sceKernelSetCompiledSdkVersion401_402 | |||
*sceKernelSetCompiledSdkVersion500_505 | |||
*sceKernelSetCompiledSdkVersion507 | |||
*sceKernelSetCompiledSdkVersion600_602 | |||
*sceKernelSetCompiledSdkVersion603_605 | |||
*sceKernelSetCompiledSdkVersion606 | |||
*sceKernelSetUsersystemLibWork | |||
*sceKernelSysMemUserForUser_ACBD88CA | |||
*sceKernelSysMemUserForUser_D8DE5C1E | |||
*sceKernelSysMemUserForUser_945E45DA | |||
=====HLEThreadManForUser===== | |||
*sceKernelDelayThread | |||
*sceKernelDelayThreadCB | |||
*sceKernelCreateCallback | |||
*sceKernelDeleteCallback | |||
*sceKernelSleepThread | |||
*sceKernelSleepThreadCB | |||
*sceKernelWakeupThread | |||
*sceKernelCreateMsgPipe | |||
*sceKernelDeleteMsgPipe | |||
*sceKernelSendMsgPipe | |||
*sceKernelTrySendMsgPipe | |||
*sceKernelReceiveMsgPipe | |||
*sceKernelTryReceiveMsgPipe | |||
*sceKernelReferMsgPipeStatus | |||
*sceKernelCreateThread | |||
*sceKernelStartThread | |||
*sceKernelExitThread | |||
*sceKernelDeleteThread | |||
*sceKernelExitDeleteThread | |||
*sceKernelGetThreadExitStatus | |||
*sceKernelTerminateThread | |||
*sceKernelTerminateDeleteThread | |||
*sceKernelWaitThreadEnd | |||
*sceKernelWaitThreadEndCB | |||
*sceKernelRotateThreadReadyQueue | |||
*sceKernelReferThreadStatus | |||
*sceKernelSuspendDispatchThread | |||
*sceKernelResumeDispatchThread | |||
*sceKernelSuspendThread | |||
*sceKernelResumeThread | |||
*sceKernelCancelWakeupThread | |||
*sceKernelGetThreadStackFreeSize | |||
*sceKernelGetSystemTimeLow | |||
*sceKernelGetSystemTime | |||
*sceKernelGetSystemTimeWide | |||
*sceKernelGetThreadCurrentPriority | |||
*sceKernelChangeCurrentThreadAttr | |||
*sceKernelGetThreadId | |||
*sceKernelChangeThreadPriority | |||
*sceKernelReferThreadProfiler | |||
*sceKernelCheckCallback | |||
*sceKernelCancelSema | |||
*sceKernelCreateSema | |||
*sceKernelDeleteSema | |||
*sceKernelPollSema | |||
*sceKernelSignalSema | |||
*sceKernelReferSemaStatus | |||
*sceKernelWaitSema | |||
*sceKernelWaitSemaCB | |||
*sceKernelCreateFpl | |||
*sceKernelDeleteFpl | |||
*sceKernelAllocateFpl | |||
*sceKernelAllocateFplCB | |||
*sceKernelTryAllocateFpl | |||
*sceKernelFreeFpl | |||
*sceKernelCancelFpl | |||
*sceKernelReferFplStatus | |||
*sceKernelCreateVpl | |||
*sceKernelDeleteVpl | |||
*sceKernelAllocateVpl | |||
*sceKernelAllocateVplCB | |||
*sceKernelTryAllocateVpl | |||
*sceKernelFreeVpl | |||
*sceKernelCancelVpl | |||
*sceKernelReferVplStatus | |||
*sceKernelCreateEventFlag | |||
*sceKernelSetEventFlag | |||
*sceKernelDeleteEventFlag | |||
*sceKernelClearEventFlag | |||
*sceKernelWaitEventFlag | |||
*sceKernelWaitEventFlagCB | |||
*sceKernelPollEventFlag | |||
*sceKernelCancelEventFlag | |||
*sceKernelReferEventFlagStatus | |||
*sceKernelCreateMbx | |||
*sceKernelDeleteMbx | |||
*sceKernelSendMbx | |||
*sceKernelReceiveMbx | |||
*sceKernelReceiveMbxCB | |||
*sceKernelPollMbx | |||
*sceKernelCancelReceiveMbx | |||
*sceKernelReferMbxStatus | |||
*sceKernelCreateMutex | |||
*sceKernelDeleteMutex | |||
*sceKernelLockMutex | |||
*sceKernelLockMutexCB | |||
*sceKernelTryLockMutex | |||
*sceKernelUnlockMutex | |||
*sceKernelCancelMutex | |||
*sceKernelReferMutexStatus | |||
*_sceKernelDelayThreadCallback | |||
*_sceKernelWaitThreadEndTimeout | |||
*_sceKernelAllocateFplTimeout | |||
*_sceKernelAllocateVplTimeout | |||
*_sceKernelWaitEventFlagTimeout | |||
*_sceKernelMsgPipeTimeout | |||
*_sceKernelLockMutexTimeout | |||
=====HLEUtilsForKernel===== | |||
*sceKernelIcacheInvalidateRange | |||
=====HLEUtilsForUser===== | |||
sceKernelIcacheInvalidateRange | *sceKernelIcacheInvalidateRange | ||
*sceKernelDcacheInvalidateRange | |||
*sceKernelDcacheWritebackInvalidateRange | |||
*sceKernelDcacheWritebackAll | |||
*sceKernelDcacheWritebackRange | |||
*sceKernelDcacheWritebackInvalidateAll | |||
*sceKernelSetGPO | |||
*sceKernelGetGPI | |||
*sceKernelLibcClock | |||
*sceKernelLibcTime | |||
*sceKernelLibcGettimeofday 0x71EC4271 | |||
===Unimplemented functions=== | |||
*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 | |||
===Partially Supported=== | ===Partially Supported=== | ||
'''sceIoIoctl''' | |||
supported: | supported: | ||
* 0x1010005 (UMD file seek set) | |||
* 0x1020006 (Get UMD file start sector) | |||
'''sceIoDevctl''' | |||
supported: | 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 | |||
==Restricted== | ===Restricted=== | ||
*scePowerRegisterCallback - ignoring | |||
scePowerRegisterCallback - ignoring | *scePowerUnregisterCallback - ignoring | ||
scePowerUnregisterCallback - ignoring | *scePowerSetClockFrequency - ignoring | ||
scePowerSetClockFrequency - ignoring | *scePowerSetCpuClockFrequency(%d) - ignoring | ||
scePowerSetCpuClockFrequency(%d) - ignoring | *scePowerSetBusClockFrequency(%d) - ignoring | ||
scePowerSetBusClockFrequency(%d) - ignoring | *sceUtilityMsgDialogInitStart ignored | ||
sceUtilityMsgDialogInitStart ignored | |||
===More Information:=== | ===More Information:=== | ||
* 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:// | ** 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 |