Font Size



Jake Stine_avatar

The DevBlogs now allow user comments!

If you'd like to make comments or ask questions in response to a devblog entry you can now do so from the PCSX2 Public Forums. Yes, unlike some frivolous free-for-all blog with a thousand disgusting comment spams, our DevBlog requires that you must be a registered user and logged in to post.

It might not be the best system in the world, but it works well enough for our needs.

This is part of the PCSX2 Team's continuing attempt to expand the horizons of open source PS2 emulation development. There is a new dedicated developers forum on our Forums that centralizes discussions relating to PCSX2 design and development; Svn updates and announcements, Compilation issues, Cross-platform development, patch/bugfix submissions, and probably more to come.

The new forum is not meant for general bug reports or whimsical complaints. So to keep things clean and focused, new topics can only be created by forum administrators and PCSX2 developers. We will create topics relevant to the projects we're focusing on and the public can offer your input via replies. And well... we'll just see how things pan out from here... Smile

Click to Leave a Comment!


The Pros and Cons of GoogleCode

As most of you know we use Google Code for our Public SVN repository, and doing so has its pros and cons.

One of the coolest features of Google Code is that it allows people to rate and comment on revisions. This is great for bug tracking and getting a quick consensus of what people think about the revision.

In order to get quicker responses and have a wider degree of testing/comments, we have granted public access for comments/ratings/issues. This is extremely helpful because as a small team, we don't have the time nor the man-power to constantly test every revision, therefor we count on the public to test for us, and inform us on things we may not know. Furthermore, we have also gained new coders and contributors through their comments/issues on GoogleCode.

There is a huge downside to this open-environment however; the most notable one being the trolls. Like with most public sites on the internet, we have our share of trolls. People giving negative ratings to a bunch of irrelevant revisions because they're mad their game broke. Or people leaving spam (even threatening) comments. Or best of all, people repetitively saying that game XYZ doesn't work on every revision, and telling us to fix it.

A great example that I have to mention here is This email address is being protected from spambots. You need JavaScript enabled to view it. (go ahead and spam his email if you want, he spams our svn). He has made dozens of comments telling us to fix GT4/3, and always complains when we ignore him. At this point he's started to just rate revisions negatively without even leaving a comment as to why. Sometimes I wonder if these people just think we're purposely not making games work because we're evil or something...

Now you might just be wondering, "So, why don't you just ban the guy."
Well this is the biggest problem with GoogleCode, currently there's no way to just ban users from your SVN. We can either make public access to comments/ratings/issues, or we can make it only available to project members. There's no way to have it public while banning the trolls like ferrarinews.

Anyways, there's more to GoogleCode than what I talked about here, but I think i described the main issue we've been having with it Smile

Jake Stine_avatar

Measuring the Benefits of wxWidgets

One of the major changes planned for the next release of PCSX2 is a complete overhaul of the gui/frontend, switching from the current "native" Windows/Linux interfaces to a single unified interface that's (more or less) the same for both platforms. To make such a grand vision possible we needed the help of a third party gui tooolkit, from which there were several to choose from. After much consideration we settled on wxWidgets, which is the same toolkit used by a few other notable emulators, such as Dolphin.

So what are the benefits of the new PCSX2 interface in development?

1. A vastly improved Linux interface.

... and not just in terms of what you see, but how the emulator cooperates with the operating system as a whole. wxWidgets provides dozens of very useful cross-platform tools that are much more well-suited to Linux functionality than the current PCSX2 codebase. The new interface will have a smarter plugin loader, and multilingual support as well. It will also be easier to install and run as a user other than root.

2. Windows XP/Vista Themed appearances will finally work!

Until now, PCSX2 used the old Win95 ASCII-based Common Controls libraries, and this forced Windows to disable themes support when rendering the PCSX2 interface. Buttons were plain and unshaded, and dialog boxes such as the File and Folder pickers were small, ugly, and lacking in features. All of this will be fixed in the next release.

3. More complete internationalization support.

Translations of the PCSX2 interface will be easier to make and maintain, and shouldn't become broken or obsolete from program updates, which was a persistent problem in the older PCSX2 interface design. In addition, PCSX2 will be fully Unicode compliant on both Windows and Linux platforms, which should help resolve various oddball problems the emulator may have encountered on non-English operating systems.

4. A more responsive multithreaded interface which will remain fully accessible even while games are running!

The new interface will run on its own thread separate from the emulator's EE/MTGS threads, allowing it to remain open and accessible in the background, without the need to shut down the GS window. This should improve the stability of "pausing" emulation, and also opens the door for expanding on interface integration; such as binding popup menus, toolbars, status bars, or other useful things to the GS window.

Furthermore, if a game deadlocks the system, the interface will usually remain responsive even as the rest of the emulator freezes up (which might not be much of a feature for end users, but is quite handy for us developers).

