Guide:Writing pnach files: Difference between revisions

Added navbox
(Modified "Format" information)
(Added navbox)
 
(5 intermediate revisions by 2 users not shown)
Line 1:
{{Infobox guide
| sly1 = y
| sly2 = y
| sly3 = y
}}
 
This guide contains documentation on how to write patch lines in pnach format.
 
== Format ==
 
Pnach format takes inspiration from RAW PS2 cheat codes. A RAW PS2 cheat code is composed of 2 valid hexadecimal numbers (0-9, both hexadecimalA-F), without the prefix "0x" and always composed of 8 digits:
XXXXXXXX YYYYYYYY
To convert a RAW PS2 cheat code to a patch line to be used in a pnach file, one must add "patch=1,EE," before the first number and ",extended," before the second number:
Line 11 ⟶ 17:
Converted to pnach-format:
patch=1,EE,00E98100,extended,00000064
This patch line will constantly write the 48-bytebit value 0x64 to the address 0xE98100.
 
Do note that loading a save-state will force PCSX2 to parse the .pnach contents.
 
Pnach format supports single-line ("//") comments. This means that prefixing a patch line with "//" it will be ignored.
Line 19 ⟶ 26:
 
Below you can find the documentation of the code types available with their respective syntax.
 
{{Note for Bentley|The PNACH documentation below is all in RAW PS2 cheat format. To write a pnach file, you have to convert it to pnach format like above (formatted like `patch=1,EE,XXXXXXXX,extended,XXXXXXXX`).}}
 
== Constant write ==
 
Line 227 ⟶ 237:
<pre>
E0nnvvvv taaaaaaa
</pre>It is possible to simulate the && (and) logical operator by having multiple E-Type codes one after the other.
For example, the code below checks if the value at address 0x003E1110 is equal to 3 '''''AND''''' the value at address 0x0067381C is not equal to 0xFF. If both conditions are met, write the 32-bit value 0x12345678 to the address 0x003D4AB0:<pre>
E0020003 003E1110
E10100FF 1067381C
203D4AB0 12345678
</pre>
==Notes and clarifications==
The true format of a patch line is:<pre>
patch=<place>,<cpu>,XXXXXXXX,<data>,YYYYYYYY
</pre>
 
*
=== place ===
The "place" field indicates how/when/where the patch line should be applied. If "place" is not one of the supported values then the patch line is never applied.
 
PCSX2 currently supports the following values:
 
* 0 - apply the patch line once on game boot/startup.
* 1 - apply the patch line continuously (technically - on every vsync).
* 2 - effect of 0 and 1 combined, see below.
 
Note:
 
While it may seem that a value of 1 does the same as 0, but also later continues to apply the patch on every vsync - it's not. The current (and past) behavior is that these patches are applied at different places at the code, and it's possible, depending on circumstances, that 0 patches will get applied before the first vsync and therefore earlier than 1 patches. There's no "place" value which indicates to apply both once on startup and then also continuously, however such behavior can be achieved by duplicating the line where one has a 0 "place" and the other has a 1 "place".
 
=== cpu ===
The "cpu" field indicates which memory the pnach should be targeting. If "cpu" is not one of the supported values then the patch line is never applied.
 
PCSX2 currently supports the following values:
 
* EE - Target the EE memory. EE stands for "Emotion Engine", it is the PS2 CPU's name.
* IOP - Target the IOP memory. IOP stands for Input/Output Processor.
 
=== data ===
The "data" field indicates which data type to consider when parsing the patch line.
 
PCSX2 currently supports the following values:
 
# If the "cpu" field is "EE":
#* byte = 8-bit (1 byte)
#* short = 16-bit (2 bytes)
#* word = 32-bit (4 bytes)
#* double = 64-bit (8 bytes)
#* extended = N-bit (the data type is based on the instruction)
#* leshort = 16-bit (2 bytes) in little endian
#* leword = 32-bit (4 bytes) in little endian
#* ledouble = 64-bit (8 bytes) in little endian
# If the "cpu" field is "IOP":
#* byte = 8-bit (1 byte)
#* short = 16-bit (2 bytes)
#* word = 32-bit (4 bytes)
 
While it is recommended to use the "extended" value, one might find the "double" data type useful to write 8 bytes in a single line (which would require 2 32-bit writes instructions):<pre>
patch=1,EE,20E98100,double,12345678DEADBEEF
</pre>
==Useful links==
 
* https://github.com/root670/CheatDevicePS2/wiki/Code-Types
* https://github.com/zzamizz/weed-sheet/wiki/PNACH-Code-Types
* https://github.com/mlafeldt/ps2rd/blob/master/Documentation/code_types.txt
* https://github.com/root670/CheatDevicePS2/blob/master/engine/engine_asm.S
* https://github.com/PCSX2/pcsx2/blob/fdabc82342d82227901c9a709b10f02dfe1801a3/pcsx2/Patch_Memory.cpp
 
{{WikiSEO helper
| keywords = pnach,patch,pcsx2,codes,cheats,cheat codes
}}
 
{{Navbox guides}}