Skip to content

Pnach Basics

1234567890num edited this page Apr 17, 2022 · 8 revisions

So if you aren't already aware pnach cheats are basically just differently formatted, RAW GameShark Codes.

This means 2 things:

  1. What you may assume at first glance is an entire address actually isn't. It's ths of an address because the first digit is inherent to the code.

  2. Codes follow a set number of defined formats.

To get into the technical stuff, Gameshark codes (and thus pnach codes) only address a portion of the game’s memory. If you're looking into memory from Cheat Engine you should be able to limit your search to the 20000000 - 21FFFFFF range to find whatever you're looking for. The addresses 22000000 - 2FFFFFFF deal with the more technical aspects of the emulation.

The formatting for codes works as follows:

---------------------------------------------------------------
          PCSX2 1.5.0 - Extended PNACH - Cheat Sheet
---------------------------------------------------------------

patch=1,EE,0AAAAAAA,extended,000000VV -> Writes value V into address A (1-Byte Write)

patch=1,EE,1AAAAAAA,extended,0000VVVV -> Writes value V into address A (2-Byte Write)

patch=1,EE,2AAAAAAA,extended,VVVVVVVV -> Writes value V into address A (4-Byte Write)

patch=1,EE,300000VV,extended,0AAAAAAA -> Increases the value of address A by the value V (1-Byte)

patch=1,EE,301000VV,extended,0AAAAAAA -> Decreases the value of address A by the value V (1-Byte)

patch=1,EE,3020VVVV,extended,0AAAAAAA -> Increases the value of address A by the value V (2-Byte)

patch=1,EE,3030VVVV,extended,0AAAAAAA -> Decreases the value of address A by the value V (2-Byte)

patch=1,EE,30400000,extended,0AAAAAAA |-> Increases the value of address A by the value V (4-Byte)
patch=1,EE,VVVVVVVV,extended,00000000 |

patch=1,EE,30500000,extended,0AAAAAAA |-> Decreases the value of address A by the value V (4-Byte)
patch=1,EE,VVVVVVVV,extended,00000000 | 

patch=1,EE,4AAAAAAA,extended,TTTTBBBB |-> Writes value V into address A + (B * (4 * T))
patch=1,EE,VVVVVVVV,extended,00000000 | in a loop T times.

patch=1,EE,5FFFFFFF,extended,NNNNNNNN |-> Copies the N amount of bytes from address F to address T
patch=1,EE,0TTTTTTT,extended,00000000 |

patch=1,EE,6AAAAAAA,extended,VVVVVVVV |-> Writes value V into the pointed address of A + O, X
patch=1,EE,000X0000,extended,OOOOOOOO | determines data depth (0 = 1-Byte, 1 = 2-Byte 2 = 4-Byte)

patch=1,EE,7AAAAAAA,extended,00X0VVVV -> Performs a bitwise operation with the value stored at address
A and value V, and writes it back to address A.

Operations (X): 0 = 1-Byte OR, 1 = 2-Byte OR, 2 = 1-Byte AND, 3 = 2-Byte AND, 4 = 1-Byte XOR, 5 = 2-Byte XOR

patch=1,EE,DAAAAAAA,extended,00XXVVVV -> Checks the value at address A and compares it to value V. If the
condition is true, it activates 1 line of code.

Operations (X): 00 = Equal, 10 = Not Equal, 20 = Lesser, 30 = Greater

patch=1,EE,EZNNVVVV,extended,XAAAAAAA -> Checks the value at address A and compares it to value V. If the
condition is true, it activates N amount of lines.

Value Type (Z): 0 = 2-Byte, 1 = 1-Byte
Operations (X): 0 = Equal , 1 = Not Equal, 2 = Lesser, 3 = Greater

Example Code:

As an example, this block of code:

patch=1,EE,E0041A04,extended,0032BAE0
patch=1,EE,E0030001,extended,0032BAE4
patch=1,EE,E0020001,extended,0032BAE8
patch=1,EE,01C6C754,extended,00000001
patch=1,EE,01C6C750,extended,00000001

Translates to: IF the value of 2032BAE0 is equal to 1A04 run the next 4 lines.
Then IF the value of 2032BAE4 is equal to 0001 run the next 3 lines.
Then IF the value of 2032BAE8 is equal to 0001 run the next 2 lines.
Then set the byte at 21C6C754 to 01.
Then set the byte at 21C6C750 to 01.

If at any point one of those conditions is not true the last 2 lines do nothing.

PCSX2-EX Only

These codes are not supported by PCSX2 1.6.0 (as far as people tested)

patch=1,EE,8AAAAAAA,extended,OOOOOOOO |-> Copies the value at the pointed address of A + O into
patch=1,EE,0TTTTTTT,extended,00000000 |  address T

patch=1,EE,9AAAAAAA,extended,0TTTTTTT -> Copies the value stored at address A to address T
 
patch=1,EE,ADDDDDDD,extended,00000000 |-> Copies the value stored at address D to the pointed
patch=1,EE,0PPPPPPP,extended,0IIIIIII |  address of P + I 

patch=1,EE,BXXSSSSS,extended,00000000 -> Activates X amount of lines every S milliseconds.

patch=1,EE,CAAAAAAA,extended,00000000 |-> Compares the value at address A with the value at
patch=1,EE,0TTTTTTT,extended,YZXXXXXX |  address T. If true, activates X amount of lines.

Value Type (Y): 0 = 4-Byte, 1 = 2-Byte, 2 = 1-Byte
Operations (Z): 00 = Equal, 10 = Not Equal, 20 = Lesser, 30 = Greater