5. The Teaser Image!

And here's a sneak peek at the current GUI-Work-in-Progress:

... yeah it's not a whole lot to see yet -- I might post some more as development progresses.

From a coder's perspective:

In all the wxWidgets experience so far has been a decent one. There are a few annoyances, but those tend to be more the fault of cross-platform considerations (some things are not supported well under Linux, or vice versa), or more commonly due to limitations and design flaws in the C++ language itself rather than of wxWidgets (in particular, C/C++ make it especially difficult to work with unicode strings in a 'nice' way). For the most part wx tries to model itself in the image of the .NET Framework and Java Framework API designs, which are good designs to follow.

Jake Stine_avatar

A Moment of Zen

While not likely to win the prize of being featured in PCSX2's next release (presumably 0.9.7, but you can never be too sure), this logo might deserve honorable mention. I present for you a moment of Zen:

pcsx2 JC version

... is that an exploding cheeseburger on his robe?

Jake Stine_avatar

Recompilers: All 'dems buzzwords?

There are a lot of buzzwords in emulator recompilation. Popular ones include:

  • Intermediate Representation
  • Intermediate Language
  • Register Mapping
  • Register Allocation
  • Constant Propagation
  • Constant Folding
  • Register coloring
  • SSA (static single assignment optimization)

What do they mean? And perhaps more importantly, what do they mean to a user of the emulator? Truth is, not much usually. Most of these things are technologies and strategies borrowed from high level language compilers like those for C/C++, C#, Java, etc. Some of them are useful to emulator recompilers, some not so much.

The first thing to consider when working on a recompiler is that we are working with what is most likely optimized code. The machine code that your favorite games are running on your PS2 is already parsed and optimized by a compiler (or in the case of older consoles, hand-optimized). Secondly, recompilers typically have a single-block scope limitation (which is hard to explain, but basically means that compilation stops when branch conditionals are encountered). This all but eliminates the usefulness of SSA and register coloring techniques, since their main benefits are in applying optimizations over a series of conditional code blocks, and elimination of dead code. Furthermore, even when higher level optimizations can be applied, the emulated CPU/Register states must still be guaranteed at frequent intervals. Unlike high level languages, an emulator must manually track things like the Program Counter, instruction pipeline stalls, and other hardware complications. So typically the benefits of such cross-block optimizations get watered down anyway.

Constant Folding and Constant Propagation are, for all intents and purposes, the same thing. They always work together, and most people use the terms interchangeably. You'll never really find a practical situation where one is used without the other. Constant folding refers to the evaluation of constant expressions like 100 * 5. Constant propagation refers to the substitution of variables with known constants, like:

x = 100 * 5;
y = x * 10;

... in which case, the value of 'y' is known at compilation time, and can be further substituted (propagated) anywhere 'y' is used (this should remind you of your 5th grade algebraic homework!). As mentioned before, many people use the terms interchangeably, so when you see another emulator talk of Constant Folding, they mean the same thing I do when I talk of Constant Propagation. The term 'propagation' is technically more correct, but folding is easier to type and looks nicer when naming functions in your recompiler.

Intermediate Language (IL) and Intermediate Representation (IR) are more or less the same thing as well. IL simply implies an IR that has a (mostly) human-readable form. That is, an IL is in fact a programming language, usually bearing some similarity to assembly code, but simpler and more sensible. An IR is just a raw collection of data sufficient to represent all information needed to optimize code and generate the final recompiled product.

In either case, the dual purposes of an IR/IL are:

  • To simplify the instruction set as much as possible so that optimizations can be analyzed without requiring a lot of special-case code.
  • To provide a platform-independent "stage" to the compilation process, so that ports of the recompiler to new target platforms need not be rewritten from the ground up.

Because of the complicated nature of an emulator, an IL itself is virtually useless. There's typically too much per-instruction cpu state information that has to be tracked for a human-readable language output to be viable. But for the same reason an IR can be remarkably helpful in reducing the overall complexity of a recompiler implementation, and is almost a foregone necessity when implementing Register Mapping.

Register Mapping and Register Allocation are once again a set of fairly interchangeable terms. I prefer the term mapping, but other folks like to call it allocation. Register mapping/allocation is typically one of the final stages of recompilation since it's dependent on the target platform (in our case x86), and is also one of the most complex. It's also typically not very beneficial for performance when the target platform is an x86 machine (which in our case it is), unless register mapping algorithms are very clever.

As I mentioned in my previous blog entry, the most significant factor in a recompiler's speed is simply the fact that it's acting as a decoded-instruction cache, and that it executes instructions in bursts (a block at a time instead of one-by-one). All the rest of these techniques tend to be more for the factors of code maintainability and academic challenge than for end-user performance gains.

You are here: Home Developer Blog