If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working at any time.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
Final Fantasy VI/ROM map/Assembly C20
< Final Fantasy VI | ROM map
Jump to navigation
Jump to search
This is a sub-page of Final Fantasy VI/ROM map.
C2/0000 unknow
C2/0000: 4C 0C 00 JMP $000C C2/0003: 4C 1B 11 JMP $111B C2/0006: 4C 77 0E JMP $0E77 C2/0009: 4C 30 47 JMP $4730
C2/000C unknow
C2/000C: 08 PHP
C2/000D: E2 30 SEP #$30
C2/000F: A9 7E LDA #$7E
C2/0011: 48 PHA
C2/0012: AB PLB
C2/0013: 20 1E 26 JSR $261E
C2/0016: 20 ED 23 JSR $23ED
C2/0019: E6 BE INC $BE (increment RNG table index)
C2/001B: AD 02 34 LDA $3402 (Get the number of turns due to Quick)
C2/001E: D0 03 BNE $0023 (Branch if not zero; either we are in a regular (i.e. non-Quick)
turn, or else we are in the process of executing Quick turns.
Only if the final Quick turn just passed will we do the next line.
Either way, we still need to decrement the number of Quick turns.)
C2/0020: CE 02 34 DEC $3402 (Decrement the number of turns due to Quick)
C2/0023: A9 01 LDA #$01
C2/0025: 20 11 64 JSR $6411
C2/0028: 20 95 20 JSR $2095
C2/002B: AD 58 3A LDA $3A58 (was anybody's main menu flagged to be redrawn right away?)
C2/002E: F0 03 BEQ $0033 (branch if not)
C2/0030: 20 CC 00 JSR $00CC (redraw the applicable menus)
C2/0033: AD 0A 34 LDA $340A
C2/0036: C9 FF CMP #$FF
C2/0038: F0 03 BEQ $003D
C2/003A: 4C 63 21 JMP $2163
C2/003D: A9 04 LDA #$04
C2/003F: 1C 46 3A TRB $3A46
C2/0042: F0 05 BEQ $0049
C2/0044: 20 91 0A JSR $0A91
C2/0047: 80 D0 BRA $0019
C2/0049: AE 07 34 LDX $3407
C2/004C: 10 11 BPL $005F
C2/004E: AE 68 3A LDX $3A68
C2/0051: EC 69 3A CPX $3A69
C2/0054: F0 0C BEQ $0062
C2/0056: EE 68 3A INC $3A68
C2/0059: BD 20 39 LDA $3920,X
C2/005C: 30 F0 BMI $004E
C2/005E: AA TAX
C2/005F: 4C 7B 4B JMP $4B7B
C2/0062: AD 3A 3A LDA $3A3A
C2/0065: 2D 2F 2F AND $2F2F
C2/0068: F0 05 BEQ $006F
C2/006A: 1C 2F 2F TRB $2F2F
C2/006D: 80 AA BRA $0019
C2/006F: A9 20 LDA #$20
C2/0071: 14 B0 TRB $B0
C2/0073: F0 08 BEQ $007D
C2/0075: 20 73 5C JSR $5C73
C2/0078: A9 06 LDA #$06
C2/007A: 20 11 64 JSR $6411
C2/007D: A9 04 LDA #$04
C2/007F: 14 B0 TRB $B0
C2/0081: 20 ED 47 JSR $47ED
C2/0084: A9 FF LDA #$FF
C2/0086: A2 03 LDX #$03
C2/0088: 9D FC 33 STA $33FC,X
C2/008B: CA DEX
C2/008C: 10 FA BPL $0088
C2/008E: A9 01 LDA #$01
C2/0090: 14 B1 TRB $B1
C2/0092: AE 64 3A LDX $3A64 (get position of next Wait Queue slot to read)
C2/0095: EC 65 3A CPX $3A65 (does it match position of the next available [unused]
queue slot? iow, have we read through the end of queue?)
C2/0098: F0 0C BEQ $00A6 (if so, branch)
C2/009A: EE 64 3A INC $3A64 (increment next Wait Queue position)
C2/009D: BD 20 37 LDA $3720,X (see who's in line at current position)
C2/00A0: 30 F0 BMI $0092 (if it's null entry, skip it and check next one)
C2/00A2: AA TAX
C2/00A3: 4C 88 21 JMP $2188
C2/00A6: AE 06 34 LDX $3406
C2/00A9: 10 17 BPL $00C2
C2/00AB: AE 66 3A LDX $3A66 (get position of next Action Queue slot to read)
C2/00AE: EC 67 3A CPX $3A67 (does it match position of the next available [unused]
queue slot? iow, have we read through the end of queue?)
C2/00B1: D0 06 BNE $00B9 (if not, branch)
C2/00B3: 9C 95 3A STZ $3A95
C2/00B6: 4C 19 00 JMP $0019
C2/00B9: EE 66 3A INC $3A66 (increment next Action Queue position)
C2/00BC: BD 20 38 LDA $3820,X (see who's in line at current position)
C2/00BF: 30 EA BMI $00AB (if it's null entry, which can happen from Palidor
and who knows what else, skip it and check next one)
C2/00C1: AA TAX
C2/00C2: 4C F9 00 JMP $00F9
C2/00C5: A9 09 LDA #$09
C2/00C7: 20 11 64 JSR $6411
C2/00CA: 28 PLP
C2/00CB: 6B RTL
(Will keep grayed versus white commands up-to-date.)
C2/00CC: A2 06 LDX #$06
C2/00CE: BD 18 30 LDA $3018,X
C2/00D1: 1C 58 3A TRB $3A58 (clear flag to redraw this character's menu
[note that switching between characters with
X and Y will still redraw])
C2/00D4: F0 09 BEQ $00DF (branch if it hadn't been set)
C2/00D6: 86 10 STX $10
C2/00D8: 46 10 LSR $10
C2/00DA: A9 0B LDA #$0B
C2/00DC: 20 11 64 JSR $6411 (this must be responsible for the menu redrawing)
C2/00DF: CA DEX
C2/00E0: CA DEX
C2/00E1: 10 EB BPL $00CE (loop for all 4 party members)
C2/00E3: 60 RTS
C2/00E4 unknow
C2/00E4: 0C 2C 3F TSB $3F2C (set "Jumping" flag for whomever is held in A) C2/00E7: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/00E9: BD A0 3A LDA $3AA0,X C2/00EC: 09 08 ORA #$08 C2/00EE: 29 DF AND #$DF C2/00F0: 9D A0 3A STA $3AA0,X ($3AA0: turn on bit 3 and turn off bit 5) C2/00F3: 9E B5 3A STZ $3AB5,X C2/00F6: 4C 66 4E JMP $4E66
C2/00F9 unknow
C2/00F9: 38 SEC
C2/00FA: 6E 06 34 ROR $3406 (set top bit of $3406)
C2/00FD: F4 18 00 PEA $0018
C2/0100: A9 12 LDA #$12
C2/0102: 85 B5 STA $B5
C2/0104: 8D 7C 3A STA $3A7C
C2/0107: BD CC 32 LDA $32CC,X
C2/010A: 30 77 BMI $0183
C2/010C: 0A ASL
C2/010D: A8 TAY
C2/010E: B9 20 34 LDA $3420,Y
C2/0111: C9 12 CMP #$12
C2/0113: D0 03 BNE $0118 (Branch if not Mimic)
C2/0115: 20 D9 01 JSR $01D9
C2/0118: 38 SEC
C2/0119: 20 76 02 JSR $0276
C2/011C: C9 1F CMP #$1F (is the command Counterattack?)
C2/011E: D0 1E BNE $013E (branch if not)
C2/0120: 20 01 03 JSR $0301
C2/0123: AD 97 3A LDA $3A97
C2/0126: D0 0C BNE $0134 (branch if in the Colosseum)
C2/0128: BD 95 33 LDA $3395,X
C2/012B: 10 07 BPL $0134 (branch if the monster is Charmed)
C2/012D: BD E5 3E LDA $3EE5,X
C2/0130: 89 30 BIT #$30
C2/0132: F0 05 BEQ $0139 (Branch if not Berserk or Muddled)
C2/0134: 20 34 06 JSR $0634 (Picks random command for monsters)
C2/0137: 80 C7 BRA $0100
C2/0139: 20 DC 02 JSR $02DC (Pick command for monster)
C2/013C: 80 C2 BRA $0100
C2/013E: C9 16 CMP #$16 (is the command Jump?)
C2/0140: D0 0C BNE $014E (branch if not)
C2/0142: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0144: BD 18 30 LDA $3018,X
C2/0147: 1C 2C 3F TRB $3F2C (clear the monster's "Jumping" flag)
C2/014A: F0 98 BEQ $00E4 (if it hadn't been set, we're currently initiating a
jump rather than landing from one, so go set the
flag and do some other preparation.)
C2/014C: E2 20 SEP #$20
C2/014E: BD CC 32 LDA $32CC,X
C2/0151: A8 TAY
C2/0152: B9 84 31 LDA $3184,Y
C2/0155: DD CC 32 CMP $32CC,X
C2/0158: D0 13 BNE $016D
C2/015A: A9 80 LDA #$80
C2/015C: 14 B1 TRB $B1
C2/015E: A9 FF LDA #$FF
C2/0160: EC 04 34 CPX $3404 (Is this target under the influence of Quick?)
C2/0163: D0 08 BNE $016D (Branch if not)
C2/0165: CE 02 34 DEC $3402 (Decrement the number of turns due to Quick)
C2/0168: D0 03 BNE $016D (Branch if this was not the last Quick turn)
C2/016A: 8D 04 34 STA $3404 (If it was, store an #$FF (empty) in Quick's target byte)
C2/016D: EB XBA
C2/016E: BD A0 3A LDA $3AA0,X
C2/0171: 89 50 BIT #$50
C2/0173: F0 05 BEQ $017A (branch if bits 4 and 6 both unset)
C2/0175: A9 80 LDA #$80
C2/0177: 4C AB 5B JMP $5BAB (set bit 7 of $3AA1,X)
C2/017A: A9 FF LDA #$FF
C2/017C: 99 84 31 STA $3184,Y
C2/017F: EB XBA
C2/0180: 9D CC 32 STA $32CC,X
C2/0183: BD A0 3A LDA $3AA0,X
C2/0186: 29 D7 AND #$D7
C2/0188: 09 40 ORA #$40
C2/018A: 9D A0 3A STA $3AA0,X (turn off bits 3 and 5. turn on bit 6.)
C2/018D: 4A LSR
C2/018E: 90 16 BCC $01A6
C2/0190: BD 04 32 LDA $3204,X
C2/0193: 09 04 ORA #$04
C2/0195: 9D 04 32 STA $3204,X
C2/0198: BD 05 32 LDA $3205,X
C2/019B: 09 80 ORA #$80
C2/019D: 9D 05 32 STA $3205,X
C2/01A0: 20 D3 13 JSR $13D3
C2/01A3: 20 1E 02 JSR $021E
C2/01A6: A9 A0 LDA #$A0
C2/01A8: 04 B0 TSB $B0
C2/01AA: A9 10 LDA #$10
C2/01AC: 1C 46 3A TRB $3A46
C2/01AF: D0 06 BNE $01B7
C2/01B1: BD CC 32 LDA $32CC,X
C2/01B4: 1A INC
C2/01B5: D0 1E BNE $01D5
C2/01B7: BD A0 3A LDA $3AA0,X
C2/01BA: 89 08 BIT #$08
C2/01BC: D0 08 BNE $01C6
C2/01BE: FE 19 32 INC $3219,X
C2/01C1: D0 03 BNE $01C6
C2/01C3: DE 19 32 DEC $3219,X
C2/01C6: A9 FF LDA #$FF
C2/01C8: 9D 2C 32 STA $322C,X
C2/01CB: 9E B5 3A STZ $3AB5,X
C2/01CE: A9 80 LDA #$80
C2/01D0: 14 B0 TRB $B0
C2/01D2: 4C 67 02 JMP $0267
C2/01D5: 8E 06 34 STX $3406 C2/01D8: 60 RTS
C2/01D9: AD 28 3F LDA $3F28 (16h if last character command was Jump,12h if it's a different command) C2/01DC: C9 16 CMP #$16 C2/01DE: D0 11 BNE $01F1 (branch if not Jump) C2/01E0: C2 20 REP #$20 C2/01E2: AD 28 3F LDA $3F28 C2/01E5: 99 20 34 STA $3420,Y C2/01E8: AD 2A 3F LDA $3F2A C2/01EB: 99 20 35 STA $3520,Y C2/01EE: E2 20 SEP #$20 C2/01F0: 60 RTS
C2/01F1 unknow
C2/01F1: C2 20 REP #$20 C2/01F3: AD 20 3F LDA $3F20 C2/01F6: 99 20 34 STA $3420,Y C2/01F9: AD 22 3F LDA $3F22 C2/01FC: 99 20 35 STA $3520,Y C2/01FF: E2 20 SEP #$20 C2/0201: AD 24 3F LDA $3F24 C2/0204: C9 12 CMP #$12 C2/0206: F0 D0 BEQ $01D8 C2/0208: C2 20 REP #$20 C2/020A: AD 24 3F LDA $3F24 C2/020D: 8D 7A 3A STA $3A7A C2/0210: AD 26 3F LDA $3F26 C2/0213: 85 B8 STA $B8 C2/0215: E2 20 SEP #$20 C2/0217: A9 40 LDA #$40 C2/0219: 04 B1 TSB $B1 C2/021B: 4C CB 4E JMP $4ECB
C2/021E save last attack to be used by mimic command
C2/021E: DA PHX C2/021F: 08 PHP C2/0220: E0 08 CPX #$08 C2/0222: B0 40 BCS $0264 (branch if it's a monster taking this turn) C2/0224: AD 7C 3A LDA $3A7C C2/0227: C9 1E CMP #$1E C2/0229: B0 39 BCS $0264 (branch if not a normal character command. iow, Roulette or a counterattack) C2/022B: 0A ASL C2/022C: AA TAX C2/022D: BF 00 FE CF LDA $CFFE00,X (get command data) C2/0231: 89 02 BIT #$02 C2/0233: F0 2F BEQ $0264 (branch if this command can't be Mimicked) C2/0235: A9 12 LDA #$12 C2/0237: 8D 28 3F STA $3F28 (indicate to Mimic that the command is something other than Jump?) C2/023A: AD 7C 3A LDA $3A7C C2/023D: C9 17 CMP #$17 C2/023F: F0 15 BEQ $0256 (branch if command is X-Magic) C2/0241: A9 12 LDA #$12 C2/0243: 8D 24 3F STA $3F24 (Last attack (second attack w/ Gem Box) (for use by Mimic). C2/0246: C2 20 REP #$20 C2/0248: AD 7C 3A LDA $3A7C C2/024B: 8D 20 3F STA $3F20 (Last attack (for use by Mimic)) C2/024E: AD 30 3A LDA $3A30 C2/0251: 8D 22 3F STA $3F22 (Last targets (for use by Mimic)) C2/0254: 80 0E BRA $0264 C2/0256: C2 20 REP #$20 C2/0258: AD 7C 3A LDA $3A7C C2/025B: 8D 24 3F STA $3F24 (Last attack (second attack w/ Gem Box) (for use by Mimic)) C2/025E: AD 30 3A LDA $3A30 C2/0261: 8D 26 3F STA $3F26 (Last targets (second attack w/ Gem Box) (for use by Mimic)) C2/0264: 28 PLP C2/0265: FA PLX C2/0266: 60 RTS
C2/0267 unknow
C2/0267: A9 0D LDA #$0D C2/0269: 8D 6E 2D STA $2D6E C2/026C: A9 FF LDA #$FF C2/026E: 8D 72 2D STA $2D72 C2/0271: A9 04 LDA #$04 C2/0273: 4C 11 64 JMP $6411
C2/0276 unknow
C2/0276: 08 PHP C2/0277: C2 20 REP #$20 (Set 16-bit Accumulator) C2/0279: B9 20 35 LDA $3520,Y C2/027C: 85 B8 STA $B8 C2/027E: B9 20 34 LDA $3420,Y C2/0281: 8D 7C 3A STA $3A7C C2/0284: 85 B5 STA $B5 C2/0286: 28 PLP C2/0287: 48 PHA C2/0288: 90 10 BCC $029A C2/028A: C9 1D CMP #$1D C2/028C: B0 0C BCS $029A (Branch if command is MagiTek or a non-character command?) C2/028E: BD 18 30 LDA $3018,X C2/0291: 1C 4A 3A TRB $3A4A C2/0294: F0 04 BEQ $029A C2/0296: 64 B8 STZ $B8 C2/0298: 64 B9 STZ $B9 C2/029A: B9 20 36 LDA $3620,Y C2/029D: 8D 4C 3A STA $3A4C (save actual MP cost to caster) C2/02A0: BD E4 3E LDA $3EE4,X C2/02A3: 89 20 BIT #$20 (Check for Imp Status) C2/02A5: F0 33 BEQ $02DA (If not imp) C2/02A7: A5 B5 LDA $B5 (get command) C2/02A9: C9 1E CMP #$1E C2/02AB: B0 2D BCS $02DA (branch if not character command) C2/02AD: DA PHX C2/02AE: 0A ASL C2/02AF: AA TAX C2/02B0: BF 00 FE CF LDA $CFFE00,X (get command data) C2/02B4: FA PLX C2/02B5: 89 04 BIT #$04 C2/02B7: D0 21 BNE $02DA (branch if command is supported while Imped) C2/02B9: 9C 4C 3A STZ $3A4C (zero actual MP cost to caster) C2/02BC: DA PHX C2/02BD: 7B TDC (clear 16-bit A) C2/02BE: E0 08 CPX #$08 (set Carry if monster attacker) C2/02C0: 2A ROL C2/02C1: AA TAX (move Carry into X) C2/02C2: B5 B8 LDA $B8,X (get targets from $B8 or $B9) C2/02C4: 3D 40 3A AND $3A40,X (characters acting as enemies) C2/02C7: 95 B8 STA $B8,X (remove all targets who weren't members of opposition) C2/02C9: C2 20 REP #$20 C2/02CB: 9C 7C 3A STZ $3A7C C2/02CE: 64 B5 STZ $B5 (zero out command, making it Fight?) C2/02D0: A5 B8 LDA $B8 (get all targets of attack) C2/02D2: 20 2A 52 JSR $522A (pick one at random) C2/02D5: 85 B8 STA $B8 C2/02D7: E2 20 SEP #$20 C2/02D9: FA PLX C2/02DA: 68 PLA C2/02DB: 60 RTS
C2/02DC unknow
C2/02DC: C2 20 REP #$20 C2/02DE: 9C 98 3A STZ $3A98 C2/02E1: BD 54 32 LDA $3254,X C2/02E4: 85 F0 STA $F0 C2/02E6: BD 0C 3D LDA $3D0C,X C2/02E9: 85 F2 STA $F2 C2/02EB: BD 40 32 LDA $3240,X C2/02EE: 85 F4 STA $F4 C2/02F0: 18 CLC C2/02F1: 20 2F 1A JSR $1A2F C2/02F4: A5 F2 LDA $F2 C2/02F6: 9D 0C 3D STA $3D0C,X C2/02F9: E2 20 SEP #$20 C2/02FB: A5 F5 LDA $F5 C2/02FD: 9D 40 32 STA $3240,X C2/0300: 60 RTS
C2/0301 unknow
C2/0301: BD CC 32 LDA $32CC,X C2/0304: 30 15 BMI $031B C2/0306: 5A PHY C2/0307: A8 TAY C2/0308: B9 84 31 LDA $3184,Y C2/030B: DD CC 32 CMP $32CC,X C2/030E: D0 02 BNE $0312 C2/0310: A9 FF LDA #$FF C2/0312: 9D CC 32 STA $32CC,X C2/0315: A9 FF LDA #$FF C2/0317: 99 84 31 STA $3184,Y C2/031A: 7A PLY C2/031B: 60 RTS
C2/031C unknow
C2/031C: 64 B8 STZ $B8 C2/031E: 64 B9 STZ $B9 C2/0320: FE 2C 32 INC $322C,X C2/0323: F0 03 BEQ $0328 C2/0325: DE 2C 32 DEC $322C,X (if Time to Wait is FFh, set it 0) C2/0328: 20 41 0A JSR $0A41 C2/032B: BD 4C 3E LDA $3E4C,X C2/032E: 29 FA AND #$FA C2/0330: 9D 4C 3E STA $3E4C,X (Clear Retort and Runic) C2/0333: E0 08 CPX #$08 C2/0335: 90 0D BCC $0344 (branch if character) C2/0337: BD CC 32 LDA $32CC,X C2/033A: 10 1B BPL $0357 C2/033C: A9 1F LDA #$1F C2/033E: 8D 7A 3A STA $3A7A C2/0341: 4C CB 4E JMP $4ECB
C2/0344 unknow
C2/0344: BD 18 30 LDA $3018,X C2/0347: 1C 4A 3A TRB $3A4A C2/034A: BD 55 32 LDA $3255,X C2/034D: 30 03 BMI $0352 C2/034F: 4C DC 02 JMP $02DC
C2/0352 unknow
C2/0352: BD CC 32 LDA $32CC,X C2/0355: 30 24 BMI $037B C2/0357: 48 PHA C2/0358: 0A ASL C2/0359: A8 TAY C2/035A: C2 20 REP #$20 C2/035C: B9 20 35 LDA $3520,Y C2/035F: 85 B8 STA $B8 C2/0361: B9 20 34 LDA $3420,Y C2/0364: 20 E4 03 JSR $03E4 C2/0367: A5 B8 LDA $B8 C2/0369: 99 20 35 STA $3520,Y C2/036C: E2 20 SEP #$20 C2/036E: 68 PLA C2/036F: A8 TAY C2/0370: D9 84 31 CMP $3184,Y C2/0373: F0 05 BEQ $037A C2/0375: B9 84 31 LDA $3184,Y C2/0378: 80 DD BRA $0357 C2/037A: 60 RTS
C2/037B unknow
C2/037B: BD F8 3E LDA $3EF8,X C2/037E: 4A LSR C2/037F: B0 56 BCS $03D7 (Branch if Dance status) C2/0381: BD F9 3E LDA $3EF9,X C2/0384: 4A LSR C2/0385: B0 47 BCS $03CE (Branch if Rage status) C2/0387: BD E4 3E LDA $3EE4,X C2/038A: 89 08 BIT #$08 C2/038C: D0 38 BNE $03C6 (Branch if M-Tek Status) C2/038E: 20 20 04 JSR $0420 C2/0391: C9 17 CMP #$17 C2/0393: D0 1B BNE $03B0 (Branch if not X-Magic) C2/0395: 48 PHA C2/0396: EB XBA C2/0397: 48 PHA C2/0398: 48 PHA C2/0399: 9B TXY C2/039A: 20 1A 05 JSR $051A (Pick another spell) C2/039D: 83 01 STA $01,S C2/039F: 68 PLA C2/03A0: EB XBA C2/03A1: A9 02 LDA #$02 C2/03A3: 20 E4 03 JSR $03E4 C2/03A6: 20 CB 4E JSR $4ECB C2/03A9: 64 B8 STZ $B8 C2/03AB: 64 B9 STZ $B9 C2/03AD: 68 PLA C2/03AE: EB XBA C2/03AF: 68 PLA C2/03B0: 20 B9 03 JSR $03B9 C2/03B3: 20 E4 03 JSR $03E4 C2/03B6: 4C CB 4E JMP $4ECB
C2/03B9 swap roulette to enemy roulette
C2/03B9: 08 PHP C2/03BA: C2 20 REP #$20 C2/03BC: C9 0C 8C CMP #$8C0C (is the command Lore and the attack Roulette?) C2/03BF: D0 03 BNE $03C4 (branch if not) C2/03C1: A9 1E 8C LDA #$8C1E (set command to Enemy Roulette, keep attack as Roulette) C2/03C4: 28 PLP C2/03C5: 60 RTS
C2/03C6 unknow
C2/03C6: 20 84 05 JSR $0584 C2/03C9: EB XBA C2/03CA: A9 1D LDA #$1D C2/03CC: 80 10 BRA $03DE
C2/03CE: 9B TXY C2/03CF: 20 D1 05 JSR $05D1 (Picks a Rage [when Muddled/Berserked/etc], and picks the Rage move) C2/03D2: EB XBA C2/03D3: A9 10 LDA #$10 C2/03D5: 80 07 BRA $03DE
C2/03D7: 9B TXY C2/03D8: 20 9C 05 JSR $059C C2/03DB: EB XBA C2/03DC: A9 13 LDA #$13 C2/03DE: 20 E4 03 JSR $03E4 C2/03E1: 4C CB 4E JMP $4ECB
C2/03E4 unknow
C2/03E4: 08 PHP C2/03E5: E2 30 SEP #$30 (Set 8-bit A,X, & Y) C2/03E7: 8D 7A 3A STA $3A7A C2/03EA: EB XBA C2/03EB: 8D 7B 3A STA $3A7B C2/03EE: EB XBA C2/03EF: C9 1E CMP #$1E C2/03F1: B0 2B BCS $041E (branch if command is 1Eh or above.. i.e. it's enemy Roulette or a counterattack) C2/03F3: 48 PHA C2/03F4: DA PHX C2/03F5: AA TAX C2/03F6: BF 7B 06 C2 LDA $C2067B,X (get command's "time to wait") C2/03FA: FA PLX C2/03FB: 18 CLC C2/03FC: 7D 2C 32 ADC $322C,X (add it to character's existing "time to wait") C2/03FF: B0 03 BCS $0404 C2/0401: 1A INC C2/0402: D0 02 BNE $0406 C2/0404: A9 FF LDA #$FF C2/0406: 3A DEC (if sum overflowed or equalled FFh, set it to FEh) C2/0407: 9D 2C 32 STA $322C,X (update time to wait) C2/040A: 68 PLA C2/040B: 20 D3 26 JSR $26D3 C2/040E: A9 04 LDA #$04 C2/0410: 14 BA TRB $BA (Clear "Don't retarget if target invalid") C2/0412: C2 20 REP #$20 C2/0414: A5 B8 LDA $B8 C2/0416: D0 06 BNE $041E (branch if there are already targets) C2/0418: 9C 4E 3A STZ $3A4E C2/041B: 20 7E 58 JSR $587E (targeting function) C2/041E: 28 PLP C2/041F: 60 RTS
C2/0420 pick action if berserked, zombied, muddled, charmed or in the colosseum
C2/0420: 8A TXA
C2/0421: EB XBA
C2/0422: A9 06 LDA #$06
C2/0424: 20 81 47 JSR $4781 (X * 6)
C2/0427: A8 TAY
C2/0428: 64 FE STZ $FE (save Fight as Command 5)
C2/042A: 64 FF STZ $FF
C2/042C: B9 2E 20 LDA $202E,Y (get Command 1)
C2/042F: 85 F6 STA $F6
C2/0431: B9 31 20 LDA $2031,Y (get Command 2)
C2/0434: 85 F8 STA $F8
C2/0436: B9 34 20 LDA $2034,Y (get Command 3)
C2/0439: 85 FA STA $FA
C2/043B: B9 37 20 LDA $2037,Y (get Command 4)
C2/043E: 85 FC STA $FC
C2/0440: A9 05 LDA #$05 (indicate 5 valid commands to choose from)
C2/0442: 85 F5 STA $F5
C2/0444: BD E5 3E LDA $3EE5,X (Status byte 2)
C2/0447: 0A ASL
C2/0448: 0A ASL
C2/0449: 85 F4 STA $F4 (Bit 7 = Muddled, Bit 6 = Berserk, etc)
C2/044B: 0A ASL
C2/044C: 10 04 BPL $0452 (If no Berserk status)
C2/044E: 64 F4 STZ $F4 (Clear $F4, then skip Charm and Colosseum checks if Berserked)
C2/0450: 80 0C BRA $045E
C2/0452: BD 95 33 LDA $3395,X (Which target Charmed you)
C2/0455: 49 80 EOR #$80 (FFh indicates no Charmer, so Bit 7 will now be set if there IS a Charmer)
C2/0457: 04 F4 TSB $F4
C2/0459: AD 97 3A LDA $3A97 (Top bit indicates Colosseum battle?)
C2/045C: 04 F4 TSB $F4
(Note that Berserk status will override Muddle/Charm/Colosseum for purposes of
determining whether we choose from the C2/04D0 or the C2/04D4 command list.
In contrast, Zombie will not; Charm/Colosseum/Muddle override it.)
C2/045E: 9B TXY (Y now points to the attacker who is taking this turn)
C2/045F: DA PHX
C2/0460: A2 06 LDX #$06 (start checking 4th command slot)
C2/0462: DA PHX (save slot position)
C2/0463: B5 F6 LDA $F6,X
C2/0465: 48 PHA (save command)
C2/0466: 30 1A BMI $0482 (branch if slot empty)
C2/0468: 18 CLC (clear Carry)
C2/0469: 20 17 52 JSR $5217 (X = A DIV 8, A = 2 ^ (A MOD 8) )
C2/046C: 3F D0 04 C2 AND $C204D0,X (is command allowed when Muddled/Charmed/Colosseum?)
C2/0470: F0 10 BEQ $0482 (branch if not)
C2/0472: A5 F4 LDA $F4
C2/0474: 30 12 BMI $0488 (Branch if Muddled/Charmed/Colosseum but not Berserked)
C2/0476: A3 01 LDA $01,S (get command)
C2/0478: 18 CLC
C2/0479: 20 17 52 JSR $5217 (X = A DIV 8, A = 2 ^ (A MOD 8) )
C2/047C: 3F D4 04 C2 AND $C204D4,X (is command allowed when Berserked/Zombied?)
C2/0480: D0 06 BNE $0488 (branch if so)
C2/0482: A9 FF LDA #$FF
C2/0484: 83 01 STA $01,S (replace command on stack with Empty entry)
C2/0486: C6 F5 DEC $F5 (decrement number of valid commands)
C2/0488: 7B TDC (clear 16-bit A)
C2/0489: A3 01 LDA $01,S (get current command)
(Loop below sees if our current command is one that requires special code to
work with Muddle/Charm/Colosseum/Berserk/Zombie. If it is, a special function
is called for the command.)
C2/048B: A2 08 LDX #$08
C2/048D: DF D8 04 C2 CMP $C204D8,X (does our current command match one from table?)
C2/0491: D0 06 BNE $0499 (if not, compare it to a second command in this loop iteration)
C2/0493: FC E2 04 JSR ($04E2,X) (if it does, call the special code used by that command)
C2/0496: EB XBA (put attack/spell # in top of A)
C2/0497: 80 10 BRA $04A9 (exit loop, as we found our command)
C2/0499: DF D9 04 C2 CMP $C204D9,X (does our current command match one from table?)
C2/049D: D0 06 BNE $04A5 (if not, our current command didn't match either
compared one. so move to new pair of commands
in table, and repeat loop)
C2/049F: FC EC 04 JSR ($04EC,X) (if it did match, call the special code used
by that command)
C2/04A2: EB XBA (put attack/spell # in top of A)
C2/04A3: 80 04 BRA $04A9 (exit loop, as we found our command)
C2/04A5: CA DEX
C2/04A6: CA DEX
C2/04A7: 10 E4 BPL $048D (Loop to compare current command to all 10 commands
that utilize special code.
If this loop doesn't exit before X becomes negative,
that means our current command has no special function,
and the Attack # in the top half of A will be zero.)
C2/04A9: 68 PLA (get command # from stack)
C2/04AA: FA PLX (get command slot from stack)
C2/04AB: 95 F6 STA $F6,X (save command # in current command slot)
C2/04AD: EB XBA
C2/04AE: 95 F7 STA $F7,X (save attack/spell # corresponding to that attack)
C2/04B0: CA DEX
C2/04B1: CA DEX
C2/04B2: 10 AE BPL $0462 (loop for first 4 command slots)
(Fight has been put in the 5th command slot. Any valid commands, with their
accompanying attack/spell numbers, have been established for slots 1 thru 4.
Now we shall randomly pick from those commands. Each slot should have equal
probability of being chosen.)
C2/04B4: A5 F5 LDA $F5 (# of valid command slots)
C2/04B6: 20 65 4B JSR $4B65 (RNG: 0 to A - 1 . we're randomly picking a command)
C2/04B9: A8 TAY
C2/04BA: A2 08 LDX #$08 (start pointing to Command slot 5)
C2/04BC: B5 F6 LDA $F6,X
C2/04BE: 30 03 BMI $04C3 (if that command slot is Empty, move to next one)
C2/04C0: 88 DEY (only decrement when on a valid command slot)
C2/04C1: 30 07 BMI $04CA (If Y is negative, we've found our Nth valid command
[starting with the last valid command and counting
backward], where N is the number returned from the
RNG plus 1.
This is what we wanted, so branch.)
C2/04C3: CA DEX
C2/04C4: CA DEX
C2/04C5: 10 F5 BPL $04BC (loop for all 5 command slots)
C2/04C7: 7B TDC (clear 16-bit A)
C2/04C8: 80 04 BRA $04CE (clean up stack and exit function. A is zero,
indicating Fight, which must be a fallback in case
all 5 Command slots somehow came up useless. not
sure how that'd happen, as Slot #5 should always
hold Fight anyway...)
C2/04CA: EB XBA
C2/04CB: B5 F7 LDA $F7,X
C2/04CD: EB XBA (bottom of A = command # from $F6,X
top of A = attack/spell # from $F7,X)
C2/04CE: FA PLX
C2/04CF: 60 RTS
C2/04D0 data - commands allowed in colosseum, muddled or charmed
C2/04D0: ED (Fight, Magic, Morph, Steal, Capture, SwdTech) C2/04D1: 3E (Tools, Blitz, Runic, Lore, Sketch) C2/04D2: DD (Rage, Mimic, Dance, Row, Jump, X-Magic) C2/04D3: 2D (GP Rain, Health, Shock, MagiTek)
C2/04D4 data - commands allowed when berserked or zombied
C2/04D4: 41 (Fight, Capture) C2/04D5: 00 (none) C2/04D6: 41 (Rage, Jump) C2/04D7: 20 (MagiTek)
C2/04D8 data - commands with special functions when acts automatically
C2/04D8: 02 (Magic) C2/04D9: 17 (X-Magic) C2/04DA: 07 (SwdTech) C2/04DB: 0A (Blitz) C2/04DC: 10 (Rage) C2/04DD: 13 (Dance) C2/04DE: 0C (Lore) C2/04DF: 03 (Morph) C2/04E0: 1D (MagiTek) C2/04E1: 09 (Tools)
C2/04E2 unknow - code pointers
C2/04E2: 1A 05 (Magic) C2/04E4: 60 05 (SwdTech) C2/04E6: D1 05 (Rage) C2/04E8: F6 04 (Lore) C2/04EA: 84 05 (MagiTek) C2/04EC: 1A 05 (X-Magic) C2/04EE: 75 05 (Blitz) C2/04F0: 9C 05 (Dance) C2/04F2: 57 05 (Morph) C2/04F4: 8D 05 (Tools)
C2/04F6 lore command - auto setup
C2/04F6: B9 E5 3E LDA $3EE5,Y (Status Byte 2)
C2/04F9: 89 08 BIT #$08
C2/04FB: D0 52 BNE $054F (If Mute)
C2/04FD: AD 87 3A LDA $3A87 (Number of Lores possessed?)
C2/0500: F0 4D BEQ $054F (if there's zero, don't use Lore command)
C2/0502: 48 PHA
C2/0503: C2 21 REP #$21
C2/0505: B9 2C 30 LDA $302C,Y (starting address of Magic menu?)
C2/0508: 69 D8 00 ADC #$00D8 (add 54 spells * 4 to get to next menu(?), which is Lore?)
C2/050B: 85 EE STA $EE
C2/050D: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/050F: 68 PLA
C2/0510: EB XBA (put # of Lores possessed in top of A)
C2/0511: A9 60 LDA #$60 (there are 24 Lores, and each menu slot must occupy
4 bytes, so set loop limit to 96)
C2/0513: 20 34 05 JSR $0534 (randomly pick a valid Lore menu slot)
C2/0516: 18 CLC
C2/0517: 69 8B ADC #$8B (first Lore is #139, Condemned)
C2/0519: 60 RTS
C2/051A magic and x-magic command - auto setup
C2/051A: B9 E5 3E LDA $3EE5,Y (Status Byte 2)
C2/051D: 89 08 BIT #$08
C2/051F: D0 2E BNE $054F (If Mute)
C2/0521: B9 F8 3C LDA $3CF8,Y (Number of spells possessed by this character?)
C2/0524: F0 29 BEQ $054F (if there's zero, don't use Magic/X-Magic command)
C2/0526: 48 PHA
C2/0527: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0529: B9 2C 30 LDA $302C,Y (starting address of Magic menu?)
C2/052C: 85 EE STA $EE
C2/052E: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/0530: 68 PLA
C2/0531: EB XBA (put # of spells possessed in top of A)
C2/0532: A9 D8 LDA #$D8 (there are 54 spells, and each menu slot must occupy
4 bytes, so set loop limit to 216)
C2/0534: DA PHX
C2/0535: 5A PHY
C2/0536: A8 TAY
C2/0537: EB XBA (retrieve number of spells/Lores possessed)
C2/0538: 20 65 4B JSR $4B65 (RNG: 0 to A - 1 . we're randomly picking a
spell/lore)
C2/053B: AA TAX
C2/053C: B1 EE LDA ($EE),Y (what's in this Magic/Lore menu slot?)
C2/053E: C9 FF CMP #$FF (is it null?)
C2/0540: F0 03 BEQ $0545 (if so, skip to next slot)
C2/0542: CA DEX
C2/0543: 30 07 BMI $054C (If X becomes negative, that means we've found the
Nth valid slot [starting with the last valid slot
and counting backward], where N is the X returned
from our RNG plus 1.
This is what we wanted, so branch.)
C2/0545: 88 DEY
C2/0546: 88 DEY
C2/0547: 88 DEY
C2/0548: 88 DEY
C2/0549: D0 F1 BNE $053C (loop and check next slot)
C2/054B: 7B TDC (if we didn't get any matches, just use Fire
[or Condemned for Lore, since 139 gets added])
C2/054C: 7A PLY
C2/054D: FA PLX
C2/054E: 60 RTS
C2/054F randomly chosen command failed
C2/054F: C6 F5 DEC $F5 (decrement # of valid command slots)
C2/0551: A9 FF LDA #$FF
C2/0553: 83 03 STA $03,S (store Empty in current command slot, indicating
that it cannot be chosen)
C2/0555: 7B TDC (clear 16-bit A. note that only the bottom 8-bits,
which indicate the attack/spell #, matter..
the command # is loaded by the stack retrieval at
C2/04A9, and will obviously be FFh in this case.)
C2/0556: 60 RTS
C2/0557 morph command - check availability
C2/0557: A9 0F LDA #$0F C2/0559: CD F6 1C CMP $1CF6 (Morph supply) C2/055C: 7B TDC (clear 16-bit A) C2/055D: B0 F0 BCS $054F (if Morph supply isn't at least 16, don't allow Morph command) C2/055F: 60 RTS
C2/0560 sword tech command - auto setup
C2/0560: B9 A4 3B LDA $3BA4,Y (Special properties for right-hand weapon slot) C2/0563: 19 A5 3B ORA $3BA5,Y ( for left-hand) C2/0566: 89 02 BIT #$02 (is Swdtech allowed by either hand?) C2/0568: F0 E5 BEQ $054F (if not, don't use Swdtech as command) C2/056A: AD 20 20 LDA $2020 (index of highest known Swdtech?) C2/056D: 1A INC (# of known Swdtechs) C2/056E: 20 65 4B JSR $4B65 (Pick a known Swdtech) C2/0571: 18 CLC C2/0572: 69 55 ADC #$55 (first Swdtech is #85, Dispatch) C2/0574: 60 RTS
C2/0575 blitz command - auto setup
C2/0575: 7B TDC C2/0576: AD 28 1D LDA $1D28 (Known Blitzes) C2/0579: 20 2A 52 JSR $522A (Pick a random bit that is set) C2/057C: 20 F0 51 JSR $51F0 (Get which bit is picked) C2/057F: 8A TXA C2/0580: 18 CLC C2/0581: 69 5D ADC #$5D (first Blitz is #93, Pummel) C2/0583: 60 RTS
C2/0584 magitek command - auto setup
C2/0584: A9 03 LDA #$03
C2/0586: 20 65 4B JSR $4B65 (0 to 2 -- only pick between first 3 MagiTek moves,
since anybody besides Terra can only use
Fire Beam + Bolt Beam + Ice Beam + Heal Force,
but there's Bio Blast in between those last two.
just picking from the first three simplifies code,
although decent planning would have had Heal Force
before Bio Blast.. or add a few instructions here
and include Bio Blast anyway.)
C2/0589: 18 CLC
C2/058A: 69 83 ADC #$83 (first MagiTek move is #131, Fire Beam)
C2/058C: 60 RTS
C2/058d tools command - auto setup
C2/058D: 7B TDC C2/058E: AD 9B 3A LDA $3A9B (Which tools are owned) C2/0591: 20 2A 52 JSR $522A (Pick a random tool that is owned) C2/0594: 20 F0 51 JSR $51F0 (Get which bit is set, thus returning a 0-7 Tool index) C2/0597: 8A TXA C2/0598: 18 CLC C2/0599: 69 A3 ADC #$A3 (item number of first tool, NoiseBlaster, is 163) C2/059B: 60 RTS
C2/059C dance command - auto setup
C2/059C: DA PHX
C2/059D: B9 E1 32 LDA $32E1,Y (get the dance number?)
C2/05A0: C9 FF CMP #$FF (is it null?)
C2/05A2: D0 0E BNE $05B2 (if it's valid, a Dance has already been chosen,
so just proceed to choose a step)
C2/05A4: 7B TDC (clear 16-bit A)
C2/05A5: AD 4C 1D LDA $1D4C (bitfield of known Dances?)
C2/05A8: 20 2A 52 JSR $522A (Pick a random bit that is set)
C2/05AB: 20 F0 51 JSR $51F0 (Get which bit is picked)
C2/05AE: 8A TXA
C2/05AF: 99 E1 32 STA $32E1,Y (save our Dance #)
C2/05B2: 0A ASL
C2/05B3: 0A ASL (* 4)
C2/05B4: 85 EE STA $EE (Each Dance has 4 steps, and occupies 4 bytes
in the Dance Step --> Attack Number table
at $CFFE80)
C2/05B6: 20 5A 4B JSR $4B5A (RNG: 0 to 255)
C2/05B9: A2 02 LDX #$02
C2/05BB: DF CE 05 C2 CMP $C205CE,X (see data below for chances of each step)
C2/05BF: B0 02 BCS $05C3
C2/05C1: E6 EE INC $EE (move to next step for this Dance)
C2/05C3: CA DEX
C2/05C4: 10 F5 BPL $05BB (loop until we reach step determined by random #)
C2/05C6: A6 EE LDX $EE (= (Dance * 4) + step)
C2/05C8: BF 80 FE CF LDA $CFFE80,X (get attack # for the Dance step used)
C2/05CC: FA PLX
C2/05CD: 60 RTS
C2/05CE data - chances for each dance step
(Data - for chances of each dance step) (Probabilities: Dance Step 0 = 7/16, Step 1 = 6/16, Step 2 = 2/16, Step 3 = 1/16) C2/05CE: 10 30 90
C2/05D1 rage command - auto setup
C2/05D1: DA PHX
C2/05D2: 08 PHP
C2/05D3: 7B TDC
C2/05D4: 99 A9 33 STA $33A9,Y
C2/05D7: B9 A8 33 LDA $33A8,Y (which monster it is)
C2/05DA: C9 FF CMP #$FF
C2/05DC: D0 22 BNE $0600 (branch if a non-null monster was passed)
C2/05DE: 1A INC
C2/05DF: 99 A8 33 STA $33A8,Y (store enemy #0, Guard)
C2/05E2: AD 9A 3A LDA $3A9A (# of rages possessed)
C2/05E5: 20 65 4B JSR $4B65
C2/05E8: 1A INC (random #: 1 to $3A9A)
C2/05E9: 85 EE STA $EE
C2/05EB: A2 00 LDX #$00
C2/05ED: BD 7E 25 LDA $257E,X (copy of Rages menu? menu is filled in C2/580C routine,
and #$257E constant is copied to $002181)
C2/05F0: C9 FF CMP #$FF
C2/05F2: F0 0C BEQ $0600 (branch if that menu slot was null, which means
enemy #0 should be defaulted to)
C2/05F4: C6 EE DEC $EE (decrement our random index)
C2/05F6: F0 05 BEQ $05FD (if it's zero, branch, and use the menu item last read)
C2/05F8: E8 INX
C2/05F9: D0 F2 BNE $05ED (loop again to check next menu entry)
C2/05FB: 80 03 BRA $0600 (if we've looped a full 256 times and somehow there's
been no match with the random index, branch and just
use enemy #0)
(i'm not sure what the purpose of the above loop is.. it selects Enemy #0
if any menu slots up to and including the randomly chosen one hold FFh. maybe it's a check
to see if the list got "broken," as a normally generated one should never have any nulls
in the middle.)
C2/05FD: 99 A8 33 STA $33A8,Y (store enemy number)
C2/0600: 20 53 4B JSR $4B53 (0 or 1)
C2/0603: C2 30 REP #$30
C2/0605: 2A ROL
C2/0606: AA TAX
C2/0607: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/0609: BF 00 46 CF LDA $CF4600,X (Rage)
C2/060D: 28 PLP
C2/060E: FA PLX
C2/060F: 60 RTS
C2/0610 load monster properties for rage
C2/0610: 08 PHP
C2/0611: B9 A8 33 LDA $33A8,Y (Which monster it is)
C2/0614: AA TAX
C2/0615: EB XBA
C2/0616: BF C0 37 CF LDA $CF37C0,X (get enemy Special move graphic)
C2/061A: 99 81 3C STA $3C81,Y
C2/061D: A9 20 LDA #$20
C2/061F: 20 81 47 JSR $4781 (get monster # * 32 to access the monster
data block)
C2/0622: C2 10 REP #$10
C2/0624: AA TAX
C2/0625: BF 1A 00 CF LDA $CF001A,X (monster's regular weapon graphic)
C2/0629: 99 A8 3C STA $3CA8,Y
C2/062C: 99 A9 3C STA $3CA9,Y
C2/062F: 20 C1 2D JSR $2DC1 (load monster's special attack, elemental properties,
statuses, status immunities, special properties like
Human/Undead/Dies at MP=0 , etc)
C2/0632: 28 PLP
C2/0633: 60 RTS
C2/0634 monster commands - auto setup
Picks command for Muddled/Charmed/Berserk/Colosseum monsters
C2/0634: DA PHX
C2/0635: C2 30 REP #$30 (Set 16-bit A,X & Y)
C2/0637: BD F9 1F LDA $1FF9,X (Which monster it is)
C2/063A: 0A ASL
C2/063B: 0A ASL
C2/063C: AA TAX (multiply monster # by 4 to index its
Control/Muddled/Charm/Colosseum attack table)
C2/063D: BF 00 3D CF LDA $CF3D00,X (Muddled commands)
C2/0641: 85 F0 STA $F0
C2/0643: BF 02 3D CF LDA $CF3D02,X (Muddled commands)
C2/0647: 85 F2 STA $F2
C2/0649: E2 30 SEP #$30 (Set 8-bit A,X, & Y)
C2/064B: 64 EE STZ $EE
C2/064D: 20 5A 4B JSR $4B5A (random: 0 to 255)
C2/0650: 29 03 AND #$03 (0 to 3 - point to a random attack slot)
C2/0652: AA TAX
C2/0653: B5 F0 LDA $F0,X
C2/0655: C9 FF CMP #$FF
C2/0657: D0 0B BNE $0664 (branch if valid attack in slot)
C2/0659: CA DEX
C2/065A: 10 F7 BPL $0653 (loop through remainder of attack slots)
C2/065C: E6 EE INC $EE (if we couldn't find any valid attacks,
increment counter)
C2/065E: F0 04 BEQ $0664 (give up if we've incremented it 256 times?
i can't see why more than 1 time would be
necessary.. if we give up, it appears
FFh is retained as the attack #, which
should make the monster do nothing..)
(it would've been far faster to change C2/064B
to "LDA #$FF / STA $EE" and this BEQ to a BNE.)
C2/0660: A2 03 LDX #$03 (if randomly chosen attack slot and all the
ones below it were Empty, go do the loop again,
this time starting with the highest
numbered slot. this way, we'll check EVERY
slot before throwing in the towel)
C2/0662: 80 EF BRA $0653
C2/0664: FA PLX
C2/0665: 48 PHA
C2/0666: BD E5 3E LDA $3EE5,X
C2/0669: 89 10 BIT #$10
C2/066B: F0 04 BEQ $0671 (Branch if not Berserk)
C2/066D: A9 EE LDA #$EE
C2/066F: 83 01 STA $01,S (Set attack to Battle)
C2/0671: 68 PLA
C2/0672: 20 BF 1D JSR $1DBF (choose a command based on attack #)
C2/0675: 20 E4 03 JSR $03E4
C2/0678: 4C CB 4E JMP $4ECB
C2/067B data - time to wait for commands
(Data - Time to wait after entering a command until character actually performs it (iow, how long they spend in their ready stance). This value * 256 is compared to their $3AB4 counter. I'm really not sure how this applies to enemies.) C2/067B: 10 (Fight) C2/067C: 10 (Item) C2/067D: 20 (Magic) C2/067E: 00 (Morph) C2/067F: 00 (Revert) C2/0680: 10 (Steal) C2/0681: 10 (Capture) C2/0682: 10 (SwdTech) C2/0683: 10 (Throw) C2/0684: 10 (Tools) C2/0685: 10 (Blitz) C2/0686: 10 (Runic) C2/0687: 20 (Lore) C2/0688: 10 (Sketch) C2/0689: 10 (Control) C2/068A: 10 (Slot) C2/068B: 10 (Rage) C2/068C: 10 (Leap) C2/068D: 10 (Mimic) C2/068E: 10 (Dance) C2/068F: 10 (Row) C2/0690: 10 (Def.) C2/0691: E0 (Jump) C2/0692: 20 (X-Magic) C2/0693: 10 (GP Rain) C2/0694: 10 (Summon) C2/0695: 20 (Health) C2/0696: 20 (Shock) C2/0697: 10 (Possess) C2/0698: 10 (MagiTek) C2/0699: 00 C2/069A: 00
C2/069B unknow
C2/069B: A2 12 LDX #$12 C2/069D: BD A0 3A LDA $3AA0,X C2/06A0: 4A LSR C2/06A1: 90 5D BCC $0700 C2/06A3: C2 20 REP #$20 C2/06A5: BD 18 30 LDA $3018,X C2/06A8: 2C 4E 2F BIT $2F4E C2/06AB: E2 20 SEP #$20 C2/06AD: D0 51 BNE $0700 C2/06AF: 20 AD 07 JSR $07AD C2/06B2: BD E4 3E LDA $3EE4,X C2/06B5: 89 82 BIT #$82 (Check for Dead or Zombie Status) C2/06B7: F0 06 BEQ $06BF (branch if none set) C2/06B9: 9E F4 3B STZ $3BF4,X (Set HP to 0) C2/06BC: 9E F5 3B STZ $3BF5,X C2/06BF: BD E4 3E LDA $3EE4,X C2/06C2: 89 C2 BIT #$C2 (Check for Dead, Zombie, or Petrify status) C2/06C4: F0 09 BEQ $06CF (branch if none set) C2/06C6: BD 19 30 LDA $3019,X C2/06C9: 0C 3A 3A TSB $3A3A C2/06CC: 20 C8 07 JSR $07C8 C2/06CF: BD E4 3E LDA $3EE4,X C2/06D2: 10 2C BPL $0700 (Branch if alive) C2/06D4: E0 08 CPX #$08 C2/06D6: B0 0C BCS $06E4 (branch if monster) C2/06D8: BD D8 3E LDA $3ED8,X (Which character) C2/06DB: C9 0E CMP #$0E C2/06DD: D0 05 BNE $06E4 (Branch if not Banon) C2/06DF: A9 06 LDA #$06 C2/06E1: 8D 6E 3A STA $3A6E (Banon fell... "End of combat" method #6) C2/06E4: 20 10 07 JSR $0710 C2/06E7: BD E4 3E LDA $3EE4,X C2/06EA: 89 02 BIT #$02 (Check for Zombie Status) C2/06EC: F0 03 BEQ $06F1 C2/06EE: 20 28 07 JSR $0728 C2/06F1: BD E4 3E LDA $3EE4,X C2/06F4: 10 0A BPL $0700 (Branch if alive) C2/06F6: BD F9 3E LDA $3EF9,X C2/06F9: 89 04 BIT #$04 C2/06FB: F0 03 BEQ $0700 (branch if no Life 3 status) C2/06FD: 20 99 07 JSR $0799 (prepare Life 3 revival) C2/0700: CA DEX C2/0701: CA DEX C2/0702: 10 99 BPL $069D C2/0704: A2 12 LDX #$12 C2/0706: 20 39 07 JSR $0739 (clean up Control) C2/0709: CA DEX C2/070A: CA DEX C2/070B: 10 F9 BPL $0706 (loop for every entity onscreen) C2/070D: 4C 26 5D JMP $5D26
C2/0710 unknow
C2/0710: C2 20 REP #$20
C2/0712: BD 18 30 LDA $3018,X
C2/0715: 2C 2C 3F BIT $3F2C (are they in the middle of a Jump?)
C2/0718: E2 20 SEP #$20
C2/071A: F0 0B BEQ $0727 (Exit function if not)
C2/071C: 20 28 07 JSR $0728 (clear Wound for now, so they don't actually croak
in mid-air)
C2/071F: BD 05 32 LDA $3205,X
C2/0722: 29 FB AND #$FB
C2/0724: 9D 05 32 STA $3205,X (Set Air Anchor effect)
C2/0727: 60 RTS
C2/0728 unknow
C2/0728: BD E4 3E LDA $3EE4,X C2/072B: 29 7F AND #$7F (Clear death status) C2/072D: 9D E4 3E STA $3EE4,X C2/0730: BD 04 32 LDA $3204,X C2/0733: 29 BF AND #$BF (clear bit 6) C2/0735: 9D 04 32 STA $3204,X C2/0738: 60 RTS
C2/0739 check and remove control effects
(Remove Control's influence from this entity and its Controller/Controllee if
Control was flagged to be deactivated due to:
- C2/07AD found certain statuses on entity [doesn't matter whether
it's the Controller or it's the Controllee])
- this entity is a Controllee and C2/0C2D detected them sustaining physical
damage [healing or 0 damage will count, but a non-damaging attack -- i.e.
one with no damage numerals -- will not] )
C2/0739: BD B9 32 LDA $32B9,X (who's Controlling this entity?)
C2/073C: C9 FF CMP #$FF
C2/073E: F0 08 BEQ $0748 (branch if nobody controls them)
C2/0740: 10 06 BPL $0748 (branch if somebody controls them, and Control
wasn't flagged to be deactivated)
C2/0742: 29 7F AND #$7F
C2/0744: A8 TAY (put Controller in Y [Controllee is in X])
C2/0745: 20 5B 07 JSR $075B (clear Control info for the Controller and
Controllee [this entity])
C2/0748: BD B8 32 LDA $32B8,X (now see who this entity Controls)
C2/074B: C9 FF CMP #$FF
C2/074D: F0 0B BEQ $075A (branch if they control nobody)
C2/074F: 10 09 BPL $075A (branch if they control somebody, and Control
wasn't flagged to be deactivated)
C2/0751: 29 7F AND #$7F
C2/0753: DA PHX
C2/0754: 9B TXY (put Controller in Y)
C2/0755: AA TAX (put Controllee in X)
C2/0756: 20 5B 07 JSR $075B (clear Control info for the Controller [this
entity] and Controllee)
C2/0759: FA PLX
C2/075A: 60 RTS
C2/075B clear control data
(Clear Control-related data for a Controller, addressed by Y, and a Controllee, addressed by X) C2/075B: B9 4D 3E LDA $3E4D,Y C2/075E: 29 FE AND #$FE C2/0760: 99 4D 3E STA $3E4D,Y C2/0763: B9 F9 3E LDA $3EF9,Y C2/0766: 29 EF AND #$EF C2/0768: 99 F9 3E STA $3EF9,Y (clear "Chant" status from Controller) C2/076B: A9 FF LDA #$FF C2/076D: 9D B9 32 STA $32B9,X (set to nobody controlling Controllee) C2/0770: 99 B8 32 STA $32B8,Y (set to Controller controlling nobody) C2/0773: BD 19 30 LDA $3019,X C2/0776: 1C 54 2F TRB $2F54 C2/0779: DA PHX C2/077A: 20 83 07 JSR $0783 C2/077D: BB TYX C2/077E: 20 83 07 JSR $0783 C2/0781: FA PLX C2/0782: 60 RTS
C2/0783 unknow
C2/0783: A9 40 LDA #$40 C2/0785: 20 AB 5B JSR $5BAB (set bit 6 of $3AA1,X) C2/0788: BD 04 32 LDA $3204,X C2/078B: 09 40 ORA #$40 C2/078D: 9D 04 32 STA $3204,X (set bit 6) C2/0790: A9 7F LDA #$7F C2/0792: 3D A0 3A AND $3AA0,X C2/0795: 9D A0 3A STA $3AA0,X C2/0798: 60 RTS
C2/0799 prepare life 3 revival
C2/0799: 29 FB AND #$FB C2/079B: 9D F9 3E STA $3EF9,X (clear Life 3 status) C2/079E: BD 19 30 LDA $3019,X C2/07A1: 1C 2F 2F TRB $2F2F C2/07A4: A9 30 LDA #$30 C2/07A6: 85 B8 STA $B8 C2/07A8: A9 26 LDA #$26 (command #$26) C2/07AA: 4C 91 4E JMP $4E91 (queue it?)
C2/07AD unknow
C2/07AD: F4 C2 B0 PEA $B0C2 (Sleep, Muddled, Berserk, Death, Petrify, Zombie) C2/07B0: F4 11 03 PEA $0311 (Rage, Freeze, Dance, Stop) C2/07B3: 9B TXY C2/07B4: 20 64 58 JSR $5864 C2/07B7: B0 0E BCS $07C7 (Exit function if none of those statuses set) C2/07B9: 1E B8 32 ASL $32B8,X C2/07BC: 38 SEC C2/07BD: 7E B8 32 ROR $32B8,X (flag "Who you control" link to be deactivated) C2/07C0: 1E B9 32 ASL $32B9,X C2/07C3: 38 SEC C2/07C4: 7E B9 32 ROR $32B9,X (flag "Who controls you" link to be deactivated) C2/07C7: 60 RTS
C2/07C8 unknow
C2/07C8: EC F9 33 CPX $33F9 C2/07CB: D0 28 BNE $07F5 (branch if you're not being Zingered) C2/07CD: DA PHX C2/07CE: AE F8 33 LDX $33F8 (who's doing the Zingering) C2/07D1: BD 19 30 LDA $3019,X C2/07D4: 85 B9 STA $B9 C2/07D6: A9 04 LDA #$04 C2/07D8: 85 B8 STA $B8 C2/07DA: A2 00 LDX #$00 C2/07DC: A9 24 LDA #$24 C2/07DE: 20 91 4E JSR $4E91 C2/07E1: A9 02 LDA #$02 C2/07E3: 85 B8 STA $B8 C2/07E5: A2 08 LDX #$08 C2/07E7: A9 24 LDA #$24 C2/07E9: 20 91 4E JSR $4E91 C2/07EC: A9 FF LDA #$FF C2/07EE: 8D F8 33 STA $33F8 (nobody's Zingering) C2/07F1: 8D F9 33 STA $33F9 (nobody's being Zingered) C2/07F4: FA PLX C2/07F5: BD 6C 33 LDA $336C,X C2/07F8: 30 04 BMI $07FE (branch if you have no Love Token slave) C2/07FA: A8 TAY C2/07FB: 20 2D 08 JSR $082D (Clear Love Token links between you and slave) C2/07FE: BD 6D 33 LDA $336D,X C2/0801: 30 07 BMI $080A (branch if you're nobody's Love Token slave) C2/0803: DA PHX C2/0804: 9B TXY C2/0805: AA TAX C2/0806: 20 2D 08 JSR $082D (Clear Love Token links between you and master) C2/0809: FA PLX C2/080A: BD 94 33 LDA $3394,X C2/080D: 30 04 BMI $0813 (branch if you're not Charming anybody) C2/080F: A8 TAY C2/0810: 20 36 08 JSR $0836 (Clear Charm links between you and your Charmee) C2/0813: BD 95 33 LDA $3395,X C2/0816: 30 07 BMI $081F (branch if you're not Charmed by anybody) C2/0818: DA PHX C2/0819: 9B TXY C2/081A: AA TAX C2/081B: 20 36 08 JSR $0836 (Clear Charm links between you and Charmer) C2/081E: FA PLX C2/081F: EC 04 34 CPX $3404 (Compare to Quick's target byte) C2/0822: D0 08 BNE $082C (Exit If this actor does not get extra turn due to Quick) C2/0824: A9 FF LDA #$FF C2/0826: 8D 04 34 STA $3404 (Store #$FF (empty) to Quick's target byte) C2/0829: 8D 02 34 STA $3402 (Store #$FF (for none) to the number of turns due to Quick) C2/082C: 60 RTS
C2/082D clear love token effect
C2/082D: A9 FF LDA #$FF C2/082F: 9D 6C 33 STA $336C,X C2/0832: 99 6D 33 STA $336D,Y C2/0835: 60 RTS
C2/0836 clear charm effect
C2/0836: A9 FF LDA #$FF C2/0838: 9D 94 33 STA $3394,X C2/083B: 99 95 33 STA $3395,Y C2/083E: 60 RTS
C2/083F update battle variables
(Update a variety of things when the battle starts, when the enemy formation
is switched, and at the end of each turn [after the turn's animation plays out])
C2/083F: A2 12 LDX #$12
C2/0841: BD A0 3A LDA $3AA0,X
C2/0844: 4A LSR
C2/0845: 90 77 BCC $08BE
C2/0847: 1E E0 32 ASL $32E0,X
C2/084A: 5E E0 32 LSR $32E0,X (clear Bit 7 of $32E0. this prevents C2/4C5B
from triggering a counterattack for a once-attacked
entity turn after turn, while still preserving the
attacker in Bits 0-6.)
C2/084D: BD E4 3E LDA $3EE4,X
C2/0850: 30 07 BMI $0859 (Branch if dead)
C2/0852: BD A1 3A LDA $3AA1,X
C2/0855: 89 40 BIT #$40
C2/0857: F0 03 BEQ $085C (If bit 5 of $3AA1 is not set)
C2/0859: 20 77 09 JSR $0977
C2/085C: BD 04 32 LDA $3204,X
C2/085F: F0 4A BEQ $08AB
C2/0861: 4A LSR
C2/0862: 90 03 BCC $0867
C2/0864: 20 4A 0B JSR $0B4A (If bit 0 of $3204,X is set)
C2/0867: 1E 04 32 ASL $3204,X
C2/086A: 90 03 BCC $086F (Branch if bit 7 of $3204,X is not set.
It is set for an entity when their Imp status is
toggled, the attack/spell costs them MP to cast, or
the attack itself affects their MP because they're a
target [or the caster, if it's a draining attack])
C2/086C: 20 63 57 JSR $5763 (Update availability of entries on Esper, Magic,
and Lore menus)
C2/086F: 1E 04 32 ASL $3204,X
C2/0872: 90 08 BCC $087C
C2/0874: 20 0F 0A JSR $0A0F (If bit 6 of $3204,X is set)
C2/0877: A9 80 LDA #$80
C2/0879: 20 AB 5B JSR $5BAB (set bit 7 of $3AA1,X)
C2/087C: 1E 04 32 ASL $3204,X
C2/087F: 90 03 BCC $0884 (Branch if bit 5 of $3204,X is not set.
It is set for an entity upon Condemned status
being set.)
C2/0881: 20 B4 09 JSR $09B4 (Assign a starting value to Condemned counter)
C2/0884: 1E 04 32 ASL $3204,X
C2/0887: 90 03 BCC $088C (Branch if bit 4 of $3204,X is not set.
It is set for an entity when Condemned expires or
is otherwise cleared.)
C2/0889: 20 CE 09 JSR $09CE (Zero the Condemned counter)
C2/088C: 1E 04 32 ASL $3204,X
C2/088F: 90 07 BCC $0898 (Branch if bit 3 of $3204,X is not set.
It is set for an entity when Mute or Imp status
is toggled.)
C2/0891: E0 08 CPX #$08
C2/0893: B0 03 BCS $0898 (Branch if not a character)
C2/0895: 20 7D 52 JSR $527D (Update availability of commands on character's
main menu)
C2/0898: 1E 04 32 ASL $3204,X
C2/089B: 90 03 BCC $08A0 (Branch if bit 2 of $3204,X is not set.
It is set for an entity when Haste or Slow is toggled,
and a couple other cases I'm not sure of.)
C2/089D: 20 D2 09 JSR $09D2 (Recalculate the amount by which to increase the ATB
gauge. Affects various other timers, too)
C2/08A0: 1E 04 32 ASL $3204,X
C2/08A3: 90 03 BCC $08A8 (Branch if bit 1 of $3204,X is not set.
It is set for an entity when Morph status is toggled)
C2/08A5: 20 A8 0A JSR $0AA8 (switch command on main menu from Morph to Revert
[or vice versa], and adjust Morph-related variables
like timers)
C2/08A8: 1E 04 32 ASL $3204,X
C2/08AB: 20 1F 09 JSR $091F
C2/08AE: 20 C6 08 JSR $08C6
C2/08B1: BD A0 3A LDA $3AA0,X
C2/08B4: 89 50 BIT #$50
C2/08B6: F0 03 BEQ $08BB
C2/08B8: 20 41 0A JSR $0A41
C2/08BB: 20 4A 0A JSR $0A4A (Prepare equipment spell activations on low HP)
C2/08BE: CA DEX
C2/08BF: CA DEX
C2/08C0: 30 03 BMI $08C5
C2/08C2: 4C 41 08 JMP $0841 (loop for all 10 entities)
C2/08C5: 60 RTS
C2/08C6 unknow
C2/08C6: A9 50 LDA #$50 C2/08C8: 20 B4 11 JSR $11B4 C2/08CB: AD 04 34 LDA $3404 C2/08CE: 30 05 BMI $08D5 C2/08D0: EC 04 34 CPX $3404 C2/08D3: D0 F0 BNE $08C5 C2/08D5: BD E4 3E LDA $3EE4,X C2/08D8: 89 C0 BIT #$C0 C2/08DA: D0 E9 BNE $08C5 (Exit if dead or Petrify) C2/08DC: BD F8 3E LDA $3EF8,X C2/08DF: 89 10 BIT #$10 C2/08E1: D0 E2 BNE $08C5 (Exit if stop) C2/08E3: A9 EF LDA #$EF C2/08E5: 20 92 07 JSR $0792 C2/08E8: BD B9 32 LDA $32B9,X C2/08EB: 10 D8 BPL $08C5 (Exit if you are controlled) C2/08ED: BD E5 3E LDA $3EE5,X C2/08F0: 30 D3 BMI $08C5 (Exit if asleep) C2/08F2: BD F9 3E LDA $3EF9,X C2/08F5: 89 02 BIT #$02 C2/08F7: D0 CC BNE $08C5 (Exit if life 3) C2/08F9: BD 59 33 LDA $3359,X C2/08FC: 10 C7 BPL $08C5 (Exit if seized) C2/08FE: A9 BF LDA #$BF C2/0900: 20 92 07 JSR $0792 C2/0903: BD A1 3A LDA $3AA1,X C2/0906: 10 BD BPL $08C5 (Exit if bit 7 of $3AA1 is not set) C2/0908: 29 7F AND #$7F (Clear bit 7) C2/090A: 9D A1 3A STA $3AA1,X C2/090D: BD CC 32 LDA $32CC,X C2/0910: 1A INC C2/0911: F0 B2 BEQ $08C5 (Exit if $32CC is #$FF) C2/0913: BD A1 3A LDA $3AA1,X C2/0916: 4A LSR C2/0917: 90 03 BCC $091C (Branch if bit 0 of $3AA1 is not set) C2/0919: 4C 77 4E JMP $4E77 C2/091C: 4C 66 4E JMP $4E66
C2/091F unknow
C2/091F: E0 08 CPX #$08 C2/0921: B0 A2 BCS $08C5 (exit if monster) C2/0923: BD D8 3E LDA $3ED8,X (Which character it is) C2/0926: C9 0D CMP #$0D C2/0928: F0 9B BEQ $08C5 (Exit if Umaro) C2/092A: BD 55 32 LDA $3255,X C2/092D: 10 96 BPL $08C5 C2/092F: AD 97 3A LDA $3A97 C2/0932: D0 91 BNE $08C5 (exit if in the Colosseum) C2/0934: A9 02 LDA #$02 C2/0936: 85 EE STA $EE C2/0938: EC 04 34 CPX $3404 C2/093B: D0 04 BNE $0941 C2/093D: A9 88 LDA #$88 C2/093F: 04 EE TSB $EE C2/0941: A5 EE LDA $EE C2/0943: 20 B4 11 JSR $11B4 C2/0946: BD 18 30 LDA $3018,X C2/0949: 2C 4C 2F BIT $2F4C C2/094C: D0 38 BNE $0986 C2/094E: BD 59 33 LDA $3359,X C2/0951: 3D 95 33 AND $3395,X C2/0954: 10 30 BPL $0986 (branch if Seized or Charmed) C2/0956: F4 C2 B0 PEA $B0C2 (Sleep, Muddled, Berserk, Death, Petrify, Zombie) C2/0959: F4 01 21 PEA $2101 (Dance, Hide, Rage) C2/095C: 9B TXY C2/095D: 20 64 58 JSR $5864 C2/0960: 90 24 BCC $0986 (Branch if any set) C2/0962: BD A0 3A LDA $3AA0,X C2/0965: 10 66 BPL $09CD C2/0967: BD CC 32 LDA $32CC,X C2/096A: 10 61 BPL $09CD C2/096C: BD A0 3A LDA $3AA0,X C2/096F: 09 08 ORA #$08 C2/0971: 9D A0 3A STA $3AA0,X (turn on bit 3) C2/0974: 4C EF 11 JMP $11EF
C2/0977 unknow
C2/0977: C2 20 REP #$20 C2/0979: A9 D3 LDA #$D3 C2/097B: BF 20 92 07 LDA $079220,X C2/097F: E2 20 SEP #$20 C2/0981: A9 01 LDA #$01 C2/0983: 9D 19 32 STA $3219,X C2/0986: A9 F9 LDA #$F9 C2/0988: EB XBA C2/0989: BD F9 3E LDA $3EF9,X C2/098C: 89 20 BIT #$20 C2/098E: D0 13 BNE $09A3 (Branch if Hide status) C2/0990: BD 18 30 LDA $3018,X C2/0993: 2C 4C 2F BIT $2F4C C2/0996: D0 0B BNE $09A3 C2/0998: BD A0 3A LDA $3AA0,X C2/099B: 10 06 BPL $09A3 (Branch if bit 7 of $3AA0 is not set) C2/099D: A9 79 LDA #$79 C2/099F: EB XBA C2/09A0: 20 66 4E JSR $4E66 C2/09A3: EB XBA C2/09A4: 20 92 07 JSR $0792 C2/09A7: E0 08 CPX #$08 C2/09A9: B0 22 BCS $09CD (Exit function) C2/09AB: 8A TXA C2/09AC: 4A LSR C2/09AD: 85 10 STA $10 C2/09AF: A9 03 LDA #$03 C2/09B1: 4C 11 64 JMP $6411
C2/09B4 assign value to condemned counter
C2/09B4: AD AF 11 LDA $11AF (Level)
C2/09B7: 20 65 4B JSR $4B65 (random: 0 to Level - 1)
C2/09BA: 18 CLC
C2/09BB: 6D AF 11 ADC $11AF (Add to level)
C2/09BE: 85 EE STA $EE
C2/09C0: 38 SEC
C2/09C1: A9 3C LDA #$3C
C2/09C3: E5 EE SBC $EE (Subtract from 60)
C2/09C5: B0 01 BCS $09C8
C2/09C7: 7B TDC (Set to 0 if less than 0)
C2/09C8: 69 14 ADC #$14 (Add 21. if it was less than 0, add 20 instead,
giving it a starting value of 20.)
C2/09CA: 9D 05 3B STA $3B05,X (set Condemned counter)
(note that this counter is "one off" from the
actual numerals you'll see onscreen:
00 value = numerals disabled
01 value = numerals at "00"
02 value = numerals at "01"
03 value = numerals at "02" , etc.)
C2/09CD: 60 RTS
C2/09CE null condemned counter
C2/09CE: 9E 05 3B STZ $3B05,X (Condemned counter = 0) C2/09D1: 60 RTS
C2/09D2 battle timer counter function
Battle Time Counter function (Recalculate the amount by which to increase the ATB gauge. This will also affect the speed of the "wait timer" [which determines how long a character is in their ready stance], the Condemned counter, invisible timers for auto-expiring statuses, and the frequency of damage/healing from statuses like Regen and Poison.) C2/09D2: 08 PHP C2/09D3: A0 20 LDY #$20 (ATB multiplier = 32 if slowed) C2/09D5: BD F8 3E LDA $3EF8,X C2/09D8: 89 04 BIT #$04 C2/09DA: D0 08 BNE $09E4 (Branch if Slow) C2/09DC: A0 40 LDY #$40 (ATB multiplier = 64 normally) C2/09DE: 89 08 BIT #$08 C2/09E0: F0 02 BEQ $09E4 (Branch if not Haste) C2/09E2: A0 54 LDY #$54 (ATB multiplier = 84 if hasted)
C2/09E4: 98 TYA
C2/09E5: 9D DD 3A STA $3ADD,X (save the ATB multiplier)
C2/09E8: 98 TYA (this instruction seems frivolous)
C2/09E9: 48 PHA
C2/09EA: 18 CLC
C2/09EB: 4A LSR
C2/09EC: 63 01 ADC $01,S
C2/09EE: 83 01 STA $01,S (ATB multiplier *= 1.5)
C2/09F0: BD 19 3B LDA $3B19,X (Speed)
C2/09F3: 69 14 ADC #$14
C2/09F5: EB XBA (Speed + 20 in top byte of Accumulator)
C2/09F6: E0 08 CPX #$08
C2/09F8: 90 06 BCC $0A00 (branch if not an enemy)
C2/09FA: AD 90 3A LDA $3A90 (= 255 - (Battle Speed setting * 24) )
(remember that what you see on the Config menu is
Battle Speed + 1)
C2/09FD: 20 81 47 JSR $4781 (A = (speed + 20) * $3A90 )
C2/0A00: 68 PLA (bottom byte of A is now Slow/Normal/Haste Constant)
C2/0A01: 20 81 47 JSR $4781 (Let C be the Slow/Normal/Haste constant, equal to
48, 96, or 126, respectively.
for characters:
A = (Speed + 20) * C
for enemies:
A = ( ((Speed + 20) * $3A90) DIV 256) * C )
C2/0A04: C2 20 REP #$20
C2/0A06: 4A LSR
C2/0A07: 4A LSR
C2/0A08: 4A LSR
C2/0A09: 4A LSR (A = A / 16)
C2/0A0A: 9D C8 3A STA $3AC8,X (Save as amount by which to increase ATB timer.)
C2/0A0D: 28 PLP
C2/0A0E: 60 RTS
C2/0A0F unknow
C2/0A0F: 20 01 03 JSR $0301 C2/0A12: BD CC 32 LDA $32CC,X C2/0A15: 10 F8 BPL $0A0F C2/0A17: AC 64 3A LDY $3A64 C2/0A1A: 8A TXA C2/0A1B: D9 20 37 CMP $3720,Y C2/0A1E: D0 05 BNE $0A25 C2/0A20: A9 FF LDA #$FF C2/0A22: 99 20 37 STA $3720,Y C2/0A25: C8 INY C2/0A26: CC 65 3A CPY $3A65 C2/0A29: 90 EF BCC $0A1A C2/0A2B: BD 19 32 LDA $3219,X C2/0A2E: D0 08 BNE $0A38 C2/0A30: DE 19 32 DEC $3219,X C2/0A33: A9 D3 LDA #$D3 C2/0A35: 20 92 07 JSR $0792 C2/0A38: E0 08 CPX #$08 C2/0A3A: B0 0D BCS $0A49 C2/0A3C: A9 2C LDA #$2C C2/0A3E: 4C 91 4E JMP $4E91
C2/0A41 unknow
C2/0A41: A9 FD LDA #$FD C2/0A43: 3D A1 3A AND $3AA1,X C2/0A46: 9D A1 3A STA $3AA1,X C2/0A49: 60 RTS
C2/0A4A prepare equipment spell activations on low HP
C2/0A4A: BD A0 3A LDA $3AA0,X
C2/0A4D: 89 10 BIT #$10
C2/0A4F: D0 3F BNE $0A90 (Exit function)
C2/0A51: A9 02 LDA #$02
C2/0A53: 3C E5 3E BIT $3EE5,X
C2/0A56: F0 38 BEQ $0A90 (Branch if not Near Fatal)
C2/0A58: 3C 05 32 BIT $3205,X (is bit 1 set?)
C2/0A5B: F0 33 BEQ $0A90 (exit if not, meaning we've already activated
a spell on low HP this battle)
C2/0A5D: 5D 05 32 EOR $3205,X
C2/0A60: 9D 05 32 STA $3205,X (turn off bit 1)
(TRB $3205,X could've replaced two instructions)
C2/0A63: BD 59 3C LDA $3C59,X
C2/0A66: 4A LSR
C2/0A67: 90 0B BCC $0A74 (Branch if not Shell when low HP)
C2/0A69: 48 PHA
C2/0A6A: A9 25 LDA #$25
C2/0A6C: 85 B8 STA $B8 (Shell spell ID)
C2/0A6E: A9 26 LDA #$26
C2/0A70: 20 91 4E JSR $4E91
C2/0A73: 68 PLA
C2/0A74: 4A LSR
C2/0A75: 90 0B BCC $0A82 (branch if not Safe when low HP)
C2/0A77: 48 PHA
C2/0A78: A9 1C LDA #$1C
C2/0A7A: 85 B8 STA $B8 (Safe spell ID)
C2/0A7C: A9 26 LDA #$26
C2/0A7E: 20 91 4E JSR $4E91
C2/0A81: 68 PLA
C2/0A82: 4A LSR
C2/0A83: 90 0B BCC $0A90 (branch if not Reflect when low HP [no item
in game has this feature, but it's possible])
C2/0A85: 48 PHA
C2/0A86: A9 24 LDA #$24
C2/0A88: 85 B8 STA $B8 (Rflect spell ID)
C2/0A8A: A9 26 LDA #$26
C2/0A8C: 20 91 4E JSR $4E91
C2/0A8F: 68 PLA
C2/0A90: 60 RTS
C2/0A91 unknow
C2/0A91: A2 06 LDX #$06 C2/0A93: BD 18 30 LDA $3018,X C2/0A96: 2C 74 3A BIT $3A74 C2/0A99: F0 08 BEQ $0AA3 C2/0A9B: 2C 2C 3F BIT $3F2C C2/0A9E: D0 03 BNE $0AA3 C2/0AA0: 20 0F 0A JSR $0A0F C2/0AA3: CA DEX C2/0AA4: CA DEX C2/0AA5: 10 EC BPL $0A93 C2/0AA7: 60 RTS
C2/0AA8 unknow
C2/0AA8: A5 B1 LDA $B1
C2/0AAA: 4A LSR
C2/0AAB: B0 0A BCS $0AB7
C2/0AAD: BD 19 32 LDA $3219,X
C2/0AB0: D0 05 BNE $0AB7
C2/0AB2: A9 88 LDA #$88
C2/0AB4: 20 B4 11 JSR $11B4
C2/0AB7: DA PHX
C2/0AB8: BD F9 3E LDA $3EF9,X
C2/0ABB: 49 08 EOR #$08 (Toggle Morph status)
C2/0ABD: 4A LSR
C2/0ABE: 4A LSR
C2/0ABF: 4A LSR
C2/0AC0: 4A LSR
C2/0AC1: 08 PHP (save Carry flag, which is opposite of
"currently Morphed")
C2/0AC2: 7B TDC
C2/0AC3: 69 03 ADC #$03
C2/0AC5: 85 EE STA $EE ($EE = 3 or 4, depending on carry flag)
C2/0AC7: 8A TXA
C2/0AC8: EB XBA
C2/0AC9: A9 06 LDA #$06
C2/0ACB: 20 81 47 JSR $4781
C2/0ACE: AA TAX
C2/0ACF: A0 04 LDY #$04
C2/0AD1: BD 2E 20 LDA $202E,X (get contents of menu slot)
C2/0AD4: C5 EE CMP $EE
C2/0AD6: D0 05 BNE $0ADD (if Morphed and menu item isn't Morph(3), branch -OR-
if not Morphed and menu item isn't Revert(4), branch)
C2/0AD8: 49 07 EOR #$07
C2/0ADA: 9D 2E 20 STA $202E,X (toggle menu item between Morph(3) and Revert(4) )
C2/0ADD: E8 INX
C2/0ADE: E8 INX
C2/0ADF: E8 INX
C2/0AE0: 88 DEY
C2/0AE1: D0 EE BNE $0AD1 (loop for all 4 menu items)
C2/0AE3: 28 PLP
C2/0AE4: FA PLX
C2/0AE5: 90 1A BCC $0B01 (Branch if currently Morphed)
C2/0AE7: 08 PHP
C2/0AE8: 20 36 0B JSR $0B36 (Establish new value for Morph supply based on its
previous value and the current Morph timer)
C2/0AEB: A9 FF LDA #$FF
C2/0AED: 8D E2 3E STA $3EE2 (Store null as Morphed character)
C2/0AF0: 9E 04 3B STZ $3B04,X (Set the Morph gauge for this entity to 0)
C2/0AF3: E0 08 CPX #$08 (Compare target number to 8)
C2/0AF5: B0 03 BCS $0AFA (Branch if it's greater (not a character))
C2/0AF7: 20 7D 52 JSR $527D (Update availability of commands on character's
main menu - grey out or enable)
C2/0AFA: C2 20 REP #$20
C2/0AFC: 9C 30 3F STZ $3F30 (morph timer = 0)
C2/0AFF: 28 PLP
C2/0B00: 60 RTS
C2/0B01 unknow
C2/0B01: DA PHX
C2/0B02: 08 PHP
C2/0B03: AD E2 3E LDA $3EE2 (Which target is Morphed)
C2/0B06: 10 2B BPL $0B33 (Exit function if someone is already Morphed)
C2/0B08: AD BB 3E LDA $3EBB
C2/0B0B: 4A LSR
C2/0B0C: 4A LSR
C2/0B0D: 6A ROR
C2/0B0E: B0 23 BCS $0B33 (Exit function if bit 2 of $3EBB is set..
Set for just Phunbaba battle #4 [i.e. Terra's
second Phunbaba encounter])
C2/0B10: 0A ASL (Put Bit 1 into Carry)
C2/0B11: 8E E2 3E STX $3EE2
C2/0B14: 7B TDC
C2/0B15: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0B17: 3A DEC
C2/0B18: 8D 30 3F STA $3F30 (Morph timer = 65535)
C2/0B1B: AE F6 1C LDX $1CF6 (Morph supply)
C2/0B1E: 20 92 47 JSR $4792 (65535 / Morph supply)
C2/0B21: 90 01 BCC $0B24 (Branch if bit 1 of $3EBB not set.
This bit is set in Terra's 2nd Phunbaba battle
[i.e. Phunbaba #4], and lasts afterward. So
little Terra gains some resolve here? ^__^)
C2/0B23: 4A LSR
C2/0B24: 4A LSR
C2/0B25: 4A LSR
C2/0B26: 4A LSR (A = (65535 / Morph supply) / 8 [pre-Phunbaba]
A = (65535 / Morph supply) / 16 [post-Phunbaba] )
C2/0B27: C9 00 08 CMP #$0800
C2/0B2A: 90 03 BCC $0B2F
C2/0B2C: A9 FF 07 LDA #$07FF (this will cap amount to decrement morph time
counter at 2048)
C2/0B2F: 1A INC
C2/0B30: 8D 32 3F STA $3F32 (Amount to decrement morph time counter)
C2/0B33: 28 PLP
C2/0B34: FA PLX
C2/0B35: 60 RTS
C2/0B36 update or set value for morph supply
(Establish new value for Morph supply based on its previous value and
the current Morph timer)
C2/0B36: AD E2 3E LDA $3EE2 (Which target is Morphed)
C2/0B39: 30 0E BMI $0B49 (Exit if no one is Morphed)
C2/0B3B: AD F6 1C LDA $1CF6
C2/0B3E: EB XBA
C2/0B3F: AD 31 3F LDA $3F31
C2/0B42: 20 81 47 JSR $4781 (16-bit A = morph supply * (morph timer DIV 256) )
C2/0B45: EB XBA
C2/0B46: 8D F6 1C STA $1CF6 (morph supply =
(morph supply * (morph timer DIV 256)) DIV 256 )
C2/0B49: 60 RTS
C2/0B4A unknow
C2/0B4A: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0B4C: BD 18 30 LDA $3018,X
C2/0B4F: 0C 2C 3F TSB $3F2C (flag entity as Jumping)
C2/0B52: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/0B54: BD A0 3A LDA $3AA0,X
C2/0B57: 29 9B AND #$9B
C2/0B59: 09 08 ORA #$08
C2/0B5B: 9D A0 3A STA $3AA0,X
C2/0B5E: AC 66 3A LDY $3A66 (get current action queue position?)
C2/0B61: 8A TXA
C2/0B62: D9 20 38 CMP $3820,Y (does queue entry match our current entity?)
C2/0B65: D0 05 BNE $0B6C (if not, branch and move to next entry)
C2/0B67: A9 FF LDA #$FF
C2/0B69: 99 20 38 STA $3820,Y (if there was a match, null out this queue entry)
C2/0B6C: C8 INY (move to next entry)
C2/0B6D: CC 67 3A CPY $3A67
C2/0B70: 90 EF BCC $0B61 (keep looping until position matches next available
queue slot -- i.e., we've checked through the end of
the queue)
C2/0B72: BD 05 32 LDA $3205,X
C2/0B75: 29 7F AND #$7F
C2/0B77: 9D 05 32 STA $3205,X
C2/0B7A: 9E B5 3A STZ $3AB5,X
C2/0B7D: A9 E0 LDA #$E0
C2/0B7F: 9D 2C 32 STA $322C,X (save delay between inputting command and performing it.
iow, how long you spend in the "ready stance." E0h
is the same delay as the Jump command, and its ready
stance constitutes the character being airborne.)
C2/0B82: 60 RTS
C2/0B83 damage modification
Modify Damage, Heal Undead, and Elemental modification
C2/0B83: 08 PHP
C2/0B84: E2 20 SEP #$20
C2/0B86: AD A6 11 LDA $11A6 (Battle Power)
C2/0B89: D0 03 BNE $0B8E (Branch if not 0)
C2/0B8B: 4C 2B 0C JMP $0C2B (Exit function if 0)
C2/0B8E: AD A4 11 LDA $11A4 (Special Byte 2)
C2/0B91: 30 05 BMI $0B98 (Branch if power = factor of HP)
C2/0B93: 20 9E 0C JSR $0C9E (Damage modification)
C2/0B96: 80 03 BRA $0B9B
C2/0B98: 20 87 0D JSR $0D87 (Figure HP based damage)
C2/0B9B: 64 F2 STZ $F2
C2/0B9D: B9 E4 3E LDA $3EE4,Y (Status byte 1 of target)
C2/0BA0: 0A ASL
C2/0BA1: 30 57 BMI $0BFA (Branch if target is Petrify, damage = 0)
C2/0BA3: AD A4 11 LDA $11A4
C2/0BA6: 85 F2 STA $F2 (Store special byte 2 in $F2. what we're looking
at is Bit 1, the Heal flag.)
C2/0BA8: AD A2 11 LDA $11A2
C2/0BAB: 89 08 BIT #$08
C2/0BAD: F0 24 BEQ $0BD3 (Branch if not Invert Damage on Undead)
C2/0BAF: B9 95 3C LDA $3C95,Y
C2/0BB2: 10 0B BPL $0BBF (Branch if not undead)
C2/0BB4: AD AA 11 LDA $11AA
C2/0BB7: 89 82 BIT #$82 (Check if dead or zombie attack)
C2/0BB9: D0 70 BNE $0C2B (Exit if ^)
C2/0BBB: 64 F2 STZ $F2 (Clear heal flag)
C2/0BBD: 80 07 BRA $0BC6
C2/0BBF: B9 E4 3E LDA $3EE4,Y
C2/0BC2: 89 02 BIT #$02 (Check for Zombie status)
C2/0BC4: F0 0D BEQ $0BD3 (Branch if not zombie)
C2/0BC6: AD A4 11 LDA $11A4
C2/0BC9: 89 02 BIT #$02
C2/0BCB: F0 06 BEQ $0BD3 (Branch if not redirection)
C2/0BCD: A5 F2 LDA $F2
C2/0BCF: 49 01 EOR #$01
C2/0BD1: 85 F2 STA $F2 (Toggle heal flag)
C2/0BD3: AD A1 11 LDA $11A1
C2/0BD6: F0 46 BEQ $0C1E (Branch if non-elemental)
C2/0BD8: AD C8 3E LDA $3EC8 (Forcefield nullified elements)
C2/0BDB: 49 FF EOR #$FF
C2/0BDD: 2D A1 11 AND $11A1
C2/0BE0: F0 18 BEQ $0BFA (Set damage to 0 if element nullified)
C2/0BE2: B9 CC 3B LDA $3BCC,Y (Absorbed elements)
C2/0BE5: 2C A1 11 BIT $11A1
C2/0BE8: F0 08 BEQ $0BF2 (branch if none are used in attack)
C2/0BEA: A5 F2 LDA $F2
C2/0BEC: 49 01 EOR #$01
C2/0BEE: 85 F2 STA $F2 (toggle healing flag)
C2/0BF0: 80 2C BRA $0C1E
C2/0BF2: B9 CD 3B LDA $3BCD,Y (Nullified elements)
C2/0BF5: 2C A1 11 BIT $11A1
C2/0BF8: F0 06 BEQ $0C00 (branch if none are used in attack)
C2/0BFA: 64 F0 STZ $F0
C2/0BFC: 64 F1 STZ $F1 (Set damage to 0)
C2/0BFE: 80 1E BRA $0C1E
C2/0C00: B9 E1 3B LDA $3BE1,Y (Elements cut in half)
C2/0C03: 2C A1 11 BIT $11A1
C2/0C06: F0 06 BEQ $0C0E (branch if none are used in attack)
C2/0C08: 46 F1 LSR $F1
C2/0C0A: 66 F0 ROR $F0 (Cut damage in half)
C2/0C0C: 80 10 BRA $0C1E
C2/0C0E: B9 E0 3B LDA $3BE0,Y (Weak elements)
C2/0C11: 2C A1 11 BIT $11A1
C2/0C14: F0 08 BEQ $0C1E (branch if none are used in attack)
C2/0C16: A5 F1 LDA $F1
C2/0C18: 30 04 BMI $0C1E (Don't double damage if over 32768)
C2/0C1A: 06 F0 ASL $F0
C2/0C1C: 26 F1 ROL $F1 (Double damage)
C2/0C1E: AD A9 11 LDA $11A9 (get attack special effect)
C2/0C21: C9 04 CMP #$04
C2/0C23: D0 03 BNE $0C28 (Branch if not Atma Weapon)
C2/0C25: 20 39 0E JSR $0E39 (Atma Weapon damage modification)
C2/0C28: 20 2D 0C JSR $0C2D
C2/0C2B: 28 PLP
C2/0C2C: 60 RTS
C2/0C2D unknow
C2/0C2D: AD A2 11 LDA $11A2
C2/0C30: 4A LSR
C2/0C31: 90 2A BCC $0C5D (Branch if not physical damage)
C2/0C33: AD 82 3A LDA $3A82
C2/0C36: 2D 83 3A AND $3A83
C2/0C39: 10 22 BPL $0C5D (Branch if blocked by Golem or dog)
C2/0C3B: BD E4 3E LDA $3EE4,X
C2/0C3E: 89 02 BIT #$02 (Check for Zombie Status on attacker)
C2/0C40: F0 03 BEQ $0C45 (Branch if no zombie)
C2/0C42: 20 21 0E JSR $0E21 (Poison / Dark status for zombies)
C2/0C45: AD AB 11 LDA $11AB (Status set by attack 2)
C2/0C48: 49 A0 EOR #$A0 (Sleep & Muddled)
C2/0C4A: 29 A0 AND #$A0
C2/0C4C: 39 E5 3E AND $3EE5,Y (Status byte 2)
C2/0C4F: 19 FD 3D ORA $3DFD,Y
C2/0C52: 99 FD 3D STA $3DFD,Y (mark Sleep & Muddled to be cleared from target,
provided it already has the statuses, and
the attack itself isn't trying to inflict or remove
them)
C2/0C55: B9 B9 32 LDA $32B9,Y
C2/0C58: 09 80 ORA #$80
C2/0C5A: 99 B9 32 STA $32B9,Y (Flag target to be released from Control at end of
turn)
C2/0C5D: AD A4 11 LDA $11A4
C2/0C60: 89 02 BIT #$02
C2/0C62: F0 11 BEQ $0C75 (Branch if not redirection)
C2/0C64: 20 ED 0D JSR $0DED (Cap damage/healing based on max HP/MP of drainer,
and remaining HP/MP of drainee)
C2/0C67: DA PHX (save attacker index)
C2/0C68: 5A PHY (save target index)
C2/0C69: 5A PHY
C2/0C6A: 9B TXY (put old attacker index into target index)
C2/0C6B: FA PLX (put old target index into attacker index)
C2/0C6C: 20 2F 36 JSR $362F (save target as attacker's attacker in a counterattack
variable [provided attacker doesn't yet have another
attacker]. reciprocity and all, man.
however, the Carry Flag state passed to this function
seems to be quite arbitrary, particularly if this
is a physical attack [usually being set, but sometimes
not if attacker is a Zombie]. it'll never be set for
magical attacks, which seems suspect as well.)
C2/0C6F: 38 SEC (enforce 9999 cap for redirection for attacker)
C2/0C70: 20 76 0C JSR $0C76
C2/0C73: 7A PLY (restore target index)
C2/0C74: FA PLX (restore attacker index)
C2/0C75: 18 CLC (now enforce 9999 cap for target)
C2/0C76: 5A PHY
C2/0C77: 08 PHP
C2/0C78: 2A ROL
C2/0C79: 45 F2 EOR $F2 (get Carry XOR attack's heal bit)
C2/0C7B: 4A LSR
C2/0C7C: 90 04 BCC $0C82 (branch if:
- we're checking attacker and attack "reverse" drains
[e.g. because target is undead or absorbs element]
- we're checking target and attack damages [includes
draining])
C2/0C7E: 98 TYA
C2/0C7F: 69 13 ADC #$13
C2/0C81: A8 TAY (point to Healing instead of Damage)
C2/0C82: C2 20 REP #$20
C2/0C84: B9 D0 33 LDA $33D0,Y (Damage Taken / Healing Done)
C2/0C87: 1A INC
C2/0C88: F0 01 BEQ $0C8B (if no [i.e. FFFFh] damage, treat as zero)
C2/0C8A: 3A DEC (otherwise, keep as-is)
C2/0C8B: 18 CLC
C2/0C8C: 65 F0 ADC $F0 (add Damage/Healing so far to $F0, which is the lowest of:
- attack damage
- HP of target [or attacker if reverse drain] )
- Max HP - HP of attacker [or target if reverse drain] )
C2/0C8E: B0 05 BCS $0C95 (if total Damage/Healing to this target overflowed,
branch and set it to 9999)
C2/0C90: C9 10 27 CMP #$2710 (If over 9999)
C2/0C93: 90 03 BCC $0C98
C2/0C95: A9 0F 27 LDA #$270F (Truncate Damage to 9999)
C2/0C98: 99 D0 33 STA $33D0,Y (Damage Taken / Healing Done)
C2/0C9A: 28 PLP
C2/0C9C: 7A PLY
C2/0C9D: 60 RTS
C2/0C9E damage modification
Damage modification (Randomness, Row, Self Damage, and more)
C2/0C9E: 08 PHP
C2/0C9F: C2 20 REP #$20
C2/0CA1: AD B0 11 LDA $11B0 (Maximum Damage)
C2/0CA4: 85 F0 STA $F0
C2/0CA6: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/0CA8: AD 14 34 LDA $3414
C2/0CAB: D0 03 BNE $0CB0
C2/0CAD: 4C 3B 0D JMP $0D3B (Exit if $3414 = 0)
C2/0CB0: 20 5A 4B JSR $4B5A (Random number 0 to 255)
C2/0CB3: 09 E0 ORA #$E0 (Set bits 7,6,5; bits 0,1,2,3,4 are random)
C2/0CB5: 85 E8 STA $E8 (Random number [224..255])
C2/0CB7: 20 3D 0D JSR $0D3D (Damage randomness)
C2/0CBA: 18 CLC
C2/0CBB: AD A3 11 LDA $11A3
C2/0CBE: 30 04 BMI $0CC4 (Branch if Concern MP)
C2/0CC0: AD A2 11 LDA $11A2
C2/0CC3: 4A LSR
C2/0CC4: AD A2 11 LDA $11A2
C2/0CC7: 89 20 BIT #$20
C2/0CC9: D0 57 BNE $0D22 (Branch if ignores defense)
C2/0CCB: 08 PHP
C2/0CCC: B9 B9 3B LDA $3BB9,Y (Magic Defense)
C2/0CCF: 90 03 BCC $0CD4 (Branch if concern MP or Magical damage)
C2/0CD1: B9 B8 3B LDA $3BB8,Y (Defense)
C2/0CD4: 1A INC
C2/0CD5: F0 10 BEQ $0CE7 (If = 255)
C2/0CD7: EB XBA
C2/0CD8: AD 82 3A LDA $3A82
C2/0CDB: 2D 83 3A AND $3A83
C2/0CDE: 30 03 BMI $0CE3 (If Blocked by Golem or Dog, defense = 192)
C2/0CE0: A9 C1 LDA #$C1
C2/0CE2: EB XBA
C2/0CE3: EB XBA
C2/0CE4: 3A DEC
C2/0CE5: 49 FF EOR #$FF
C2/0CE7: 85 E8 STA $E8 (= 255 - Defense)
C2/0CE9: 20 3D 0D JSR $0D3D (Multiply damage by (255 - Defense) / 256 ,
then add 1)
C2/0CEC: A3 01 LDA $01,S
C2/0CEE: 4A LSR
C2/0CEF: B9 F8 3E LDA $3EF8,Y (Status byte 3)
C2/0CF2: B0 01 BCS $0CF5 (Branch if physical attack)
C2/0CF4: 0A ASL
C2/0CF5: 0A ASL
C2/0CF6: 10 07 BPL $0CFF (Branch if no safe / shell)
C2/0CF8: A9 AA LDA #$AA
C2/0CFA: 85 E8 STA $E8
C2/0CFC: 20 3D 0D JSR $0D3D (Multiply damage by 170 / 256 , then add 1)
C2/0CFF: 28 PLP
C2/0D00: 90 15 BCC $0D17 (Skip row check if magical attack)
C2/0D02: B9 A1 3A LDA $3AA1,Y
C2/0D05: 89 02 BIT #$02
C2/0D07: F0 04 BEQ $0D0D (Branch if not defending)
C2/0D09: 46 F1 LSR $F1
C2/0D0B: 66 F0 ROR $F0 (Cut damage in half)
C2/0D0D: 89 20 BIT #$20 (Check row)
C2/0D0F: F0 11 BEQ $0D22 (Branch if target in front row)
C2/0D11: 46 F1 LSR $F1
C2/0D13: 66 F0 ROR $F0 (Cut damage in half)
C2/0D15: 80 0B BRA $0D22 (Skip morph if physical attack)
C2/0D17: B9 F9 3E LDA $3EF9,Y
C2/0D1A: 89 08 BIT #$08
C2/0D1C: F0 04 BEQ $0D22 (Branch if not morph)
C2/0D1E: 46 F1 LSR $F1
C2/0D20: 66 F0 ROR $F0 (Cut damage in half)
C2/0D22: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0D24: AD A4 11 LDA $11A4
C2/0D27: 4A LSR
C2/0D28: B0 0A BCS $0D34 (Branch if heal, heal skips self damage theory)
C2/0D2A: C0 08 CPY #$08
C2/0D2C: B0 06 BCS $0D34 (Branch if target is a monster)
C2/0D2E: E0 08 CPX #$08
C2/0D30: B0 02 BCS $0D34 (Branch if attacker is monster)
C2/0D32: 46 F0 LSR $F0 (Cut damage in half if party attacks party)
C2/0D34: A5 F0 LDA $F0
C2/0D36: 20 0B 37 JSR $370B (Increment damage using $BC)
C2/0D39: 85 F0 STA $F0
C2/0D3B: 28 PLP
C2/0D3C: 60 RTS
C2/0D3D damage function
Multiplies damage by $E8 / 256 and adds 1 (Used by damage randomness etc.) C2/0D3D: 08 PHP C2/0D3E: C2 20 REP #$20 (Set 16-bit Accumulator) C2/0D40: A5 F0 LDA $F0 (Load damage) C2/0D42: 20 B7 47 JSR $47B7 (Multiply by randomness byte) C2/0D45: 1A INC (Add 1 to damage) C2/0D46: 85 F0 STA $F0 C2/0D48: 28 PLP C2/0D49: 60 RTS
C2/0D4A atlas armlet and earring function
C2/0D4A: 08 PHP C2/0D4B: AD A4 11 LDA $11A4 (Special Byte 2) C2/0D4E: 4A LSR C2/0D4F: B0 34 BCS $0D85 (Exits function if attack heals) C2/0D51: AD A3 11 LDA $11A3 C2/0D54: 30 04 BMI $0D5A (Branch if concern MP) C2/0D56: AD A2 11 LDA $11A2 (Special Byte 1) C2/0D59: 4A LSR (Check for physical / magic) C2/0D5A: C2 20 REP #$20 (Set 16-bit Accumulator) C2/0D5C: AD B0 11 LDA $11B0 (Max Damage) C2/0D5F: 85 EE STA $EE (Stores damage at $EE) C2/0D61: BD 44 3C LDA $3C44,X (Relic effects) C2/0D64: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/0D66: B0 06 BCS $0D6E (Branch if physical damage unless concerns mp) C2/0D68: 89 02 BIT #$02 C2/0D6A: D0 09 BNE $0D75 (Branch double earrings - add 50% damage) C2/0D6C: EB XBA C2/0D6D: 4A LSR C2/0D6E: 4A LSR C2/0D6F: 90 14 BCC $0D85 (Exits function if not Atlas Armlet / Earring) C2/0D71: 46 EF LSR $EF (Halves damage) C2/0D73: 66 EE ROR $EE C2/0D75: C2 20 REP #$20 (Set 16-bit Accumulator) C2/0D77: A5 EE LDA $EE C2/0D79: 4A LSR (Halves damage) C2/0D7A: 18 CLC C2/0D7B: 6D B0 11 ADC $11B0 (Adds to damage) C2/0D7E: 90 02 BCC $0D82 C2/0D80: 7B TDC C2/0D81: 3A DEC C2/0D82: 8D B0 11 STA $11B0 (Stores result back in damage) C2/0D85: 28 PLP C2/0D86: 60 RTS
C2/0D87 calculate damage for HP based attacks
- Backup XYP
C2/0D87 DA PHX C2/0D88 5A PHY C2/0D89 08 PHP
- Save damage taken
C2/0D8A C2 20 REP #$20 set 16-bit A C2/0D8C B9 D0 33 LDA $33D0,Y damage taken C2/0D8F 1A INC C2/0D90 F0 01 BEQ $0D93 If damage is #$FFFF, set it to #$0000 C2/0D92 3A DEC restore A (DEC nulls INC) C2/0D93 85 EE STA $EE $EE = damage taken
- Set MP based damage if it concerns MP
C2/0D95 E2 20 SEP #$20 set 8-bit A C2/0D97 20 DD 0D JSR $0DDD use MP if concerns MP
- Load spell power
C2/0D9A AD A6 11 LDA $11A6 spell power C2/0D9D 85 E8 STA $E8
- Check to use actual HP or max HP
C2/0D9F A5 B5 LDA $B5 actual command C2/0DA1 C9 01 CMP #$01 Item command C2/0DA3 F0 06 BEQ $0DAB use max HP if item C2/0DA5 AD A2 11 LDA $11A2 C2/0DA8 4A LSR C2/0DA9 4A LSR C2/0DAA 4A LSR check dead xor undead flag C2/0DAB C2 20 REP #$20 set 16-bit A C2/0DAD B0 0B BCS $0DBA use max HP if dead or undead
- Cap actual HP if HP - damage < 0
C2/0DAF 38 SEC C2/0DB0 B9 F4 3B LDA $3BF4,Y actual HP C2/0DB3 E5 EE SBC $EE subtract damage taken C2/0DB5 B0 06 BCS $0DBD C2/0DB7 7B TDC damage is zero C2/0DB8 80 03 BRA $0DBD
- Calculate real damage
C2/0DBA B9 1C 3C LDA $3C1C,Y max HP C2/0DBD 20 CB 0D JSR $0DCB A = (spell power * A / 16) C2/0DC0 48 PHA C2/0DC1 68 PLA C2/0DC2 D0 01 BNE $0DC5 if damage isn't null C2/0DC4 1A INC cap damage to 1 if damage is zero C2/0DC5 85 F0 STA $F0
- Restore PYX and exit
C2/0DC7 28 PLP C2/0DC8 7A PLY C2/0DC9 FA PLX C2/0DCA 60 RTS
C2/0DCB math: spell power * HP / 16
C2/0DCB: 20 B7 47 JSR $47B7 C2/0DCE: A9 03 00 LDA #$0003 C2/0DD1: DA PHX C2/0DD2: AA TAX C2/0DD3: A5 E8 LDA $E8 (Spell Power * HP) C2/0DD5: 46 EA LSR $EA (Cut in half) C2/0DD7: 6A ROR C2/0DD8: CA DEX C2/0DD9: 10 FA BPL $0DD5 (Do 4 times) C2/0DDB: FA PLX C2/0DDC: 60 RTS
C2/0DDD make damage effects MP instead of HP
C2/0DDD: AD A3 11 LDA $11A3 C2/0DE0: 10 0A BPL $0DEC (Branch if not Concern MP) C2/0DE2: 98 TYA C2/0DE3: 18 CLC C2/0DE4: 69 14 ADC #$14 C2/0DE6: A8 TAY C2/0DE7: 8A TXA C2/0DE8: 18 CLC C2/0DE9: 69 14 ADC #$14 C2/0DEB: AA TAX C2/0DEC: 60 RTS
C2/0DED unknow
Set $F0 to lowest of ($F0, HP/MP of target, Max HP/MP - HP/MP of attacker)
If bit 0 of $F2 is set, switch attacker and target
If bit 7 of $B2 is not set, compare only $F0 and HP of target
C2/0DED: DA PHX
C2/0DEE: 5A PHY
C2/0DEF: 08 PHP
C2/0DF0: 20 DD 0D JSR $0DDD (Set to use MP if concern MP)
C2/0DF3: AD 14 34 LDA $3414
C2/0DF6: 10 25 BPL $0E1D (Exit if bit 7 $3414 is 0)
C2/0DF8: C2 20 REP #$20
C2/0DFA: A5 F2 LDA $F2
C2/0DFC: 4A LSR
C2/0DFD: 90 03 BCC $0E02 (branch if not healing target)
C2/0DFF: DA PHX
C2/0E00: BB TYX
C2/0E01: 7A PLY (Switch target and attacker)
C2/0E02: B9 F4 3B LDA $3BF4,Y (HP of target)
C2/0E05: C5 F0 CMP $F0
C2/0E07: B0 02 BCS $0E0B (If HP >= $F0)
C2/0E09: 85 F0 STA $F0
C2/0E0B: A5 B1 LDA $B1
C2/0E0D: 10 0E BPL $0E1D (Branch if top bit of $B2 is clear; it's
cleared by the Drain while Seized used by
Tentacles)
C2/0E0F: 9B TXY (Make attacker the target)
C2/0E10: 38 SEC
C2/0E11: B9 1C 3C LDA $3C1C,Y (Max HP of target)
C2/0E14: F9 F4 3B SBC $3BF4,Y (HP of target)
C2/0E17: C5 F0 CMP $F0
C2/0E19: B0 02 BCS $0E1D (If >= $F0)
C2/0E1B: 85 F0 STA $F0
C2/0E1D: 28 PLP
C2/0E1E: 7A PLY
C2/0E1F: FA PLX
C2/0E20: 60 RTS
C2/0E21 zombie chances to inflict dark or poison
Called if Zombie 1 in 16 chance inflict Dark -OR- 1 in 16 chance inflict Poison C2/0E21: 20 5A 4B JSR $4B5A (Random number 0 to 255) C2/0E24: C9 10 CMP #$10 C2/0E26: B0 04 BCS $0E2C C2/0E28: A9 04 LDA #$04 (will mark Poison status to be set) C2/0E2A: 80 06 BRA $0E32 C2/0E2C: C9 20 CMP #$20 C2/0E2E: B0 F0 BCS $0E20 (Exit function) C2/0E30: A9 01 LDA #$01 (will mark Dark status to be set) C2/0E32: 19 D4 3D ORA $3DD4,Y (Status to set byte 1) C2/0E35: 99 D4 3D STA $3DD4,Y C2/0E38: 60 RTS
C2/0E39 atma weapon damage
C2/0E39: 08 PHP
C2/0E3A: DA PHX
C2/0E3B: 5A PHY
C2/0E3C: 9B TXY
C2/0E3D: B9 F5 3B LDA $3BF5,Y (HP / 256)
C2/0E40: 1A INC
C2/0E41: EB XBA
C2/0E42: B9 18 3B LDA $3B18,Y (Level)
C2/0E45: 20 81 47 JSR $4781 (Level * ((HP / 256) + 1))
C2/0E48: BE 1D 3C LDX $3C1D,Y (Max HP / 256)
C2/0E4B: E8 INX
C2/0E4C: 20 92 47 JSR $4792 ((Level * ((HP / 256) + 1)) / ((Max HP / 256) + 1))
C2/0E4F: 85 E8 STA $E8
C2/0E51: C2 20 REP #$20
C2/0E53: A5 F0 LDA $F0 (load damage so far)
C2/0E55: 20 B7 47 JSR $47B7 (24-bit $E8 = $E8 * damage)
C2/0E58: A9 05 00 LDA #$0005
C2/0E5B: 20 D1 0D JSR $0DD1 (Divide 24-bit Damage in $E8 by 64. [note that
calculation operates on 4 bytes])
C2/0E5E: 1A INC (+1)
C2/0E5F: 85 F0 STA $F0 (save final damage)
(note that we're assuming damage fit into 16 bits,
which should be true provided Level wasn't hacked
past 99.)
C2/0E61: C9 F5 01 CMP #$01F5 (501)
C2/0E64: 90 0D BCC $0E73 (branch if < 501)
C2/0E66: A2 5B LDX #$5B (put index for alternate, bigger weapon
graphic, into X)
C2/0E68: C9 E9 03 CMP #$03E9 (1001)
C2/0E6B: 90 01 BCC $0E6E (branch if < 1001)
C2/0E6D: E8 INX (make graphic bigger yet)
C2/0E6E: 86 B7 STX $B7 (save graphic index)
C2/0E70: 20 BB 35 JSR $35BB (Change Atma Weapon length)
C2/0E73: 7A PLY
C2/0E74: FA PLX
C2/0E75: 28 PLP
C2/0E76: 60 RTS
C2/0E77 JSL: equipment check function
C2/0E77: DA PHX
C2/0E78: 5A PHY
C2/0E79: 8B PHB
C2/0E7A: 08 PHP
C2/0E7B: E2 30 SEP #$30 (Set 8-bit Accumulator, X and Y)
C2/0E7D: 48 PHA
C2/0E7E: 29 0F AND #$0F
C2/0E80: A9 7E LDA #$7E
C2/0E82: 48 PHA
C2/0E83: AB PLB (set Data Bank register to 7E)
C2/0E84: 68 PLA
C2/0E85: A2 3E LDX #$3E
C2/0E87: 9E A0 11 STZ $11A0,X
C2/0E8A: CA DEX
C2/0E8B: 10 FA BPL $0E87 (zero out our temporary item bytes)
C2/0E8D: 1A INC
C2/0E8E: EB XBA
C2/0E8F: A9 25 LDA #$25 (37 bytes of info per character, see Tashibana's
ff6zst.txt for details. this block is documented as
starting at $1600, but the INC above means X is boosted
by 37 -- perhaps to avoid a negative X later -- so the
base addy is 15DB)
C2/0E91: 20 81 47 JSR $4781
C2/0E94: C2 10 REP #$10 (Set 16-bit X and Y)
C2/0E96: AA TAX
C2/0E97: BD DB 15 LDA $15DB,X (get sprite, which doubles as character index??)
C2/0E9A: EB XBA
C2/0E9B: A9 16 LDA #$16 (22 startup bytes per character)
C2/0E9D: 20 81 47 JSR $4781
C2/0EA0: DA PHX
C2/0EA1: AA TAX (X indexes character startup block)
C2/0EA2: BF AA 7C ED LDA $ED7CAA,X (get character Battle Power)
C2/0EA6: 8D AC 11 STA $11AC
C2/0EA9: 8D AD 11 STA $11AD (store it in both hands)
C2/0EAC: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0EAE: BF AB 7C ED LDA $ED7CAB,X (character Defense and Magic Defense)
C2/0EB2: 8D BA 11 STA $11BA
C2/0EB5: BF AD 7C ED LDA $ED7CAD,X (character Evade and MBlock)
C2/0EB9: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/0EBB: 8D A8 11 STA $11A8 (save Evade here)
C2/0EBE: EB XBA
C2/0EBF: 8D AA 11 STA $11AA (save MBlock here)
C2/0EC2: BF B5 7C ED LDA $ED7CB5,X (character start level info)
C2/0EC6: 29 03 AND #$03
C2/0EC8: 49 03 EOR #$03
C2/0ECA: 1A INC
C2/0ECB: 1A INC
C2/0ECC: 8D DC 11 STA $11DC (invert and add 2. this gives you
5 - (bottom two bits of Level byte) ,
the amount to add to the character's
"Run Success" variable.)
C2/0ECF: FA PLX (X indexes into character info block again)
C2/0ED0: A0 06 00 LDY #$0006 (point to Vigor item in character info)
C2/0ED3: BD F5 15 LDA $15F5,X
C2/0ED6: 99 A0 11 STA $11A0,Y ($11A6 = Vigor, 11A4 = Speed, 11A2 = Stamina,
11A0 = Mag Pwr)
C2/0ED9: E8 INX
C2/0EDA: 88 DEY
C2/0EDB: 88 DEY
C2/0EDC: 10 F5 BPL $0ED3 (loop 4 times)
C2/0EDE: BD EB 15 LDA $15EB,X (get character Status 1)
C2/0EE1: 85 FE STA $FE (save it, it'll be used for tests with Imp equip)
C2/0EE3: A0 05 00 LDY #$0005 (point to last relic slot?)
C2/0EE6: BD FB 15 LDA $15FB,X
C2/0EE8: 99 C6 11 STA $11C6,Y (save the item #)
C2/0EEC: 20 9A 0F JSR $0F9A (load item data for a slot)
C2/0EEF: CA DEX
C2/0EF0: 88 DEY
C2/0EF1: 10 F3 BPL $0EE6 (loop for all 6 equipment+relic slots)
C2/0EF3: BD ED 15 LDA $15ED,X (get top byte of Maximum MP)
C2/0EF6: 29 3F AND #$3F (zero out top 2 bits, so MP can't exceed 16383)
C2/0EF8: 85 FF STA $FF (store top byte of Max MP.
Note: X would be -2 here had the extra 37 not been
added earlier. i don't think indexed addressing modes
are signed or allow "wrapping", so that was a good
precaution)
C2/0EFA: A9 40 LDA #$40 (first boost we will check is MP + 50%, then lower %)
C2/0EFC: 20 7D 0F JSR $0F7D (jump off to handle % MP boosts from equipment)
C2/0EFF: 05 FF ORA $FF
C2/0F01: 9D ED 15 STA $15ED,X (store boost in highest 2 bits of MP)
C2/0F04: BD E9 15 LDA $15E9,X (get top byte of Maximum HP)
C2/0F07: 29 3F AND #$3F (zero out top 2 bits, so HP can't exceed 16383)
C2/0F09: 85 FF STA $FF (store top byte of Max HP)
C2/0F0B: A9 08 LDA #$08
C2/0F0D: 20 7D 0F JSR $0F7D (go check HP + 50% boost, then lower %)
C2/0F10: 05 FF ORA $FF
C2/0F12: 9D E9 15 STA $15E9,X (store boost in highest 2 bits of HP)
C2/0F15: A2 0A 00 LDX #$000A
C2/0F18: BD A1 11 LDA $11A1,X (did MBlock/Evade/Vigor/Speed/Stamina/MagPwr
exceed 255 with equipment boosts?)
C2/0F1B: F0 09 BEQ $0F26 (if not, look at the next stat)
C2/0F1D: 0A ASL (if the topmost bit of the stat is set, it's negative
thanks to horrid equipment. so bring it up to Zero)
C2/0F1E: 7B TDC
C2/0F1F: B0 02 BCS $0F23 (if the topmost bit wasn't set, the stat is just big)
C2/0F21: A9 FF LDA #$FF (.. in which case we bring it down to 255)
C2/0F23: 9D A0 11 STA $11A0,X
C2/0F26: CA DEX
C2/0F27: CA DEX
C2/0F28: 10 EE BPL $0F18 (loop for all aforementioned stats)
C2/0F2A: AE CE 11 LDX $11CE (call a function pointer depending on what
is in each hand)
C2/0F2D: FC 47 0F JSR ($0F47,X)
C2/0F30: AD D7 11 LDA $11D7
C2/0F33: 10 0D BPL $0F42 (if Boost Vigor bit isn't set, exit function)
C2/0F35: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/0F37: AD A6 11 LDA $11A6
C2/0F3A: 4A LSR
C2/0F3B: 18 CLC
C2/0F3C: 6D A6 11 ADC $11A6
C2/0F3F: 8D A6 11 STA $11A6 (if Boost Vigor was set, add 50% to Vigor)
C2/0F42: 28 PLP
C2/0F43: AB PLB
C2/0F44: 7A PLY
C2/0F45: FA PLX
C2/0F46: 6B RTL
C2/0F47: 67 0F (Do nothing) (shouldn't be called, as i can't get shields in both hands)
C2/0F49: 61 0F (2nd hand is occupied by weapon, 1st hand holds nonweapon)
(so 2nd hand will strike. i.e. it retains some Battle Power)
C2/0F4B: 68 0F (1st hand is occupied by weapon, 2nd hand holds nonweapon)
(so 1st hand will strike)
C2/0F4D: 6F 0F (1st and 2nd hand are both occupied by weapon)
C2/0F4F: 61 0F (2nd hand is empty, 1st hand holds nonweapon)
(so 2nd hand will strike)
C2/0F51: 67 0F (Do nothing) (filler.. shouldn't be called, contradictory 2nd hand)
C2/0F53: 6B 0F (2nd hand is empty, 1st is occupied by weapon)
(so 1st hand will strike, Gauntlet-ized if applicable)
C2/0F55: 67 0F (Do nothing) (filler.. shouldn't be called, contradictory 2nd hand)
C2/0F57: 68 0F (1st hand is empty, 2nd hand holds nonweapon)
(so 1st hand will strike)
C2/0F59: 64 0F (1st hand is empty, 2nd hand occupied by weapon)
(so 2nd hand will strike, Gauntlet-ized if applicable)
C2/0F5B: 67 0F (Do nothing) (filler.. shouldn't be called, contradictory 1st hand)
C2/0F5D: 67 0F (Do nothing) (filler.. shouldn't be called, contradictory 1st hand)
C2/0F5F: 68 0F (1st and 2nd hand both empty)
(so might as well strike with 1st hand)
(view C2/10B2 to see how the bits for each hand were set)
C2/0F61 unknow
C2/0F61: 20 74 0F JSR $0F74 C2/0F64: 9C AC 11 STZ $11AC (clear Battle Power for 1st hand) C2/0F67: 60 RTS
C2/0F68 unknow
C2/0F68: 20 74 0F JSR $0F74 C2/0F6B: 9C AD 11 STZ $11AD (clear Battle Power for 2nd hand) C2/0F6E: 60 RTS
(NOTE: C2/0F6F is only called if you have weapons in both hands, which means that's the ONLY situation where the Genji Glove effect is cleared. So you'll do full damage with each strike if you have two weapons, but have it reduced by 1/4 if you have zero or one weapon. This is widely acknowledged as ass-backwards; common sense tells you that 1 weapon should hardly be more cumbersome than 2... Nor should a magic glove make gripping one a tall feat. I suspect Square was thrown by their own byte $11CF, as "set effect to be cleared" sounds like an oxymoron. They were probably trying to *enable* the genji effect below (after all, TSB usually _does_ _enable_ things). At least that's what my forthcoming patch will assume... ^__^ ) C2/0F6F: A9 10 LDA #$10 (Genji Glove Effect) C2/0F71: 0C CF 11 TSB $11CF (Sets Genji Glove effect to be cleared) C2/0F74: A9 40 LDA #$40 C2/0F76: 1C DA 11 TRB $11DA (turn off Gauntlet effect for 1st hand) C2/0F79: 1C DB 11 TRB $11DB (turn off Gauntlet effect for 2nd hand) C2/0F7C: 60 RTS
C2/0F7D unknow
(11D5 = 01: Raise Attack Damage 10: Raise HP by 12.5% 02: Raise Magic Damage 20: Raise MP by 25% 04: Raise HP by 25% 40: Raise MP by 50% 08: Raise HP by 50% 80: Raise MP by 12.5% . from yousei's doc) C2/0F7D: 2C D5 11 BIT $11D5 C2/0F80: F0 03 BEQ $0F85 C2/0F82: A9 80 LDA #$80 (if bit is set, store 50% boost) C2/0F84: 60 RTS
C2/0F85: 4A LSR C2/0F86: 2C D5 11 BIT $11D5 C2/0F89: F0 03 BEQ $0F8E C2/0F8B: A9 40 LDA #$40 (if bit is set, store 25% boost) C2/0F8D: 60 RTS
C2/0F8E: 0A ASL C2/0F8F: 0A ASL C2/0F90: 2C D5 11 BIT $11D5 C2/0F93: F0 03 BEQ $0F98 C2/0F95: A9 C0 LDA #$C0 (if bit is set, store 12.5% boost) C2/0F97: 60 RTS
C2/0F98: 7B TDC (if none of the bits were set, store 0% boost) C2/0F99: 60 RTS
C2/0F9A load item data into memory
C2/0F9A: DA PHX
C2/0F9B: 5A PHY (Y = equip/relic slot, 0 to 5?)
C2/0F9C: EB XBA
C2/0F9D: A9 1E LDA #$1E
C2/0F9F: 20 81 47 JSR $4781 (multiply index by size of item data block)
C2/0FA2: AA TAX
C2/0FA3: BF 05 50 D8 LDA $D85005,X (field effects)
C2/0FA7: 0C DF 11 TSB $11DF
C2/0FAA: C2 20 REP #$20 (Set 16-bit accumulator)
C2/0FAC: BF 06 50 D8 LDA $D85006,X
C2/0FB0: 0C D2 11 TSB $11D2 (status bytes 1 and 2 protection)
C2/0FB3: BF 08 50 D8 LDA $D85008,X
C2/0FB7: 0C D4 11 TSB $11D4 (11D4 = equipment status byte 3,
11D5 = raise attack damage, raise magic damage,
and HP and MP % boosts)
C2/0FBA: BF 0A 50 D8 LDA $D8500A,X
(battle effects 1 and "status effects 2". latter is nothing to do with status ailments.
11D6:
01: Increase Preemptive Atk chance 10: Sketch -> Control
02: Prevent Back/Pincer attacks 20: Slot -> GP Rain
(this won't work for battles
where back/pincer are forced)
04: Fight -> Jump 40: Steal -> Capture
08: Magic -> X-Magic 80: Jump continuously
11D7:
01: Increase Steal Rate 10: 100% Hit Rate
02: -- 20: Halve MP Consumption
04: Increase Sketch Rate 40: Reduce MP Consumption to 1
08: Increase Control Rate 80: Raise Vigor . yousei's doc)
C2/0FBE: 0C D6 11 TSB $11D6
C2/0FC1: BF 0C 50 D8 LDA $D8500C,X (battle effects 2 and 3)
C2/0FC5: 0C D8 11 TSB $11D8
(11D8:
01: Fight -> X-Fight 10: Can equip a weapon in each hand
02: Randomly Counter Attacks 20: Wearer can equip heavy armor
04: Increases chance of evading attack 40: Wearer protects those with low HP
08: Attack with two hands 80:
11D9:
01: Casts Shell when HP is low 10: Doubles Gold received
02: Casts Safe when HP is low 20:
04: Casts Rflect when HP is low 40:
08: Doubles Experience received 80: Makes body cold
C2/0FC8: BF 10 50 D8 LDA $D85010,X (Vigor+ / Speed+ / Stamina+ / MagPwr+ , by ascending address)
C2/0FCC: A0 06 00 LDY #$0006
C2/0FCF: 48 PHA
C2/0FD0: 29 0F 00 AND #$000F (isolate bottom nibble)
C2/0FD3: 89 08 00 BIT #$0008 (if top bit of stat boost is set, adjustment will be negative)
C2/0FD6: F0 04 BEQ $0FDC (if not, branch)
C2/0FD8: 49 F7 FF EOR #$FFF7 (create a signed 16-bit negative value)
C2/0FDB: 1A INC
C2/0FDC: 18 CLC
C2/0FDD: 79 A0 11 ADC $11A0,Y
C2/0FE0: 99 A0 11 STA $11A0,Y (make adjustment to stat, ranging from -7 to +7)
($11A6 = Vigor, 11A4 = Speed, 11A2 = Stamina, 11A0 = Mag Pwr)
C2/0FE3: 68 PLA
C2/0FE4: 4A LSR
C2/0FE5: 4A LSR
C2/0FE6: 4A LSR
C2/0FE7: 4A LSR (get next highest nibble)
C2/0FE8: 88 DEY
C2/0FE9: 88 DEY
C2/0FEA: 10 E3 BPL $0FCF (loop for all 4 stats)
C2/0FEC: BF 1A 50 D8 LDA $D8501A,X (Evade/MBlock byte)
C2/0FF0: DA PHX
C2/0FF1: 48 PHA
C2/0FF2: 29 0F 00 AND #$000F (isolate evade)
C2/0FF5: 0A ASL
C2/0FF6: AA TAX (evade nibble * 2, turn into pointer)
C2/0FF7: BF 05 11 C2 LDA $C21105,X (get actual evade boost/reduction of item)
C2/0FFB: 18 CLC
C2/0FFC: 6D A8 11 ADC $11A8
C2/0FFF: 8D A8 11 STA $11A8 (add it to other evade boosts)
C2/1002: 68 PLA
C2/1003: 29 F0 00 AND #$00F0 (isolate mblock)
C2/1006: 4A LSR
C2/1007: 4A LSR
C2/1008: 4A LSR
C2/1009: AA TAX (mblock nibble * 2, turn into pointer)
C2/100A: BF 05 11 C2 LDA $C21105,X (get actual mblock boost/reduction of item)
C2/100E: 18 CLC
C2/100F: 6D AA 11 ADC $11AA
C2/1012: 8D AA 11 STA $11AA (add it to other mblock boosts)
C2/1015: FA PLX
C2/1016: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/1018: BF 14 50 D8 LDA $D85014,X (get weapon battle power / armor defense power)
C2/101C: EB XBA
C2/101D: BF 02 50 D8 LDA $D85002,X (get top byte of equippable chars?)
C2/1021: 0A ASL
C2/1022: 0A ASL (carry = Specs active when Imp?)
C2/1023: A5 FE LDA $FE (Character Status Byte 1)
C2/1025: B0 02 BCS $1029 (branch if imp-activated)
C2/1027: 49 20 EOR #$20 (flip Imp status)
C2/1029: 89 20 BIT #$20 (character has Imp status?)
C2/102B: D0 03 BNE $1030
C2/102D: A9 01 LDA #$01 (if you're an Imp and specs aren't Imp-activated,
defense/battle power = 1. or if you're not an Imp
and the specs are Imp-activated, battle/defense
power = 1)
C2/102F: EB XBA
C2/1030: EB XBA (if imp-activation and imp status match, put the
original Battle/Defense Power back in bottom of A)
(note that Item #255 has a Battle Power of 10, so bare hands will actually be
stronger than Imp Halberd on a non-Imp)
C2/1031: 85 FD STA $FD
C2/1033: BF 00 50 D8 LDA $D85000,X (item type)
C2/1037: 29 07 AND #$07 (isolate classification)
C2/1039: 3A DEC
C2/103A: F0 76 BEQ $10B2 (if it's a weapon, branch)
C2/103C: BF 19 50 D8 LDA $D85019,X
C2/1040: 0C BC 11 TSB $11BC (equipment status byte 2)
C2/1043: BF 0F 50 D8 LDA $D8500F,X (50% resist elements)
C2/1047: EB XBA
C2/1048: BF 18 50 D8 LDA $D85018,X (weak to elements)
C2/104C: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/104E: 0C B8 11 TSB $11B8 (bottom = weak elements, top = 50% resist elements)
C2/1051: BF 16 50 D8 LDA $D85016,X
C2/1055: 0C B6 11 TSB $11B6 (bottom = absorbed elements, top = nullified elements)
C2/1058: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/105A: 18 CLC
C2/105B: A5 FD LDA $FD (get equipment Defense Power)
C2/105D: 6D BA 11 ADC $11BA (add it into Defense so far)
C2/1060: 90 02 BCC $1064
C2/1062: A9 FF LDA #$FF
C2/1064: 8D BA 11 STA $11BA (if defense exceeds 255, make it 255)
C2/1067: 18 CLC
C2/1068: BF 15 50 D8 LDA $D85015,X (get equipment Magic Defense)
C2/106C: 6D BB 11 ADC $11BB (add it into MagDef so far)
C2/106F: 90 02 BCC $1073
C2/1071: A9 FF LDA #$FF
C2/1073: 8D BB 11 STA $11BB (if magic defense exceeds 255, make it 255)
C2/1076: 7A PLY
C2/1077: A9 02 LDA #$02
C2/1079: 1C D5 11 TRB $11D5 (clear "raise magic damage" bit in Item Bonuses --
raise fight, raise magic, HP + %, MP + %)
C2/107C: F0 08 BEQ $1086
C2/107E: 0C D7 11 TSB $11D7 (if Earring effect is set in current equipment slot, set
it in Item Special 2:
boost steal, single Earring, boost sketch, boost control,
sniper sight, gold hairpin, economizer, vigor + 50%)
C2/1081: F0 03 BEQ $1086
C2/1083: 0C D5 11 TSB $11D5 (if Earring effect had also been set by other equipment
slots, set it again in item bonuses, where it will actually
represent _double_ Earring, even though the initial data
byte would have it set even for a lone Earring)
(if all this crazy bit swapping seems convuluted, keep in
mind that $11D5 isn't RELOADED for each equipment slot;
it's ADDED to via the TSB at C2/0FB7. thus, we must clear
the Earring bit in $11D5 for each of the 6 equip slots if
we wish to see whether the CURRENT slot gives us the
Earring effect.)
C2/1086: 7B TDC
C2/1087: BF 1B 50 D8 LDA $D8501B,X (item byte 1B, special action)
C2/108B: 99 BE 11 STA $11BE,Y
C2/108E: 89 0C BIT #$0C (shield animation for blocked physical/magic attacks
or weapon parry?)
C2/1090: F0 1E BEQ $10B0 (if none of above, branch)
C2/1092: 48 PHA (save old Byte 1B)
C2/1093: 29 03 AND #$03 (isolate bottom 2 bits. for a given item:
bit 0 = big weapon parry anim.
bit 1 = "any" shield block, all except cursed shld.
both = zephyr cape. neither = small weapon parry
bit 2 = physical block: shield, weapon parry, or zephyr cape)
bit 3 = magical shield block. shields only? )
C2/1095: AA TAX (put Acc in X. Following loop gives us 2^X)
C2/1096: 7B TDC (clear Acc)
C2/1097: 38 SEC (set carry flag)
C2/1098: 2A ROL (rotate carry into lowest bit of Acc)
C2/1099: CA DEX (decrement X, which was 0-3)
C2/109A: 10 FC BPL $1098 (loop if X>=0)
C2/109C: EB XBA
C2/109D: 68 PLA (retrieve item byte 1B)
C2/109E: 89 04 BIT #$04
C2/10A0: F0 05 BEQ $10A7 (branch if physical block animation not set)
C2/10A2: EB XBA
C2/10A3: 0C D0 11 TSB $11D0 (if one of above was set, store our 2^X value)
C2/10A6: EB XBA
C2/10A7: 89 08 BIT #$08
C2/10A9: F0 05 BEQ $10B0 (if no magic attack block for shield, branch)
C2/10AB: EB XBA
C2/10AC: 0C D1 11 TSB $11D1 (if there was, store our 2^X value)
C2/10AF: EB XBA
C2/10B0: FA PLX
C2/10B1: 60 RTS