Dragon Quest III (SNES)/ROM map

From Data Crystal
< Dragon Quest III (SNES)
Revision as of 21:16, 8 August 2023 by Ansarya (talk | contribs) (→‎Monsters: Added all the monster name locations, will extract later)
Jump to navigation Jump to search

Chip tiny.png The following article is a ROM map for Dragon Quest III (SNES).

Main

For now, these are rom file addresses

Category Address Size Description
Levels $0417ad - $0418d2 98 longs (294 bytes) Soldier's experience required per level, first value is to reach level 2
??? $0418d3 - $04191f $4d bytes ???
Levels $041920 - $041a45 98 longs (294 bytes) Fighter's experience required per level, first value is to reach level 2
??? $041a46 - $041a92 $4d bytes ???
Levels $041a93 - $041bb8 98 longs (294 bytes) Wizard's experience required per level, first value is to reach level 2
??? $041bb9 - $041c05 $4d bytes ???
Levels $041c06 - $041d2b 98 longs (294 bytes) Pilgrim's experience required per level, first value is to reach level 2
??? $041d2c - $041d78 $4d bytes ???
Levels $041d79 - $041e9e 98 longs (294 bytes) Merchant's experience required per level, first value is to reach level 2
??? $041e9f - $041eeb $4d bytes ???
Levels $041eec - $042011 98 longs (294 bytes) GoofOff's experience required per level, first value is to reach level 2
??? $042012 - $04205e $4d bytes ???
Levels $04205f - $042184 98 longs (294 bytes) Thief's experience required per level, first value is to reach level 2
??? $042185 - $0421d1 $4d bytes ???
Levels $0421d2 - $0422f7 98 longs (294 bytes) Sage's experience required per level, first value is to reach level 2
??? $0422f8 - $042344 $4d bytes ???
Levels $042345 - $04246a 98 longs (294 bytes) Hero's experience required per level, first value is to reach level 2
??? $04246b - $0424b7 $4d bytes ???

Monsters

For now, these are rom file addresses. Placeholder for much more complete monster info. The data will be moved out and a more general explanation will be added.

