WARNING: PCSX2dis runs alongside PCSX2 1.2.1, and can be kept in the same folder with no side-effects. Keeping PCSX2dis with a different version of PCSX2 may work, but is likely to have side-effects, including possible config corruption and incompatible savestates.
Disclaimer: ps2dis is the name of a great PS2 hacking program created by Hanimar way back in the early 2000’s. Still one of the most-used tools in the hacking realm, it can be downloaded from here.
PCSX2dis was coded by LXShadow with strong inspiration from Hanimar’s work, but has no official affiliation. Borrowing most of ps2dis’ features and interface, PCSX2dis is intended as unofficial tribute to the original software with upgrades that take advantage of PCSX2’s powerful emulation capabilities. Due partly to its great inspiration from ps2dis, I desire no credit for the contents of this program in any way, shape or form.
Tl;dr, ps2dis was awesome. Here’s my ps2dis fanfiction =)
(I have finally YOLO'd this topic out into the wild! My forumophobia nags me and tells me that it sucks, so I'm gonna apologise for my Internet-newbie mistakes in advance! Sorry!)
PCSX2dis is an ambitious new hacking tool based on old hackers' favourite ps2dis. Created for advanced hackers and beginner/intermediate hackers who wish to learn ASM hacking, this is an all-purpose tool fixed to a modded version of PCSX2, designed to make PS2 game hacking easier than ever, all in realtime!
PCSX2dis’ true focus is to make both traditional and ASM code hacking as fast and intuitive as possible. It isn’t really the most advanced tool ever—it lacks support for the VU, R3000A and a few more things that I don’t really understand myself—but it’s great for finding things once unseen in PS2 games, such as debug menus and hidden levels, as well as easily enabling raw GameShark codes made by others without needing to mess with patch files or Cheat Engine.
PCSX2dis is used to:
• Analyse and display ASM game code
• Modify game code and game data in real-time
• Create and test RAW GameShark codes on-the-fly
• Create breakpoints to aid the discovery of new codes
• Act as a unified hacking and GameShark tool for intermediate-to-advanced game hackers
Classic ps2dis features: A handy combined view of data and ASM code; labels that can help you remember what to find at a certain address; instant disassembly and reassembly; and the ability to save and load working projects.
Breakpoints: Instruction and data breakpoints are supported! One read breakpoint, one write breakpoint, and up to ten instruction (or “PC”) breakpoints can be set simultaneously. For those unaware of the concept, breakpoints make the game freeze when a certain condition (e.g. a memory address is written to) is met. The program shows you what line of code caused the freeze to happen, and allows you to make modifications. This is very handy, because tracking these lines of code down manually can be very hard!
(...and obviously, you can unfreeze the game afterwards, just FYI =P)
GameShark (RAW) codes: In addition to PCSX2’s patches and cheats, PCSX2dis lets you enable simple raw GameShark codes in its own little window for convenience. Great for rapid testing! You can either type these in manually, or edit the data on any line and hit Ctrl+Enter instead of Enter.
Mini Memory Scanner: Cheat Engine taking up too much screen space? Try out the integrated Code Scanner in the Active GameShark Codes window. Easy finding and easy testing =)
Easy memory modification: It’s as easy as going to a line, double-clicking the value, changing it and hitting Enter! ASM modders can also double-click the code section of the line, and reassemble that quickly. Decimal values? No problem, just convert the line to a word/halfword/byte and edit the rightmost section. Floating-point values? Just convert the line to a Float and do the same! Entire strings? Just convert the line to Byte and enclose your string with double-quotes (if you wish the string not to be null-terminated, omit the closing double-quote). Once again, with all of these you can use Ctrl+Enter to both change it and store it as GameShark code(s).
Register Overrides: Do you know the value of a certain register at a certain line, and PCSX2dis doesn’t? Feel free to let PCSX2dis know by right-clicking and adding a Register Override. You can override as many registers on a single line as you like.
Advanced Searches: The Search box has been some handy new options to play around with. Two of these can particularly help: One, you can now search for ASM code, with optional wildcards for every operand that isn't the instruction itself. (e.g. lw *,$****(*)). Two, you can now search for anonymous patterns: patterns of values that you don't know, where each (case-sensitive) letter you type represents one of the specific values. Any matching patterns of data in the game will be found. This is handy for finding button codes, or sequences of data whose values are unknown. For example, in Ratchet & Clank, in-game cheat codes are sequences of character movements. So to search for e.g. Right flip, Left flip, Right flip, Back flip, Back flip, Forward flip, Left flip; you could search for RLRBBFL. Or 1213342. Or maybe if you're funky, ><>vv^<. Or if you're more the contradictory type, <><^^v>. All of these searches will yield the same result(s).
Struct definitions: Have you found the global list of objects in a game's memory, but don't feel like labelling every single parameter for every single object? Meet struct definitions! A struct, in languages like C++, is an object of data consisting several variables. When multiple objects are created, the variables for each object can be easily found.
In PCSX2dis, a struct labels data in the list as though they were variables in a struct (or more importantly, a list of structs). Simply set up a data format (for example: the first four bytes in should be called 'x' and should be a word type, the next four bytes should be called 'y' and should be a word type, etc.), declare its size, and drop any number of these automatic-labelling formats into any part of the list. See the Edit->Struct Defitions and hit Add for more information. After creating a definition, right-click any line in the main list and hit Place Struct to declare an array of your structs!
Note: If you’ve already used ps2dis before, you’re pretty much already set! There’ll be a few new features and hotkeys you should check out, and you must now Analyse to detect labels, but otherwise the environment is virtually the same. Skip this section and knock yourself out!
When you open up PCSX2dis with a game loaded, you will get taken straight into the live memory view as explained in the Interface section. For those wondering why there’s no scrollbar, it’s because this list is hecka long (way over 8 million lines). Navigation isn’t as hard as it looks; be sure to check out the hotkeys before starting.
For those inexperienced with this kind of hacking, I’ll mention this first: the addresses and values you see in the list are the exact same kind as a normal code. That’s right--the ones you can find with a code scanner. Don’t worry about the assembly instructions (e.g. addiu v0,a0,$1337) that are shown on nearly every line, because those only matter when the line is actually a valid ASM code (which PCSX2dis doesn’t know, so it just assumes it is). So don’t be scared off just yet – the ASM code on the right hand side doesn’t actually matter unless you understand it, and you could in fact just use this program to change the values of your own codes more easily. =)
If you don't know ASM code, but want to give advanced hacking a shot, it's really essential to learn ASM. The ASM is basically the PS2 processor's programming language. It's so minimalistic and non-advanced, that every line of it can be converted into four bytes of data that the processor reads.
The PS2's ASM ("ASseMbly") language is known as MIPS. Click here for its Wikipedia page, and consider googling for MIPS tutorials and instruction references (some of which are seen on the Wikipedia page's External Links). Learning ASM can be hard; it's easiest for those who have programming experience, and learning by experimenting is always a good idea. Once again, check out the Quick Guides at the bottom of this topic as some of them may give you a taste of ASM modding!
Like ps2dis, it’s really hard to explain how to use this program from the ground-up. Instead of a multipurpose tutorial, I’ve written up some short guides that’ll help familiarise you with PCSX2dis’ interface and how it works. Check them out at the bottom of this post. As always, if you can’t figure out how to do something that should theoretically be easy, make sure you check out the Hotkeys!
• Column 1: Address Column: This displays the address of the data at the current line. Oftentimes the data at the current line is displayed as more than a byte, therefore the next address on the list will skip these.
Attempting to edit anything on the Address column will do nothing.
• Column 2: Value Column: This displays the value of the data at the current line. The data will vary in length depending on the type of the line. For example, a line converted to a Byte type (with the B key) will display only one byte. By default, every line (except those recognised as labels by the program) will be a Code type, which is four bytes long.
Attempting to edit anything on the Value column will change the raw value at the address, like a GameShark code.
• Column 3: Label Column: This displays the label, which is a piece of text either generated by PCSX2dis (based on string data discovered in memory), or by the user. Anything in the label column does not affect the actual game’s data. This section is purely to help the user out: it can show you where a game’s string is, and can also be set by the user to help you remember an address for something.
Attempting to edit anything on the Label column will add (or replace) a label. Once again, this does not affect the game’s data.
• Column 4: Converted Value Column: This displays the value of the game’s data at the current line. This is like the Value column, except this value is displayed differently depending on the type of the line (i.e., what the line was converted to). For example, a line converted to a 4-byte Word with the W key will display the hex value at the address (same as the Value column), as well as the decimal value of the address (the same value converted to decimal). By default, this column usually displays the data at an address as ASM code (converted with the U key), which is only actually valid in the code sections of the game’s memory.
Attempting to edit anything on the Converted Value column will give different results depending on the line’s type. For Words (4-byte), Halfs (2-byte) and Bytes (1-byte), the edit box will expect a decimal value and set the value based on that, unless you use the $ sign, which will use a hex value instead (e.g. $D3ADFAC3). For Codes (4-byte code), the edit box will expect a valid line of ASM code.
Additionally, for Bytes, a string (text) will be accepted if you begin the value with a double-quote (e.g. “pizza). If you also end it with a double-quote (e.g. “pizza”), the string will have a byte of 0 added to the end, which usually signifies the end of a string in game data.
• Column 5: Autocomments Column: This section contains auto-generated comments, automatically produced during an Analysis and sometimes while exploring code. It uses a C-style syntax to describe the assumed values of the registers at certain points in the function. Naturally, this is only seen on Code lines.
Attempting to edit anything in the Autocomments column will (...probably? I forget =P) do nothing.
I highly recommend you to learn the hotkeys here—they’ll make life much easier and some of them aren’t explicitly featured in menus or dialogs. Some of these hotkeys you’ve seen before in ps2dis; feel free to ignore those if you’re familiar with that program. However, the new ones will prove quite valuable, so check them out!
(Spoiler'd due to many newlines wow)
• Currently, only EE memory and instructions are supported. R3000A and VU support is unplanned. This is because in every hacking scenario I’ve been in so far, finding debug menus and secret levels normally happens on the EE. Other than that I’d have no idea what I’m doing if I attempted to add R3000A and VU support. =P
• Customisability is limited. Stay calm and try to get used to the tiny font for now. After all, the small size means that lots more fits on the screen, right? =>
• Stability is not guaranteed. This guy’s more of a hacker than a programmer, so unfortunately the program suffers from some general hackyness. As always, saving projects frequently is highly recommended!
These are issues I’ve noticed in the program and hoping to fix in the coming updates. Unfortunately my blood is more hacker than it is tidy-programmer, so I’ve still got some stuff to clean up. I apologise for the inconvenience. Here’s the stuff that I know I’ve done a little wrong!
• Step Over is not yet implemented. Will do this ASAP!
• Any breakpoints on a branch instruction are currently glitched: clicking ‘Continue’ will just make the instruction repeat itself. The current solution is to click Step first, then Continue. I suspected there might be side-effects to this glitch, particularly the delay slot being executed multiple times, but this doesn’t seem to be the case.
• Displayed register values may be invalid at a data breakpoint (instruction breakpoints should be fine). In addition, if you change them at a data breakpoint, the registers will not be changed
• Actually, breakpoints might just crash sometimes. Messing with the EE recompiler has its dangers. Make sure you save projects frequently and use savestates in the emulator!
• Support for analysed code visualisation (the Autocomments section) is simplistic and generally incomplete. However, it’s still handy when it’s right. Just make sure you double-check
• Code Scanner search results don’t automatically update over time. This is more of a missing feature than a bug and I’ll try and get it supported soon!
• Some instructions – mostly floating-point instructions – are still unsupported for now.
Last Update: 13/02/2015
• A breakpoint Ignore List so that specific read/write lines could be found in a haystack of other read/write lines that affect the same address
Since I kind of suck at explaining stuff ( =( ), feel free to ask questions on this topic. For the short time I continue to support this program (I'm mostly a retired hacker) I'll try to answer them and see what I can change in both the program itself and the explanatory release details I've put here.
This will be my first and only release, so I apologise for any newbie mistakes I may have made in this topic or the program itself, and would appreciate any... er... correctional tips. =)
Thanks for checking this out, and happy hacking!
Disclaimer: ps2dis is the name of a great PS2 hacking program created by Hanimar way back in the early 2000’s. Still one of the most-used tools in the hacking realm, it can be downloaded from here.
PCSX2dis was coded by LXShadow with strong inspiration from Hanimar’s work, but has no official affiliation. Borrowing most of ps2dis’ features and interface, PCSX2dis is intended as unofficial tribute to the original software with upgrades that take advantage of PCSX2’s powerful emulation capabilities. Due partly to its great inspiration from ps2dis, I desire no credit for the contents of this program in any way, shape or form.
Tl;dr, ps2dis was awesome. Here’s my ps2dis fanfiction =)
(I have finally YOLO'd this topic out into the wild! My forumophobia nags me and tells me that it sucks, so I'm gonna apologise for my Internet-newbie mistakes in advance! Sorry!)
PCSX2dis and What It Is
PCSX2dis is an ambitious new hacking tool based on old hackers' favourite ps2dis. Created for advanced hackers and beginner/intermediate hackers who wish to learn ASM hacking, this is an all-purpose tool fixed to a modded version of PCSX2, designed to make PS2 game hacking easier than ever, all in realtime!
PCSX2dis’ true focus is to make both traditional and ASM code hacking as fast and intuitive as possible. It isn’t really the most advanced tool ever—it lacks support for the VU, R3000A and a few more things that I don’t really understand myself—but it’s great for finding things once unseen in PS2 games, such as debug menus and hidden levels, as well as easily enabling raw GameShark codes made by others without needing to mess with patch files or Cheat Engine.
PCSX2dis is used to:
• Analyse and display ASM game code
• Modify game code and game data in real-time
• Create and test RAW GameShark codes on-the-fly
• Create breakpoints to aid the discovery of new codes
• Act as a unified hacking and GameShark tool for intermediate-to-advanced game hackers
Features
Classic ps2dis features: A handy combined view of data and ASM code; labels that can help you remember what to find at a certain address; instant disassembly and reassembly; and the ability to save and load working projects.
Breakpoints: Instruction and data breakpoints are supported! One read breakpoint, one write breakpoint, and up to ten instruction (or “PC”) breakpoints can be set simultaneously. For those unaware of the concept, breakpoints make the game freeze when a certain condition (e.g. a memory address is written to) is met. The program shows you what line of code caused the freeze to happen, and allows you to make modifications. This is very handy, because tracking these lines of code down manually can be very hard!
(...and obviously, you can unfreeze the game afterwards, just FYI =P)
GameShark (RAW) codes: In addition to PCSX2’s patches and cheats, PCSX2dis lets you enable simple raw GameShark codes in its own little window for convenience. Great for rapid testing! You can either type these in manually, or edit the data on any line and hit Ctrl+Enter instead of Enter.
Mini Memory Scanner: Cheat Engine taking up too much screen space? Try out the integrated Code Scanner in the Active GameShark Codes window. Easy finding and easy testing =)
Easy memory modification: It’s as easy as going to a line, double-clicking the value, changing it and hitting Enter! ASM modders can also double-click the code section of the line, and reassemble that quickly. Decimal values? No problem, just convert the line to a word/halfword/byte and edit the rightmost section. Floating-point values? Just convert the line to a Float and do the same! Entire strings? Just convert the line to Byte and enclose your string with double-quotes (if you wish the string not to be null-terminated, omit the closing double-quote). Once again, with all of these you can use Ctrl+Enter to both change it and store it as GameShark code(s).
Register Overrides: Do you know the value of a certain register at a certain line, and PCSX2dis doesn’t? Feel free to let PCSX2dis know by right-clicking and adding a Register Override. You can override as many registers on a single line as you like.
Advanced Searches: The Search box has been some handy new options to play around with. Two of these can particularly help: One, you can now search for ASM code, with optional wildcards for every operand that isn't the instruction itself. (e.g. lw *,$****(*)). Two, you can now search for anonymous patterns: patterns of values that you don't know, where each (case-sensitive) letter you type represents one of the specific values. Any matching patterns of data in the game will be found. This is handy for finding button codes, or sequences of data whose values are unknown. For example, in Ratchet & Clank, in-game cheat codes are sequences of character movements. So to search for e.g. Right flip, Left flip, Right flip, Back flip, Back flip, Forward flip, Left flip; you could search for RLRBBFL. Or 1213342. Or maybe if you're funky, ><>vv^<. Or if you're more the contradictory type, <><^^v>. All of these searches will yield the same result(s).
Struct definitions: Have you found the global list of objects in a game's memory, but don't feel like labelling every single parameter for every single object? Meet struct definitions! A struct, in languages like C++, is an object of data consisting several variables. When multiple objects are created, the variables for each object can be easily found.
In PCSX2dis, a struct labels data in the list as though they were variables in a struct (or more importantly, a list of structs). Simply set up a data format (for example: the first four bytes in should be called 'x' and should be a word type, the next four bytes should be called 'y' and should be a word type, etc.), declare its size, and drop any number of these automatic-labelling formats into any part of the list. See the Edit->Struct Defitions and hit Add for more information. After creating a definition, right-click any line in the main list and hit Place Struct to declare an array of your structs!
Understanding PCSX2dis
Note: If you’ve already used ps2dis before, you’re pretty much already set! There’ll be a few new features and hotkeys you should check out, and you must now Analyse to detect labels, but otherwise the environment is virtually the same. Skip this section and knock yourself out!
When you open up PCSX2dis with a game loaded, you will get taken straight into the live memory view as explained in the Interface section. For those wondering why there’s no scrollbar, it’s because this list is hecka long (way over 8 million lines). Navigation isn’t as hard as it looks; be sure to check out the hotkeys before starting.
For those inexperienced with this kind of hacking, I’ll mention this first: the addresses and values you see in the list are the exact same kind as a normal code. That’s right--the ones you can find with a code scanner. Don’t worry about the assembly instructions (e.g. addiu v0,a0,$1337) that are shown on nearly every line, because those only matter when the line is actually a valid ASM code (which PCSX2dis doesn’t know, so it just assumes it is). So don’t be scared off just yet – the ASM code on the right hand side doesn’t actually matter unless you understand it, and you could in fact just use this program to change the values of your own codes more easily. =)
If you don't know ASM code, but want to give advanced hacking a shot, it's really essential to learn ASM. The ASM is basically the PS2 processor's programming language. It's so minimalistic and non-advanced, that every line of it can be converted into four bytes of data that the processor reads.
The PS2's ASM ("ASseMbly") language is known as MIPS. Click here for its Wikipedia page, and consider googling for MIPS tutorials and instruction references (some of which are seen on the Wikipedia page's External Links). Learning ASM can be hard; it's easiest for those who have programming experience, and learning by experimenting is always a good idea. Once again, check out the Quick Guides at the bottom of this topic as some of them may give you a taste of ASM modding!
Like ps2dis, it’s really hard to explain how to use this program from the ground-up. Instead of a multipurpose tutorial, I’ve written up some short guides that’ll help familiarise you with PCSX2dis’ interface and how it works. Check them out at the bottom of this post. As always, if you can’t figure out how to do something that should theoretically be easy, make sure you check out the Hotkeys!
The Interface
As shown in the desperately-Photoshopped screenshot spoilered above, PCSX2dis’s main view displays a column-based list representing the game’s memory.
• Column 1: Address Column: This displays the address of the data at the current line. Oftentimes the data at the current line is displayed as more than a byte, therefore the next address on the list will skip these.
Attempting to edit anything on the Address column will do nothing.
• Column 2: Value Column: This displays the value of the data at the current line. The data will vary in length depending on the type of the line. For example, a line converted to a Byte type (with the B key) will display only one byte. By default, every line (except those recognised as labels by the program) will be a Code type, which is four bytes long.
Attempting to edit anything on the Value column will change the raw value at the address, like a GameShark code.
• Column 3: Label Column: This displays the label, which is a piece of text either generated by PCSX2dis (based on string data discovered in memory), or by the user. Anything in the label column does not affect the actual game’s data. This section is purely to help the user out: it can show you where a game’s string is, and can also be set by the user to help you remember an address for something.
Attempting to edit anything on the Label column will add (or replace) a label. Once again, this does not affect the game’s data.
• Column 4: Converted Value Column: This displays the value of the game’s data at the current line. This is like the Value column, except this value is displayed differently depending on the type of the line (i.e., what the line was converted to). For example, a line converted to a 4-byte Word with the W key will display the hex value at the address (same as the Value column), as well as the decimal value of the address (the same value converted to decimal). By default, this column usually displays the data at an address as ASM code (converted with the U key), which is only actually valid in the code sections of the game’s memory.
Attempting to edit anything on the Converted Value column will give different results depending on the line’s type. For Words (4-byte), Halfs (2-byte) and Bytes (1-byte), the edit box will expect a decimal value and set the value based on that, unless you use the $ sign, which will use a hex value instead (e.g. $D3ADFAC3). For Codes (4-byte code), the edit box will expect a valid line of ASM code.
Additionally, for Bytes, a string (text) will be accepted if you begin the value with a double-quote (e.g. “pizza). If you also end it with a double-quote (e.g. “pizza”), the string will have a byte of 0 added to the end, which usually signifies the end of a string in game data.
• Column 5: Autocomments Column: This section contains auto-generated comments, automatically produced during an Analysis and sometimes while exploring code. It uses a C-style syntax to describe the assumed values of the registers at certain points in the function. Naturally, this is only seen on Code lines.
Attempting to edit anything in the Autocomments column will (...probably? I forget =P) do nothing.
Hotkeys
I highly recommend you to learn the hotkeys here—they’ll make life much easier and some of them aren’t explicitly featured in menus or dialogs. Some of these hotkeys you’ve seen before in ps2dis; feel free to ignore those if you’re familiar with that program. However, the new ones will prove quite valuable, so check them out!
(Spoiler'd due to many newlines wow)
Limitations
• Currently, only EE memory and instructions are supported. R3000A and VU support is unplanned. This is because in every hacking scenario I’ve been in so far, finding debug menus and secret levels normally happens on the EE. Other than that I’d have no idea what I’m doing if I attempted to add R3000A and VU support. =P
• Customisability is limited. Stay calm and try to get used to the tiny font for now. After all, the small size means that lots more fits on the screen, right? =>
• Stability is not guaranteed. This guy’s more of a hacker than a programmer, so unfortunately the program suffers from some general hackyness. As always, saving projects frequently is highly recommended!
Known Issues
These are issues I’ve noticed in the program and hoping to fix in the coming updates. Unfortunately my blood is more hacker than it is tidy-programmer, so I’ve still got some stuff to clean up. I apologise for the inconvenience. Here’s the stuff that I know I’ve done a little wrong!
• Step Over is not yet implemented. Will do this ASAP!
• Any breakpoints on a branch instruction are currently glitched: clicking ‘Continue’ will just make the instruction repeat itself. The current solution is to click Step first, then Continue. I suspected there might be side-effects to this glitch, particularly the delay slot being executed multiple times, but this doesn’t seem to be the case.
• Displayed register values may be invalid at a data breakpoint (instruction breakpoints should be fine). In addition, if you change them at a data breakpoint, the registers will not be changed
• Actually, breakpoints might just crash sometimes. Messing with the EE recompiler has its dangers. Make sure you save projects frequently and use savestates in the emulator!
• Support for analysed code visualisation (the Autocomments section) is simplistic and generally incomplete. However, it’s still handy when it’s right. Just make sure you double-check

• Code Scanner search results don’t automatically update over time. This is more of a missing feature than a bug and I’ll try and get it supported soon!
• Some instructions – mostly floating-point instructions – are still unsupported for now.
Updates
Last Update: 13/02/2015
Possibly To Come
• A breakpoint Ignore List so that specific read/write lines could be found in a haystack of other read/write lines that affect the same address
Questions and Feedback
Since I kind of suck at explaining stuff ( =( ), feel free to ask questions on this topic. For the short time I continue to support this program (I'm mostly a retired hacker) I'll try to answer them and see what I can change in both the program itself and the explanatory release details I've put here.
This will be my first and only release, so I apologise for any newbie mistakes I may have made in this topic or the program itself, and would appreciate any... er... correctional tips. =)
Thanks for checking this out, and happy hacking!
Quick Guides
Click the Spoiler button to view these. More guides may be added in the future!Download
Well--what are you waiting for?! Download the attachment and give it a try! =>