cwCheat address rewriter for PSP/PPSSPP memory patch lines
Project description
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 be 7-8 hex digits, optionally prefixed with 0x. 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ppsspp_cwcheat_clippy-0.6.0.tar.gz.
File metadata
- Download URL: ppsspp_cwcheat_clippy-0.6.0.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
964ba3bc810aed4067521b9e66542f856cc98a8ed588a5cd7babdc3fcae015d2
|
|
| MD5 |
20c6781ff283e0a98849d39968e68584
|
|
| BLAKE2b-256 |
a86b8745c84f0828c2628b78e5b84d58ae62802b4f3ac6f8533aaac48adc9803
|
File details
Details for the file ppsspp_cwcheat_clippy-0.6.0-py3-none-any.whl.
File metadata
- Download URL: ppsspp_cwcheat_clippy-0.6.0-py3-none-any.whl
- Upload date:
- Size: 13.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6da430fa7edaa31746d9115c0850ee7e0b4b9f8203b1ab0a818bd9246c363f49
|
|
| MD5 |
4feb3f3be3ed3184e5fc12b63cf55009
|
|
| BLAKE2b-256 |
44ac2586e48273d26fa4d47b780e857fb40d8255806fd8064775b1f109f259a0
|