Category Address Size Description
Stats $020028 - $020029 word Monster #01 - Slime (スライム) - experience points gained: 4
Names $3ed958 - $3ed95c 5 bytes Monster #01 - Slime (スライム) 4F 69 44 63 AC
Names $3ed95d - $3ed962 6 bytes Monster #02 - Big Crow (おおがらす) 10 10 C9 32 18 AC
Names $3ed963 - $3ed96a 8 bytes Monster #03 - Pointed Rabbit (いっかくうさぎ) 0D 3F 11 13 0E 16 CA AC
Names $3ed96b - $3ed971 7 bytes Monster #04 - Large Anteater (おおありくい) 10 10 0C 33 13 0D AC
Names $3ed972 - $3ed979 8 bytes Monster #05 - Human Face Butterfly (じんめんちょう) CF 39 2D 39 1C 42 0E AC
Names $3ed97a - $3ed97f 6 bytes Monster #06 - Frogger (フロッガー) 5E 6D 76 DE 7D AC
Names $3ed980 - $3ed987 8 bytes Monster #07 - Bubble Slime (バブルスライム) ED EF 6B 4F 69 44 63 AC
Names $3ed988 - $3ed98e 7 bytes Monster #08 - Magician (まほうつかい) 2A 29 0E 1D 11 0D AC
Names $3ed98f - $3ed994 6 bytes Monster #09 - Scorpion Wasp (さそりばち) 16 1A 33 D8 1C AC
Names $3ed995 - $3ed99c 8 bytes Monster #0a - Hoimi Slime (ホイミスライム) 60 44 62 4F 69 44 63 AC
Names $3ed99d - $3ed9a4 8 bytes Monster #0b - Ghost Anteater (おばけありくい) 10 D8 14 0C 33 13 0D AC
Names $3ed9a5 - $3ed9ab 7 bytes Monster #0c - Almirage (アルミラージ) 43 6B 62 69 7D E4 AC
Names $3ed9ac - $3ed9b3 8 bytes Monster #0d - Poison Toad (ポイズントード) FB 44 E5 70 56 7D EC AC
Names $3ed9b4 - $3ed9ba 7 bytes Monster #0e - Caterpillar (キャタピラー) 49 77 52 F8 69 7D AC
Names $3ed9bb - $3ed9c2 8 bytes Monster #0f - Bat Man (こうもりおとこ) 15 0E 2E 33 10 1F 15 AC
Names $3ed9c3 - $3ed9ca 8 bytes Monster #10 - Animal Zombie (アニマルゾンビ) 43 58 61 6B E7 70 EE AC
Names $3ed9cb - $3ed9d0 6 bytes Monster #11 - Killer Bee (キラービー) 49 69 7D EE 7D AC
Names $3ed9d1 - $3ed9d7 7 bytes Monster #12 - - Unknown - (ぐんたいガニ) CB 39 1B 0D DE 58 AC
Names $3ed9d8 - $3ed9db 4 bytes Monster #13 - Gizmo (ギズモ) DF E5 65 AC
Names $3ed9dc - $3ed9e2 7 bytes Monster #14 - - Unknown - (おばけキノコ) 10 D8 14 49 5B 4C AC
Names $3ed9e3 - $3ed9e9 7 bytes Monster #15 - - Unknown - (どくイモムシ) D7 13 44 65 63 4E AC
Names $3ed9ea - $3ed9f1 8 bytes Monster #16 - Death Flatter (デスフラッター) EB 4F 5E 69 76 52 7D AC
Names $3ed9f2 - $3ed9f9 8 bytes Monster #17 - Bariaid Dog (バリイドドッグ) ED 6A 44 EC EC 76 E0 AC
Names $3ed9fa - $3ed9fe 5 bytes Monster #18 - Matango (マタンゴ) 61 52 70 E2 AC
Names $3ed9ff - $3eda05 7 bytes Monster #19 - Suspicious Silhouette (あやしいかげ) 0C 2F 17 0D 11 CC AC
Names $3eda06 - $3eda0b 6 bytes Monster #1a - Vampire (バンパイア) ED 70 F7 44 43 AC
Names $3eda0c - $3eda11 6 bytes Monster #1b - Cannibal Moth (ひとくいが) 26 1F 13 0D C9 AC
Names $3eda12 - $3eda19 8 bytes Monster #1c - Roaming Armor (さまようよろい) 16 2A 31 0E 31 36 0D AC
Names $3eda1a - $3eda21 8 bytes Monster #1d - Cat Fly (キャットフライ) 49 77 76 56 5E 69 44 AC
Names $3eda22 - $3eda28 7 bytes Monster #1e - - Unknown - (だいおうガマ) D3 0D 10 0E DE 61 AC
Names $3eda29 - $3eda2e 6 bytes Monster #1f - - Unknown - (あばれザル) 0C D8 35 E3 6B AC
Names $3eda2f - $3eda35 7 bytes Monster #20 - Laughing Sack (わらいぶくろ) 37 32 0D DA 13 36 AC
Names $3eda36 - $3eda3c 7 bytes Monster #21 - - Unknown - (ミイラおとこ) 62 44 69 10 1F 15 AC
Names $3eda3d - $3eda44 8 bytes Monster #22 - - Unknown - (じごくのハサミ) CF CD 13 24 5C 4D 62 AC
Names $3eda45 - $3eda49 5 bytes Monster #23 - Druid (ドルイド) EC 6B 44 EC AC
Names $3eda4a - $3eda50 7 bytes Monster #24 - - Unknown - (かえんムカデ) 11 0F 39 63 48 EB AC
Names $3eda51 - $3eda54 4 bytes Monster #25 - Mummy (マミー) 61 62 7D AC
Names $3eda55 - $3eda5c 8 bytes Monster #26 - Mage Matango (マージマタンゴ) 61 7D E4 61 52 70 E2 AC
Names $3eda5d - $3eda64 8 bytes Monster #27 - Hunter Fly (ハンターフライ) 5C 70 52 7D 5E 69 44 AC
Names $3eda65 - $3eda6c 8 bytes Monster #28 - Death Jackal (デスジャッカル) EB 4F E4 77 76 48 6B AC
Names $3eda6d - $3eda73 7 bytes Monster #29 - Witchcraft Expert (げんじゅつし) CC 39 CF 41 1D 17 AC
Names $3eda74 - $3eda7a 7 bytes Monster #2a - Heat Gizmo (ヒートギズモ) 5D 7D 56 DF E5 65 AC
Names $3eda7b - $3eda80 6 bytes Monster #2b - Ant Bear (アントベア) 43 70 56 F0 43 AC
Names $3eda81 - $3eda88 8 bytes Monster #2c - Behoma Slime (ベホマスライム) F0 60 61 4F 69 44 63 AC
Names $3eda89 - $3eda90 8 bytes Monster #2d - Mad Ox (マッドオックス) 61 76 EC 47 76 4A 4F AC
Names $3eda91 - $3eda98 8 bytes Monster #2e - Cat Bat (キャットバット) 49 77 76 56 ED 76 56 AC
Names $3eda99 - $3eda9f 7 bytes Monster #2f - Evil Mage (エビルマージ) 46 EE 6B 61 7D E4 AC
Names $3edaa0 - $3edaa6 7 bytes Monster #30 - Killer Ape (キラーエイプ) 49 69 7D 46 44 F9 AC
Names $3edaa7 - $3edaab 5 bytes Monster #31 - Garuda (ガルーダ) DE 6B 7D E8 AC
Names $3edaac - $3edab3 8 bytes Monster #32 - Metal Slime (メタルスライム) 64 52 6B 4F 69 44 63 AC
Names $3edab4 - $3edab9 6 bytes Monster #33 - Goat Don (ゴートドン) E2 7D 56 EC 70 AC
Names $3edaba - $3edabf 6 bytes Monster #34 - Devilish Murderer (さつじんき) 16 1D CF 39 12 AC
Names $3edac0 - $3edac6 7 bytes Monster #35 - Baby Satan (ベビーサタン) F0 EE 7D 4D 52 70 AC
Names $3edac7 - $3edacd 7 bytes Monster #36 - Devil Mask Sorceror (きめんどうし) 12 2D 39 D7 0E 17 AC
Names $3edace - $3edad4 7 bytes Monster #37 - Cannibal Box (ひとくいばこ) 26 1F 13 0D D8 15 AC
Names $3edad5 - $3edadc 8 bytes Monster #38 - Eliminator (エリミネーター) 46 6A 62 5A 7D 52 7D AC
Names $3edadd - $3edae3 7 bytes Monster #39 - Large Beak (おおくちばし) 10 10 13 1C D8 17 AC
Names $3edae4 - $3edaeb 8 bytes Monster #3a - - Unknown - (スライムつむり) 4F 69 44 63 1D 2C 33 AC
Names $3edaec - $3edaf3 8 bytes Monster #3b - Sky Dragon (スカイドラゴン) 4F 48 44 EC 69 E2 70 AC
Names $3edaf4 - $3edaf9 6 bytes Monster #3c - Barnabas (バーナバス) ED 7D 57 ED 4F AC
Names $3edafa - $3edafd 4 bytes Monster #3d - Witch (まじょ) 2A CF 42 AC
Names $3edafe - $3edb05 8 bytes Monster #3e - Dead Pecker (デッドペッカー) EB 76 EC FA 76 48 7D AC
Names $3edb06 - $3edb0d 8 bytes Monster #3f - Hell Armor (じごくのよろい) CF CD 13 24 31 36 0D AC
Names $3edb0e - $3edb15 8 bytes Monster #40 - Marine Slime (マリンスライム) 61 6A 70 4F 69 44 63 AC
Names $3edb16 - $3edb1c 7 bytes Monster #41 - Numb Jellyfish (しびれくらげ) 17 D9 35 13 32 CC AC
Names $3edb1d - $3edb21 5 bytes Monster #42 - Merman (マーマン) 61 7D 61 70 AC
Names $3edb22 - $3edb28 7 bytes Monster #43 - - Unknown - (だいおうイカ) D3 0D 10 0E 44 48 AC
Names $3edb29 - $3edb2d 5 bytes Monster #44 - Ganiras (ガニラス) DE 58 69 4F AC
Names $3edb2e - $3edb35 8 bytes Monster #45 - Merman Dyne (マーマンダイン) 61 7D 61 70 E8 44 70 AC
Names $3edb36 - $3edb3c 7 bytes Monster #46 - Hell Condor (ヘルコンドル) 5F 6B 4C 70 EC 6B AC
Names $3edb3d - $3edb43 7 bytes Monster #47 - Overpowering Bear (ごうけつぐま) CD 0E 14 1D CB 2A AC
Names $3edb44 - $3edb4b 8 bytes Monster #48 - Rotten Corpse (くさったしたい) 13 16 3F 1B 17 1B 0D AC
Names $3edb4c - $3edb52 7 bytes Monster #49 - Big Horn (ビッグホーン) EE 76 E0 60 7D 70 AC
Names $3edb53 - $3edb59 7 bytes Monster #4a - Paralysis Swallowtail (しびれあげは) 17 D9 35 0C CC 25 AC
Names $3edb5a - $3edb61 8 bytes Monster #4b - - Unknown - (どくどくゾンビ) D7 13 D7 13 E7 70 EE AC
Names $3edb62 - $3edb67 6 bytes Monster #4c - Akairai (アカイライ) 43 48 44 69 44 AC
Names $3edb68 - $3edb6f 8 bytes Monster #4d - Killer Armor (キラーアーマー) 49 69 7D 43 7D 61 7D AC
Names $3edb70 - $3edb77 8 bytes Monster #4e - Death Stalker (デスストーカー) EB 4F 4F 56 7D 48 7D AC
Names $3edb78 - $3edb7f 8 bytes Monster #4f - Lava Devil (ようがんまじん) 31 0E C9 39 2A CF 39 AC
Names $3edb80 - $3edb85 6 bytes Monster #50 - Shaman (シャーマン) 4E 77 7D 61 70 AC
Names $3edb86 - $3edb8c 7 bytes Monster #51 - Magic Hag (まほうおばば) 2A 29 0E 10 D8 D8 AC
Names $3edb8d - $3edb91 5 bytes Monster #52 - Shadow (シャドー) 4E 77 EC 7D AC
Names $3edb92 - $3edb99 8 bytes Monster #53 - Glacier Devil (ひょうがまじん) 26 42 0E C9 2A CF 39 AC
Names $3edb9a - $3edb9d 4 bytes Monster #54 - Chimera (キメラ) 49 64 69 AC
Names $3edb9e - $3edba1 4 bytes Monster #55 - Kong (コング) 4C 70 E0 AC
Names $3edba2 - $3edba6 5 bytes Monster #56 - Gamegon (ガメゴン) DE 64 E2 70 AC
Names $3edba7 - $3edbae 8 bytes Monster #57 - Bird of Paradise (ごくらくちょう) CD 13 32 13 1C 42 0E AC
Names $3edbaf - $3edbb5 7 bytes Monster #58 - Bomb Rock (ばくだんいわ) D8 13 D3 39 0D 37 AC
Names $3edbb6 - $3edbbb 6 bytes Monster #59 - Grizzly (グリズリー) E0 6A E5 6A 7D AC
Names $3edbbc - $3edbc3 8 bytes Monster #5a - Zombie Master (ゾンビマスター) E7 70 EE 61 4F 52 7D AC
Names $3edbc4 - $3edbcb 8 bytes Monster #5b - Gamegon Lord (ガメゴンロード) DE 64 E2 70 6D 7D EC AC
Names $3edbcc - $3edbd3 8 bytes Monster #5c - Snow Dragon (スノードラゴン) 4F 5B 7D EC 69 E2 70 AC
Names $3edbd4 - $3edbd7 4 bytes Monster #5d - Troll (トロル) 56 6D 6B AC
Names $3edbd8 - $3edbdf 8 bytes Monster #5e - Frost Gizmo (フロストギズモ) 5E 6D 4F 56 DF E5 65 AC
Names $3edbe0 - $3edbe7 8 bytes Monster #5f - Dancing Jewel (おどるほうせき) 10 D7 34 29 0E 19 12 AC
Names $3edbe8 - $3edbee 7 bytes Monster #60 - Mini Demon (ミニデーモン) 62 58 EB 7D 65 70 AC
Names $3edbef - $3edbf5 7 bytes Monster #61 - Tentacles (テンタクルス) 55 70 52 4A 6B 4F AC
Names $3edbf6 - $3edbfd 8 bytes Monster #62 - Skeleton Swordsman (がいこつけんし) C9 0D 15 1D 14 39 17 AC
Names $3edbfe - $3edc02 5 bytes Monster #63 - Mimic (ミミック) 62 62 76 4A AC
Names $3edc03 - $3edc09 7 bytes Monster #64 - Knight of Hell (じごくのきし) CF CD 13 24 12 17 AC
Names $3edc0a - $3edc10 7 bytes Monster #65 - Horror Ghost (ホロゴースト) 60 6D E2 7D 4F 56 AC
Names $3edc11 - $3edc18 8 bytes Monster #66 - Mythical Serpent of Eight Heads (やまたのおろち) 2F 2A 1B 24 10 36 1C AC
Names $3edc19 - $3edc20 8 bytes Monster #67 - Moving Stone Statue (うごくせきぞう) 0E CD 13 19 12 D2 0E AC
Names $3edc21 - $3edc27 7 bytes Monster #68 - Salamander (サラマンダー) 4D 69 61 70 E8 7D AC
Names $3edc28 - $3edc2e 7 bytes Monster #69 - Slime Bess (スライムベス) 4F 69 44 63 F0 4F AC
Names $3edc2f - $3edc34 6 bytes Monster #6a - Mud Hand (マドハンド) 61 EC 5C 70 EC AC
Names $3edc35 - $3edc3b 7 bytes Monster #6b - - Unknown - (まおうのかげ) 2A 10 0E 24 11 CC AC
Names $3edc3c - $3edc42 7 bytes Monster #6c - Macro Beta (マクロベータ) 61 4A 6D F0 7D 52 AC
Names $3edc43 - $3edc49 7 bytes Monster #6d - - Unknown - (はぐれメタル) 25 CB 35 64 52 6B AC
Names $3edc4a - $3edc4d 4 bytes Monster #6e - Ghoul (グール) E0 7D 6B AC
Names $3edc4e - $3edc55 8 bytes Monster #6f - Lion Head (ライオンヘッド) 69 44 47 70 5F 76 EC AC
Names $3edc56 - $3edc5c 7 bytes Monster #70 - - Unknown - (ボストロール) F1 4F 56 6D 7D 6B AC
Names $3edc5d - $3edc63 7 bytes Monster #71 - Gold Man (ゴールドマン) E2 7D 6B EC 61 70 AC
Names $3edc64 - $3edc69 6 bytes Monster #72 - Skull Gon (スカルゴン) 4F 48 6B E2 70 AC
Names $3edc6a - $3edc71 8 bytes Monster #73 - King Merman (キングマーマン) 49 70 E0 61 7D 61 70 AC
Names $3edc72 - $3edc77 6 bytes Monster #74 - Kragon (クラーゴン) 4A 69 7D E2 70 AC
Names $3edc78 - $3edc7f 8 bytes Monster #75 - Darth Rikanto (ダースリカント) E8 7D 4F 6A 48 70 56 AC
Names $3edc80 - $3edc85 6 bytes Monster #76 - Great Devil (だいまじん) D3 0D 2A CF 39 AC
Names $3edc86 - $3edc8a 5 bytes Monster #77 - Ragon'nu (ラゴンヌ) 69 E2 70 59 AC
Names $3edc8b - $3edc91 7 bytes Monster #78 - Arch Mage (アークマージ) 43 7D 4A 61 7D E4 AC
Names $3edc92 - $3edc98 7 bytes Monster #79 - Mage Chimera (メイジキメラ) 64 44 E4 49 64 69 AC
Names $3edc99 - $3edc9f 7 bytes Monster #7a - Satan Puppy (サタンパピー) 4D 52 70 F7 F8 7D AC
Names $3edca0 - $3edca3 4 bytes Monster #7b - Hydra (ヒドラ) 5D EC 69 AC
Names $3edca4 - $3edcaa 7 bytes Monster #7c - Troll King (トロルキング) 56 6D 6B 49 70 E0 AC
Names $3edcab - $3edcaf 5 bytes Monster #7d - Dragon (ドラゴン) EC 69 E2 70 AC
Names $3edcb0 - $3edcb4 5 bytes Monster #7e - Balrog (バルログ) ED 6B 6D E0 AC
Names $3edcb5 - $3edcbc 8 bytes Monster #7f - Dragon Zombie (ドラゴンゾンビ) EC 69 E2 70 E7 70 EE AC
Names $3edcbd - $3edcc3 7 bytes Monster #80 - Mantgoa (マントゴーア) 61 70 56 E2 7D 43 AC
Names $3edcc4 - $3edcc9 6 bytes Monster #81 - Sword Id (ソードイド) 51 7D EC 44 EC AC
Names $3edcca - $3edcd0 7 bytes Monster #82 - King Hydra (キングヒドラ) 49 70 E0 5D EC 69 AC
Names $3edcd1 - $3edcd8 8 bytes Monster #83 - Baramos Bros (バラモスブロス) ED 69 65 4F EF 6D 4F AC
Names $3edcd9 - $3edce0 8 bytes Monster #84 - Baramos Zombie (バラモスゾンビ) ED 69 65 4F E7 70 EE AC
Names $3edce1 - $3edce5 5 bytes Monster #85 - Baramos (バラモス) ED 69 65 4F AC
Names $3edce6 - $3edce9 4 bytes Monster #86 - Zoma (ゾーマ) E7 7D 61 AC
Names $3edcea - $3edcee 5 bytes Monster #87 - Orutega (オルテガ) 47 6B 55 DE AC
Names $3edcef - $3edcf3 5 bytes Monster #88 - Kandata (カンダタ) 48 70 E8 52 AC
Names $3edcf4 - $3edcfb 8 bytes Monster #89 - - Unknown - (カンダタこぶん) 48 70 E8 52 15 DA 39 AC
Names $3edcfc - $3edd01 6 bytes Monster #8a - Experience Value (けいけんち) 14 0D 14 39 1C AC
Names $3edd02 - $3edd05 4 bytes Monster #8b - Gold (おかね) 10 11 23 AC
Names $3edd06 - $3edd0c 7 bytes Monster #8c - Selection Idiot (せんたくバカ) 19 39 1B 13 ED 48 AC
Names $3edd0d - $3edd15 9 bytes Monster #8d - Selection Human (せんたくにんげん) 19 39 1B 13 21 39 CC 39 AC
Names $3edd16 - $3edd1c 7 bytes Monster #8e - Selection Deity (せんたくかみ) 19 39 1B 13 11 2B AC
Names $3edd1d - $3edd22 6 bytes Monster #8f - - Unknown - (せんたく0) 19 39 1B 13 87 AC
Names $3edd23 - $3edd28 6 bytes Monster #90 - - Unknown - (せんたく1) 19 39 1B 13 88 AC
Names $3edd29 - $3edd2e 6 bytes Monster #91 - - Unknown - (せんたく2) 19 39 1B 13 89 AC
Names $3edd2f - $3edd34 6 bytes Monster #92 - - Unknown - (せんたく3) 19 39 1B 13 8A AC
Names $3edd35 - $3edd39 5 bytes Monster #93 - Phoenix (ほうおう) 29 0E 10 0E AC
Names $3edd3a - $3edd41 8 bytes Monster #94 - Heaven's Gate Watcher (てんのもんばん) 1E 39 24 2E 39 D8 39 AC
Names $3edd42 - $3edd48 7 bytes Monster #95 - Metal Chimera (メタルキメラ) 64 52 6B 49 64 69 AC
Names $3edd49 - $3edd51 9 bytes Monster #96 - Devil Wizard (デビルウィザード) EB EE 6B 45 72 E3 7D EC AC
Names $3edd52 - $3edd58 7 bytes Monster #97 - Killer Crab (キラークラブ) 49 69 7D 4A 69 EF AC
Names $3edd59 - $3edd5f 7 bytes Monster #98 - Dark Troll (ダークトロル) E8 7D 4A 56 6D 6B AC
Names $3edd60 - $3edd67 8 bytes Monster #99 - Demon Sword (デーモンソード) EB 7D 65 70 51 7D EC AC
Names $3edd68 - $3edd6f 8 bytes Monster #9a - Baramos Evil (バラモスエビル) ED 69 65 4F 46 EE 6B AC
Names $3edd70 - $3edd75 6 bytes Monster #9b - God Dragon (しんりゅう) 17 39 33 41 0E AC

