The current URL is datacrystal.tcrf.net.
Dragon Warrior/ROM map
The following article is a ROM map for Dragon Warrior.
Miscellaneous
0x00000 to 0x0000F = iNES header 0x0002A to 0x000C0 = Map metadata (See Metadata Format)
Maps
Castles
0x000C1 to 0x00188 = Charlock Castle 0x00189 to 0x00250 = Hauksness Ruins 0x00251 to 0x00412 = Tantegel Castle 0x00413 to 0x00444 = Tantegel Throne Room 0x00445 to 0x00606 = Dragonlord's Throne Room
Towns
0x00607 to 0x00726 = Kol 0x00727 to 0x008E8 = Brecconary 0x008E9 to 0x00AAA = Cantlin 0x00AAB to 0x00B72 = Garinham 0x00B73 to 0x00D34 = Rimuldar
Shrines
0x00D35 to 0x00D66 = Sunlight Shrine 0x00D67 to 0x00D98 = Rain Shrine 0x00D99 to 0x00DCA = Rainbow Shrine
Dragonlord Cavern
0x00DCB to 0x00E92 = Dragonlord Cavern B1 0x00E93 to 0x00EC4 = Dragonlord Cavern B2 0x00EC5 to 0x00EF6 = Dragonlord Cavern B3 0x00EF7 to 0x00F28 = Dragonlord Cavern B4 0x00F29 to 0x00F5A = Dragonlord Cavern B5 0x00F5B to 0x00F8C = Dragonlord Cavern B6
Other Caves
0x00F8D to 0x00FE6 = Rimuldar Passage 0x00FE7 to 0x01048 = Cave west of Tantegel B1 0x01049 to 0x010AA = Cave west of Tantegel B2 0x010AB to 0x01172 = Garin's Grave B1 0x01173 to 0x0123A = Garin's Grave B3 0x0123B to 0x0136C = Garin's Grave B4 0x0126D to 0x012C0 = Garin's Grave B2 0x012C1 to 0x012F2 = Erdrick's Cave B1 0x012F3 to 0x01324 = Erdrick's Cave B2
Music Data
0x44DB to 0x44DD = Silence, Pulse-1 & Pulse-2 0x44DE to 0x44E2 = Silence, Triangle 0x44E3 to 0x454D = Throne Room, Pulse-1 0x454E to 0x45B9 = Throne Room, Triangle 0x45BA to 0x45C3 = Courtyard, Pulse-1 0x45C4 to 0x4639 = Courtyard, Triangle 0x463A to 0x464F = Level-Up, Pulse-1 0x4650 to 0x4662 = Level-Up, Pulse-2 0x4663 to 0x468A = Gwaelin's Love, Pulse-1 0x468B to 0x46BB = Gwaelin's Love, Pulse-2 0x46BD to 0x46DB = Gwaelin's Love, Triangle 0x46DC to 0x46FA = Inn, Pulse-1 0x46FB to 0x4716 = Inn, Pulse-2 0x4717 to 0x471D = Battle Over, Pulse-2 0x471E to 0x473E = Battle Over, Pulse-1 0x473F to 0x47B1 = Town, Pulse-1 0x47B2 to 0x4826 = Town, Triangle 0x4827 to 0x4853 = Overworld, Triangle 0x4854 to 0x489A = Overworld, Pulse-1 0x489B to 0x492C = Caverns #1-8, Pulse-1 0x492D to 0x49B8 = Cavern #1, Triangle 0x4934 to 0x49B8 = Cavern #2, Triangle 0x493B to 0x49B8 = Cavern #3, Triangle 0x4942 to 0x49B8 = Cavern #4, Triangle 0x4947 to 0x49B8 = Cavern #5, Triangle 0x494E to 0x49B8 = Cavern #6, Triangle 0x4955 to 0x49B8 = Cavern #7, Triangle 0x495C to 0x49B8 = Cavern #8, Triangle 0x49B9 to 0x4ADE = Battle Theme, Pulse-1 0x49CF to 0x4ADE = Battle Theme (sans intro), Pulse-1 0x4ADF to 0x4B71 = Battle Theme, Triangle 0x4AF1 to 0x4B71 = Battle Theme (sans intro), Triangle 0x4B72 to 0x4BF5 = Final Battle, Pulse-1 0x4BF6 to 0x4C29 = Final Battle, Pulse-2 0x4C2A to 0x4C4D = Final Battle, Triangle 0x4C4E to 0x4CA9 = Silver Harp, Pulse-2 0x4C4F to 0x4CA9 = Silver Harp, Pulse-2 0x4CAA to 0x4CF0 = Fairy Flute, Triangle 0x4CF1 to 0x4D32 = Rainbow Drop, Pulse-2 0x4CF2 to 0x4D32 = Rainbow Drop, Pulse-1 0x4D33 to 0x4D59 = "Thou Art Dead", Pulse-2 0x4D34 to 0x4D59 = "Thou Art Dead", Pulse-1 0x4D5A to 0x4D7C = Cursed!, Pulse-2 0x4D5B to 0x4D7C = Cursed!, Pulse-1 0x4D7D to 0x4E4C = Title Theme, Pulse-1 0x4E4D to 0x4F15 = Title Theme, Pulse-2 0x4F16 to 0x4F71 = Title Theme, Triangle 0x4F72 to 0x50C1 = Ending Theme, Pulse-1 0x50C2 to 0x523D = Ending Theme, Pulse-2 0x523E to 0x5363 = Ending Theme, Triangle
Text
0x03DDC to 0x03FD9 = Title Screen data (See Title Screen / End Credits Data Format) 0x0549D to 0x0595E = End Credits 0x05DDD to 0x05E58 = Chest data (See Chest Data Format) 0x06842 = Spell list pointer 0x06844 = Item list part 1, line 1 pointer 0x06846 = Item list part 1, line 2 pointer 0x06848 = Item list part 2, line 1 pointer 0x0684A = Item list part 2, line 2 pointer 0x0684C = Price list pointer 0x0684E = Monster list, line 1 pointer 0x06850 = Monster list, line 2 pointer 0x06F7C to 0x06FBF = Menu pointers 0x06FC0 to 0x0752C = Menu text (See Menu Format) 0x07AC7 to 0x07B9E = Item list part 1, line 1 text 0x07B9F to 0x07BC6 = Item list part 2, line 1 text 0x07BC7 to 0x07C5E = Item list part 1, line 2 text 0x07C5F to 0x07C7F = Item list part 2, line 2 text 0x07C80 to 0x07DB1 = Monster list, line 1 text 0x07DB2 to 0x07E1D = Monster list, line 2 text 0x07E1E to 0x07E65 = Price list values (2 byte little endian) 0x07E66 to 0x07EAE = Spell list text 0x08012 to 0x08037 = Dialogue pointers 0x08038 to 0x0BCBF = Dialogue text
Other
0x01C9F to 0x01D62 = Graphic layout data for the overworld fight background 0x01D63 to 0x01D6C = MP Requirements for the ten Magic Spells 0x01D6D to 0x02662 = Overworld map (RLE encoded by nibbles, 1st nibble is tile, 2nd how many - 1)
Note: The overworld map uses a strange system of pointers/auto-adjusts for offsetting the land from the start of the row. It can't be viewed simply by working out the RLE runs. |
0x031BE to 0x031DB = Music Pointers (See Song Bytes) 0x0F3D8 to 0x0F471 = Warp data (Stairs Down) 0x0F472 to 0x0F50B = Warp data (Stairs Up) 0x10010 to 0x1400F = Game graphics
Note: Much of the first CHR bank (0x10010 to 0x1056F, used for the title screen, final battle, and end credits) stores 2 different overlapping 1bpp graphics; palette changes make either one set of graphics or the other visible at a time. |
Graphics
Sprite Tile Definitions
Tile definitions for Townspeople/Hero Sprites: 0x1344
For the four tiles that make up the sprite (Top-left, Top-right, Bottom-left, Bottom-right), contains tile number byte, tile attributes byte (palette number 0x00-0x03, horizontal flip +0x40) for 8 bytes total.
To calculate the sprite number, add these bits:
- Direction: 0x00 Facing Up, 0x20 Facing Right, 0x40 Facing Down, 0x60 Facing Left
- Animation Frame: 0x00 or 0x01
- Character:
- 0x00 = Man
- 0x02 = Adventurer
- 0x04 = Guard
- 0x06 = Merchant
- 0x08 = King Lorik (always facing Down)
- 0x0A = Old Man
- 0x0C = Woman
- 0x0D = Ending Guard with Trumpet (always facing Right)
- 0x10 = Hero (No equipment)
- 0x12 = Hero (Sword only)
- 0x14 = Hero (Shield only)
- 0x16 = Hero (Sword + Shield)
- 0x18 = Hero (Carrying Gwaelin)
- 0x1A = Princess Gwaelin
- 0x1C = Dragonlord
- 0x1E = Ending Guard with Trumpet (always facing Left)
Multiply sprite number by 8 and add to base address 0x1344.
For example, Tile Definitions for "Hero (Sword + Shield) facing Down" = 0x1344 + 8 * (0x16 + 0x40) = 0x15F4
Gwaelin and Dragonlord normally do not face left, so they have glitched data in there.
Data Formats
Metadata Format
Metadata entries are 5
bytes long:
01 = Pointer to map data 02 = Pointer to map data 03 = X size 04 = Y size 05 = Border tile
Song Bytes
Song bytes are in the same order as maps.
(Byte 1
plays for map 1, byte 2
plays for map 2, etc.)
00 = Nothing 01 = Title Fanfare 02 = Throne Room 03 = Castle 04 = Town 05 = Overworld 06 = Cave 1 07 = Cave 2 08 = Cave 3 09 = Cave 4 0A = Cave 5 0B = Cave 6 0C = Cave 7 0D = Cave 8 0E = Battle 0F = Dragonlord 10 = End Theme 11 = Silver Harp 12 = Fairy Flute 13 = Rainbow Drop 14 = Death 15 = Inn Rest 16 = Princess Gwaelin 17 = Curse 18 = Battle (without intro) 19 = Victory 1A = Level Up
Title Screen / End Credits Data Format
String format is 2 byte PPU address followed by the bytes to write to that address, terminated by $FC. Both the title screen and the end credits use a slightly different table from the rest of the game with:
60=! 61=. 62=© 63=- FC=[end of string] /FD=[end of screen]
Control code F7
takes 2 byte parameters (let's call them A and B) and means "repeat byte B A times" so e.g. F7 08 05
results in writing 05 05 05 05 05 05 05 05
to the PPU.
Chest Data Format
Chest data entries are 5
bytes long:
01 = Map number 02 = X coordinate 03 = Y coordinate 04 = Chest contents
Menu Format
Menu string format is menu setup parameters + menu text, where the menu setup parameters are:
- 1 byte menu type: bit 7 controls whether the menu has a cursor (1) or not (0), bit 5 controls line spacing (1 = single spacing, 0 = double spacing); the game code also checks bit 6 which then requires 1 extra setup parameter when set, but no menu ever sets bit 6
- 1 byte menu height: total height is this number of tiles x 2
- 1 byte menu width: number of tiles x 1
- 1 byte menu screen position: high nybble sets vertical position x 2, low nybble sets horizontal position x 2
If the menu has a cursor, then an additional two parameters are present:
- 1 byte horizontal offset of second column cursor position relative to left edge of menu
- 1 byte initial cursor position relative to top left menu corner; high nybble sets vertical position x 1, low nybble sets horizontal position x 1
The menu text uses a slightly different table from the rest of the game with (highlight to see trailing spaces):
80=[newline] 81= 82= 83= 84= 85= 86= 87=
and lots of other control codes for each of the different data to display.
Note: There is no dedicated end token for menu text; the game keeps printing data until the menu space (width x height as modified by line spacing) has been completely filled! |
Internal Data for Dragon Warrior
| |
---|---|