Well hey, something I can contribute.
Around three years ago, I got into it on the Dragon Warrior board at GameFAQs with a certain individual that went by the name MeteorStrike. This caused him to not only go through the game and find all kinds of interesting things about its internals, but also to discover why a video made using PRG1 would break when played back in PRG0. Here is an excerpt from the guide he wrote and posted on IGN:
----------------------------------------
X - PRG 0 VS PRG 1
----------------------------------------
Now we have resolved the mystery about the Fighter's Ring, and that the
Death Necklace can only be acquired once per game. But we have done these
examinations with one version of the ROM. Couldn't it be possible that there
is some other version out there that is different with these regards?
Surely, if we remember getting more than one Death Necklace per game, and we
proved that this is not possible, there must be some other version out there
with this difference, right? If so, maybe this other version has the
Fighter's Ring's issue fixed as well? Pretty please? With an opcode on top?
Throughout this FAQ, I have looked at the PRG 0 version of the game. The
issue with the Death Necklace got me thinking about this. If we do a diff of
the PRG 0 and PRG 1 versions of the game using some utility out there that
does this, we see that the PRG 0 and PRG 1 versions are different by exactly
3 bytes:
Address PRG 0 PRG 1
3FAE 37 32
3FAF 32 29
AF7C EF F0
The first 2 addresses have to do with the title screen.
In PRG 0, the title screen says at the bottom:
LICENSED TO NINTENDO
TM TRADEMARK TO NINTENDO
In PRG 1, the title screen says at the bottom:
LICENSED TO NINTENDO
TM TRADEMARK OF NINTENDO
So basically, 66 % of the differences between PRG 0 and PRG 1 was to correct
the grammar... at the title screen where everyone can see it openly and poke
fun of it...
This is one easy way to tell which version of the game you have on the cart,
assuming there are only 2 versions, which, according to our research on the
Death Necklace, does not seem to be the case at all...
The last address seems like it can be code. If we do a seek to the relevant
address on the game, taking into account the NES header, we see the
following:
PRG 0:
$AF6B:1D EF 5F ORA $5FEF,X
$AF6E:0D 0E 0C ORA $0C0E
$AF71:1B UNDEFINED
PRG 1:
$AF6B:1D F0 5F ORA $5FF0,X
$AF6E:0D 0E 0C ORA $0C0E
$AF71:1B UNDEFINED
Before we even waste our time analyzing these opcodes, note that after we do
our OR operations, we eventually get to an undefined opcode. If these were
truly supposed to be opcodes, we can see that clearly, their execution would
lead to an undefined opcode before any branching could occur, which would
crash our game. Therefore, these bytes couldn't logically be opcodes. They
are probably something else. Even if these were valid opcodes, this single
difference here does not address any of the relevant details we have
researched. We can conclude that, for purposes of this FAQ, these two
versions are identical.
UPDATE 1.1:
Going back to this matter, one way we can determine what this last byte is
used for is via ROM corruption. Doing so and playing the game for a while to
verify the effect, we find out that the last byte actually has to do with
text as well.
If we look at a chunk of data through a hex editor that has dictionary
capabilities, and we use the game's text as the dictionary, we see the
following:
PRG 0:
AF60 0E 19 47 FC 60 FD 37 11 ep.. .Th
AF68 0E 5F F4 5F 0A 1D 1D 0A e . atta
AF70 0C 14 1C 4C FC 37 11 22 cks!.Thy
AF78 5F 2B 12 1D EF 5F 0D 0E Hit. de
AF80 0C 1B 0E 0A 1C 0E 0D 5F creased
AF88 0B 22 5F F5 47 FC 24 5F by ...A
PRG 1:
AF60 0E 19 47 FC 60 FD 37 11 ep.. .Th
AF68 0E 5F F4 5F 0A 1D 1D 0A e . atta
AF70 0C 14 1C 4C FC 37 11 22 cks!.Thy
AF78 5F 2B 12 1D F0 5F 0D 0E Hit. de
AF80 0C 1B 0E 0A 1C 0E 0D 5F creased
AF88 0B 22 5F F5 47 FC 24 5F by ...A
This clearly corresponds to the text we see when we get attacked by an enemy
in battle. Getting into a battle, we see the following:
PRG 0, HP Damage = 1:
The Slime attacks!
Thy Hit decreased by 1.
PRG 1, HP Damage = 1:
The Slime attacks!
Thy Hit Point decreased by 1.
PRG 0, HP Damage > 1:
The Slime attacks!
Thy Hits decreased by 2.
PRG 1, HP Damage > 1:
The Slime attacks!
Thy Hit Points decreased by 2.
So we see that the value of F0 corresponds to a single byte representation
of the string " Point", and the value of EF, when interpreted as such,
simply prints out null, or nothing at all. This kind of text "compression"
is actually quite common among video games.
From this, we can see that all 3 bytes that are different between PRG 0 and
PRG 1 correspond to text differences in the game. This means that PRG 0 and
PRG 1 SRAM data, save states, movie files, Game Genie codes, and others are
perfectly backwards-compatible with each other.
Also, it seems that I need to correct myself: 100 % of the differences
between PRG 0 and PRG 1 was to correct the grammar... It's nice to finally
know what the real differences are between the two versions! :)
/UPDATE
A link to this guide can be found here. Note that while I may be largely responsible for the creation of this document (he went so far as to dedicate the thing to me), I did not write this. This is entirely MeteorStrike's work, I just goaded him into producing it.
____________________
|