ppsspp-cwcheat-clippy
cwCheat address rewriter for PSP/PPSSPP memory patch lines.
Clippy watches your clipboard for PSP virtual addresses such as 08801234, converts them to cwCheat’s 28-bit offset, rewrites a cwCheat line template, prints the result, and copies it back to your clipboard.
Table of contents
- What this does
- Installation
- Quick start
- Templates and input formats
- Address math & valid range
- Template detection
- Examples
- Troubleshooting
- Credits
What this does
Use this when you are finding addresses in PPSSPP or on hardware and want to keep reusing the same cwCheat template.
- Accepts a full cwCheat line or a single opcode nibble at startup.
- Watches for clipboard values like
08801234or0x08801234. - Rewrites only the detected 28-bit address field.
- Preserves the opcode nibble, the other word, and any
// comment. - Copies the rewritten
_L ...line back to the clipboard.
Installation
Install from PyPI:
pip install ppsspp-cwcheat-clippy
Clippy uses pyperclip, which is installed with the package. On Linux, you may also need a clipboard backend:
- Wayland:
wl-clipboard - X11:
xcliporxsel
Windows and macOS usually need no extra clipboard utility.
Quick start
ppsspp-cwcheat-clippy
Clippy prints the app version, accepted address range, active template, and a preview. With no argument, it uses a constant 32-bit write (0x2) with the address in the first word.
Copy 08801234; Clippy prints and copies:
_L 0x20001234 0x01234567 // clippy-automated: set address to 0x01234567
Stop with Ctrl+C.
Templates and input formats
You may pass one template argument.
Full cwCheat line
_L 0x20000000 0x01234567 // set HP
20000000 01234567 // also OK
Rules:
- Two 32-bit hex words, with or without
0x. - Optional
_Lprefix. - Optional
// comment, preserved in output.
Opcode nibble only
2
E // skip if ==
0xD // single-line conditional
A single hex nibble chooses the code family. The second word starts as 0x01234567; for 0xE, the address goes in the second word, otherwise in the first.
If no argument is provided, or an unrecognised argument is provided, Clippy uses the default 0x2 template. A recognised line with no replaceable address field exits with an error.
Address math & valid range
cwCheat uses a 28-bit address window into PSP user memory:
offset = PSP - 0x08800000
valid PSP range = 0x08800000 .. 0x187FFFFF (inclusive)
Clipboard input must contain a 7-8 digit hex address, optionally prefixed with 0x and padded with leading zeroes. Invalid addresses are reported, and the watcher keeps running.
Template detection
Clippy uses heuristics to decide where to place the 28-bit address field (AAAAAAA):
| Opcode top nibble | Meaning | Address goes to |
|---|---|---|
0x0 |
Constant write (8-bit) | w1 |
0x1 |
Constant write (16-bit) | w1 |
0x2 |
Constant write (32-bit) | w1 |
0x3 |
Increment/Decrement | w1 |
0x4 |
Multi-write (word) | w1 |
0x6 |
Pointer write | w1 |
0x7 |
Boolean op | w1 |
0x8 |
Multi-write (byte/halfword) | w1 |
0xD |
Conditional (single-line) | w1 |
0xE |
Conditional (multi-skip) | w2 (top nibble typically 0..3) |
| other | Misc/other | best effort |
For full-line templates, Clippy preserves the opcode, parameters, values, and // comment, and replaces only the detected address field. For 0xD, it rewrites the first-word address only.
Examples
Default template
ppsspp-cwcheat-clippy
Clipboard: 08801234
_L 0x20001234 0x01234567 // clippy-automated: set address to 0x01234567
Full cwCheat line as template
ppsspp-cwcheat-clippy "_L 0x2003AD01 0x77777777 // speed hack 1"
Clipboard: 0x08804567
_L 0x20004567 0x77777777 // speed hack 1
Opcode-only template for 0xE
ppsspp-cwcheat-clippy "E // skip if =="
Clipboard: 08801234
_L 0xE0000000 0x00001234 // skip if ==
Invalid address
Clipboard: 0x087FFFFF
*Invalid PSP address: 0x087FFFFF (PSP address below base)
Troubleshooting
- Nothing happens when I copy an address: use
088xxxxx...187xxxxxor0x..., and copy it again if the clipboard did not change. - Linux clipboard errors: install
wl-clipboardfor Wayland, orxclip/xselfor X11. - Clipboard content gets overwritten: expected; Clippy copies the generated cheat line for quick pasting.
Credits
- Author: Tim Abdiukov
- Thanks to the PPSSPP and cwCheat communities for documentation and examples.
Release files for ppsspp-cwcheat-clippy 0.6.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ppsspp_cwcheat_clippy-0.6.1.tar.gz | 13.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ppsspp_cwcheat_clippy-0.6.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.6 kB
Release files / ppsspp_cwcheat_clippy-0.6.1.tar.gz
| Download URL | ppsspp_cwcheat_clippy-0.6.1.tar.gz |
|---|---|
| Size | 13.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f6cdf017013b8656e14ca8215eda04d5a0d1ee538e9a4a4e6cd4708bba323bc6
|
|
BLAKE2b-256 checksum How to use checksums |
54ce23681b358ffc8baa0a96d2b9b4417e946ea9287be90e74c08e5089ac7884
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / ppsspp_cwcheat_clippy-0.6.1-py3-none-any.whl
| Download URL | ppsspp_cwcheat_clippy-0.6.1-py3-none-any.whl |
|---|---|
| Size | 13.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c64d151fff58009b011cb0b64dea8921760aa9eb9c29a36228cf295a2a171ffe
|
|
BLAKE2b-256 checksum How to use checksums |
883a324d130a3632dbc30ce83809faba0ea58148a790b735f3da07ff279c1caf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|