This is the primary kernel interface to the PSP Emulator.
Module
Known NIDs
Version |
Name |
World |
Privilege |
NID
|
1.69 |
SceCompat |
Non-secure |
Kernel |
0x7FA33B9B
|
3.60-3.65 |
SceCompat |
Non-secure |
Kernel |
0x8F2D0378
|
Libraries
Known NIDs
Types
typedef struct SceCompatSettings { // size is 8 on FW 1.03
SceUInt32 disp_filter : 1;
SceUInt32 camera_direction : 1;
SceUInt32 ra_up : 4;
SceUInt32 ra_down : 4;
SceUInt32 ra_left : 4;
SceUInt32 ra_right : 4;
SceUInt32 reserved : 46;
} SceCompatSettings;
typedef struct SceCompatInitParam { // size is 0x40 on FW 1.03
char unk[0x40];
} SceCompatInitParam;
typedef struct SceCompatAllocCdramWithHoleParam { // size is 8 on FW 3.60
void *pCachedCdramBase;
void *pUncachedCdramBase;
} SceCompatAllocCdramWithHoleParam;
typedef enum SceCompatCacheMode {
SCE_COMPAT_CACHE_MODE_NONE = 0,
SCE_COMPAT_CACHE_MODE_INVALIDATE = 1,
SCE_COMPAT_CACHE_MODE_CLEAN_INVALIDATE = 2
SCE_COMPAT_CACHE_MODE_CLEAN = 3
} SceCompatCacheMode;
typedef struct SceCompatCtrl { // size is 0x10 on FW 3.60
SceUInt32 timestamp;
SceUInt32 buttons;
SceUInt8 Lx;
SceUInt8 Ly;
SceUInt8 Rx;
SceUInt8 Ry;
SceUInt32 reserved;
} SceCompatCtrl;
typedef enum SceCompatPeripheralStateId {
SCE_COMPAT_PERIPHERAL_STATE_IS_HEADPHONE_EXIST = 1,
SCE_COMPAT_PERIPHERAL_STATE_GET_BATTERY_LIFE_PERCENT = 2,
SCE_COMPAT_PERIPHERAL_STATE_GET_BATTERY_LIFE_TIME = 3,
SCE_COMPAT_PERIPHERAL_STATE_IS_SUSPEND_REQUIRED = 4
} SceCompatPeripheralStateId;
SceCompatForDriver
sceCompatSetColorSpaceModeForDriver
Version |
NID
|
0.990 |
not present
|
3.60 |
0x6EBD9E01
|
Name might also be sceCompatSetDisplayConfigForDriver.
// mode can be 0, 1 or 2
int sceCompatSetColorSpaceModeForDriver(SceUInt32 mode);
SceCompatForVsh
sceCompatGetTitleListForVsh
Version |
NID
|
0.990 |
not present
|
3.60 |
0x4915DEE7
|
Reads ur0:emu_list/title_list.bin.
// size must be 100
int sceCompatGetTitleListForVsh(void *pBuf, SceSize size);
sceCompatIsPocketStationTitleForVsh
Version |
NID
|
0.990 |
not present
|
3.60 |
0x70997F92
|
The first 4 characters of the Title Id are letters. The remaining numbers are converted to digital values with strtol,
XORed then compared to SceCompat hardcoded values.
SceBool sceCompatIsPocketStationTitleForVsh(const char *titleId);
sceCompatGetPspSystemSoftwareVersionForVsh
Version |
NID
|
0.990 |
not present
|
3.60 |
0x9C107CC9
|
On emulated PSP FW 6.60, it returns 660. On emulated PSP FW 6.61, it returns 661.
int sceCompatGetPspSystemSoftwareVersionForVsh(void);
SceCompat
sceCompatGetUpdateState
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x0CDE9EC5
|
int sceCompatGetUpdateState(void);
sceCompatGetDevInf
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0x138006A8
|
Calls sceIoDevctlForDriver("ux0", 0x3001, NULL, 0, pInfo, sizeof(SceIoDevInfo));.
int sceCompatGetDevInf(SceIoDevInfo *pInfo);
sceCompatGetPeripheralState
Version |
NID
|
0.990-3.60 |
0x176B2906
|
int sceCompatGetPeripheralState(SceCompatPeripheralStateId stateId);
sceCompatWriteShared32
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0x1CD51530
|
// some_id must be between 0x80 and 0x8A
int sceCompatWriteShared32(SceUInt32 some_id, SceUInt32 value);
sceCompatWriteSharedCtrl
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x2306FFED
|
Write pCtrl to Shared SRAM.
int sceCompatWriteSharedCtrl(SceCompatCtrl *pCtrl);
sceCompatSetSettings
Version |
NID
|
0.990 |
not present
|
1.03-1.69 |
0x312782DC
|
3.60 |
not present
|
int sceCompatSetSettings(SceCompatSettings settings);
sceCompatSuspendResume
Version |
NID
|
0.990 |
not present
|
1.69-3.60 |
0x324112CA
|
// mode: 0: suspend, 1: resume
// step: 1: first step, 2: second step
int sceCompatSuspendResume(SceUInt32 mode, SceUInt32 step);
sceCompatSetDisplayConfig
Version |
NID
|
0.990-1.03 |
not present
|
1.69-3.60 |
0x32BA3DCF
|
// head must be SCE_DISPLAY_HEAD_MAIN_LCD_OLED
// mode can be 0, 1 or 2
int sceCompatSetDisplayConfig(SceDisplayHead head, SceUInt32 mode);
sceCompatRegRead
Version |
NID
|
0.990-1.69 |
0x4521505D
|
3.60 |
not present
|
// unk_id: if unk_id equals 0, offset + size must be less than 0x3a5d,
// else if unk_id equals 1, offset + size must be less than 0x20000
int sceCompatRegRead(SceUInt32 unk_id, SceUInt32 offset, void *pBuf, SceSize size);
sceCompatAvailableColorSpaceSetting
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x456226DD
|
Returns true only if (displayDeviceType & 3) equals 3.
SceBool sceCompatAvailableColorSpaceSetting(void);
sceCompatCache
Version |
NID
|
0.940-3.60 |
0x6777390E
|
int sceCompatCache(SceCompatCacheMode mode, void *base, SceSize size);
sceCompatWaitSpecialRequest
Version |
NID
|
0.940-3.60 |
0x714F7ED6
|
int sceCompatWaitSpecialRequest(SceUInt32 req_id);
sceCompatReadShared32
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0x73AA4871
|
// some_id must be between 0 and 7. 3 seems disabled.
int sceCompatReadShared32(SceUInt32 some_id, SceUInt32 *pValue);
sceCompatGetSettings
Version |
NID
|
0.990 |
not present
|
1.03-1.69 |
0x782C980E
|
3.60 |
not present
|
int sceCompatGetSettings(SceCompatSettings *pSettings);
sceCompatIsPocketStationTitle
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x7DCFBCCE
|
The first 4 characters of the Title Id are letters. The remaining numbers are converted to digital values with strtol,
XORed then compared to SceCompat hardcoded values.
SceBool sceCompatIsPocketStationTitle(const char *titleId);
sceCompatWaitAndGetRequest
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x8176C238
|
int sceCompatWaitAndGetRequest(SceUInt32 req_id, SceUInt32 a2);
sceCompatSetUpdateState
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x8A44206F
|
// unsure if there is an argument
int sceCompatSetUpdateState(void);
sceCompatStart
Version |
NID
|
0.940-3.60 |
0x8CA1632D
|
int sceCompatStart(void);
sceCompatPrepareLoad
Version |
NID
|
0.940 |
not present
|
1.03 |
0x78E469D6
|
3.60 |
not present
|
Loads Pcff (PSP Compat Flash Files) and Pcbc (PSP Compat Boot Code).
int sceCompatPrepareLoad(void);
sceCompatRegWrite
Version |
NID
|
0.990-1.69 |
0x912B1C28
|
3.60 |
not present
|
// unk_id: if unk_id equals 0, offset + size must be less than 0x3a5d,
// else if unk_id equals 1, offset + size must be less than 0x20000
int sceCompatRegWrite(SceUInt32 unk_id, SceUInt32 offset, const void *pBuf, SceSize size);
sceCompatIdStorageLookup
Version |
NID
|
0.940-3.60 |
0x94AAA245
|
int sceCompatIdStorageLookup(SceUInt16 key, SceUInt32 offset, void *pBuf, SceSize size);
sceCompatCheckPocketStation
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0x96FC2A87
|
Checks PocketStation RIF.
int sceCompatCheckPocketStation(void);
sceCompatGetTitleList
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0x99F13E04
|
Reads ur0:emu_list/title_list.bin.
// size must be 100
int sceCompatGetTitleList(void *pBuf, SceSize size);
sceCompatGetCurrentSecureTick
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0xA073EBEE
|
int sceCompatGetCurrentSecureTick(SceRtcTick *pTick);
sceCompatAllocCdram
Version |
NID
|
0.990 |
not present
|
1.69-2.06 |
0x6E8E3BA8
|
3.60 |
not present
|
int sceCompatAllocCdram(void **ppCachedCdramBase, void **ppUncachedCdramBase);
sceCompatAllocCdramWithHole
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0xA5039FFA
|
int sceCompatAllocCdramWithHole(SceCompatAllocCdramWithHoleParam *pCdram);
sceCompatMapDDR
Version |
NID
|
0.990 |
not present
|
1.03 |
0xC6B19D35
|
3.60 |
not present
|
// size must be 0x4000000 (64MB)
int sceCompatMapDDR(SceUID memblock_uid, SceSize size);
sceCompatGetPspSystemSoftwareVersion
Version |
NID
|
0.990-3.60 |
0xB113DCC0
|
On emulated PSP FW 6.60, it returns 660. On emulated PSP FW 6.61, it returns 661.
int sceCompatGetPspSystemSoftwareVersion(void);
sceCompatFrameBufferInit
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0xBC0E2B4C
|
int sceCompatFrameBufferInit(void *base);
sceCompatLCDCSync
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0xBD177787
|
int sceCompatLCDCSync(void);
sceCompatWaitIntr
Version |
NID
|
0.990-1.03 |
not present
|
3.60 |
0xC1E14CF5
|
sceCompatGetRequest
Version |
NID
|
0.990-1.03 |
not present
|
1.69 |
0xCB9F607B
|
3.60 |
not present
|
sceCompatDatRead
Version |
NID
|
0.990-3.60 |
0xCBE73EBE
|
Reads act.dat.
// index must be 0
// offset + size must be lower or equal to 0x1038
int sceCompatDatRead(SceUInt32 index, SceUInt32 offset, void *pBuf, SceSize size);
sceCompatReturnValueEx
Version |
NID
|
0.990 |
not present
|
1.69-3.60 |
0xCC02A9FF
|
sceCompatGetStatus
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0xD2E3370E
|
int sceCompatGetStatus(void);
sceCompatInterrupt
Version |
NID
|
0.940-3.60 |
0xD6AA36DD
|
Set a custom SceCompatMailbox address.
// some_id must be between 0 and 15
int sceCompatInterrupt(SceUInt32 some_id);
sceCompatSetRif
Version |
NID
|
0.990 |
not present
|
1.03-3.60 |
0xD8B69F23
|
// Example of entitlementId: AA0000-AAAA00000_00-0000000000000000
int sceCompatSetRif(const char *entitlementId);
sceCompatGetPrimaryHead
Version |
NID
|
0.990 |
not present
|
1.69-3.60 |
0xDC9EE33A
|
SceDisplayHead sceCompatGetPrimaryHead(void);
sceCompatSetSuspendSema
Version |
NID
|
0.990 |
not present
|
1.69-3.60 |
0xDD30239E
|
int sceCompatSetSuspendSema(SceUID sema_id_0, SceUID sema_id_1);
sceCompatInitEx
Version |
NID
|
0.990-1.03 |
not present
|
1.69-3.60 |
0xE97C1B5F
|
Loads vs0:app/NPXS10028/pcff.skprx
and os0:kd/pcbc.skprx
, then compat_sm.self
, calls SceGrabForDriver_072B8D93(param)
, and then issues compat_sm command 0x10006.
int sceCompatInitEx(int param);
sceCompatUninit
Version |
NID
|
0.990-3.60 |
0xEF929397
|
int sceCompatUninit(void);
sceCompatStop
Version |
NID
|
0.990-3.60 |
0xFCE2422F
|
int sceCompatStop(void);
sceCompatInit
Version |
NID
|
0.940-1.03 |
0xB9DBD54A
|
3.60 |
not present
|
Loads Pcff (PSP Compat Flash Files) and Pcbc (PSP Compat Boot Code).
int sceCompatInit(SceSize size, SceUInt32 a2, SceCompatInitParam *pParam);
sceCompatLCDCInit
Version |
NID
|
0.940-0.990 |
0x3021D626
|
1.03-3.60 |
not present
|
int sceCompatLCDCInit(void *pFrameBufBase);
sceCompatLCDCExec
Version |
NID
|
0.940-0.990 |
0x7E3E266D
|
1.03-3.60 |
not present
|
int sceCompatLCDCExec(void);
sceCompatResume
Version |
NID
|
0.990 |
0xCA184D5B
|
1.03-3.60 |
not present
|
// step: must be either 1 (resume Pervasive, restore CPU speed) or 2 (init lcd dmac, write resume payload, reload act.dat)
int sceCompatResume(SceUInt32 step, int maybe_addr);
sceCompatSuspend
Version |
NID
|
0.990 |
0x9EFFE36E
|
1.03-3.60 |
not present
|
// step: must be either 1 (black screen) or 2 (suspend Pervasive, slow down CPU, wipe act.dat in memory)
int sceCompatSuspend(SceUInt32 step);
sceCompatWriteShared
Version |
NID
|
0.990 |
0xC37A463C
|
1.03-3.60 |
not present
|
Writes to SceCompatSharedSram.
int sceCompatWriteShared(SceUInt32 offset, const void *pBuf, SceSize size);
sceCompatWaitRequest
Version |
NID
|
0.990-1.03 |
0x434BDAB0
|
3.60 |
not present
|
int sceCompatWaitRequest(SceUInt32 req_id);
sceCompatReturnResult
Version |
NID
|
0.990 |
0x02F5CF19
|
1.03-3.60 |
not present
|
int sceCompatReturnResult(SceUInt32 req_id);
sceCompatReturnValue
Version |
NID
|
0.990-1.03 |
0x61DB492A
|
3.60 |
not present
|
int sceCompatReturnValue(SceUInt32 req_id, uint a2, uint a3);
sceCompatSetDisplayBuffer
Version |
NID
|
0.990-1.03 |
0xC820EC43
|
3.60 |
not present
|
int sceCompatSetDisplayBuffer(const SceDisplayFrameBuf *pFrameBuf);
sceCompatReadShared
Version |
NID
|
0.990 |
0xC983287E
|
1.03-3.60 |
not present
|
int sceCompatReadShared(SceUInt32 offset, void *pBuf, SceSize size);