Guide:Writing pnach files: Difference between revisions
General modification.
TheOnlyZac (talk | contribs) (Added pnach format section) |
(General modification.) |
||
Line 1:
This guide contains documentation on how to write
==
Pnach format takes inspiration from RAW PS2 cheat codes. RAW PS2 cheat codes are composed of 2 numbers, both always hexadecimal and always composed of 8 digits.
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.
For example, a RAW PS2 cheat code could be:
00E98100 00000064
Converted to pnach-format:
patch=1,EE,00E98100,extended,00000064
This patch line will constantly write the 4-byte value 0x64 to the address 0xE98100.
Pnach format supports single-line ("//") comments. This means that prefixing a patch line with "//" it will be ignored.
So, we can say that a pnach file is a sequence of patch lines.
Below you can find the documentation of the code types available with their respective syntax.
== Constant write ==
=== 8-bit constant write ===
Writes the 8-bit value @v to the address @a.<pre>
0aaaaaaa 000000vv
</pre>
=== 16-bit constant write ===
Writes the 16-bit value @v to the address @a.<pre>
1aaaaaaa 0000vvvv
</pre>
=== 32-bit constant write ===
Writes the 32-bit value @v to the address @a.<pre>
2aaaaaaa vvvvvvvv
</pre>
== Increment / Decrement ==
Increment/decrement the current value at address @a by value @v.
=== 8-bit increment ===
<pre>
Line 78 ⟶ 68:
vvvvvvvv 00000000
</pre>
== Constant serial write ==
===
Starting with address @a, this code writes the 8-bit value @v to @n addresses.
In each cycle, the address is incremented by @s * 2 and the value is incremented by @i.
<pre>
000000vv 000000ii
</pre>
=== 16-bit constant serial write ===
Starting with address @a, this code writes the 16-bit value @v to @n addresses.
In each cycle, the address is incremented by @s * 2 and the value is incremented by @i.
<pre>
8aaaaaaa nnnnssss
1000vvvv 0000iiii
</pre>
=== 32-bit constant serial write ===
Starting with address @a, this code writes the 32-bit value @v to @n addresses.
In each cycle, the address is incremented by @s * 4 and the value is incremented by @i.
<pre>
4aaaaaaa nnnnssss
vvvvvvvv iiiiiiii
</pre>
== Copy bytes ==
Copies a block of @n bytes from source address @s to destination address @d.<pre>
5sssssss nnnnnnnn
0ddddddd 00000000
</pre>
== Pointer write ==
This code reads a pointer address @a, follows it @n pointers deep, and writes the @v value to the calculated address.
NOTE: Execution of this code type will stop if a NULL pointer is encountered to prevent a crash.
==== Single dereference (n <= 1) ====
Loads the 32-bit base address from address @a, adds offset @p_0 to it, and constantly writes the value @v to the calculated address.
==== Multiple dereferences (n > 1) ====
Loads the 32-bit base address from address @a, adds offset @p_0 to it to get an initial pointer address P_0. Dereference P_0 and add @p_1 to the result to get the next pointer address P_1. This is done @n times until the final address P_n is found, at which point the value @v is written to the calculated address.
=== 8-bit pointer write ===
<pre>
6aaaaaaa 000000vv
0000nnnn
p_1 p_2
........ ........
p_(n-1) p_n
</pre>
=== 16-bit pointer write ===
<pre>
6aaaaaaa 0000vvvv
0001nnnn
p_1 p_2
........ ........
p_(n-1) p_n
</pre>
Line 124 ⟶ 135:
<pre>
6aaaaaaa vvvvvvvv
0002nnnn
p_1 p_2
........ ........
p_(n-1) p_n
</pre>
== Bitwise operations ==
Performs a bitwise logical operation between the value @v and the value stored at address @a. Store the result at address @a.
=== 8-bit OR ===
<pre>
Line 172 ⟶ 174:
</pre>
== Conditionals ==
=== C-Type ===
==== 32-bit execute all following codes if equal to ====
All following codes will be executed only if 32-bit value at address @a is equal to the value @v.<pre>
Caaaaaaa vvvvvvvv
</pre>
=== D-Type (NOT RECOMMENDED) ===
====
Compares value at address @a to value @v, and executes next @n lines only if the test condition @t is true. Values for @t are:
* 0 equal
* 1 not equal
* 2 less than
* 3 greater than
* 4 NAND
* 5 AND
* 6 NOR
* 7 OR
==== 8-bit test ====
<pre>
Daaaaaaa
</pre>
==== 16-bit test ====
<pre>
Daaaaaaa nnt0vvvv
</pre>
==== Multi-line "if" ====
Compares value at address @a to value @v, and executes next @n lines only if the test condition @t is true. Values for @t are:
* 0 equal
* 1 not equal
Line 237 ⟶ 218:
* 6 NOR
* 7 OR
==== 8-bit test ====
<pre>
E1nn00vv taaaaaaa
</pre>
==== 16-bit test ====
<pre>
E0nnvvvv taaaaaaa
</pre>
*
{{WikiSEO helper
|