The reason for this mod is because I wanted a way to test PSPAR codes on CFW, for me it was easier just to implement the PSPAR code types into an existing cheat device rather then try and patch the PSPAR EBOOT to run on CFW so that is exactly what I have done.
Unlike the official PSPAR cheat device a more simple code file format is utilized for loading codes, the format is much like the CWCheat cheat database format but instead of code lines being preceeded with "_L " they are preceeded with "_M ".
I also got bored and decided to implement the CWCheat code types so hopefully most CWCheat codes should work with this cheat device.
General Differences
- This cheat device does not work on OFW! (durr). However it does work on CFW which the official PSPAR does not.
- Support for folders and in-game comments is not available to keep things simple.
- Instead of using a complex binary file for the code a CWCheat-style file is used for simple code entry.
Code Engine Differences
- The offset is added to the address for conditional code types. The ARDS didn't support this and I'm not sure if the official PSPAR does.
- Some button press codes from the official PSPAR database may not work because the code engine seems to write the button press value to a difference address for each game.
- Fake addresses were added to allow button press code to easily be ported over to this cheat device.
- The code engine also has preliminary support for CWCheat codes.
General Differences
- Codes are loaded from a single CWCheat-style file instead of using a single text file for each game. This will save a lot of MS space, depending on how the MS is formatted and the amount of code files on the MS it can save over 20MB!
- Real addresses are used by default for the decoder and browser as PSPAR uses real values for the address.
Code Engine Differences
- NitePR code type support was removed, lol a NitePR mod which doesn't support NitePR codes!
- SOCOM related stuff was removed.
- Off-code support was removed, with the complex code types of CWCheat and PSPAR keeping the off-code function was not a viable option.
General Differences
- A new line type _C2 has been added. Code names with this line prefix will be enabled regardless of the if the cheat engine is enabled or not.
Code Engine Differences
- Code types 0xC and 0xB are currently not implemented. These code types may be implemented in a future revision.
PSPAR Code Types | |
---|---|
Type | Description |
Constant RAM Writes | |
Type 0x00 32-bit 0XXXXXXX YYYYYYYY |
Writes word YYYYYYYY to [XXXXXXX+offset]. |
Type 0x01 16-bit 1XXXXXXX 0000YYYY |
Writes halfword YYYY to [XXXXXXX+offset]. |
Type 0x02 8-bit 2XXXXXXX 000000YY |
Writes byte YY to [XXXXXXX+offset]. |
Conditional 32-bit Code Types | |
Type 0x03 Greater Than 3XXXXXXX YYYYYYYY |
Checks if YYYYYYYY > (word at [XXXXXXX] or [offset] if [XXXXXXX] is 0) If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of thecode list is reached. |
Type 0x04 Less Than 4XXXXXXX YYYYYYYY |
Checks if YYYYYYYY < (word at [XXXXXXX] or [offset] if [XXXXXXX] is 0) If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of thecode list is reached. |
Type 0x05 Equal To 5XXXXXXX YYYYYYYY |
Checks if YYYYYYYY == (word at [XXXXXXX] or [offset] if [XXXXXXX] is 0) If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of thecode list is reached. |
Type 0x06 Not Equal To 6XXXXXXX YYYYYYYY |
Checks if YYYYYYYY != (word at [XXXXXXX] or [offset] if [XXXXXXX] is 0) If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of thecode list is reached. |
Conditional 16-bit + Masking Code Types | |
Type 0x07 Greater Than 7XXXXXXX ZZZZYYYY |
Checks if (YYYY) > (not (ZZZZ) < halfword at [XXXXXXX] or [offset] if [XXXXXXX] is 0). If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of the code list is reached. |
Type 0x08 Less Than 8XXXXXXX ZZZZYYYY |
Checks if (YYYY) < (not (ZZZZ) < halfword at [XXXXXXX] or [offset] if [XXXXXXX] is 0). If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of the code list is reached. |
Type 0x09 Equal To 9XXXXXXX ZZZZYYYY |
Checks if (YYYY) == (not (ZZZZ) < halfword at [XXXXXXX] or [offset] if [XXXXXXX] is 0). If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of the code list is reached. |
Type 0x0A Not Equal To AXXXXXXX ZZZZYYYY |
Checks if (YYYY) != (not (ZZZZ) < halfword at [XXXXXXX] or [offset] if [XXXXXXX] is 0). If not, the code(s) following this one are not executed (ie. execution status is set to false) until a code type D0 or D2 is encountered, or until the end of the code list is reached. |
Offset Codes | |
Type 0x0B Load Offset BXXXXXXX 00000000 |
Loads the 32-bit value into the 'offset'. Offset = word at [XXXXXXX+offset]. |
Type 0xD3 Set Offset D3000000 XXXXXXXX |
Sets the offset value to XXXXXXXX. |
Type 0xDC Add Offset DC000000 XXXXXXXX |
Adds XXXXXXXX to the current offset (Dual Offset). |
Loop Codes | |
Type 0x0C C0000000 YYYYYYYY |
This sets the 'Dx repeat value' to YYYYYYYY and saves the 'Dx nextcode to be executed' and the 'Dx execution status'. Repeat will be executed when a D1/D2 code is encountered. When repeat is executed, the AR reloads the 'next code to be executed' and the 'execution status' from the Dx registers. |
Special Codes | |
Type 0xD0 Terminator D0000000 00000000 |
Loads the previous execution status. If none exists, the execution status stays at 'execute codes'. |
Type 0xD1 Loop Execute Variant D1000000 00000000 |
Executes the next block of codes 'n' times (specified by the 0x0C codetype), but doesn't clear the Dx register upon completion. |
Type 0xD2 Loop Execute Variant/ Full Terminator D2000000 00000000 |
Executes the next block of codes 'n' times (specified by the 0x0C codetype), and clears all temporary data. (i.e. execution status, offsets, code C settings, etc.) This code can also be used as a full terminator, giving the same effects to any block of code. |
Data Register Codes | |
Type 0xD4 Add Value D4000000 XXXXXXXX |
Adds XXXXXXXX to the 'Dx data register'. |
Type 0xD5 Set Value D5000000 XXXXXXXX |
Set XXXXXXXX to the 'Dx data register'. |
Type 0xD6 32-bit Incrementive Write D6000000 XXXXXXXX |
Writes the 'Dx data register' word to [XXXXXXXX+offset], and increments the offset by 4. |
Type 0xD7 16-bit Incrementive Write D7000000 XXXXXXXX |
Writes the 'Dx data register' halfword to [XXXXXXXX+offset], and increments the offset by 2. |
Type 0xD8 8-bit Incrementive Write D8000000 XXXXXXXX |
Writes the 'Dx data register' byte to [XXXXXXXX+offset], and increments the offset by 1. |
Type 0xD9 32-bit Load D9000000 XXXXXXXX |
Loads the word at [XXXXXXXX+offset] and stores it in the'Dx data register'. |
Type 0xDA 16-bit Load DA000000 XXXXXXXX |
Loads the halfword at [XXXXXXXX+offset] and stores it in the'Dx data register'. |
Type 0xDB 8-bit Load DB000000 XXXXXXXX |
Loads the byte at [XXXXXXXX+offset] and stores it in the'Dx data register'. |
Miscellaneous Codes | |
Type 0x0E Patch Code EXXXXXXX YYYYYYYY |
Copies YYYYYYYY bytes from (offset+8) to [XXXXXXXX+offset]. |
Type 0x0F Memory Copy Code FXXXXXXX YYYYYYYY |
copy YYYYYYYY bytes from offset to XXXXXXXX (XXXXXXX is fixed, no offsets are added to it). |
Button | Code |
---|---|
User Mode Buttons | |
PSP_CTRL_SELECT | 0x00000001 |
PSP_CTRL_START | 0x00000008 |
PSP_CTRL_UP | 0x00000010 |
PSP_CTRL_RIGHT | 0x00000020 |
PSP_CTRL_DOWN | 0x00000040 |
PSP_CTRL_LEFT | 0x00000080 |
PSP_CTRL_LTRIGGER | 0x00000100 |
PSP_CTRL_RTRIGGER | 0x00000200 |
PSP_CTRL_TRIANGLE | 0x00001000 |
PSP_CTRL_CIRCLE | 0x00002000 |
PSP_CTRL_CROSS | 0x00004000 |
PSP_CTRL_SQUARE | 0x00008000 |
Kernel Mode Buttons | |
PSP_CTRL_HOME | 0x00010000 |
PSP_CTRL_HOLD | 0x00020000 |
PSP_CTRL_NOTE | 0x00800000 |
PSP_CTRL_SCREEN | 0x00400000 |
PSP_CTRL_VOLUP | 0x00100000 |
PSP_CTRL_VOLDOWN | 0x00200000 |
PSP_CTRL_WLAN_UP | 0x00040000 |
PSP_CTRL_REMOTE | 0x00080000 |
PSP_CTRL_DISC | 0x01000000 |
PSP_CTRL_MS | 0x02000000 |
Fake address are used to return system information which either can't be accessed from memory or does not have a static address. Presently these addresses can only be accessed using the exact address listed (ie. no 8/16-bit retrieval of the upper return bits).
Fake Addresses | |
---|---|
Address | Return Value |
0x0A000000 | Pressed buttons. |
0x0A000004 | X-axis of analog nub. |
0x0A000008 | Y-axis of analog nub. |
Thanks go out to the following people, without them this would not have been possible: