The current URL is datacrystal.tcrf.net.
Dragon Warrior/ROM map: Difference between revisions
No edit summary |
m (simplified template declarations) |
||
(9 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
{{rommap | {{rommap}} | ||
==Miscellaneous== | ==Miscellaneous== | ||
0x00000 to 0x0000F = iNES header | |||
0x0002A to 0x000C0 = Map metadata (See | 0x0002A to 0x000C0 = Map metadata (See [[#Metadata_Format|Metadata Format]]) | ||
==Maps== | ==Maps== | ||
===Castles=== | ===Castles=== | ||
0x000C1 to 0x00188 = Charlock Castle | |||
0x000C1 to 0x00188 = Charlock Castle | 0x00189 to 0x00250 = Hauksness Ruins | ||
0x00189 to 0x00250 = Hauksness Ruins | 0x00251 to 0x00412 = Tantegel Castle | ||
0x00251 to 0x00412 = Tantegel Castle | 0x00413 to 0x00444 = Tantegel Throne Room | ||
0x00413 to 0x00444 = Tantegel Throne Room | 0x00445 to 0x00606 = Dragonlord's Throne Room | ||
0x00445 to 0x00606 = Dragonlord's Throne Room | |||
===Towns=== | ===Towns=== | ||
0x00607 to 0x00726 = Kol | |||
0x00607 to 0x00726 = Kol | 0x00727 to 0x008E8 = Brecconary | ||
0x00727 to 0x008E8 = Brecconary | 0x008E9 to 0x00AAA = Cantlin | ||
0x008E9 to 0x00AAA = Cantlin | 0x00AAB to 0x00B72 = Garinham | ||
0x00AAB to 0x00B72 = Garinham | 0x00B73 to 0x00D34 = Rimuldar | ||
0x00B73 to 0x00D34 = Rimuldar | |||
===Shrines=== | ===Shrines=== | ||
0x00D35 to 0x00D66 = Sunlight Shrine | |||
0x00D35 to 0x00D66 = Sunlight Shrine | 0x00D67 to 0x00D98 = Rain Shrine | ||
0x00D67 to 0x00D98 = Rain Shrine | 0x00D99 to 0x00DCA = Rainbow Shrine | ||
0x00D99 to 0x00DCA = Rainbow Shrine | |||
===Dragonlord Cavern=== | ===Dragonlord Cavern=== | ||
0x00DCB to 0x00E92 = Dragonlord Cavern B1 | |||
0x00DCB to 0x00E92 = Dragonlord Cavern B1 | 0x00E93 to 0x00EC4 = Dragonlord Cavern B2 | ||
0x00E93 to 0x00EC4 = Dragonlord Cavern B2 | 0x00EC5 to 0x00EF6 = Dragonlord Cavern B3 | ||
0x00EC5 to 0x00EF6 = Dragonlord Cavern B3 | 0x00EF7 to 0x00F28 = Dragonlord Cavern B4 | ||
0x00EF7 to 0x00F28 = Dragonlord Cavern B4 | 0x00F29 to 0x00F5A = Dragonlord Cavern B5 | ||
0x00F29 to 0x00F5A = Dragonlord Cavern B5 | 0x00F5B to 0x00F8C = Dragonlord Cavern B6 | ||
0x00F5B to 0x00F8C = Dragonlord Cavern B6 | |||
===Other Caves=== | ===Other Caves=== | ||
0x00F8D to 0x00FE6 = Rimuldar Passage | |||
0x00F8D to 0x00FE6 = Rimuldar Passage | 0x00FE7 to 0x01048 = Cave west of Tantegel B1 | ||
0x00FE7 to 0x01048 = Cave west of Tantegel B1 | 0x01049 to 0x010AA = Cave west of Tantegel B2 | ||
0x01049 to 0x010AA = Cave west of Tantegel B2 | 0x010AB to 0x01172 = Garin's Grave B1 | ||
0x010AB to 0x01172 = Garin's Grave B1 | 0x01173 to 0x0123A = Garin's Grave B3 | ||
0x01173 to 0x0123A = Garin's Grave B3 | 0x0123B to 0x0136C = Garin's Grave B4 | ||
0x0123B to 0x0136C = Garin's Grave B4 | 0x0126D to 0x012C0 = Garin's Grave B2 | ||
0x0126D to 0x012C0 = Garin's Grave B2 | 0x012C1 to 0x012F2 = Erdrick's Cave B1 | ||
0x012C1 to 0x012F2 = Erdrick's Cave B1 | 0x012F3 to 0x01324 = Erdrick's Cave B2 | ||
0x012F3 to 0x01324 = Erdrick's Cave B2 | |||
==Music Data== | ==Music Data== | ||
0x44DB to 0x44DD = Silence, Pulse-1 & Pulse-2 | |||
0x44DB to 0x44DD = Silence, Pulse-1 & Pulse-2 | 0x44DE to 0x44E2 = Silence, Triangle | ||
0x44DE to 0x44E2 = Silence, Triangle | 0x44E3 to 0x454D = Throne Room, Pulse-1 | ||
0x44E3 to 0x454D = Throne Room, Pulse-1 | 0x454E to 0x45B9 = Throne Room, Triangle | ||
0x454E to 0x45B9 = Throne Room, Triangle | 0x45BA to 0x45C3 = Courtyard, Pulse-1 | ||
0x45BA to 0x45C3 = Courtyard, Pulse-1 | 0x45C4 to 0x4639 = Courtyard, Triangle | ||
0x45C4 to 0x4639 = Courtyard, Triangle | 0x463A to 0x464F = Level-Up, Pulse-1 | ||
0x463A to 0x464F = Level-Up, Pulse-1 | 0x4650 to 0x4662 = Level-Up, Pulse-2 | ||
0x4650 to 0x4662 = Level-Up, Pulse-2 | 0x4663 to 0x468A = Gwaelin's Love, Pulse-1 | ||
0x4663 to 0x468A = Gwaelin's Love, Pulse-1 | 0x468B to 0x46BB = Gwaelin's Love, Pulse-2 | ||
0x468B to 0x46BB = Gwaelin's Love, Pulse-2 | 0x46BD to 0x46DB = Gwaelin's Love, Triangle | ||
0x46BD to 0x46DB = Gwaelin's Love, Triangle | 0x46DC to 0x46FA = Inn, Pulse-1 | ||
0x46DC to 0x46FA = Inn, Pulse-1 | 0x46FB to 0x4716 = Inn, Pulse-2 | ||
0x46FB to 0x4716 = Inn, Pulse-2 | 0x4717 to 0x471D = Battle Over, Pulse-2 | ||
0x4717 to 0x471D = Battle Over, Pulse-2 | 0x471E to 0x473E = Battle Over, Pulse-1 | ||
0x471E to 0x473E = Battle Over, Pulse-1 | 0x473F to 0x47B1 = Town, Pulse-1 | ||
0x473F to 0x47B1 = Town, Pulse-1 | 0x47B2 to 0x4826 = Town, Triangle | ||
0x47B2 to 0x4826 = Town, Triangle | 0x4827 to 0x4853 = Overworld, Triangle | ||
0x4827 to 0x4853 = Overworld, Triangle | 0x4854 to 0x489A = Overworld, Pulse-1 | ||
0x4854 to 0x489A = Overworld, Pulse-1 | 0x489B to 0x492C = Caverns #1-8, Pulse-1 | ||
0x489B to 0x492C = Caverns #1-8, Pulse-1 | 0x492D to 0x49B8 = Cavern #1, Triangle | ||
0x492D to 0x49B8 = Cavern #1, Triangle | 0x4934 to 0x49B8 = Cavern #2, Triangle | ||
0x4934 to 0x49B8 = Cavern #2, Triangle | 0x493B to 0x49B8 = Cavern #3, Triangle | ||
0x493B to 0x49B8 = Cavern #3, Triangle | 0x4942 to 0x49B8 = Cavern #4, Triangle | ||
0x4942 to 0x49B8 = Cavern #4, Triangle | 0x4947 to 0x49B8 = Cavern #5, Triangle | ||
0x4947 to 0x49B8 = Cavern #5, Triangle | 0x494E to 0x49B8 = Cavern #6, Triangle | ||
0x494E to 0x49B8 = Cavern #6, Triangle | 0x4955 to 0x49B8 = Cavern #7, Triangle | ||
0x4955 to 0x49B8 = Cavern #7, Triangle | 0x495C to 0x49B8 = Cavern #8, Triangle | ||
0x495C to 0x49B8 = Cavern #8, Triangle | 0x49B9 to 0x4ADE = Battle Theme, Pulse-1 | ||
0x49B9 to 0x4ADE = Battle Theme, Pulse-1 | 0x49CF to 0x4ADE = Battle Theme (sans intro), Pulse-1 | ||
0x49CF to 0x4ADE = Battle Theme (sans intro), Pulse-1 | 0x4ADF to 0x4B71 = Battle Theme, Triangle | ||
0x4ADF to 0x4B71 = Battle Theme, Triangle | 0x4AF1 to 0x4B71 = Battle Theme (sans intro), Triangle | ||
0x4AF1 to 0x4B71 = Battle Theme (sans intro), Triangle | 0x4B72 to 0x4BF5 = Final Battle, Pulse-1 | ||
0x4B72 to 0x4BF5 = Final Battle, Pulse-1 | 0x4BF6 to 0x4C29 = Final Battle, Pulse-2 | ||
0x4BF6 to 0x4C29 = Final Battle, Pulse-2 | 0x4C2A to 0x4C4D = Final Battle, Triangle | ||
0x4C2A to 0x4C4D = Final Battle, Triangle | 0x4C4E to 0x4CA9 = Silver Harp, Pulse-2 | ||
0x4C4E to 0x4CA9 = Silver Harp, Pulse-2 | 0x4C4F to 0x4CA9 = Silver Harp, Pulse-2 | ||
0x4C4F to 0x4CA9 = Silver Harp, Pulse-2 | 0x4CAA to 0x4CF0 = Fairy Flute, Triangle | ||
0x4CAA to 0x4CF0 = Fairy Flute, Triangle | 0x4CF1 to 0x4D32 = Rainbow Drop, Pulse-2 | ||
0x4CF1 to 0x4D32 = Rainbow Drop, Pulse-2 | 0x4CF2 to 0x4D32 = Rainbow Drop, Pulse-1 | ||
0x4CF2 to 0x4D32 = Rainbow Drop, Pulse-1 | 0x4D33 to 0x4D59 = "Thou Art Dead", Pulse-2 | ||
0x4D33 to 0x4D59 = "Thou Art Dead", Pulse-2 | 0x4D34 to 0x4D59 = "Thou Art Dead", Pulse-1 | ||
0x4D34 to 0x4D59 = "Thou Art Dead", Pulse-1 | 0x4D5A to 0x4D7C = Cursed!, Pulse-2 | ||
0x4D5A to 0x4D7C = Cursed!, Pulse-2 | 0x4D5B to 0x4D7C = Cursed!, Pulse-1 | ||
0x4D5B to 0x4D7C = Cursed!, Pulse-1 | 0x4D7D to 0x4E4C = Title Theme, Pulse-1 | ||
0x4D7D to 0x4E4C = Title Theme, Pulse-1 | 0x4E4D to 0x4F15 = Title Theme, Pulse-2 | ||
0x4E4D to 0x4F15 = Title Theme, Pulse-2 | 0x4F16 to 0x4F71 = Title Theme, Triangle | ||
0x4F16 to 0x4F71 = Title Theme, Triangle | 0x4F72 to 0x50C1 = Ending Theme, Pulse-1 | ||
0x4F72 to 0x50C1 = Ending Theme, Pulse-1 | 0x50C2 to 0x523D = Ending Theme, Pulse-2 | ||
0x50C2 to 0x523D = Ending Theme, Pulse-2 | 0x523E to 0x5363 = Ending Theme, Triangle | ||
0x523E to 0x5363 = Ending Theme, Triangle | |||
==Text== | |||
0x03DDC to 0x03FD9 = Title Screen data (See [[#Title_Screen_End_Credits_Data_Format|Title Screen / End Credits Data Format]]) | |||
0x0549D to 0x0595E = End Credits | |||
0x05DDD to 0x05E58 = Chest data (See [[#Chest_Data_Format|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|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== | ==Other== | ||
0x01C9F to 0x01D62 = Graphic layout data for the overworld fight background | |||
0x01C9F to 0x01D62 = Graphic layout data for the overworld fight background | 0x01D63 to 0x01D6C = MP Requirements for the ten Magic Spells | ||
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) | ||
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 | ||
{{note| | |||
from the start of the row. It can't be viewed simply by working out the RLE runs.}} | from the start of the row. It can't be viewed simply by working out the RLE runs.}} | ||
0x031BE to 0x031DB = [[Dragon Warrior:Music Pointers|Music Pointers]] (See [[#Song_Bytes|Song Bytes]]) | |||
0x031BE to 0x031DB = [[ | |||
0x0F3D8 to 0x0F471 = Warp data (Stairs Down) | 0x0F3D8 to 0x0F471 = Warp data (Stairs Down) | ||
0x0F472 to 0x0F50B = Warp data (Stairs Up) | 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== | |||
===<span id="Metadata_Format"></span>Metadata Format=== | |||
Metadata entries are {{hex|5}} bytes long: | Metadata entries are {{hex|5}} bytes long: | ||
01 = Pointer to map data | |||
01 to 02 = Pointer to map data | 02 = Pointer to map data | ||
03 = X size | 03 = X size | ||
04 = Y size | 04 = Y size | ||
05 = Border tile | 05 = Border tile | ||
=== | ===<span id="Song_Bytes"></span>Song Bytes=== | ||
Song bytes are in the same order as maps. | Song bytes are in the same order as maps. | ||
(Byte {{hex|1}} plays for map 1, byte {{hex|2}} plays for map 2, etc.) | (Byte {{hex|1}} plays for map 1, byte {{hex|2}} plays for map 2, etc.) | ||
00 = Nothing | |||
00 = Nothing | 01 = Title Fanfare | ||
01 = Title Fanfare | 02 = Throne Room | ||
02 = Throne Room | 03 = Castle | ||
03 = Castle | 04 = Town | ||
04 = Town | 05 = Overworld | ||
05 = Overworld | 06 = Cave 1 | ||
06 = Cave 1 | 07 = Cave 2 | ||
07 = Cave 2 | 08 = Cave 3 | ||
08 = Cave 3 | 09 = Cave 4 | ||
09 = Cave 4 | 0A = Cave 5 | ||
0A = Cave 5 | 0B = Cave 6 | ||
0B = Cave 6 | 0C = Cave 7 | ||
0C = Cave 7 | 0D = Cave 8 | ||
0D = Cave 8 | 0E = Battle | ||
0E = Battle | 0F = Dragonlord | ||
0F = Dragonlord | 10 = End Theme | ||
10 = End Theme | 11 = Silver Harp | ||
11 = Silver Harp | 12 = Fairy Flute | ||
12 = Fairy Flute | 13 = Rainbow Drop | ||
13 = Rainbow Drop | 14 = Death | ||
14 = Death | 15 = Inn Rest | ||
15 = Inn Rest | 16 = Princess Gwaelin | ||
16 = Princess Gwaelin | 17 = Curse | ||
17 = Curse | 18 = Battle (without intro) | ||
18 = Battle (without intro) | 19 = Victory | ||
19 = Victory | 1A = Level Up | ||
1A = Level Up | |||
</ | ===<span id="Title_Screen_End_Credits_Data_Format"></span>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 {{hex|F7}} takes 2 byte parameters (let's call them A and B) and means "repeat byte B A times" so e.g. {{hex|F7 08 05}} results in writing {{hex|05 05 05 05 05 05 05 05}} to the PPU. | |||
=== | |||
===<span id="Chest_Data_Format"></span>Chest Data Format=== | |||
Chest data entries are {{hex|5}} bytes long: | Chest data entries are {{hex|5}} bytes long: | ||
01 = Map number | |||
01 = Map number | 02 = X coordinate | ||
02 = X coordinate | 03 = Y coordinate | ||
03 = Y coordinate | 04 = Chest contents | ||
04 = Chest contents | |||
</ | ===<span id="Menu_Format"></span>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}} | |||
{{Internal Data |
Latest revision as of 04:57, 18 April 2024
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
| |
---|---|