Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

Dragon Warrior/ROM map: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
(→‎Other: added details abut map offsets)
m (simplified template declarations)
 
(16 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{rommap|game=Dragon Warrior}}
{{rommap}}
 
==Miscellaneous==
==Miscellany==
0x00000 to 0x0000F = iNES header
<pre>
0x0002A to 0x000C0 = Map metadata (See [[#Metadata_Format|Metadata Format]])
    0 to     F = iNES header
 
  2A to   C0 = Map metadata (See Note 1)
</pre>


==Maps==
==Maps==
===Castles===
===Castles===
<pre>
0x000C1 to 0x00188 = Charlock Castle
  C1 to   188 = Charlock Castle
0x00189 to 0x00250 = Hauksness Ruins
  189 to   250 = Hauksness Ruins
0x00251 to 0x00412 = Tantegel Castle
  251 to   412 = Tantegel Castle
0x00413 to 0x00444 = Tantegel Throne Room
  413 to   444 = Tantegel Throne Room
0x00445 to 0x00606 = Dragonlord's Throne Room
  445 to   606 = Dragonlord's Throne Room
</pre>


===Towns===
===Towns===
<pre>
0x00607 to 0x00726 = Kol
  607 to   726 = Kol
0x00727 to 0x008E8 = Brecconary
  727 to   8E8 = Brecconary
0x008E9 to 0x00AAA = Cantlin
  8E9 to   AAA = Cantlin
0x00AAB to 0x00B72 = Garinham
  AAB to   B72 = Garinham
0x00B73 to 0x00D34 = Rimuldar
  B73 to   D34 = Rimuldar
</pre>


===Shrines===
===Shrines===
<pre>
0x00D35 to 0x00D66 = Sunlight Shrine
  D35 to   D66 = Sunlight Shrine
0x00D67 to 0x00D98 = Rain Shrine
  D67 to   D98 = Rain Shrine
0x00D99 to 0x00DCA = Rainbow Shrine
  D99 to   DCA = Rainbow Shrine
</pre>


===Dragonlord Cavern===
===Dragonlord Cavern===
<pre>
0x00DCB to 0x00E92 = Dragonlord Cavern B1
  DCB to   E92 = Dragonlord Cavern B1
0x00E93 to 0x00EC4 = Dragonlord Cavern B2
  E93 to   EC4 = Dragonlord Cavern B2
0x00EC5 to 0x00EF6 = Dragonlord Cavern B3
  EC5 to   EF6 = Dragonlord Cavern B3
0x00EF7 to 0x00F28 = Dragonlord Cavern B4
  EF7 to   F28 = Dragonlord Cavern B4
0x00F29 to 0x00F5A = Dragonlord Cavern B5
  F29 to   F5A = Dragonlord Cavern B5
0x00F5B to 0x00F8C = Dragonlord Cavern B6
  F5B to   F8C = Dragonlord Cavern B6
</pre>


===Other Caves===
===Other Caves===
<pre>
0x00F8D to 0x00FE6 = Rimuldar Passage
  F8D to   FE6 = Rimuldar Passage
0x00FE7 to 0x01048 = Cave west of Tantegel B1
  FE7 to 1048 = Cave west of Tantegel B1
  0x01049 to 0x010AA = Cave west of Tantegel B2
  1049 to 10AA = Cave west of Tantegel B2
  0x010AB to 0x01172 = Garin's Grave B1
  10AB to 1172 = Garin's Grave B1
  0x01173 to 0x0123A = Garin's Grave B3
  1173 to 123A = Garin's Grave B3
  0x0123B to 0x0136C = Garin's Grave B4
  123B to 136C = Garin's Grave B4
  0x0126D to 0x012C0 = Garin's Grave B2
  126D to 12C0 = Garin's Grave B2
  0x012C1 to 0x012F2 = Erdrick's Cave B1
  12C1 to 12F2 = Erdrick's Cave B1
  0x012F3 to 0x01324 = Erdrick's Cave B2
  12F3 to 1324 = Erdrick's Cave B2
</pre>


==Music Data==
==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|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


{| border="1" cellpadding="1"
!From !! To !! Description
|-
|44DB || 44DD || Silence, Pulse-1 & Pulse-2
|-
|44DE || 44E2 || Silence, Triangle
|-
|44E3 || 454D || Throne Room, Pulse-1
|-
|454E || 45B9 || Throne Room, Triangle
|-
|45BA || 45C3 || Courtyard, Pulse-1
|-
|45C4 || 4639 || Courtyard, Triangle
|-
|463A || 464F || Level-Up, Pulse-1
|-
|4650 || 4662 || Level-Up, Pulse-2
|-
|4663 || 468A || Gwaelin's Love, Pulse-1
|-
|468B || 46BB || Gwaelin's Love, Pulse-2
|-
|46BD || 46DB || Gwaelin's Love, Triangle
|-
|46DC || 46FA || Inn, Pulse-1
|-
|46FB || 4716 || Inn, Pulse-2
|-
|4717 || 471D || Battle Over, Pulse-2
|-
|471E || 473E || Battle Over, Pulse-1
|-
|473F || 47B1 || Town, Pulse-1
|-
|47B2 || 4826 || Town, Triangle
|-
|4827 || 4853 || Overworld, Triangle
|-
|4854 || 489A || Overworld, Pulse-1
|-
|489B || 492C || Caverns #1-8, Pulse-1
|-
|492D || 49B8 || Cavern #1, Triangle
|-
|4934 || 49B8 || Cavern #2, Triangle
|-
|493B || 49B8 || Cavern #3, Triangle
|-
|4942 || 49B8 || Cavern #4, Triangle
|-
|4947 || 49B8 || Cavern #5, Triangle
|-
|494E || 49B8 || Cavern #6, Triangle
|-
|4955 || 49B8 || Cavern #7, Triangle
|-
|495C || 49B8 || Cavern #8, Triangle
|-
|49B9 || 4ADE || Battle Theme, Pulse-1
|-
|49CF || 4ADE || Battle Theme (sans intro), Pulse-1
|-
|4ADF || 4B71 || Battle Theme, Triangle
|-
|4AF1 || 4B71 || Battle Theme (sans intro), Triangle
|-
|4B72 || 4BF5 || Final Battle, Pulse-1
|-
|4BF6 || 4C29 || Final Battle, Pulse-2
|-
|4C2A || 4C4D || Final Battle, Triangle
|-
|4C4E || 4CA9 || Silver Harp, Pulse-2
|-
|4C4F || 4CA9 || Silver Harp, Pulse-2
|-
|4CAA || 4CF0 || Fairy Flute, Triangle
|-
|4CF1 || 4D32 || Rainbow Drop, Pulse-2
|-
|4CF2 || 4D32 || Rainbow Drop, Pulse-1
|-
|4D33 || 4D59 || "Thou Art Dead", Pulse-2
|-
|4D34 || 4D59 || "Thou Art Dead", Pulse-1
|-
|4D5A || 4D7C || Cursed!, Pulse-2
|-
|4D5B || 4D7C || Cursed!, Pulse-1
|-
|4D7D || 4E4C || Title Theme, Pulse-1
|-
|4E4D || 4F15 || Title Theme, Pulse-2
|-
|4F16 || 4F71 || Title Theme, Triangle
|-
|4F72 || 50C1 || Ending Theme, Pulse-1
|-
|50C2 || 523D || Ending Theme, Pulse-2
|-
|523E || 5363 || Ending Theme, Triangle
|}
==Other==
==Other==
<pre>
  0x01C9F to 0x01D62 = Graphic layout data for the overworld fight background
  1C9F to 1D62 = Graphic layout data for the overworld fight background
  0x01D63 to 0x01D6C = MP Requirements for the ten Magic Spells
  1D63 to  2662 = Overworld map (RLE encoded by nibbles, 1st nibble is tile, 2nd how many)
  0x01D6D to 0x02662 = Overworld map (RLE encoded by nibbles, 1st nibble is tile, 2nd how many - 1)
</pre>
{{note|The overworld map uses a strange system of pointers/auto-adjusts for offsetting the land
note: 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.}}
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]])
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.}}


