Help - Search - Members - Calendar
Full Version: The Legend of Zelda, Link's awakening source code
X-CulT Community Forums > Main > X-CulT: Main Forum
Phugolz
QUOTE (Pagetable)
Game Development Archeology: Zelda on Game Boy comes with source
Friday, June 29th, 2007

Imagine you’re writing a Game Boy game, and the resulting ROM with all the code and data is just a little over one megabyte in size. No big deal, just pad the game to two megabytes, and use a 2 MB ROM in the cartridge. Just tell the linker to allocate 2 MB or RAM, put the actual data at the beginning, and then write a 2 MB “.gb” image to disk, which will then be sent to the ROM chip factory.

Now imagine you’re doing this in MS-DOS. Your linker, probably written in C, calls malloc() of the runtime library of the C compiler. You already know where this is going?

While modern operating systems will always clear all malloc()ed memory, so that you cannot get to other processes’ data, this was uncommon in the single-user MS-DOS days. If you allocate 2 MB of RAM (the linker must have used a DOS extender or XMS), you’d get memory with random data in it: leftovers from whatever was in this memory before. (seppel tells me that this can also be caused by seek()ing over EOF in MS-DOS, in which case the previous data on the hard disk will be in the image.)

This is what happened with the 1998 Game Boy/Game Boy Color game “The Legend of Zelda - Link’s Awakening DX” (MD5: ee0424cf1523f67c5007566aed70696d). If you look at the image starting at 0×106000, you will find all kinds of interesting data, which will tell you a lot about the game’s development. Let’s call this “game development archeology”…

The ROM image includes big chunks of Borland’s Turbo C IDE (Turbo Vision interface) for DOS, as well as traces of the “QBasic” MS-DOS Editor. It is unclear which editor they used for what, but they might have used Turbo C to write DOS code to support building, as there is a complete copy of this C program in the ROM:

#include
#include

int main(void) {
FILE *fp,*f1;
int a=0xcd;
int b=0xc6;
int c=0×29;
int ch;
unsigned long i=0;

if((fp=fopen(”zeldag.gb”,”rb”))==NULL) {
printf(”can’t open the file”);
return 0;
}

if((f1=fopen(”ttmp.asm”,”wt”))==NULL) {
printf(”can’t new file ttmp.asm”);
return 0;
}

while((ch=fgetc(fp))!=EOF) {
if(a==ch) {
i++;
ch=fgetc(fp);
if(b==ch) {
i++;
ch=fgetc(fp);
if(c==ch)
fprintf(f1,”%lXH, ” , i);
}
}
i++;
}

fclose(fp);
fclose(f1);
}

This writes the file offsets at which 0xcd,0xc6,0×29 was found in the ROM image into ttmp.asm. These bytes, interpreted as Z80 machine code, mean “CALL 0×29C6″. In the final ROM image, this sequence appears once, at 0×442B. If you have any idea why they look for this, please post it in the comments.

This is the list of files in their project directory at D:\GAMEBOY:
BANK37.ASM
CLEARKU.ASM
DAMA1.ASM
DAMA2.ASM
END.CPP
ENDEND.ASM
ENDEND.LST
ENDEND1.ASM
FEND1.ASM
FEND2.ASM
FEND3.ASM
FIND.ASM
FIND.CPP
IFCHAENL.ASM
INTWCHA.ASM
TEST.ASM
TTMP.ASM
TTMP.TXT
ZIPUTP.CPP

These filenames also appear in the ROM:
ADDPLAG.ASM
ADDPLAGF.ASM
CH64TBL.ASM
FEND.ASM
G.ASM
H.ASM
INSERTKU.ASM
INTWIN.ASM
KKKKKK.ASM
L.ASM
NOPLAY1.ASM
TAB.ASM
Y.ASM
ZXHPDM.ASM

And here comes the interesting part: There is actually some assembly source in the ROM; here is a small snippet:

JoyPort_1:
AND $02 ;LEFT
JR NZ, JoyPort_2
CALL LEFTScroll
RET
JoyPort_2:
AND $04 ;UP
JR NZ, JoyPort_3
CALL UPScroll
RET
JoyPort_3:
AND $08 ;DOWN
JR NZ, JoyPort_4
CALL DOWNScroll

Well-documented, it seems. But there is also some assembly code that looks like this:

