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.
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
Dragon Warrior II (NES)/ROM map: Difference between revisions
Jump to navigation
Jump to search
(adding disassembly of pluralization code) |
No edit summary |
||
Line 16: | Line 16: | ||
* 0x0B44B to 0x0B686 = Dictionary for main script. | * 0x0B44B to 0x0B686 = Dictionary for main script. | ||
* 0x0B762 to 0x0B7C1 = Main script pointers. Each pointer points at a blob of 16 concatenated strings. | * 0x0B762 to 0x0B7C1 = Main script pointers. Each pointer points at a blob of 16 concatenated strings. | ||
* 0x0B7C2 to 0x0BE0F = Main script part | * 0x0B7C2 to 0x0BE0F = Main script part 2 (continued from 0x17FE6). | ||
* 0x0BF1D to 0x0BF44 = Words for monster counts. | * 0x0BF1D to 0x0BF44 = Words for monster counts. | ||
* 0x14010 to 0x17FE6 = Main script part | * 0x14010 to 0x17FE6 = Main script part 1 (continued at 0xB7C2). | ||
* 0x18032 to 0x18033 = Item list part 1, line 1 pointer. | * 0x18032 to 0x18033 = Item list part 1, line 1 pointer. | ||
* 0x18034 to 0x18035 = Item list part 1, line 2 pointer. | * 0x18034 to 0x18035 = Item list part 1, line 2 pointer. |
Revision as of 23:09, 13 February 2019
The following article is a ROM map for Dragon Warrior II (NES).
Dragon Quest
* 0x02D9B to 0x????? = font, 1BPP. * 0x1402B to 0x17D4C = dialogues. 0x14798 - beginning. * 0x180C4 to 0x18E12 = menus and referential bank. Equipments, items, monsters, magic and complements. * 0x1B730 to 0x1B8D7 = passwords. * 0x1BC5C to 0x1BC81 = character's naming. * 0x1BFB9 to 0x1BFF8 = standard names, better yet, some parts.
Dragon Warrior
* 0x07652 to 0x076E5 = Menu pointers. * 0x076E6 to 0x07F20 = Menu text. Dragon Warrior II's menus use the same format as Dragon Warrior's menus. * 0x0B44B to 0x0B686 = Dictionary for main script. * 0x0B762 to 0x0B7C1 = Main script pointers. Each pointer points at a blob of 16 concatenated strings. * 0x0B7C2 to 0x0BE0F = Main script part 2 (continued from 0x17FE6). * 0x0BF1D to 0x0BF44 = Words for monster counts. * 0x14010 to 0x17FE6 = Main script part 1 (continued at 0xB7C2). * 0x18032 to 0x18033 = Item list part 1, line 1 pointer. * 0x18034 to 0x18035 = Item list part 1, line 2 pointer. * 0x18036 to 0x18037 = Spell list pointer. * 0x18038 to 0x18039 = Monster name list part 1, line 1 pointer. * 0x1803A to 0x1803B = Monster name list part 1, line 2 pointer. * 0x18040 to 0x18041 = Item list part 2, line 1 pointer. * 0x18042 to 0x18043 = Item list part 2, line 2 pointer. * 0x18044 to 0x18045 = Monster name list part 2, line 1 pointer. * 0x18046 to 0x18047 = Monster name list part 2, line 2 pointer. * 0x1AD49 to 0x1AD88 = Prince of Cannock names. * 0x1AD89 to 0x1ADC8 = Princess of Moonbrooke names. * 0x1B2DA to 0x1B3CD = Item list part 1, line 1 text. * 0x1B3CE to 0x1B4C1 = Item list part 2, line 1 text. * 0x1B4C2 to 0x1B58B = Item list part 1, line 2 text. * 0x1B58C to 0x1B633 = Item list part 2, line 2 text. * 0x1B634 to 0x1B727 = Spell list text. * 0x1B728 to 0x1B86D = Monster name list part 1, line 1 text. * 0x1B86E to 0x1B954 = Monster name list part 2, line 1 text. * 0x1B955 to 0x1B9E4 = Monster name list part 1, line 2 text. * 0x1B9E5 to 0x1BA53 = Monster name list part 2, line 2 text. * 0x1C805 to 0x1C8F1 = Code for pluralizing monster names. * 0x1CAC2 to 0x1CC21 = Prologue. * 0x243B6 to 0x247D4 = End credits.
Monster Name Pluralization Rules
; pluralize monster name ; ; starts reading the monster name backwards from the end of the string and applies the first applicable transformation ; -ch -> -ches ; -dead -> -dead (i.e. no change) ; -f -> -ves (but no monster has a name that ends in f, so this rule is never used) ; -i -> -ies ; -Man -> -Men ; -man -> -men ; -Mouse -> -Mice ; -mouse -> -mice ; -ngo -> -ngo (i.e. no change) ; -rus -> -rii ; -s -> -ses ; -sh -> -shes ; -y -> -ies ; - -> -s (everything else) ; ; IN: ; A/Y/C: irrelevant, they all get potentially clobbered ; X: points to next byte in monster name stored starting at $60F1, i.e. the byte after the end token ; $60F1-????: singular monster name terminated by [end-FA] ; OUT: ; A/X/Y: unreliable ; C: set 0x01C805|$07:$87F5:A4 8F LDY $8F ; number of monsters in the current group 0x01C807|$07:$87F7:88 DEY 0x01C808|$07:$87F8:F0 36 BEQ $8830 ; if only 1 monster, then no need to pluralize, so we're done 0x01C80A|$07:$87FA:CA DEX ; back up to [end-FA] 0x01C80B|$07:$87FB:CA DEX ; back up to final letter of monster name 0x01C80C|$07:$87FC:BD F1 60 LDA $60F1,X ; read final letter of monster name 0x01C80F|$07:$87FF:C9 18 CMP #$18 ; "o" 0x01C811|$07:$8801:F0 32 BEQ $8835 ; -ngo -> -ngo, -o -> -os 0x01C813|$07:$8803:C9 0F CMP #$0F ; "f" 0x01C815|$07:$8805:F0 5E BEQ $8865 ; -f -> -ves (not used) 0x01C817|$07:$8807:C9 22 CMP #$22 ; "y" 0x01C819|$07:$8809:F0 5F BEQ $886A ; -y -> -ies 0x01C81B|$07:$880B:C9 12 CMP #$12 ; "i" 0x01C81D|$07:$880D:F0 5B BEQ $886A ; -i -> -ies 0x01C81F|$07:$880F:C9 1C CMP #$1C ; "s" 0x01C821|$07:$8811:F0 32 BEQ $8845 ; -rus -> -rii, -s -> -ses 0x01C823|$07:$8813:C9 11 CMP #$11 ; "h" 0x01C825|$07:$8815:F0 5B BEQ $8872 ; -ch -> -ches, -sh -> -shes, -h -> -hs 0x01C827|$07:$8817:C9 17 CMP #$17 ; "n" 0x01C829|$07:$8819:F0 64 BEQ $887F ; -man -> -men, -Man -> -Men, -n -> -ns 0x01C82B|$07:$881B:C9 0E CMP #$0E ; "e" 0x01C82D|$07:$881D:F0 79 BEQ $8898 ; -mouse -> -mice, -Mouse -> -Mice, -e -> es 0x01C82F|$07:$881F:C9 0D CMP #$0D ; "d" 0x01C831|$07:$8821:F0 0F BEQ $8832 ; -dead -> -dead, -d -> -ds ; control flow target (from $883A, $8841, $8863, $8884, $888F, $889D, $88E1) ; append "s" to monster name ; default pluralization if not handled above 0x01C833|$07:$8823:E8 INX 0x01C834|$07:$8824:A9 1C LDA #$1C ; "s" 0x01C836|$07:$8826:9D F1 60 STA $60F1,X ; append "s" to monster name 0x01C839|$07:$8829:E8 INX 0x01C83A|$07:$882A:A9 FA LDA #$FA ; [end-FA] 0x01C83C|$07:$882C:9D F1 60 STA $60F1,X ; append [end-FA] to monster name 0x01C83F|$07:$882F:E8 INX ; control flow target (from $87F8, $8843) 0x01C840|$07:$8830:38 SEC 0x01C841|$07:$8831:60 RTS ; control flow target (from $8821) ; jump to -d pluralization handler: -dead -> -dead, -d -> -ds 0x01C842|$07:$8832:4C CC 88 JMP $88CC ; control flow target (from $8801) ; -o pluralization handler: -ngo -> -ngo, -o -> -os 0x01C845|$07:$8835:BD F0 60 LDA $60F0,X ; read second-last letter of monster name 0x01C848|$07:$8838:C9 10 CMP #$10 ; "g" 0x01C84A|$07:$883A:D0 E7 BNE $8823 ; if not -go, append "s" 0x01C84C|$07:$883C:BD EF 60 LDA $60EF,X ; read third-last letter of monster name 0x01C84F|$07:$883F:C9 17 CMP #$17 ; "n" 0x01C851|$07:$8841:D0 E0 BNE $8823 ; if not -ngo, append "s" 0x01C853|$07:$8843:F0 EB BEQ $8830 ; if -ngo, plural = singular ; control flow target (from $8811) ; -s pluralization handler: -rus -> -rii, -s -> -ses 0x01C855|$07:$8845:BD F0 60 LDA $60F0,X ; read second-last letter of monster name 0x01C858|$07:$8848:C9 1E CMP #$1E ; "u" 0x01C85A|$07:$884A:D0 11 BNE $885D ; if not -us, append "es" 0x01C85C|$07:$884C:BD EF 60 LDA $60EF,X ; read third-last letter of monster name 0x01C85F|$07:$884F:C9 1B CMP #$1B ; "r" 0x01C861|$07:$8851:D0 0A BNE $885D ; if not -rus, append "es" 0x01C863|$07:$8853:A9 12 LDA #$12 ; "i" 0x01C865|$07:$8855:9D F0 60 STA $60F0,X ; replace -us with -ii 0x01C868|$07:$8858:9D F1 60 STA $60F1,X 0x01C86B|$07:$885B:38 SEC 0x01C86C|$07:$885C:60 RTS ; control flow target (from $884A, $8851, $886F) ; append "es" to monster name 0x01C86D|$07:$885D:E8 INX 0x01C86E|$07:$885E:A9 0E LDA #$0E ; "e" 0x01C870|$07:$8860:9D F1 60 STA $60F1,X ; append "e" to monster name 0x01C873|$07:$8863:D0 BE BNE $8823 ; append "s" to monster name; note that this branch is always taken ; control flow target (from $8805) ; unused code ; -f pluralization handler: -f -> -ves 0x01C875|$07:$8865:A9 1F LDA #$1F ; "v" 0x01C877|$07:$8867:4C 6C 88 JMP $886C ; replace "f" with "v" then append "es" ; control flow target (from $8809, $880D) ; -i pluralization handler: -i -> -ies 0x01C87A|$07:$886A:A9 12 LDA #$12 ; "i" ; unused control flow target (from $8867) 0x01C87C|$07:$886C:9D F1 60 STA $60F1,X ; replace final letter with "i" 0x01C87F|$07:$886F:4C 5D 88 JMP $885D ; append "es" ; control flow target (from $8815) ; -h pluralization handler: -ch -> -ches, -sh -> -shes, -h -> -hs 0x01C882|$07:$8872:BD F0 60 ; LDA $60F0,X ; read second-last letter of monster name 0x01C885|$07:$8875:C9 0C ; CMP #$0C ; "c" 0x01C887|$07:$8877:F0 E4 ; BEQ $885D ; if -ch, append "es" 0x01C889|$07:$8879:C9 1C ; CMP #$1C ; "s" 0x01C88B|$07:$887B:F0 E0 ; BEQ $885D ; if -sh, append "es" 0x01C88D|$07:$887D:D0 A4 ; BNE $8823 ; else, append "s" ; control flow target (from $8819) ; -n pluralization handler: -man -> -men, -Man -> -Men, -n -> -ns 0x01C88F|$07:$887F:BD F0 60 LDA $60F0,X ; read second-last letter of monster name 0x01C892|$07:$8882:C9 0A CMP #$0A ; "a" 0x01C894|$07:$8884:D0 9D BNE $8823 ; if not -an, append "s" 0x01C896|$07:$8886:BD EF 60 LDA $60EF,X ; read third-last letter of monster name 0x01C899|$07:$8889:C9 16 CMP #$16 ; "m" 0x01C89B|$07:$888B:F0 04 BEQ $8891 ; -man -> -men 0x01C89D|$07:$888D:C9 30 CMP #$30 ; "M" 0x01C89F|$07:$888F:D0 92 BNE $8823 ; if not -Man, append "s" ; control flow target (from $888B) 0x01C8A1|$07:$8891:A9 0E LDA #$0E ; "e" 0x01C8A3|$07:$8893:9D F0 60 STA $60F0,X ; replace second-last letter of monster name ; control flow target (from $88DF) 0x01C8A6|$07:$8896:38 SEC 0x01C8A7|$07:$8897:60 RTS ; control flow target (from $881D) ; -e pluralization handler: -mouse -> -mice, -Mouse -> -Mice, -e -> es 0x01C8A8|$07:$8898:BD F0 60 LDA $60F0,X ; read second-last letter of monster name 0x01C8AB|$07:$889B:C9 1C CMP #$1C ; "s" 0x01C8AD|$07:$889D:D0 84 BNE $8823 ; if not -se, append "s" 0x01C8AF|$07:$889F:BD EF 60 LDA $60EF,X ; read third-last letter of monster name 0x01C8B2|$07:$88A2:C9 1E CMP #$1E ; "u" 0x01C8B4|$07:$88A4:D0 3B BNE $88E1 ; if not -use, append "s" 0x01C8B6|$07:$88A6:BD EE 60 LDA $60EE,X ; read fourth-last letter of monster name 0x01C8B9|$07:$88A9:C9 18 CMP #$18 ; "o" 0x01C8BB|$07:$88AB:D0 34 BNE $88E1 ; if not -ouse, append "s" 0x01C8BD|$07:$88AD:BD ED 60 LDA $60ED,X ; read fifth-last letter of monster name 0x01C8C0|$07:$88B0:C9 16 CMP #$16 ; "m" 0x01C8C2|$07:$88B2:F0 04 BEQ $88B8 ; -mouse -> -mice 0x01C8C4|$07:$88B4:C9 30 CMP #$30 ; "M" 0x01C8C6|$07:$88B6:D0 29 BNE $88E1 ; if not -Mouse, append "s" ; control flow target (from $88B2) 0x01C8C8|$07:$88B8:A0 00 LDY #$00 ; replace last 4 letters of monster name with "ice" + [end-FA] ; control flow target (from $88C4) 0x01C8CA|$07:$88BA:B9 C8 88 LDA $88C8,Y 0x01C8CD|$07:$88BD:9D EE 60 STA $60EE,X 0x01C8D0|$07:$88C0:E8 INX 0x01C8D1|$07:$88C1:C8 INY 0x01C8D2|$07:$88C2:C0 04 CPY #$04 0x01C8D4|$07:$88C4:90 F4 BCC $88BA 0x01C8D6|$07:$88C6:38 SEC 0x01C8D7|$07:$88C7:60 RTS ; code -> data ; data load target (from $88BA) 0x01C8D8|$07:$88C8:12 ; "i" 0x01C8D9|$07:$88C9:0C ; "c" 0x01C8DA|$07:$88CA:0E ; "e" 0x01C8DB|$07:$88CB:FA ; [end-FA] ; data -> code ; control flow target (from $8832) ; -d pluralization handler: -dead -> -dead, -d -> ds 0x01C8DC|$07:$88CC:BD F0 60 LDA $60F0,X ; read second-last letter of monster name 0x01C8DF|$07:$88CF:C9 0A CMP #$0A ; "a" 0x01C8E1|$07:$88D1:D0 0E BNE $88E1 ; if not -ad, append "s" 0x01C8E3|$07:$88D3:BD EF 60 LDA $60EF,X ; read third-last letter of monster name 0x01C8E6|$07:$88D6:C9 0E CMP #$0E ; "e" 0x01C8E8|$07:$88D8:D0 07 BNE $88E1 ; if not -ead, append "s" 0x01C8EA|$07:$88DA:BD EE 60 LDA $60EE,X ; read fourth-last letter of monster name 0x01C8ED|$07:$88DD:C9 0D CMP #$0D ; "d" 0x01C8EF|$07:$88DF:F0 B5 BEQ $8896 ; if -dead, plural = singular ; control flow target (from $88A4, $88AB, $88B6, $88D1, $88D8) 0x01C8F1|$07:$88E1:4C 23 88 JMP $8823 ; else, append "s"
Internal Data for Dragon Warrior II
| |
---|---|