31BE to  31DB = [[Dragon_Warrior:Music_Pointers|Music Pointers]] (See Note 2)
==Graphics==
<pre>
===Sprite Tile Definitions===
3F30 to  3FB8 = Title screen data
Tile definitions for Townspeople/Hero Sprites: 0x1344


549F to  58D9 = Ending text
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.


5DDD to  5E58 = Chest data (See Note 3)
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)


6FC7 to 752B = Menu text
Multiply sprite number by 8 and add to base address 0x1344.


7AC0 to  7EAD = Item, enemy, and spell menu text
For example, Tile Definitions for "Hero (Sword + Shield) facing Down" = 0x1344 + 8 * (0x16 + 0x40) = 0x15F4


8039 to  BCBA = Dialogue text
Gwaelin and Dragonlord normally do not face left, so they have glitched data in there.


  F3D8 to  F471 = Warp data (Stairs Down)
==Data Formats==
  F472 to F50B = Warp data (Stairs Up)
===<span id="Metadata_Format"></span>Metadata Format===
Metadata entries are {{hex|5}} bytes long:
  01 = Pointer to map data
  02 = Pointer to map data
  03 = X size
04 = Y size
  05 = Border tile


10110 to 13FFF = Game graphics
===<span id="Song_Bytes"></span>Song Bytes===
</pre>
Song bytes are in the same order as maps.
(Byte {{hex|1}} plays for map 1, byte {{hex|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


==Notes==
===<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]


===Note 1===
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.
Metadata entries are five bytes long:
<pre>
01 to 02 = Pointer to map data
      03 = X size
      04 = Y size
      05 = Border tile
</pre>


===Note 2===
Song bytes are in the same order as maps.
(Byte 1 plays for map 1, byte 2 plays for map 2, etc.)
<pre>
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
</pre>


===Note 3===
===<span id="Chest_Data_Format"></span>Chest Data Format===
Chest data entries are five bytes long:
Chest data entries are {{hex|5}} bytes long:
<pre>
01 = Map number
01 = Map number
02 = X coordinate
02 = X coordinate
03 = Y coordinate
03 = Y coordinate
04 = Chest contents
04 = Chest contents
 
</pre>
===<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}}

Latest revision as of 04:57, 18 April 2024

Chip tiny.png 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 for template.png
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 for template.png
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 for template.png
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!