L_B000_28F7:
LD A,$7F
LD BC,$0800
LD D,A
LD HL,$9800
L_B000_2900:
LD A,D
LD (HLI),A
DEC BC
LD A,B
OR A,C
JR NZ,L_B000_2900
RET
L_B000_2914:
LD A,(HLI)
LD (DE),A
INC DE
DEC BC
LD A,B
OR A,C
JR NZ,L_B000_2914
RET

The label names suggest that this code has been disassembled from existing Z80 machine code. Link’s Awakening DX is a color remake of an older Game Boy game, so it might very well be that they lost the original source, disassembled the old code and used it again for the remake. This could be easily proven by disassembling the original version and looking for this code.

If you want to do game development archeology yourself, you might want to look at titles like “X-Men - Wolverine’s Rage” (MD5: b1729716baaea01d4baa795db31800b0), which contains Windows 9x registry keys and INF files, “Mortal Kombat 4″ (MD5: 7311f937a542baadf113e9115158cde3), in which you can find some small source fragments, “Gift” (MD5: e6a51088c8fea7980649064bd3a9f9ff), which will tell you that the developers had some Game Boy emulators installed on their system, or the “BIT-MANAGERS” games “Spirou” (MD5:5aa012cf540a5267d6adea6659764441, Turbo C, MAP file, source) and “TinTin in Tibet” (Game Boy Color version, MD5: 8150a3978211939d367f48ffcd49f979), which, amongst other things, contains references to Nintendo’s Game Boy Advance (!) SDK (”C:\Cygnus\thumbelf-000512\H-i686-cygwin32\lib\gcc-lib\thumb-elf\2.9-arm-000512″, “/tantor/build/nintendo/arm-000512/i686-cygwin32/src/newlib/libc/stdio/stdio.c”).

If you find any more things like these, please post them (or links to your stories) as comments! Happy hacking!
Overlord
Interesting stuff when bits like this end up in final ROMs. You have to wonder just how much is out there in ROMs that no-one has looked at...
khorney
i have no idea what todo with this, but awesome, my first and favourite zelda game =3
K2J
I lol'd at QBasic.
Tweaker
Interesting stuff! A similar thing happened with the Sonic 2 Nick Arcade prototype--random bits of code were stored in the memory of an EPROM burner, resulting in portions of the source code being stored as data on the cartridge itself.

Kind of cool to know that even professional developers sometimes had to go and reverse-engineer their own code for their own means. Doesn't make us much different, really. :)
biggestsonicfan
Star Fox Adventures contains a hell of a lot of references to the devkits and directories used. A bit of source too if I recall correctly.
ICEknight
Hmm?
QUOTE
# Somebody Says:
November 25th, 2007 at 9:58

The GoodTools name for the file with the MD5 sum ee0424cf1523f67c5007566aed70696d is “Zelda no Densetsu - Yume no Miru Shima DX (J) (V1.0) [C][p1][T+Chi][!].gbc” - if you are hunting for code left there by Nintendo, you should use clean dumps of the game. None of the source code is present in the clean dumps of the game.

b1729716baaea01d4baa795db31800b0 X-Men - Wolverine’s Rage (U) [C][!].gbc - clean dump
7311f937a542baadf113e9115158cde3 Mortal Kombat 4 (E) [C][!].gbc - clean dump
e6a51088c8fea7980649064bd3a9f9ff Gift (E) [C][t2].gbc - *t*rained, but the clean dump also has those in it…
5aa012cf540a5267d6adea6659764441 Spirou (U) (M4) [S].gb - no indication if this is a clean dump
8150a3978211939d367f48ffcd49f979 Tintin in Tibet (E) (M7) [C][!].gbc - clean dump

But nice finds nonetheless ;)

QUOTE
# a monkey Says:
November 25th, 2007 at 15:17

Guys, this stuff isn’t even in the clean ROM. It’s junk left in there by whoever dumped/hacked it. (What is in there, though, is a lot of the game’s dialogue repeated several times in both English and French. O_o)

There have been games that accidentally left bits of their source code in the ROM, and with more modern systems it’s not uncommon to see lists of filenames intended to be shown on error report screens, but this game isn’t one of them.



Is this true? =\
KiddoCabbusses
If I recall right, the (bad) dumps of the BS Kirby Gurugurubal and Hoshi Kuzushi code have some peculiar data themselves...
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2009 Invision Power Services, Inc.