Notes

All values given are ROM offsets. They assume that a 512-byte copier header is not present. If there is a header present, you will have to add 512 ($200) to each offset lister here to get the correct offset in the ROM file.

Note that the ROM is mapped into the SNES address space starting at $C00000. Therefore, if you want to use one of these ROM offsets as a breakpoint, you should add $C00000 to it. I've given a few examples below that already do this.

Menu Size Data

Almost every menu has a 16-bit (2-byte) value that determines its starting position (X/Y coordinates) and its width. Menu size data is stored in the following binary format:

%1WWW WWYY YYYX XXXX

  • WWWWW = menu width (not just usable space, this includes the edge characters)
  • YYYYY = vertical tile offset from top of screen
  • XXXXX = horizontal tile offset from left of screen

There is no value to determine the height of a menu. This is done internally by the drawing code for each individual menu.

Like almost everything else on the SNES, this data is in low-endian format. Thus, the YYYX XXXX byte comes first in the ROM, then the 1WWW WWYY byte.

Here are a few menu size values that I have found. Note again that this controls only menu width and position. Menu content string pointers are stored elsewhere.

  • $30348-$30349: Introductory menu (contains Begin a New Quest, Continue Quest, Copy Quest, etc., etc.)
  • $30378-$30379: Change Message Speed menu (opened from introductory menu)
  • $30384-$30385: Mono/Stereo selector menu
  • $30024-$30025: Main walkabout menu (contains Talk, Spell, Item, Search, Status, Tactics)
  • $300FC-$300FD: Gold menu, associated with the main walkabout menu
  • $3036C-$3036D: Change Message Speed menu (opened from Tactics)


