Hacking The Xbox: Run Games In 480/720p

By Jeffrey | July 9, 2007

Hacked Xbox
Recently I’ve been on a quest to see if it would be possible to up the resolutions of games made for the original Xbox.

With the surging popularity of HDTVs it would seem a great way to squeeze some more life out of those now-aging black box titles.

The goal with this is to attempt to find a way to make Xbox games display in at least 480p (which most already do) or, hopefully, 720p (few do).

My first thought would be to hope there were some .ini or .cfg I could quickly edit, but alas Xbox games aren’t as simple as their PC counterparts.

The solution is far more complex.

As I’ve been reading on this subject I’ve come across a few interesting articles.

The first - located here at GigaGamez - discusses the general popularity of the Xbox for hacking.

That part is relatively old news and boring.

But another part of it focuses on Matt Hargett, an Xbox enthusiast who also knows quite a bit about reverse engineering and hex editing.

Here is the important part of the story that caught my eye:

That came in handy when he decided to upgrade some of his Xbox games to display in 480p instead of 480i. How did he manage this? Why, with a hex editor and a copy of IDA, the eponymous debugging program for Windows. Hargett was so delighted by his success that he even attempted to crank the resolution of the game up to 720p.

Basically the wall that he has run into is the limited RAM available to the system, as higher resolutions require much more memory.

He’s not there, yet, but here is the wiki page so you can keep up to date on his progress.

However, 480p is a much more reasonable task as the resolution is not actually increased.

Like I made mention of above, most current and recent Xbox games already display fine in 480p - I have actually run across only one (Metal Slug) that does not - but for the ones that do not this forum thread has figured out some hacks.

Basically, it has to do with something called the “SetVideoMode” hex.

This hex patch as those of you following the ‘480p Games Hex List’ thread will know allows many interlaced games to run in 480p that were previously unpatched.

he majority of games call CreateDevice(x,x,x,x,x,x,x). A struct _D3DPRESENT_PARAMETERS_ is passed to the 6th x.
This describes the presentation parameters for the game. _D3DPRESENT_PARAMETERS_ contains among other things a Dword - ‘Flags’. Flags is what all previous 480i -> 480p patches have been patching (20h (interlaced) to 00 (autoselect) or 40 (progressive). Within the CreateDevice call the _D3DPRESENT_PARAMETERS_ struct is broken down, ‘Flags’ being the 11th value is stored at +28h.

Below you can see that the original XBE moves +28h to edx (mov edx, [edi+28h]), this however isn’t ‘pushed’ (push edx)
until just before the SetVideoMode call, this means the the 1st arg of the SetVideoMode call is the Dword value for ‘Flags’.
So changing the code to ‘push’ a value of 0 instead of the original edx / +28h value it will cause 480i / p autoselect.

To do this I had to first ‘nop’ (do nothing) out 8B 57 28 with 90 90 90 and then move everything around. From the original XBE you can see that push edx (52 as hex) is one hex32 value. However Push 0 is (6A 00) so requires 2 hex32 values. I was not possible to simple do a push 0 at the location of 90 90 90 since it needed to be in the same place as the original push edx.

Did you understand any of that?

Good, neither did I. At least, not most of it.

But the point is that this goal might just be possible. Let’s hope so, because with all the problems the 360 is having, and with so many great Xbox titles still begging to be played, I’d love to keep this system around for much longer serving its main purpose:

Playing games.

Topics: Guides |



Comments