If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
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
| |
---|---|