What if the menu you want to expand (or contract!) isn't listed above? Here's how to find it.

  • Open the menu you want, and take a screenshot of it. As an example, let's try the gold box that appears when you open the main menu.
  • Open the screenshot in a paint program, and find out the X coordinate, Y coordinate, and width. Remember that these coordinates are in tiles, so you have to find the coordinate (or width) in pixels and then divide that number by 8.
  • Convert these values to hexadecimal and write them down. In this case, our X coordinate is 21 ($15), the Y coordinate is 16 ($10), and the width (including borders) is 9 ($09).
  • Open the ROM in a debugging emulator (I use Geiger's Snes9x debugging version).
  • Prepare things so that it will only take 1 more button press to get into the menu you want.
  • Set an execution breakpoint at $C90717.
  • Open the menu — this should set off the breakpoint.
  • Keep an eye on the A register.
  • You might see something like this as the breakpoint is hit four times (On Geiger Snes9x, hit the "Run" button to get to the next breakpoint).
    • $C9/0717 08 PHP A:0000 X:0000 Y:0015 P:envmxdIZc
    • $C9/0717 08 PHP A:0015 X:0000 Y:0015 P:envmxdIzc
    • $C9/0717 08 PHP A:1015 X:0000 Y:0015 P:envmxdIzc
    • $C9/0717 08 PHP A:0009 X:0000 Y:0015 P:envmxdIzc
  • This is for the gold menu. If you followed the steps above, you should see some familiar information here. Note how on the second iteration, we see the X coordinate in the accumulator, and on the third iteration, we can see both the X *and* Y coordinates in the top and bottom halves. And on the fifth iteration, there is the width.
  • Don't proceed past the fifth iteration (the one where A = menu width). Instead, single step ("Step Into" button on Geiger Snes9x) until you get to $C902B1.
  • You'll see something like this:
    • $C9/02B1 33 10 AND ($10,s),y[$C3:00FD] A:0F80 X:00C3 Y:0000 P:envmXdIzc
  • See that [$C3:00FD]? Now just take that number and subtract $C00001 (yes, $C00001, not $C00000) from it.
  • We now have the location of the menu size data; in this case, $300FC. Remember that the value at this address is two bytes long, and low-endian.
  • Note that, in some cases, there will be unwanted $C90717 breakpoints before the one we're looking for. That's why you should monitor the A register and make sure we're looking at the right iteration. The method I detailed above works only if you check the address on the iteration that contains the menu width ($0009, in this case).

Menu Text Pointers

To change the menu text, you need to find the pointers for that text. In most cases, this pointer is actually the 16-bit operand of an LDA opcode. Pointers can usually only reference the 64K block of memory from which they are called; in other words, if a pointer is at $360D1 in the ROM, it can't reference anything above $3FFFF or below $30000. In some cases, a pointer can't be made to point backwards without further hacking, because of the way that they are referenced. (More to come...) Fortunately, this shouldn't really be a big issue, because there is a block of apparently unused space (solid $FFs) from $3F30A-$3FFFF. Most pointers are in the range of this memory. (Please let me know if I'm mistaken and this empty space actually serves a purpose!)

