Faxanadu stores strings in a variety of places. There are blocks of memory for different categories of strings, some with different formatting. We'll cover where these live here. # Addresses | Bank | Address Range | Description | | ---- | ------------- | ---------------------------- | | 12 | $8873 - $8A92 | [[#Player Menu Strings]] | | 12 | $91BE - $9203 | [[#Password Screen Strings]] | | 12 | $9B3D - $9DAC | [[#Item Strings]] | | 13 | $8300 - $B3B9 | [[#Message Strings]] | | 15 | $F649 - $F748 | [[#Player Titles]] | # Characters Faxanadu has a string palette consisting of the following characters: * A-Z * a-z * 0-9 * `'` * `,` * `.` * `-` * `?` * `!` # Player Menu Strings Main menu strings are in Bank 12, from $8873 - $8A92. Each string is 16 bytes in length, starting with the text length encoded in binary, then the text (up to 15 characters), and then spaces for remaining characters. | Address Range | Length | Text | | ------------- | ------ | ----------------- | | $8873 - $8882 | 6 | `WEAPON ` | | $8883 - $8892 | 5 | `ARMOR ` | | $8893 - $88A2 | 6 | `SHIELD ` | | $88A3 - $88B2 | 5 | `MAGIC ` | | $88B3 - $88C2 | 4 | `ITEM ` | | $88C3 - $88D2 | 6 | `PLAYER ` | | $88D3 - $88E2 | 9 | ` RANK: ` | | $88E3 - $88F2 | 9 | `NEXT EXP: ` | | $88F3 - $8902 | 9 | `WEAPON: ` | | $8903 - $8912 | 9 | ` ARMOR: ` | | $8913 - $8922 | 9 | `SHIELD: ` | | $8923 - $8932 | 9 | ` MAGIC: ` | | $8933 - $8942 | 9 | ` ITEM: ` | | $8943 - $8952 | 9 | `NOVICE ` | | $8953 - $8962 | 9 | `ASPIRANT ` | | $8963 - $8972 | 9 | `BATTLER ` | | $8973 - $8982 | 9 | `FIGHTER ` | | $8983 - $8992 | 9 | `ADEPT ` | | $8993 - $89A2 | 9 | `CHEVALIER ` | | $89A3 - $89B2 | 9 | `VETERAN ` | | $89B3 - $89C2 | 9 | `WARRIOR ` | | $89C3 - $89D2 | 9 | `SWORDMAN ` | | $89D3 - $89E2 | 9 | `HERO ` | | $89E3 - $89F2 | 9 | `SOLDIER ` | | $89F3 - $8A02 | 9 | `MYRMIDON ` | | $8A03 - $8A12 | 9 | `CHAMPION ` | | $8A13 - $8A22 | 9 | `SUPERHERO ` | | $8A23 - $8A32 | 9 | `PALADIN ` | | $8A33 - $8A42 | 9 | `LORD ` | | $8A43 - $8A52 | 9 | `NO WEAPON ` | | $8A53 - $8A62 | 9 | `NO ARMOR ` | | $8A63 - $8A72 | 9 | `NO SHIELD ` | | $8A73 - $8A82 | 9 | `NO MAGIC ` | | $8A83 - $8A92 | 9 | `NO ITEM ` | # Password Screen Strings These reside in Bank 12 at address $91BE - $9223 | Address Range | Text | | ------------- | ---------------------------------------------- | | $91BE - $91D4 | `Mantra is in the wrong.` | | $91D5 - $91EB | Empty spaces | | $91EC - $9203 | ` Enter your mantra. ` | | $9226 - $92C5 | All password input characters, space-separated | | | | This is immediately preceded by a lookup table for lower addresses and a lookup table for upper addresses for the first three strings. # Item Strings These reside in Bank 12 at addresses $9B3D - $9DAC. | Address Range | Description | | ------------- | --------------------------------------------- | | $9B33 - $9B37 | Lower address bytes for Bank 12 string tables | | $9B38 - $9B3C | Upper address bytes for Bank 12 string tables | | $9B3D - $9B7C | Weapon strings | | $9B7D - $9BBC | Armor strings | | $9BBD - $9BFC | Shield strings | | $9BFD - $9C4C | Magic strings | | $9C4D - $9DAC | Item strings | > [!seealso] See Also: [[Items]] Each string is 16 bytes in length, starting with the text length encoded in binary, then the text (up to 15 characters), and then spaces for remaining characters. ## Weapon Strings | Address Range | Text | | ------------- | ----------------- | | $9B3D - $9B3C | `HAND DAGGER ` | | $9B4D - $9B4C | `LONG SWORD ` | | $9B5D - $9B5C | `GIANT BLADE ` | | $9B6D - $9B6C | `DRAGON SLAYER ` | ## Armor Strings | Address Range | Text | | ------------- | ----------------- | | $9B7D - $9B8C | `LEATHER ARMOR ` | | $9B8D - $9B9C | `STUDDED MAIL ` | | $9B9D - $9BAC | `FULL PLATE ` | | $9BAD - $9BBC | `BATTLE SUIT ` | ## Shield Strings | Address Range | Text | | ------------- | ----------------- | | $9BBD - $9BCC | `SMALL SHIELD ` | | $9BCD - $9BDC | `LARGE SHIELD ` | | $9BDD - $9BEC | `MAGIC SHIELD ` | | $9BED - $9BFC | `BATTLE HELMET ` | ## Magic Strings | Address Range | Text | | ------------- | ----------------- | | $9BFD - $9C0C | `DELUGE ` | | $9C0D - $9C1C | `THUNDER ` | | $9C1D - $9C2C | `FIRE ` | | $9C2D - $9C3C | `DEATH ` | | $9C3D - $9C4C | `TILTE ` | ## Item Strings | Address Range | Text | | ------------- | ----------------- | | $9C4D - $9C5C | `RING OF ELF ` | | $9C5D - $9C6C | `RUBY RING ` | | $9C6D - $9C7C | `RING OF DWARF ` | | $9C7D - $9C8C | `DEMONS RING ` | | $9C8D - $9C9C | `KEY A ` | | $9C9D - $9CAC | `KEY K ` | | $9CAD - $9CBC | `KEY Q ` | | $9CBD - $9CCC | `KEY J ` | | $9CCD - $9CDC | `KEY JO ` | | $9CDD - $9CEC | `MATTOCK ` | | $9CED - $9CFC | `ROD ` | | $9CFD - $9D0C | `CRYSTAL ` | | $9D0D - $9D1C | `LAMP ` | | $9D1D - $9D2C | `HOUR GLASS ` | | $9D2D - $9D3C | `BOOK ` | | $9D3D - $9D4C | `WING BOOTS ` | | $9D4D - $9D5C | `RED POTION ` | | $9D5D - $9D6C | `BLACK POTION ` | | $9D6D - $9D7C | `ELIXIR ` | | $9D7D - $9D8C | `PENDANT ` | | $9D8D - $9D9C | `BLACK ONIX ` | | $9D9D - $9DAC | `FIRE CRYSTAL ` | # Message Strings Message strings are used for dialogue (frequently used in, but not limited to, [[Interaction Scripts]]). These reside in Bank 13 at addresses $8300 - $B3B9. ## Special Characters Along with the standard characters above, the following special characters are supported: | Character Code | Description | | -------------- | ---------------------------- | | $FB | Inserts current player title | | $FC | Pauses for a button press | | $FD | Space | | $FE | Newline | | $FF | End of message | ## Message Lookup Messages are 1-based indexes into a table in Bank 13. Message scanning is... sub-optimal. Unlike most of Faxanadu, this does _not_ use a lookup table. Instead, it scans from the start of the table, scanning for messages until it finds the last character of the line matching the message ID. The code roughly translates to: ```python pos = 0x8300 message_id = ... while True: c = ROM[pos] line_pos = pos while c != 0xFF: pos += 1 message_id -= 1 if message_id == 0: pos = line_pos break # Resulting position of the message is is line_pos. ``` (Untested pseudo-code, but should give you an idea.) # Player Titles Player titles live in Bank 15 at $F649 - $F748. Each is a string of 16 characters in length, with spaces (0x20) filling out any remaining characters. | Address Range | String | | ------------- | ------------------ | | $F649 - $F658 | `Novice ` | | $F659 - $F668 | `Aspirant ` | | $F669 - $F678 | `Battler ` | | $F679 - $F688 | `Fighter ` | | $F689 - $F698 | `Adept ` | | $F699 - $F6A8 | `Chevalier ` | | $F6A9 - $F6B8 | `Veteran ` | | $F6B9 - $F6C8 | `Warrior ` | | $F6C9 - $F6D8 | `Swordman ` | | $F6D9 - $F6E8 | `Hero ` | | $F6E9 - $F6F8 | `Soldier ` | | $F6F9 - $F708 | `Myrmidon ` | | $F709 - $F718 | `Champion ` | | $F719 - $F728 | `Superhero ` | | $F729 - $F738 | `Paladin ` | | $F739 - $F748 | `Lord ` | > [!seealso] See Also: [[Player Experience]]