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.
Final Fantasy VI/ROM map/Assembly C22: Difference between revisions
< Final Fantasy VI | ROM map
Jump to navigation
Jump to search
(assembly C22) |
(clean up) |
||
Line 1: | Line 1: | ||
==C2/2011 unknow== | |||
(48) (49) (4A) (4B) | (48) (49) (4A) (4B) | ||
C2/2011: 8A TXA | C2/2011: 8A TXA | ||
C2/2012: 38 SEC | C2/2012: 38 SEC | ||
Line 11: | Line 11: | ||
C2/201F: 85 B8 STA $B8 | C2/201F: 85 B8 STA $B8 | ||
C2/2021: 80 A7 BRA $1FCA | C2/2021: 80 A7 BRA $1FCA | ||
==C2/2023 unknow== | |||
(36) | (36) | ||
C2/2023: C2 20 REP #$20 | C2/2023: C2 20 REP #$20 | ||
C2/2025: B9 18 30 LDA $3018,Y | C2/2025: B9 18 30 LDA $3018,Y | ||
C2/2028: 85 B8 STA $B8 | C2/2028: 85 B8 STA $B8 | ||
C2/202A: 4C 93 1F JMP $1F93 | C2/202A: 4C 93 1F JMP $1F93 | ||
==C2/202D remove self as target== | |||
C2/202D: 08 PHP | C2/202D: 08 PHP | ||
C2/202E: C2 20 REP #$20 | C2/202E: C2 20 REP #$20 | ||
Line 28: | Line 24: | ||
C2/2035: 28 PLP | C2/2035: 28 PLP | ||
C2/2036: 60 RTS | C2/2036: 60 RTS | ||
==C2/2037 sets targets to all dead monsters and characters== | |||
C2/2037: 08 PHP (Set 16-bit Accumulator) | C2/2037: 08 PHP (Set 16-bit Accumulator) | ||
C2/2038: C2 20 REP #$20 | C2/2038: C2 20 REP #$20 | ||
Line 45: | Line 38: | ||
C2/204C: 28 PLP | C2/204C: 28 PLP | ||
C2/204D: 60 RTS | C2/204D: 60 RTS | ||
==C2/204E set targets to all monsters and characters with reflect status== | |||
C2/204E: 08 PHP | C2/204E: 08 PHP | ||
C2/204F: C2 20 REP #$20 (Set 16-bit Accumulator) | C2/204F: C2 20 REP #$20 (Set 16-bit Accumulator) | ||
Line 62: | Line 52: | ||
C2/2063: 28 PLP | C2/2063: 28 PLP | ||
C2/2064: 60 RTS | C2/2064: 60 RTS | ||
==C2/2065 pointers: monster script: F1 opcode== | |||
C2/2065: 23 20 (36) | C2/2065: 23 20 (36) | ||
C2/2067: A5 1F (37) | C2/2067: A5 1F (37) | ||
Line 90: | Line 77: | ||
C2/2091: DB 1F (4C) | C2/2091: DB 1F (4C) | ||
C2/2093: E5 1F (4D) | C2/2093: E5 1F (4D) | ||
==C2/2095 recalculate characters data for equipments and relics== | |||
C2/2095: A2 03 LDX $#03 | C2/2095: A2 03 LDX $#03 | ||
C2/2097: BD 2F 30 LDA $2F30,X (was character flagged to have his/her properties be | C2/2097: BD 2F 30 LDA $2F30,X (was character flagged to have his/her properties be | ||
Line 130: | Line 114: | ||
C2/20DB: 10 BA BPL $2097 (loop for all 4 onscreen characters) | C2/20DB: 10 BA BPL $2097 (loop for all 4 onscreen characters) | ||
C2/20DD: 60 RTS | C2/20DD: 60 RTS | ||
==C2/20DE command #$2A== | |||
C2/20DE: AD 45 2F LDA $2F45 (characters trying to run) | C2/20DE: AD 45 2F LDA $2F45 (characters trying to run) | ||
C2/20E1: F0 7F BEQ $2162 (exit if not trying to run) | C2/20E1: F0 7F BEQ $2162 (exit if not trying to run) | ||
Line 200: | Line 181: | ||
C2/215F: 20 9E 62 JSR $629E | C2/215F: 20 9E 62 JSR $629E | ||
C2/2162: 60 RTS | C2/2162: 60 RTS | ||
==C2/2163 unknow== | |||
C2/2163: F4 18 00 PEA $0018 | C2/2163: F4 18 00 PEA $0018 | ||
C2/2166: 48 PHA | C2/2166: 48 PHA | ||
Line 220: | Line 200: | ||
C2/2183: 04 B1 TSB $B1 | C2/2183: 04 B1 TSB $B1 | ||
C2/2185: 4C D3 13 JMP $13D3 | C2/2185: 4C D3 13 JMP $13D3 | ||
==C2/2188 unknow== | |||
C2/2188: A9 80 LDA #$80 | C2/2188: A9 80 LDA #$80 | ||
C2/218A: 20 AB 5B JSR $5BAB | C2/218A: 20 AB 5B JSR $5BAB | ||
Line 276: | Line 255: | ||
C2/2207: 20 11 64 JSR $6411 | C2/2207: 20 11 64 JSR $6411 | ||
C2/220A: 4C 19 00 JMP $0019 | C2/220A: 4C 19 00 JMP $0019 | ||
==C2/220D determine if attack hits== | |||
C2/220D: 48 PHA | C2/220D: 48 PHA | ||
C2/220E: DA PHX | C2/220E: DA PHX | ||
Line 391: | Line 367: | ||
C2/22EA: 68 PLA | C2/22EA: 68 PLA | ||
C2/22EB: 60 RTS | C2/22EB: 60 RTS | ||
==C2/22EC determine if attack hits: L? spells== | |||
C2/22EC: AE A8 11 LDX $11A8 (Hit Rate) | C2/22EC: AE A8 11 LDX $11A8 (Hit Rate) | ||
C2/22EF: 7B TDC | C2/22EF: 7B TDC | ||
Line 402: | Line 375: | ||
C2/22F7: D0 D8 BNE $22D1 (Always miss) | C2/22F7: D0 D8 BNE $22D1 (Always miss) | ||
C2/22F9: 80 ED BRA $22E8 (Always Hit) | C2/22F9: 80 ED BRA $22E8 (Always Hit) | ||
==C2/22FB determine if attack hits== | |||
C2/22FB: F4 40 80 PEA $8040 (Sleep, Petrify) | |||
C2/22FB: F4 40 80 PEA $8040 (Sleep, Petrify) | |||
C2/22FE: F4 10 02 PEA $0210 (Freeze, Stop) | C2/22FE: F4 10 02 PEA $0210 (Freeze, Stop) | ||
C2/2301: 20 64 58 JSR $5864 | C2/2301: 20 64 58 JSR $5864 | ||
Line 427: | Line 397: | ||
C2/2327: B9 E5 3E LDA $3EE5,Y (Check for image status) | C2/2327: B9 E5 3E LDA $3EE5,Y (Check for image status) | ||
C2/232A: 89 04 BIT #$04 | C2/232A: 89 04 BIT #$04 | ||
-------------------------------------------------- | -------------------------------------------------- | ||
(Original Code) | (Original Code) | ||
C2/232C: F0 11 BEQ $233F (Branch if not Image status on target) | C2/232C: F0 11 BEQ $233F (Branch if not Image status on target) | ||
C2/232E: 20 5A 4B JSR $4B5A | C2/232E: 20 5A 4B JSR $4B5A | ||
Line 444: | Line 412: | ||
C2/2347: 48 PHA | C2/2347: 48 PHA | ||
C2/2348: 90 3E BCC $2388 | C2/2348: 90 3E BCC $2388 | ||
(Evade Patch Applied) | (Evade Patch Applied) | ||
C2/232C: F0 17 BEQ $2345 (Branch if not Image status on target) | C2/232C: F0 17 BEQ $2345 (Branch if not Image status on target) | ||
C2/232E: 20 5A 4B JSR $4B5A | C2/232E: 20 5A 4B JSR $4B5A | ||
Line 462: | Line 427: | ||
C2/2348: 48 PHA | C2/2348: 48 PHA | ||
C2/2349: EA NOP | C2/2349: EA NOP | ||
------------------------------------------------- | ------------------------------------------------- | ||
C2/234A: BD E4 3E LDA $3EE4,X | C2/234A: BD E4 3E LDA $3EE4,X | ||
C2/234D: 4A LSR | C2/234D: 4A LSR | ||
Line 504: | Line 467: | ||
C2/2397: C5 EE CMP $EE | C2/2397: C5 EE CMP $EE | ||
C2/2399: 4C B3 22 JMP $22B3 | C2/2399: 4C B3 22 JMP $22B3 | ||
==C2/239C check if hit: stamina== | |||
C2/239C: B9 55 3B LDA $3B55,Y (MBlock) | C2/239C: B9 55 3B LDA $3B55,Y (MBlock) | ||
C2/239F: EB XBA | C2/239F: EB XBA | ||
Line 524: | Line 484: | ||
C2/23BC: C5 EE CMP $EE | C2/23BC: C5 EE CMP $EE | ||
C2/23BE: 60 RTS | C2/23BE: 60 RTS | ||
==C2/23BF check if hit: dog and golem== | |||
C2/23BF: 5A PHY | C2/23BF: 5A PHY | ||
C2/23C0: AD A2 11 LDA $11A2 | C2/23C0: AD A2 11 LDA $11A2 | ||
Line 554: | Line 511: | ||
C2/23EB: 7A PLY | C2/23EB: 7A PLY | ||
C2/23EC: 60 RTS | C2/23EC: 60 RTS | ||
==C2/23ED unknow== | |||
C2/23ED: 08 PHP | C2/23ED: 08 PHP | ||
C2/23EE: C2 30 REP #$30 (Set 16-bit A, X, & Y) | C2/23EE: C2 30 REP #$30 (Set 16-bit A, X, & Y) | ||
Line 715: | Line 671: | ||
C2/2542: 28 PLP | C2/2542: 28 PLP | ||
C2/2543: 60 RTS | C2/2543: 60 RTS | ||
==C2/2544 unknow== | |||
C2/2544: 20 51 55 JSR $5551 | C2/2544: 20 51 55 JSR $5551 | ||
C2/2547: A2 06 LDX #$06 | C2/2547: A2 06 LDX #$06 | ||
Line 738: | Line 693: | ||
C2/2572: 10 D5 BPL $2549 | C2/2572: 10 D5 BPL $2549 | ||
C2/2574: 60 RTS | C2/2574: 60 RTS | ||
==C2/2575 initialize ATB timers== | |||
C2/2575: 08 PHP | C2/2575: 08 PHP | ||
C2/2576: 64 F3 STZ $F3 (zero General Incrementor) | C2/2576: 64 F3 STZ $F3 (zero General Incrementor) | ||
Line 830: | Line 782: | ||
C2/2600: 28 PLP | C2/2600: 28 PLP | ||
C2/2601: 60 RTS | C2/2601: 60 RTS | ||
==C2/2602 data: unknow== | |||
Data to load into $3018 and $3019 | Data to load into $3018 and $3019 | ||
C2/2602: 01 00 | C2/2602: 01 00 | ||
C2/2604: 02 00 | C2/2604: 02 00 | ||
Line 855: | Line 805: | ||
C2/261C: 42 | C2/261C: 42 | ||
C2/261D: 24 | C2/261D: 24 | ||
==C2/261E unknow== | |||
C2/261E: 7B TDC | C2/261E: 7B TDC | ||
C2/261F: A2 5F LDX #$5F | C2/261F: A2 5F LDX #$5F | ||
Line 871: | Line 820: | ||
C2/2635: 8D 24 3F STA $3F24 | C2/2635: 8D 24 3F STA $3F24 | ||
C2/2638: 60 RTS | C2/2638: 60 RTS | ||
==C2/2639 unknow== | |||
C2/2639: 08 PHP | C2/2639: 08 PHP | ||
C2/263A: 9C 72 3A STZ $3A72 | C2/263A: 9C 72 3A STZ $3A72 | ||
Line 883: | Line 831: | ||
C2/264E: 28 PLP | C2/264E: 28 PLP | ||
C2/264F: 60 RTS | C2/264F: 60 RTS | ||
==C2/2650 change death immunity into death protection== | |||
(Turn Death immunity into Instant Death protection by moving it into another byte; otherwise you'd | |||
(Turn Death immunity into Instant Death protection by moving it into another byte; otherwise you'd | |||
be bloody immortal. If the Poison elemental is nullified, make immune to Poison status.) | be bloody immortal. If the Poison elemental is nullified, make immune to Poison status.) | ||
C2/2650: BD A1 3A LDA $3AA1,X | C2/2650: BD A1 3A LDA $3AA1,X | ||
C2/2653: 29 FB AND #$FB (Clear protection from "instant death") | C2/2653: 29 FB AND #$FB (Clear protection from "instant death") | ||
Line 908: | Line 854: | ||
C2/2671: 9D 1C 33 STA $331C,X | C2/2671: 9D 1C 33 STA $331C,X | ||
C2/2674: 60 RTS | C2/2674: 60 RTS | ||
==C2/2675 check and set status as permanent== | |||
(Make some monster or equipment statuses permanent by setting immunity to them: | (Make some monster or equipment statuses permanent by setting immunity to them: | ||
Mute, Berserk, Muddled, Seizure, Regen, Slow, Haste, Shell, Safe, Reflect, Float * | Mute, Berserk, Muddled, Seizure, Regen, Slow, Haste, Shell, Safe, Reflect, Float * | ||
* If Float is only marked in Monster status byte 4, it won't be permanent | * If Float is only marked in Monster status byte 4, it won't be permanent | ||
[not to worry; no actual monsters do this]. | [not to worry; no actual monsters do this]. | ||
Then if you're immune to one status in a "mutually exclusive" pair, make immune to | Then if you're immune to one status in a "mutually exclusive" pair, make immune to | ||
the other. The pairs are Slow/Haste and Seizure/Regen.) | the other. The pairs are Slow/Haste and Seizure/Regen.) | ||
C2/2675: BD 31 33 LDA $3331,X | C2/2675: BD 31 33 LDA $3331,X | ||
C2/2678: EB XBA (put blocked status byte 4 in top of A) | C2/2678: EB XBA (put blocked status byte 4 in top of A) | ||
Line 964: | Line 906: | ||
C2/26C5: 9D D0 33 STA $3330,X (update blocked status byte #3) | C2/26C5: 9D D0 33 STA $3330,X (update blocked status byte #3) | ||
C2/26C8: 60 RTS | C2/26C8: 60 RTS | ||
==C2/26C9 unknow== | |||
C2/26C9: A2 12 LDX #$12 (start from 6th enemy) | C2/26C9: A2 12 LDX #$12 (start from 6th enemy) | ||
C2/26CB: 20 75 26 JSR $2675 | C2/26CB: 20 75 26 JSR $2675 | ||
Line 972: | Line 913: | ||
C2/26D0: 10 F9 BPL $26CB (and do function 2675 for everybody in the battle) | C2/26D0: 10 F9 BPL $26CB (and do function 2675 for everybody in the battle) | ||
C2/26D2: 60 RTS | C2/26D2: 60 RTS | ||
==C2/26D3 unknow== | |||
When called: | When called: | ||
A Low = $B5 | A Low = $B5 | ||
Line 1,018: | Line 958: | ||
C2/2706: FA PLX | C2/2706: FA PLX | ||
C2/2707: 60 RTS | C2/2707: 60 RTS | ||
==C2/2708 unknow== | |||
C2/2708: A2 04 LDX #$04 | C2/2708: A2 04 LDX #$04 | ||
C2/270A: DF 78 27 C2 CMP $C22778,X (is the tool or skean one that uses a spell?) | C2/270A: DF 78 27 C2 CMP $C22778,X (is the tool or skean one that uses a spell?) | ||
Line 1,097: | Line 1,036: | ||
C2/2775: 04 BA TSB $BA (Sets abort on characters) | C2/2775: 04 BA TSB $BA (Sets abort on characters) | ||
C2/2777: 60 RTS | C2/2777: 60 RTS | ||
==C2/2778 data: items with related spells: tools and skean== | |||
(Data - item numbers of Tools and Skeans that use spells to do a good chunk | (Data - item numbers of Tools and Skeans that use spells to do a good chunk | ||
of their work) | of their work) | ||
C2/2778: A4 (Bio Blaster) | C2/2778: A4 (Bio Blaster) | ||
C2/2779: A5 (Flash) | C2/2779: A5 (Flash) | ||
Line 1,107: | Line 1,044: | ||
C2/277B: AC (Water Edge) | C2/277B: AC (Water Edge) | ||
C2/277C: AD (Bolt Edge) | C2/277C: AD (Bolt Edge) | ||
==C2/277D data: constants to subtract from C2/2778 table== | |||
(Data - constants we subtract from the above item #s to get the numbers | (Data - constants we subtract from the above item #s to get the numbers | ||
of the spells they rely on) | of the spells they rely on) | ||
C2/277D: 27 | C2/277D: 27 | ||
C2/277E: 27 | C2/277E: 27 | ||
Line 1,116: | Line 1,052: | ||
C2/2780: 5A | C2/2780: 5A | ||
C2/2781: 5A | C2/2781: 5A | ||
==C2/2782 pointers== | |||
Code Pointers (indexed by bits 1 and 2 of data values below) | Code Pointers (indexed by bits 1 and 2 of data values below) | ||
C2/2782: 52 27 (Fight, Morph, Revert, Steal, Capture, Runic, Sketch, Control, Leap, Mimic, | C2/2782: 52 27 (Fight, Morph, Revert, Steal, Capture, Runic, Sketch, Control, Leap, Mimic, | ||
Row, Def, Jump, GP Rain, Possess) | Row, Def, Jump, GP Rain, Possess) | ||
Line 1,126: | Line 1,060: | ||
Shock, MagiTek) | Shock, MagiTek) | ||
C2/2788: 08 27 (Throw, Tools) | C2/2788: 08 27 (Throw, Tools) | ||
==C2/278A pointers: commands== | |||
(Data - indexed by command # 0 thru 1Dh?) | (Data - indexed by command # 0 thru 1Dh?) | ||
C2/278A: 20 (Fight) | C2/278A: 20 (Fight) | ||
C2/278B: 1A (Item) | C2/278B: 1A (Item) | ||
Line 1,160: | Line 1,092: | ||
C2/27A6: 81 (Possess) | C2/27A6: 81 (Possess) | ||
C2/27A7: 04 (MagiTek) | C2/27A7: 04 (MagiTek) | ||
==C2/27A8 unknow== | |||
C2/27A8: 08 PHP | C2/27A8: 08 PHP | ||
C2/27A9: C2 30 REP #$30 (Set 16-bit Accumulator & Index Registers) | C2/27A9: C2 30 REP #$30 (Set 16-bit Accumulator & Index Registers) | ||
Line 1,233: | Line 1,164: | ||
C2/283A: 28 PLP | C2/283A: 28 PLP | ||
C2/283B: 60 RTS | C2/283B: 60 RTS | ||
==C2/283C apply equipment boost to HP or MP== | |||
(Apply percentage boost to HP or MP. Bit 14 set = 25% boost, | (Apply percentage boost to HP or MP. Bit 14 set = 25% boost, | ||
Bit 15 set = 50% boost, Both of those bits set = 12.5% boost) | Bit 15 set = 50% boost, Both of those bits set = 12.5% boost) | ||
C2/283C: DA PHX | C2/283C: DA PHX | ||
C2/283D: 0A ASL | C2/283D: 0A ASL | ||
Line 1,252: | Line 1,181: | ||
$EE = A AND 16383. gotta love Square =] ) | $EE = A AND 16383. gotta love Square =] ) | ||
C2/284D: 7C 59 28 JMP ($2859,X) | C2/284D: 7C 59 28 JMP ($2859,X) | ||
==C2/2850 generic boost calculation== | |||
(Boost A by some fraction, if any) | (Boost A by some fraction, if any) | ||
C2/2850: 7B TDC (enter here for A = 0 + $EE) | C2/2850: 7B TDC (enter here for A = 0 + $EE) | ||
C2/2851: 4A LSR (enter here for A = (A * 1/8) + $EE) | C2/2851: 4A LSR (enter here for A = (A * 1/8) + $EE) | ||
Line 1,263: | Line 1,191: | ||
C2/2857: FA PLX | C2/2857: FA PLX | ||
C2/2858: 60 RTS | C2/2858: 60 RTS | ||
==C2/2859 pointers: boosts formulae== | |||
C2/2859: 50 28 (A = A) (technically, A = $EE, but it's the same deal.) | C2/2859: 50 28 (A = A) (technically, A = $EE, but it's the same deal.) | ||
C2/285B: 52 28 (A = A + (A * 1/4) ) | C2/285B: 52 28 (A = A + (A * 1/4) ) | ||
C2/285D: 53 28 (A = A + (A * 1/2) ) | C2/285D: 53 28 (A = A + (A * 1/2) ) | ||
C2/285F: 51 28 (A = A + (A * 1/8) ) | C2/285F: 51 28 (A = A + (A * 1/8) ) | ||
==C2/2861 math: A = 255 - (A * 2) + 1== | |||
(A = 255 - (A * 2) + 1 | (A = 255 - (A * 2) + 1 | ||
If A was >= 128 to start with, then A = 1. | If A was >= 128 to start with, then A = 1. | ||
If A was 0 to start with, then A ends up as 255.) | If A was 0 to start with, then A ends up as 255.) | ||
C2/2861: 0A ASL | C2/2861: 0A ASL | ||
C2/2862: 90 02 BCC $2866 | C2/2862: 90 02 BCC $2866 | ||
Line 1,285: | Line 1,208: | ||
C2/286B: 3A DEC | C2/286B: 3A DEC | ||
C2/286C: 60 RTS | C2/286C: 60 RTS | ||
==C2/286D initialize battle characters: add equipments proprieties== | |||
(Initialize in-battle character properties from equipment properties. | (Initialize in-battle character properties from equipment properties. | ||
A lot of the equipment bytes in this function were explained in C2/0E77, C2/0F9A, and C2/10B2, | A lot of the equipment bytes in this function were explained in C2/0E77, C2/0F9A, and C2/10B2, | ||
so consult those functions. Terii's Offsets List at http://www.rpglegion.com/ff6/hack/offset2.txt | so consult those functions. Terii's Offsets List at http://www.rpglegion.com/ff6/hack/offset2.txt | ||
is another great resource.) | is another great resource.) | ||
C2/286D: 0B PHD | C2/286D: 0B PHD | ||
C2/286E: F4 00 11 PEA $1100 (Set direct page register 11 $1100) | C2/286E: F4 00 11 PEA $1100 (Set direct page register 11 $1100) | ||
Line 1,438: | Line 1,359: | ||
C2/2960: 9C 89 3A STZ $3A89 (turn off random weapon spellcast) | C2/2960: 9C 89 3A STZ $3A89 (turn off random weapon spellcast) | ||
C2/2963: 4C 21 2C JMP $2C21 | C2/2963: 4C 21 2C JMP $2C21 | ||
==C2/2966 load spell data== | |||
(Load spell data) | (Load spell data) | ||
C2/2966: DA PHX | C2/2966: DA PHX | ||
C2/2967: 08 PHP | C2/2967: 08 PHP | ||
Line 1,460: | Line 1,379: | ||
C2/2988: FA PLX | C2/2988: FA PLX | ||
C2/2989: 60 RTS | C2/2989: 60 RTS | ||
==C2/298A load command data== | |||
(Loads command data, clears special effect, sets unblockable, sets Level to 0, | (Loads command data, clears special effect, sets unblockable, sets Level to 0, | ||
sets Vigor/Mag. Pwr to 0) | sets Vigor/Mag. Pwr to 0) | ||
C2/298A: AD 7C 3A LDA $3A7C | C2/298A: AD 7C 3A LDA $3A7C | ||
C2/298D: 20 D3 26 JSR $26D3 | C2/298D: 20 D3 26 JSR $26D3 | ||
Line 1,473: | Line 1,390: | ||
C2/299B: 9C AE 11 STZ $11AE (Set Vigor / M. Power to 0) | C2/299B: 9C AE 11 STZ $11AE (Set Vigor / M. Power to 0) | ||
C2/299E: 60 RTS | C2/299E: 60 RTS | ||
==C2/299F load weapon data== | |||
(Load weapon data into attack data. Also handles Offering, Sniper Sight, etc) | (Load weapon data into attack data. Also handles Offering, Sniper Sight, etc) | ||
C2/299F: 08 PHP | C2/299F: 08 PHP | ||
C2/29A0: BD 2C 3B LDA $3B2C,X | C2/29A0: BD 2C 3B LDA $3B2C,X | ||
Line 1,553: | Line 1,468: | ||
C2/2A33: 8D A6 11 STA $11A6 (Set Battle Power to 1) | C2/2A33: 8D A6 11 STA $11A6 (Set Battle Power to 1) | ||
C2/2A36: 60 RTS | C2/2A36: 60 RTS | ||
==C2/2A37 item usage setup== | |||
(Item usage setup. Used for Items, Skeans, Tools?) | (Item usage setup. Used for Items, Skeans, Tools?) | ||
(Going in: A = Item number. | (Going in: A = Item number. | ||
Carry flag = Command >= 2. It's set for Magic or Throw or Tools, but not plain Item.) | Carry flag = Command >= 2. It's set for Magic or Throw or Tools, but not plain Item.) | ||
C2/2A37: DA PHX | C2/2A37: DA PHX | ||
C2/2A38: 08 PHP | C2/2A38: 08 PHP | ||
Line 1,667: | Line 1,580: | ||
C2/2B18: FA PLX | C2/2B18: FA PLX | ||
C2/2B19: 60 RTS | C2/2B19: 60 RTS | ||
==C2/2B1A pointers: tools table== | |||
C2/2B1A: 2A 2B (Noise Blaster) | C2/2B1A: 2A 2B (Noise Blaster) | ||
C2/2B1C: 2F 2B (Bio Blaster) (do nothing) | C2/2B1C: 2F 2B (Bio Blaster) (do nothing) | ||
Line 1,679: | Line 1,589: | ||
C2/2B26: 57 2B (Air Anchor) | C2/2B26: 57 2B (Air Anchor) | ||
C2/2B28: 5D 2B (Autocrossbow) | C2/2B28: 5D 2B (Autocrossbow) | ||
==C2/2B2A tools: noiseblaster== | |||
C2/2B2A: A9 20 LDA #$20 | C2/2B2A: A9 20 LDA #$20 | ||
C2/2B2C: 8D AB 11 STA $11AB (Set Muddled in attack data) | C2/2B2C: 8D AB 11 STA $11AB (Set Muddled in attack data) | ||
C2/2B2F: 60 RTS | C2/2B2F: 60 RTS | ||
==C2/2B30 tools: chainsaw== | |||
C2/2B30: 20 5A 4B JSR $4B5A (0 to 255) | C2/2B30: 20 5A 4B JSR $4B5A (0 to 255) | ||
C2/2B33: 29 03 AND #$03 | C2/2B33: 29 03 AND #$03 | ||
Line 1,705: | Line 1,609: | ||
C2/2B4F: 0C A2 11 TSB $11A2 (Set ignore defense) | C2/2B4F: 0C A2 11 TSB $11A2 (Set ignore defense) | ||
C2/2B52: 60 RTS | C2/2B52: 60 RTS | ||
==C2/2B53 tools: debilitator== | |||
C2/2B53: A9 AC LDA #$AC | C2/2B53: A9 AC LDA #$AC | ||
C2/2B55: 80 02 BRA $2B59 (Set Debilitator effect) | C2/2B55: 80 02 BRA $2B59 (Set Debilitator effect) | ||
==C2/2B57 tools: air anchor== | |||
C2/2B57: A9 AE LDA #$AE (Add Air Anchor effect) | C2/2B57: A9 AE LDA #$AE (Add Air Anchor effect) | ||
C2/2B59: 8D A9 11 STA $11A9 | C2/2B59: 8D A9 11 STA $11A9 | ||
C2/2B5C: 60 RTS | C2/2B5C: 60 RTS | ||
==C2/2B5D tools: autocrossbow== | |||
C2/2B5D: A9 40 LDA #$40 | C2/2B5D: A9 40 LDA #$40 | ||
C2/2B5F: 0C A2 11 TSB $11A2 (Set no split damage) | C2/2B5F: 0C A2 11 TSB $11A2 (Set no split damage) | ||
C2/2B62: 60 RTS | C2/2B62: 60 RTS | ||
==C2/2B63 math: A = A * 30== | |||
C2/2B63: EB XBA | C2/2B63: EB XBA | ||
C2/2B64: A9 1E LDA #$1E | C2/2B64: A9 1E LDA #$1E | ||
C2/2B66: 4C 81 47 JMP $4781 | C2/2B66: 4C 81 47 JMP $4781 | ||
==C2/2B69 magic damage calculation== | |||
$11B0 = (Spell Power * 4) + (Level * Magic Power * Spell Power) / 32 | $11B0 = (Spell Power * 4) + (Level * Magic Power * Spell Power) / 32 | ||
(If Level of 0 is passed, $11B0 = Spell Power) | (If Level of 0 is passed, $11B0 = Spell Power) | ||
Line 1,771: | Line 1,658: | ||
C2/2B9A: E2 20 SEP #$20 (Set 8-bit Accumulator) | C2/2B9A: E2 20 SEP #$20 (Set 8-bit Accumulator) | ||
C2/2B9C: 60 RTS | C2/2B9C: 60 RTS | ||
==C2/2B9D physical damage calculation== | |||
Physical Damage Calculation: | Physical Damage Calculation: | ||
Line 1,871: | Line 1,758: | ||
C2/2C1F: 28 PLP | C2/2C1F: 28 PLP | ||
C2/2C20: 60 RTS | C2/2C20: 60 RTS | ||
==C2/2C21 unknow== | |||
C2/2C21: DA PHX | C2/2C21: DA PHX | ||
C2/2C22: AD 17 34 LDA $3417 (get Sketcher) | C2/2C22: AD 17 34 LDA $3417 (get Sketcher) | ||
Line 1,882: | Line 1,768: | ||
C2/2C2E: FA PLX | C2/2C2E: FA PLX | ||
C2/2C2F: 60 RTS | C2/2C2F: 60 RTS | ||
==C2/2C30 unknow== | |||
(Coming into function: A = Enemy Number. Y = in-battle enemy index, should be between | (Coming into function: A = Enemy Number. Y = in-battle enemy index, should be between | ||
8 and 18d) | 8 and 18d) | ||
(throughout this function, "main enemy" will mean the enemy referenced by the A and Y | (throughout this function, "main enemy" will mean the enemy referenced by the A and Y | ||
values that are initially passed to the function. "loop enemy" will mean the enemy | values that are initially passed to the function. "loop enemy" will mean the enemy | ||
currently referenced by the iterator of the loop that compares the main enemy to all | currently referenced by the iterator of the loop that compares the main enemy to all | ||
other enemies in the battle.) | other enemies in the battle.) | ||
C2/2C30: DA PHX | C2/2C30: DA PHX | ||
C2/2C31: 08 PHP | C2/2C31: 08 PHP | ||
Line 2,078: | Line 1,961: | ||
C2/2D6F: FA PLX | C2/2D6F: FA PLX | ||
C2/2D70: 60 RTS | C2/2D70: 60 RTS | ||
==C2/2D71 read command script at start of combat== | |||
Read command script at start of combat | Read command script at start of combat | ||
A = Monster number | A = Monster number | ||
C2/2D71: DA PHX | C2/2D71: DA PHX | ||
C2/2D72: 48 PHA | C2/2D72: 48 PHA | ||
Line 2,109: | Line 1,990: | ||
C2/2D97: FA PLX | C2/2D97: FA PLX | ||
C2/2D98: 60 RTS | C2/2D98: 60 RTS | ||
==C2/2D99 unknow== | |||
C2/2D99: DA PHX | C2/2D99: DA PHX | ||
C2/2D9A: BB TYX | C2/2D9A: BB TYX | ||
Line 2,116: | Line 1,996: | ||
C2/2D9E: FA PLX | C2/2D9E: FA PLX | ||
C2/2D9F: 60 RTS | C2/2D9F: 60 RTS | ||
==C2/2DA0 handle "attack first" property for monsters== | |||
(Handle "Attack First" property for monster) | (Handle "Attack First" property for monster) | ||
(Also, returns Carry clear if Attack First unset, Carry set if it's set.) | (Also, returns Carry clear if Attack First unset, Carry set if it's set.) | ||
C2/2DA0: 18 CLC | C2/2DA0: 18 CLC | ||
C2/2DA1: BD 80 3C LDA $3C80,X | C2/2DA1: BD 80 3C LDA $3C80,X | ||
Line 2,142: | Line 2,020: | ||
C2/2DBF: 38 SEC | C2/2DBF: 38 SEC | ||
C2/2DC0: 60 RTS | C2/2DC0: 60 RTS | ||
==C2/2DC1 unknow== | |||
C2/2DC1: 08 PHP | C2/2DC1: 08 PHP | ||
C2/2DC2: BF 1F 00 CF LDA $CF001F,X (Special attack) | C2/2DC2: BF 1F 00 CF LDA $CF001F,X (Special attack) | ||
Line 2,195: | Line 2,072: | ||
C2/2E38: 28 PLP | C2/2E38: 28 PLP | ||
C2/2E39: 60 RTS | C2/2E39: 60 RTS | ||
==C2/2E3A determine front, back, pincer or side attack== | |||
C2/2E3A: AD 6D 3A LDA $3A6D | C2/2E3A: AD 6D 3A LDA $3A6D | ||
C2/2E3D: 4A LSR | C2/2E3D: 4A LSR | ||
Line 2,224: | Line 2,098: | ||
2 = Pincer, 3 = Side) | 2 = Pincer, 3 = Side) | ||
C2/2E67: 60 RTS | C2/2E67: 60 RTS | ||
==C2/2E68 unknow== | |||
C2/2E68: AE 1F 20 LDX $201F (get encounter type: 0 = front, 1 = back, | C2/2E68: AE 1F 20 LDX $201F (get encounter type: 0 = front, 1 = back, | ||
2 = pincer, 3 = side) | 2 = pincer, 3 = side) | ||
Line 2,255: | Line 2,128: | ||
C2/2E90: 10 EA BPL $2E7C | C2/2E90: 10 EA BPL $2E7C | ||
C2/2E92: 60 RTS | C2/2E92: 60 RTS | ||
==C2/2E93 pointers: normal, back, pincer or side attack== | |||
(Pointers to functions that do stuff based on battle formation) | (Pointers to functions that do stuff based on battle formation) | ||
C2/2E93: 9B 2E (Normal attack) | C2/2E93: 9B 2E (Normal attack) | ||
C2/2E95: CE 2E (Back attack) | C2/2E95: CE 2E (Back attack) | ||
C2/2E97: C1 2E (Pincer attack) | C2/2E97: C1 2E (Pincer attack) | ||
C2/2E99: 9B 2E (Side attack) | C2/2E99: 9B 2E (Side attack) | ||
==C2/2E9B preemptive attack== | |||
(Determines if a battle is a preemptive attack) | (Determines if a battle is a preemptive attack) | ||
(Preemptive attack chance = 1 in 8 for normal attacks, 7 in 32 for side attacks) | (Preemptive attack chance = 1 in 8 for normal attacks, 7 in 32 for side attacks) | ||
(Gale Hairpin doubles chance) | (Gale Hairpin doubles chance) | ||
C2/2E9B: A5 B1 LDA $B1 | C2/2E9B: A5 B1 LDA $B1 | ||
C2/2E9D: 30 21 BMI $2EC0 (Exit function if bit 7 of $B1 is set) | C2/2E9D: 30 21 BMI $2EC0 (Exit function if bit 7 of $B1 is set) | ||
Line 2,291: | Line 2,160: | ||
C2/2EBE: 04 B0 TSB $B0 (Set preemptive attack) | C2/2EBE: 04 B0 TSB $B0 (Set preemptive attack) | ||
C2/2EC0: 60 RTS | C2/2EC0: 60 RTS | ||
==C2/2E61 pincer attack== | |||
(Sets all characters to front row for pincer attacks) | (Sets all characters to front row for pincer attacks) | ||
C2/2EC1: A2 06 LDX #$06 | C2/2EC1: A2 06 LDX #$06 | ||
C2/2EC3: A9 DF LDA #$DF | C2/2EC3: A9 DF LDA #$DF | ||
Line 2,303: | Line 2,170: | ||
C2/2ECA: 10 F7 BPL $2EC3 (loop for all 4 characters) | C2/2ECA: 10 F7 BPL $2EC3 (loop for all 4 characters) | ||
C2/2ECC: 80 0E BRA $2EDC | C2/2ECC: 80 0E BRA $2EDC | ||
==C2/2ECE back attacks== | |||
(Switches character's row placement for back attacks) | (Switches character's row placement for back attacks) | ||
C2/2ECE: A2 06 LDX #$06 | C2/2ECE: A2 06 LDX #$06 | ||
C2/2ED0: BD A1 3A LDA $3AA1,X | C2/2ED0: BD A1 3A LDA $3AA1,X | ||
Line 2,317: | Line 2,182: | ||
C2/2EDE: 04 B1 TSB $B1 | C2/2EDE: 04 B1 TSB $B1 | ||
C2/2EE0: 60 RTS | C2/2EE0: 60 RTS | ||
==C2/2EE1 unknow== | |||
C2/2EE1: 08 PHP | C2/2EE1: 08 PHP | ||
C2/2EE2: C2 10 REP #$10 (Set 16-bit X and Y) | C2/2EE2: C2 10 REP #$10 (Set 16-bit X and Y) | ||
Line 2,376: | Line 2,240: | ||
C2/2F2D: 28 PLP | C2/2F2D: 28 PLP | ||
C2/2F2E: 60 RTS | C2/2F2E: 60 RTS | ||
==C2/2F2F unknow== | |||
C2/2F2F: 08 PHP | C2/2F2F: 08 PHP | ||
C2/2F30: C2 10 REP #$10 (Set 16-bit X & Y) | C2/2F30: C2 10 REP #$10 (Set 16-bit X & Y) |
Revision as of 12:30, 13 December 2013
C2/2011 unknow
(48) (49) (4A) (4B) C2/2011: 8A TXA C2/2012: 38 SEC C2/2013: E9 24 SBC #$24 C2/2015: AA TAX C2/2016: BD A0 3A LDA $3AA0,X C2/2019: 4A LSR C2/201A: 90 83 BCC $1F9F C2/201C: BD 18 30 LDA $3018,X C2/201F: 85 B8 STA $B8 C2/2021: 80 A7 BRA $1FCA
C2/2023 unknow
(36) C2/2023: C2 20 REP #$20 C2/2025: B9 18 30 LDA $3018,Y C2/2028: 85 B8 STA $B8 C2/202A: 4C 93 1F JMP $1F93
C2/202D remove self as target
C2/202D: 08 PHP C2/202E: C2 20 REP #$20 C2/2030: B9 18 30 LDA $3018,Y C2/2033: 14 B8 TRB $B8 C2/2035: 28 PLP C2/2036: 60 RTS
C2/2037 sets targets to all dead monsters and characters
C2/2037: 08 PHP (Set 16-bit Accumulator) C2/2038: C2 20 REP #$20 C2/203A: 64 B8 STZ $B8 C2/203C: A2 12 LDX #$12 C2/203E: BD E3 3E LDA $3EE3,X C2/2041: 10 05 BPL $2048 (Branch if not dead) C2/2043: BD 18 30 LDA $3018,X C2/2046: 04 B8 TSB $B8 C2/2048: CA DEX C2/2049: CA DEX C2/204A: 10 F2 BPL $203E C2/204C: 28 PLP C2/204D: 60 RTS
C2/204E set targets to all monsters and characters with reflect status
C2/204E: 08 PHP C2/204F: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2051: 64 B8 STZ $B8 C2/2053: A2 12 LDX #$12 C2/2055: BD F7 3E LDA $3EF7,X C2/2058: 10 05 BPL $205F (Branch if not Reflect status) C2/205A: BD 18 30 LDA $3018,X C2/205D: 04 B8 TSB $B8 C2/205F: CA DEX C2/2060: CA DEX C2/2061: 10 F2 BPL $2055 C2/2063: 28 PLP C2/2064: 60 RTS
C2/2065 pointers: monster script: F1 opcode
C2/2065: 23 20 (36) C2/2067: A5 1F (37) C2/2069: A8 1F (38) C2/206B: AC 1F (39) C2/206D: AF 1F (3A) C2/206F: B3 1F (3B) C2/2071: B8 1F (3C) C2/2073: BD 1F (3D) C2/2075: C2 1F (3E) C2/2077: C7 1F (3F) C2/2079: CC 1F (40) C2/207B: D1 1F (41) C2/207D: D6 1F (42) C2/207F: A1 1F (43) C2/2081: 88 1F (44) C2/2083: FB 1F (45) C2/2085: 93 1F (46) C2/2087: 9F 1F (47) C2/2089: 11 20 (48) C2/208B: 11 20 (49) C2/208D: 11 20 (4A) C2/208F: 11 20 (4B) C2/2091: DB 1F (4C) C2/2093: E5 1F (4D)
C2/2095 recalculate characters data for equipments and relics
C2/2095: A2 03 LDX $#03 C2/2097: BD 2F 30 LDA $2F30,X (was character flagged to have his/her properties be recalculated from his/her equipment at end of turn?) C2/209A: F0 3E BEQ $20DA (skip to next character if not) C2/209C: 9E 30 2F STZ $2F30,X (clear this character's flag) C2/209F: DA PHX C2/20A0: 5A PHY C2/20A1: 8A TXA C2/20A2: 85 EE STA $EE C2/20A4: 0A ASL C2/20A5: 85 EF STA $EF C2/20A7: 0A ASL C2/20A8: 65 EE ADC $EE C2/20AA: AA TAX C2/20AB: BD 86 2B LDA $2B86,X C2/20AE: EB XBA C2/20AF: BD 9A 2B LDA $2B9A,X C2/20B2: A6 EF LDX $EF C2/20B4: C2 10 REP #$10 (Set 16-bit X and Y) C2/20B6: BC 10 30 LDY $3010,X (get offset to character info block) C2/20B9: 99 20 16 STA $1620,Y C2/20BC: EB XBA C2/20BD: 99 1F 16 STA $161F,Y C2/20C0: BD E4 3E LDA $3EE4,X C2/20C3: 99 14 16 STA $1614,Y C2/20C6: E2 10 SEP #$10 (Set 8-bit X and Y) C2/20C8: BD D9 3E LDA $3ED9,X C2/20CB: 22 77 0E C2 JSR $C20E77 C2/20CF: 20 6D 28 JSR $286D C2/20D2: 20 7D 52 JSR $527D C2/20D5: 20 75 26 JSR $2675 C2/20D8: 7A PLY C2/20D9: FA PLX C2/20DA: CA DEX C2/20DB: 10 BA BPL $2097 (loop for all 4 onscreen characters) C2/20DD: 60 RTS
C2/20DE command #$2A
C2/20DE: AD 45 2F LDA $2F45 (characters trying to run) C2/20E1: F0 7F BEQ $2162 (exit if not trying to run) C2/20E3: C2 20 REP #$20 C2/20E5: A9 02 09 LDA #$0902 C2/20E8: 8D 28 3A STA $3A28 (default some animation variable to unsuccessful run?) C2/20EB: E2 20 SEP #$20 C2/20ED: A5 B1 LDA $B1 C2/20EF: 89 02 BIT #$02 (is Can't Run set?) C2/20F1: D0 6C BNE $215F (branch if so) C2/20F3: AD 38 3A LDA $3A38 (characters successfully running) C2/20F6: F0 6A BEQ $2162 (branch if none) C2/20F8: 85 B8 STA $B8 (save successfully running characters) C2/20FA: 9C 38 3A STZ $3A38 C2/20FD: 20 00 64 JSR $6400 (Zero $A0 through $AF) C2/2100: A2 06 LDX #$06 C2/2102: BD 18 30 LDA $3018,X C2/2105: 14 B8 TRB $B8 (remove current party member from list of successfully running characters) C2/2107: F0 3B BEQ $2144 (skip to next party member if they were never in it) C2/2109: EB XBA C2/210A: BD 19 32 LDA $3219,X (top byte of ATB timer, which is zeroed when the gauge is full) C2/210D: D0 35 BNE $2144 (it it's nonzero, the gauge isn't full, so skip to next party member) C2/210F: BD A0 3A LDA $3AA0,X C2/2112: 89 50 BIT #$50 (???) C2/2114: D0 2E BNE $2144 C2/2116: 4A LSR (is entity even present in the battle?) C2/2117: 90 2B BCC $2144 (skip to next party member if not) C2/2119: BD E4 3E LDA $3EE4,X C2/211C: 89 02 BIT #$02 (Check for Zombie status) C2/211E: D0 24 BNE $2144 C2/2120: BD F9 3E LDA $3EF9,X C2/2123: 89 20 BIT #$20 C2/2125: D0 1D BNE $2144 (Branch if Hide status) C2/2127: EB XBA C2/2128: 04 B8 TSB $B8 (mark character as successfully running, for realz now.) C2/212A: 0C 39 3A TSB $3A39 C2/212D: 0C 4C 2F TSB $2F4C (mark runner to be removed from the battlefield?) C2/2130: BD A1 3A LDA $3AA1,X C2/2133: 09 40 ORA #$40 C2/2135: 9D A1 3A STA $3AA1,X (Set bit 6 of $3AA1) C2/2138: BD 04 32 LDA $3204,X C2/213B: 09 40 ORA #$40 (set bit 6 of $3204) C2/213D: 9D 04 32 STA $3204,X C2/2140: 20 C8 07 JSR $07C8 C2/2143: 9B TXY C2/2144: CA DEX C2/2145: CA DEX C2/2146: 10 BA BPL $2102 (loop for all 4 party members) C2/2148: A5 B8 LDA $B8 (get successfully running characters) C2/214A: F0 16 BEQ $2162 (branch if none) C2/214C: 64 B9 STZ $B9 C2/214E: BB TYX C2/214F: 20 C2 57 JSR $57C2 (Update $An variables, and do other stuff) C2/2152: 20 DB 63 JSR $63DB (Copy $An variables to ($78) buffer) C2/2155: C2 20 REP #$20 (set 16-bit Accumulator) C2/2157: A9 06 22 LDA #$2206 C2/215A: 8D 28 3A STA $3A28 (change some animation variable to successful run?) C2/215D: E2 20 SEP #$20 (set 8-bit Accumulator) C2/215F: 20 9E 62 JSR $629E C2/2162: 60 RTS
C2/2163 unknow
C2/2163: F4 18 00 PEA $0018 C2/2166: 48 PHA C2/2167: 0A ASL C2/2168: A8 TAY C2/2169: 18 CLC C2/216A: 20 76 02 JSR $0276 C2/216D: 68 PLA C2/216E: A8 TAY C2/216F: B9 84 31 LDA $3184,Y C2/2172: CD 0A 34 CMP $340A C2/2175: D0 02 BNE $2179 C2/2177: A9 FF LDA #$FF C2/2179: 8D 0A 34 STA $340A C2/217C: A9 FF LDA #$FF C2/217E: 99 84 31 STA $3184,Y C2/2181: A9 01 LDA #$01 C2/2183: 04 B1 TSB $B1 C2/2185: 4C D3 13 JMP $13D3
C2/2188 unknow
C2/2188: A9 80 LDA #$80 C2/218A: 20 AB 5B JSR $5BAB C2/218D: BD A0 3A LDA $3AA0,X C2/2190: 89 50 BIT #$50 C2/2192: D0 76 BNE $220A C2/2194: BD A1 3A LDA $3AA1,X C2/2197: 29 7F AND #$7F (Clear bit 7) C2/2199: 09 01 ORA #$01 (Set bit 0) C2/219B: 9D A1 3A STA $3AA1,X C2/219E: 20 1C 03 JSR $031C C2/21A1: BD CC 32 LDA $32CC,X C2/21A4: 30 64 BMI $220A C2/21A6: 0A ASL C2/21A7: A8 TAY C2/21A8: B9 20 34 LDA $3420,Y C2/21AB: C9 1E CMP #$1E C2/21AD: B0 5B BCS $220A C2/21AF: 8D 6F 2D STA $2D6F C2/21B2: C9 16 CMP #$16 C2/21B4: F0 06 BEQ $21BC C2/21B6: E0 08 CPX #$08 C2/21B8: 90 2C BCC $21E6 C2/21BA: 80 4E BRA $220A C2/21BC: BD 05 32 LDA $3205,X C2/21BF: 10 49 BPL $220A C2/21C1: C2 20 REP #$20 C2/21C3: E0 08 CPX #$08 C2/21C5: B0 0C BCS $21D3 C2/21C7: A9 16 00 LDA #$0016 C2/21CA: 8D 28 3F STA $3F28 C2/21CD: B9 20 35 LDA $3520,X C2/21D0: 8D 2A 3F STA $3F2A C2/21D3: BD 18 30 LDA $3018,X C2/21D6: 0C 2C 3F TSB $3F2C C2/21D9: E2 20 SEP #$20 C2/21DB: BD F9 3E LDA $3EF9,X C2/21DE: 09 20 ORA #$20 C2/21E0: 9D F9 3E STA $3EF9,X (Set Hide Status) C2/21E3: 20 26 5D JSR $5D26 C2/21E6: 20 39 26 JSR $2639 C2/21E9: 20 00 64 JSR $6400 (Zero $A0 through $AF) C2/21EC: C2 20 REP #$20 C2/21EE: B9 20 35 LDA $3520,Y C2/21F1: 85 B8 STA $B8 C2/21F3: E2 20 SEP #$20 C2/21F5: A9 0C LDA #$0C C2/21F7: 8D 6E 2D STA $2D6E C2/21FA: A9 FF LDA #$FF C2/21FC: 8D 72 2D STA $2D72 C2/21FF: 20 C2 57 JSR $57C2 C2/2202: 20 DB 63 JSR $63DB (Copy $An variables to ($78) buffer) C2/2205: A9 04 LDA #$04 C2/2207: 20 11 64 JSR $6411 C2/220A: 4C 19 00 JMP $0019
C2/220D determine if attack hits
C2/220D: 48 PHA C2/220E: DA PHX C2/220F: 18 CLC C2/2210: 08 PHP C2/2211: E2 20 SEP #$20 C2/2213: 64 FE STZ $FE C2/2215: A5 B3 LDA $B3 C2/2217: 10 1C BPL $2235 (Skip Clear check if bit 7 of $B3 not set) C2/2219: B9 E4 3E LDA $3EE4,Y C2/221C: 89 10 BIT #$10 (Check for Clear status) C2/221E: F0 15 BEQ $2235 (Branch if not vanished) C2/2220: AD A4 11 LDA $11A4 C2/2223: 0A ASL C2/2224: 30 07 BMI $222D (Branch if L.X spell) C2/2226: AD A2 11 LDA $11A2 C2/2229: 4A LSR C2/222A: 4C B3 22 JMP $22B3 (If physical attack then miss, otherwise hit) C2/222D: B9 FC 3D LDA $3DFC,Y C2/2230: 09 10 ORA #$10 C2/2232: 99 FC 3D STA $3DFC,Y (mark Clear status to be cleared. that way, it'll still be removed even if the attack misses and C2/4406, which is what normally removes Clear, is skipped.) C2/2235: AD A3 11 LDA $11A3 C2/2238: 89 02 BIT #$02 (Check for not reflectable) C2/223A: D0 0F BNE $224B (Branch if ^) C2/223C: B9 F8 3E LDA $3EF8,Y C2/223F: 10 0A BPL $224B (Branch if target does not have Reflect) C2/2241: C2 20 REP #$20 (set 16-bit accumulator) C2/2243: B9 18 30 LDA $3018,Y C2/2246: 04 A6 TSB $A6 (turn on target in "reflected off of" byte?) C2/2248: 4C E5 22 JMP $22E5 (Always miss if target has Reflect) C2/224B: AD A2 11 LDA $11A2 C2/224E: 89 02 BIT #$02 (Check for spell miss if death prot.) C2/2250: F0 07 BEQ $2259 (Branch if not ^) C2/2252: B9 A1 3A LDA $3AA1,Y C2/2255: 89 04 BIT #$04 C2/2257: D0 5C BNE $22B5 (Always miss if Prot. from death) C2/2259: AD A2 11 LDA $11A2 C2/225C: 89 04 BIT #$04 (Check for hit only (dead XOR undead) targets) C2/225E: F0 08 BEQ $2268 C2/2260: B9 E4 3E LDA $3EE4,Y C2/2263: 59 95 3C EOR $3C95,Y (death status XOR undead attribute) C2/2266: 10 4D BPL $22B5 (If neither or both of above set, then miss) C2/2268: A5 B5 LDA $B5 C2/226A: C9 00 CMP #$00 C2/226C: F0 04 BEQ $2272 (Branch if command is Fight) C2/226E: C9 06 CMP #$06 C2/2270: D0 2F BNE $22A1 (Branch if command not Capture) C2/2272: AD A9 11 LDA $11A9 C2/2275: D0 2A BNE $22A1 (Branch if has special effect) C2/2277: AD C9 3E LDA $3EC9 C2/227A: C9 01 CMP #$01 C2/227C: D0 23 BNE $22A1 (branch if # of targets isn't 1) C2/227E: C0 08 CPY #$08 C2/2280: B0 1F BCS $22A1 (Branch if target is monster) C2/2282: B9 F9 3E LDA $3EF9,Y C2/2285: 0A ASL C2/2286: 10 0B BPL $2293 (Branch if not dog block) C2/2288: 20 53 4B JSR $4B53 (0 or 1) C2/228B: 90 06 BCC $2293 (50% chance) C2/228D: A9 40 LDA #$40 C2/228F: 85 FE STA $FE (set dog block animation flag) C2/2291: 80 22 BRA $22B5 (Miss) C2/2293: AD 36 3A LDA $3A36 C2/2296: 0D 37 3A ORA $3A37 C2/2299: F0 06 BEQ $22A1 (Branch if no Golem) C2/229B: A9 20 LDA #$20 C2/229D: 85 FE STA $FE (set golem block animation flag) C2/229F: 80 14 BRA $22B5 (Miss) C2/22A1: AD A4 11 LDA $11A4 C2/22A4: 89 20 BIT #$20 (Check for can't be dodged) C2/22A6: D0 40 BNE $22E8 (Always hit if can't be dodged) C2/22A8: 89 40 BIT #$40 C2/22AA: D0 40 BNE $22EC (Check if hit for L? Spells) C2/22AC: 89 10 BIT #$10 C2/22AE: F0 4B BEQ $22FB (Check if hit if Stamina not involved?) C2/22B0: 20 9C 23 JSR $239C (Check if hit if Stamina involved?) C2/22B3: 90 33 BCC $22E8 (branch if hits) C2/22B5: B9 E4 3E LDA $3EE4,Y C2/22B8: 89 1A BIT #$1A (Check target for Clear, M-Tek, or Zombie) C2/22BA: D0 15 BNE $22D1 (Always miss if ^) C2/22BC: C0 08 CPY #$08 (Check if target is monster) C2/22BE: B0 11 BCS $22D1 (Always miss if ^) C2/22C0: 20 BF 23 JSR $23BF (Determine miss animation) C2/22C3: C9 06 CMP #$06 C2/22C5: 90 0A BCC $22D1 (Always miss) C2/22C7: A2 03 LDX #$03 C2/22C9: 9E AA 11 STZ $11AA,X (Clear all status setting effects of attack) C2/22CC: CA DEX C2/22CD: 10 FA BPL $22C9 C2/22CF: 80 17 BRA $22E8 (Always hit) C2/22D1: A9 02 LDA #$02 C2/22D3: 04 B2 TSB $B2 (Set no critical and ignore True Knight) C2/22D5: 9C 89 3A STZ $3A89 (turn off random weapon spellcast) C2/22D8: AD 1C 34 LDA $341C (0 if current strike is missable weapon spellcast) C2/22DB: F0 08 BEQ $22E5 (if it is, skip flagging the "Miss" message, since we'll be skipping the animation entirely.) C2/22DD: C2 20 REP #$20 C2/22DF: B9 18 30 LDA $3018,Y C2/22E2: 0C 5A 3A TSB $3A5A (Set target as missed) C2/22E5: 28 PLP C2/22E6: 38 SEC (Makes attack miss) C2/22E7: 08 PHP C2/22E8: 28 PLP C2/22E9: FA PLX C2/22EA: 68 PLA C2/22EB: 60 RTS
C2/22EC determine if attack hits: L? spells
C2/22EC: AE A8 11 LDX $11A8 (Hit Rate) C2/22EF: 7B TDC C2/22F0: B9 18 3B LDA $3B18,Y (Level) C2/22F3: 20 92 47 JSR $4792 (Division) C2/22F6: 8A TXA C2/22F7: D0 D8 BNE $22D1 (Always miss) C2/22F9: 80 ED BRA $22E8 (Always Hit)
C2/22FB determine if attack hits
C2/22FB: F4 40 80 PEA $8040 (Sleep, Petrify) C2/22FE: F4 10 02 PEA $0210 (Freeze, Stop) C2/2301: 20 64 58 JSR $5864 C2/2304: 90 E2 BCC $22E8 (Always hit if any set) C2/2306: C2 20 REP #$20 C2/2308: B9 18 30 LDA $3018,Y C2/230B: 2C 54 3A BIT $3A54 C2/230E: E2 20 SEP #$20 C2/2310: D0 D6 BNE $22E8 (Always hit) C2/2312: AD A8 11 LDA $11A8 (Hit Rate) C2/2315: C9 FF CMP #$FF C2/2317: F0 CF BEQ $22E8 (Automatically hit if Hit Rate is 255) C2/2319: 85 EE STA $EE C2/231B: AD A2 11 LDA $11A2 C2/231E: 4A LSR C2/231F: 90 1E BCC $233F (If Magic attack then skip this next code) C2/2321: B9 4C 3E LDA $3E4C,Y C2/2324: 4A LSR (Check for retort) C2/2325: B0 C1 BCS $22E8 (Always hits) C2/2327: B9 E5 3E LDA $3EE5,Y (Check for image status) C2/232A: 89 04 BIT #$04 -------------------------------------------------- (Original Code) C2/232C: F0 11 BEQ $233F (Branch if not Image status on target) C2/232E: 20 5A 4B JSR $4B5A C2/2331: C9 40 CMP #$40 (1 in 4 chance clear Image status) C2/2333: B0 9C BCS $22D1 (Always misses) C2/2335: B9 FD 3D LDA $3DFD,Y C2/2338: 09 04 ORA #$04 C2/233A: 99 FD 3D STA $3DFD,Y (Clear Image status) C2/233D: 80 92 BRA $22D1 (Always misses) C2/233F: B9 54 3B LDA $3B54,Y (255 - Evade * 2 + 1) C2/2342: B0 03 BCS $2347 C2/2344: B9 55 3B LDA $3B55,Y (255 - MBlock * 2 + 1) C2/2347: 48 PHA C2/2348: 90 3E BCC $2388 (Evade Patch Applied) C2/232C: F0 17 BEQ $2345 (Branch if not Image status on target) C2/232E: 20 5A 4B JSR $4B5A C2/2331: C9 40 CMP #$40 (1 in 4 chance clear Image status) C2/2333: B0 9C BCS $22D1 (Always misses) C2/2335: B9 FD 3D LDA $3DFD,Y C2/2338: 09 04 ORA #$04 C2/233A: 99 FD 3D STA $3DFD,Y (Clear Image status) C2/233D: 80 92 BRA $22D1 (Always misses) C2/233F: B9 55 3B LDA $3B55,Y (255 - MBlock * 2 + 1) C2/2342: 48 PHA C2/2343: 80 43 BRA $2388 C2/2345: B9 54 3B LDA $3B54,Y (255 - Evade * 2 + 1) C2/2348: 48 PHA C2/2349: EA NOP ------------------------------------------------- C2/234A: BD E4 3E LDA $3EE4,X C2/234D: 4A LSR C2/234E: 90 02 BCC $2352 (Branch if attacker not blinded [Dark status]) C2/2350: 46 EE LSR $EE (Cut hit rate in half) C2/2352: B9 58 3C LDA $3C58,Y C2/2355: 89 04 BIT #$04 C2/2357: F0 02 BEQ $235B (Branch if no Beads) C2/2359: 46 EE LSR $EE (Cut hit rate in half) C2/235B: F4 03 20 PEA $2003 (Muddled, Dark, Zombie) C2/235E: F4 04 04 PEA $0404 (Life 3, Slow) C2/2361: 20 64 58 JSR $5864 C2/2364: B0 0C BCS $2372 (Branch if none set on target) C2/2366: A5 EE LDA $EE C2/2368: 4A LSR C2/2369: 4A LSR C2/236A: 65 EE ADC $EE (Adds 1/4 to hit rate) C2/236C: 90 02 BCC $2370 C2/236E: A9 FF LDA #$FF C2/2370: 85 EE STA $EE (if hit rate overflowed, set to 255) C2/2372: F4 04 42 PEA $4204 (Seizure, Near Fatal, Poison) C2/2375: F4 08 00 PEA $0008 (Haste) C2/2378: 20 64 58 JSR $5864 C2/237B: B0 0B BCS $2388 (Branch if none set on target) C2/237D: A5 EE LDA $EE C2/237F: 46 EE LSR $EE C2/2381: 46 EE LSR $EE C2/2383: 38 SEC C2/2384: E5 EE SBC $EE (Subtracts 1/4 from hit rate) C2/2386: 85 EE STA $EE C2/2388: 68 PLA C2/2389: EB XBA C2/238A: A5 EE LDA $EE (Hit Rate) C2/238C: 20 81 47 JSR $4781 (Multiply Evade/Mblock * Hit Rate) C2/238F: EB XBA C2/2390: 85 EE STA $EE (High byte of Evade/Mblock * Hit Rate) C2/2392: A9 64 LDA #$64 C2/2394: 20 65 4B JSR $4B65 (Random number 0 to 99) C2/2397: C5 EE CMP $EE C2/2399: 4C B3 22 JMP $22B3
C2/239C check if hit: stamina
C2/239C: B9 55 3B LDA $3B55,Y (MBlock) C2/239F: EB XBA C2/23A0: AD A8 11 LDA $11A8 (Hit Rate) C2/23A3: 20 81 47 JSR $4781 (Multiplication Function) C2/23A6: EB XBA C2/23A7: 85 EE STA $EE (High byte of Mblock * Hit Rate) C2/23A9: A9 64 LDA #$64 C2/23AB: 20 65 4B JSR $4B65 (Random Number 0 to 99) C2/23AE: C5 EE CMP $EE C2/23B0: B0 0C BCS $23BE (Attack misses, so exit) C2/23B2: 20 5A 4B JSR $4B5A (Random Number 0 to 255) C2/23B5: 29 7F AND #$7F (0 to 127) C2/23B7: 85 EE STA $EE C2/23B9: B9 40 3B LDA $3B40,Y (Stamina) C2/23BC: C5 EE CMP $EE C2/23BE: 60 RTS
C2/23BF check if hit: dog and golem
C2/23BF: 5A PHY C2/23C0: AD A2 11 LDA $11A2 C2/23C3: 4A LSR C2/23C4: B0 01 BCS $23C7 (Branch if physical attack) C2/23C6: C8 INY (if it was magical, read from 3CE5,old_Y instead) C2/23C7: 7B TDC C2/23C8: B9 E4 3C LDA $3CE4,Y (shield/weapon miss animations) C2/23CB: 05 FE ORA $FE (miss due to Interceptor/Golem) C2/23CD: F0 1C BEQ $23EB (Exit function if none of above) C2/23CF: 20 2A 52 JSR $522A (Pick a random bit that is set) C2/23D2: 89 40 BIT #$40 C2/23D4: F0 03 BEQ $23D9 (Branch if no dog protection) C2/23D6: 8C 83 3A STY $3A83 (save character target in "Dog blocked" byte) C2/23D9: 89 20 BIT #$20 C2/23DB: F0 03 BEQ $23E0 (Branch if no Golem protection) C2/23DD: 8C 82 3A STY $3A82 (save character target in "Golem blocked" byte) C2/23E0: 20 F0 51 JSR $51F0 (X = position of highest [and only] bit that is set) C2/23E3: 98 TYA C2/23E4: 4A LSR C2/23E5: A8 TAY (Y = Y DIV 2, so it won't matter if Y was incremented above. it now holds a 0-3 character #.) C2/23E6: 8A TXA C2/23E7: 1A INC C2/23E8: 99 AA 00 STA $00AA,Y (save the dodge animation type for this character?) C2/23EB: 7A PLY C2/23EC: 60 RTS
C2/23ED unknow
C2/23ED: 08 PHP C2/23EE: C2 30 REP #$30 (Set 16-bit A, X, & Y) C2/23F0: A2 58 02 LDX #$0258 C2/23F3: 9E 20 3A STZ $3A20,X C2/23F6: 9E 7A 3C STZ $3C7A,X C2/23F9: CA DEX C2/23FA: CA DEX C2/23FB: 10 F6 BPL $23F3 C2/23FD: 7B TDC C2/23FE: 3A DEC C2/23FF: A2 0E 0A LDX #$0A0E C2/2402: 9D 00 20 STA $2000,X C2/2405: 9D 10 2A STA $2A10,X C2/2408: CA DEX C2/2409: CA DEX C2/240A: 10 F6 BPL $2402 C2/240C: 9C 44 2F STZ $2F44 C2/240F: 9C 4C 2F STZ $2F4C C2/2412: 9C 4E 2F STZ $2F4E C2/2415: 9C 53 2F STZ $2F53 C2/2418: 64 B0 STZ $B0 C2/241A: 64 B2 STZ $B2 C2/241C: A2 02 26 LDX #$2602 C2/241F: A0 18 30 LDY #$3018 C2/2422: A9 1B 00 LDA #$001B C2/2424: 54 7E C2 MVN #$C2,7E C2/2427: AD 11 E0 LDA $11E0 C2/242B: C9 D7 01 CMP #$01D7 (Check for Short Arm, Long arm, Face formation) C2/242E: E2 30 SEP #$30 (Set 8-bit A, X & Y) C2/2430: D0 03 BNE $2435 (branch if it's not 1st tier of final 4-tier multi-battle) C2/2432: 9C E0 3E STZ $3EE0 (zero byte to indicate that we're in the final 4-tier multi-battle) C2/2435: A2 13 LDX #$13 C2/2437: BD C9 1D LDA $1DC9,X C2/243A: 9D B4 3E STA $3EB4,X C2/243D: CA DEX C2/243E: 10 F7 BPL $2437 C2/2440: AD 1E 02 LDA $021E C2/2443: 0A ASL C2/2444: 0A ASL C2/2445: 85 BE STA $BE C2/2447: 20 E8 30 JSR $30E8 (Loads battle formation data) C2/244A: 20 2F 2F JSR $2F2F C2/244D: A9 80 LDA #$80 C2/244F: 1C BB 3E TRB $3EBB C2/2452: A9 91 LDA #$91 C2/2454: 1C BC 3E TRB $3EBC C2/2457: A2 12 LDX #$12 C2/2459: 20 5A 4B JSR $4B5A (0 to 255) C2/245C: 9D F0 3A STA $3AF0,X (Store random number at $3AF0,X) C2/245F: A9 BC LDA #$BC C2/2461: EC E2 3E CPX $3EE2 C2/2464: D0 02 BNE $2468 C2/2466: 09 02 ORA #$02 C2/2468: 9D 04 32 STA $3204,X C2/246B: CA DEX C2/246C: CA DEX C2/246D: 10 EA BPL $2459 C2/246F: 20 44 25 JSR $2544 C2/2472: AD 4D 1D LDA $1D4D (Battle Speed variable from user Configuration. Note that its actual value ranges from 0 to 5, but the menu choices the player sees are 1 thru 6.) C2/2475: 30 03 BMI $247A (branch if "Short" Command Set) C2/2477: 9C 2E 2F STZ $2F2E (otherwise, it's "Window") C2/247A: 89 08 BIT #$08 (is "Wait" Battle Mode set?) C2/247C: F0 03 BEQ $2481 (branch if not, meaning it's Active) C2/247E: EE 8F 3A INC $3A8F C2/2481: 29 07 AND #$07 (bottom 3 bits of Battle Speed) C2/2483: 0A ASL C2/2484: 0A ASL C2/2485: 0A ASL C2/2486: 85 EE STA $EE (Battle Speed * 8) C2/2488: 0A ASL ( * 16) C2/2489: 65 EE ADC $EE (Battle Speed * 24) C2/248B: 49 FF EOR #$FF C2/248D: 8D 90 3A STA $3A90 (= 255 - (Battle Speed * 24) ) (this variable is a multiplier which is used for slowing down enemies in the Battle Time Counter Function at C2/09D2. as you can see here and from experience, a Battle Speed of zero will leave enemies the fastest.) C2/2490: AD 4E 1D LDA $1D4E C2/2493: 10 03 BPL $2498 (branch if the Gauge is not disabled) C2/2495: 9C 21 20 STZ $2021 C2/2498: 9C 41 2F STZ $2F41 C2/249B: 20 6E 54 JSR $546E C2/249E: 20 0C 58 JSR $580C C2/24A1: 20 E1 2E JSR $2EE1 C2/24A4: 20 91 43 JSR $4391 (Status effects?) C2/24A7: 20 9B 06 JSR $069B C2/24AA: A9 14 LDA #$14 C2/24AC: 8D AF 11 STA $11AF C2/24AF: 20 3F 08 JSR $083F C2/24B2: 20 B9 4A JSR $4AB9 C2/24B5: 20 3A 2E JSR $2E3A C2/24B8: 20 C9 26 JSR $26C9 C2/24BB: 20 68 2E JSR $2E68 C2/24BE: 20 75 25 JSR $2575 (Initialize ATB Timers) C2/24C1: A2 00 LDX #$00 C2/24C3: AD 4B 2F LDA $2F4B (extra formation data, byte 3) C2/24C6: 89 04 BIT #$04 C2/24C8: D0 20 BNE $24EA (branch if "hide starting messages" set) C2/24CA: AD 1F 20 LDA $201F (get encounter type. 0 = front, 1 = back, 2 = pincer, 3 = side) C2/24CD: C9 01 CMP #$01 C2/24CF: D0 04 BNE $24D5 (branch if not back attack) C2/24D1: A2 23 LDX #$23 C2/24D3: 80 15 BRA $24EA C2/24D5: C9 02 CMP #$02 C2/24D7: D0 04 BNE $24DD (branch if not pincer attack) C2/24D9: A2 25 LDX #$25 C2/24DB: 80 0D BRA $24EA C2/24DD: C9 03 CMP #$03 C2/24DF: D0 02 BNE $24E3 (branch if not side attack) C2/24E1: A2 24 LDX #$24 C2/24E3: A5 B0 LDA $B0 C2/24E5: 0A ASL C2/24E6: 10 02 BPL $24EA (branch if not preemptive attack) C2/24E8: A2 22 LDX #$22 C2/24EA: 9B TXY C2/24EB: F0 05 BEQ $24F2 C2/24ED: A9 25 LDA #$25 C2/24EF: 20 91 4E JSR $4E91 C2/24F2: 20 73 5C JSR $5C73 C2/24F5: 20 54 5C JSR $5C54 C2/24F8: 64 B8 STZ $B8 C2/24FA: 64 B9 STZ $B9 C2/24FC: A2 06 LDX #$06 C2/24FE: BD 18 30 LDA $3018,X C2/2501: 2C 2C 3F BIT $3F2C C2/2504: F0 16 BEQ $251C (branch if not Jumping) C2/2506: BD A0 3A LDA $3AA0,X C2/2509: 09 28 ORA #$28 C2/250B: 9D A0 3A STA $3AA0,X C2/250E: 9E 19 32 STZ $3219,X (zero top byte of ATB Timer) C2/2511: 20 77 4E JSR $4E77 (put character in action queue) C2/2514: A9 16 LDA #$16 C2/2516: 8D 7A 3A STA $3A7A C2/2519: 20 CB 4E JSR $4ECB C2/251C: CA DEX C2/251D: CA DEX C2/251E: 10 DE BPL $24FE (loop for all 4 party members) C2/2520: AD E1 3E LDA $3EE1 C2/2523: 1A INC C2/2524: F0 19 BEQ $253F C2/2526: 3A DEC C2/2527: 8D 6F 2D STA $2D6F C2/252A: A9 12 LDA #$12 C2/252C: 8D 6E 2D STA $2D6E C2/252F: AD 75 3A LDA $3A75 C2/2532: 8D 71 2D STA $2D71 C2/2535: A9 FF LDA #$FF C2/2537: 8D 70 2D STA $2D70 C2/253A: 8D 72 2D STA $2D72 C2/253D: A9 04 LDA #$04 C2/253F: 20 11 64 JSR $6411 C2/2542: 28 PLP C2/2543: 60 RTS
C2/2544 unknow
C2/2544: 20 51 55 JSR $5551 C2/2547: A2 06 LDX #$06 C2/2549: BD D8 3E LDA $3ED8,X (Which character it is) C2/254C: 30 22 BMI $2570 (Branch if monster?) C2/254E: C9 10 CMP #$10 C2/2550: B0 05 BCS $2557 C2/2552: A8 TAY C2/2553: 8A TXA C2/2554: 99 00 30 STA $3000,Y C2/2557: BD 18 30 LDA $3018,X C2/255A: 0C 8D 3A TSB $3A8D C2/255D: BD D9 3E LDA $3ED9,X C2/2560: 22 77 0E C2 JSR $C20E77 C2/2564: 20 6D 28 JSR $286D C2/2567: 20 A8 27 JSR $27A8 C2/256A: 20 8D 56 JSR $568D C2/256D: 20 2C 53 JSR $532C C2/2570: CA DEX C2/2571: CA DEX C2/2572: 10 D5 BPL $2549 C2/2574: 60 RTS
C2/2575 initialize ATB timers
C2/2575: 08 PHP C2/2576: 64 F3 STZ $F3 (zero General Incrementor) C2/2578: A0 12 LDY #$12 C2/257A: B9 A0 3A LDA $3AA0,Y C2/257D: 4A LSR C2/257E: B0 07 BCS $2587 (branch if entity is present in battle?) C2/2580: 18 CLC C2/2581: A9 10 LDA #$10 C2/2583: 65 F3 ADC $F3 C2/2585: 85 F3 STA $F3 (add 16 to $F3 [our General Incrementor] for each entity shy of the possible 10) C2/2587: 88 DEY C2/2588: 88 DEY C2/2589: 10 EF BPL $257A (loop for all 10 characters and monsters) C2/258B: C2 20 REP #$20 (Set 16-bit accumulator) C2/258D: A9 FF 03 LDA #$03FF (10 bits set, 10 possible entities in battle) C2/2590: 85 F0 STA $F0 C2/2592: A0 12 LDY #$12 C2/2594: A5 F0 LDA $F0 C2/2596: 20 2A 52 JSR $522A (randomly choose one of the 10 bits [targets]) C2/2599: 14 F0 TRB $F0 (and clear it, so it won't be used for subsequent iterations of loop) C2/259B: 20 F0 51 JSR $51F0 (X = bit # of the chosen bit, thus a 0-9 target #) C2/259E: E2 20 SEP #$20 (Set 8-bit accumulator) C2/25A0: 8A TXA C2/25A1: 0A ASL C2/25A2: 0A ASL C2/25A3: 0A ASL C2/25A4: 85 F2 STA $F2 (save [0..9] * 8 in our Specific Incrementor) (the result is that each entity is randomly assigned a different value for $F2: 0, 8, 16, 24, 32, 40, 48, 56, 64, 72) C2/25A6: B9 19 32 LDA $3219,Y (get top byte of ATB Timer) C2/25A9: 1A INC C2/25AA: D0 4E BNE $25FA (skip to next target if it wasn't FFh) C2/25AC: AD E1 3E LDA $3EE1 (FFh in every case, except for last 3 tiers of final 4-tier multi-battle?) C2/25AF: 1A INC C2/25B0: D0 48 BNE $25FA (skip to next target if one of those 3 tiers) C2/25B2: AE 1F 20 LDX $201F (get encounter type. 0 = front, 1 = back, 2 = pincer, 3 = side) C2/25B5: B9 18 30 LDA $3018,Y C2/25B8: 2C 40 3A BIT $3A40 (is target a character acting as enemy?) C2/25BB: D0 14 BNE $25D1 (branch if so) C2/25BD: C0 08 CPY #$08 C2/25BF: B0 10 BCS $25D1 (branch if target is a monster) C2/25C1: A5 B0 LDA $B0 C2/25C3: 0A ASL C2/25C4: 30 34 BMI $25FA (skip to next target if Preemptive Attack) C2/25C6: CA DEX (decrement encounter type) C2/25C7: 30 15 BMI $25DE (branch if front attack) C2/25C9: CA DEX C2/25CA: CA DEX C2/25CB: F0 2D BEQ $25FA (skip to next target if side attack) C2/25CD: A5 F2 LDA $F2 C2/25CF: 80 22 BRA $25F3 (it's a back or pincer attack) (go set top byte of ATB timer to $F2 + 1) C2/25D1: A5 B0 LDA $B0 (we'll reach here only if target is monster or character acting as enemy) C2/25D3: 0A ASL C2/25D4: 30 04 BMI $25DA (branch if Preemptive Attack) C2/25D6: E0 03 CPX #$03 (checking encounter type again) C2/25D8: D0 04 BNE $25DE (branch if not side attack) C2/25DA: A9 01 LDA #$01 C2/25DC: 80 15 BRA $25F3 (go set top byte of ATB timer to 2) C2/25DE: B9 19 3B LDA $3B19,Y (A = Speed) C2/25E1: 20 65 4B JSR $4B65 (random #: 0 to A - 1) C2/25E4: 79 19 3B ADC $3B19,Y (A = random: Speed to ((2 * Speed) - 1) ) C2/25E7: B0 08 BCS $25F1 (branch if exceeded 255) C2/25E9: 65 F2 ADC $F2 (add entity's Specific Incrementor, a 0,8,16,24,32,40,48,56,64,72 random boost) C2/25EB: B0 04 BCS $25F1 (branch if exceeded 255) C2/25ED: 65 F3 ADC $F3 (add our General Incrementor, (10 - number of valid entities) * 16 ) C2/25EF: 90 02 BCC $25F3 (branch if byte didn't exceed 255) C2/25F1: A9 FF LDA #$FF (if it overflowed, set it to FFh [255d]) C2/25F3: 1A INC C2/25F4: D0 01 BNE $25F7 C2/25F6: 3A DEC (so A is incremented if it was < FFh) C2/25F7: 99 19 32 STA $3219,Y (save top byte of ATB timer) C2/25FA: C2 20 REP #$20 C2/25FC: 88 DEY C2/25FD: 88 DEY C2/25FE: 10 94 BPL $2594 (loop for all 10 possible characters and monsters) C2/2600: 28 PLP C2/2601: 60 RTS
C2/2602 data: unknow
Data to load into $3018 and $3019 C2/2602: 01 00 C2/2604: 02 00 C2/2606: 04 00 C2/2608: 08 00 C2/260A: 00 01 C2/260C: 00 02 C2/260E: 00 04 C2/2610: 00 08 C2/2612: 00 10 C2/2614: 00 20 Data C2/2616: 8E C2/2617: 20 C2/2618: CA C2/2619: 21 C2/261A: 06 C2/261B: 23 C2/261C: 42 C2/261D: 24
C2/261E unknow
C2/261E: 7B TDC C2/261F: A2 5F LDX #$5F C2/2621: 9D E4 3E STA $3EE4,X C2/2624: CA DEX C2/2625: 10 FA BPL $2621 C2/2627: 3A DEC C2/2628: A2 0F LDX #$0F C2/262A: 9D D4 3E STA $3ED4,X C2/262D: CA DEX C2/262E: 10 FA BPL $262A C2/2630: A9 12 LDA #$12 C2/2632: 8D 28 3F STA $3F28 C2/2635: 8D 24 3F STA $3F24 C2/2638: 60 RTS
C2/2639 unknow
C2/2639: 08 PHP C2/263A: 9C 72 3A STZ $3A72 C2/263D: 9C 70 3A STZ $3A70 C2/2640: C2 20 REP #$20 C2/2642: 9C 32 3A STZ $3A32 C2/2645: 9C 34 3A STZ $3A34 C2/2648: 9C 30 3A STZ $3A30 C2/264B: 9C 4E 3A STZ $3A4E C2/264E: 28 PLP C2/264F: 60 RTS
C2/2650 change death immunity into death protection
(Turn Death immunity into Instant Death protection by moving it into another byte; otherwise you'd be bloody immortal. If the Poison elemental is nullified, make immune to Poison status.) C2/2650: BD A1 3A LDA $3AA1,X C2/2653: 29 FB AND #$FB (Clear protection from "instant death") C2/2655: EB XBA C2/2656: BD 1C 33 LDA $331C,X (Blocked status byte 1) C2/2659: 30 06 BMI $2661 (Branch if not block death) C2/265B: 09 80 ORA #$80 (Clear block death) C2/265D: EB XBA C2/265E: 09 04 ORA #$04 (Set protection from "instant death") C2/2660: EB XBA C2/2661: EB XBA C2/2662: 9D A1 3A STA $3AA1,X C2/2665: BD CD 3B LDA $3BCD,X (Nullified elements) C2/2668: 89 08 BIT #$08 C2/266A: F0 04 BEQ $2670 (Branch if not nullify poison) C2/266C: EB XBA C2/266D: 29 FB AND #$FB (Set block poison status if) C2/266F: EB XBA C2/2670: EB XBA C2/2671: 9D 1C 33 STA $331C,X C2/2674: 60 RTS
C2/2675 check and set status as permanent
(Make some monster or equipment statuses permanent by setting immunity to them: Mute, Berserk, Muddled, Seizure, Regen, Slow, Haste, Shell, Safe, Reflect, Float * * If Float is only marked in Monster status byte 4, it won't be permanent [not to worry; no actual monsters do this]. Then if you're immune to one status in a "mutually exclusive" pair, make immune to the other. The pairs are Slow/Haste and Seizure/Regen.) C2/2675: BD 31 33 LDA $3331,X C2/2678: EB XBA (put blocked status byte 4 in top of A) C2/2679: BD 6D 3C LDA $3C6D,X (monster/equip status byte 3) C2/267C: 4A LSR C2/267D: 90 04 BCC $2683 (if perm-float (aka dance) wasn't set, branch) C2/267F: EB XBA C2/2680: 29 7F AND #$7F C2/2682: EB XBA (if it^ was, then block float. thus the permanence) C2/2683: AD BB 3E LDA $3EBB C2/2686: 89 04 BIT #$04 C2/2688: F0 04 BEQ $268E (branch if we're not in Phunbaba battle #4 [iow, Terra's second Phunbaba meeting]) C2/268A: EB XBA C2/268B: 29 F7 AND #$F7 (if we are, give immunity to Morph to make it permanent) C2/268D: EB XBA C2/268E: EB XBA C2/268F: 9D 31 33 STA $3331,X (update blocked status #4) C2/2692: BD 30 33 LDA $3330,X C2/2695: EB XBA C2/2696: BD 1D 33 LDA $331D,X (A.top=blocked status byte 3, A.btm=blocked status #2) C2/2699: C2 20 REP #$20 C2/269B: 85 EE STA $EE C2/269D: BD 6C 3C LDA $3C6C,X (monster/equip status bytes 2-3) C2/26A0: 29 78 EE AND #$EE78 (Dance, Stop, Sleep, Condemned, Near Fatal, Image will all be 0) C2/26A3: 49 FF FF EOR #$FFFF (now they'll all be 1) C2/26A6: 25 EE AND $EE (SO Blocked Statuses = what you were blocking before, plus whatever the enemy/equip has. with the exception of the above.. which will only be blocked if they were before) C2/26A8: 89 00 02 BIT #$0200 C2/26AB: F0 05 BEQ $26B2 (if Regen blocked, branch) C2/26AD: 89 40 00 BIT #$0040 C2/26B0: D0 03 BNE $26B5 (if Seizure isn't blocked, branch) C2/26B2: 29 BF FD AND #$FDBF (SO if either Regen or Seizure is blocked, block both. should explain Regen failing on Ribbon) C2/26B5: E2 20 SEP #$20 C2/26B7: 9D 1D 33 STA $331D,X (update blocked status byte #2. we'll update byte #3 below.) C2/26BA: EB XBA (now examine #3) C2/26BB: 89 04 BIT #$04 C2/26BD: F0 04 BEQ $26C3 (if Slow blocked, branch) C2/26BF: 89 08 BIT #$08 C2/26C1: D0 02 BNE $26C5 (if Haste isn't blocked, branch) C2/26C3: 29 F3 AND #$F3 (SO if either Slow or Haste is blocked, block 'em both. should explain Slow failing on RunningShoes) C2/26C5: 9D D0 33 STA $3330,X (update blocked status byte #3) C2/26C8: 60 RTS
C2/26C9 unknow
C2/26C9: A2 12 LDX #$12 (start from 6th enemy) C2/26CB: 20 75 26 JSR $2675 C2/26CE: CA DEX C2/26CF: CA DEX C2/26D0: 10 F9 BPL $26CB (and do function 2675 for everybody in the battle) C2/26D2: 60 RTS
C2/26D3 unknow
When called: A Low = $B5 A High = $B6 (or in some cases like Tools, $B6 appears to hold just the 0-7 Tool index rather than the item #. some of the Item code indirectly puts $3A7D in top of A, and i believe that holds the full item number.) C2/26D3: DA PHX C2/26D4: 5A PHY C2/26D5: 48 PHA C2/26D6: 64 BA STZ $BA C2/26D8: A2 40 LDX #$40 C2/26DA: 86 BB STX $BB (default to targeting byte just being Cursor Start on Enemy) C2/26DC: A2 00 LDX #$00 C2/26DE: C9 1E CMP #$1E C2/26E0: B0 1F BCS $2701 (branch if command >= 1Eh) C2/26E2: AA TAX C2/26E3: BF 8A 27 C2 LDA $C2278A,X (get miscellaneous Command properties byte) C2/26E7: 48 PHA C2/26E8: 29 E1 AND #$E1 (isolate Abort on Characters, Randomize Target, beat on corpses if no valid targets left, and Exclude Attacker From Targets properties) C2/26EA: 85 BA STA $BA C2/26EC: A3 01 LDA $01,S C2/26EE: 29 18 AND #$18 (now check what will become Can Target Dead/Hidden Entities and Don't Retarget if Target Invalid) C2/26F0: 4A LSR C2/26F1: 04 BA TSB $BA C2/26F3: 8A TXA C2/26F4: 0A ASL C2/26F5: AA TAX (multiply command number by 2) C2/26F6: BF 01 FE CF LDA $CFFE01,X C2/26FA: 85 BB STA $BB (get the command's targeting from some table) C2/26FC: 68 PLA C2/26FD: 29 06 AND #$06 (two second lowest bits from C2/278A determine what function to call next) C2/26FF: AA TAX C2/2700: EB XBA (now get spell # or miscellaneous index.. ex- it might indicate the item Number) C2/2701: FC 82 27 JSR ($2782,X) C2/2704: 68 PLA C2/2705: 7A PLY C2/2706: FA PLX C2/2707: 60 RTS
C2/2708 unknow
C2/2708: A2 04 LDX #$04 C2/270A: DF 78 27 C2 CMP $C22778,X (is the tool or skean one that uses a spell?) C2/270E: D0 06 BNE $2716 (if not, branch) C2/2710: FF 7D 27 C2 SBC $C2277D,X (if yes, subtract constant to determine its spell number) C2/2714: 80 37 BRA $274D (see, certain Tools and Skeans just load spells to do their work) (Bio Blaster will use spell 7D, Bio Blast Flash will use spell 7E, Flash Fire Skean will use spell 51h, Fire Skean Water Edge will use spell 52, Water Edge Bolt Edge will use spell 53, Bolt Edge ) C2/2716: CA DEX C2/2717: 10 F1 BPL $270A (loop 5 times, provided we didn't jump out of the loop) C2/2719: 38 SEC (set Carry.. for check at C2/18BD ??) C2/271A: 8D 11 34 STA $3411 (save item #) C2/271D: 20 63 2B JSR $2B63 (Multiply A by 30) C2/2720: C2 10 REP #$10 (Set 16-bit X and Y) C2/2722: AA TAX C2/2723: BF 0E 50 D8 LDA $D8500E,X (Targeting byte) C2/2727: 85 BB STA $BB C2/2729: BF 15 50 D8 LDA $D85015,X (Condition 1 when Item used) C2/272D: 89 C2 BIT #$C2 C2/272F: D0 04 BNE $2735 (Branch if Death, Zombie, or Petrify set) C2/2731: A9 08 LDA #$08 C2/2733: 14 BA TRB $BA (Clear Can Target Dead/Hidden Entities) C2/2735: BF 12 50 D8 LDA $D85012,X (equipment spell byte. Bits 0-5: spell # Bit 6: cast randomly after weapon strike [handled elsewhere, shouldn't apply here] Bit 7: 1 = remove from inventory upon usage, 0 = nope) C2/2739: E2 10 SEP #$10 (Set 8-bit X and Y) C2/273B: 60 RTS C2/273C: C9 E6 CMP #$E6 (Carry is set if item # >= 230, Sprint Shoes? i.e. it's Item type. Carry won't be set for Equipment Magic) C2/273E: 20 1A 27 JSR $271A C2/2741: B0 C4 BCS $2707 (if it's a plain ol' Item, always deduct from inventory, and don't attempt to save the [meaningless] spell # or load spell data) C2/2743: 30 06 BMI $274B (branch if equipment gets used up when used for Item Magic. i'm not aware of any equipment this *doesn't* happen with, though the game supports it.) C2/2745: EB XBA C2/2746: A9 10 LDA #$10 C2/2748: 04 B1 TSB $B1 (set "don't deplete from Item inventory" flag) C2/274A: EB XBA C2/274B: 29 3F AND #$3F (isolate spell # cast by equipment) C2/274D: 8D 10 34 STA $3410 (Magic and numerous other commands enter here) C2/2750: 80 02 BRA $2754 (load spell data for [equipment] magic) C2/2752: A9 EE LDA #$EE (select Spell EEh - Battle) C2/2754: 20 66 29 JSR $2966 (go load spell data) C2/2757: A5 BB LDA $BB (targeting byte as read from $CFFE01 table?) C2/2759: 1A INC C2/275A: D0 05 BNE $2761 (branch if it wasn't FF.. if it was, it's null, so we use the spell byte instead) C2/275C: AD A0 11 LDA $11A0 (spell aiming byte) C2/275F: 85 BB STA $BB C2/2761: AD A2 11 LDA $11A2 C2/2764: 48 PHA C2/2765: 29 04 AND #$04 (Isolate bit 2. This spell bit is used for two properties: Bit 2 of $11A2 will be "Hit only (dead XOR undead) targets", and Bit 3 of $BA will be "Can Target Dead/Hidden entities".) C2/2767: 0A ASL C2/2768: 04 BA TSB $BA (Sets Can Target Dead/Hidden entities) C2/276A: A3 01 LDA $01,S (get $11A2 again) C2/276C: 29 10 AND #$10 (Randomize target) C2/276E: 0A ASL C2/276F: 0A ASL C2/2770: 04 BA TSB $BA (Sets randomize target) C2/2772: 68 PLA (get $11A2 again) C2/2773: 29 80 AND #$80 (Abort on characters) C2/2775: 04 BA TSB $BA (Sets abort on characters) C2/2777: 60 RTS
(Data - item numbers of Tools and Skeans that use spells to do a good chunk of their work) C2/2778: A4 (Bio Blaster) C2/2779: A5 (Flash) C2/277A: AB (Fire Skean) C2/277B: AC (Water Edge) C2/277C: AD (Bolt Edge)
C2/277D data: constants to subtract from C2/2778 table
(Data - constants we subtract from the above item #s to get the numbers of the spells they rely on) C2/277D: 27 C2/277E: 27 C2/277F: 5A C2/2780: 5A C2/2781: 5A
C2/2782 pointers
Code Pointers (indexed by bits 1 and 2 of data values below) C2/2782: 52 27 (Fight, Morph, Revert, Steal, Capture, Runic, Sketch, Control, Leap, Mimic, Row, Def, Jump, GP Rain, Possess) C2/2784: 3C 27 (Item) C2/2786: 4D 27 (Magic, SwdTech, Blitz, Lore, Slot, Rage, Dance, X-Magic, Summon, Health, Shock, MagiTek) C2/2788: 08 27 (Throw, Tools)
C2/278A pointers: commands
(Data - indexed by command # 0 thru 1Dh?) C2/278A: 20 (Fight) C2/278B: 1A (Item) C2/278C: 04 (Magic) C2/278D: 18 (Morph) C2/278E: 18 (Revert) C2/278F: 00 (Steal) C2/2790: 20 (Capture) C2/2791: 24 (SwdTech) C2/2792: 06 (Throw) C2/2793: 06 (Tools) C2/2794: 04 (Blitz) C2/2795: 18 (Runic) C2/2796: 04 (Lore) C2/2797: 80 (Sketch) C2/2798: 80 (Control) C2/2799: 04 (Slot) C2/279A: 04 (Rage) C2/279B: 80 (Leap) C2/279C: 18 (Mimic) C2/279D: 04 (Dance) C2/279E: 18 (Row) C2/279F: 18 (Def) C2/27A0: 21 (Jump) C2/27A1: 04 (X-Magic) C2/27A2: 01 (GP Rain) C2/27A3: 04 (Summon) C2/27A4: 04 (Health) C2/27A5: 04 (Shock) C2/27A6: 81 (Possess) C2/27A7: 04 (MagiTek)
C2/27A8 unknow
C2/27A8: 08 PHP C2/27A9: C2 30 REP #$30 (Set 16-bit Accumulator & Index Registers) C2/27AB: BC 10 30 LDY $3010,X (get offset to character info block) C2/27AE: B9 09 16 LDA $1609,Y (get current HP) C2/27B1: 9D F4 3B STA $3BF4,X (HP) C2/27B4: B9 0D 16 LDA $160D,Y (get current MP) C2/27B7: 9D 08 3C STA $3C08,X (MP) C2/27BA: B9 0B 16 LDA $160B,Y (get maximum HP) C2/27BD: 20 3C 28 JSR $283C (get max HP after equipment/relic boosts) C2/27C0: C9 10 27 CMP #$2710 C2/27C3: 90 03 BCC $27C8 C2/27C5: A9 0F 27 LDA #$270F (if it was >= 10000, make it 9999) C2/27C8: 9D 1C 3C STA $3C1C,X (Max HP) C2/27CB: B9 0F 16 LDA $160F,Y (get maximum MP) C2/27CE: 20 3C 28 JSR $283C (get max MP after equipment/relic boosts) C2/27D1: C9 E8 03 CMP #$03E8 C2/27D4: 90 03 BCC $27D9 C2/27D6: A9 E7 03 LDA #$03E7 (if it was >= 1000, make it 999) C2/27D9: 9D 30 3C STA $3C30,X (Max MP) C2/27DC: BD 18 30 LDA $3018,X C2/27DF: 24 B8 BIT $B8 C2/27E1: F0 15 BEQ $27F8 C2/27E3: BD 1C 3C LDA $3C1C,X (Max HP) C2/27E6: 9D F4 3B STA $3BF4,X (HP) C2/27E9: BD 30 3C LDA $3C30,X (Max MP) C2/27EC: 9D 08 3C STA $3C08,X (MP) C2/27EF: B9 14 16 LDA $1614,Y (outside battle statuses 1-2? from tashibana doc) (^ statuses correspond to in-battle statuses 1+4) C2/27F2: 29 2D FF AND #$FF2D C2/27F5: 99 14 16 STA $1614,Y (remove Clear, Petrify, death, zombie.. Colosseum related?) C2/27F8: BD 6C 3C LDA $3C6C,X (monster/equip status bytes 2-3) C2/27FB: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/27FD: 9D D5 3D STA $3DD5,X (Status to set byte 2) C2/2800: 4A LSR C2/2801: 90 08 BCC $280B (branch if Condemned not marked to be set) C2/2803: BD 04 32 LDA $3204,X C2/2806: 29 EF AND #$EF C2/2808: 9D 04 32 STA $3204,X (^ if it is going to be set, then turn off Bit 4) C2/280B: B9 14 16 LDA $1614,Y C2/280E: 9D D4 3D STA $3DD4,X (Status to set byte 1) C2/2811: 89 08 BIT #$08 C2/2813: F0 0A BEQ $281F (If not set M-Tek) C2/2815: A9 1D LDA #$1D C2/2817: 8D 20 3F STA $3F20 (save MagiTek as default last command for Mimic) C2/281A: A9 83 LDA #$83 C2/281C: 8D 21 3F STA $3F21 (save Fire Beam as default last attack for Mimic) (if Gogo uses Mimic before any other character acts in a battle, he'll normally use Fight. all i can figure is that this code is here to make him use Fire Beam instead should anybody be found to be wearing MagiTek armor -- in the normal game, we can assume that if anybody's in armor, everybody [including Gogo] is in it.) C2/281F: B9 15 16 LDA $1615,Y (outside battle status 2? corresponds to in-battle status byte 4) C2/2822: 29 C0 AND #$C0 (only keep Dog Block and Float) C2/2824: EB XBA (get monster/equip status byte 3) C2/2825: 4A LSR (shift out the lowest bit - Dance) C2/2826: 90 04 BCC $282C (branch if Dance aka Permanent Float isn't set) C2/2828: EB XBA C2/2829: 09 80 ORA #$80 (turn on Float in status byte 4) C2/282B: EB XBA C2/282C: 0A ASL (shift monster/equip status byte 3 back up, zeroing the lowest bit) C2/282D: 9D E8 3D STA $3DE8,X (Status to set byte 3) C2/2830: EB XBA C2/2831: 9D E9 3D STA $3DE9,X (Status to set byte 4) C2/2834: B9 08 16 LDA $1608,Y C2/2837: 9D 18 3B STA $3B18,X (Level) C2/283A: 28 PLP C2/283B: 60 RTS
C2/283C apply equipment boost to HP or MP
(Apply percentage boost to HP or MP. Bit 14 set = 25% boost, Bit 15 set = 50% boost, Both of those bits set = 12.5% boost) C2/283C: DA PHX C2/283D: 0A ASL C2/283E: 2A ROL C2/283F: 85 EE STA $EE C2/2841: 2A ROL C2/2842: 2A ROL (Bit 15 is now in Bit 2, and Bit 14 is in Bit 1) C2/2843: 29 06 00 AND #$0006 (isolate Bits 1 and 2) C2/2846: AA TAX (and use them as function pointer) C2/2847: A5 EE LDA $EE C2/2849: 4A LSR C2/284A: 4A LSR C2/284B: 85 EE STA $EE (all that crazy shifting was equivalent to $EE = A AND 16383. gotta love Square =] ) C2/284D: 7C 59 28 JMP ($2859,X)
C2/2850 generic boost calculation
(Boost A by some fraction, if any) C2/2850: 7B TDC (enter here for A = 0 + $EE) C2/2851: 4A LSR (enter here for A = (A * 1/8) + $EE) C2/2852: 4A LSR (enter here for A = (A * 1/4) + $EE) C2/2853: 4A LSR (enter here for A = (A * 1/2) + $EE) C2/2854: 18 CLC C2/2855: 65 EE ADC $EE C2/2857: FA PLX C2/2858: 60 RTS
C2/2859 pointers: boosts formulae
C2/2859: 50 28 (A = A) (technically, A = $EE, but it's the same deal.) C2/285B: 52 28 (A = A + (A * 1/4) ) C2/285D: 53 28 (A = A + (A * 1/2) ) C2/285F: 51 28 (A = A + (A * 1/8) )
C2/2861 math: A = 255 - (A * 2) + 1
(A = 255 - (A * 2) + 1 If A was >= 128 to start with, then A = 1. If A was 0 to start with, then A ends up as 255.) C2/2861: 0A ASL C2/2862: 90 02 BCC $2866 C2/2864: A9 FF LDA #$FF C2/2866: 49 FF EOR #$FF C2/2868: 1A INC C2/2869: D0 01 BNE $286C C2/286B: 3A DEC C2/286C: 60 RTS
C2/286D initialize battle characters: add equipments proprieties
(Initialize in-battle character properties from equipment properties. A lot of the equipment bytes in this function were explained in C2/0E77, C2/0F9A, and C2/10B2, so consult those functions. Terii's Offsets List at http://www.rpglegion.com/ff6/hack/offset2.txt is another great resource.) C2/286D: 0B PHD C2/286E: F4 00 11 PEA $1100 (Set direct page register 11 $1100) C2/2871: 2B PLD C2/2872: A5 C9 LDA $C9 ($11C9) C2/2874: C9 9F CMP #$9F (Moogle Suit in character's Armor slot?) C2/2876: D0 0B BNE $2883 (if not, branch) C2/2878: 8A TXA C2/2879: 0A ASL C2/287A: 0A ASL C2/287B: 0A ASL C2/287C: 0A ASL C2/287D: A8 TAY C2/287E: A9 0A LDA #$0A C2/2880: 99 AE 2E STA $2EAE,Y (Use Mog's sprite?) C2/2883: 8A TXA C2/2884: 4A LSR C2/2885: A8 TAY C2/2886: A5 D8 LDA $D8 ($11D8) C2/2888: 29 10 AND #$10 C2/288A: 99 6E 2E STA $2E6E,Y (store Genji Glove effect. this variable is used in Bank C1, apparently to check for Genji Glove's presence when handling mid-battle equipment changes via the Item menu.) C2/288D: 18 CLC C2/288E: A5 A6 LDA $A6 ($11A6) C2/2890: 65 A6 ADC $A6 ($11A6) (add Vigor to itself) C2/2892: 90 02 BCC $2896 (branch if it's under 256) C2/2894: A9 FF LDA #$FF (else make it 255) C2/2896: 9D 2C 3B STA $3B2C,X (store Vigor * 2) C2/2899: A5 A4 LDA $A4 ($11A4) (Speed) C2/289B: 9D 2D 3B STA $3B2D,X C2/289E: 9D 19 3B STA $3B19,X C2/28A1: A5 A2 LDA $A2 ($11A2) (Stamina) C2/28A3: 9D 40 3B STA $3B40,X C2/28A6: A5 A0 LDA $A0 ($11A0) (Magic Power) C2/28A8: 9D 41 3B STA $3B41,X C2/28AB: A5 A8 LDA $A8 ($11A8) C2/28AD: 20 61 28 JSR $2861 C2/28B0: 9D 54 3B STA $3B54,X ( 255 - (Evade * 2) + 1 , capped at low of 1 and high of 255 ) C2/28B3: A5 AA LDA $AA ($11AA) C2/28B5: 20 61 28 JSR $2861 C2/28B8: 9D 55 3B STA $3B55,X ( 255 - (MBlock * 2) + 1 , capped at low of 1 and high of 255 ) C2/28BB: A5 CF LDA $CF ($11CF) C2/28BD: 14 D8 TRB $D8 ($11D8) (clear Genji Glove effect from "Battle Effects 2" if its bit was ON in $11CF [i.e. if both hands hold a weapon]. yes, this reeks of a bug. likely, they instead wanted the GG effect cleared only when one or zero hands held a weapon.) C2/28BF: A5 BC LDA $BC ($11BC) C2/28C1: 9D 6C 3C STA $3C6C,X (Equipment status byte 2) C2/28C4: A5 D4 LDA $D4 ($11D4) C2/28C6: 9D 6D 3C STA $3C6D,X (Equipment status byte 3) C2/28C9: A5 DC LDA $DC ($11DC) C2/28CB: 9D 71 3D STA $3D71,X (Amount to add to character's "Run Success" variable. has range of 2 thru 5. higher means that, on average, they can run away quicker from battle.) C2/28CE: A5 D9 LDA $D9 ($11D9) C2/28D0: 29 80 AND #$80 (undead bit from relic ring) C2/28D2: 09 10 ORA #$10 (always set Human for party members) C2/28D4: 9D 95 3C STA $3C95,X (save in "Special Byte 3") C2/28D7: A5 D5 LDA $D5 ($11D5) C2/28D9: 0A ASL (A = 0, raise attack dmg, double earring, hp+25%, hp+50, hp+12.5, mp+25, mp+50) (carry = mp+12.5) C2/28DA: EB XBA C2/28DB: A5 D6 LDA $D6 ($11D6) C2/28DD: 0C 6D 3A TSB $3A6D (combine with existing "Battle Effects 1" properties) C2/28E0: 0A ASL (carry = jump continously) C2/28E1: A5 D7 LDA $D7 ($11D7) C2/28E3: EB XBA C2/28E4: 6A ROR (Top half A [will be $3C45] = $11D7 = boost steal, single Earring, boost sketch, boost control, sniper sight, gold hairpin, economizer, vigor + 50% Bottom half [will be $3C44] = raise attack dmg, double Earring, hp+25%, hp+50%, hp+12.5%, mp+25%, mp+50%, jump continuously. The HP/MP bonuses were already read from $11D5 earlier, so they're essentially junk in $3C44. All that's read are Bits 0, 1, and 7.) C2/28E5: C2 20 REP #$20 (Set 16-bit Accumulator) C2/28E7: 9D 44 3C STA $3C44,X C2/28EA: A5 AC LDA $AC ($11AC) C2/28EC: 9D 68 3B STA $3B68,X ($3B68 = battle power for 1st hand, $3B69 = bat pwr for 2nd hand) C2/28EF: A5 AE LDA $AE ($11AE) C2/28F1: 9D 7C 3B STA $3B7C,X (hit rate) C2/28F4: A5 B4 LDA $B4 ($11B4) C2/28F6: 9D 34 3D STA $3D34,X (random weapon spellcast, for both hands) C2/28F9: A5 B0 LDA $B0 ($11B0) C2/28FB: 9D 90 3B STA $3B90,X (elemental properties of weapon) C2/28FE: A5 D8 LDA $D8 ($11D8) C2/2900: 89 08 00 BIT #$0008 (is Gauntlet bit set?) C2/2903: D0 05 BNE $290A C2/2905: A9 40 40 LDA #$4040 (if it's not, turn off 2-hand effect for both hands) C2/2908: 14 DA TRB $DA ($11DA) C2/290A: A5 DA LDA $DA ($11DA) C2/290C: 9D A4 3B STA $3BA4,X (save "Weapon effects") C2/290F: A5 BA LDA $BA ($11BA) C2/2911: 9D B8 3B STA $3BB8,X (bottom = Defense, top = Magic Defense) C2/2914: A9 FF FF LDA #$FFFF C2/2917: 9D 1C 33 STA $331C,X (Status Immunity Bytes 1 and 2: character is vulnerable to everything -- i.e. immune to nothing) C2/291A: 45 D2 EOR $D2 ($11D2) (equipment immunities) C2/291C: 9D 1C 33 STA $331C,X (for Immunity Bytes 1-2, character is now vulnerable to whatever the equipment doesn't block) C2/291F: A5 B6 LDA $B6 ($11B6) C2/2921: 9D CC 3B STA $3BCC,X (bottom = absorbed elements, top = nullified elements) C2/2924: A5 B8 LDA $B8 ($11B8) C2/2926: 9D E0 3B STA $3BE0,X (bottom = weak elements, top = 50% resist elements) C2/2929: A5 BE LDA $BE ($11BE) C2/292B: 9D BC 3C STA $3CBC,X (bottom = special action for right hand, top = special action for left hand) C2/292E: A5 C6 LDA $C6 ($11C6) (item # of equipment in both hands) C2/2930: 9D A8 3C STA $3CA8,X C2/2933: A5 CA LDA $CA ($11CA) (item # of equipment in both relic slots) C2/2935: 9D D0 3C STA $3CD0,X C2/2938: A5 D0 LDA $D0 ($11D0) C2/293A: 9D E4 3C STA $3CE4,X (deals with weapon and shield animation for blocking magical and physical attacks) C2/293D: A5 D8 LDA $D8 ($11D8) C2/293F: 9D 58 3C STA $3C58,X (save "Battle Effects 2") C2/2942: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/2944: 1E 21 3A ASL $3A21,X (Bit X is set, where X is the actual character # of this onscreen character. corresponding bits are set in Items to see if they're equippable. shift out the top bit, as that corresponds to "heavy" merit awardable equipment and will be set below) C2/2947: 0A ASL C2/2948: 0A ASL C2/2949: 0A ASL (rotate "wearer can equip heavy armor" bit from Battle Effects 2 into carry bit) C2/294A: 7E 21 3A ROR $3A21,X (now put it in "character # for purposes of equipping" byte) C2/294D: 2B PLD C2/294E: 4C 50 26 JMP $2650 (deal with Instant Death protection, and Poison elemental nullification giving immunity to Poison status) C2/2951: AD A2 11 LDA $11A2 C2/2954: 4A LSR C2/2955: BD 41 3B LDA $3B41,X (magic power * 1.5) C2/2958: 90 03 BCC $295D (Branch if not physical attack) C2/295A: BD 2C 3B LDA $3B2C,X (vigor * 2) C2/295D: 8D AE 11 STA $11AE C2/2960: 9C 89 3A STZ $3A89 (turn off random weapon spellcast) C2/2963: 4C 21 2C JMP $2C21
C2/2966 load spell data
(Load spell data) C2/2966: DA PHX C2/2967: 08 PHP C2/2968: EB XBA C2/2969: A9 0E LDA #$0E C2/296B: 20 81 47 JSR $4781 (length of spell data * spell #) C2/296E: C2 31 REP #$31 (Set 16-bit A, X, Y. Clear carry flag) C2/2970: 69 C0 6A ADC #$6AC0 (spells start at 46CC0 ROM offset, or C4/6AC0) C2/2973: AA TAX C2/2974: A0 A0 11 LDY #$11A0 C2/2977: A9 0D 00 LDA #$000D C2/297A: 54 7E C4 MVN #$C4,7E (copy 14 spell bytes into RAM) C2/297D: E2 20 SEP #$20 C2/297F: 0E A9 11 ASL $11A9 (multiply special effect by 2) C2/2982: 90 03 BCC $2987 C2/2984: 9C A9 11 STZ $11A9 (if it exceeded 255, make it 0) C2/2987: 28 PLP C2/2988: FA PLX C2/2989: 60 RTS
C2/298A load command data
(Loads command data, clears special effect, sets unblockable, sets Level to 0, sets Vigor/Mag. Pwr to 0) C2/298A: AD 7C 3A LDA $3A7C C2/298D: 20 D3 26 JSR $26D3 C2/2990: A9 20 LDA #$20 C2/2992: 0C A4 11 TSB $11A4 (Set Unblockable) C2/2995: 9C A9 11 STZ $11A9 (Clear special effects) C2/2998: 9C AF 11 STZ $11AF (Set Level to 0) C2/299B: 9C AE 11 STZ $11AE (Set Vigor / M. Power to 0) C2/299E: 60 RTS
C2/299F load weapon data
(Load weapon data into attack data. Also handles Offering, Sniper Sight, etc) C2/299F: 08 PHP C2/29A0: BD 2C 3B LDA $3B2C,X C2/29A3: 8D AE 11 STA $11AE (Vigor * 2 / Magic Power) C2/29A6: 20 21 2C JSR $2C21 C2/29A9: BD 45 3C LDA $3C45,X C2/29AC: 89 10 BIT #$10 C2/29AE: F0 05 BEQ $29B5 (If no Sniper Sight) C2/29B0: A9 20 LDA #$20 C2/29B2: 0C A4 11 TSB $11A4 (Sets Can't be Dodged) C2/29B5: A5 B6 LDA $B6 C2/29B7: C9 EF CMP #$EF C2/29B9: D0 0C BNE $29C7 (Branch if not Special) C2/29BB: BD E4 3E LDA $3EE4,X C2/29BE: 89 20 BIT #$20 (Check for Imp status) C2/29C0: D0 05 BNE $29C7 (if an Imp, branch) C2/29C2: A9 06 LDA #$06 C2/29C4: 8D 12 34 STA $3412 C2/29C7: 28 PLP C2/29C8: DA PHX C2/29C9: 66 B6 ROR $B6 (if carry was set going into function, this is an odd-numbered attack of sequence, related to $3A70.. top bit of $B6 will be used in animation: Clear = right hand, Set = left hand) C2/29CB: 10 01 BPL $29CE (if Carry wasn't set, branch and use right hand) C2/29CD: E8 INX (if it was, point to left weapon hand) C2/29CE: BD 68 3B LDA $3B68,X C2/29D1: 8D A6 11 STA $11A6 (Battle Power) C2/29D4: A9 62 LDA #$62 C2/29D6: 04 B3 TSB $B3 (turn off Always Critical and Gauntlet. Turn on ignore attacker row) C2/29D8: BD A4 3B LDA $3BA4,X C2/29DB: 29 60 AND #$60 (isolate "Same damage from back row" and "2-hand" properties) C2/29DD: 49 20 EOR #$20 (flip "Same damage from back row" to get "Damage affected by attacker row") C2/29DF: 14 B3 TRB $B3 (Bit 6 = 0 for Gauntlet [2-hand] and Bit 5 = 0 for "Damage affected by attacker row") C2/29E1: BD 90 3B LDA $3B90,X C2/29E4: 8D A1 11 STA $11A1 (Element) C2/29E7: BD 7C 3B LDA $3B7C,X C2/29EA: 8D A8 11 STA $11A8 (Hit Rate) C2/29ED: BD 34 3D LDA $3D34,X C2/29F0: 8D 89 3A STA $3A89 (random weapon spellcast) C2/29F3: BD BC 3C LDA $3CBC,X C2/29F6: 29 F0 AND #$F0 C2/29F8: 4A LSR C2/29F9: 4A LSR C2/29FA: 4A LSR C2/29FB: 8D A9 11 STA $11A9 (Special effect) C2/29FE: BD A8 3C LDA $3CA8,X (Get equipment in current hand) C2/2A01: 1A INC C2/2A02: 85 B7 STA $B7 C2/2A04: FA PLX C2/2A05: BD 58 3C LDA $3C58,X (Check for offering) C2/2A08: 4A LSR C2/2A09: 90 10 BCC $2A1B (Branch if no Offering) C2/2A0B: A9 20 LDA #$20 C2/2A0D: 0C A4 11 TSB $11A4 (Set Can't be dodged) C2/2A10: A9 40 LDA #$40 C2/2A12: 04 BA TSB $BA (Sets randomize target) C2/2A14: A9 02 LDA #$02 C2/2A16: 04 B2 TSB $B2 (Set no critical and ignore True Knight) C2/2A18: 9C 89 3A STZ $3A89 (Turn off random spellcast) C2/2A1B: AD A6 11 LDA $11A6 C2/2A1E: F0 16 BEQ $2A36 (Exit if 0 Battle Power) C2/2A20: E0 08 CPX #$08 C2/2A22: 90 12 BCC $2A36 (Exit if character) C2/2A24: A9 20 LDA #$20 C2/2A26: 3C E4 3E BIT $3EE4,X C2/2A29: F0 0B BEQ $2A36 (Exit if not Imp) C2/2A2B: 0A ASL C2/2A2C: 3C 95 3C BIT $3C95,X (Check for auto critical if Imp) C2/2A2F: D0 05 BNE $2A36 (If set then exit) C2/2A31: A9 01 LDA #$01 C2/2A33: 8D A6 11 STA $11A6 (Set Battle Power to 1) C2/2A36: 60 RTS
C2/2A37 item usage setup
(Item usage setup. Used for Items, Skeans, Tools?) (Going in: A = Item number. Carry flag = Command >= 2. It's set for Magic or Throw or Tools, but not plain Item.) C2/2A37: DA PHX C2/2A38: 08 PHP C2/2A39: 48 PHA C2/2A3A: DA PHX C2/2A3B: A2 0F LDX #$0F C2/2A3D: 9E A0 11 STZ $11A0,X (zero out all spell data -related bytes) C2/2A40: CA DEX C2/2A41: 10 FA BPL $2A3D C2/2A43: FA PLX C2/2A44: A9 21 LDA #$21 C2/2A46: 8D A2 11 STA $11A2 (Set to ignore defense, physical attack) C2/2A49: A9 22 LDA #$22 C2/2A4B: 8D A3 11 STA $11A3 (Set attack to retarget if target dead, not reflectable) C2/2A4E: A9 20 LDA #$20 C2/2A50: 8D A4 11 STA $11A4 (Set to unblockable) C2/2A53: 90 09 BCC $2A5E (branch if not Skean or Item Magic or Tools) C2/2A55: BD 2C 3B LDA $3B2C,X C2/2A58: 8D AE 11 STA $11AE (Vigor * 2 or Magic Power) C2/2A5B: 20 21 2C JSR $2C21 C2/2A5E: A3 01 LDA $01,S C2/2A60: 20 63 2B JSR $2B63 (Multiply A by 30) C2/2A63: C2 10 REP #$10 (Set 16-bit X and Y) C2/2A65: AA TAX C2/2A66: BF 14 50 D8 LDA $D85014,X (Item "HP/MP affected", aka power) C2/2A6A: 8D A6 11 STA $11A6 C2/2A6D: BF 0F 50 D8 LDA $D8500F,X (Item's element) C2/2A71: 8D A1 11 STA $11A1 C2/2A74: B0 66 BCS $2ADC (branch if Skean or Item Magic or Tools) C2/2A76: A9 01 LDA #$01 C2/2A78: 1C A2 11 TRB $11A2 (Sets to magical attack) C2/2A7B: BF 1B 50 D8 LDA $D8501B,X (item special action) C2/2A7F: 0A ASL C2/2A80: B0 05 BCS $2A87 (Branch if top bit set, i.e. no action, usually FFh) C2/2A82: 69 90 ADC #$90 C2/2A84: 8D A9 11 STA $11A9 (Else store 90h + (action*2) in special effect) C2/2A87: C2 20 REP #$20 (set 16-bit accumulator) C2/2A89: BF 15 50 D8 LDA $D85015,X (Item conditions 1+2 when used) C2/2A8D: 8D AA 11 STA $11AA C2/2A90: BF 17 50 D8 LDA $D85017,X (Item conditions 3+4 when used) C2/2A94: 8D AC 11 STA $11AC C2/2A97: E2 20 SEP #$20 (Set 8-bit accumulator) C2/2A99: BF 13 50 D8 LDA $D85013,X (Get Item Properties) C2/2A9D: 85 FE STA $FE C2/2A9F: 06 FE ASL $FE (Does it manipulate 1/16th of actual values?) C2/2AA1: 90 05 BCC $2AA8 (If not ^, branch) C2/2AA3: A9 80 LDA #$80 C2/2AA5: 0C A4 11 TSB $11A4 (Set bit to take HP at fraction of spell byte 7) C2/2AA8: 06 FE ASL $FE C2/2AAA: 06 FE ASL $FE C2/2AAC: 90 05 BCC $2AB3 (If item doesn't remove status conditions, branch) C2/2AAE: A9 04 LDA #$04 C2/2AB0: 0C A4 11 TSB $11A4 (Set remove status spell bit) C2/2AB3: 06 FE ASL $FE C2/2AB5: 90 07 BCC $2ABE (Branch if "restore MP" item bit unset) C2/2AB7: A9 80 LDA #$80 C2/2AB9: 0C A3 11 TSB $11A3 (Set spell to concern MP) C2/2ABC: 04 FE TSB $FE (And automatically set "restore HP" in item properties, so MP-related items always try to give MP, not take it) C2/2ABE: 06 FE ASL $FE C2/2AC0: 90 05 BCC $2AC7 (Branch if "restore HP" (or restore MP) bit unset) C2/2AC2: A9 01 LDA #$01 C2/2AC4: 0C A4 11 TSB $11A4 (Set Heal spell bit) C2/2AC7: 06 FE ASL $FE C2/2AC9: 06 FE ASL $FE C2/2ACB: 90 05 BCC $2AD2 (Branch if Item doesn't reverse damage on undead) C2/2ACD: A9 08 LDA #$08 C2/2ACF: 0C A2 11 TSB $11A2 (Sets Cures undead) C2/2AD2: AD AA 11 LDA $11AA C2/2AD5: 10 05 BPL $2ADC (Branch if not death attack) C2/2AD7: A9 0C LDA #$0C C2/2AD9: 0C A2 11 TSB $11A2 (Sets Cures undead and Hit only (dead XOR undead) targets) C2/2ADC: A3 01 LDA $01,S C2/2ADE: C9 AE CMP #$AE (Item number 174 - Inviz Edge?) C2/2AE0: D0 07 BNE $2AE9 (branch if not) C2/2AE2: A9 10 LDA #$10 C2/2AE4: 0C AA 11 TSB $11AA (Set Clear effect to attack) C2/2AE7: 80 09 BRA $2AF2 C2/2AE9: C9 AF CMP #$AF (Item number 175 - Shadow Edge?) C2/2AEB: D0 05 BNE $2AF2 (branch if not) C2/2AED: A9 04 LDA #$04 C2/2AEF: 0C AB 11 TSB $11AB (Set Image effect to attack) (NOTE: special Inviz and Shadow Edge checks are needed because much code [including that at C2/2A89 that normally loads statuses] is skipped if we're doing Throw or Item Magic) C2/2AF2: BF 00 50 D8 LDA $D85000,X (Item type) C2/2AF6: 29 07 AND #$07 C2/2AF8: D0 1C BNE $2B16 (If item's not a Tool, branch) C2/2AFA: A9 20 LDA #$20 C2/2AFC: 1C A2 11 TRB $11A2 (Clears ignore defense) C2/2AFF: 1C A4 11 TRB $11A4 (Clears unblockable) C2/2B02: BF 15 50 D8 LDA $D85015,X C2/2B06: 8D A8 11 STA $11A8 (Get and store hitrate) C2/2B09: 7B TDC C2/2B0A: A3 01 LDA $01,S (get item #. number of first tool [NoiseBlaster] is A3h) C2/2B0C: 38 SEC C2/2B0D: E9 A3 SBC #$A3 C2/2B0F: 29 07 AND #$07 (subtract 163 from item # and use bottom 3 bits to get a "tool number" of 0-7) C2/2B11: 0A ASL (multiply it by 2 to index table below) C2/2B12: AA TAX C2/2B13: FC 1A 2B JSR ($2B1A,X) (load Tool's miscellaneous effect) C2/2B16: 68 PLA C2/2B17: 28 PLP C2/2B18: FA PLX C2/2B19: 60 RTS
C2/2B1A pointers: tools table
C2/2B1A: 2A 2B (Noise Blaster) C2/2B1C: 2F 2B (Bio Blaster) (do nothing) C2/2B1E: 2F 2B (Flash) (do nothing) C2/2B20: 30 2B (Chainsaw) C2/2B22: 53 2B (Debilitator) C2/2B24: 4D 2B (Drill) C2/2B26: 57 2B (Air Anchor) C2/2B28: 5D 2B (Autocrossbow)
C2/2B2A tools: noiseblaster
C2/2B2A: A9 20 LDA #$20 C2/2B2C: 8D AB 11 STA $11AB (Set Muddled in attack data) C2/2B2F: 60 RTS
C2/2B30 tools: chainsaw
C2/2B30: 20 5A 4B JSR $4B5A (0 to 255) C2/2B33: 29 03 AND #$03 C2/2B35: D0 16 BNE $2B4D (75% chance) C2/2B37: A9 08 LDA #$08 C2/2B39: 85 B6 STA $B6 (Animation) C2/2B3B: 9C A6 11 STZ $11A6 (Battle power) C2/2B3E: A9 80 LDA #$80 C2/2B40: 0C AA 11 TSB $11AA (Set death status) C2/2B43: A9 10 LDA #$10 C2/2B45: 8D A4 11 STA $11A4 (Set stamina can block) C2/2B48: A9 02 LDA #$02 C2/2B4A: 0C A2 11 TSB $11A2 (Set miss if death prot.) C2/2B4D: A9 20 LDA #$20 C2/2B4F: 0C A2 11 TSB $11A2 (Set ignore defense) C2/2B52: 60 RTS
C2/2B53 tools: debilitator
C2/2B53: A9 AC LDA #$AC C2/2B55: 80 02 BRA $2B59 (Set Debilitator effect)
C2/2B57 tools: air anchor
C2/2B57: A9 AE LDA #$AE (Add Air Anchor effect) C2/2B59: 8D A9 11 STA $11A9 C2/2B5C: 60 RTS
C2/2B5D tools: autocrossbow
C2/2B5D: A9 40 LDA #$40 C2/2B5F: 0C A2 11 TSB $11A2 (Set no split damage) C2/2B62: 60 RTS
C2/2B63 math: A = A * 30
C2/2B63: EB XBA C2/2B64: A9 1E LDA #$1E C2/2B66: 4C 81 47 JMP $4781
C2/2B69 magic damage calculation
$11B0 = (Spell Power * 4) + (Level * Magic Power * Spell Power) / 32 (If Level of 0 is passed, $11B0 = Spell Power) NOTE: Unlike damage modification functions, this one does NOTHING to make sure damage doesn't exceed 65535. That means with a spell like Ultima, a character at level 99 who has reached 140+ Magic Power via Esper bonuses and equipment will do only triple-digit damage. C2/2B69: AD AF 11 LDA $11AF (Level) C2/2B6C: 85 E8 STA $E8 C2/2B6E: C9 01 CMP #$01 C2/2B70: 7B TDC (Clear 16-bit A) C2/2B71: AD A6 11 LDA $11A6 (Spell Power) C2/2B74: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2B76: 90 02 BCC $2B7A (If Level > 0, Spell Power *= 4) C2/2B78: 0A ASL C2/2B79: 0A ASL C2/2B7A: 8D B0 11 STA $11B0 (Maximum Damage) C2/2B7D: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/2B7F: AD AE 11 LDA $11AE (Magic Power) C2/2B82: EB XBA C2/2B83: AD A6 11 LDA $11A6 (Spell Power) C2/2B86: 20 81 47 JSR $4781 (Multiplication Function) C2/2B89: 20 B7 47 JSR $47B7 (Multiplication Function 2) C2/2B8C: A9 04 LDA #$04 C2/2B8E: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2B90: 20 D1 0D JSR $0DD1 (Divide 24-bit Damage by 32. [note the division operates on 4 bytes] ) C2/2B93: 18 CLC C2/2B94: 6D B0 11 ADC $11B0 (Maximum Damage) C2/2B97: 8D B0 11 STA $11B0 (Maximum Damage) C2/2B9A: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/2B9C: 60 RTS
C2/2B9D physical damage calculation
Physical Damage Calculation: X = Determines if monster or player Results: For characters: If Gauntlet equipped, treat Battle Power as 7/4 its normal value. Attack = Battle Power + (Vigor * 2). Vigor * 2 is capped at 255. $11B0 = Battle Power + ( (Level * Level * Attack) DIV 256 ) * 3/2 For monsters: Vigor is Random number 56 to 63 Attack = (Battle Power * 4) + Vigor $11B0 = (Level * Level * Attack) DIV 256 C2/2B9D: AD A2 11 LDA $11A2 (Check if magic attack) C2/2BA0: 4A LSR C2/2BA1: B0 03 BCS $2BA6 C2/2BA3: 4C 69 2B JMP $2B69 (Magical Damage Calculation) C2/2BA6: 08 PHP C2/2BA7: AD AF 11 LDA $11AF (attacker Level) C2/2BAA: 48 PHA (save it) C2/2BAB: 85 E8 STA $E8 C2/2BAD: 7B TDC C2/2BAE: AD A6 11 LDA $11A6 (Battle Power) C2/2BB1: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2BB3: E0 08 CPX #$08 (If monster then Battle Power *= 4) C2/2BB5: 90 02 BCC $2BB9 C2/2BB7: 0A ASL C2/2BB8: 0A ASL C2/2BB9: 48 PHA C2/2BBA: A5 B2 LDA $B2 C2/2BBC: 89 00 40 BIT #$4000 C2/2BBF: D0 0C BNE $2BCD (If Gauntlet is not equipped, branch) C2/2BC1: A3 01 LDA $01,S (Battle Power *= 7/4) C2/2BC3: 4A LSR C2/2BC4: 18 CLC C2/2BC5: 63 01 ADC $01,S C2/2BC7: 4A LSR C2/2BC8: 18 CLC C2/2BC9: 63 01 ADC $01,S C2/2BCB: 83 01 STA $01,S C2/2BCD: 68 PLA C2/2BCE: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/2BD0: 6D AE 11 ADC $11AE (add Vigor * 2 if character, or Vigor if monster) C2/2BD3: EB XBA C2/2BD4: 69 00 ADC #$00 (add carry from the bottom byte of Attack into the top byte) C2/2BD6: EB XBA C2/2BD7: 20 B7 47 JSR $47B7 (get 16-bit "Attack" * 8-bit level, and put 24-bit product in Variables $E8 thru $EA) C2/2BDA: A5 E8 LDA $E8 C2/2BDC: 85 EA STA $EA (use top byte of result as temporary variable, since it's generally 0 anyway. to see why that's a bad idea, keep reading.) C2/2BDE: 68 PLA C2/2BDF: 85 E8 STA $E8 (get attacker level again) C2/2BE1: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2BE3: A5 E9 LDA $E9 C2/2BE5: EB XBA (A = bottom two bytes of the first multiplication result.. typically, we'll always have zero in the top byte, so we can ignore it. but with a 255 Battle Power weapon, Gauntlet, and a character at Level 99 with 128 Vigor, that product WILL need 3 bytes. failure to use that top byte in our next multiplication means we'll lose a lot of damage. BUG!) C2/2BE6: 20 B7 47 JSR $47B7 (multiply 16-bit result of [Level * Attack] by our 8-bit level again, and put the new 24-bit product in Variables $E8 thru $EA. 16-bit A will hold the new product DIV 256.) C2/2BE9: 8D B0 11 STA $11B0 (Maximum Damage) C2/2BEC: E0 08 CPX #$08 (If Player then multiply $11B0 by 3/2) C2/2BEE: B0 2F BCS $2C1F (And add Battle Power) C2/2BF0: AD A6 11 LDA $11A6 (Battle Power) C2/2BF3: 29 FF 00 AND #$00FF C2/2BF5: 0A ASL C2/2BF7: 6D B0 11 ADC $11B0 (Maximum Damage) C2/2BFA: 4A LSR C2/2BFB: 18 CLC C2/2BFC: 6D B0 11 ADC $11B0 (Maximum Damage) C2/2BFF: 8D B0 11 STA $11B0 (Maximum Damage) C2/2C02: BD 58 3C LDA $3C58,X C2/2C05: 4A LSR C2/2C06: 90 03 BCC $2C0B (Check for offering) C2/2C08: 4E B0 11 LSR $11B0 (Halves damage) C2/2C0B: 89 08 00 BIT #$0008 C2/2C0E: F0 0F BEQ $2C1F (Check for Genji Glove) C2/2C10: AD B0 11 LDA $11B0 (Maximum Damage) C2/2C13: 4A LSR C2/2C14: 4A LSR C2/2C15: 49 FF FF EOR #$FFFF C2/2C18: 38 SEC C2/2C19: 6D B0 11 ADC $11B0 (Maximum Damage) C2/2C1B: 8D B0 11 STA $11B0 (Subtract 1/4 from Maximum Damage) C2/2C1F: 28 PLP C2/2C20: 60 RTS
C2/2C21 unknow
C2/2C21: DA PHX C2/2C22: AD 17 34 LDA $3417 (get Sketcher) C2/2C25: 30 01 BMI $2C28 (branch if null) C2/2C27: AA TAX (if there's a valid Sketcher, use their Level for attack) C2/2C28: BD 18 3B LDA $3B18,X (Level) C2/2C2B: 8D AF 11 STA $11AF (Level) C2/2C2E: FA PLX C2/2C2F: 60 RTS
C2/2C30 unknow
(Coming into function: A = Enemy Number. Y = in-battle enemy index, should be between 8 and 18d) (throughout this function, "main enemy" will mean the enemy referenced by the A and Y values that are initially passed to the function. "loop enemy" will mean the enemy currently referenced by the iterator of the loop that compares the main enemy to all other enemies in the battle.) C2/2C30: DA PHX C2/2C31: 08 PHP C2/2C32: C2 30 REP #$30 (16-bit accumulator and index registers) C2/2C34: 99 F9 1F STA $1FF9,Y C2/2C37: 99 A8 33 STA $33A8,Y C2/2C3A: 20 71 2D JSR $2D71 (read enemy command script. function explicitly preserves A and X, doesn't seem to touch Y) C2/2C3D: 0A ASL C2/2C3E: 0A ASL C2/2C3F: 48 PHA C2/2C40: AA TAX (enemy number * 4. there are 4 bytes for steal+win slots) C2/2C41: BF 00 30 CF LDA $CF3000,X C2/2C45: 99 08 33 STA $3308,Y (enemy steal slots) C2/2C48: 68 PLA C2/2C49: 0A ASL (enemy number * 8) C2/2C4A: 48 PHA C2/2C4B: DA PHX (push enemy number * 4) C2/2C4C: 5A PHY C2/2C4D: AA TAX C2/2C4E: B9 F9 1F LDA $1FF9,Y (get enemy number) C2/2C51: 99 80 33 STA $3380,Y (Store it in the name structure. $3380 is responsible for the listing of enemy names in battle. Whatever reads from that structure ensures there's no duplicates -- e.g. if there's 2 Leafers, "Leafer" is just displayed once. And if the code below didn't have bugs, 2 *different* Mag Roaders would yield only one "Mag Roader" display, as it works in FF6j.) C2/2C54: 7B TDC C2/2C55: A8 TAY (Y = 0) C2/2C56: BF 50 C0 CF LDA $CFC050,X (enemy names) C2/2C5A: 99 F8 00 STA $00F8,Y (store name in temporary string) C2/2C5D: E8 INX C2/2C5E: E8 INX C2/2C5F: C8 INY C2/2C60: C8 INY C2/2C61: C0 08 00 CPY #$0008 C2/2C64: 90 F0 BCC $2C56 (loop until 8 characters of name are read) C2/2C66: A0 12 00 LDY #$0012 (point to last enemy in battle) C2/2C69: B9 F9 1F LDA $1FF9,Y (get number of enemy) C2/2C6C: 30 28 BMI $2C96 (if 16-bit enemy number is negative, no enemy in slot, so skip it) C2/2C6E: 5A PHY C2/2C6F: 0A ASL C2/2C70: 0A ASL C2/2C71: 0A ASL C2/2C72: AA TAX (enemy # * 8) C2/2C73: 7B TDC C2/2C74: A8 TAY (Y = 0) C2/2C75: B9 F8 00 LDA $00F8,Y C2/2C78: DF 50 C0 CF CMP $CFC050,X (compare name in temporary string to name of loop enemy) C2/2C7C: 18 CLC C2/2C7D: D0 09 BNE $2C88 (if they're not equal, exit loop) C2/2C7F: E8 INX C2/2C80: E8 INX C2/2C81: C8 INY C2/2C82: C8 INY C2/2C83: C0 08 00 CPY #$0008 C2/2C86: 90 ED BCC $2C75 (compare all the 1st 8 characters of the names as long as they keep matching) C2/2C88: 7A PLY (Y points to in-battle index of loop enemy) C2/2C89: 90 0B BCC $2C96 (if we exited string comparison early, the names don't match, so branch) C2/2C8B: A3 01 LDA $01,S C2/2C8D: AA TAX (retrieve in-battle enemy index passed to function) C2/2C8E: B9 F9 1F LDA $1FF9,Y (number of loop enemy) C2/2C91: 9D 80 33 STA $3380,X (If the strings did match, store enemy # of loop enemy in the "name structure", at the position of the main enemy.) This way, all enemies with the same name are represented by the same enemy # in $3380. Whatever mechanism displays the $3380 structure must "detect" duplicate enemy numbers to avoid listing duplicate enemy names. Sadly, none of this works. Enemy names were 8 characters in FF6j according to Lord J, but 10 characters in FF3us, and this function was unchanged. This means differing enemies with the same name (like Mag Roader) will have duplicate listings. Also, you can make an enemy name be wrongly OMITTED thru clever renaming and grouping of enemies (try giving Enemy #0 and #4 the same name -- e.g. "gangster" -- and put Enemy #0 and #5 in a formation together) or really bad luck. A patch for this function has been released; see http://masterzed.cavesofnarshe.com/ ) C2/2C94: 80 07 BRA $2C9D (we had a match, so exit the crazy loop) C2/2C96: 88 DEY C2/2C97: 88 DEY C2/2C98: C0 08 00 CPY #$0008 C2/2C9B: B0 CC BCS $2C69 (loop and compare string to all enemies in battle) C2/2C9D: 7A PLY C2/2C9E: FA PLX C2/2C9F: 68 PLA C2/2CA0: 0A ASL C2/2CA1: 0A ASL C2/2CA2: AA TAX (X = enemy # * 4 * 8. Monster data block at $CF0000 is 32 bytes) C2/2CA3: BF 05 00 CF LDA $CF0005,X (bottom = Defense, top = Magic Defense) C2/2CA7: 99 B8 3B STA $3BB8,Y C2/2CAA: BF 0C 00 CF LDA $CF000C,X (XP) C2/2CAE: 99 84 3D STA $3D84,Y C2/2CB1: BF 0E 00 CF LDA $CF000E,X (GP) C2/2CB5: 99 98 3D STA $3D98,Y C2/2CB8: AD 46 3A LDA $3A46 C2/2CBB: 30 27 BMI $2CE4 (branch if there was an enemy formation # switch, and it designates that the new enemies retain HP and Max HP from the current formation.) C2/2CBD: BF 0A 00 CF LDA $CF000A,X (MP) C2/2CC1: 99 08 3C STA $3C08,Y C2/2CC4: 99 30 3C STA $3C30,Y C2/2CC7: BF 08 00 CF LDA $CF0008,X (HP) C2/2CCB: 99 F4 3B STA $3BF4,Y C2/2CCE: 99 1C 3C STA $3C1C,Y C2/2CD1: AD D4 3E LDA $3ED4 (Battle formation) C2/2CD4: C9 CF 01 CMP #$01CF C2/2CD7: D0 0B BNE $2CE4 (Branch if not Doom Gaze's formation) C2/2CD9: 8C FA 33 STY $33FA C2/2CDC: AD BE 3E LDA $3EBE (Doom Gaze's HP) C2/2CDF: F0 03 BEQ $2CE4 C2/2CE1: 99 F4 3B STA $3BF4,Y (Set current HP to Doom Gaze's HP) C2/2CE4: E2 21 SEP #$21 (Set 8-bit Accumulator) C2/2CE6: B9 1D 3C LDA $3C1D,Y (High byte of max HP) C2/2CE9: 4A LSR C2/2CEA: C9 19 CMP #$19 C2/2CEC: 90 02 BCC $2CF0 C2/2CEE: A9 17 LDA #$17 (Stamina = (Max HP / 512) + 16. If this number is greater than 40, then the monster's stamina is set to 40) C2/2CF0: 69 10 ADC #$10 C2/2CF2: 99 40 3B STA $3B40,Y (Stamina) C2/2CF5: BF 01 00 CF LDA $CF0001,X C2/2CF9: 99 68 3B STA $3B68,Y (Battle Power) C2/2CFC: BF 1A 00 CF LDA $CF001A,X C2/2D00: 99 A8 3C STA $3CA8,Y (Monster's regular weapon graphic) C2/2D03: BF 03 00 CF LDA $CF0003,X (Evade) C2/2D07: 20 61 28 JSR $2861 C2/2D0A: 99 54 3B STA $3B54,Y (255 - Evade * 2 + 1) C2/2D0D: BF 04 00 CF LDA $CF0004,X (MBlock) C2/2D11: 20 61 28 JSR $2861 C2/2D14: 99 55 3B STA $3B55,Y (255 - MBlock * 2 + 1) C2/2D17: BF 02 00 CF LDA $CF0002,X C2/2D1B: 99 7C 3B STA $3B7C,Y (Hit Rate) C2/2D1E: BF 10 00 CF LDA $CF0010,X C2/2D22: 99 18 3B STA $3B18,Y (Level) C2/2D25: BF 00 00 CF LDA $CF0000,X C2/2D29: 99 19 3B STA $3B19,Y (Speed) C2/2D2C: BF 07 00 CF LDA $CF0007,X (Magic Power) C2/2D30: 20 D6 47 JSR $47D6 (* 1.5) C2/2D33: 99 41 3B STA $3B41,Y (Magic Power) C2/2D36: BF 1E 00 CF LDA $CF001E,X (monster status byte 4?) C2/2D3A: 29 82 AND #$82 (only keep float and enemy runic?) C2/2D3C: 19 4C 3E ORA $3E4C,Y C2/2D3F: 99 4C 3E STA $3E4C,Y (turn them on in Retort/Runic/etc byte) C2/2D42: BF 13 00 CF LDA $CF0013,X C2/2D46: 99 80 3C STA $3C80,Y (Special Byte 2) C2/2D49: 20 C1 2D JSR $2DC1 (load enemy elemental reactions, statuses and status protection, metamorph info, special info like human/undead/etc) C2/2D4C: BE A8 33 LDX $33A8,Y C2/2D4F: BF C0 37 CF LDA $CF37C0,X (get Enemy Special Move graphic) C2/2D53: 99 81 3C STA $3C81,Y C2/2D56: E2 10 SEP #$10 C2/2D58: 20 99 2D JSR $2D99 (Carry will be set if the monster is present and has the "Attack First" attribute, clear otherwise) C2/2D5B: 7B TDC C2/2D5C: 6A ROR C2/2D5D: 04 B1 TSB $B1 (if Carry is set, turn on Bit 7 of $B1) C2/2D5F: 20 5A 4B JSR $4B5A C2/2D62: 29 07 AND #$07 (random number: 0-7) C2/2D64: 18 CLC C2/2D65: 69 38 ADC #$38 (add 56) C2/2D67: 99 2C 3B STA $3B2C,Y (save monster Vigor as a random number from 56 to 63) C2/2D6A: BB TYX C2/2D6B: 20 50 26 JSR $2650 (deal with Instant Death protection, and Poison elemental nullification giving immunity to Poison status) C2/2D6E: 28 PLP C2/2D6F: FA PLX C2/2D70: 60 RTS
C2/2D71 read command script at start of combat
Read command script at start of combat A = Monster number C2/2D71: DA PHX C2/2D72: 48 PHA C2/2D73: 08 PHP C2/2D74: C2 20 REP #$20 C2/2D76: 0A ASL C2/2D77: AA TAX C2/2D78: BF 00 84 CF LDA $CF8400,X (Monster command script pointers) C2/2D7C: 99 54 32 STA $3254,Y (Index into main command script) C2/2D7F: AA TAX C2/2D80: E2 20 SEP #$20 C2/2D82: 20 43 1A JSR $1A43 (Read command script, up through an FEh or FFh command) C2/2D85: 1A INC C2/2D86: D0 FA BNE $2D82 (If FFh wasn't the last thing read, we're not at end of main command script, so loop and read more) C2/2D88: BF 00 87 CF LDA $CF8700,X (Monster command scripts) C2/2D8C: 1A INC C2/2D8D: F0 06 BEQ $2D95 (if first byte of counterattack script is FFh, it's empty, so skip saving the index) C2/2D8F: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2D91: 8A TXA C2/2D92: 99 68 32 STA $3268,Y (Index into counterattack script) C2/2D95: 28 PLP C2/2D96: 68 PLA C2/2D97: FA PLX C2/2D98: 60 RTS
C2/2D99 unknow
C2/2D99: DA PHX C2/2D9A: BB TYX C2/2D9B: 20 A0 2D JSR $2DA0 C2/2D9E: FA PLX C2/2D9F: 60 RTS
C2/2DA0 handle "attack first" property for monsters
(Handle "Attack First" property for monster) (Also, returns Carry clear if Attack First unset, Carry set if it's set.) C2/2DA0: 18 CLC C2/2DA1: BD 80 3C LDA $3C80,X C2/2DA4: 89 02 BIT #$02 (is "Attack First" set in Misc/Special enemy byte?) C2/2DA6: F0 18 BEQ $2DC0 (if not, exit) C2/2DA8: BD A0 3A LDA $3AA0,X C2/2DAB: 89 01 BIT #$01 C2/2DAD: F0 11 BEQ $2DC0 (exit if enemy not present?) C2/2DAF: 09 08 ORA #$08 C2/2DB1: 9D A0 3A STA $3AA0,X C2/2DB4: 9E 19 32 STZ $3219,X (zero top byte of ATB Timer) C2/2DB7: A9 FF LDA #$FF C2/2DB9: 9D B5 3A STA $3AB5,X (max out top byte of enemy's Wait Timer, which means they'll spend essentially no time in the monster equivalent to a ready stance. normally, monsters do this by having a 0 "Time to Wait" in $322C, but since this function is doing things earlier and $322C is still FFh, we instead fill out the timer to meet the threshold.) C2/2DBC: 20 66 4E JSR $4E66 (put monster in the Wait to Attack queue) C2/2DBF: 38 SEC C2/2DC0: 60 RTS
C2/2DC1 unknow
C2/2DC1: 08 PHP C2/2DC2: BF 1F 00 CF LDA $CF001F,X (Special attack) C2/2DC6: 99 2D 32 STA $322D,Y C2/2DC9: BF 19 00 CF LDA $CF0019,X (elemental weaknesses) C2/2DCD: 19 E0 3B ORA $3BE0,Y C2/2DD0: 99 E0 3B STA $3BE0,Y C2/2DD3: BF 16 00 CF LDA $CF0016,X (blocked status byte 3) C2/2DD7: 49 FF EOR #$FF (invert it) C2/2DD9: 39 30 33 AND $3330,Y C2/2DDC: 99 30 33 STA $3330,Y C2/2DDF: A9 FF LDA #$FF C2/2DE1: 39 31 33 AND $3331,Y C2/2DE4: 99 31 33 STA $3331,Y C2/2DE7: C2 20 REP #$20 (Set 16-bit Accumulator) C2/2DE9: BF 1B 00 CF LDA $CF001B,X (monster status bytes 1-2) C2/2DED: 99 D4 3D STA $3DD4,Y (copy into "status to set" bytes) C2/2DF0: BF 1D 00 CF LDA $CF001D,X (get monster status bytes 3-4) C2/2DF4: 48 PHA C2/2DF5: 29 01 00 AND #$0001 C2/2DF8: 4A LSR C2/2DF9: 6A ROR C2/2DFA: 03 01 ORA $01,S (this moves Byte 3,Bit 0 into Byte 4,Bit 7 position) (it turns out "Dance" in B3,b0 is permanent float, while B4,b7 is a dispellable float) C2/2DFC: 29 FE 84 AND #$84FE (filter out character stats like dog and rage) (in byte 4, only Float and Life 3 are kept) C2/2DFF: 99 E8 3D STA $3DE8,Y (put in "status to set") C2/2E02: 68 PLA C2/2E03: EB XBA (now swap enemy status bytes 3<->4 within A) C2/2E04: 4A LSR C2/2E05: 90 09 BCC $2E10 (if byte4, bit 0 (aka "Rage") had not been set, branch) C2/2E07: B9 58 3C LDA $3C58,Y C2/2E0A: 09 40 00 ORA #$0040 (Set True Knight effect?) C2/2E0D: 99 58 3C STA $3C58,Y C2/2E10: BF 1C 00 CF LDA $CF001C,X (monster status bytes 2-3) C2/2E14: 19 6C 3C ORA $3C6C,Y (this makes a copy of ^, used in procs like c2/2675) C2/2E17: 99 6C 3C STA $3C6C,Y C2/2E1A: BF 14 00 CF LDA $CF0014,X (blocked status bytes 1-2) C2/2E1E: 49 FF FF EOR #$FFFF (invert 'em) C2/2E21: 39 1C 33 AND $331C,Y C2/2E24: 99 1C 33 STA $331C,Y C2/2E27: BF 17 00 CF LDA $CF0017,X (elements absorbed and nullified) C2/2E2B: 19 CC 3B ORA $3BCC,Y C2/2E2E: 99 CC 3B STA $3BCC,Y C2/2E31: BF 11 00 CF LDA $CF0011,X C2/2E35: 99 94 3C STA $3C94,Y ($3C94 = Metamorph info $3C95 = Special Byte 3: Dies at 0 MP, No name, Human, Auto critical if Imp, Undead) C2/2E38: 28 PLP C2/2E39: 60 RTS
C2/2E3A determine front, back, pincer or side attack
C2/2E3A: AD 6D 3A LDA $3A6D C2/2E3D: 4A LSR C2/2E3E: 4A LSR (Put Back Guard effect into Carry) C2/2E3F: AD 48 2F LDA $2F48 (Get extra enemy formation data, byte 0, top half, inverted) C2/2E42: 90 0C BCC $2E50 (Branch if no Back Guard) C2/2E44: 89 B0 BIT #$B0 (Are Side, Back, or Normal attacks allowed?) C2/2E46: F0 02 BEQ $2E4A (If only Pincer or nothing[??] allowed, branch) C2/2E48: 29 B0 AND #$B0 (Otherwise, disable Pincer) C2/2E4A: 89 D0 BIT #$D0 (Are Side, Pincer, or Normal attacks allowed?) C2/2E4C: F0 02 BEQ $2E50 (If only Back or nothing[??] allowed, branch) C2/2E4E: 29 D0 AND #$D0 (Otherwise, disable Back) C2/2E50: 48 PHA C2/2E51: AD 76 3A LDA $3A76 (Number of characters in party) C2/2E54: C9 03 CMP #$03 C2/2E56: 68 PLA C2/2E57: B0 06 BCS $2E5F (If 3 or more in party, branch) C2/2E59: 89 70 BIT #$70 (Are any of Normal, Back, or Pincer allowed?) C2/2E5B: F0 02 BEQ $2E5F (If only Side or nothing[??] allowed, branch) C2/2E5D: 29 70 AND #$70 (Otherwise, disable Side attack) C2/2E5F: A2 10 LDX #$10 C2/2E61: 20 47 52 JSR $5247 (Randomly choose attack type. If some fictional jackass masked them all, we enter an.. INFINITE LOOP!) C2/2E64: 8E 1F 20 STX $201F (Save encounter type: 0 = Front, 1 = Back, 2 = Pincer, 3 = Side) C2/2E67: 60 RTS
C2/2E68 unknow
C2/2E68: AE 1F 20 LDX $201F (get encounter type: 0 = front, 1 = back, 2 = pincer, 3 = side) C2/2E6B: E0 00 CPX #$00 C2/2E6D: F0 05 BEQ $2E74 (if front attack, branch) C2/2E6F: A9 01 LDA #$01 C2/2E71: 1C E4 11 TRB $11E4 C2/2E74: 8A TXA C2/2E75: 0A ASL C2/2E76: AA TAX (multiply encounter type by 2, so it acts as index into function pointers) C2/2E77: FC 93 2E JSR ($2E93,X) (Change rows for pincer and back, see if preemptive attack) C2/2E7A: A2 06 LDX #$06 C2/2E7C: DA PHX C2/2E7D: BD A1 3A LDA $3AA1,X C2/2E80: 29 20 AND #$20 (Check row) C2/2E82: 48 PHA C2/2E83: 8A TXA C2/2E84: 0A ASL C2/2E85: 0A ASL C2/2E86: 0A ASL C2/2E87: 0A ASL C2/2E88: AA TAX C2/2E89: 68 PLA C2/2E8A: 9D C5 2E STA $2EC5,X C2/2E8D: FA PLX C2/2E8E: CA DEX C2/2E8F: CA DEX C2/2E90: 10 EA BPL $2E7C C2/2E92: 60 RTS
C2/2E93 pointers: normal, back, pincer or side attack
(Pointers to functions that do stuff based on battle formation) C2/2E93: 9B 2E (Normal attack) C2/2E95: CE 2E (Back attack) C2/2E97: C1 2E (Pincer attack) C2/2E99: 9B 2E (Side attack)
C2/2E9B preemptive attack
(Determines if a battle is a preemptive attack) (Preemptive attack chance = 1 in 8 for normal attacks, 7 in 32 for side attacks) (Gale Hairpin doubles chance) C2/2E9B: A5 B1 LDA $B1 C2/2E9D: 30 21 BMI $2EC0 (Exit function if bit 7 of $B1 is set) C2/2E9F: AD 4B 2F LDA $2F4B (load formation data, byte 3) C2/2EA2: 89 04 BIT #$04 (is "hide starting messages" set?) C2/2EA4: D0 1A BNE $2EC0 (branch if so) C2/2EA6: 8A TXA (coming in, X is 0 or 6) C2/2EA7: 0A ASL C2/2EA8: 0A ASL C2/2EA9: 09 20 ORA #$20 C2/2EAB: 85 EE STA $EE ($EE = $201F * 8 + #$20. so pre-emptive rate is #$20 or #$38.) C2/2EAD: AD 6D 3A LDA $3A6D C2/2EB0: 4A LSR C2/2EB1: 90 02 BCC $2EB5 (Branch if no gale hairpin equipped) C2/2EB3: 06 EE ASL $EE (Double chance of preemptive attack) C2/2EB5: 20 5A 4B JSR $4B5A (random number 0 to 255) C2/2EB8: C5 EE CMP $EE (compare it against pre-emptive rate) C2/2EBA: B0 04 BCS $2EC0 (Branch if random number >= $EE, meaning no pre-emptive strike) C2/2EBC: A9 40 LDA #$40 C2/2EBE: 04 B0 TSB $B0 (Set preemptive attack) C2/2EC0: 60 RTS
C2/2E61 pincer attack
(Sets all characters to front row for pincer attacks) C2/2EC1: A2 06 LDX #$06 C2/2EC3: A9 DF LDA #$DF C2/2EC5: 20 43 0A JSR $0A43 (Sets character X to front row, by clearing Bit 5 of $3AA1,X) C2/2EC8: CA DEX C2/2EC9: CA DEX C2/2ECA: 10 F7 BPL $2EC3 (loop for all 4 characters) C2/2ECC: 80 0E BRA $2EDC
C2/2ECE back attacks
(Switches character's row placement for back attacks) C2/2ECE: A2 06 LDX #$06 C2/2ED0: BD A1 3A LDA $3AA1,X C2/2ED3: 49 20 EOR #$20 C2/2ED5: 9D A1 3A STA $3AA1,X (Toggle Row) C2/2ED8: CA DEX C2/2ED9: CA DEX C2/2EDA: 10 F4 BPL $2ED0 (loop for all 4 characters) C2/2EDC: A9 20 LDA #$20 C2/2EDE: 04 B1 TSB $B1 C2/2EE0: 60 RTS
C2/2EE1 unknow
C2/2EE1: 08 PHP C2/2EE2: C2 10 REP #$10 (Set 16-bit X and Y) C2/2EE4: AD 45 3F LDA $3F45 (get enemy presence byte from monster formation data) C2/2EE7: A2 0A 00 LDX #$000A C2/2EEA: 0A ASL C2/2EEB: 0A ASL (move 6 relevant bits into top of byte, as there's only 6 possible enemies) C2/2EEC: 9E A8 3A STZ $3AA8,X (mark enemy as absent to start) C2/2EEF: 0A ASL C2/2EF0: 3E A8 3A ROL $3AA8,X ($3AA8 = 1 for present enemy, 0 for absent) C2/2EF3: CA DEX C2/2EF4: CA DEX C2/2EF5: 10 F5 BPL $2EEC (loop for all 6 enemies) C2/2EF7: AD 52 3F LDA $3F52 (get boss switches byte of monster formation data) C2/2EFA: 0A ASL C2/2EFB: 0A ASL (move 6 relevant bits into top of byte) C2/2EFC: 85 EE STA $EE C2/2EFE: A2 05 00 LDX #$0005 C2/2F01: A0 12 00 LDY #$0012 (Y = onscreen index of enemy, should be between 8 and 18d) C2/2F04: 7B TDC C2/2F05: 0E 73 3A ASL $3A73 (prepare to set next bit for which monsters are in template/formation. this is initialized to 0 at C2/23F3.) C2/2F08: 06 EE ASL $EE (get boss bit for current enemy) C2/2F0A: 2A ROL C2/2F0B: EB XBA (save boss bit in top of A) C2/2F0C: AD 97 3A LDA $3A97 (colosseum related?? it's decremented elsewhere -- decremented from WHAT, i dunno -- if the enemy formation is >=574. 574 is "shadow at colosseum", and setting 575 with FF3usME plunges Terra into a Colosseum style battle with Guard.) C2/2F0F: 0A ASL C2/2F10: BD 46 3F LDA $3F46,X (get enemy number from monster formation data) C2/2F13: 90 05 BCC $2F1A (if top bit of $3A97 was unset, branch) C2/2F15: AD 06 02 LDA $0206 (some enemy number passed from somewhere else????? Bank C3 seems to use this address... probably passed by Colosseum setup) C2/2F18: 80 04 BRA $2F1E (the Colosseum only supports enemies 0-255, so branch immediately to check the boss bit, since we know any enemy # > 256 is unacceptable.) C2/2F1A: C9 FF CMP #$FF C2/2F1C: D0 04 BNE $2F22 (branch if bottom byte of enemy # isn't 255. if it is 255, it might be empty.) C2/2F1E: EB XBA C2/2F1F: D0 07 BNE $2F28 (if the boss bit is set, the enemy slot's empty, and we skip its stats. otherwise it's Pugs, and it's valid.) C2/2F21: EB XBA C2/2F22: 20 30 2C JSR $2C30 (load enemy name and stats) C2/2F25: EE 73 3A INC $3A73 (which monsters are in template/formation? turn on bit for the current enemy index.) C2/2F28: 88 DEY C2/2F29: 88 DEY C2/2F2A: CA DEX C2/2F2B: 10 D7 BPL $2F04 (loop for all 6 enemies) C2/2F2D: 28 PLP C2/2F2E: 60 RTS
C2/2F2F unknow
C2/2F2F: 08 PHP C2/2F30: C2 10 REP #$10 (Set 16-bit X & Y) C2/2F32: 64 FC STZ $FC C2/2F34: 64 B8 STZ $B8 C2/2F36: AD E0 3E LDA $3EE0 C2/2F39: D0 3A BNE $2F75 (branch if not in final 4-tier multi-battle? completely guessing here.) C2/2F3B: A2 00 00 LDX #$0000 (start looking at first character) C2/2F3E: A9 FF LDA #$FF c2/2F40: 9D D9 3E STA $3ED9,X C2/2F43: DD D8 3E CMP $3ED8,X (Which character it is) C2/2F46: D0 24 BNE $2F6C (if character # was actually defined, don't use the list to determine this character) C2/2F48: A0 00 00 LDY #$0000 C2/2F4B: B9 05 02 LDA $0205,Y (get some character index from preferred order list set pre-battle?) C2/2F4E: C9 FF CMP #$FF C2/2F50: F0 14 BEQ $2F66 (if no character in slot, skip to next one) C2/2F52: EB XBA C2/2F53: A9 FF LDA #$FF C2/2F55: 99 05 02 STA $0205,Y (null out the entry from the pre-chosen list) C2/2F58: A9 25 LDA #$25 C2/2F5A: 20 81 47 JSR $4781 (multiply by 37, size of character info block) C2/2F5D: A8 TAY C2/2F5E: B9 00 16 LDA $1600,Y (get actual character #) C2/2F61: 9D D8 3E STA $3ED8,X (save Which character it is) C2/2F64: 80 06 BRA $2F6C (we've found our party member, so exit loop, and move onto next party slot.) C2/2F66: C8 INY (check next character) C2/2F67: C0 0C 00 CPY #$000C C2/2F6A: 90 DF BNE $2F4B (loop for all 12 preferred character slots) C2/2F6C: E8 INX C2/2F6D: E8 INX C2/2F6E: E0 08 00 CPX #$0008 C2/2F71: 90 CB BCC $2F3E (loop for all 4 party members) C2/2F73: 80 64 BRA $2FD9 (since we're in the final battle, we know we're not in the Colosseum or on the Veldt, so skip those checks. also skip the party initialization loop at C2/2F8C.) C2/2F75: AE D4 3E LDX $3ED4 (Battle formation) C2/2F78: E0 3E 02 CPX #$023E (Shadow at Colosseum formation) C2/2F7B: 90 0F BCC $2F8C (if not ^ or Colosseum formation #575, branch) C2/2F7D: AD 08 02 LDA $0208 C2/2F80: 8D D8 3E STA $3ED8 (Set "Which Character this is" to our chosen combatant.) C2/2F83: A9 01 LDA #$01 C2/2F85: 04 B8 TSB $B8 C2/2F87: CE 97 3A DEC $3A97 (set $3A97 to FFh. future checks will look at Bit 7 to determine we're in the Colosseum.) C2/2F8A: 80 4D BRA $2FD9 (we're in the Colosseum using a single character to fight, so skip the party initialization loop.) C2/2F8C: A0 0F 00 LDY #$000F C2/2F8F: B9 50 18 LDA $1850,Y (get character roster information) (Bit 7: 1 = party leader, as set in non-overworld areas Bit 6: ?? Bit 5: row, 0 = front, 1 = back Bit 3-4: position in party, 0-3 Bit 0-2: which party in) C2/2F92: 85 FE STA $FE C2/2F94: 29 07 AND #$07 (isolate which party character is in. don't know why it takes 3 bits rather than 2.) C2/2F96: CD 6D 1A CMP $1A6D (compare to Which Party is Active) C2/2F99: D0 12 BNE $2FAD (branch if not equal) C2/2F9B: 5A PHY C2/2F9C: E6 FC INC $FC (increment count of characters in active party) C2/2F9E: 7B TDC C2/2F9F: A5 FE LDA $FE C2/2FA1: 29 18 AND #$18 (isolate the position of character in party) C2/2FA3: 4A LSR C2/2FA4: 4A LSR C2/2FA5: AA TAX (convert to a 0,2,4,6 index) C2/2FA6: 20 DC 30 JSR $30DC C2/2FA9: 9D D8 3E STA $3ED8,X (save "which character it is") C2/2FAC: 7A PLY C2/2FAD: 88 DEY C2/2FAE: 10 DF BPL $2F8F C2/2FB0: AD DF 1E LDA $1EDF C2/2FB3: 89 08 BIT #$08 (is Gau enlisted and not Leapt?) C2/2FB5: D0 0C BNE $2FC3 (branch if so) C2/2FB7: AD 4B 3F LDA $3F4B (get monster index of enemy #6 in formation) C2/2FBA: 1A INC C2/2FBB: D0 06 BNE $2FC3 (branch if an enemy is in the slot. thankfully, there's no formation with Pugs [enemy #255] in Slot #6, as this code makes no distinction between that and a nonexistent enemy. one problem i noticed is that if you're in a Veldt battle where Gau's destined to return, the 6th Pugs will often be untargetable.) C2/2FBD: A5 FC LDA $FC (# of characters in party?) C2/2FBF: C9 04 CMP #$04 C2/2FC1: 90 05 BCC $2FC8 (branch if less than 4) C2/2FC3: A9 01 LDA #$01 C2/2FC5: 1C E4 11 TRB $11E4 (clear Gau as being leapt and available to return on Veldt) C2/2FC8: A9 01 LDA #$01 C2/2FCA: 2C E4 11 BIT $11E4 (set when fighting on Veldt, Gau is Leapt, and he's available to return.) C2/2FCD: F0 0A BEQ $2FD9 (branch if unset) C2/2FCF: A9 0A LDA #$0A C2/2FD1: 8D 4A 2F STA $2F4A (extra enemy formation data, byte 2. store special event.) C2/2FD4: A9 80 LDA #$80 C2/2FD6: 0C 49 2F TSB $2F49 (extra enemy formation data, byte 1: activate special event) C2/2FD9: AD 49 2F LDA $2F49 C2/2FDC: 10 6C BPL $304A (if no special event active, branch) C2/2FDE: AD 4A 2F LDA $2F4A C2/2FE1: EB XBA C2/2FE2: A9 18 LDA #$18 C2/2FE4: 20 81 47 JSR $4781 (multiply by 24 bytes for some structure) C2/2FE7: AA TAX C2/2FE8: BF 00 FD D0 LDA $D0FD00,X C2/2FEC: 10 0C BPL $2FFA C2/2FEE: A0 06 00 LDY #$0006 C2/2FF1: A9 LDA #$FF C2/2FF3: 99 D8 3E STA $3ED8,Y (store null in Which Character it is) C2/2FF6: 88 DEY C2/2FF7: 88 DEY C2/2FF8: 10 F7 BPL $2FF1 (loop for all 4 characters) C2/2FFA: A0 04 00 LDY #$0004 C2/2FFD: 5A PHY C2/2FFE: BF 04 FD D0 LDA $D0FD04,X (character we want to replace?) C2/3002: C9 FF CMP #$FF C2/3004: F0 3B BEQ $3041 (branch if undefined) C2/3006: 29 3F AND #$3F (isolate character to replace in bottom 6 bits) C2/3008: A0 06 00 LDY #$0006 C2/300B: D9 D8 3E CMP $3ED8,Y (Which character it is) C2/300E: F0 13 BEQ $3023 (if one of characters in party matches desired character to replace, branch and exit loop) C2/3010: 88 DEY C2/3011: 88 DEY C2/3012: 10 F7 BPL $300B (loop through all 4 party members) C2/3014: C8 INY C2/3015: C8 INY C2/3016: B9 D8 3E LDA $3ED8,Y (Which character it is) C2/3019: 1A INC C2/301A: F0 07 BEQ $3023 (if the current character is null, branch and exit loop) C2/301C: C0 06 00 CPY #$0006 C2/301F: 90 F3 BCC $3014 (loop through all 4 characters in party) C2/3021: 80 1E BRA $3041 (we couldn't find the desired character to replace, nor a null slot, so skip to next entry in the battle event data.) C2/3023: B9 18 30 LDA $3018,Y C2/3026: 04 B8 TSB $B8 C2/3028: C2 20 REP #$20 (Set 16-bit Accumulator) C2/302A: BF 04 FD D0 LDA $D0FD04,X C2/302E: 99 D8 3E STA $3ED8,Y C2/3031: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/3033: A9 01 LDA #$01 (top byte of monster # is always 1) C2/3035: EB XBA C2/3036: BF 06 FD D0 LDA $D0FD06,X (get bottom byte of monster # from battle event data) C2/303A: C9 FF CMP #$FF (is our monster # 511, meaning it's null?) C2/303C: F0 03 BEQ $3041 (branch if so) C2/303E: 20 71 2D JSR $2D71 (read command script at start of combat. A = monster num) C2/3041: 7A PLY C2/3042: E8 INX C2/3043: E8 INX C2/3044: E8 INX C2/3045: E8 INX C2/3046: E8 INX C2/3047: 88 DEY C2/3048: D0 B3 BNE $2FFD C2/304A: A2 06 00 LDX #$0006 C2/304D: BD D8 3E LDA $3ED8,X (which character it is) C2/3050: C9 FF CMP #FF C2/3052: F0 7F BEQ $30D3 (If monster) C2/3054: 0A ASL (check bit 7 of which character it is) C2/3055: B0 03 BCS $305A (if set, branch) C2/3057: FE A0 3A INC $3AA0,X (mark character as onscreen?) C2/305A: 0A ASL (check bit 6 of which character it is) C2/305B: 90 08 BCC $3065 (if unset, branch) C2/305D: 48 PHA (save shifted "Which Character" byte) C2/305E: BD 18 30 LDA $3018,X C2/3061: 0C 40 3A TSB $3A40 C2/3064: 68 PLA C2/3065: 4A LSR C2/3066: 4A LSR (original Which Character byte, except top 2 bits are zeroed) C2/3067: 9D D8 3E STA $3ED8,X C2/306A: A0 0F 00 LDY #$000F C2/306D: 5A PHY (save loop variable) C2/306E: 48 PHA (save Which Character) C2/306F: B9 50 18 LDA $1850,Y C2/3072: 29 20 AND #$20 (Isolate character row. clear if Front, set if Back.) C2/3074: 85 FE STA $FE C2/3076: 20 DC 30 JSR $30DC (get actual character #?) C2/3079: C3 01 CMP $01,S C2/307B: D0 51 BNE $30CE (skip character if their "actual #" doesn't match value of Which Character byte) C2/307D: DA PHX (save 0,2,4,6 index of character?) C2/307E: 48 PHA (save actual # of character?) C2/307F: A5 FE LDA $FE C2/3081: 9D A1 3A STA $3AA1,X (save character row in Special Properties) C2/3084: BD D9 3E LDA $3ED9,X (s/b FFh provided $3EE0 wasn't set) C2/3087: 48 PHA C2/3088: A3 06 LDA $06,S (retrieve loop variable of 0 to 0F?) C2/308A: 9D D9 3E STA $3ED9,X C2/308D: 7B TDC C2/308E: 8A TXA (put onscreen character index in A) C2/308F: 0A ASL C2/3090: 0A ASL C2/3091: 0A ASL C2/3092: 0A ASL C2/3093: AA TAX C2/3094: 68 PLA C2/3095: C9 FF CMP #$FF C2/3097: D0 03 BNE $309C C2/3099: B9 01 16 LDA $1601,Y C2/309C: 9D AE 2E STA $2EAE,X C2/309F: 7B TDC C2/30A0: 68 PLA (retrieve actual ID of character?) C2/30A1: 9D C6 2E STA $2EC6,X C2/30A4: C9 0E CMP #$0E C2/30A6: C2 20 REP #$20 (Set 16-bit Accumulator) C2/30A8: 48 PHA (save actual ID of character?) C2/30A9: B9 02 16 LDA $1602,Y (1st two letters of character's name) C2/30AC: 9D AF 2E STA $2EAF,X C2/30AF: B9 04 16 LDA $1604,Y (middle two letters of character's name) C2/30B2: 9D B1 2E STA $2EB1,X C2/30B5: B9 06 16 LDA $1606,Y (last two letters of character's name) C2/30B8: 9D B3 2E STA $2EB3,X C2/30BB: FA PLX (get actual ID of character?) C2/30BC: B0 06 BCS $30C4 (if character # is >= 0Eh [Banon], then don't bother marking them for purposes of what can be equipped on whom) C2/30BE: 7B TDC (Clear Accumulator) C2/30BF: 38 SEC (set carry flag) C2/30C0: 2A ROL (move up a bit, starting with bottom) C2/30C1: CA DEX C2/30C2: 10 FC BPL $30C0 (move bit into position determined by actual # of character. so for Character #3, only Bit #3 is on) (the following is still executed for Banon and up. seemingly, jibberish [the last 2 characters of the character name] is stored in that character's equippable items byte. i'm not sure why this is done, but the game does have a property on these characters that prevents you from equipping all sorts of random crap via the Item menu in battle.) C2/30C4: FA PLX (get onscreen 0,2,4,6 index of character) C2/30C5: 9D 20 3A STA $3A20,X (related to what characters item can be equipped on. should only be our basic 14) C2/30C8: 98 TYA C2/30C9: 9D 10 30 STA $3010,X (save offset of character info block) C2/30CC: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/30CE: 68 PLA (retrieve Which Character byte) C2/30CF: 7A PLY (retrieve loop index) C2/30D0: 88 DEY C2/30D1: 10 9A BPL $306D (loop for all 16 character info blocks) C2/30D3: CA DEX C2/30D4: CA DEX C2/30D5: 30 03 BMI $30DA C2/30D7: 4C 4D 30 JMP $304D (loop for all 4 characters) C2/30DA: 28 PLP C2/30DB: 60 RTS