A list of menu pointers can be found at the Kojiro Translations wiki.

Menu Padding Routine

Some menu entries have extra spaces padded onto the end that is not accounted for by the data at the expected pointers. These spaces are inserted by the use of a special routine located at $32B70 in the ROM. When this routine is called, the X register contains the number of spaces to insert. If you're doing some menu expansion, you may have to set breakpoints at $C32B70. Single-step through until RTL is executed, so you can see where it came from, and then back up five bytes from the resulting address. If these padding spaces are throwing off your menu borders, replace the JSL $C32B70 opcode with four NOPs.

Calling $32B8D inserts a single dummy space. The "Change Message Speed" option on the "Tactics" menu uses this method, so look out for it if you're editing that menu item. There may be others I haven't found yet that do the same thing. Again, you can track down the originating JSL opcode by breaking on the subroutine start, stepping through until RTL is executed, and then subtracting five bytes from the program counter at that point.

Overworld Map

The overworld map is made up of a 64x64 grid of chunks which are a 4x4 grid of 16x16 pixel tiles which are really four 8x8 tiles. This results in a 4096x4096 pixel sized map.

Top level grid

Location in ROM: $2D8A00 - $2D9BE2

The top level of the overworld tilemap data is a 64x64 grid composed of a word length (2 byte) index indicating which chunk to use. This is $2000 bytes. Most of the data is just a counter that increments by one each time since most of the land chunks are unique. However the open parts of the sea are represented by chunk $0001 so you will see long runs of that index. Some other reused chunks are composed of all desert or all forest or all grass, that kind of thing. Values range from $0001 to $0A3C, and $0000 is not used although is a valid chunk made of zeros.

