Skip to main content

cwCheat address rewriter for PSP/PPSSPP memory patch lines

Project description

ppsspp-cwcheat-clippy

GitHub PyPI Version License

buymeacoffee

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

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 08801234 or 0x08801234.
  • 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: xclip or xsel

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 _L prefix.
  • 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 ... 187xxxxx or 0x..., and copy it again if the clipboard did not change.
  • Linux clipboard errors: install wl-clipboard for Wayland, or xclip/xsel for 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ppsspp_cwcheat_clippy-0.6.0.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ppsspp_cwcheat_clippy-0.6.0-py3-none-any.whl (13.3 kB view details)

Uploaded Python 3

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

Hashes for ppsspp_cwcheat_clippy-0.6.0.tar.gz
Algorithm Hash digest
SHA256 964ba3bc810aed4067521b9e66542f856cc98a8ed588a5cd7babdc3fcae015d2
MD5 20c6781ff283e0a98849d39968e68584
BLAKE2b-256 a86b8745c84f0828c2628b78e5b84d58ae62802b4f3ac6f8533aaac48adc9803

See more details on using hashes here.

File details

Details for the file ppsspp_cwcheat_clippy-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ppsspp_cwcheat_clippy-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6da430fa7edaa31746d9115c0850ee7e0b4b9f8203b1ab0a818bd9246c363f49
MD5 4feb3f3be3ed3184e5fc12b63cf55009
BLAKE2b-256 44ac2586e48273d26fa4d47b780e857fb40d8255806fd8064775b1f109f259a0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page