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.
Arcana/ROM map: Difference between revisions
< Arcana
Jump to navigation
Jump to search
(Added way too much information, gave descriptions for each bank. (Understanding the opcodes is key to reading most of the game's code.)) |
(Worked on adding the song data locations in the last two banks, added their pointer table in bank 00.) |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{rommap|game=Arcana}} | {{rommap|game=Arcana}} | ||
(Back to [[Arcana|Main page]]) | (Back to [[Arcana|Main page]]) | ||
==FOREWORD: How to read Arcana's event code== | |||
<pre> | |||
The majority of Arcana's subroutines are through opcodes, which is like reading another assembly language. (See this page's Bank 00 section for command details.) The code uses a set of commands, the animations use a different set of commands, and drawing text to the screen uses a third set. They are very difficult to follow with just a standard tracelog. Predominantly when tracing or breakpointing code, you'll see a lot of the 00/902B command "LDA [$10]". (This is SNES for: read the address stored in the variable $xx10, read the value at that address, and store that value in the accumulator.) After 902B reads an opcode [byte], it goes to a pointer table and calls the code for that command. (For instance if 902B reads a "07", the table tells it to call 00/9527. 9527 reads the next 3 bytes after the 07, then jumps execution there. In other words, it's a subroutine call.) | |||
Since many commands read adjacent data, it is *much* easier to follow along if you can read ahead a few bytes too. So, it is highly recommended to follow along in a hex editor when tracing. Reminder that this is a LoROM game, so something the emulator says is at 01/9260 will be at byte 9260 in your separate hex editor. Something at 02/8000 will be at byte 10000. A tool like Lunar Address can easily convert between PC addresses and SNES LoROM addresses, it's a good idea to double check before digging around in the wrong area. | |||
Also keep in mind that the SNES is little-endian, so a 3-byte pointer 07/B220 is read in reverse as 20 B2 07. | |||
So here's an example. This is the event handling for the "Look" command that checks for treasure chests. These show the ROM location being read, the bytes being read (the opcode is spaced separately from the parameters for clarity), and a summary of what happens there. | |||
01/9260: 30 FF Clear the animation ID | |||
01/9262: 07 20 B2 07 Call subroutine 07/B220, which returns 1 if in a dungeon or 0 if in a town | |||
01/9266: 0B 72 92 If false/0, jump to 9272 (don't open a treasure chest if in town) | |||
01/9269: 07 16 A8 07 80 00 Call subroutine 07/A816, compare current floor tile to 0080 (treasure chest tile). Return 1 if true. | |||
01/926F: 0C 7D 92 If true, jump to 927D | |||
01/9272: 07 AC A0 00 BD 8F 08 00 Call subroutine 00/A0AC to display text at 08/8FBD "Nothing here !" (the 00 parameter is used by the text parser) | |||
01/927A: 1A 8A 92 Jump always to 928A (waits for an A press, then closes the menu) | |||
01/927D: 07 27 A8 07 Call subroutine 07/A827 (looks up and saves the treasure chest contents, and animates the chest opening) | |||
01/9281: 06 1E Wait 30 frames (for the chest to finish opening) | |||
01/9283: 07 3D A8 07 Call subroutine 07/A83D (get treasure contents, add money/item/equipment to inventory)(returns 1 if the chest is a trap) | |||
01/9287: 0C A5 92 If true (trapped chest), jump to 92A5 to start a random encounter (this is dummied out) | |||
01/928A: 06 01 Wait 1 frame | |||
01/928C: 07 03 BA 07 00 Call subroutine 07/BA03 (wait for an A press) (the 00 parameter is related to the pause status) | |||
01/9291: 0B 8A 92 If false (the player hasn't pressed A) loop back to 928A. | |||
01/9294: 06 0A Wait 10 frames | |||
01/9297: 07 07 9D 00 74 B6 01 Call subroutine 00/9D07 to read formatted data from 01/B674 (related to closing the text box) | |||
01/929D: 06 01 Wait 1 frame | |||
01/929F: 16 7B 15 01 00 Set RAM address $157B to 0001 (display the compass again) | |||
01/92A4: 1C Return from subroutine (return to wherever the code was when 01/9260 was called) | |||
This example is about standard in length. It's much easier to read this kind of code this way, but it's a laborious process by hand. *Most* opcodes read a set number of bytes, with the exception of subroutines and switch-case statements. So with the habit of seeing a 07 followed by a 3 byte pointer, or 0B followed by a 2 byte pointer, it's much easier to spot where the code is going next. | |||
Now for something different, an example of text opcodes. The breakpoint for these is 00/A7B5 "LDA [$06]", where $06 is the current character or command. | |||
This is from SCRIPT_003, where Rooks meets Ariel. The subroutines are shown to give a sense of how often the game calls the same commands. | |||
0C/A27A: 10 C2 F7 0C Read text subroutine 0C/F7C2 (MACRO_118) | |||
MACRO_118: (This initializes the dialogue box) | |||
0C/F7C2: 06 0D Set the text color to white | |||
0C/F7C4: 0C Clear the dialogue box | |||
0C/F7C5: 01 00 06 Move the cursor to (00,06) (the top left of the dialogue box) | |||
0C/F7C8: 03 0E Use normal vertical spacing | |||
0C/F7CA: 00 Return from text subroutine | |||
0C/A27E: 10 E3 F7 0C Read text subroutine 0C/F7E3 (PROMPT_ROOKS) | |||
PROMPT_ROOKS: (This is a subroutine to write Rooks' name and a newline, since he talks a lot) | |||
0C/F7E3: 05 FF 14 Wait 14 frames | |||
0C/F7E6: 0C Clear the dialogue box | |||
0C/F7E7: 0D Newline (for some reason this is required for the wait to work) | |||
0C/F7E8: 01 00 06 Move the cursor to (00,06) (the top left of the dialogue box) | |||
0C/F7EB: Rooks Rooks | |||
0C/F7F0: 05 01 01 Text speed 1 character per frame (fastest) | |||
0C/F7F3: 0D Newline | |||
0C/F7F4: 00 Return from text subroutine | |||
0C/A282: "Ariel, is that Ariel?" | |||
0C/A299: 10 A5 FA 0C Read text subroutine 0C/FAA5 (WAIT_CLEAR) | |||
WAIT_CLEAR: (This waits for an A press, and clears anyone's face who's speaking) | |||
0C/FAA5: 1B 00 FE Stop moving lips | |||
0C/FAA8: 7F Pause for user input | |||
0C/FAA9: 1B 00 FF Clear portrait | |||
0C/FAAC: 0D Newline | |||
0C/FAAD: 00 Return from text subroutine | |||
0C/A29D: 10 F5 F7 0C Read text subroutine 0C/F7F5 (DISPLAY_ARIEL) | |||
DISPLAY_ARIEL: (Loads Ariel's face, prints his name without moving his mouth, then starts moving his mouth.) | |||
0C/F7F5: 1B 00 01 Show Ariel's face (not speaking) | |||
0C/F7F8: 05 FF 14 Wait 14 frames | |||
0C/F7FB: 0C Clear the dialogue box | |||
0C/F7FC: 0D Newline (for some reason this is required for the wait to work) | |||
0C/F7FD: 01 00 06 Move the cursor to (00,06) (the top left of the dialogue box) | |||
0C/F800: Ariel Ariel | |||
0C/F805: 05 01 01 Text speed 1 character per frame (fastest) | |||
0C/F808: 0D Newline | |||
0C/F809: 1B 00 00 Show Ariel's face (start moving Ariel's mouth so the text coming up looks like he's talking) | |||
0C/F80C: 00 Return from text subroutine | |||
0C/A2A1: "I haven't seen you " | |||
0C/A2B5: 0D Newline | |||
0C/A2B6: " since you were a boy." | |||
0C/A2CD: 10 A5 FA 0C Read subroutine WAIT_CLEAR | |||
0C/A2D1: 10 E3 F7 0C Read subroutine PROMPT_ROOKS | |||
0C/A2D5: "Yes." | |||
As you can see, while code opcodes called actual ASM, text opcodes only call more text opcodes. But that's a general rundown of what things look like internally. | |||
</pre> | |||
==Bank $00: Common functions; Event handling== | |||
<pre> | <pre> | ||
$00/89F1 Sub: RNG | $00/8153 Sub: NMI disable | ||
$00/902B Sub: Reads the | $00/8167 Sub: NMI enable | ||
$00/90FA | $00/817B Sub: Display Force Blanking | ||
$00/911E | $00/818F Sub: Set Display | ||
$00/9140 | $00/81BF Sub: Set BG mode (1 byte parameter) | ||
$00/9148 | $00/81D8 Sub: Set OBJ Address (1 byte parameter) | ||
$00/915A | $00/8208 Sub: Set OBJ Size (1 byte parameter) | ||
$00/9177 | $00/826E Sub: Graphics dungeon stuff | ||
$00/918D | $00/8327 Sub: Update screen | ||
$00/91BB | $00/8400 Sub: Update background scroll | ||
$00/91DA | $00/8465 Sub: Video stuff | ||
$00/9527 | $00/84B9 Table: DMA Control | ||
$00/954D | $00/84D0 Table: DMA Destination | ||
$00/9562 | $00/84E7 Table: Videoport Control | ||
$00/9577 | $00/84FE Sub: RAM Decomp80 (1 byte) | ||
$00/974A | $00/8521 Sub: Decomp80 setup - Decompressor helper function. Reads a data entry that looks like "80 00 xx [xx/xxxx] xx xx" and passes the pointer to the decompressor. | ||
$00/975F | $00/8766 Sub: Decompression. Similar to Run Length Encoding. | ||
$00/97B6 | $00/88E2 Sub: Wait for VBLANK | ||
$00/97C5 | $00/89F1 Sub: RNG (1 byte parameter) - can take a value ("5") and roll a range ("0-4"), or can provide a random 2 byte number through $1E0A. | ||
$00/8A3D Sub: Multiply to $1E00 | |||
$00/8B11 Sub: Set Mode7 | |||
$00/8BE4 Table: Bitwise1 | |||
$00/8BF4 Table: Bitwise2 | |||
$00/8C04 Table: HDMA channels (an AND table where all but 1 bit is set) | |||
$00/8C34 Table: Bit flags | |||
$00/9008 Sub: Main loop, pointer setup | |||
$00/902B Sub: Read Event Code. Reads the event opcode from program counter $1E10. (Very important line! Uses a jump table to run opcodes as code.) | |||
Events: These opcodes run over half of the game. Most commonly you'll find code 07 for long calling a subroutine. | |||
$00/90E7 Event Opcode 00 - This one is complicated, it's similar to a return | |||
$00/90FA Event Opcode 01 - Loops a number of times (1 byte input) | |||
$00/911E Event Opcode 02 - Loop end: jumps back to opcode 01 | |||
$00/9140 Event Opcode 1A - Jump always (2 bytes) | |||
$00/9148 Event Opcode 03 - Jump long (3 bytes) | |||
$00/915A Event Opcode 1B - Call subroutine (2 bytes) | |||
$00/9177 Event Opcode 1C - Return from short subroutine/1B | |||
$00/918D Event Opcode 04 - Call subroutine (3 bytes) | |||
$00/91BB Event Opcode 05 - Return from long subroutine/04 | |||
$00/91DA Event Opcode 06 - Delay x frames (1 byte) | |||
$00/91EA Animation Opcodes 30-37 (1 byte) - Sets or zeros the animation ID $0A7B,x | |||
$00/9202 Animation Opcodes 38-3F (2 bytes) - Sets the cursor X position | |||
$00/9250 Animation Opcodes 40-47 (2 bytes) - Sets the cursor Y position | |||
$00/929E Animation Opcodes E0-E7 (2 bytes) | |||
$00/92D7 Animation Opcodes 58-5F (2 bytes) | |||
$00/92F8 Animation Opcodes 60-67 (2 bytes) | |||
$00/9319 Animation Opcodes F0-F7 (2 bytes) | |||
$00/933A Animation Opcodes 68-6F (2 bytes) | |||
$00/9362 Animation Opcodes 70-77 (2 bytes) | |||
$00/938A Animation Opcodes F8-FF (2 bytes) | |||
$00/93B2 Animation Opcodes 78-7F (3 bytes) - Reads an x offset, then stores 2bytes in $0FEF,x and zeros $0FFF,x (?) | |||
$00/93CA Animation Opcodes 80-87 (3 bytes) | |||
$00/93E2 Animation Opcodes 88-8F (3 bytes) | |||
$00/9409 Animation Opcodes 90-97 (3 bytes) | |||
$00/9430 Animation Opcodes 98-9F (3 bytes) | |||
$00/945E Animation Opcodes A0-A7 (3 bytes) | |||
$00/948C Animation Opcodes 48-4F (2 bytes) - Adds to a total at $0937,x | |||
$00/949F Animation Opcodes 50-57 (2 bytes) - Adds to a total at $095B,x | |||
$00/94B2 Animation Opcodes E8-EF (2 bytes) - Adds to a total at $097F,x | |||
$00/94C5 Animation Opcodes C0-C7 (3 bytes) | |||
$00/94F7 Animation Opcodes D0-D7 (0 bytes) - Zeros some stuff | |||
$00/950F Animation Opcodes D8-DF (1 byte) - Takes an offset and zeros some stuff | |||
$00/9527 Event Opcode 07 (3 bytes) - Call a subroutine. (Runs code, returns with RTL) | |||
$00/954D Event Opcode 0B (2 bytes) - Jump if false | |||
$00/9562 Event Opcode 0C (2 bytes) - Jump if true | |||
$00/9577 Event Opcode 11 (? bytes) - Switch-case: jump based on return value. Takes 1 byte (# of entries) plus 2 bytes per entry for the jump pointers. | |||
$00/959D Event Opcode 12 (? bytes) - Similar to 11, a switch-case | |||
$00/95C7 Event Opcode 0D (0 bytes) - Similar to 00, some kind of return. | |||
$00/95DF Event Opcode 08 (2 bytes) - Similar to 1B, some kind of branch to a 2 byte pointer. Clears the animation loop. | |||
$00/960C Event Opcode 14 (1 byte) | |||
$00/963F Event Opcode 09 (3 bytes) - Similar to 04, some kind of long pointer jump. | |||
$00/9655 Event Opcode 0A (0 bytes) - Clears the current animation loop. | |||
$00/965F Animation Opcodes A8-AF (0 bytes) - Increment animation ID (A8 = high speed, AF = low speed) | |||
$00/9668 Animation Opcodes B0-B7 (0 bytes) - Decrement animation ID | |||
$00/9671 Animation Opcodes B8-BF (1 byte) - Adds (amount) to the animation ID | |||
$00/968D Event Opcode 19 (5 bytes?)- Similar to 0E, compares values | |||
$00/96B8 Event Opcode 15 (4 bytes) - Compares an actor ID with a value. | |||
$00/96CD Event Opcode 0E (5 bytes) - Compares RAM to a value using a comparator (RAM Operations table) | |||
$00/96F2 Table: RAM Operations (has pointers to functions for AND, OR, add, and XOR) | |||
$00/9717 Event Opcode 0F (3 bytes) - Set actor (1 byte) to value (2 bytes). See Actor Arrays table. | |||
$00/9739 Table: Actor Arrays - Pointers to RAM 09A3, 09C7, 09EB, 0A0F. These are used with an X offset to track various information. AKA var0, var1, var2, var3. | |||
$00/9741 Event Opcode 10 | |||
$00/974A Event Opcode 13 (3 bytes) - Set RAM address (2 bytes) to value (1 byte) | |||
$00/975F Event Opcode 16 (4 bytes) - Set RAM address (2 bytes) to value (2 bytes) | |||
$00/9772 Event Opcode 17 | |||
$00/9791 Event Opcode 18 | |||
$00/97A0 Event Opcode 1D (3 bytes) - Stores a 2 byte pointer to $0A9F,x and the bank to $0AC3,x | |||
$00/97B6 Event Opcode 1E (2 bytes) - Load value | |||
$00/97C5 Event Opcode 1F (2 bytes) - Load value at address | |||
$00/97D8 Event Opcode 20 | |||
$00/97F5 Event Opcode 21 | |||
$00/9814 Event Opcode 22 | |||
$00/982A Event Opcode 23 | |||
$00/9847 Event Opcode 24 (1 byte) - Load a value from 1 of 4 arrays | |||
$00/9864 Event Opcode 25 (1 byte) - Similar to 24 but sets the loop variable $0B9F,y | |||
$00/9AF0 Sub: Get Event Code (1 byte) - Reads the next event opcode from the program counter $1E10 | |||
$00/9AF8 Sub: Get Event Code (1 byte) (returns long) | |||
$00/9B00 Sub: Get Event Code (2 bytes) | |||
$00/9B07 Sub: Get Event Code (2 bytes) (returns long) | |||
$00/9C3C Sub: Set/Get Music (1 byte) | $00/9C3C Sub: Set/Get Music (1 byte) | ||
$00/9C44 Sub: Set/Get SFX (1 byte) | $00/9C44 Sub: Set/Get SFX (1 byte) | ||
$00/ | $00/9CAE Sub: Load sprite (14 bytes) | ||
$00/9CBC Sub: Character join (13 bytes) | |||
$00/9CF9 Sub: Decomp80 Setup (3 bytes) | |||
$00/9D34 Sub: Setup Display Stuff (8 bytes) | |||
$00/9D69 Sub: Read BG mode (1 byte) | |||
$00/9D6F Sub: Display brancher (6 bytes) - byte0: 0-3 (function to call), byte1: A register, byte2-3: X register, byte4-5: Y register | |||
$00/9D8B Table: Display functions (used with 9D6F) | |||
$00/9D93 Sub: Set sprite mode (4 bytes) | |||
$00/9DA8 Sub: Main Screen add (1 byte) | |||
$00/9DB6 Sub: Main Screen remove (1 byte) | |||
$00/9DC6 Sub: Sub Screen add (1 byte) | |||
$00/9DD7 Sub: Sub Screen remove (1 byte) | |||
$00/9E79 Sub: Mosaic BG enable (1 byte) | |||
$00/9E8A Sub: Mosaic clear (1 byte) | |||
$00/9E9D Sub: Set Mosaic Size (1 byte) | |||
$00/9EB8 Sub: Increase mosaic size | |||
$00/9ECC Sub: Decrease mosaic size | |||
$00/9EE0 Sub: DMA Transfer (6 bytes) | |||
$00/9F1F Sub: Remove HDMA channel (1 byte) | |||
$00/9F31 Sub: HDMA disable | |||
$00/9F35 Sub: HDMA enable | |||
$00/9F3C Sub: Color Add Select (2 bytes) | |||
$00/9F4F Sub: Color Math Designation (2 bytes) | |||
$00/9F83 Sub: Set RGB (3 bytes) | |||
$00/9FA1 Sub: Set color planes | |||
$00/9FE2 Sub: Add RGB (3 bytes) | |||
$00/A00F Sub: Check $31 for button press (2 bytes: button) | $00/A00F Sub: Check $31 for button press (2 bytes: button) | ||
$00/A022 Sub: Check $21 for button press (2 bytes: button) | $00/A022 Sub: Check $21 for button press (2 bytes: button) | ||
$00/A0AC Sub: Load text to be read | $00/A051 Sub: Loop until RAM is value (4 bytes: 2b RAM, 2b value) | ||
$00/A0AC Sub: Setup Text Parser (3 byte ptr) - Load text and text opcodes to be read | |||
$00/A0BD Sub: Call RNG (1 byte), something with screen | $00/A0BD Sub: Call RNG (1 byte), something with screen | ||
$00/A0C4 Sub: Update screen (1 byte) | |||
$00/A0CB Sub: Unfade from black | $00/A0CB Sub: Unfade from black | ||
$00/A0DB Sub: Fade to black | $00/A0DB Sub: Fade to black | ||
$00/A858 | $00/A1D6 Pointer Table: 8DAD (Seems to govern animations throughout the game) | ||
$00/A881 | $00/A20C Pointer Table: Event Brancher | ||
$00/A902 | $00/A31A Pointer Table: 8DFA (Also seems to govern animations) | ||
$00/A919 | $00/A688 Sub: Set Text Parser (returns long) | ||
$00/A943 | $00/A68C Sub: Set Text Parser | ||
$00/A969 | $00/A7B5 Sub: Read Text Opcode | ||
$00/A9CD | |||
$00/AA04 | Text opcodes: These control formatting in-between the plaintext before it's written to RAM. | ||
$00/A858 Text Opcode 00 - Null terminator/stop reading | |||
$00/A881 Text Opcode 01 - Move cursor to X,Y position | |||
$00/A898 Text Opcode 02 - Used drawing the menus | |||
$00/A8A8 Text Opcode 03 - Sets vertical spacing (03 0E = default) | |||
$00/A8B5 Text Opcode 04 - Similar to 03, uncommon | |||
$00/A8C2 Text Opcode 05 - Determines text delay, the # of frames it takes to write a letter to the screen. | |||
$00/A8DE Text Opcode 06 - Sets text color (white/gray or white/yellow depending on context) | |||
$00/A8EC Text Opcode 0C - Clears the screen and does some other stuff | |||
$00/A902 Text Opcode 0D - Newline | |||
$00/A919 Text Opcode 14 - Writes text in RAM to the screen(2 byte address) | |||
$00/A943 Text Opcode 10 - Writes text in RAM/ROM to the screen(3 byte address) | |||
$00/A969 Text Opcode 11 - Converts number to text(3 byte address) | |||
$00/A9A8 Text Opcode 1C - Sets text scroll speed | |||
$00/A9BD Text Opcode 1D - Sets text scroll speed (1 line at a time) | |||
$00/A9C5 Text Opcode 1E - Sets text scroll speed (fast) | |||
$00/A9CD Text Opcode 7F - Wait for A press | |||
$00/A9E1 Text Opcode 1B - Draws portraits | |||
$00/A9F7 Text Opcode 0F - Sets offset 26 (?) | |||
$00/AA04 Text Opcode 08 - Move cursor to X position | |||
$00/AA11 Text Opcode Text - Reads text if it isn't an opcode. | |||
$00/AC34 Table: Variable Width Font, letter widths | |||
$00/AD14 Graphics: Font tiles - Each letter is eighteen bytes and 12x12 pixels. The first entry is $20 (space) and the last is $7F (reserved). | |||
$00/B3D3 Graphics: Font tiles (end) | |||
$00/BCC8 Sub: Get VWF Length | |||
$00/BCFD Sub: Draw font tile | |||
$00/BE07 Sub: Clears the screen of text | $00/BE07 Sub: Clears the screen of text | ||
$00/C055 Sub: Hit calculation start | $00/C055 Sub: Hit calculation start | ||
$00/C07C Sub: | $00/C07C Sub: Get row bonus | ||
$00/C0B9 Sub: Miss check/crit check | $00/C0B9 Sub: Miss check/crit check | ||
$00/C132 Sub: No-element handling | $00/C132 Sub: No-element handling | ||
Line 64: | Line 287: | ||
$00/D137 Sub: Checks if loaded music is $33 (must be SPC commands) | $00/D137 Sub: Checks if loaded music is $33 (must be SPC commands) | ||
$00/D1AA Sub: Loads HAL Logo theme | $00/D1AA Sub: Loads HAL Logo theme | ||
$00/D20B Table: Song locations (these point to the song data in banks 1E and 1F) | |||
</pre> | |||
==Bank $01: Game setup, gameplay, ending == | ==Bank $01: Game setup, gameplay, ending == | ||
<pre> | |||
$01/8001 Game start | $01/8001 Game start | ||
$01/8053 A bunch of initialization/zeroing functions | $01/8053 A bunch of initialization/zeroing functions | ||
$01/8913 Game over | $01/8913 Game over | ||
$01/8C85 | $01/8C85 Event: Handle dungeon movement | ||
$01/9584 | $01/8D04 Event: Encounter check | ||
$01/8D24 Event: Check for map exit | |||
$01/8DAE Event: Random encounter | |||
$01/9226 Event: (Pointer table) Dungeon menu options | |||
$01/923B Event: Open menu | |||
$01/9260 Event: Look | |||
$01/9584 Event: Item handling outside of battle | |||
$01/9BB6 Pointer: Draw status screen ($08/C93E) | $01/9BB6 Pointer: Draw status screen ($08/C93E) | ||
$01/9BE5 Event: Open map | |||
</pre> | |||
==Bank $02: Battles == | ==Bank $02: Battles == | ||
$02/8CF3 | <pre> | ||
$02/8FC9 | $02/8001 Event: Load data, Enemy 00 | ||
$02/8137 Event: Load data, Enemy 01 | |||
$02/8C59 Event: Load data, Enemy 0C | |||
$02/8CF3 Event: Status handling | |||
$02/8D03 Event: Enemy paralyzed | |||
$02/8D0E Event: Enemy petrified | |||
$02/8D19 Event: Enemy confused | |||
$02/8D27 Event: Enemy asleep | |||
$02/8D50 Event: Enemy's target select | |||
$02/8D65 Event: Enemy's confusion targeting | |||
$02/8D8A Event: Check if Rooks is targetable | |||
$02/8DB3 Event: Check if Spirit is targetable | |||
$02/8DDC Event: Check if Guest1 is targetable | |||
$02/8E05 Event: Check if Guest2 is targetable | |||
$02/8E2E Event: Check if Enemies 1-8 are targetable | |||
$02/8E63 Event: Enemy death check | |||
$02/8E8A Event: Enemy spell attack | |||
$02/8EB6 Event: Enemy physical attack | |||
$02/8EE2 Event: Enemy self-confusion damage | |||
$02/8F24 Event: Enemy death animation | |||
$02/8F65 Event: (Subroutine) Pause for user input | |||
$02/8F79 Event: (Subroutine) Enemy attack animation | |||
$02/8FC9 Pointer Table: Boss animations | |||
$02/8FEA Animation: Attack, Stone Guardian | |||
$02/8FFC Animation: Attack, Iron Guardian | |||
$02/900E Animation: Attack, Cyclops | |||
$02/901A Animation: Attack, Efrite | |||
$02/90B9 Animation: Attack, Rimsala 2 | |||
$02/90FE Event: Add enemy loot to total | |||
$02/913D Sub: Initializes a character/monster's stats from ROM at battle start | $02/913D Sub: Initializes a character/monster's stats from ROM at battle start | ||
</pre> | |||
==Bank $03: Event handling, towns== | ==Bank $03: Event handling, towns== | ||
<pre> | |||
$03/A457 Sub: Load current tile's encounter value | $03/A457 Sub: Load current tile's encounter value | ||
$03/A499 Sub: Update dungeon progress? | $03/A499 Sub: Update dungeon progress? | ||
$03/A52A Dungeon BGM (See Music tab for ID list) | $03/A52A Dungeon BGM (See Music tab for ID list) | ||
$03/A5EB Pointer Table: Map, stairs logic | |||
$03/D5BF Item inventory limit (shops). Default $60 = $30 slots (48 items @ 8 per page) (see $07/AA28) | $03/D5BF Item inventory limit (shops). Default $60 = $30 slots (48 items @ 8 per page) (see $07/AA28) | ||
$03/DDD6 Item slots -1 x2, used after selling an item in town to check when to stop rearranging. (see $07/AA28)(should be $5E?) | $03/DDD6 Item slots -1 x2, used after selling an item in town to check when to stop rearranging. (see $07/AA28)(should be $5E?) | ||
Line 93: | Line 355: | ||
$03/DFAC Bar option 4 MP gain | $03/DFAC Bar option 4 MP gain | ||
$03/E052 Card prices (see Inventory) | $03/E052 Card prices (see Inventory) | ||
$03/E2A8 Set up dialogue cursor | |||
==Bank $04: Graphics== | </pre> | ||
==Bank $04: Town Graphics== | |||
<pre> | |||
$04/8001 Graphics: Town | |||
$04/AC14 Graphics: Galia 1 | |||
$04/B379 Graphics: Galia 2 | |||
$04/B6E4 Graphics: Galia 3 | |||
$04/B7E4 Graphics: Castle 1 | |||
$04/C1D4 Graphics: Castle 2 | |||
$04/C583 Graphics: Castle 3 | |||
$04/C675 Graphics: Doraf 1 | |||
$04/CF7D Graphics: Doraf 2 | |||
$04/D292 Graphics: Doraf 3 | |||
$04/D383 Graphics: Elf Village 1 | |||
$04/D9BF Graphics: Elf Village 2 | |||
$04/DEB4 Graphics: Elf Village 3 | |||
</pre> | |||
==Bank $05: Battles== | ==Bank $05: Battles== | ||
<pre> | |||
$05/9F7B Names, Characters ($0A bytes per entry + 00 delimeter) | $05/9F7B Names, Characters ($0A bytes per entry + 00 delimeter) | ||
$05/9FE9 Names, Enemies ($10 bytes per entry + 00 delimeter) | $05/9FE9 Names, Enemies ($10 bytes per entry + 00 delimeter) | ||
Line 175: | Line 453: | ||
$05/F234 Silver Flask heal amount (15 MP) | $05/F234 Silver Flask heal amount (15 MP) | ||
$05/F249 Gold Flask heal amount (40 MP) | $05/F249 Gold Flask heal amount (40 MP) | ||
</pre> | |||
==Bank $06: Stage select== | ==Bank $06: Graphics (Shops, world map, travel sprites); Stage select data== | ||
$06/DDBD Stage select: Chapter 2 | <pre> | ||
$06/928E Compressed Graphics: Shop, Weapons | |||
$06/9418 Compressed Graphics: Shop, Inn | |||
$06/9626 Compressed Graphics: Shop, Spirit Healer | |||
$06/97C0 Compressed Graphics: Shop, Alchemist | |||
$06/98F6 Compressed Graphics: World Map 1 | |||
$06/C646 Compressed Graphics: World Map 2 | |||
$06/C971 Compressed Graphics: World Map 3 | |||
$06/CB33 Compressed Graphics: World Map 4 | |||
$06/CFC0 Compressed Graphics: World Map 5 | |||
$06/D2DB Compressed Graphics: Travel Sprites, Rooks | |||
$06/D4F6 Compressed Graphics: Travel Sprites, Teefa | |||
$06/D744 Compressed Graphics: Travel Sprites, Salah | |||
$06/D99F Compressed Graphics: Travel Sprites, Darwin | |||
$06/DB1F Compressed Graphics: Travel Sprites, Axs | |||
$06/DDBD Stage select: Chapter 2 (These are essentially pre-made save files) | |||
$06/E2BD Stage select: Chapter 3 | $06/E2BD Stage select: Chapter 3 | ||
$06/E7BD Stage select: Chapter 4 | $06/E7BD Stage select: Chapter 4 | ||
$06/ECBD Stage select: Chapter 5 | $06/ECBD Stage select: Chapter 5 | ||
</pre> | |||
==Bank $07: Dungeons and gameplay== | ==Bank $07: Dungeons and gameplay== | ||
<pre> | |||
$07/8001 Sub: Fighting final boss? | |||
$07/80F2 Tbl: Levelup spells | $07/80F2 Tbl: Levelup spells | ||
$07/8CC4 Sub: Deducts HP from target | $07/8CC4 Sub: Deducts HP from target | ||
Line 193: | Line 488: | ||
$07/A83D Sub: Branches based on treasure chest contents | $07/A83D Sub: Branches based on treasure chest contents | ||
$07/A866 Sub: Card treasure type | $07/A866 Sub: Card treasure type | ||
$07/A872 Sub: Item treasure type | |||
$07/A87E Sub: Equipment treasure type | |||
$07/A88A Sub: GP treasure type | |||
$07/A896 Sub: Monster treasure type (unused) | |||
$07/A8AF Sub: FFFF treasure type (unused???) (returns failure) | |||
$07/A8BB Sub: Empty treasure type (returns failure) | |||
$07/A932 Sub: Loads a card name from ROM | $07/A932 Sub: Loads a card name from ROM | ||
$07/A95C Sub: Loads an item name from ROM | |||
$07/A986 Sub: Loads an equipment name from ROM | |||
$07/A9D4 Sub: Adds a card to the inventory | $07/A9D4 Sub: Adds a card to the inventory | ||
$07/AA18 Sub: Adds an item to the inventory | $07/AA18 Sub: Adds an item to the inventory | ||
$07/AA27 Item inventory limit (chests). Default $60 = $30 slots (48 items @ 8 per page) | $07/AA27 Item inventory limit (chests). Default $60 = $30 slots (48 items @ 8 per page) | ||
$07/AA3D Sub: Adds a weapon to the inventory | $07/AA3D Sub: Adds a weapon to the inventory | ||
$07/AA4D Equipment inventory limit (chests). Default $40 = $20 slots (32 items @ 8 per page) | $07/AA4D Equipment inventory limit (chests). Default $40 = $20 slots (32 items @ 8 per page) | ||
$07/AA65 Sub: Adds GP to total | $07/AA65 Sub: Adds GP to total | ||
$07/AA6B Max GP (FFFF) | $07/AA6B Max GP (FFFF) | ||
Line 223: | Line 518: | ||
$07/C8E5 SFX for Change Attribute | $07/C8E5 SFX for Change Attribute | ||
$07/C8E4 SFX for Buffs | $07/C8E4 SFX for Buffs | ||
</pre> | |||
==Bank $08: Small scripts== | ==Bank $08: Small scripts== | ||
<pre> | |||
$08/8000 Script, Battle/Towns/Items/Magic | $08/8000 Script, Battle/Towns/Items/Magic | ||
$08/9650 Spell descriptions | $08/9650 Spell descriptions | ||
Line 230: | Line 526: | ||
$08/C9F6 Status screen, current spirit (161 bytes) | $08/C9F6 Status screen, current spirit (161 bytes) | ||
$08/D3C3 Alchemist conversations | $08/D3C3 Alchemist conversations | ||
</pre> | |||
==Bank $09: Unknown data== | |||
<pre> | |||
$09/80D3 Pointer table | |||
$09/8215 Pointer table | |||
$09/835D Pointer table | |||
$09/83D3 Pointer table | |||
$09/843B Pointer table | |||
$09/84FD Pointer table | |||
$09/85C5 Pointer table | |||
$09/868D Pointer table | |||
$09/98FB Pointer table | |||
</pre> | |||
==Bank $0A: Extended font== | |||
<pre> | |||
(This is data left in from the Japanese version - they're 12x12 pixels in 1bpp format) | |||
$0A/8000 Graphics: Punctuation, a different font alphabet, yen | |||
$0A/86E4 Graphics: Symbols | |||
$0A/9560 Graphics: Numbers | |||
$0A/9692 Graphics: Latin upper case | |||
$0A/98D2 Graphics: Latin lower case | |||
$0A/9B12 Graphics: Hiragana | |||
$0A/A1D2 Graphics: Katakana | |||
$0A/A892 Graphics: Greek upper case | |||
$0A/AAC0 Graphics: Greek lower case | |||
$0A/AF52 Graphics: Cyrillic upper case | |||
$0A/B2B2 Graphics: Cyrillic lower case | |||
$0A/BCD2 Graphics: Kana half-width | |||
$0A/C812 Graphics: Kanji | |||
</pre> | |||
==Bank $0B: Kanji== | |||
==Bank $0C: Kanji, Main story== | |||
<pre> | |||
(Text is in plaintext, so it's easy to search for in the ROM.) | |||
$0C/9CF9 Graphics: Kanji (end) | |||
$0C/A010 Script 001: Rooks' introduction | |||
$0C/A23A Script 002: You look healthy | |||
$0C/A7A6 Script 003: Something stung me | |||
$0C/F703 Script 117: Prelude to the final battle | |||
$0C/F7C2 Script Sub: MACRO 118 | |||
$0C/F7E3 Script Sub: PROMPT_ROOKS | |||
$0C/FA1B Script Sub: WAIT_NEWLINE | |||
$0C/FAA5 Script Sub: WAIT_CLEAR | |||
</pre> | |||
==Bank $0D: Compressed graphics== | |||
<pre> | |||
$0D/8042 HUD graphics | |||
$0D/833F Font for character cards | |||
$0D/91EF Font for character cards (end) | |||
$0D/9590 Weapons menu | |||
$0D/95F2 Spell data MVN1 | |||
$0D/9712 Spell data MVN10 | |||
$0D/B711 Compass graphics | |||
</pre> | |||
==Bank $0E: VRAM data and graphics== | |||
<pre> | |||
$0E/8048 Tile Data: Something1 - Loaded after a continue through DMA[1] to VRAM 0061 | |||
$0E/8052 Tile Data: Something2 - Loaded after a continue through DMA[1] to VRAM 0081 | |||
$0E/805C Tile Data: Something3 - Loaded after a continue through DMA[1] to VRAM 00A1 | |||
$0E/809B Tile Data: Something12 - Loads tile #s 28-2C into VRAM 009A | |||
$0E/8191 Graphics: Card, Rooks, Idle | |||
$0E/8551 Graphics: Card, Rooks, Battle | |||
$0E/88E5 Graphics: Card, Rooks, Attack | |||
$0E/8C1F Graphics: Card, Grim Reaper | |||
$0E/8FCC Graphics: Card, torn | |||
$0E/92F9 Graphics: Card, skull | |||
$0E/95A3 Graphics: Card, Sylph, Idle | |||
$0E/99D9 Graphics: Card, Sylph, Battle | |||
$0E/9D79 Graphics: Card, Sylph, Attack | |||
$0E/A12C Graphics: Card, Dao, Idle | |||
$0E/A4DF Graphics: Card, Dao, Battle | |||
$0E/A8CD Graphics: Card, Dao, Attack | |||
$0E/AC91 Graphics: Card, Marid, Idle | |||
$0E/B08D Graphics: Card, Marid, Battle | |||
$0E/B3D1 Graphics: Card, Marid, Attack | |||
$0E/B715 Graphics: Card, Efrite, Idle | |||
$0E/BB0E Graphics: Card, Efrite, Battle | |||
$0E/BEA9 Graphics: Card, Efrite, Attack | |||
$0E/C292 Graphics: Card, BadTeefa, Idle | |||
$0E/C6AB Graphics: Card, GoodTeefa, Idle | |||
$0E/CAC5 Graphics: Card, Teefa, Battle | |||
$0E/CE75 Graphics: Card, Teefa, Attack | |||
$0E/D25C Graphics: Card, Salah, Idle | |||
$0E/D66F Graphics: Card, Salah, Battle | |||
$0E/DA31 Graphics: Card, Salah, Attack | |||
$0E/DDF8 Graphics: Card, Darwin, Idle | |||
$0E/E1D3 Graphics: Card, Darwin, Battle | |||
$0E/E518 Graphics: Card, Darwin, Attack | |||
$0E/E863 Graphics: Card, Axs, Idle | |||
$0E/EC0F Graphics: Card, Axs, Battle | |||
$0E/EF6B Graphics: Card, Axs, Attack | |||
</pre> | |||
==Bank $0F: Battle animations== | |||
<pre> | |||
$0F/807C Animation: Small attack | |||
$0F/808C Animation: Medium attack | |||
$0F/809C Animation: Large attack | |||
$0F/817A Pointer table: Animation data? (This is called by Pointer Table 8DFA) | |||
$0F/CB2B Event: Spell animation | |||
$0F/CC01 Animation: Lightning | |||
$0F/CC06 Animation: Smash | |||
$0F/CC0B Animation: Water | |||
$0F/CC10 Animation: Flame | |||
$0F/CC1F Animation: Attribute 1 | |||
$0F/CC9D Animation: Attribute 11 | |||
$0F/CCB1 Animation: Call Wind Spirit | |||
$0F/CCC5 Animation: Dummied | |||
$0F/CCC6 Animation: Swirly | |||
$0F/CEB9 Animation: 5D: Rooks Unpetrify cutscene | |||
$0F/CF00 Animation: 5E: Ariel Attribute 11 cutscene | |||
$0F/CF2B Event: Single spell animation | |||
</pre> | |||
==Bank $10: Compressed gfx== | |||
<pre> | |||
$10/8001 Graphics: Balnea Temple/Reused bricks | |||
$10/C58D Graphics: Balnea Temple (end) | |||
</pre> | |||
==Bank $11: Compressed gfx== | |||
<pre> | |||
$11/8A91 Graphics: Forest of Doubt | |||
$11/FBA7 Graphics: Forest of Doubt (end) | |||
</pre> | |||
==Bank $12: Compressed gfx== | |||
<pre> | |||
$12/8571 Graphics: Bintel Castle | |||
$12/E35E Graphics: Bintel Castle (end) | |||
</pre> | |||
==Bank $13: Graphics and Maps== | |||
<pre> | |||
$13/8001 Graphics: Draven Pass | |||
$13/DACA Graphics: Draven Pass (end) | |||
$13/EBF6 Map: Balnea Temple 1F | |||
$13/ECFE Map: Balnea Temple 2F | |||
$13/EE08 Map: Draven Pass | |||
$13/EE8C Map: Crimson Valley | |||
$13/EEF2 Map: Forest of Doubt | |||
$13/F763 Map: Bintel Castle | |||
$13/F9A6 Map: Stavery Tower (Chapter 5) | |||
</pre> | |||
==Bank $14: Compressed sprites== | |||
<pre> | |||
(This bank starts with a bunch of Decomp80 entries that are basically pointers elsewhere.) | |||
$14/8001 Decomp80: Location of Ariel graphics | |||
$14/8009 Decomp80: Location of Teefa graphics | |||
$14/8012 Decomp80: Location of Crystal Room 1 graphics | |||
$14/801A Decomp80: Location of Crystal Room 2 graphics | |||
$14/8022 Decomp80: Location of Crystal Room 3 graphics | |||
$14/91D1 Graphics: Stoned Axs | |||
$14/F25A Graphics: Darwin NPC | |||
</pre> | |||
==Bank $15: Compressed sprites== | |||
<pre> | |||
$15/B4F1 Graphics: The Seven MacGuffins (ends at B87A) | |||
$15/EE8D Graphics: Ariel kneeling | |||
</pre> | |||
==Bank $16: Compressed sprites== | |||
<pre> | |||
$16/B8EC Graphics: Final fight | |||
$16/BE83 Graphics: The Three MacGuffins | |||
Credits text is 5 bytes per letter, in reverse order. | |||
Byte0: 00 normally, or 02 for the final (first) letter. | |||
Byte1: X position - 00 is center screen, 43 is center right, B5 is center left. So negative numbers are left of center. | |||
== | Byte2: Y position - Usually 01 | ||
Byte3: The tile to display. 00="A", 02="B", 04="C", ... 0E="H", 20="I", 22="J", 24="K"... 2E="P", 40="Q", 42="R", ...64-68="KOBY"... 80="ER" | |||
== | Byte4: Font color - 3C for orange text (headers), 3E for white text (names) | ||
$16/D883 Credits Text 00: "Character Designers" | |||
$ | $16/D8D8 Credits Text 01: "Executive Producer" | ||
$ | $16/EE3B Credits Text 42: "Ami Hashikura" | ||
$ | $16/EEDB Credits Text 44: "THE END" | ||
$ | $16/EF17 Pointer Table: Credit Text locations | ||
$ | </pre> | ||
==Bank $17: Initialization== | ==Bank $17: Initialization== | ||
<pre> | |||
$17/8130 Intro script ("This is an historic land") | $17/8130 Intro script ("This is an historic land") | ||
$17/833F Sub: Stage Select (logs your inputs and compares them to the right codes) | |||
$17/840E Sound test | $17/840E Sound test | ||
$17/8417 Sub: Load sound test | |||
$17/874E Text: Intro crawl 1 "According to the ancient legends..." | |||
$17/87BC Text: Intro crawl 2 "Disputes broke out constantly..." | |||
$17/8A6D Text: Intro crawl 7 "King Wagnall was killed..." | |||
$17/9285 HAL logo gfx header | $17/9285 HAL logo gfx header | ||
</pre> | |||
==Bank $18: Treasures, encounters, events== | ==Bank $18: Treasures, encounters, events== | ||
<pre> | |||
$18/802E Sub: Random encounter logic | $18/802E Sub: Random encounter logic | ||
$18/8044 Encounter rate (higher = fewer encounters) (Default $0C) | $18/8044 Encounter rate (higher = fewer encounters) (Default $0C) | ||
Line 293: | Line 747: | ||
$18/91DD Table: Ch4 encounters | $18/91DD Table: Ch4 encounters | ||
$18/9229 Table: Ch5 encounters | $18/9229 Table: Ch5 encounters | ||
$18/ | $18/964F Pointer Table: Every story scene - logic handling | ||
$18/ | $18/968F Pointer Table: Every story scene - event code | ||
$18/ | $18/96CC Story Event 00: Rooks' intro | ||
$18/C551 Story Event 1A: Red and Blue Guardian | |||
$18/C551 Red and Blue Guardian | $18/C6D1 Story Event 1B: Tiamat | ||
$18/C6D1 Tiamat | $18/D019 Epilogue text setup | ||
</pre> | |||
==Bank $19: Enemy graphics== | |||
<pre> | |||
$19/8001 Pointer Table: Enemy Palette data | |||
$19/80A1 Bank Table: Enemy Palette data (the entries are all bank 19) | |||
==Bank $1E | Each of these entries pointed to by the Enemy Palette Data table have the same format. | ||
A header: A word (unknown use), then another word (the number of bytes in the palette, usually 20 (thirty two)). | |||
Then the palette for that individual monster, and finally a 24-bit pointer to the enemy graphics getting colored. For instance, the Goblin and Ogre will have the same pointer but different palette data. | |||
$19/80F1 Palette Header: Goblin | |||
$19/8118 Palette Header: Ogre | |||
$19/813F Palette Header: Slime | |||
$19/8166 Palette Header: Jell | |||
$19/818D Palette Header: Pilferer | |||
$19/81B4 Palette Header: Thief | |||
$19/8D3E Palette Header: Karul | |||
$19/8D85 Palette Header: Galneon 1 | |||
$19/8DEC Palette Header: Galneon 2 | |||
$19/8E53 Palette Header: Rimsala 1 | |||
$19/8EBA Palette Header: Rimsala 2 | |||
$19/8F21 Pointer Table: SourceData 1 - Called after enemy attack animations. The first and second table are used together (1st entry of each, etc) | |||
$19/8F31 Pointer Table: SourceData 2 | |||
$19/8F41 Data: SourceData1 Attack, Swords | |||
$19/9311 Data: SourceData1 Attack, Bite | |||
$19/961C Data: SourceData1 Attack, Sploosh | |||
$19/9955 Data: SourceData1 Attack, Claws | |||
$19/9D22 Data: SourceData1 Attack, Sting | |||
$19/A0D8 Data: SourceData1 Attack, Punch | |||
$19/A3F5 Data: SourceData1 Attack, ??? | |||
$19/A7A1 Data: SourceData1 Attack, Damage star | |||
$19/AF4B Compressed Graphics: Slime | |||
$19/B3B5 Compressed Graphics: Thief | |||
$19/B834 Compressed Graphics: Dog | |||
$19/BF36 Compressed Graphics: Saurian | |||
$19/C414 Compressed Graphics: Lizardman | |||
$19/CACD Compressed Graphics: Chimera | |||
$19/D1B6 Compressed Graphics: Goblin | |||
$19/D8EA Compressed Graphics: Guardian | |||
$19/E391 Compressed Graphics: Tree | |||
$19/EAB2 Compressed Graphics: Flytrap | |||
</pre> | |||
==Bank $1A: Enemy graphics== | |||
<pre> | |||
$1A/8003 Compressed Graphics: Bee | |||
$1A/85C7 Compressed Graphics: Zerel | |||
$1A/936F Compressed Graphics: Cyclops | |||
$1A/9B65 Compressed Graphics: Efrite | |||
$1A/AB44 Compressed Graphics: Mage | |||
$1A/B1AA Compressed Graphics: Zombie | |||
$1A/B823 Compressed Graphics: Skeleton | |||
$1A/BF23 Compressed Graphics: Medusa | |||
$1A/C63A Compressed Graphics: Troll | |||
$1A/CE3C Compressed Graphics: Mimic | |||
$1A/D460 Compressed Graphics: Fighter | |||
$1A/DB45 Compressed Graphics: Sauza | |||
$1A/E79F Compressed Graphics: Hydra | |||
$1A/F18C Compressed Graphics: Ghost | |||
$1A/F843 Compressed Graphics: Shaman | |||
</pre> | |||
==Bank $1B: Enemy graphics== | |||
<pre> | |||
$1B/8003 Compressed Graphics: Minotaur | |||
$1B/880D Compressed Graphics: Giant | |||
$1B/9005 Compressed Graphics: Dragon | |||
$1B/9C58 Compressed Graphics: Darah and Barah | |||
$1B/B0EC Compressed Graphics: Ariel | |||
$1B/BD89 Compressed Graphics: Teefa | |||
$1B/CB84 Compressed Graphics: Karul | |||
$1B/D912 Compressed Graphics: Galneon 1 and 2 | |||
</pre> | |||
==Bank $1C: Enemy graphics== | |||
<pre> | |||
$1C/C21F Compressed Graphics: Rimsala 1 | |||
$1C/D56A Compressed Graphics: Rimsala 2 | |||
$1C/F297 Compressed Graphics: Rimsala 2 part 2 | |||
</pre> | |||
==Bank $1D: Unknown or compressed data== | |||
==Bank $1E: Sound and Music== | |||
<pre> | |||
$1E/97B0 Instrument data (6 bytes per entry) | |||
$1E/9899 Instrument data (end) | |||
$1E/A4D6 Sound effects (end) | |||
$1E/A4D8 Song 33: Symphony of Elemen | |||
$1E/BADC Song 34: HAL logo theme | |||
$1E/BBF4 Song 35: Our Story's Name | |||
$1E/C04A Song 36: Prologue to the Tale | |||
$1E/C997 Song 37: Death Of A Loved One | |||
$1E/CC55 Song 38: A New Chapter | |||
$1E/D0A9 Song 39: Two Beautiful Princesses | |||
$1E/D31C Song 3A | |||
$1E/D469 Song 3B | |||
$1E/D660 Song 3C | |||
$1E/D7DF Song 3D | |||
$1E/D86A Song 3E: Reinoll ~ Generous Hermit | |||
$1E/DE50 Song 3F: Ariel ~ Soldier of Betrayal (uh, spoilers.) | |||
$1E/E133 Song 40: The Legend | |||
$1E/E603 Song 42: Trickery | |||
$1E/EC78 Song 43: Darwin ~ Treasure Hunter | |||
$1E/F11A Song 44: Alchemist's Workshop | |||
</pre> | </pre> | ||
==Bank $1F: Music== | |||
{{Internal Data}} |
Latest revision as of 19:20, 9 February 2025
(Back to Main page)
FOREWORD: How to read Arcana's event code
The majority of Arcana's subroutines are through opcodes, which is like reading another assembly language. (See this page's Bank 00 section for command details.) The code uses a set of commands, the animations use a different set of commands, and drawing text to the screen uses a third set. They are very difficult to follow with just a standard tracelog. Predominantly when tracing or breakpointing code, you'll see a lot of the 00/902B command "LDA [$10]". (This is SNES for: read the address stored in the variable $xx10, read the value at that address, and store that value in the accumulator.) After 902B reads an opcode [byte], it goes to a pointer table and calls the code for that command. (For instance if 902B reads a "07", the table tells it to call 00/9527. 9527 reads the next 3 bytes after the 07, then jumps execution there. In other words, it's a subroutine call.) Since many commands read adjacent data, it is *much* easier to follow along if you can read ahead a few bytes too. So, it is highly recommended to follow along in a hex editor when tracing. Reminder that this is a LoROM game, so something the emulator says is at 01/9260 will be at byte 9260 in your separate hex editor. Something at 02/8000 will be at byte 10000. A tool like Lunar Address can easily convert between PC addresses and SNES LoROM addresses, it's a good idea to double check before digging around in the wrong area. Also keep in mind that the SNES is little-endian, so a 3-byte pointer 07/B220 is read in reverse as 20 B2 07. So here's an example. This is the event handling for the "Look" command that checks for treasure chests. These show the ROM location being read, the bytes being read (the opcode is spaced separately from the parameters for clarity), and a summary of what happens there. 01/9260: 30 FF Clear the animation ID 01/9262: 07 20 B2 07 Call subroutine 07/B220, which returns 1 if in a dungeon or 0 if in a town 01/9266: 0B 72 92 If false/0, jump to 9272 (don't open a treasure chest if in town) 01/9269: 07 16 A8 07 80 00 Call subroutine 07/A816, compare current floor tile to 0080 (treasure chest tile). Return 1 if true. 01/926F: 0C 7D 92 If true, jump to 927D 01/9272: 07 AC A0 00 BD 8F 08 00 Call subroutine 00/A0AC to display text at 08/8FBD "Nothing here !" (the 00 parameter is used by the text parser) 01/927A: 1A 8A 92 Jump always to 928A (waits for an A press, then closes the menu) 01/927D: 07 27 A8 07 Call subroutine 07/A827 (looks up and saves the treasure chest contents, and animates the chest opening) 01/9281: 06 1E Wait 30 frames (for the chest to finish opening) 01/9283: 07 3D A8 07 Call subroutine 07/A83D (get treasure contents, add money/item/equipment to inventory)(returns 1 if the chest is a trap) 01/9287: 0C A5 92 If true (trapped chest), jump to 92A5 to start a random encounter (this is dummied out) 01/928A: 06 01 Wait 1 frame 01/928C: 07 03 BA 07 00 Call subroutine 07/BA03 (wait for an A press) (the 00 parameter is related to the pause status) 01/9291: 0B 8A 92 If false (the player hasn't pressed A) loop back to 928A. 01/9294: 06 0A Wait 10 frames 01/9297: 07 07 9D 00 74 B6 01 Call subroutine 00/9D07 to read formatted data from 01/B674 (related to closing the text box) 01/929D: 06 01 Wait 1 frame 01/929F: 16 7B 15 01 00 Set RAM address $157B to 0001 (display the compass again) 01/92A4: 1C Return from subroutine (return to wherever the code was when 01/9260 was called) This example is about standard in length. It's much easier to read this kind of code this way, but it's a laborious process by hand. *Most* opcodes read a set number of bytes, with the exception of subroutines and switch-case statements. So with the habit of seeing a 07 followed by a 3 byte pointer, or 0B followed by a 2 byte pointer, it's much easier to spot where the code is going next. Now for something different, an example of text opcodes. The breakpoint for these is 00/A7B5 "LDA [$06]", where $06 is the current character or command. This is from SCRIPT_003, where Rooks meets Ariel. The subroutines are shown to give a sense of how often the game calls the same commands. 0C/A27A: 10 C2 F7 0C Read text subroutine 0C/F7C2 (MACRO_118) MACRO_118: (This initializes the dialogue box) 0C/F7C2: 06 0D Set the text color to white 0C/F7C4: 0C Clear the dialogue box 0C/F7C5: 01 00 06 Move the cursor to (00,06) (the top left of the dialogue box) 0C/F7C8: 03 0E Use normal vertical spacing 0C/F7CA: 00 Return from text subroutine 0C/A27E: 10 E3 F7 0C Read text subroutine 0C/F7E3 (PROMPT_ROOKS) PROMPT_ROOKS: (This is a subroutine to write Rooks' name and a newline, since he talks a lot) 0C/F7E3: 05 FF 14 Wait 14 frames 0C/F7E6: 0C Clear the dialogue box 0C/F7E7: 0D Newline (for some reason this is required for the wait to work) 0C/F7E8: 01 00 06 Move the cursor to (00,06) (the top left of the dialogue box) 0C/F7EB: Rooks Rooks 0C/F7F0: 05 01 01 Text speed 1 character per frame (fastest) 0C/F7F3: 0D Newline 0C/F7F4: 00 Return from text subroutine 0C/A282: "Ariel, is that Ariel?" 0C/A299: 10 A5 FA 0C Read text subroutine 0C/FAA5 (WAIT_CLEAR) WAIT_CLEAR: (This waits for an A press, and clears anyone's face who's speaking) 0C/FAA5: 1B 00 FE Stop moving lips 0C/FAA8: 7F Pause for user input 0C/FAA9: 1B 00 FF Clear portrait 0C/FAAC: 0D Newline 0C/FAAD: 00 Return from text subroutine 0C/A29D: 10 F5 F7 0C Read text subroutine 0C/F7F5 (DISPLAY_ARIEL) DISPLAY_ARIEL: (Loads Ariel's face, prints his name without moving his mouth, then starts moving his mouth.) 0C/F7F5: 1B 00 01 Show Ariel's face (not speaking) 0C/F7F8: 05 FF 14 Wait 14 frames 0C/F7FB: 0C Clear the dialogue box 0C/F7FC: 0D Newline (for some reason this is required for the wait to work) 0C/F7FD: 01 00 06 Move the cursor to (00,06) (the top left of the dialogue box) 0C/F800: Ariel Ariel 0C/F805: 05 01 01 Text speed 1 character per frame (fastest) 0C/F808: 0D Newline 0C/F809: 1B 00 00 Show Ariel's face (start moving Ariel's mouth so the text coming up looks like he's talking) 0C/F80C: 00 Return from text subroutine 0C/A2A1: "I haven't seen you " 0C/A2B5: 0D Newline 0C/A2B6: " since you were a boy." 0C/A2CD: 10 A5 FA 0C Read subroutine WAIT_CLEAR 0C/A2D1: 10 E3 F7 0C Read subroutine PROMPT_ROOKS 0C/A2D5: "Yes." As you can see, while code opcodes called actual ASM, text opcodes only call more text opcodes. But that's a general rundown of what things look like internally.
Bank $00: Common functions; Event handling
$00/8153 Sub: NMI disable $00/8167 Sub: NMI enable $00/817B Sub: Display Force Blanking $00/818F Sub: Set Display $00/81BF Sub: Set BG mode (1 byte parameter) $00/81D8 Sub: Set OBJ Address (1 byte parameter) $00/8208 Sub: Set OBJ Size (1 byte parameter) $00/826E Sub: Graphics dungeon stuff $00/8327 Sub: Update screen $00/8400 Sub: Update background scroll $00/8465 Sub: Video stuff $00/84B9 Table: DMA Control $00/84D0 Table: DMA Destination $00/84E7 Table: Videoport Control $00/84FE Sub: RAM Decomp80 (1 byte) $00/8521 Sub: Decomp80 setup - Decompressor helper function. Reads a data entry that looks like "80 00 xx [xx/xxxx] xx xx" and passes the pointer to the decompressor. $00/8766 Sub: Decompression. Similar to Run Length Encoding. $00/88E2 Sub: Wait for VBLANK $00/89F1 Sub: RNG (1 byte parameter) - can take a value ("5") and roll a range ("0-4"), or can provide a random 2 byte number through $1E0A. $00/8A3D Sub: Multiply to $1E00 $00/8B11 Sub: Set Mode7 $00/8BE4 Table: Bitwise1 $00/8BF4 Table: Bitwise2 $00/8C04 Table: HDMA channels (an AND table where all but 1 bit is set) $00/8C34 Table: Bit flags $00/9008 Sub: Main loop, pointer setup $00/902B Sub: Read Event Code. Reads the event opcode from program counter $1E10. (Very important line! Uses a jump table to run opcodes as code.) Events: These opcodes run over half of the game. Most commonly you'll find code 07 for long calling a subroutine. $00/90E7 Event Opcode 00 - This one is complicated, it's similar to a return $00/90FA Event Opcode 01 - Loops a number of times (1 byte input) $00/911E Event Opcode 02 - Loop end: jumps back to opcode 01 $00/9140 Event Opcode 1A - Jump always (2 bytes) $00/9148 Event Opcode 03 - Jump long (3 bytes) $00/915A Event Opcode 1B - Call subroutine (2 bytes) $00/9177 Event Opcode 1C - Return from short subroutine/1B $00/918D Event Opcode 04 - Call subroutine (3 bytes) $00/91BB Event Opcode 05 - Return from long subroutine/04 $00/91DA Event Opcode 06 - Delay x frames (1 byte) $00/91EA Animation Opcodes 30-37 (1 byte) - Sets or zeros the animation ID $0A7B,x $00/9202 Animation Opcodes 38-3F (2 bytes) - Sets the cursor X position $00/9250 Animation Opcodes 40-47 (2 bytes) - Sets the cursor Y position $00/929E Animation Opcodes E0-E7 (2 bytes) $00/92D7 Animation Opcodes 58-5F (2 bytes) $00/92F8 Animation Opcodes 60-67 (2 bytes) $00/9319 Animation Opcodes F0-F7 (2 bytes) $00/933A Animation Opcodes 68-6F (2 bytes) $00/9362 Animation Opcodes 70-77 (2 bytes) $00/938A Animation Opcodes F8-FF (2 bytes) $00/93B2 Animation Opcodes 78-7F (3 bytes) - Reads an x offset, then stores 2bytes in $0FEF,x and zeros $0FFF,x (?) $00/93CA Animation Opcodes 80-87 (3 bytes) $00/93E2 Animation Opcodes 88-8F (3 bytes) $00/9409 Animation Opcodes 90-97 (3 bytes) $00/9430 Animation Opcodes 98-9F (3 bytes) $00/945E Animation Opcodes A0-A7 (3 bytes) $00/948C Animation Opcodes 48-4F (2 bytes) - Adds to a total at $0937,x $00/949F Animation Opcodes 50-57 (2 bytes) - Adds to a total at $095B,x $00/94B2 Animation Opcodes E8-EF (2 bytes) - Adds to a total at $097F,x $00/94C5 Animation Opcodes C0-C7 (3 bytes) $00/94F7 Animation Opcodes D0-D7 (0 bytes) - Zeros some stuff $00/950F Animation Opcodes D8-DF (1 byte) - Takes an offset and zeros some stuff $00/9527 Event Opcode 07 (3 bytes) - Call a subroutine. (Runs code, returns with RTL) $00/954D Event Opcode 0B (2 bytes) - Jump if false $00/9562 Event Opcode 0C (2 bytes) - Jump if true $00/9577 Event Opcode 11 (? bytes) - Switch-case: jump based on return value. Takes 1 byte (# of entries) plus 2 bytes per entry for the jump pointers. $00/959D Event Opcode 12 (? bytes) - Similar to 11, a switch-case $00/95C7 Event Opcode 0D (0 bytes) - Similar to 00, some kind of return. $00/95DF Event Opcode 08 (2 bytes) - Similar to 1B, some kind of branch to a 2 byte pointer. Clears the animation loop. $00/960C Event Opcode 14 (1 byte) $00/963F Event Opcode 09 (3 bytes) - Similar to 04, some kind of long pointer jump. $00/9655 Event Opcode 0A (0 bytes) - Clears the current animation loop. $00/965F Animation Opcodes A8-AF (0 bytes) - Increment animation ID (A8 = high speed, AF = low speed) $00/9668 Animation Opcodes B0-B7 (0 bytes) - Decrement animation ID $00/9671 Animation Opcodes B8-BF (1 byte) - Adds (amount) to the animation ID $00/968D Event Opcode 19 (5 bytes?)- Similar to 0E, compares values $00/96B8 Event Opcode 15 (4 bytes) - Compares an actor ID with a value. $00/96CD Event Opcode 0E (5 bytes) - Compares RAM to a value using a comparator (RAM Operations table) $00/96F2 Table: RAM Operations (has pointers to functions for AND, OR, add, and XOR) $00/9717 Event Opcode 0F (3 bytes) - Set actor (1 byte) to value (2 bytes). See Actor Arrays table. $00/9739 Table: Actor Arrays - Pointers to RAM 09A3, 09C7, 09EB, 0A0F. These are used with an X offset to track various information. AKA var0, var1, var2, var3. $00/9741 Event Opcode 10 $00/974A Event Opcode 13 (3 bytes) - Set RAM address (2 bytes) to value (1 byte) $00/975F Event Opcode 16 (4 bytes) - Set RAM address (2 bytes) to value (2 bytes) $00/9772 Event Opcode 17 $00/9791 Event Opcode 18 $00/97A0 Event Opcode 1D (3 bytes) - Stores a 2 byte pointer to $0A9F,x and the bank to $0AC3,x $00/97B6 Event Opcode 1E (2 bytes) - Load value $00/97C5 Event Opcode 1F (2 bytes) - Load value at address $00/97D8 Event Opcode 20 $00/97F5 Event Opcode 21 $00/9814 Event Opcode 22 $00/982A Event Opcode 23 $00/9847 Event Opcode 24 (1 byte) - Load a value from 1 of 4 arrays $00/9864 Event Opcode 25 (1 byte) - Similar to 24 but sets the loop variable $0B9F,y $00/9AF0 Sub: Get Event Code (1 byte) - Reads the next event opcode from the program counter $1E10 $00/9AF8 Sub: Get Event Code (1 byte) (returns long) $00/9B00 Sub: Get Event Code (2 bytes) $00/9B07 Sub: Get Event Code (2 bytes) (returns long) $00/9C3C Sub: Set/Get Music (1 byte) $00/9C44 Sub: Set/Get SFX (1 byte) $00/9CAE Sub: Load sprite (14 bytes) $00/9CBC Sub: Character join (13 bytes) $00/9CF9 Sub: Decomp80 Setup (3 bytes) $00/9D34 Sub: Setup Display Stuff (8 bytes) $00/9D69 Sub: Read BG mode (1 byte) $00/9D6F Sub: Display brancher (6 bytes) - byte0: 0-3 (function to call), byte1: A register, byte2-3: X register, byte4-5: Y register $00/9D8B Table: Display functions (used with 9D6F) $00/9D93 Sub: Set sprite mode (4 bytes) $00/9DA8 Sub: Main Screen add (1 byte) $00/9DB6 Sub: Main Screen remove (1 byte) $00/9DC6 Sub: Sub Screen add (1 byte) $00/9DD7 Sub: Sub Screen remove (1 byte) $00/9E79 Sub: Mosaic BG enable (1 byte) $00/9E8A Sub: Mosaic clear (1 byte) $00/9E9D Sub: Set Mosaic Size (1 byte) $00/9EB8 Sub: Increase mosaic size $00/9ECC Sub: Decrease mosaic size $00/9EE0 Sub: DMA Transfer (6 bytes) $00/9F1F Sub: Remove HDMA channel (1 byte) $00/9F31 Sub: HDMA disable $00/9F35 Sub: HDMA enable $00/9F3C Sub: Color Add Select (2 bytes) $00/9F4F Sub: Color Math Designation (2 bytes) $00/9F83 Sub: Set RGB (3 bytes) $00/9FA1 Sub: Set color planes $00/9FE2 Sub: Add RGB (3 bytes) $00/A00F Sub: Check $31 for button press (2 bytes: button) $00/A022 Sub: Check $21 for button press (2 bytes: button) $00/A051 Sub: Loop until RAM is value (4 bytes: 2b RAM, 2b value) $00/A0AC Sub: Setup Text Parser (3 byte ptr) - Load text and text opcodes to be read $00/A0BD Sub: Call RNG (1 byte), something with screen $00/A0C4 Sub: Update screen (1 byte) $00/A0CB Sub: Unfade from black $00/A0DB Sub: Fade to black $00/A1D6 Pointer Table: 8DAD (Seems to govern animations throughout the game) $00/A20C Pointer Table: Event Brancher $00/A31A Pointer Table: 8DFA (Also seems to govern animations) $00/A688 Sub: Set Text Parser (returns long) $00/A68C Sub: Set Text Parser $00/A7B5 Sub: Read Text Opcode Text opcodes: These control formatting in-between the plaintext before it's written to RAM. $00/A858 Text Opcode 00 - Null terminator/stop reading $00/A881 Text Opcode 01 - Move cursor to X,Y position $00/A898 Text Opcode 02 - Used drawing the menus $00/A8A8 Text Opcode 03 - Sets vertical spacing (03 0E = default) $00/A8B5 Text Opcode 04 - Similar to 03, uncommon $00/A8C2 Text Opcode 05 - Determines text delay, the # of frames it takes to write a letter to the screen. $00/A8DE Text Opcode 06 - Sets text color (white/gray or white/yellow depending on context) $00/A8EC Text Opcode 0C - Clears the screen and does some other stuff $00/A902 Text Opcode 0D - Newline $00/A919 Text Opcode 14 - Writes text in RAM to the screen(2 byte address) $00/A943 Text Opcode 10 - Writes text in RAM/ROM to the screen(3 byte address) $00/A969 Text Opcode 11 - Converts number to text(3 byte address) $00/A9A8 Text Opcode 1C - Sets text scroll speed $00/A9BD Text Opcode 1D - Sets text scroll speed (1 line at a time) $00/A9C5 Text Opcode 1E - Sets text scroll speed (fast) $00/A9CD Text Opcode 7F - Wait for A press $00/A9E1 Text Opcode 1B - Draws portraits $00/A9F7 Text Opcode 0F - Sets offset 26 (?) $00/AA04 Text Opcode 08 - Move cursor to X position $00/AA11 Text Opcode Text - Reads text if it isn't an opcode. $00/AC34 Table: Variable Width Font, letter widths $00/AD14 Graphics: Font tiles - Each letter is eighteen bytes and 12x12 pixels. The first entry is $20 (space) and the last is $7F (reserved). $00/B3D3 Graphics: Font tiles (end) $00/BCC8 Sub: Get VWF Length $00/BCFD Sub: Draw font tile $00/BE07 Sub: Clears the screen of text $00/C055 Sub: Hit calculation start $00/C07C Sub: Get row bonus $00/C0B9 Sub: Miss check/crit check $00/C132 Sub: No-element handling $00/C2D4 Sub: Check if damage is over 999 $00/C30C Sub: Load attacking Element $00/C3CA Sub: More element handling $00/C431 Sub: Attack vs. Defense $00/C585 Sub: Load stat boost modifier $00/C5B1 Sub: Check for dead/removed actors, more $00/C658 Sub: Load Strength modifier $00/C66A Sub: Load Endurance modifier $00/C676 Sub: Load Alertness modifier $00/C68A Sub: Load Intelligence $00/C6A7 Sub: Load Intelligence $00/C6C4 Sub: Load Intelligence $00/C6DC Sub: Lots of branching. Returns crit chance or other variables $00/C781 Sub: Load Armor defense $00/C856 Sub: Loads spell power/element $00/C88B Sub: Multiplication (A * X) $00/C8A1 Sub: Multiplication (AA * X) $00/C8C2 Sub: Division (Returns A remainder, X result) $00/D137 Sub: Checks if loaded music is $33 (must be SPC commands) $00/D1AA Sub: Loads HAL Logo theme $00/D20B Table: Song locations (these point to the song data in banks 1E and 1F)
Bank $01: Game setup, gameplay, ending
$01/8001 Game start $01/8053 A bunch of initialization/zeroing functions $01/8913 Game over $01/8C85 Event: Handle dungeon movement $01/8D04 Event: Encounter check $01/8D24 Event: Check for map exit $01/8DAE Event: Random encounter $01/9226 Event: (Pointer table) Dungeon menu options $01/923B Event: Open menu $01/9260 Event: Look $01/9584 Event: Item handling outside of battle $01/9BB6 Pointer: Draw status screen ($08/C93E) $01/9BE5 Event: Open map
Bank $02: Battles
$02/8001 Event: Load data, Enemy 00 $02/8137 Event: Load data, Enemy 01 $02/8C59 Event: Load data, Enemy 0C $02/8CF3 Event: Status handling $02/8D03 Event: Enemy paralyzed $02/8D0E Event: Enemy petrified $02/8D19 Event: Enemy confused $02/8D27 Event: Enemy asleep $02/8D50 Event: Enemy's target select $02/8D65 Event: Enemy's confusion targeting $02/8D8A Event: Check if Rooks is targetable $02/8DB3 Event: Check if Spirit is targetable $02/8DDC Event: Check if Guest1 is targetable $02/8E05 Event: Check if Guest2 is targetable $02/8E2E Event: Check if Enemies 1-8 are targetable $02/8E63 Event: Enemy death check $02/8E8A Event: Enemy spell attack $02/8EB6 Event: Enemy physical attack $02/8EE2 Event: Enemy self-confusion damage $02/8F24 Event: Enemy death animation $02/8F65 Event: (Subroutine) Pause for user input $02/8F79 Event: (Subroutine) Enemy attack animation $02/8FC9 Pointer Table: Boss animations $02/8FEA Animation: Attack, Stone Guardian $02/8FFC Animation: Attack, Iron Guardian $02/900E Animation: Attack, Cyclops $02/901A Animation: Attack, Efrite $02/90B9 Animation: Attack, Rimsala 2 $02/90FE Event: Add enemy loot to total $02/913D Sub: Initializes a character/monster's stats from ROM at battle start
Bank $03: Event handling, towns
$03/A457 Sub: Load current tile's encounter value $03/A499 Sub: Update dungeon progress? $03/A52A Dungeon BGM (See Music tab for ID list) $03/A5EB Pointer Table: Map, stairs logic $03/D5BF Item inventory limit (shops). Default $60 = $30 slots (48 items @ 8 per page) (see $07/AA28) $03/DDD6 Item slots -1 x2, used after selling an item in town to check when to stop rearranging. (see $07/AA28)(should be $5E?) $03/DF27 Bar prices (you know, the Alchemist guy) (NOTE: His prices are also plaintext in his dialogue and need to be edited separately) $03/DFA2 Bar option 2 HP gain $03/DFA4 Bar option 3 HP gain $03/DFA6 Bar option 4 HP gain $03/DFA8 Bar option 2 MP gain $03/DFAA Bar option 3 MP gain $03/DFAC Bar option 4 MP gain $03/E052 Card prices (see Inventory) $03/E2A8 Set up dialogue cursor
Bank $04: Town Graphics
$04/8001 Graphics: Town $04/AC14 Graphics: Galia 1 $04/B379 Graphics: Galia 2 $04/B6E4 Graphics: Galia 3 $04/B7E4 Graphics: Castle 1 $04/C1D4 Graphics: Castle 2 $04/C583 Graphics: Castle 3 $04/C675 Graphics: Doraf 1 $04/CF7D Graphics: Doraf 2 $04/D292 Graphics: Doraf 3 $04/D383 Graphics: Elf Village 1 $04/D9BF Graphics: Elf Village 2 $04/DEB4 Graphics: Elf Village 3
Bank $05: Battles
$05/9F7B Names, Characters ($0A bytes per entry + 00 delimeter) $05/9FE9 Names, Enemies ($10 bytes per entry + 00 delimeter) $05/A539 Enemy postfixes A-H (I forget what 81 40 means though) $05/A554 Classes, Characters ($10 bytes per entry + 00 delimeter) NOTE: Using too long a name will result in a blank line. $05/A5FE Names, Areas ($10 bytes per entry + 00 delimeter) $05/A895 Names, Elements ($06 bytes per entry + 00 delimeter) $05/A8BF Names, Status effects ($0C bytes per entry + 00 delimeter) $05/A91A EXP to next level, Rooks? $05/A992 EXP to next level, Sylph? $05/AA0A EXP to next level, Dao? $05/AA82 EXP to next level, Marid? $05/AAFA EXP to next level, Efrite? $05/AB72 EXP to next level, Teefa $05/ABEA EXP to next level, Salah? $05/AC62 EXP to next level, Darwin? $05/ACDA EXP to next level, Axs? (60 entries x 2 bytes) $05/AD6A Level-up stats, Rooks (HP, MP, Str, End, Int, Alt) (2 bytes per entry) $05/B03A Level-up stats, Sylph $05/B2FD Level-up stats, Dao $05/B5CE Level-up stats, Marid $05/B89E Level-up stats, Efrite $05/BB7A Level-up stats, Teefa $05/BE4A Level-up stats, Salah $05/C11A Level-up stats, Darwin $05/C3EA Level-up stats, Axs $05/C6A3 A bunch of 0's and 1's $05/C8D4 Level-up spells, Rooks $05/C8E2 Level-up spells, Sylph $05/C8F2 Level-up spells, Dao $05/C8F2 Level-up spells, Marid $05/C8FB Level-up spells, Efrite $05/C904 Level-up spells, Teefa $05/C911 Level-up spells, Salah $05/C91F Level-up spells, Darwin $05/C929 Level-up spells, Axs $05/C92D Monster race/element (2 bytes per entry) (ends at 2C9CB) $05/C9CD Monster Equipment stats, several unknown (start) $05/CE54 Monster Equipment stats (end) $05/CE55 Monster HP $05/CEF5 Monster EXP $05/CF95 Monster GP $05/D035 Monster Lvl $05/D0D5 Monster ?? stat - $20 entries of 00 through 05. No idea what this is. $05/D195 Monster boss music (00 none, 01 Boss1, 03 Boss2, 02 Rimsala) $05/D1E5 Monster boss flag (00-0F are bosses, FF are not bosses) $05/D235 Monster spell. (If nonzero, there's a random chance they'll use that spell instead of attacking.) (see Spells page) $05/D285 Monster ?? stat $05/D405 Monster Armor Def table (bugged?): offset = Armor * 2 $05/D445 Monster Accessory Def table: offset = Accessory * 2 $05/D4A5 Possible monster stat $05/D565 Possible monster stat $05/DE88 Equipment prices (see Equipment tab) $05/DF79 Equipment "can be equipped by" data (see Equipment tab) $05/DFF3 Equipment power/defense $05/E0E3 Equipment race bonus/element (2 bytes per item) $05/E1D5 Equipment: weapon crit rate $05/E226 Equipment: shield mag def ($05/E1D5) $05/E24E Equipment: weapon damage penalty $05/E2C8 Equipment - spell cast in battle $05/E356 Spells' names $05/EA4D Spells’ “battle only flag” (01: out of battle only, 02: battle only, 03: either) $05/EA9F Spells’ “single/multi target flag” (00: single, 01: multi); Change Attribute is broken as ST $05/EAF1 Spells’ accuracy $05/EB4D Spells' power $05/EC04 Spells' element (paired with an unknown byte, so skip a byte for each entry) (see Magic tab) $05/ECA6 Spells' MP cost $05/ECF8 Spells' color palette (see Magic tab) $05/ED57 Spells’ sfx $05/EE9A Item names (look for LDA $05/EE9A,x or "BF 9A EE 05") $05/F038 Card names (look for LDA $05/F038,x or "BF 38 F0 05") $05/F17E Sleeping Bag HP heal amount (200 HP) (Heals everyone but the spirits) $05/F180 Sleeping Bag MP heal amount (25 MP) $05/F194 Tent HP heal amount (999 MP) (Heals everyone but the spirits) $05/F196 Tent MP heal amount (999 MP) $05/F20A Herbs heal amount (70 HP) $05/F21F Medicine heal amount (200 HP) $05/F234 Silver Flask heal amount (15 MP) $05/F249 Gold Flask heal amount (40 MP)
Bank $06: Graphics (Shops, world map, travel sprites); Stage select data
$06/928E Compressed Graphics: Shop, Weapons $06/9418 Compressed Graphics: Shop, Inn $06/9626 Compressed Graphics: Shop, Spirit Healer $06/97C0 Compressed Graphics: Shop, Alchemist $06/98F6 Compressed Graphics: World Map 1 $06/C646 Compressed Graphics: World Map 2 $06/C971 Compressed Graphics: World Map 3 $06/CB33 Compressed Graphics: World Map 4 $06/CFC0 Compressed Graphics: World Map 5 $06/D2DB Compressed Graphics: Travel Sprites, Rooks $06/D4F6 Compressed Graphics: Travel Sprites, Teefa $06/D744 Compressed Graphics: Travel Sprites, Salah $06/D99F Compressed Graphics: Travel Sprites, Darwin $06/DB1F Compressed Graphics: Travel Sprites, Axs $06/DDBD Stage select: Chapter 2 (These are essentially pre-made save files) $06/E2BD Stage select: Chapter 3 $06/E7BD Stage select: Chapter 4 $06/ECBD Stage select: Chapter 5
Bank $07: Dungeons and gameplay
$07/8001 Sub: Fighting final boss? $07/80F2 Tbl: Levelup spells $07/8CC4 Sub: Deducts HP from target $07/8EDF FINIS (tile bytes) (appears 2x for some reason) $07/8F6E SLEEP (appears 3x for some reason) $07/8FEC ROOKS $07/9020 EFRITE $07/903A SALAH $07/906A End of names' sprite values $07/A83D Sub: Branches based on treasure chest contents $07/A866 Sub: Card treasure type $07/A872 Sub: Item treasure type $07/A87E Sub: Equipment treasure type $07/A88A Sub: GP treasure type $07/A896 Sub: Monster treasure type (unused) $07/A8AF Sub: FFFF treasure type (unused???) (returns failure) $07/A8BB Sub: Empty treasure type (returns failure) $07/A932 Sub: Loads a card name from ROM $07/A95C Sub: Loads an item name from ROM $07/A986 Sub: Loads an equipment name from ROM $07/A9D4 Sub: Adds a card to the inventory $07/AA18 Sub: Adds an item to the inventory $07/AA27 Item inventory limit (chests). Default $60 = $30 slots (48 items @ 8 per page) $07/AA3D Sub: Adds a weapon to the inventory $07/AA4D Equipment inventory limit (chests). Default $40 = $20 slots (32 items @ 8 per page) $07/AA65 Sub: Adds GP to total $07/AA6B Max GP (FFFF) $07/B234 Sub: Levelup check $07/B2DB Sub: When Teefa/Axs join, assigns them Rooks' LV $07/B2E2 Sub: When Salah joins, assigns her Rooks' LV-3 $07/B2F5 Sub: When Darwin joins, assigns him Rooks' LV+3 $07/BBEA Pointer table for character stats in RAM $07/BBF6 Honey stat boost amounts (Str, Int, End, Alt, HP, MP) $07/BC7C Sub: Recovers MP, sets to full MP if more than max $07/BCF1 Sub: Loop for full party healing; ends when X=08 $07/BF3A Sub: Related to running $07/BF54 Sub: Deducts MP from a spell $07/C355 Pointer table for spell effects $07/C8DE SFX for Healing (See Music tab for values) $07/C8E5 SFX for Change Attribute $07/C8E4 SFX for Buffs
Bank $08: Small scripts
$08/8000 Script, Battle/Towns/Items/Magic $08/9650 Spell descriptions $08/C93E Status screen (184 bytes) $08/C9F6 Status screen, current spirit (161 bytes) $08/D3C3 Alchemist conversations
Bank $09: Unknown data
$09/80D3 Pointer table $09/8215 Pointer table $09/835D Pointer table $09/83D3 Pointer table $09/843B Pointer table $09/84FD Pointer table $09/85C5 Pointer table $09/868D Pointer table $09/98FB Pointer table
Bank $0A: Extended font
(This is data left in from the Japanese version - they're 12x12 pixels in 1bpp format) $0A/8000 Graphics: Punctuation, a different font alphabet, yen $0A/86E4 Graphics: Symbols $0A/9560 Graphics: Numbers $0A/9692 Graphics: Latin upper case $0A/98D2 Graphics: Latin lower case $0A/9B12 Graphics: Hiragana $0A/A1D2 Graphics: Katakana $0A/A892 Graphics: Greek upper case $0A/AAC0 Graphics: Greek lower case $0A/AF52 Graphics: Cyrillic upper case $0A/B2B2 Graphics: Cyrillic lower case $0A/BCD2 Graphics: Kana half-width $0A/C812 Graphics: Kanji
Bank $0B: Kanji
Bank $0C: Kanji, Main story
(Text is in plaintext, so it's easy to search for in the ROM.) $0C/9CF9 Graphics: Kanji (end) $0C/A010 Script 001: Rooks' introduction $0C/A23A Script 002: You look healthy $0C/A7A6 Script 003: Something stung me $0C/F703 Script 117: Prelude to the final battle $0C/F7C2 Script Sub: MACRO 118 $0C/F7E3 Script Sub: PROMPT_ROOKS $0C/FA1B Script Sub: WAIT_NEWLINE $0C/FAA5 Script Sub: WAIT_CLEAR
Bank $0D: Compressed graphics
$0D/8042 HUD graphics $0D/833F Font for character cards $0D/91EF Font for character cards (end) $0D/9590 Weapons menu $0D/95F2 Spell data MVN1 $0D/9712 Spell data MVN10 $0D/B711 Compass graphics
Bank $0E: VRAM data and graphics
$0E/8048 Tile Data: Something1 - Loaded after a continue through DMA[1] to VRAM 0061 $0E/8052 Tile Data: Something2 - Loaded after a continue through DMA[1] to VRAM 0081 $0E/805C Tile Data: Something3 - Loaded after a continue through DMA[1] to VRAM 00A1 $0E/809B Tile Data: Something12 - Loads tile #s 28-2C into VRAM 009A $0E/8191 Graphics: Card, Rooks, Idle $0E/8551 Graphics: Card, Rooks, Battle $0E/88E5 Graphics: Card, Rooks, Attack $0E/8C1F Graphics: Card, Grim Reaper $0E/8FCC Graphics: Card, torn $0E/92F9 Graphics: Card, skull $0E/95A3 Graphics: Card, Sylph, Idle $0E/99D9 Graphics: Card, Sylph, Battle $0E/9D79 Graphics: Card, Sylph, Attack $0E/A12C Graphics: Card, Dao, Idle $0E/A4DF Graphics: Card, Dao, Battle $0E/A8CD Graphics: Card, Dao, Attack $0E/AC91 Graphics: Card, Marid, Idle $0E/B08D Graphics: Card, Marid, Battle $0E/B3D1 Graphics: Card, Marid, Attack $0E/B715 Graphics: Card, Efrite, Idle $0E/BB0E Graphics: Card, Efrite, Battle $0E/BEA9 Graphics: Card, Efrite, Attack $0E/C292 Graphics: Card, BadTeefa, Idle $0E/C6AB Graphics: Card, GoodTeefa, Idle $0E/CAC5 Graphics: Card, Teefa, Battle $0E/CE75 Graphics: Card, Teefa, Attack $0E/D25C Graphics: Card, Salah, Idle $0E/D66F Graphics: Card, Salah, Battle $0E/DA31 Graphics: Card, Salah, Attack $0E/DDF8 Graphics: Card, Darwin, Idle $0E/E1D3 Graphics: Card, Darwin, Battle $0E/E518 Graphics: Card, Darwin, Attack $0E/E863 Graphics: Card, Axs, Idle $0E/EC0F Graphics: Card, Axs, Battle $0E/EF6B Graphics: Card, Axs, Attack
Bank $0F: Battle animations
$0F/807C Animation: Small attack $0F/808C Animation: Medium attack $0F/809C Animation: Large attack $0F/817A Pointer table: Animation data? (This is called by Pointer Table 8DFA) $0F/CB2B Event: Spell animation $0F/CC01 Animation: Lightning $0F/CC06 Animation: Smash $0F/CC0B Animation: Water $0F/CC10 Animation: Flame $0F/CC1F Animation: Attribute 1 $0F/CC9D Animation: Attribute 11 $0F/CCB1 Animation: Call Wind Spirit $0F/CCC5 Animation: Dummied $0F/CCC6 Animation: Swirly $0F/CEB9 Animation: 5D: Rooks Unpetrify cutscene $0F/CF00 Animation: 5E: Ariel Attribute 11 cutscene $0F/CF2B Event: Single spell animation
Bank $10: Compressed gfx
$10/8001 Graphics: Balnea Temple/Reused bricks $10/C58D Graphics: Balnea Temple (end)
Bank $11: Compressed gfx
$11/8A91 Graphics: Forest of Doubt $11/FBA7 Graphics: Forest of Doubt (end)
Bank $12: Compressed gfx
$12/8571 Graphics: Bintel Castle $12/E35E Graphics: Bintel Castle (end)
Bank $13: Graphics and Maps
$13/8001 Graphics: Draven Pass $13/DACA Graphics: Draven Pass (end) $13/EBF6 Map: Balnea Temple 1F $13/ECFE Map: Balnea Temple 2F $13/EE08 Map: Draven Pass $13/EE8C Map: Crimson Valley $13/EEF2 Map: Forest of Doubt $13/F763 Map: Bintel Castle $13/F9A6 Map: Stavery Tower (Chapter 5)
Bank $14: Compressed sprites
(This bank starts with a bunch of Decomp80 entries that are basically pointers elsewhere.) $14/8001 Decomp80: Location of Ariel graphics $14/8009 Decomp80: Location of Teefa graphics $14/8012 Decomp80: Location of Crystal Room 1 graphics $14/801A Decomp80: Location of Crystal Room 2 graphics $14/8022 Decomp80: Location of Crystal Room 3 graphics $14/91D1 Graphics: Stoned Axs $14/F25A Graphics: Darwin NPC
Bank $15: Compressed sprites
$15/B4F1 Graphics: The Seven MacGuffins (ends at B87A) $15/EE8D Graphics: Ariel kneeling
Bank $16: Compressed sprites
$16/B8EC Graphics: Final fight $16/BE83 Graphics: The Three MacGuffins Credits text is 5 bytes per letter, in reverse order. Byte0: 00 normally, or 02 for the final (first) letter. Byte1: X position - 00 is center screen, 43 is center right, B5 is center left. So negative numbers are left of center. Byte2: Y position - Usually 01 Byte3: The tile to display. 00="A", 02="B", 04="C", ... 0E="H", 20="I", 22="J", 24="K"... 2E="P", 40="Q", 42="R", ...64-68="KOBY"... 80="ER" Byte4: Font color - 3C for orange text (headers), 3E for white text (names) $16/D883 Credits Text 00: "Character Designers" $16/D8D8 Credits Text 01: "Executive Producer" $16/EE3B Credits Text 42: "Ami Hashikura" $16/EEDB Credits Text 44: "THE END" $16/EF17 Pointer Table: Credit Text locations
Bank $17: Initialization
$17/8130 Intro script ("This is an historic land") $17/833F Sub: Stage Select (logs your inputs and compares them to the right codes) $17/840E Sound test $17/8417 Sub: Load sound test $17/874E Text: Intro crawl 1 "According to the ancient legends..." $17/87BC Text: Intro crawl 2 "Disputes broke out constantly..." $17/8A6D Text: Intro crawl 7 "King Wagnall was killed..." $17/9285 HAL logo gfx header
Bank $18: Treasures, encounters, events
$18/802E Sub: Random encounter logic $18/8044 Encounter rate (higher = fewer encounters) (Default $0C) $18/8056 Sub: Random encounter $18/80DB Sub: Normal (returns 3)/back attack (returns 2)? $18/8210 Sub: Formations $18/826A Snip: Loads the proper battle music ID $18/82B6 Snip: Loads monster ID from formation $18/82E2 Table: Battle music IDs (normal, boss, goddess, final) $18/85AB Sub: Returns treasure data (A: item type, X: value) $18/85D2 Sub: Updates treasure tracker ($18E3) after opening a chest $18/8A99 Table: Pointers for chapter treasures tables $18/8AA3 Table: Treasure data Ch1 (12 bytes per entry) $18/8B1D Table: Treasure data Ch2 (12 bytes per entry) $18/8CB7 Table: Treasure data Ch3 (12 bytes per entry) $18/8EBD Table: Treasure data Ch4 (12 bytes per entry) $18/8FEB Table: Treasure data Ch5 (12 bytes per entry) Ch5 examples: $18/9001 Location of Robe of Valor in Bintel Castle first room $18/900D Location of Gold Flask in Bintel Castle first room ^_^ $18/9079 Location of Grand Shield $18/9023 Desiree data (02 0C = Equipment id 0C) $18/9047 Return Ring data in "A Tunnel". $18/9101 Table: Pointers to boss locations by chapter (Ch1: +0, Ch2: +2 etc) $18/910B Table: Ch1 boss fights (8 bytes/entry): 00 01-> Map 00 Balnea 1F; 0F00 0600 -> (0F, 06); 0600 -> Encounter #6) $18/911D Table: Ch2 boss fights (8 bytes/entry) $18/912F Table: Ch3 boss fights (8 bytes/entry) $18/9139 Table: Ch4 boss fights (8 bytes/entry) empty, needs research $18/913B Table: Ch5 boss fights (8 bytes/entry) empty, needs research $18/913D Table: Pointers to encounters by chapter (Ch1: +2, Ch2: +4 etc) $18/9147 Table: Ch1 encounters $18/9177 Table: Ch2 encounters $18/91AA Table: Ch3 encounters Ch3 example: $18/91B3 Encounter data (1C 1D 1E 1A 1B -> 5 monsters in Ice Cave) $18/91DD Table: Ch4 encounters $18/9229 Table: Ch5 encounters $18/964F Pointer Table: Every story scene - logic handling $18/968F Pointer Table: Every story scene - event code $18/96CC Story Event 00: Rooks' intro $18/C551 Story Event 1A: Red and Blue Guardian $18/C6D1 Story Event 1B: Tiamat $18/D019 Epilogue text setup
Bank $19: Enemy graphics
$19/8001 Pointer Table: Enemy Palette data $19/80A1 Bank Table: Enemy Palette data (the entries are all bank 19) Each of these entries pointed to by the Enemy Palette Data table have the same format. A header: A word (unknown use), then another word (the number of bytes in the palette, usually 20 (thirty two)). Then the palette for that individual monster, and finally a 24-bit pointer to the enemy graphics getting colored. For instance, the Goblin and Ogre will have the same pointer but different palette data. $19/80F1 Palette Header: Goblin $19/8118 Palette Header: Ogre $19/813F Palette Header: Slime $19/8166 Palette Header: Jell $19/818D Palette Header: Pilferer $19/81B4 Palette Header: Thief $19/8D3E Palette Header: Karul $19/8D85 Palette Header: Galneon 1 $19/8DEC Palette Header: Galneon 2 $19/8E53 Palette Header: Rimsala 1 $19/8EBA Palette Header: Rimsala 2 $19/8F21 Pointer Table: SourceData 1 - Called after enemy attack animations. The first and second table are used together (1st entry of each, etc) $19/8F31 Pointer Table: SourceData 2 $19/8F41 Data: SourceData1 Attack, Swords $19/9311 Data: SourceData1 Attack, Bite $19/961C Data: SourceData1 Attack, Sploosh $19/9955 Data: SourceData1 Attack, Claws $19/9D22 Data: SourceData1 Attack, Sting $19/A0D8 Data: SourceData1 Attack, Punch $19/A3F5 Data: SourceData1 Attack, ??? $19/A7A1 Data: SourceData1 Attack, Damage star $19/AF4B Compressed Graphics: Slime $19/B3B5 Compressed Graphics: Thief $19/B834 Compressed Graphics: Dog $19/BF36 Compressed Graphics: Saurian $19/C414 Compressed Graphics: Lizardman $19/CACD Compressed Graphics: Chimera $19/D1B6 Compressed Graphics: Goblin $19/D8EA Compressed Graphics: Guardian $19/E391 Compressed Graphics: Tree $19/EAB2 Compressed Graphics: Flytrap
Bank $1A: Enemy graphics
$1A/8003 Compressed Graphics: Bee $1A/85C7 Compressed Graphics: Zerel $1A/936F Compressed Graphics: Cyclops $1A/9B65 Compressed Graphics: Efrite $1A/AB44 Compressed Graphics: Mage $1A/B1AA Compressed Graphics: Zombie $1A/B823 Compressed Graphics: Skeleton $1A/BF23 Compressed Graphics: Medusa $1A/C63A Compressed Graphics: Troll $1A/CE3C Compressed Graphics: Mimic $1A/D460 Compressed Graphics: Fighter $1A/DB45 Compressed Graphics: Sauza $1A/E79F Compressed Graphics: Hydra $1A/F18C Compressed Graphics: Ghost $1A/F843 Compressed Graphics: Shaman
Bank $1B: Enemy graphics
$1B/8003 Compressed Graphics: Minotaur $1B/880D Compressed Graphics: Giant $1B/9005 Compressed Graphics: Dragon $1B/9C58 Compressed Graphics: Darah and Barah $1B/B0EC Compressed Graphics: Ariel $1B/BD89 Compressed Graphics: Teefa $1B/CB84 Compressed Graphics: Karul $1B/D912 Compressed Graphics: Galneon 1 and 2
Bank $1C: Enemy graphics
$1C/C21F Compressed Graphics: Rimsala 1 $1C/D56A Compressed Graphics: Rimsala 2 $1C/F297 Compressed Graphics: Rimsala 2 part 2
Bank $1D: Unknown or compressed data
Bank $1E: Sound and Music
$1E/97B0 Instrument data (6 bytes per entry) $1E/9899 Instrument data (end) $1E/A4D6 Sound effects (end) $1E/A4D8 Song 33: Symphony of Elemen $1E/BADC Song 34: HAL logo theme $1E/BBF4 Song 35: Our Story's Name $1E/C04A Song 36: Prologue to the Tale $1E/C997 Song 37: Death Of A Loved One $1E/CC55 Song 38: A New Chapter $1E/D0A9 Song 39: Two Beautiful Princesses $1E/D31C Song 3A $1E/D469 Song 3B $1E/D660 Song 3C $1E/D7DF Song 3D $1E/D86A Song 3E: Reinoll ~ Generous Hermit $1E/DE50 Song 3F: Ariel ~ Soldier of Betrayal (uh, spoilers.) $1E/E133 Song 40: The Legend $1E/E603 Song 42: Trickery $1E/EC78 Song 43: Darwin ~ Treasure Hunter $1E/F11A Song 44: Alchemist's Workshop
Bank $1F: Music
Internal Data for Arcana
| |
---|---|