Decompression uses a $400 byte ring buffer that is all zeros at the beginning and a starting write position of $3BE. Every decompressed byte is written to the output and the ring buffer. The compressed data is composed of a command byte followed by 8 to 16 data bytes. For each bit in the command byte, if the bit is 1 then read and write one byte. If the bit is 0 then perform a copy operation from the ring buffer using the next two bytes of source data. The 10 lower bits are a pointer into the ring buffer that will be used as the source address. The number of bytes to copy is the upper 6 bits plus 3. Note that the copied bytes are written to the output and also into the ring buffer so if the buffer read address is close behind the buffer write address then you're copying what was just written. This is mostly used to generate long stretches of $0001 which represents the chunks of open sea.

Chunks

Location in ROM: $2DA49C - $2E486B‬

The chunks are 4x4 grids of tile indexes (1 byte) accessed with an index. The chunk data is in one contiguous area but is actually 16 different byte arrays, one after another and each one $A3D bytes long, so that all 16 tiles can be accessed with the same index.

The starting addresses for each array are shown in the layout the tiles appear on screen:

X + 0 X + 1 X + 2 X + 3
Y + 0 $2DA49C $2DAED9 $2DB916 $2DC353
Y + 1 $2DCD90 $2DD7CD $2DE20A $2DEC47
Y + 2 $2DF684 $2E00C1 $2E0AFE $2E153B
Y + 3 $2E1F78 $2E29B5 $2E33F2 $2E3E2F

Values range from $00 to $EC because the definitions for tiles $ED to $FF are not loaded, although there is space in RAM for them.

Tiles

Location in ROM: $254F38 - $25569F

Each entry is 8 bytes with each 2 bytes representing one of the 4 tiles (8x8) that make up the larger 16x16 tile. These 2 byte parts are in the standard SNES tilemap format and are copied as is into VRAM.

Links

None currently.