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 C25
< Final Fantasy VI | ROM map
Jump to navigation
Jump to search
This is a sub-page of Final Fantasy VI/ROM map.
C2/500B set regen,poison,seizure or phantasm damage
- check if monsters are alive
C2/500B AD 77 3A LDA $3A77 number of monsters alive C2/500E F0 CF BEQ $4FDF exit if no monsters are alive
- allows new queue for this entity
C2/5010 B9 A1 3A LDA $3AA1,Y C2/5013 29 EF AND #$EF clear bit 4 C2/5015 99 A1 3A STA $3AA1,Y
- check if enemies are present?
C2/5018 B9 A0 3A LDA $3AA0,Y C2/501B 89 10 BIT #$10 C2/501D D0 C0 BNE $4FDF exit
- setup attack data
C2/501F 20 8A 29 JSR $298A init attack data C2/5022 A9 90 LDA #$90 C2/5024 14 B3 TRB $B3 set ignore clear and allow damage increment C2/5026 A9 12 LDA #$12 mimic command C2/5028 85 B5 STA $B5 set command C2/502A A9 68 LDA #$68 C2/502C 8D A2 11 STA $11A2 set: ignore defense, no split damage, reverse damage on undead
- adjust attack data for regen attack or poison,seizure,phantasm attack
C2/502F 4E A4 11 LSR $11A4 shift bits for later addition C2/5032 A5 B6 LDA $B6 (#$02=regen, #$04=poison,#$40=seizure or phantasm) C2/5034 4A LSR C2/5035 4A LSR is it poison? C2/5036 2E A4 11 ROL $11A4 set to heal for regen; damage for poison, seizure, phantasm C2/5039 4A LSR C2/503A 90 15 BCC $5051 Branch if not poison
- calculate damage increment for poison
C2/503C B9 24 3E LDA $3E24,Y amount to increment damage C2/503F 85 BD STA $BD C2/5041 1A INC C2/5042 1A INC C2/5043 C9 0F CMP #$0F maximum damage increment C2/5045 90 02 BCC $5049 don't cap if under 15 C2/5047 A9 0E LDA #$0E C2/5049 99 24 3E STA $3E24,Y cap to 15
- set damage as poison type
C2/504C A9 08 LDA #$08 C2/504E 8D A1 11 STA $11A1 set element as poison
- calculate damage
C2/5051 B9 40 3B LDA $3B40,Y stamina C2/5054 85 E8 STA $E8 C2/5056 C2 20 REP #$20 set 16-bit A C2/5058 B9 1C 3C LDA $3C1C,Y max HP C2/505B 20 B7 47 JSR $47B7 A = (max HP * stamina / 256) C2/505E 4A LSR C2/505F 4A LSR A = A / 4 C2/5060 C9 FE CMP #$00FE is damage under 254? C2/5063 E2 20 SEP #$20 set 8-bit A C2/5065 90 02 BCC $5069 don't cap if under 254 C2/5067 A9 FC LDA #$FC cap damage to 253 C2/5069 69 02 ADC #$02 C2/506B 8D A6 11 STA $11A6 store damage C2/506E BB TYX C2/506F 4C 67 31 JMP $3167 execute regen,poison,seizure,phantasm hit
C2/5072 monster script #$F2
Monster command script command #$F2
($B8 and bottom 7 bits of $B9 = new formation to change to)
C2/5072: A5 B8 LDA $B8 (Byte 2)
C2/5074: 8D E0 11 STA $11E0 (Monster formation, byte 1)
C2/5077: 0E 47 3A ASL $3A47
C2/507A: A5 B9 LDA $B9 (Byte 3. top bit: 0 = monsters get Max HP. 1 = retain HP and
Max HP from current formation.)
C2/507C: 49 80 EOR #$80
C2/507E: 0A ASL
C2/507F: 6E 47 3A ROR $3A47
C2/5082: 4A LSR
C2/5083: 8D E1 11 STA $11E1 (Monster formation, byte 2)
C2/5086: 20 E8 30 JSR $30E8
C2/5089: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/508B: A2 0A LDX #$0A
C2/508D: 9E A8 3A STZ $3AA8,X (clear enemy presence flag)
C2/5090: 9E 54 3E STZ $3E54,X
C2/5093: 7B TDC
C2/5094: 3A DEC
C2/5095: 9D 01 20 STA $2001,X (save FFFFh [null] as enemy #)
C2/5098: A9 BC FF LDA #$FFBC
C2/509A: 9D 0C 32 STA $320C,X (aka $3204,X)
C2/509E: CA DEX
C2/509F: CA DEX
C2/50A0: 10 EB BPL $508D (loop for all 6 enemies)
C2/50A2: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/50A4: 20 E1 2E JSR $2EE1
C2/50A7: 20 91 43 JSR $4391
C2/50AA: 20 9B 06 JSR $069B
C2/50AD: 20 3F 08 JSR $083F
C2/50B0: 20 B9 4A JSR $4AB9
C2/50B3: 20 C9 26 JSR $26C9
C2/50B6: 20 3A 2E JSR $2E3A
C2/50B9: AD 75 3A LDA $3A75
C2/50BC: 8D 2B 3A STA $3A2B
C2/50BF: AD 1E 20 LDA $201E
C2/50C2: 8D 2A 3A STA $3A2A
C2/50C5: A5 B6 LDA $B6
C2/50C7: EB XBA
C2/50C8: A9 12 LDA #$12
C2/50CA: 4C BF 62 JMP $62BF
C2/50CD command #$25
C2/50CD: A9 02 LDA #$02 C2/50CF: 80 02 BRA $50D3 C2/50D1: A9 10 LDA #$10 (Command #$21 - F3 Command script enters here) C2/50D3: EB XBA C2/50D4: A5 B6 LDA $B6 C2/50D6: EB XBA C2/50D7: 9C 2A 3A STZ $3A2A (Sets final damage to 0) C2/50DA: 4C BF 62 JMP $62BF
C2/50DD command 27: display scan info
C2/50DD: A6 B6 LDX $B6
C2/50DF: A9 FF LDA #$FF
C2/50E1: 8D 72 2D STA $2D72
C2/50E4: A9 02 LDA #$02
C2/50E6: 8D 6E 2D STA $2D6E
C2/50E9: 9C 36 2F STZ $2F36
C2/50EC: 9C 37 2F STZ $2F37
C2/50EF: 9C 3A 2F STZ $2F3A
C2/50F2: BD 18 3B LDA $3B18,X (Level)
C2/50F5: 8D 35 2F STA $2F35
C2/50F8: A9 34 LDA #$34
C2/50FA: 8D 6F 2D STA $2D6F
C2/50FD: A9 04 LDA #$04
C2/50FF: 20 11 64 JSR $6411
C2/5102: C2 20 REP #$20
C2/5104: BD F4 3B LDA $3BF4,X (Current HP)
C2/5107: 8D 35 2F STA $2F35
C2/510A: BD 1C 3C LDA $3C1C,X (Max HP)
C2/510D: 8D 38 2F STA $2F38
C2/5110: E2 20 SEP #$20
C2/5112: A9 30 LDA #$30
C2/5114: 8D 6F 2D STA $2D6F
C2/5117: A9 04 LDA #$04
C2/5119: 20 11 64 JSR $6411
C2/511C: C2 20 REP #$20
C2/511E: BD 08 3C LDA $3C08,X (Current MP)
C2/5121: 8D 35 2F STA $2F35
C2/5124: BD 30 3C LDA $3C30,X (Max MP)
C2/5127: 8D 38 2F STA $2F38
C2/512A: E2 20 SEP #$20
C2/512C: F0 0A BEQ $5138
C2/512E: A9 31 LDA #$31
C2/5130: 8D 6F 2D STA $2D6F
C2/5133: A9 04 LDA #$04
C2/5135: 20 11 64 JSR $6411
C2/5138: A9 15 LDA #$15
C2/513A: 8D 6F 2D STA $2D6F
C2/513D: BD E0 3B LDA $3BE0,X
C2/5140: 85 EE STA $EE (Weak elements)
C2/5142: BD E1 3B LDA $3BE1,X
C2/5145: 1D CC 3B ORA $3BCC,X
C2/5148: 1D CD 3B ORA $3BCD,X
C2/514B: 14 EE TRB $EE (subtract Absorbed, Nullified, and Resisted
elements, because those supercede weaknesses)
C2/514D: A9 01 LDA #$01
C2/514F: 24 EE BIT $EE
C2/5151: F0 07 BEQ $515A (branch if not weak to current element)
C2/5153: 48 PHA
C2/5154: A9 04 LDA #$04
C2/5156: 20 11 64 JSR $6411
C2/5159: 68 PLA
C2/515A: EE 6F 2D INC $2D6F (point to next element name)
C2/515D: 0A ASL (look at next elemental bit)
C2/515E: 90 EF BCC $514F (loop 8 times, as there's 8 elements)
C2/5160: 60 RTS
C2/5161 check and remove status based on time
Remove Stop, Reflect, Freeze, or Sleep when time is up
C2/5161: AE 7D 3A LDX $3A7D
C2/5164: 20 8A 29 JSR $298A (Clear special effect, magic power, etc.)
C2/5167: A9 12 LDA #$12
C2/5169: 85 B5 STA $B5 (Set command to Mimic)
C2/516B: A9 10 LDA #$10
C2/516D: 14 B0 TRB $B0
C2/516F: 46 B8 LSR $B8
C2/5171: 90 05 BCC $5178 (Branch if bit 0 of $B8 is 0)
C2/5173: A9 10 LDA #$10
C2/5175: 0C AC 11 TSB $11AC (Attack clears Stop)
C2/5178: 46 B8 LSR $B8
C2/517A: 90 05 BCC $5181 (Branch if bit 1 of $B8 is 0)
C2/517C: A9 80 LDA #$80
C2/517E: 0C AC 11 TSB $11AC (Attack clears Reflect)
C2/5181: 46 B8 LSR $B8
C2/5183: 90 05 BCC $518A (Branch if bit 2 of $B8 is 0)
C2/5185: A9 02 LDA #$02
C2/5187: 0C AD 11 TSB $11AD (Attack clears Freeze)
C2/518A: 46 B8 LSR $B8
C2/518C: 90 12 BCC $51A0 (Branch if bit 3 of $B8 is 0)
C2/518E: A9 80 LDA #$80
C2/5190: 3D E5 3E AND $3EE5,X
C2/5193: F0 0B BEQ $51A0 (Branch if not sleeping)
C2/5195: 0C AB 11 TSB $11AB (Attack clears Sleep)
C2/5198: A9 02 LDA #$02
C2/519A: 85 B5 STA $B5 (Set command to Magic)
C2/519C: A9 78 LDA #$78
C2/519E: 85 B6 STA $B6 (Set spell to Tapir. Note this does *not*
use the spell _data_ of the Tapir from Mog's
dance, so it won't have the same effect)
C2/51A0: A9 04 LDA #$04
C2/51A2: 0C A4 11 TSB $11A4 (Set to lift statuses)
C2/51A5: 4C 67 31 JMP $3167
C2/51A8 command 2C
C2/51A8: AD 7D 3A LDA $3A7D C2/51AB: 4A LSR C2/51AC: EB XBA C2/51AD: A9 0E LDA #$0E C2/51AF: 4C BF 62 JMP $62BF
C2/51B2 command 2D: drain from being seized
C2/51B2: B9 A1 3A LDA $3AA1,Y
C2/51B5: 29 EF AND #$EF
C2/51B7: 99 A1 3A STA $3AA1,Y (Clear bit 4 of $3AA1,Y)
C2/51BA: BB TYX
C2/51BB: 20 8A 29 JSR $298A (Clear special effect, magic power, etc.)
C2/51BE: 9C AE 11 STZ $11AE (Set Magic Power to 0)
C2/51C1: A9 10 LDA #$10
C2/51C3: 8D AF 11 STA $11AF (Set Level to 16)
C2/51C6: 8D A6 11 STA $11A6 (Set Spell Power to 16)
C2/51C9: A9 28 LDA #$28
C2/51CB: 8D A2 11 STA $11A2 (Sets to only ignore defense, heal undead)
C2/51CE: A9 02 LDA #$02
C2/51D0: 8D A3 11 STA $11A3 (Sets to Not reflectable only)
C2/51D3: 0C A4 11 TSB $11A4 (Sets Redirection)
C2/51D6: 0C 46 3A TSB $3A46 (set flag to let this attack target a Seized
entity, who is normally untargetable)
C2/51D9: A9 80 LDA #$80
C2/51DB: 14 B2 TRB $B2 (Indicate a special type of drainage. Normal drain
is capped at the lowest of: drainee's Current HP/MP
and drainer's Max - Current HP/MP. This one will
ignore the latter, meaning it's effectively just a
damage attack if the drainer's [or undead target's]
HP/MP is full.)
C2/51DD: A9 12 LDA #$12
C2/51DF: 85 B5 STA $B5 (Sets command to Mimic)
C2/51E1: 4C 7B 31 JMP $317B
C2/51E4 pointers: command F5
C2/51E4: E0 4F C2/51E6: CB 4F C2/51E8: EC 4F C2/51EA: CE 4F C2/51EC: C2 4F C2/51EE: FF 4F
C2/51F0 unknow
X = Highest bit in A that is 1 (bit 0 = 0, 1 = 1, etc.) C2/51F0: A2 00 LDX #$00 C2/51F2: 4A LSR C2/51F3: F0 03 BEQ $51F8 (Exit if all bits are 0) C2/51F5: E8 INX C2/51F6: 80 FA BRA $51F2 C2/51F8: 60 RTS
C2/51F9 unknow
Y = (Number of highest target set in A) * 2
(0, 2, 4, or 6 for characters. 8, 10, 12, 14, 16, or 18 for monsters.)
(Remember that
$3018 : Holds $01 for character 1, $02 for character 2, $04 for character 3,
$08 for character 4
$3019 : Holds $01 for monster 1, $02 for monster 2, etc. )
C2/51F9: DA PHX
C2/51FA: 08 PHP
C2/51FB: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/51FD: E2 10 SEP #$10 (Set 8-bit Index Registers)
C2/51FF: A2 12 LDX #$12
C2/5201: 3C 18 30 BIT $3018,X
C2/5204: D0 04 BNE $520A (Exit loop if bit set)
C2/5206: CA DEX
C2/5207: CA DEX
C2/5208: 10 F7 BPL $5201 (loop through all 10 targets if necessary)
C2/520A: 9B TXY
C2/520B: 28 PLP
C2/520C: FA PLX
C2/520D: 60 RTS
C2/520E math: X = number of bits of A
Sets X to number of bits set in A C2/520E: A2 00 LDX #$00 C2/5210: 4A LSR C2/5211: 90 01 BCC $5214 C2/5213: E8 INX C2/5214: D0 FA BNE $5210 C2/5216: 60 RTS
C2/5217 math: division by 8
X = A / 8 (including carry, so A is effectively 9 bits)
A = 1 if (A % 8) = 0, 2 if (A % 8) = 1, 4 if (A % 8) = 2,
8 if (A % 8) = 3, 16 if (A % 8) = 4, etc.
Carry flag = cleared
C2/5217: 5A PHY
C2/5218: 48 PHA
C2/5219: 6A ROR
C2/521A: 4A LSR
C2/521B: 4A LSR
C2/521C: AA TAX
C2/521D: 68 PLA
C2/521E: 29 07 AND #$07
C2/5220: A8 TAY
C2/5221: A9 00 LDA #$00
C2/5223: 38 SEC
C2/5224: 2A ROL
C2/5225: 88 DEY
C2/5226: 10 FC BPL $5224
C2/5228: 7A PLY
C2/5229: 60 RTS
C2/522A randomly picks a bit set in A
C2/522A: 5A PHY C2/522B: 08 PHP C2/522C: C2 20 REP #$20 (Set 16-bit Accumulator) C2/522E: 85 EE STA $EE C2/5230: 20 0E 52 JSR $520E (X = number of bits set in A) C2/5233: 8A TXA C2/5234: F0 0E BEQ $5244 (Exit if no bits set) C2/5236: 20 65 4B JSR $4B65 (0 to A - 1) C2/5239: AA TAX C2/523A: 38 SEC C2/523B: 7B TDC C2/523C: 2A ROL C2/523D: 24 EE BIT $EE C2/523F: F0 FB BEQ $523C C2/5241: CA DEX C2/5242: 10 F8 BPL $523C C2/5244: 28 PLP C2/5245: 7A PLY C2/5246: 60 RTS
C2/5247 set front, back, pincer or side attack
(Determine if front, back, pincer, or side attack)
(X = #$10 when called for choosing type of attack formation)
(A = Which types to allow, bit 7 = side, 6 = pincer, 5 = back, 4 = normal/front)
(Returns attack formation in X: 0 = Front/Normal, 1 = Back, 2 = Pincer, 3 = Side)
(Also used for determining which attack Umaro should use)
(X = #$00 for no Rage Ring or Blizzard Orb, #$04 for Rage Ring, #$08 for Blizzard Orb,
#$0C for both)
(A = Which attacks to allow, bit 7 = Normal attack, 6 = Charge/Tackle, 5 = Storm,
4 = Throw character. Bits 6 and 7 are always set by caller. Note that masking
in A is unneeded [it could very well have all bits set] because the 4 different
data structures at C2/5269 will exclude certain attacks by having FFh
[read: 00h] for them.)
(Returns Umaro attack type in X: 0 = Throw character, 1 = Storm, 2 = Charge/Tackle,
3 = Normal attack)
C2/5247: 5A PHY
C2/5248: EB XBA
C2/5249: A9 00 LDA #$00
C2/524B: A0 03 LDY #$03
C2/524D: EB XBA
C2/524E: 0A ASL
C2/524F: EB XBA
C2/5250: 90 04 BCC $5256 (Branch if type not allowed)
C2/5252: 7F 69 52 C2 ADC $C25269,X (Add chance to get that type. note
that Carry is always set going into
this instruction.)
C2/5256: 99 FC 00 STA $00FC,Y (build an array that determines which ranges
of random numbers will result in which
Umaro attacks or Battle formations)
C2/5259: E8 INX
C2/525A: 88 DEY
C2/525B: 10 F0 BPL $524D (Check for all 4 types)
C2/525D: 20 65 4B JSR $4B65 (random #: 0 to A - 1 , where A is
the denominator of our probabilities,
as explained in the data below.)
C2/5260: A2 04 LDX #$04
C2/5262: CA DEX
C2/5263: D5 FC CMP $FC,X
C2/5265: B0 FB BCS $5262 (Check next type if A >= $FC,X)
C2/5267: 7A PLY
C2/5268: 60 RTS (Return X = Battle type / Attack to use)
C2/5269 data: chance of Umaro's attacks
(NOTE: Carry is always set when accessing the data at C2/5269 through C2/527C, so effective values are all 1 greater than those listed below [with FFh wrapping to 00h]. This is quite deliberate, as the sum of the values must fit in a single byte.) (Each effective value is the Numerator of the probability of getting a certain type of Umaro attack, in the order: Normal attack, Charge/Tackle, Storm, Throw character) (Denominator of the probability is the sum of the effective values.) C2/5269: 9E 5F FF FF (No Rage Ring or Blizzard Orb) C2/526D: 5E 3F FF 5F (Rage Ring) C2/5271: 5E 3F 5F FF (Blizzard Orb) C2/5275: 3E 3F 3F 3F (Both)
C2/5279 data: chance of type of encounter
(Each effective value is the Numerator of probability of getting a certain type of attack formation, in the order: Side, Pincer, Back, Normal/Front) (Denominator of the probability is the sum of the effective values, excluding those of formations that were skipped at C2/5250 due to not being allowed.) C2/5279: 1E 07 07 CF (For choosing type of battle)
C2/527D enable or disable commands
(Gray out or enable character commands based on various criteria, such as: whether
current equipment supports them, whether the character is inflicted with Imp or
Mute, and whether they've accumulated enough Magic Points to Morph.
This function also enables Offering to change the aiming of Fight and Capture.)
C2/527D: DA PHX
C2/527E: 08 PHP
C2/527F: C2 30 REP #$30 (Set 16-bit A, X and Y)
C2/5281: 9B TXY
C2/5282: BF 4A 54 C2 LDA $C2544A,X (Get address of character's menu)
C2/5286: AA TAX
C2/5287: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/5289: B9 18 30 LDA $3018,Y
C2/528C: 0C 58 3A TSB $3A58 (flag this character's main menu to be redrawn
right away)
C2/528F: B9 E4 3E LDA $3EE4,Y
C2/5292: 29 20 AND #$20
C2/5294: 85 EF STA $EF (if Imp status possessed, turn on Bit 5 of $EF.
if not, the variable is set to 0.)
C2/5296: B9 A4 3B LDA $3BA4,Y (weapon properties, right hand)
C2/5299: 19 A5 3B ORA $3BA5,Y (merge with weapon properties, left hand)
C2/529C: 49 FF EOR #$FF (invert)
C2/529E: 29 82 AND #$82
C2/52A0: 04 EF TSB $EF (if neither hand supports Runic, set Bit 7.
if neither hand supports SwdTech, set Bit 1.)
C2/52A2: A9 04 LDA #$04
C2/52A4: 85 EE STA $EE (counter variable.. we're going to check
4 menu slots in all)
C2/52A6: DA PHX (push address of character's current menu slot)
C2/52A7: 38 SEC (mark menu slot to be disabled)
C2/52A8: 7B TDC (clear 16-bit A)
C2/52A9: BD 00 00 LDA $0000,X (get command # in current menu slot)
C2/52AC: 30 2D BMI $52DB (branch if slot empty)
C2/52AE: 48 PHA (push command #)
C2/52AF: 18 CLC (mark menu slot to be enabled)
C2/52B0: A5 EF LDA $EF
C2/52B2: 89 20 BIT #$20 (are they an Imp?)
C2/52B4: F0 0D BEQ $52C3 (branch if not)
C2/52B6: A3 01 LDA $01,S
C2/52B8: 0A ASL (command # * 2)
C2/52B9: AA TAX
C2/52BA: BF 00 FE CF LDA $CFFE00,X (table of command info)
C2/52BE: 89 04 BIT #$04 (is command supported while Imped?)
C2/52C0: D0 01 BNE $52C3 (branch if so)
C2/52C2: 38 SEC (mark menu slot to be disabled)
C2/52C3: 68 PLA (fetch command #)
C2/52C4: B0 15 BCS $52DB (if menu slot is disabled at this point,
don't bother with our next checks)
(This next loop sees if our current command is one that needs special code to assess
its menu availability -- graying it if unavailable -- or another property, such as
its aiming. If so, a special function is called for the command.)
C2/52C6: A2 07 00 LDX #$0007
C2/52C9: DF E9 52 C2 CMP $C252E9,X (does our current command match one whose menu
availability or aiming can vary?)
C2/52CD: D0 08 BNE $52D7 (if not, compare it to next command in table)
C2/52CF: 8A TXA
C2/52D0: 0A ASL
C2/52D1: AA TAX
C2/52D2: FC F1 52 JSR ($52F1,X) (call special function for command)
C2/52D5: 80 04 BRA $52DB (we've gotten a match, so there's no need to
compare our current command against rest of list)
C2/52D7: CA DEX
C2/52D8: 10 EF BPL $52C9 (there are 8 possible commands that need
special checks)
C2/52DA: 18 CLC (if there was no match, default to enabling the
menu slot)
C2/52DB: FA PLX
C2/52DC: 7E 01 00 ROR $0001,X (2nd byte of current menu slot will have Bit 7 set
if the slot should be grayed out and unavailable.
iow, Carry = 1 -> grayed. Carry = 0 -> enabled.)
C2/52DF: E8 INX
C2/52E0: E8 INX
C2/52E1: E8 INX (point to next slot in character's menu)
C2/52E2: C6 EE DEC $EE
C2/52E4: D0 C0 BNE $52A6 (repeat process for all 4 menu slots)
C2/52E6: 28 PLP
C2/52E7: FA PLX
C2/52E8: 60 RTS
C2/52E9 data: commands to check for disabling
(Data - commands that can potentially get grayed out on the menu in battle, or have a property like their aiming altered.) C2/52E9: 03 (Morph) C2/52EA: 0B (Runic) C2/52EB: 07 (SwdTech) C2/52EC: 0C (Lore) C2/52ED: 17 (X-Magic) C2/52EE: 02 (Magic) C2/52EF: 06 (Capture) C2/52F0: 00 (Fight)
C2/52F1 data: commands to check for alteration
(Data - addresses of functions to check whether above command should be enabled, disabled, or otherwise modified on battle menu) C2/52F1: 26 53 (Morph) C2/52F3: 22 53 (Runic) C2/52F5: 1D 53 (SwdTech) C2/52F7: 14 53 (Lore) C2/52F9: 14 53 (X-Magic) C2/52FB: 14 53 (Magic) C2/52FD: 01 53 (Capture) C2/52FF: 01 53 (Fight)
C2/5301 capture and fight adjustments
(For Capture and Fight menu slots)
C2/5301: B9 58 3C LDA $3C58,Y (Check for offering)
C2/5304: 4A LSR
C2/5305: 90 0C BCC $5313 (Exit if no Offering)
C2/5307: C2 21 REP #$21 (Set 16-bit Accumulator. Clear Carry to enable
menu slot.)
C2/5309: A3 03 LDA $03,S
C2/530B: AA TAX (get address of character's current menu slot)
C2/530C: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/530E: A9 4E LDA #$4E
C2/5310: 9D 02 00 STA $0002,X (update aiming byte: Cursor start on enemy,
Auto select one party, Auto select both parties
[in this case, that means you'll target both enemy
clumps in a Pincer], and One side only.)
C2/5313: 60 RTS
C2/5314 lore, magic and x-magic adjustments
(For Lore, X-Magic, and Magic menu slots) C2/5314: B9 E5 3E LDA $3EE5,Y C2/5317: 89 08 BIT #$08 (is character Muted?) C2/5319: F0 01 BEQ $531C (branch if not) C2/531B: 38 SEC (if they are, mark menu slot to be disabled?) C2/531C: 60 RTS
C2/531D sword tech adjustments
(For SwdTech menu slot)
C2/531D: A5 EF LDA $EF
C2/531F: 4A LSR
C2/5320: 4A LSR (Carry = Bit 1, which was set in function C2/527D)
C2/5321: 60 RTS (if it was set, menu slot will be disabled..
if it wasn't, slot is enabled)
C2/5322 runic adjustments
(For Runic menu slot)
C2/5322: A5 EF LDA $EF
C2/5324: 0A ASL (Carry = Bit 7, which was set in function C2/527D)
C2/5325: 60 RTS (if it was set, menu slot will be disabled..
if it wasn't, slot is enabled)
C2/5326 morph adjustments
(For Morph menu slot)
C2/5326: A9 0F LDA #$0F
C2/5328: CD F6 1C CMP $1CF6 (compare to Morph supply)
C2/532B: 60 RTS (if Morph supply isn't at least 16, menu slot will
be disabled.. if it's >=16, slot is enabled)
C2/532C change commands before battle
(Change character commands when wearing MagiTek armor or visiting Fanatics' Tower.
Change commands based on relics, such as Fight becoming Jump, or Steal becoming Capture.
Blank or retain certain commands, depending on whether they should be available -- e.g.
no known dances means no Dance command.)
(Zero character MP if they have no Lore command, no Magic/X-Magic with at least one spell
learned, and no Magic/X-Magic with an Esper equipped.)
C2/532C: DA PHX
C2/532D: 08 PHP
C2/532E: C2 30 REP #$30 (Set 16-bit A, X, and Y)
C2/5330: BC 10 30 LDY $3010,X (get offset to character info block)
C2/5333: BF 4A 54 C2 LDA $C2544A,X (get address of character's menu)
C2/5337: 8F 81 21 00 STA $002181 (this means that future writes to $00218n in this function
will modify that character's menu?)
C2/533B: B9 16 16 LDA $1616,Y (1st and 2nd menu slots)
C2/533E: 85 FC STA $FC
C2/5340: B9 18 16 LDA $1618,Y (3rd and 4th menu slots)
C2/5343: 85 FE STA $FE
C2/5345: B9 14 16 LDA $1614,Y (out of battle Status Bytes 1 and 2; correspond
to in-battle Status Bytes 1 and 4)
C2/5348: E2 30 SEP #$30 (Set 8-bit A, X, and Y)
C2/534A: 89 08 BIT #$08 (does character have MagiTek?)
C2/534C: D0 06 BNE $5354 (branch if so)
C2/534E: AD BB 3E LDA $3EBB (Fanatics' Tower? must verify this.)
C2/5351: 4A LSR
C2/5352: 90 49 BCC $539D (branch if neither MagiTek nor Fanatics' Tower)
C2/5354: BD D8 3E LDA $3ED8,X (get character index)
C2/5357: EB XBA
C2/5358: A2 03 LDX #$03 (point to 4th menu slot)
C2/535A: B5 FC LDA $FC,X (get command in menu slot)
C2/535C: C9 01 CMP #$01
C2/535E: F0 3A BEQ $539A (if Item, skip to next slot)
C2/5360: C9 12 CMP #$12
C2/5362: F0 36 BEQ $539A (if Mimic, skip to next slot)
C2/5364: EB XBA (retrieve character index)
C2/5365: C9 0B CMP #$0B
C2/5367: D0 08 BNE $5371 (branch if not Gau)
C2/5369: EB XBA (get command again)
C2/536A: C9 10 CMP #$10
C2/536C: D0 02 BNE $5370 (branch if not Rage)
C2/536E: A9 00 LDA #$00 (load Fight command into A so that Gau's Rage will get replaced
by MagiTek too. why not just replace "BNE $5370 / LDA #$00"
with "BEQ formerly_$5376" ?? you got me..)
C2/5370: EB XBA
C2/5371: EB XBA (once more, command is in bottom of A, character index in top)
C2/5372: C9 00 CMP #$00 (Fight?)
C2/5374: D0 04 BNE $537A (branch if not. if it is Fight, we'll replace it with MagiTek)
C2/5376: A9 1D LDA #$1D
C2/5378: 80 06 BRA $5380 (go store MagiTek command in menu slot)
C2/537A: C9 02 CMP #$02
C2/537C: F0 02 BEQ $5380 (if Magic, branch.. which just keeps Magic as command?
rewriting it seems inefficient, unless i'm missing
something.)
C2/537E: A9 FF LDA #$FF (empty command)
C2/5380: 95 FC STA $FC,X (update this menu slot)
C2/5382: AD BB 3E LDA $3EBB (Fanatics' Tower? must verify this.)
C2/5385: 4A LSR
C2/5386: 90 12 BCC $539A (branch if not in the tower)
C2/5388: B5 FC LDA $FC,X (get menu slot again)
C2/538A: C9 02 CMP #$02
C2/538C: F0 08 BEQ $5396 (branch if Magic command, emptying slot.)
C2/538E: C9 1D CMP #$1D (MagiTek? actually, this is former Fight or Gau+Rage.)
C2/5390: D0 06 BNE $5398 (branch if not)
C2/5392: A9 02 LDA #$02
C2/5394: 80 02 BRA $5398 (save Magic as command)
C2/5396: A9 FF LDA #$FF (empty command)
C2/5398: 95 FC STA $FC,X (update menu slot)
C2/539A: CA DEX
C2/539B: 10 BD BPL $535A (loop for all 4 slots)
C2/539D: 7B TDC (clear 16-bit A)
C2/539E: 85 F8 STA $F8
C2/53A0: 8F 83 21 00 STA $002183
C2/53A4: A8 TAY (Y = 0)
C2/53A5: B9 FC 00 LDA $00FC,Y (get command from menu slot)
C2/53A8: A2 04 LDX #$04
C2/53AA: 48 PHA
C2/53AB: A9 04 LDA #$04
C2/53AD: 85 EE STA $EE (start checking Bit 2 of variable $11D6)
C2/53AF: BF 52 54 C2 LDA $C25452,X (commands that can be changed FROM)
C2/53B3: C3 01 CMP $01,S (is current command one of those commands?)
C2/53B5: D0 0D BNE $53C4 (branch if not)
C2/53B7: AD D6 11 LDA $11D6 (check Battle Effects 1 byte.
Bit 2 = Fight -> Jump, Bit 3 = Magic -> X-Magic,
Bit 4 = Sketch -> Control, Bit 5 = Slot -> GP Rain,
Bit 6 = Steal -> Capture)
C2/53BA: 24 EE BIT $EE
C2/53BC: F0 06 BEQ $53C4
C2/53BE: BF 57 54 C2 LDA $C25457,X (commands to change TO)
C2/53C2: 83 01 STA $01,S (replace command on stack)
C2/53C4: 06 EE ASL $EE (will check the next highest bit of $11D6
in our next iteration)
C2/53C6: CA DEX
C2/53C7: 10 E6 BPL $53AF (loop for all 5 possible commands that can be
converted)
(This next loop sees if our current command is one that needs special code to assess
its menu availability -- blanking it if unavailable -- or do some other tests. If so,
a special function is called for the command.)
C2/53C9: A3 01 LDA $01,S (get current command)
C2/53CB: A2 05 LDX #$05
C2/53CD: DF 68 54 C2 CMP $C25468,X (is it one of the commands that can be blanked from menu
or have other miscellaneous crap done?)
C2/53D1: D0 08 BNE $53DB (branch if not)
C2/53D3: 8A TXA
C2/53D4: 0A ASL
C2/53D5: AA TAX (X = X * 2)
C2/53D6: FC 5C 54 JSR ($545C,X) (call special function for command)
C2/53D9: 80 03 BRA $53DE (we've gotten a match, so there's no need to
compare our current command against rest of list)
C2/53DB: CA DEX
C2/53DC: 10 EF BPL $53CD (there are 6 possible commands that need
special checks)
C2/53DE: 68 PLA (restore command #, which may've been nulled by our
C2/545C special function)
C2/53DF: 8F 80 21 00 STA $002180 (save command # in first menu byte)
C2/53E3: 8F 80 21 00 STA $002180 (save command # again in second menu byte.. all i know
about this byte is that the top bit will be set if the
menu option is unavailable [blank or gray] )
C2/53E7: 0A ASL
C2/53E8: AA TAX (X = command * 2, will let us index a command table)
C2/53E9: 7B TDC (clear 16-bit A)
C2/53EA: B0 04 BCS $53F0 (branch if command # was negative. this will put
zero into the menu aiming)
C2/53EC: BF 01 FE CF LDA $CFFE01,X (get command's aiming)
C2/53F0: 8F 80 21 00 STA $002180 (store it in a third menu byte)
C2/53F4: C8 INY
C2/53F5: C0 04 CPY #$04 (loop for all 4 menu slots)
C2/53F7: D0 AC BNE $53A5
C2/53F9: 46 F8 LSR $F8 (Carry gets set if character has Magic/X-Magic command
and at least one spell known, Magic/X-Magic and an
Esper equipped, or if they simply have Lore.)
C2/53FB: B0 0B BCS $5408
C2/53FD: A3 02 LDA $02,S (retrieve the X value originally passed to the function.
iow, the index of the party member whose menu is being
examined)
C2/53FF: AA TAX
C2/5400: C2 20 REP #$20 (Set 16-bit A)
C2/5402: 9E 08 3C STZ $3C08,X (zero MP)
C2/5405: 9E 30 3C STZ $3C30,X (zero max MP)
C2/5408: 28 PLP
C2/5409: FA PLX
C2/540A: 60 RTS
C2/540B morph command before battle
C2/540B: A9 04 LDA #$04
C2/540D: 2C BC 3E BIT $3EBC (set after retrieving Terra from Zozo --
allows Morph command)
C2/5410: F0 22 BEQ $5434 (if not set, go null out command)
C2/5412: 2C BB 3E BIT $3EBB (set only for Phunbaba battle #4 [i.e. Terra's second
Phunbaba encounter])
C2/5415: F0 21 BEQ $5438 (if not Phunbaba, just keep command enabled)
C2/5417: A3 05 LDA $05,S (get the X value originally passed to function C2/532C.
iow, the index of the party member whose menu is being
examined)
C2/5419: AA TAX
C2/541A: BD E9 3D LDA $3DE9,X
C2/541D: 09 08 ORA #$08
C2/541F: 9D E9 3D STA $3DE9,X (Cause attack to set Morph)
C2/5422: A9 FF LDA #$FF
C2/5424: 8D F6 1C STA $1CF6 (set Morph supply to maximum)
C2/5427: 80 0B BRA $5434 (by nulling Morph command in menu, we'll stop Terra from
Morphing again and from Reverting?)
C2/5429 magic and x-magic command before battle
(Magic and X-Magic menu entry)
(Blank out Magic/X-Magic menu if no spells are known and no Esper is equipped)
C2/5429: A5 F6 LDA $F6 (# of spells learnt?)
C2/542B: D0 18 BNE $5445 (if some are, branch and set a flag)
C2/542D: A5 F7 LDA $F7 (index of Esper equipped. this value starts with 0
for Ramuh, and the order matches the Espers' order in
the spell list. FFh means nothing's equipped)
C2/542F: 1A INC
C2/5430: D0 13 BNE $5445 (branch if an Esper equipped)
C2/5432: D0 04 BNE $5438 (Dance and Leap jump here. obviously, this branch
is never taken if we called this function for Magic
or X-Magic.)
C2/5434: A9 FF LDA #$FF
C2/5436: 83 03 STA $03,S (replace current command with empty)
C2/5438: 60 RTS
C2/5439 dance entry
(Dance menu entry) C2/5439: AD 4C 1D LDA $1D4C (bitfield of known Dances) C2/543C: 80 F4 BRA $5432 (if none are, menu entry will be nulled after branch)
C2/543E leap entry
(Leap menu entry) C2/543E: AD E4 11 LDA $11E4 C2/5441: 89 02 BIT #$02 (is Leap available?) C2/5443: 80 ED BRA $5432 (if it's not, menu entry will be nulled after branch)
C2/5445 lore entry
(Lore menu entry)
C2/5445: A9 01 LDA #$01
C2/5447: 04 F8 TSB $F8 (this will stop character's Current MP and Max MP from
getting zeroed in calling function. Lore always does
this, whereas Magic and X-Magic have conditions..
Also note that Lore never checks whether the menu command
should be available, as Strago knows 3 Lores at startup)
C2/5449: 60 RTS
(Data - addressed by index of character onscreen -- 0,2,4, or 6) (Points to each of their menus, which are 4 entries, 3 bytes per entry.) C2/544A: 2E 20 C2/544C: 3A 20 C2/544E: 46 20 C2/5450: 52 20
C2/5452 data: commands to be replaced by relics
(Data - commands that can be replaced with other commands thanks to Relics) C2/5452: 05 (Steal) C2/5453: 0F (Slot) C2/5454: 0D (Sketch) C2/5455: 02 (Magic) C2/5456: 00 (Fight)
C2/5457 data: commands to replace commands at C2/5452
(Data - commands that can replace above commands due to Relics) C2/5457: 06 (Capture) C2/5458: 18 (GP Rain) C2/5459: 0E (Control) C2/545A: 17 (X-Magic) C2/545B: 16 (Jump)
C2/545C pointers: adjust commands
(Pointers - functions to remove commands from in-battle menu, or to make miscellaneous adjustments) C2/545C: 0B 54 (Morph) C2/545E: 3E 54 (Leap) C2/5460: 39 54 (Dance) C2/5462: 29 54 (Magic) C2/5464: 29 54 (X-Magic) C2/5466: 45 54 (Lore)
(Data - commands that can be removed from menu in some circumstances, or otherwise need special functions.) C2/5468: 03 (Morph) C2/5469: 11 (Leap) C2/546A: 13 (Dance) C2/546B: 02 (Magic) C2/546C: 17 (X-Magic) C2/546D: 0C (Lore)
C2/546E unknow
C2/546E: 08 PHP C2/546F: C2 30 REP #$30 (Set 16-bit Accumulator, 16-bit X and Y) C2/5471: A0 AD 2B LDY #$2BAD C2/5474: A9 01 00 LDA #$0001 C2/5477: 8D 75 2E STA $2E75 C2/547A: A2 06 00 LDX #$0006 C2/547D: 5A PHY C2/547E: BC 10 30 LDY $3010,X (get offset to character info block) C2/5481: B9 20 16 LDA $1620,Y (get 2nd Arm equipment) C2/5484: 7A PLY C2/5485: 20 CD 54 JSR $54CD C2/5488: CA DEX C2/5489: CA DEX C2/548A: 10 F1 BPL $547D (loop for all 4 characters) C2/548C: A2 06 00 LDX #$0006 C2/548F: 5A PHY C2/5490: BC 10 30 LDY $3010,X (get offset to character info block) C2/5493: B9 1F 16 LDA $161F,Y (get 1st Arm equipment) C2/5496: 7A PLY C2/5497: 20 CD 54 JSR $54CD C2/549A: CA DEX C2/549B: CA DEX C2/549C: 10 F1 BPL $548F (loop for all 4 characters) C2/549E: A2 FF 00 LDX #$00FF C2/54A1: BD 69 19 LDA $1969,X (get item quantity) C2/54A4: 8D 75 2E STA $2E75 C2/54A7: BD 69 18 LDA $1869,X (get item) C2/54AA: 20 CD 54 JSR $54CD C2/54AD: CA DEX C2/54AE: 10 F1 BPL $54A1 (loop for all 256 items) C2/54B0: E2 30 SEP #$30 (Set 8-bit Accumulator, 8-bit X and Y) C2/54B2: 7B TDC C2/54B3: A8 TAY C2/54B4: B9 69 18 LDA $1869,Y (get item in first slot) C2/54B7: C9 A3 CMP #$A3 C2/54B9: 90 0D BCC $54C8 (if it's < 163 [NoiseBlaster], branch) C2/54BB: E9 A3 SBC #$A3 (get a Tool index, where NoiseBlaster = 0, etc) C2/54BD: C9 08 CMP #$08 C2/54BF: B0 07 BCS $54C8 (if it's >= 171 [iow, not a tool], branch) C2/54C1: AA TAX C2/54C2: 20 57 1E JSR $1E57 C2/54C5: 0C 9B 3A TSB $3A9B (Set bit N for Tool N) C2/54C8: C8 INY C2/54C9: D0 E9 BNE $54B4 (loop for all 256 item slots) C2/54CB: 28 PLP C2/54CC: 60 RTS
C2/54CD unknow
C2/54CD: DA PHX C2/54CE: 20 DC 54 JSR $54DC C2/54D1: A2 76 2E LDX #$2E76 C2/54D4: A9 04 00 LDA #$0004 C2/54D7: 44 7E 7E MVP $7E,$7E C2/54DA: FA PLX C2/54DB: 60 RTS
C2/54DC unknow
C2/54DC: DA PHX
C2/54DD: 08 PHP
C2/54DE: C2 10 REP #$10 (Set 16-bit X and Y)
C2/54E0: E2 20 SEP #$20 (set 8-bit Accumulator)
C2/54E2: 48 PHA
C2/54E3: A9 80 LDA #$80
C2/54E5: 8D 73 2E STA $2E73 (assume item is unusable/unselectable (?) in battle)
C2/54E8: A9 FF LDA #$FF
C2/54EA: 8D 76 2E STA $2E76 (assume item can't be equipped by any onscreen characters)
C2/54ED: 68 PLA
C2/54EE: 8D 72 2E STA $2E72 (save the Item #)
C2/54F1: C9 FF CMP #$FF (is it item #255, aka Empty?)
C2/54F3: F0 51 BEQ $5546 (if so, Exit function)
C2/54F5: EB XBA
C2/54F6: A9 1E LDA #$1E
C2/54F8: 20 81 47 JSR $4781 (Multiply by 30, size of item block)
C2/54FB: AA TAX
C2/54FC: BF 0E 50 D8 LDA $D8500E,X (Get Item targeting)
C2/5500: 8D 74 2E STA $2E74
C2/5503: BF 00 50 D8 LDA $D85000,X (Get Item type)
( Item Type:
00: Tool 04: Hat | 10: Can be thrown
01: Weapon 05: Relic | 20: Usable as an item in battle
02: Armor 06: Item | 40: Usable on the field (Items only)
03: Shield )
C2/5507: 48 PHA
C2/5508: 48 PHA
C2/5509: 0A ASL
C2/550A: 0A ASL (item type * 4)
C2/550B: 29 80 AND #$80 (isolate whether Usable as item in battle)
C2/550D: 1C 73 2E TRB $2E73 (clear corresponding bit)
C2/5510: 68 PLA (get unshifted item type)
C2/5511: 0A ASL
C2/5512: 29 20 AND #$20 (isolate can be thrown)
C2/5514: 0C 73 2E TSB $2E73 (set corresponding bit)
C2/5517: 7B TDC
C2/5518: 68 PLA (get unshifted item type)
C2/5519: 29 07 AND #$07 (isolate classification)
C2/551B: DA PHX
C2/551C: AA TAX
C2/551D: BF 49 55 C2 LDA $C25549,X (get a value indexed by item type)
C2/5521: FA PLX
C2/5522: 0A ASL (multiply by 2)
C2/5523: 0C 73 2E TSB $2E73 (turn on corresponding bits)
C2/5526: B0 1E BCS $5546 (if top bit was set, branch to end of function.
only Weapon, Shield and Item classifications have
it unset.)
(maybe this controls whether an Item is selectable
under a given character's Item menu?)
(!? why should items of Classification Item ever reach here?! )
C2/5528: C2 21 REP #$21 (Set 16-bit Accumulator, clear carry)
C2/552A: 64 EE STZ $EE
C2/552C: BF 01 50 D8 LDA $D85001,X (Get Item's equippable characters)
C2/5530: A2 06 00 LDX #$0006
C2/5533: 3C 20 3A BIT $3A20,X ($3A20,X has bit Z set, where Z is the actual Character #
of the current onscreen character indexed by X. don't
think $3A20 is defined for characters >= 0Eh)
C2/5536: D0 01 BNE $5539 (branch if character can equip the item)
C2/5538: 38 SEC (the current onscreen character can't equip the item)
C2/5539: 26 EE ROL $EE
C2/553B: CA DEX
C2/553C: CA DEX
C2/553D: 10 F4 BPL $5533 (loop for all 4 onscreen characters)
C2/553F: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/5541: A5 EE LDA $EE
C2/5543: 8D 76 2E STA $2E76 (so $2E76 should look like:
Bit 0 = 1, if onscreen character 0 can't equip item
Bit 1 = 1, if onscreen character 1 can't equip item
Bit 2 = 1, if onscreen character 2 can't equip item
Bit 3 = 1, if onscreen character 3 can't equip item )
C2/5546: 28 PLP
C2/5547: FA PLX
C2/5548: 60 RTS
C2/5549: A0 (Tool) C2/554A: 08 (Weapon) C2/554B: 80 (Armor) C2/554C: 04 (Shield) C2/554D: 80 (Hat) C2/554E: 80 (Relic) C2/554F: 00 (Item) C2/5550: 00 (extra?)
C2/5551 unknow
C2/5551: 08 PHP
C2/5552: A2 1A LDX #$1A
C2/5554: 9E BA 30 STZ $30BA,X
C2/5557: CA DEX
C2/5558: 10 FA BPL $5554
C2/555A: A9 FF LDA #$FF
C2/555C: A2 35 LDX #$35
C2/555E: 9D A0 11 STA $11A0,X
C2/5561: CA DEX
C2/5562: 10 FA BPL $555E
C2/5564: A0 17 LDY #$17
C2/5566: A2 02 LDX #$02
C2/5568: 7B TDC
C2/5569: 38 SEC
C2/556A: 6A ROR
C2/556B: 90 02 BCC $556F
C2/556D: 6A ROR
C2/556E: CA DEX
C2/556F: 3C 29 1D BIT $1D29,X
C2/5572: F0 10 BEQ $5584
C2/5574: EE 87 3A INC $3A87
C2/5577: 48 PHA
C2/5578: 98 TYA
C2/5579: 69 37 ADC #$37
C2/557B: 99 0F 31 STA $310F,Y
C2/557E: 69 54 ADC #$54
C2/5580: 99 6A 30 STA $306A,Y
C2/5583: 68 PLA
C2/5584: 88 DEY
C2/5585: 10 E3 BPL $556A
C2/5587: A2 06 LDX #$06
C2/5589: BD D8 3E LDA $3ED8,X
C2/558C: C9 0C CMP #$0C
C2/558E: B0 1E BCS $55AE
C2/5590: EB XBA
C2/5591: A9 36 LDA #$36
C2/5593: 20 81 47 JSR $4781
C2/5596: C2 21 REP #$21
C2/5598: 69 6E ADC #$6E
C2/559A: 1A INC
C2/559B: F0 STA $F0
C2/559D: E2 20 SEP #$20
C2/559F: A0 35 LDY #$35
C2/55A1: B1 F0 LDA ($F0),Y
C2/55A3: C9 FF CMP #$FF
C2/55A5: D0 04 BNE $55AB
C2/55A7: 98 TYA
C2/55A8: 99 34 30 STA $3034,Y
C2/55AB: 88 DEY
C2/55AC: 10 F3 BPL $55A1
C2/55AE: CA DEX
C2/55AF: CA DEX
C2/55B0: 10 D7 BPL $5589
C2/55B2: AD 54 1D LDA $1D54 (info from Config screen)
(Bit 7 = Controller: 0 = Single, 1 = Multiple
Bit 6 = ???
Bits 3-5 = Window Color adjustment cursor:
000b = Font, 001b = 1st Window component,
010b = 2nd Window component, 011b = 3rd ' ' ,
100b = 4th ' ' , 101b = 5th ' ' ,
110b = 6th ' ' , 111b = 6th ' '
Bits 0-2 = Magic Order:
000b = Healing, Attack, Effect (HAE) ,
001b = HEA , 010b = AEH, 011b = AHE ,
100b = EHA , 101b = EAH )
C2/55B5: 29 07 AND #$07 (isolate Magic Order)
C2/55B7: AA TAX
C2/55B8: A0 35 LDY #$35
C2/55BA: B9 34 30 LDA $3034,Y (get spell #)
C2/55BD: C9 18 CMP #$18 (compare to 24. if it's 0-23, it's Attack
magic [Black].)
C2/55BF: B0 06 BCS $55C7 (branch if it's 24 or higher)
C2/55C1: 7F 4B 57 C2 ADC $C2574B,X (add spell # to amount to adjust Attack
spells positioning based on current
Magic Order)
C2/55C5: 80 12 BRA $55D9
C2/55C7: C9 2D CMP #$2D (compare to 45. if it's 24-44, it's Effect
magic [Gray].)
C2/55C9: B0 06 BCS $55D1 (branch if it's 45 or higher)
C2/55CB: 7F 51 57 C2 ADC $C25751,X (add spell # to amount to adjust Effect
spells positioning based on current
Magic Order)
C2/55CF: 80 08 BRA $55D9
C2/55D1: C9 36 CMP #$36 (compare to 54. if it's 45-53, it's Healing
magic [White].)
C2/55D3: B0 0B BCS $55E0 (branch if it's 54 or higher, which apparently
means it's not a Magic spell at all.)
C2/55D5: 7F 57 57 C2 ADC $C25757,X (add spell # to amount to adjust Healing
spells positioning based on current
Magic Order)
C2/55D9: DA PHX
C2/55DA: AA TAX
C2/55DB: 98 TYA
C2/55DC: 9D A0 11 STA $11A0,X
C2/55DF: FA PLX
C2/55E0: 88 DEY
C2/55E1: 10 D7 BPL $55BA
C2/55E3: A9 FF LDA #$FF
C2/55E5: A2 35 LDX #$35
C2/55E7: 9D 34 30 STA $3034,X
C2/55EA: CA DEX
C2/55EB: 10 FA BPL $55E7
C2/55ED: 7B TDC
C2/55EE: AA TAX
C2/55EF: A8 TAY
C2/55F0: BD A0 11 LDA $11A0,X
C2/55F3: 1A INC
C2/55F4: D0 0C BNE $5602
C2/55F6: BD A1 11 LDA $11A1,X
C2/55F9: 1A INC
C2/55FA: D0 06 BNE $5602
C2/55FC: BD A2 11 LDA $11A2,X
C2/55FF: 1A INC
C2/5600: F0 15 BEQ $5617
C2/5602: BD A0 11 LDA $11A0,X
C2/5605: 99 34 30 STA $3034,Y
C2/5608: BD A1 11 LDA $11A1,X
C2/560B: 99 35 30 STA $3035,Y
C2/560E: BD A2 11 LDA $11A2,X
C2/5611: 99 36 30 STA $3036,Y
C2/5614: C8 INY
C2/5615: C8 INY
C2/5616: C8 INY
C2/5617: E8 INX
C2/5618: E8 INX
C2/5619: E8 INX
C2/561A: E0 36 CPX #$36
C2/561C: 90 D2 BCC $55F0
C2/561E: A2 35 LDX #$35
C2/5620: BD 34 30 LDA $3034,X
C2/5623: C9 FF CMP #$FF
C2/5625: F0 06 BEQ $562D
C2/5627: A8 TAY
C2/5628: 8A TXA
C2/5629: 1A INC
C2/562A: 99 84 30 STA $3084,Y
C2/562D: CA DEX
C2/562E: 10 F0 BPL $5620
C2/5630: C2 10 REP #$10
C2/5632: A2 4D 00 LDX #$004D
C2/5635: 7B TDC
C2/5636: BD 34 30 LDA $3034,X
C2/5639: C9 FF CMP #$FF
C2/563B: F0 4B BEQ $5688
C2/563D: 48 PHA
C2/563E: A8 TAY
C2/563F: B9 84 30 LDA $3084,Y
C2/5642: C2 20 REP #$20
C2/5644: 0A ASL
C2/5645: 0A ASL
C2/5646: E2 20 SEP #$20
C2/5648: A8 TAY
C2/5649: A3 01 LDA $01,S
C2/564B: C9 8B CMP #$8B
C2/564D: 90 02 BCC $5651
C2/564F: E9 8B SBC #$8B
C2/5651: 99 8E 20 STA $208E,Y
C2/5654: 99 CA 21 STA $21CA,Y
C2/5657: 99 06 23 STA $2306,Y
C2/565A: 99 42 24 STA $2442,Y
C2/565D: 68 PLA
C2/565E: 20 23 57 JSR $5723
C2/5661: 99 90 20 STA $2090,Y
C2/5664: 99 CC 21 STA $21CC,Y
C2/5667: 99 08 23 STA $2308,Y
C2/566A: 99 44 24 STA $2444,Y
C2/566D: EB XBA
C2/566E: E0 44 00 CPX #$0044 (are we pointing at Step Mine's menu slot?)
C2/5671: D0 09 BNE $567C (branch if not)
C2/5673: AD 64 18 LDA $1864 (minutes portion of time played)
C2/5676: C9 1E CMP #$1E (set Carry if >=30 minutes)
C2/5678: AD 63 18 LDA $1863 (hours portion of time played)
C2/567B: 2A ROL (MP Cost = [hours * 2] + [minutes DIV 30])
C2/567C: 99 91 20 STA $2091,Y
C2/567F: 99 CD 21 STA $21CD,Y
C2/5682: 99 09 23 STA $2309,Y
C2/5685: 99 45 24 STA $2445,Y
C2/5688: CA DEX
C2/5689: 10 AA BPL $5635
C2/568B: 28 PLP
C2/568C: 60 RTS
C2/568D unknow
C2/568D: DA PHX
C2/568E: 08 PHP
C2/568F: C2 10 REP #$10
C2/5691: BD 45 3C LDA $3C45,X
C2/5694: 85 F8 STA $F8 (copy "Relic Effects 2" byte)
C2/5696: 64 F6 STZ $F6
C2/5698: BC 2C 30 LDY $302C,X
C2/569B: 84 F2 STY $F2 (save starting address of character's Magic menu?)
C2/569D: C8 INY
C2/569E: C8 INY
C2/569F: C8 INY
C2/56A0: 84 F4 STY $F4 (save address of MP cost of first spell)
C2/56A2: BC 10 30 LDY $3010,X (get offset to character info block)
C2/56A5: B9 1E 16 LDA $161E,Y
C2/56A8: 85 F7 STA $F7
C2/56AA: 30 1B BMI $56C7
C2/56AC: 9D 44 33 STA $3344,X
C2/56AF: A4 F2 LDY $F2
C2/56B1: 99 00 00 STA $0000,Y
C2/56B4: 18 CLC
C2/56B5: 69 36 ADC #$36
C2/56B7: 20 23 57 JSR $5723 (put spell aiming byte in bottom half of A,
MP cost in top)
C2/56BA: 99 02 00 STA $0002,Y (save aiming byte in menu data)
C2/56BD: 9D 45 33 STA $3345,X
C2/56C0: EB XBA (get spell MP cost)
C2/56C1: 20 36 57 JSR $5736 (change it if Gold Hairpin or Economizer equipped)
C2/56C4: 99 03 00 STA $0003,Y (save updated MP cost)
C2/56C7: 7B TDC
C2/56C8: A8 TAY (A = 0, Y = 0)
C2/56C9: BD D8 3E LDA $3ED8,X
C2/56CC: C9 0C CMP #$0C
C2/56CE: F0 15 BEQ $56E5 (branch if the character is Gogo)
C2/56D0: C8 INY
C2/56D1: C8 INY (Y = 2)
C2/56D2: B0 11 BCS $56E5 (branch if Umaro)
C2/56D4: C8 INY
C2/56D5: C8 INY (Y = 4)
C2/56D6: EB XBA
C2/56D7: A9 36 LDA #$36
C2/56D9: 20 81 47 JSR $4781
C2/56DC: C2 21 REP #$21 (Set 16-bit A, clear Carry)
C2/56DE: 69 6E 1A ADC #$1A6E
C2/56E1: 85 F0 STA $F0
C2/56E3: E2 20 SEP #$20 (Set 8-bit A)
C2/56E5: BB TYX
C2/56E6: A0 38 01 LDY #$0138 (we can loop through 78 spell menu entries [each taking
4 bytes]. 54 Magic spells + 24 Lores = 78)
C2/56E9: 7B TDC
C2/56EA: B1 F2 LDA ($F2),Y
C2/56EC: C9 FF CMP #$FF
C2/56EE: F0 1E BEQ $570E (branch if no spell available in this menu slot)
C2/56F0: C0 DC 00 CPY #$00DC (are we pointing to the first slot on the Lore menu
[our 55th slot overall]?)
C2/56F3: 7C 5D 57 JMP ($575D,X) (jump out of the loop.. but the other places can actually
jump back into it. Square is crazy like that. :P )
C2/56F6: 88 DEY
C2/56F7: 88 DEY
C2/56F8: 88 DEY
C2/56F9: 88 DEY
C2/56FA: D0 ED BNE $56E9 (point to next menu slot, and loop)
C2/56FC: 28 PLP
C2/56FD: FA PLX
C2/56FE: A5 F6 LDA $F6
C2/5700: 9D F8 3C STA $3CF8,X
C2/5703: 60 RTS
C2/5704: B0 10 BCS $5716 (branch if we're pointing to a Lore slot. otherwise,
we're pointing to a Magic spell slot.)
C2/5706: 5A PHY
C2/5707: A8 TAY
C2/5708: B1 F0 LDA ($F0),Y
C2/570A: 7A PLY
C2/570B: 1A INC
C2/570C: F0 08 BEQ $5716
C2/570E: 7B TDC
C2/570F: 91 F4 STA ($F4),Y (save 0 as MP cost)
C2/5711: 3A DEC
C2/5712: 91 F2 STA ($F2),Y (save FFh [null] as spell #)
C2/5714: 80 E0 BRA $56F6 (reenter our 78-slot loop)
C2/5716: B0 02 BCS $571A (branch if we're pointing to a Lore slot. otherwise,
we're pointing to a Magic spell slot.)
C2/5718: E6 F6 INC $F6
C2/571A: B1 F4 LDA ($F4),Y (get spell's MP cost from menu)
C2/571C: 20 36 57 JSR $5736 (change it if Gold Hairpin or Economizer equipped)
C2/571F: 91 F4 STA ($F4),Y (save updated MP cost)
C2/5721: 80 D3 BRA $56F6 (reenter our 78-slot loop)
C2/5723 unknow
C2/5723: DA PHX C2/5724: EB XBA C2/5725: A9 0E LDA #$0E C2/5727: 20 81 47 JSR $4781 (spell # * 14) C2/572A: AA TAX C2/572B: BF C5 6A C4 LDA $C46AC5,X (read MP cost from spell data) C2/572F: EB XBA C2/5730: BF C0 6A C4 LDA $C46AC0,X (read aiming byte from spell data) C2/5734: FA PLX C2/5735: 60 RTS
C2/5736 adjust MP cost based on relics
(Adjust MP cost for Gold Hairpin and/or Economizer. obviously, the latter supercedes the former.) C2/5736: EB XBA (put MP cost in top of A) C2/5737: A5 F8 LDA $F8 (read our copy of "Relic Effects 2" byte) C2/5739: 89 20 BIT #$20 C2/573B: F0 04 BEQ $5741 (branch if no Gold Hairpin) C2/573D: EB XBA (get MP cost) C2/573E: 1A INC C2/573F: 4A LSR (MP cost = [MP cost + 1] / 2) C2/5740: EB XBA (look at relics byte again) C2/5741: 89 40 BIT #$40 C2/5743: F0 04 BEQ $5749 (branch if no Economizer) C2/5745: EB XBA C2/5746: A9 01 LDA #$01 (MP cost = 1) C2/5748: EB XBA C2/5749: EB XBA (return MP cost in bottom of A) C2/574A: 60 RTS
(Data - amount to shift menu position of certain Magic spells, depending on the "Magic Order" chosen in Config menu. These values are signed, so anything 80h and above means to subtract, i.e. move the spell backwards.)
(For Spells 0 - 23 : Attack, Black) C2/574B: 09 (Healing, Attack, Effect (HAE)) C2/574C: 1E (Healing, Effect, Attack (HEA)) C2/574D: 00 (Attack, Effect, Healing (AEH)) C2/574E: 00 (Attack, Healing, Effect (AHE)) C2/574F: 1E (Effect, Healing, Attack (EHA)) C2/5750: 15 (Effect, Attack, Healing (EAH)) (For Spells 24 - 44 : Effect, Gray) C2/5751: 09 (Healing, Attack, Effect (HAE)) C2/5752: F1 (Healing, Effect, Attack (HEA)) C2/5753: 00 (Attack, Effect, Healing (AEH)) C2/5754: 09 (Attack, Healing, Effect (AHE)) C2/5755: E8 (Effect, Healing, Attack (EHA)) C2/5756: E8 (Effect, Attack, Healing (EAH)) (For Spells 45 - 53 : White, Healing) C2/5757: D3 (Healing, Attack, Effect (HAE)) C2/5758: D3 (Healing, Effect, Attack (HEA)) C2/5759: 00 (Attack, Effect, Healing (AEH)) C2/575A: EB (Attack, Healing, Effect (AHE)) C2/575B: E8 (Effect, Healing, Attack (EHA)) C2/575C: 00 (Effect, Attack, Healing (EAH))
C2/575D pointers
(Pointer table) C2/575D: 16 57 C2/575F: 0E 57 C2/5761: 04 57
C2/5763 check availability for esper, magic and lore
(Make entries on Esper, Magic, and Lore menus available and lit up or unavailable
and grayed, depending on whether: the spell is learned [or for the Esper menu,
an Esper is equipped], the character has enough MP to cast the spell, the
character is an Imp trying to cast a spell other than Imp)
C2/5763: E0 08 CPX #$08
C2/5765: B0 42 BCS $57A9 (Exit function if monster)
C2/5767: DA PHX
C2/5768: 5A PHY
C2/5769: 08 PHP
C2/576A: BD 09 3C LDA $3C09,X (MP, top byte)
C2/576D: D0 06 BNE $5775 (branch if MP >= 256)
C2/576F: BD 08 3C LDA $3C08,X (MP, bottom byte)
C2/5772: 1A INC
C2/5773: D0 02 BNE $5777 (if MP < 255, branch and save MP cost
as character MP + 1)
C2/5775: A9 FF LDA #$FF (otherwise, set it to 255)
C2/5777: 8D 4C 3A STA $3A4C (save Caster MP + 1. capped at 255)
C2/577A: BD E4 3E LDA $3EE4,X (Status byte 1)
C2/577D: 0A ASL
C2/577E: 0A ASL
C2/577F: 85 EF STA $EF (Imp is saved in Bit 7)
C2/5781: C2 10 REP #$10 (16-bit X and Y registers)
C2/5783: BD 18 30 LDA $3018,X (Holds $01 for character 1, $02 for character 2,
$04 for character 3, $08 for character 4
C2/5786: BC 2C 30 LDY $302C,X (get starting address of character's Magic menu?)
C2/5789: BB TYX
C2/578A: 38 SEC
C2/578B: 2C 2E 3F BIT $3F2E (bit is set for characters who don't have Espers
equipped)
C2/578E: D0 03 BNE $5793 (if no Esper equipped, branch with Carry Set)
C2/5790: 20 AA 57 JSR $57AA (Set Carry if spell's unavailable due to Impage or
insufficient MP. Clear Carry otherwise.)
C2/5793: 7E 01 00 ROR $0001,X (put Carry into bit 7 of 2nd byte of menu data.
if set, it makes spell unavailable on menu.)
C2/5796: A0 4D 00 LDY #$004D
C2/5799: E8 INX
C2/579A: E8 INX
C2/579B: E8 INX
C2/579C: E8 INX (point to next spell in menu)
C2/579D: 20 AA 57 JSR $57AA (Set Carry if spell's unavailable due to absence,
Impage, or insufficient MP. Clear Carry otherwise.)
C2/57A0: 7E 01 00 ROR $0001,X (put Carry into bit 7 of 2nd byte of menu data.
if set, it makes spell unavailable on menu.)
C2/57A3: 88 DEY
C2/57A4: 10 F3 BPL $5799 (loop 78 times: 54 spells plus 24 lores)
C2/57A6: 28 PLP
C2/57A7: 7A PLY
C2/57A8: FA PLX
C2/57A9: 60 RTS
C2/57AA check if spell can be cast
(Set Carry if spell should be disabled due to unavailability, or because caster is an Imp and the spell isn't Imp. If none of these factors disable the spell, check the MP cost.) C2/57AA: BD 00 00 LDA $0000,X (get spell # from menu) C2/57AD: 30 0A BMI $57B9 (branch if undefined) C2/57AF: EB XBA C2/57B0: A5 EF LDA $EF C2/57B2: 10 07 BPL $57BB (branch if character not an Imp) C2/57B4: EB XBA C2/57B5: C9 23 CMP #$23 C2/57B7: F0 02 BEQ $57BB (branch if spell is Imp) C2/57B9: 38 SEC (spell will be unavailable) C2/57BA: 60 RTS
C2/57BB check if caster lacks MP to cast spell
(Set Carry if caster lacks MP to cast spell. Clear it if they have sufficient MP.) C2/57BB: BD 03 00 LDA $0003,X (get spell's MP cost from menu data) C2/57BE: CD 4C 3A CMP $3A4C (compare to Caster MP + 1, capped at 255) C2/57C1: 60 RTS
C2/57C2 jump animation
(Sets up attack animation, including making all Jump but the last in a Dragon Horn
sequence send the attacker airborne again.
Randomizes targets for all jumps but the first with Dragon Horn.)
C2/57C2: 08 PHP
C2/57C3: E2 30 SEP #$30 (set 8-bit A, X, Y)
C2/57C5: 64 A0 STZ $A0
C2/57C7: 8A TXA (get attacker index)
C2/57C8: 4A LSR (divide by 2. now we have 0, 1, 2, and 3 for characters,
and 4, 5, 6, 7, 8, 9 for monsters)
C2/57C9: 85 A1 STA $A1 (save attacker for animation purposes)
C2/57CB: C9 04 CMP #$04
C2/57CD: 90 02 BCC $57D1 (branch if character is attacker)
C2/57CF: 66 A0 ROR $A0 (Bit 7 is set if monster attacker)
C2/57D1: A5 B9 LDA $B9 (get monster targets)
C2/57D3: 85 A3 STA $A3
C2/57D5: 85 A5 STA $A5
C2/57D7: A5 B8 LDA $B8 (get character targets)
C2/57D9: 85 A2 STA $A2
C2/57DB: 85 A4 STA $A4
C2/57DD: D0 04 BNE $57E3 (branch if there are character targets)
C2/57DF: A9 40 LDA #$40
C2/57E1: 04 A0 TSB $A0 (Bit 6 set if there are no character targets)
C2/57E3: A5 A0 LDA $A0
C2/57E5: 0A ASL
C2/57E6: 90 02 BCC $57EA (branch if not monster attacker)
C2/57E8: 49 80 EOR #$80 (flip "no character targets" bit)
C2/57EA: 10 04 BPL $57F0 (next two lines are only executed if:
- character attacker and no character (i.e. just monster) targets
OR - monster attacker and character targets)
C2/57EC: A9 02 LDA #$02
C2/57EE: 04 BA TSB $BA (Set "attacking opposition" bit. Used for criticals
and reflections.)
C2/57F0: A9 10 LDA #$10
C2/57F2: 14 B0 TRB $B0
C2/57F4: D0 02 BNE $57F8
C2/57F6: 04 A0 TSB $A0
C2/57F8: AD 70 3A LDA $3A70 (# of attacks left for Dragon Horn / Offering / Quadra Slam)
C2/57FB: F0 0D BEQ $580A (if no more after the current one, exit)
C2/57FD: AD 8E 3A LDA $3A8E (set to FFh by Dragon Horn's "jump continuously" attribute;
should be zero otherwise)
C2/5800: F0 08 BEQ $580A (exit if zero)
C2/5802: A9 02 LDA #$02
C2/5804: 04 A0 TSB $A0 (animation to send jumper bouncing skyward again)
C2/5806: A9 60 LDA #$60
C2/5808: 04 BA TSB $BA (set Can Beat on Corpses if no Valid Targets Left and
Randomize Target. the latter explains why all jumps
after the first one are random.)
C2/580A: 28 PLP
C2/580B: 60 RTS
C2/580C unknow
C2/580C: 7B TDC (16-bit A = 0)
C2/580D: AD F7 1C LDA $1CF7 (Known SwdTechs)
C2/5810: 20 0E 52 JSR $520E (X = # of known SwdTechs)
C2/5813: CA DEX
C2/5814: 8E 20 20 STX $2020 (index of the highest SwdTech acquired. useful
to represent it this way because SwdTechs are
on a continuum.)
C2/5817: 7B TDC
C2/5818: AD 28 1D LDA $1D28 (Known Blitzes)
C2/581B: 20 0E 52 JSR $520E (X = # of known Blitzes)
C2/581E: 8E 80 3A STX $3A80
C2/5821: AD 4C 1D LDA $1D4C (Known Dances)
C2/5824: 85 EE STA $EE
C2/5826: A2 07 LDX #$07 (start looking at 8th dance)
C2/5828: 06 EE ASL $EE (Carry will be set if current dance is known)
C2/582A: A9 FF LDA #$FF (default to storing null in Dance menu?)
C2/582C: 90 01 BCC $582F (branch if dance unknown)
C2/582E: 8A TXA (if current dance is known, store its number
in the menu instead.)
C2/582F: 9D 7E 26 STA $267E,X
C2/5832: CA DEX
C2/5833: 10 F3 BPL $5828 (loop for all 8 Dances)
C2/5835: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/5837: A9 7E 25 LDA #$257E
C2/583A: 8F 81 21 00 STA $002181
C2/583E: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/5840: 7B TDC
C2/5841: A8 TAY
C2/5842: AA TAX (Clear A, Y, X)
C2/5843: 8F 83 21 00 STA $002183
C2/5847: 89 07 BIT #$07
C2/5849: D0 08 BNE $5853 (if none of bottom 3 bits set, we're on enemy #
0,8,16,etc. in which case we need to read a new
rage byte)
C2/584B: 48 PHA
C2/584C: BD 2C 1D LDA $1D2C,X (load current rage byte - 32 bytes total, 8 rages
per byte)
C2/584F: 85 EE STA $EE
C2/5851: E8 INX (point to next rage byte)
C2/5852: 68 PLA
C2/5853: 46 EE LSR $EE (get bottom bit of current rage byte)
C2/5855: 90 07 BCC $585E (if bit wasn't set, rage wasn't found, so don't
display it)
C2/5857: EE 9A 3A INC $3A9A (# of rages possessed. used to randomly pick a rage
in situations like Muddle)
C2/585A: 8F 80 21 00 STA $002180 (store rage in menu)
C2/585E: 1A INC (advance to next enemy #)
C2/585F: C9 FF CMP #$FF
C2/5861: D0 E4 BNE $5847 (loop for all eligible enemies, 0 to 254. we don't loop
a 256th time for Pugs, which is inaccessible regardless,
because that would overflow our $3A9A counter)
C2/5863: 60 RTS
C2/5864 check for statuses
Doesn't set carry if any are set Carry clear = one or more set Carry set = none set C2/5864: C2 21 REP #$21 (Set 16-bit Accumulator) C2/5866: B9 E4 3E LDA $3EE4,Y (Target status byte 1 & 2) C2/5869: 23 05 AND $05,S C2/586B: D0 08 BNE $5875 C2/586D: B9 F8 3E LDA $3EF8,Y (Target status byte 3 & 4) C2/5870: 23 03 AND $03,S C2/5872: D0 01 BNE $5875 C2/5874: 38 SEC C2/5875: A3 01 LDA $01,S C2/5877: 83 05 STA $05,S C2/5879: 68 PLA C2/587A: 68 PLA C2/587B: E2 20 SEP #$20 (Set 8-bit Accumulator) C2/587D: 60 RTS
C2/587E targeting function
(Big ass targeting function. It's not used to choose targets with the cursor, but
it can choose targets randomly (for all sorts of reasons), or refine ones previously
chosen [e.g. with the cursor]. This routine's so important, it uses several
helper functions.)
C2/587E: DA PHX
C2/587F: 5A PHY
C2/5880: 08 PHP
C2/5881: E2 30 SEP #$30 (set 8-bit A, X and Y)
C2/5883: A5 BB LDA $BB (targeting byte)
C2/5885: C9 02 CMP #$02 (does the aiming consist of JUST "one side only?"
if so, that means we can't do spread-aim, start the
cursor on the enemy, or move it)
C2/5887: D0 0C BNE $5895 (if not, branch)
C2/5889: BD 18 30 LDA $3018,X
C2/588C: 85 B8 STA $B8
C2/588E: BD 19 30 LDA $3019,X
C2/5891: 85 B9 STA $B9 (save attacker as lone target?)
C2/5893: 80 61 BRA $58F6 (then exit function)
C2/5895: 20 FA 58 JSR $58FA
C2/5898: A5 BA LDA $BA
C2/589A: 89 40 BIT #$40
C2/589C: D0 1B BNE $58B9 (Branch if randomize targets)
C2/589E: 89 08 BIT #$08
C2/58A0: D0 03 BNE $58A5 (Branch if Can target dead/hidden entities)
C2/58A2: 20 4D 5A JSR $5A4D (Remove dead and hidden targets)
C2/58A5: A5 B8 LDA $B8
C2/58A7: 05 B9 ORA $B9
C2/58A9: F0 08 BEQ $58B3 (Branch if no targets)
C2/58AB: A5 BB LDA $BB (targeting byte)
C2/58AD: 89 2C BIT #$2C (is "manual party select", "autoselect one party", or
"autoselect both parties" set? in other words,
we're checking to see if the spell can be spread)
C2/58AF: F0 3C BEQ $58ED (if not, branch)
C2/58B1: 80 43 BRA $58F6 (if so, exit function)
(So if there were multiple targets and the targeting byte
allows that, keep our multiple targets. If there were
somehow multiple targets despite the targeting byte
[I can't think of a cause for this], just choose a
random one at $58ED. If there was only a single target,
the branch to either $58ED or $58F6 will retain it.)
C2/58B3: A5 BA LDA $BA
C2/58B5: 89 04 BIT #$04 (Don't retarget if target dead/invalid?)
C2/58B7: D0 0F BNE $58C8 (if we don't retarget, branch)
C2/58B9: 20 37 59 JSR $5937 (Randomize Targets jumps here)
C2/58BC: 20 FA 58 JSR $58FA
C2/58BF: A5 BA LDA $BA
C2/58C1: 89 08 BIT #$08
C2/58C3: D0 03 BNE $58C8 (Branch if can target dead/hidden entities)
C2/58C5: 20 4D 5A JSR $5A4D (Remove dead and hidden targets)
C2/58C8: 20 AC 59 JSR $59AC
C2/58CB: A5 BA LDA $BA
C2/58CD: 89 20 BIT #$20
C2/58CF: F0 0D BEQ $58DE (branch if attack doesn't allow us to beat on corpses)
C2/58D1: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/58D3: A5 B8 LDA $B8
C2/58D5: D0 05 BNE $58DC (branch if there are some targets set)
C2/58D7: AD 4E 3A LDA $3A4E
C2/58DA: 85 B8 STA $B8 (if there are no targets left, copy them from a
"backup targets byte". this will let Offering and
Genji Glove and friends beat on corpses once all
targets have been killed during the attacker's turn.
i dunno if this variable is used in any other cases.)
C2/58DC: E2 20 SEP #$20 (Set 8-bit Accumulator)
(note: if we're at this point, we never did the BIT #$2C target byte check above..
and we've most likely retargeted thanks to "Randomize targets", or to there being
no valid targets initially selected)
C2/58DE: A5 BB LDA $BB (targeting byte)
C2/58E0: 89 0C BIT #$0C (is "autoselect one party" or "autoselect both parties" set?
in another words, we're checking for some auto-spread aim)
C2/58E2: D0 12 BNE $58F6 (if so, exit function)
C2/58E4: 89 20 BIT #$20 (is "manual party select" set? i.e. can the spell be spread
via L/R button?)
C2/58E6: F0 05 BEQ $58ED (if not, branch)
C2/58E8: 20 53 4B JSR $4B53 (if so, do random coinflip)
C2/58EB: B0 09 BCS $58F6 (50% of the time, we'll pretend it was spread, so exit)
(50% of the time, we'll pretend it kept one target)
C2/58ED: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/58EF: A5 B8 LDA $B8
C2/58F1: 20 2A 52 JSR $522A (Randomly picks a bit set in A)
C2/58F4: 85 B8 STA $B8 (so we pick one random target)
C2/58F6: 28 PLP
C2/58F7: 7A PLY
C2/58F8: FA PLX
C2/58F9: 60 RTS
C2/58FA unknow
C2/58FA: 08 PHP
C2/58FB: A9 02 LDA #$02
C2/58FD: 1C 46 3A TRB $3A46 (clear flag)
C2/5900: D0 13 BNE $5915 (if it was set [as is the case with the Joker
Dooms and the Tentacles' Seize drain], branch
and don't remove any targets)
C2/5902: 20 17 59 JSR $5917
C2/5905: A5 BA LDA $BA
C2/5907: 10 02 BPL $590B (branch if not abort on characters)
C2/5909: 64 B8 STZ $B8 (clear character targets)
C2/590B: 4A LSR
C2/590C: 90 07 BCC $5915 (branch if not "Exclude Attacker from targets")
C2/590E: C2 20 REP #$20 (set 16-bit accumulator)
C2/5910: BD 18 30 LDA $3018,X
C2/5913: 14 B8 TRB $B8 (clear caster from targets)
C2/5915: 28 PLP
C2/5916: 60 RTS
C2/5917 unknow
C2/5917: 08 PHP
C2/5918: AD 46 2F LDA $2F46
C2/591B: EB XBA
C2/591C: AD 03 34 LDA $3403 (Seized entities: bit clear for those who are,
set for those who aren't.)
C2/591F: C2 20 REP #$20
C2/5921: 2D 78 3A AND $3A78
C2/5924: 2D 08 34 AND $3408
C2/5927: 25 B8 AND $B8
C2/5929: 85 B8 STA $B8
C2/592B: AD 1A 34 LDA $341A (check top bit of $341B)
C2/592E: 10 05 BPL $5935 (branch if not set)
C2/5930: AD 2C 3F LDA $3F2C (get Jumpers)
C2/5933: 14 B8 TRB $B8 (remove them from targets)
C2/5935: 28 PLP
C2/5936: 60 RTS
C2/5937 randomize targets
(Randomize Targets function. selects entire monster or character parties (or both) at a time.
calling function will later refine the targeting.)
(calling the character side 0 and the monster side 1, it looks like this up through C2/598A:
side chosen = (monster caster) XOR Charmed XOR "Cursor start on opposition" XOR Muddled )
(values DURING function -- not coming in or leaving it:
bit 7 of $B8 = side to target. characters = 0, monsters = 1, special/opposing(?) characters = 1
bit 6 of $B8 = 1: make both sides eligible to target)
C2/5937: 64 B9 STZ $B9 (clear enemy targets)
C2/5939: 7B TDC (Accumulator = 0)
C2/593A: E0 08 CPX #$08 (carry set if caster is monster? note that "caster" can
also mean "reflectee", in which cases a good part of
this function will be skipped..)
C2/593C: 6A ROR
C2/593D: 85 B8 STA $B8 (Bits 0-6 = 0. Bit 7 = 1 if monster caster, 0 if character)
C2/593F: A5 BA LDA $BA
C2/5941: 89 10 BIT #$10 (this bit only seems to be set by Reflection)
C2/5943: D0 41 BNE $5986 (if it's set, branch. once the spell's already hit the
Wall Ring, we [generally] don't care about the reflector's
status, and they're not necessarily the caster anyway)
(after this branch, there'll be just the one flip of $B8's
top bit.. as a reflected spell always bounces at the
party opposing the reflectee)
C2/5945: BD 95 33 LDA $3395,X
C2/5948: 30 06 BMI $5950 (Branch if charmed)
C2/594A: A9 80 LDA #$80
C2/594C: 45 B8 EOR $B8
C2/594E: 85 B8 STA $B8 (toggle top bit of $B8)
C2/5950: BD 18 30 LDA $3018,X
C2/5953: 2C 40 3A BIT $3A40 (is caster a special type of character?
from all i've seen, this means a character acting as
an enemy, like Gau returning from a Veldt leap, or
Shadow in the Colosseum)
C2/5956: F0 06 BEQ $595E (if not, branch)
C2/5958: A9 80 LDA #$80 (if so.. here comes another toggle!)
C2/595A: 45 B8 EOR $B8
C2/595C: 85 B8 STA $B8 (toggle top bit of $B8)
C2/595E: A5 BB LDA $BB (targeting byte)
C2/5960: 29 0C AND #$0C (isolate "Autoselect both parties" and "Autoselect one party")
C2/5962: C9 04 CMP #$04 (is "autoselect both parties" the only bit of these two set?)
C2/5964: D0 04 BNE $596A (if not, branch)
C2/5966: A9 40 LDA #$40
C2/5968: 04 B8 TSB $B8 (make both monsters and characters targetable?)
C2/596A: A5 BB LDA $BB (targeting byte)
C2/596C: 29 40 AND #$40 (isolate "cursor start on enemy" [read OPPOSITION: not monster])
C2/596E: 0A ASL (put into top bit of A)
C2/596F: 45 B8 EOR $B8
C2/5971: 85 B8 STA $B8 (toggle top bit yet again)
C2/5973: BD E4 3E LDA $3EE4,X (Status byte 1)
C2/5976: 4A LSR
C2/5977: 4A LSR
C2/5978: 90 04 BCC $597E (Branch if not Zombie)
C2/597A: A9 40 LDA #$40
C2/597C: 04 B8 TSB $B8 (make both monsters and characters targetable?)
C2/597E: BD E5 3E LDA $3EE5,X (Status byte 2)
C2/5981: 0A ASL
C2/5982: 0A ASL
C2/5983: 0A ASL
C2/5984: 90 06 BCC $598C (Branch if not Muddled)
C2/5986: A9 80 LDA #$80
C2/5988: 45 B8 EOR $B8
C2/598A: 85 B8 STA $B8 (toggle top bit)
C2/598C: A5 B8 LDA $B8
C2/598E: 0A ASL
C2/598F: 64 B8 STZ $B8 (clear character targets; monsters were cleared at start
of function)
C2/5991: 30 02 BMI $5995 (if target anybody bit is set, branch, as we don't care
whether monsters or characters were indicated by top bit)
C2/5993: 90 0B BCC $59A0 (if target monsters bit was not set, branch)
C2/5995: 08 PHP (save Carry and Negative flags)
C2/5996: A9 3F LDA #$3F
C2/5998: 04 B9 TSB $B9 (target all monsters)
C2/599A: AD 40 3A LDA $3A40
C2/599D: 04 B8 TSB $B8 (only target certain characters? like not typically playable ones?
or ones acting as enemies in some event? at any rate, $3A40
has been 0 the few times i checked in normal battles..)
C2/599F: 28 PLP (restore Carry and Negative flags)
C2/59A0: 30 02 BMI $59A4 (if target anybody bit is set, branch, as we don't care
whether monsters or characters were indicated by top bit)
C2/59A2: B0 07 BCS $59AB (if target monsters bit was set, exit function)
C2/59A4: A9 0F LDA #$0F (mark all characters)
C2/59A6: 4D 40 3A EOR $3A40 (exclude characters acting as enemies, like Colosseum Shadow
and Gau returning from Veldt leap)
C2/59A9: 04 B8 TSB $B8 (turn on just normal characters' bits)
(bits 7 and 6 | Results
-----------------------------------------------------------------------
0 0 normal characters (?)
1 0 all monsters, special/enemy characters
0 1 all monsters, special/enemy characters + normal characters
1 1 all monsters, special/enemy characters + normal characters
)
C2/59AB: 60 RTS
C2/59AC unknow
(If a reflection has occurred AND the initial spellcast had one party aiming at another
AND the reflector isn't Muddled, then there's a 50% chance the initial caster will
become the sole target, provided he/she is in the party that's about to be hit by the
bounce. The other 50% of the time, the final target is randomly chosen by the end of
function C2/587E; each member of the party opposing the reflector has the same chance
of getting hit.)
C2/59AC: A5 BA LDA $BA
C2/59AE: 89 10 BIT #$10
C2/59B0: F0 28 BEQ $59DA (branch if not Reflected)
C2/59B2: 89 02 BIT #$02
C2/59B4: F0 23 BEQ $59D9 (branch if not attacking opposition.. iow,
is reflectOR an opponent?)
C2/59B6: BD E5 3E LDA $3EE5,X (Status byte 2)
C2/59B9: 89 20 BIT #$20
C2/59BB: D0 1C BNE $59D9 (if this reflector is Muddled, exit function)
C2/59BD: 20 53 4B JSR $4B53
C2/59C0: B0 17 BCS $59D9 (50% chance of exit function)
C2/59C2: DA PHX
C2/59C3: AE 32 3A LDX $3A32
C2/59C6: BD 5F 2C LDA $2C5F,X (get unique index of ORIGINAL spell caster
[from animation data]?)
C2/59C9: 0A ASL
C2/59CA: AA TAX (multiply by 2 to access their data block)
C2/59CB: C2 20 REP #$20 (set 16-bit accumulator)
C2/59CD: BD 18 30 LDA $3018,X
C2/59D0: 24 B8 BIT $B8 (is original caster a member of the party about
to be hit by the bounce?)
C2/59D2: F0 02 BEQ $59D6
C2/59D4: 85 B8 STA $B8 (if they are, save them as the sole target of
this bounce)
C2/59D6: E2 20 SEP #$20 (set 8-bit accumulator)
C2/59D8: FA PLX
C2/59D9: 60 RTS
C2/59DA targeting for different encounter formations
(NOTE: I reuse the "Autoselect both parties" description from FF3usME, but
it really seems to be more like "Autoselect both/all CLUSTERS". spread-aim
spells without this bit set [Haste 2, Slow 2, X-Zone] will only be able
to target one cluster of your party at a time when it's split by a Side
attack or one cluster of the monster party when it's split by a Pincer.
Whereas spells WITH it set [Meteor, Quake] can hit both/all clumps)
C2/59DA: A5 BB LDA $BB (targeting byte)
C2/59DC: 29 0C AND #$0C (isolate "Autoselect both parties" and "Autoselect one party")
C2/59DE: 48 PHA (save these bits of targeting byte)
C2/59DF: 89 04 BIT #$04 (is "Autoselect both parties" set?)
C2/59E1: D0 52 BNE $5A35 (if yes, branch)
(if not, we'll be unable to hit more than one cluster of
targets at a time, so take special steps for formations
like Pincer and Side, which divide targets into these clusters)
C2/59E3: AD 1F 20 LDA $201F (get encounter type: 0 = front, 1 = back, 2 = pincer, 3 = side)
C2/59E6: C9 02 CMP #$02
C2/59E8: D0 23 BNE $5A0D (branch if not pincer)
C2/59EA: AD AD 2E LDA $2EAD (bitfield of enemies in right "clump".
set in function C1/1588.)
C2/59ED: EB XBA
C2/59EE: AD AC 2E LDA $2EAC (bitfield of enemies in left "clump".
set in function C1/1588.)
C2/59F1: E0 08 CPX #$08
C2/59F3: 90 07 BCC $59FC (branch if attacker is not a monster)
C2/59F5: 3C 19 30 BIT $3019,X (is this attacker among enemies on left side
of pincer?)
C2/59F8: F0 11 BEQ $5A0B (branch if not, and clear left side enemies from targets)
C2/59FA: 80 0E BRA $5A0A (otherwise, branch, and clear right side enemies from
targets)
C2/59FC: 24 B9 BIT $B9 (are left side enemies among targets?)
C2/59FE: F0 0D BEQ $5A0D (if they aren't, we don't have to choose a side for
attack, so branch and dont' alter anything.)
C2/5A00: EB XBA
C2/5A01: 24 B9 BIT $B9
C2/5A03: F0 08 BEQ $5A0D (if right side enemies aren't among targets, we don't have
to choose a side, so branch and don't alter anything.)
C2/5A05: 20 53 4B JSR $4B53
C2/5A08: 90 01 BCC $5A0B (50% branch. half the time, we clear left side enemies.
the other half, right side.)
C2/5A0A: EB XBA
C2/5A0B: 14 B9 TRB $B9 (clear some enemy targets)
C2/5A0D: AD 1F 20 LDA $201F (get encounter type: 0 = front, 1 = back, 2 = pincer, 3 = side)
C2/5A10: C9 03 CMP #$03
C2/5A12: D0 21 BNE $5A35 (branch if not side)
C2/5A14: A9 0C LDA #$0C (characters 2 and 3, who are on left side)
C2/5A16: EB XBA
C2/5A17: A9 03 LDA #$03 (characters 0 and 1, who are on right side)
C2/5A19: E0 08 CPX #$08
C2/5A1B: B0 07 BCS $5A24 (branch if monster attacker)
C2/5A1D: 3C 18 30 BIT $3018,X
C2/5A20: F0 11 BEQ $5A33 (branch if it's a character, and they're not on right side.
this will clear right side characters from targets.)
C2/5A22: 80 0E BRA $5A32 (otherwise, branch and clear left side characters from
targets)
C2/5A24: 24 B8 BIT $B8
C2/5A26: F0 0D BEQ $5A35 (if right side characters aren't among targets, we don't
have to choose a side, so branch and don't alter anything)
C2/5A28: EB XBA
C2/5A29: 24 B8 BIT $B8
C2/5A2B: F0 08 BEQ $5A35 (if left side characters aren't among targets, we don't
have to choose a side, so branch and don't alter anything)
C2/5A2D: 20 53 4B JSR $4B53
C2/5A30: 90 01 BCC $5A33 (50% branch. half the time, we clear right side characters.
the other half, left side.)
C2/5A32: EB XBA
C2/5A33: 14 B8 TRB $B8 (clear some character targets)
C2/5A35: 68 PLA (retrieve "Autoselect both parties" and "Autoselect one party"
bits of targeting byte)
C2/5A36: C9 04 CMP #$04 (was only "Autoselect both parties" set?)
C2/5A38: F0 12 BEQ $5A4C (if so, exit function)
C2/5A3A: A5 B8 LDA $B8
C2/5A3C: F0 0E BEQ $5A4C (if no characters targeted, exit function)
C2/5A3E: A5 B9 LDA $B9
C2/5A40: F0 0A BEQ $5A4C (or if no monsters targeted, exit function)
(if we reached here, both monsters and characters are targeted, even
though attack's aiming byte didn't indicate that.)
C2/5A42: 20 5A 4B JSR $4B5A (random # [0..255])
C2/5A45: DA PHX
C2/5A46: 29 01 AND #$01 (reduce random number to 0 or 1)
C2/5A48: AA TAX
C2/5A49: 74 B8 STZ $B8,X (clear $B8 [character targets] or $B9 [monster targets] .
i THINK the only case where C2/5937 would have both characters
and monsters targeted with "Autoselect both parties" unset
or "Autoselect one party" set along with it is that of a
Zombie caster)
C2/5A4B: FA PLX
C2/5A4C: 60 RTS
C2/5A4D: DA PHX
C2/5A4E: 08 PHP
C2/5A4F: C2 20 REP #$20
C2/5A51: A2 12 LDX #$12
C2/5A53: BD 18 30 LDA $3018,X
C2/5A56: 24 B8 BIT $B8
C2/5A58: F0 22 BEQ $5A7C (Branch if not a target)
C2/5A5A: BD A0 3A LDA $3AA0,X
C2/5A5D: 4A LSR
C2/5A5E: 90 17 BCC $5A77 (? is target still valid?)
C2/5A60: A9 C2 00 LDA #$00C2
C2/5A63: E0 08 CPX #$08
C2/5A65: B0 03 BCS $5A6A (Branch if monster)
C2/5A67: A9 80 00 LDA #$0080
C2/5A6A: 3C E4 3E BIT $3EE4,X
C2/5A6D: D0 08 BNE $5A77 (Branch if death status, and zombie and Petrify for
monsters)
C2/5A6F: BD F8 3E LDA $3EF8,X
C2/5A72: 89 00 20 BIT #$2000
C2/5A75: F0 05 BEQ $5A7C (Branch if not hidden)
C2/5A77: BD 18 30 LDA $3018,X
C2/5A7A: 14 B8 TRB $B8 (clear current target)
C2/5A7C: CA DEX
C2/5A7D: CA DEX
C2/5A7E: 10 D3 BPL $5A53 (loop for all monsters and characters)
C2/5A80: 28 PLP
C2/5A81: FA PLX
C2/5A82: 60 RTS
C2/5A83 unknow
(??? called whenever battle timer is incremented)
C2/5A83: AD 91 3A LDA $3A91 (Lower byte of time counter)
C2/5A86: EE 91 3A INC $3A91 (increment that counter)
C2/5A89: 29 0F AND #$0F
C2/5A8B: C9 0A CMP #$0A
C2/5A8D: B0 52 BCS $5AE1 (Branch if lower nibble of time counter was >= #$0A)
(otherwise, A now corresponds to one of the 10
onscreen entities.)
C2/5A8F: 0A ASL
C2/5A90: AA TAX
C2/5A91: BD A0 3A LDA $3AA0,X
C2/5A94: 4A LSR
C2/5A95: 90 52 BCC $5AE9 (Exit if bit 0 of $3AA0,X is clear)
C2/5A97: 18 CLC
C2/5A98: BD DC 3A LDA $3ADC,X
C2/5A9B: 7D DD 3A ADC $3ADD,X (Add ATB multiplier (set at C2/09D2))
C2/5A9E: 9D DC 3A STA $3ADC,X
C2/5AA1: 90 46 BCC $5AE9 (Exit if no carry set from addition)
C2/5AA3: BD F1 3A LDA $3AF1,X (Get Stop timer, originally set to #$12
at C2/467D)
C2/5AA6: F0 09 BEQ $5AB1 (Branch if it's 0, as that *should* mean the
entity is not stopped.)
C2/5AA8: DE F1 3A DEC $3AF1,X (Decrement Stop timer)
C2/5AAB: D0 3C BNE $5AE9 (did it JUST run down on this tick? if not, exit)
C2/5AAD: A9 01 LDA #$01
C2/5AAF: 80 55 BRA $5B06 (Set Stop to wear off)
(Also decrement Reflect, Freeze, and Sleep timers if
applicable, and check if any have worn off. That
makes no sense, as these timers are stalled on
all of the Stop timer's preceding ticks; they should
be stalled during the last one as well. To contrast,
an entity's Condemned countdown and Regen/Seizure/etc
resume on the tick following the one where its Stop
timer hits zero -- that's much more consistent with
the simple concept of time unfreezing *after* Stop
wears off.)
C2/5AB1: BD A0 3A LDA $3AA0,X
C2/5AB4: 89 10 BIT #$10
C2/5AB6: D0 31 BNE $5AE9 (Exit if bit 4 of $3AA0,X is set)
C2/5AB8: BD 05 3B LDA $3B05,X (Condemned counter - originally set at C2/09B4.
To be clear, 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/5ABB: C9 02 CMP #$02
C2/5ABD: 90 0A BCC $5AC9 (Branch if counter < 2. [i.e. numerals < "01",
meaning they're "00" or disabled.])
C2/5ABF: 3A DEC
C2/5AC0: 9D 05 3B STA $3B05,X (decrement counter)
C2/5AC3: 3A DEC (just think of this second "DEC" as an optimized
"CMP #$01", as we're not altering the counter.)
C2/5AC4: D0 03 BNE $5AC9 (Branch if counter now != 1 [i.e. numerals != "00"])
C2/5AC6: 20 C7 5B JSR $5BC7 (Cast Doom when countdown numerals reach 0)
C2/5AC9: 20 1B 5C JSR $5C1B (Check if runs from combat)
C2/5ACC: 20 4F 5B JSR $5B4F (Trigger Poison, Seizure, Regen, Phantasm, or
Tentacle Drain damage)
C2/5ACF: 7B TDC
C2/5AD0: 20 06 5B JSR $5B06 (Decrement Reflect, Freeze, and Sleep timers if
applicable, and check if any have worn off)
C2/5AD3: FE F0 3A INC $3AF0,X (advance this entity's pointer to the next entry
in the C2/5AEA function table)
C2/5AD6: BD F0 3A LDA $3AF0,X
C2/5AD9: 9B TXY
C2/5ADA: 29 07 AND #$07 (convert it to 0-7, wrapping as necessary)
C2/5ADC: 0A ASL
C2/5ADD: AA TAX
C2/5ADE: 7C EA 5A JMP ($5AEA,X) (determine which periodic/damage healing type
will be checked on this entity's next tick.)
C2/5AE1: E9 0A SBC #$0A (should only be reached if ($3A91 AND 15) was >= 10
at start of function. now subtract 10)
C2/5AE3: 0A ASL
C2/5AE4: AA TAX
C2/5AE5: 7C FA 5A JMP ($5AFA,X)
C2/5AE8: BB TYX
C2/5AE9: 60 RTS
C2/5AEA pointers
(Note: choosing RTS will default to the (monster) entity draining anybody it has Seized on its next tick.) C2/5AEA: 45 5B (Set bit 3 of $3E4C,X - check regen, seizure, phantasm) C2/5AEC: E8 5A (RTS) C2/5AEE: 3B 5B (Set bit 4 of $3E4C,X - check poison) C2/5AF0: E8 5A (RTS) C2/5AF2: 45 5B (Set bit 3 of $3E4C,X - check regen, seizure, phantasm) C2/5AF4: E8 5A (RTS) C2/5AF6: E8 5A (RTS) C2/5AF8: E8 5A (RTS)
C2/5AFA pointers
C2/5AFA: B2 5B (Enemy Roulette completion) C2/5AFC: FC 5B (Increment time counters) C2/5AFE: E9 5A (RTS) C2/5B00: E9 5A (RTS) C2/5B02: E9 5A (RTS) C2/5B04: D0 5B (Check if characters run?)
C2/5B06 decrement status counters based on time
(Decrement Reflect, Freeze, and Sleep timers if applicable, and if any
have worn off, mark them to be removed. If A was 1 (rather than 0) going
into this function, which means Stop just ran out, mark it to be removed.)
C2/5B06: 85 B8 STA $B8
C2/5B08: BD 0C 3F LDA $3F0C,X (Time until Reflect wears off)
(Originally set to #$1A at C2/4687)
C2/5B0B: F0 09 BEQ $5B16 (branch if timer not active)
C2/5B0D: DE 0C 3F DEC $3F0C,X (Decrement Reflect timer)
C2/5B10: D0 04 BNE $5B16
C2/5B12: A9 02 LDA #$02
C2/5B14: 04 B8 TSB $B8 (If Reflect timer reached 0 on this tick,
set to remove Reflect)
C2/5B16: BD 0D 3F LDA $3F0D,X (Time until Freeze wears off)
(Originally set to #$22 at C2/4691)
C2/5B19: F0 09 BEQ $5B24 (branch if timer not active)
C2/5B1B: DE 0D 3F DEC $3F0D,X (Decrement Freeze timer)
C2/5B1E: D0 04 BNE $5B24
C2/5B20: A9 04 LDA #$04
C2/5B22: 04 B8 TSB $B8 (If Freeze timer reached 0 on this tick,
set to remove Freeze)
C2/5B24: BD F9 3C LDA $3CF9,X (Time until Sleep wears off)
(Originally set to #$12 at C2/4633)
C2/5B27: F0 09 BEQ $5B32 (branch if timer not active)
C2/5B29: DE F9 3C DEC $3CF9,X (Decrement Sleep timer)
C2/5B2C: D0 04 BNE $5B32
C2/5B2E: A9 08 LDA #$08
C2/5B30: 04 B8 TSB $B8 (If Sleep timer reached 0 on this tick,
set to remove Sleep)
C2/5B32: A5 B8 LDA $B8
C2/5B34: F0 B3 BEQ $5AE9 (Exit if we haven't marked any of the
statuses to be auto-removed)
C2/5B36: A9 29 LDA #$29
C2/5B38: 4C 91 4E JMP $4E91
C2/5B3B queue to check for poison
Set to check for Poison on this entity's next tick C2/5B3B: BB TYX C2/5B3C: BD 4C 3E LDA $3E4C,X C2/5B3F: 09 10 ORA #$10 C2/5B41: 9D 4C 3E STA $3E4C,X (Set bit 4 of $3E4C,X) C2/5B44: 60 RTS
C2/5B45 queue to check for regen, seizure and phantasm
Set to check for Regen, Seizure, Phantasm on this entity's next tick C2/5B45: BB TYX C2/5B46: BD 4C 3E LDA $3E4C,X C2/5B49: 09 08 ORA #$08 C2/5B4B: 9D 4C 3E STA $3E4C,X (Set bit 3 of $3E4C,X) C2/5B4E: 60 RTS
C2/5B4F trigger poison, regen, seizure, phantasm or drain attack
Trigger Poison, Regen, Seizure, Phantasm, or Tentacle Drain attack
C2/5B4F: A9 10 LDA #$10
C2/5B51: 3C A1 3A BIT $3AA1,X
C2/5B54: D0 F8 BNE $5B4E (Exit if bit 4 of $3AA1 is set. we already
have some periodic damage/healing queued for
this entity, so don't queue any more yet.)
C2/5B56: BD 4C 3E LDA $3E4C,X
C2/5B59: 89 10 BIT #$10
C2/5B5B: F0 0E BEQ $5B6B (Branch if bit 4 of $3E4C,X is not set)
(Check Regen and Seizure and Phantasm if not set,
Poison if set)
C2/5B5D: 29 EF AND #$EF
C2/5B5F: 9D 4C 3E STA $3E4C,X (Clear bit 4 of $3E4C,X)
C2/5B62: BD E4 3E LDA $3EE4,X (Status byte 1)
C2/5B65: 29 04 AND #$04
C2/5B67: F0 E5 BEQ $5B4E (Exit if not poisoned)
C2/5B69: 80 1A BRA $5B85
C2/5B6B check seizure, phantasm and regen
Check Seizure, Phantasm, and Regen
C2/5B6B: 89 08 BIT #$08
C2/5B6D: F0 23 BEQ $5B92 (Branch if bit 3 of $3E4C,X is not set)
(Check Tentacle Drain if not set, Seizure and Phantasm
and Regen if set)
C2/5B6F: 29 F7 AND #$F7
C2/5B71: 9D 4C 3E STA $3E4C,X (Clear bit 3 of $3E4C,X)
C2/5B74: BD E5 3E LDA $3EE5,X
C2/5B77: 1D 4D 3E ORA $3E4D,X (are Seizure or Phantasm set?)
C2/5B7A: 29 40 AND #$40
C2/5B7C: D0 07 BNE $5B85 (if at least one is, branch)
C2/5B7E: BD F8 3E LDA $3EF8,X
C2/5B81: 29 02 AND #$02 (is Regen set?)
C2/5B83: F0 C9 BEQ $5B4E (if not, exit function)
C2/5B85: 8D 7B 3A STA $3A7B (Set spell) (02 = Regen, 04 = Poison, 40 = Seizure/Phantasm)
C2/5B88: A9 22 LDA #$22
C2/5B8A: 8D 7A 3A STA $3A7A (Set command to #$22 - Poison, Regen, Seizure, Phantasm)
C2/5B8D: 20 B2 4E JSR $4EB2
C2/5B90: 80 17 BRA $5BA9
C2/5B92 check drain from being seized
C2/5B92: BC 58 33 LDY $3358,X
C2/5B95: 30 B7 BMI $5B4E (Exit if monster doesn't have a character seized)
C2/5B97: C2 20 REP #$20 (Set 16-bit A)
C2/5B99: B9 18 30 LDA $3018,Y
C2/5B9C: 85 B8 STA $B8 (Set target to character monster has seized)
C2/5B9E: A9 2D 00 LDA #$002D
C2/5BA1: 8D 7A 3A STA $3A7A (Set command to #$2D - drain from being seized)
C2/5BA4: E2 20 SEP #$20 (Set 8-bit A)
C2/5BA6: 20 B2 4E JSR $4EB2
C2/5BA9: A9 10 LDA #$10
C2/5BAB: 1D A1 3A ORA $3AA1,X
C2/5BAE: 9D A1 3A STA $3AA1,X (Set bit 4 of $3AA1,X. This bit will prevent us from
queueing up more than one instance of periodic
damage/healing (i.e. Poison, Seizure/Phantasm, Regen,
or Tentacle Drain) at a time for a given entity.)
C2/5BB1: 60 RTS
C2/5BB2 enemy roulette completion
(Enemy Roulette completion)
C2/5BB2: AD 43 2F LDA $2F43 (top byte of Enemy Roulette target bitfield, which
is set at C1/B41A when the cursor winds down.)
C2/5BB5: 30 97 BMI $5B4E (Exit if no targets are defined)
C2/5BB7: C2 20 REP #$20 (Set 16-bit A)
C2/5BB9: AD 42 2F LDA $2F42 (get our chosen target)
C2/5BBC: 20 F9 51 JSR $51F9 (Y = bit number of highest bit set in A (0 for bit 0,
2 for bit 1, 4 for bit 2, etc.))
C2/5BBF: 7B TDC
C2/5BC0: 3A DEC
C2/5BC1: 8D 42 2F STA $2F42 (Set $2F42 to #$FFFF)
C2/5BC4: E2 20 SEP #$20 (Set 8-bit A)
C2/5BC6: BB TYX
C2/5BC7: A9 0D LDA #$0D (Condemned expiration enters here)
C2/5BC9: 85 B8 STA $B8 (spell = Doom)
C2/5BCB: A9 26 LDA #$26
C2/5BCD: 4C 91 4E JMP $4E91
C2/5BD0 unknow
C2/5BD0: AD 45 2F LDA $2F45 (characters trying to run)
C2/5BD3: F0 45 BEQ $5C1A (exit if not trying to run)
C2/5BD5: A5 B1 LDA $B1
C2/5BD7: 89 02 BIT #$02 (is Can't Run set?)
C2/5BD9: D0 16 BNE $5BF1 (branch if so)
C2/5BDB: AD 91 3A LDA $3A91 (get bottom byte of battle time counter equiv.)
C2/5BDE: 29 70 AND #$70
C2/5BE0: D0 38 BNE $5C1A (7/8 chance of exit)
C2/5BE2: AD 45 2F LDA $2F45 (characters trying to run. yes, a duplicate
check. it's done because C2/5C1B and C2/11BB
can branch here.)
C2/5BE5: F0 33 BEQ $5C1A (exit if not trying to run)
C2/5BE7: AD 38 3A LDA $3A38 (characters who are successfully running)
C2/5BEA: F0 2E BEQ $5C1A (branch if none)
C2/5BEC: AD 97 3A LDA $3A97
C2/5BEF: D0 29 BNE $5C1A (exit if in Colosseum)
C2/5BF1: A9 04 LDA #$04
C2/5BF3: 04 B0 TSB $B0
C2/5BF5: D0 23 BNE $5C1A
C2/5BF7: A9 2A LDA #$2A
C2/5BF9: 4C 91 4E JMP $4E91
C2/5BFC increment time counters
C2/5BFC: 08 PHP C2/5BFD: C2 20 REP #$20 (set 16-bit A) C2/5BFF: EE 44 3A INC $3A44 (increment Global battle time counter) C2/5C02: A2 12 LDX #$12 (point to last enemy) C2/5C04: BD A0 3A LDA $3AA0,X C2/5C07: 4A LSR C2/5C08: 90 0B BCC $5C15 (Skip if bit 0 of $3AA0,X is not set) C2/5C0A: BD E4 3E LDA $3EE4,X (status byte 1) C2/5C0D: 89 C0 00 BIT #$00C0 C2/5C10: D0 03 BNE $5C15 (branch if petrified or dead) C2/5C12: FE C0 3D INC $3DC0,X (Increment monster time counter) C2/5C15: CA DEX C2/5C16: CA DEX C2/5C17: 10 EB BPL $5C04 (loop for all monsters and characters) C2/5C19: 28 PLP C2/5C1A: 60 RTS
C2/5C1B check if character runs from combat
C2/5C1B: E0 08 CPX #$08
C2/5C1D: B0 34 BCS $5C53 (Exit if monster)
C2/5C1F: AD 45 2F LDA $2F45 (Characters trying to run)
C2/5C22: F0 2F BEQ $5C53 (Exit if not trying to run)
C2/5C24: AD 39 3A LDA $3A39 (Load characters who've escaped)
C2/5C27: 0D 40 3A ORA $3A40 (Or with characters acting as enemies)
C2/5C2A: 3C 18 30 BIT $3018,X (Does the character we're currently checking
fall into one of those categories (escaped
or enemy)?)
C2/5C2D: D0 24 BNE $5C53 (Exit if so)
C2/5C2F: AD 3B 3A LDA $3A3B (Get the Run Difficulty)
C2/5C32: D0 06 BNE $5C3A (Branch if it's nonzero)
C2/5C34: 20 4D 5C JSR $5C4D
C2/5C37: 4C E2 5B JMP $5BE2
C2/5C3A chance to run from combat
(Figure character's "Run Success" variable and attempt to run)
C2/5C3A: BD 71 3D LDA $3D71,X (Amount to add to "run success" variable.
varies by character.)
C2/5C3D: 20 65 4B JSR $4B65 (random: 0 to A - 1)
C2/5C40: 1A INC (1 to A)
C2/5C41: 18 CLC
C2/5C42: 7D 70 3D ADC $3D70,X
C2/5C45: 9D 70 3D STA $3D70,X (add to Run Success variable)
C2/5C48: CD 3B 3A CMP $3A3B (compare to Run Difficulty)
C2/5C4B: 90 06 BCC $5C53 (if it's less, the character's not running yet)
C2/5C4D: BD 18 30 LDA $3018,X
C2/5C50: 0C 38 3A TSB $3A38 (mark character as successfully running)
C2/5C53: 60 RTS
C2/5C54 unknow
C2/5C54: E2 30 SEP #$30 C2/5C56: A2 06 LDX #$06 C2/5C58: A0 03 LDY #$03 C2/5C5A: BD 19 32 LDA $3219,X (ATB timer, top byte) C2/5C5D: 3A DEC C2/5C5E: 99 22 20 STA $2022,Y (visual ATB gauge?) C2/5C61: BD 04 3B LDA $3B04,X (Morph gauge) C2/5C64: 99 26 20 STA $2026,Y C2/5C67: BD 05 3B LDA $3B05,X (Condemned counter) C2/5C6A: 99 2A 20 STA $202A,Y C2/5C6D: CA DEX C2/5C6E: CA DEX C2/5C6F: 88 DEY C2/5C70: 10 E8 BPL $5C5A (loop for all 4 characters) C2/5C72: 60 RTS
C2/5C73 unknow
C2/5C73: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/5C75: A0 08 LDY #$08 (the following loop nulls the list of enemy
names [and quantities, shown in FF6j but not FF3us]
that appears on the bottom left corner of the
screen in battle?)
C2/5C77: 7B TDC (A = 0000h)
C2/5C78: 99 13 20 STA $2013,Y (store to $2015 - $201B, each having a 16-bit
monster quantity)
C2/5C7B: 3A DEC (A = FFFFh)
C2/5C7C: 99 0B 20 STA $200B,Y (store to $200D - $2013, each having a 16-bit
monster ID)
C2/5C7F: 88 DEY
C2/5C80: 88 DEY
C2/5C81: D0 F4 BNE $5C77 (loop 4 times, as there are 4 list entries)
C2/5C83: E2 20 SEP #$20 (Set 8-bit Accumulator)
C2/5C85: A9 06 LDA #$06
C2/5C87: 14 B1 TRB $B1 (clear Can't Run and Can't Escape)
C2/5C89: AD 1F 20 LDA $201F (get encounter type. 0 = front, 1 = back,
2 = pincer, 3 = side)
C2/5C8C: C9 02 CMP #$02
C2/5C8E: D0 14 BNE $5CA4 (branch if not pincer)
C2/5C90: AD AC 2E LDA $2EAC (bitfield of enemies in left "clump".
set in function C1/1588.)
C2/5C93: 2D 2F 2F AND $2F2F (compare to bitfield of remaining enemies?)
C2/5C96: F0 0C BEQ $5CA4 (branch if no enemy on left side remaining)
C2/5C98: AD AD 2E LDA $2EAD (bitfield of enemies in right "clump".
set in function C1/1588.)
C2/5C9B: 2D 2F 2F AND $2F2F (compare to bitfield of remaining enemies?)
C2/5C9E: F0 04 BEQ $5CA4 (branch if no enemy on right side remaining)
C2/5CA0: A9 02 LDA #$02
C2/5CA2: 04 B1 TSB $B1 (set Can't Run)
C2/5CA4: 9C 3B 3A STZ $3A3B (set Run Difficulty to zero)
C2/5CA7: 9C CA 3E STZ $3ECA (set Number of Unique enemy names who are currently
active to zero? this variable will have a max
of 4, even though the actual number of unique
enemy names can go to 6.)
C2/5CAA: B9 A8 3A LDA $3AA8,Y
C2/5CAD: 4A LSR
C2/5CAE: 90 54 BCC $5D04
C2/5CB0: B9 21 30 LDA $3021,Y
C2/5CB3: 2C 3A 3A BIT $3A3A
C2/5CB6: D0 4C BNE $5D04
C2/5CB8: 2C 09 34 BIT $3409
C2/5CBB: F0 47 BEQ $5D04
C2/5CBD: B9 EC 3E LDA $3EEC,Y (get monster's status byte 1)
C2/5CC0: 89 C2 BIT #$C2
C2/5CC2: D0 40 BNE $5D04 (branch if Zombie, Petrify, or Wound is set)
C2/5CC4: B9 88 3C LDA $3C88,Y (normally accessed as "$3C80,Y" , but we're only looking at
enemies here)
C2/5CC7: 4A LSR (put "Harder to Run From" bit in Carry flag)
C2/5CC8: 89 04 BIT #$04 (is "Can't Run" bit set?)
C2/5CCA: F0 04 BEQ $5CD0
C2/5CCC: A9 06 LDA #$06
C2/5CCE: 04 B1 TSB $B1 (if so, set both Can't Run and Can't Escape. the latter
will stop Warp, Warp Stones, and Smoke Bombs. even though
a failed Smoke Bomb gives a "Can't run away!!" rather than
a "Can't escape!!" message, it just looks at the
Can't Escape bit. )
C2/5CD0: 7B TDC
C2/5CD1: 2A ROL
C2/5CD2: 38 SEC
C2/5CD3: 2A ROL
C2/5CD4: 0A ASL (if "Harder to Run From" was set, A = 6. if not, A = 2.)
C2/5CD5: 6D 3B 3A ADC $3A3B
C2/5CD8: 8D 3B 3A STA $3A3B (add to Run Difficulty)
C2/5CDB: B9 9D 3C LDA $3C9D,Y (normally accessed as $3C95,Y , but we're only looking
at enemies here.)
C2/5CDE: 89 04 BIT #$04 (is "Name Hidden" property set?)
C2/5CE0: D0 22 BNE $5D04 (branch if so)
C2/5CE2: C2 20 REP #$20
C2/5CE4: A2 00 LDX #$00
C2/5CE6: BD 0D 20 LDA $200D,X (entry in list of enemy names you see on bottom left
of screen in battle?)
C2/5CE9: 10 09 BPL $5CF4 (branch if this entry has already been assigned an
enemy ID)
C2/5CEB: B9 88 33 LDA $3388,Y (get entry from Enemy Name structure, initialized
in function C2/2C30 [using $3380], for our current
monster pointed to by Y. this structure has a list
of enemy IDs for the up to 6 enemies in a battle,
but it's normalized so enemies with matching names have
matching IDs.)
C2/5CEE: 9D 0D 20 STA $200D,X (save it in list of names?)
C2/5CF1: EE CA 3E INC $3ECA (increment the number of unique names of active enemies?
this counter will max out at 4, because the in-battle
list shows a maximum of 4 names, even though the actual
# of unique enemy names goes up to 6.
this variable is used by the FC 10 monster script
command.)
C2/5CF4: D9 88 33 CMP $3388,Y (compare enemy ID previously in this screen list entry
to one in the Name Structure entry. they'll match for
sure if we didn't follow the branch at C2/5CE9.)
C2/5CF7: D0 05 BNE $5CFE (if they don't match, skip to next screen list entry)
C2/5CF9: FE 15 20 INC $2015,X (they did match, so increase the quantity of enemies
who have this name. FF6j displayed a quantity in
battle. FF3us increased enemy names from 8 to 10
characters, so it never shows the quantity.)
C2/5CFC: 80 06 BRA $5D04 (exit this loop, as our enemy ID [as indexed by Y] is
already in the screen list.)
C2/5CFE: E8 INX
C2/5CFF: E8 INX
C2/5D00: E0 08 CPX #$08
C2/5D02: 90 E2 BCC $5CE6 (loop 4 times, as the battle enemy name list has
4 entries.)
C2/5D04: E2 20 SEP #$20
C2/5D06: C8 INY
C2/5D07: C8 INY
C2/5D08: C0 0C CPY #$0C
C2/5D0A: 90 9E BCC $5CAA
C2/5D0C: AD 1F 20 LDA $201F (get encounter type. 0 = front, 1 = back,
2 = pincer, 3 = side)
C2/5D0F: C9 03 CMP #$03
C2/5D11: F0 06 BEQ $5D19 (branch if side attack)
C2/5D13: A5 B0 LDA $B0
C2/5D15: 89 40 BIT #$40
C2/5D17: F0 03 BEQ $5D1C (branch if not Preemptive attack)
C2/5D19: 9C 3B 3A STZ $3A3B (set Run Difficulty to zero)
C2/5D1C: AD 42 3A LDA $3A42
C2/5D1F: F0 04 BEQ $5D25
C2/5D21: A9 02 LDA #$02
C2/5D23: 04 B1 TSB $B1 (set Can't Run)
C2/5D25: 60 RTS
C2/5D26 switch combat status to permanent status
C2/5D26: 08 PHP C2/5D27: C2 20 REP #$20 C2/5D29: E2 10 SEP #$10 C2/5D2B: A0 06 LDY #$06 C2/5D2D: B9 F4 3B LDA $3BF4,Y C2/5D30: 99 78 2E STA $2E78,Y C2/5D33: B9 1C 3C LDA $3C1C,Y C2/5D36: 99 80 2E STA $2E80,Y C2/5D39: B9 08 3C LDA $3C08,Y C2/5D3C: 99 88 2E STA $2E88,Y C2/5D3F: B9 30 3C LDA $3C30,Y C2/5D42: 99 90 2E STA $2E90,Y C2/5D45: B9 E4 3E LDA $3EE4,Y C2/5D48: 99 98 2E STA $2E98,Y C2/5D4B: B9 F8 3E LDA $3EF8,Y C2/5D4E: 99 A0 2E STA $2EA0,Y C2/5D51: 88 DEY C2/5D52: 88 DEY C2/5D53: 10 D8 BPL $5D2D C2/5D55: 28 PLP C2/5D56: 60 RTS
C2/5D57 unknow
C2/5D57: 08 PHP C2/5D58: 20 67 02 JSR $0267 C2/5D5B: A2 06 LDX #$06 C2/5D5D: 9E 99 2E STZ $2E99,X C2/5D60: CA DEX C2/5D61: CA DEX C2/5D62: 10 F9 BPL $5D5D C2/5D64: A2 0B LDX #$0B C2/5D66: 9E 35 2F STZ $2F35,X C2/5D69: CA DEX C2/5D6A: 10 FA BPL $5D66 C2/5D6C: A9 08 LDA #$08 C2/5D6E: 20 11 64 JSR $6411 C2/5D71: 20 03 49 JSR $4903 C2/5D74: AD 97 3A LDA $3A97 C2/5D77: F0 18 BEQ $5D91 (branch if not in Colosseum) C2/5D79: A9 01 LDA #$01 C2/5D7B: 8D 75 2E STA $2E75 C2/5D7E: AD 07 02 LDA $0207 C2/5D81: 8D 35 2F STA $2F35 C2/5D84: 20 DC 54 JSR $54DC C2/5D87: 20 79 62 JSR $6279 C2/5D8A: A9 20 LDA #$20 C2/5D8C: 20 D4 5F JSR $5FD4 C2/5D8F: 28 PLP C2/5D90: 60 RTS
C2/5D91 end of battle routine
(Displays all messages at end of victorious combat)
C2/5D91: C2 10 REP #$10 (Set 16-bit X and Y)
C2/5D93: 7B TDC (clear accumulator)
C2/5D94: AE D4 3E LDX $3ED4 (get battle formation #)
C2/5D97: E0 00 02 CPX #$0200
C2/5D9A: B0 04 BCS $5DA0 (if it's >=512, there's no magic points, so branch)
C2/5D9C: BF 00 B4 DF LDA $DFB400,X (magic points given by that enemy formation)
C2/5DA0: 85 FB STA $FB
C2/5DA2: 64 STZ $F0
C2/5DA4: AD BC 3E LDA $3EBC
C2/5DA7: 29 08 AND #$08 (set after getting any of four Magicites in Zozo --
allows Magic Point display)
C2/5DA9: 85 F1 STA $F1 (save that bit)
C2/5DAB: C2 20 REP #$20 (Set 16-bit Accumulator)
C2/5DAD: A2 0A 00 LDX #$000A
C2/5DB0: BD EC 3E LDA $3EEC,X (check enemy's 1st status byte)
C2/5DB3: 89 C2 00 BIT #$00C2 (Petrify, death, or zombie?)
C2/5DB6: F0 26 BEQ $5DDE (if not, skip this enemy)
C2/5DB8: AD E4 11 LDA $11E4 Leap flag?
C2/5DBB: 89 02 00 BIT #$0002
C2/5DBE: D0 0F BNE $5DD0
C2/5DC0: 18 CLC
C2/5DC2: BD 8C 3D LDA $3D8C,X (get enemy's XP -- base offset 3D84 is used earlier,
but that's because the function was indexing everybody
on screen, not just enemies)
C2/5DC4: 6D 35 2F ADC $2F35
C2/5DC7: 8D 35 2F STA $2F35 (add it to the XP from other enemies)
C2/5DCA: 90 03 BCC $5DCF
C2/5DCC: EE 37 2F INC $2F37 (if it flowed out of bottom word, increment top word)
C2/5DCF: 18 CLC
C2/5DD0: BD A0 3D LDA $3DA0,X (get enemy's GP)
C2/5DD3: 6D 3E 2F ADC $2F3E
C2/5DD6: 8D 3E 2F STA $2F3E (add it to GP from other enemies)
C2/5DD9: 90 03 BCC $5DDE
C2/5DDB: EE 40 2F INC $2F40 (if it flowed out of bottom word, increment top word)
C2/5DDE: CA DEX
C2/5DDF: CA DEX
C2/5DE0: 10 CE BPL $5DB0 (loop for all 6 enemies)
(Following code divides 24-bit XP gained from battle by 8-bit character quantity.
Just long divide a 3-digit number by a 1-digit # to better follow the steps)
C2/5DE2: AD 35 2F LDA $2F35 (bottom 2 bytes of 24-bit(?) XP)
C2/5DE5: 85 E8 STA $E8
C2/5DE7: AD 36 2F LDA $2F36 (top 2 bytes of XP)
C2/5DEA: AE 76 3A LDX $3A76 (Number of characters in party)
C2/5DED: DA PHX
C2/5DEE: 20 92 47 JSR $4792 (Divides 16-bit A / 8-bit X
Stores quotient in 16-bit A. Stores remainder in 8-bit X)
C2/5DF1: 85 EC STA $EC (save quotient)
C2/5DF3: 86 E9 STX $E9 (save remainder)
C2/5DF5: A5 E8 LDA $E8 ( $E8 = (remainder * 256) + bottom byte of original XP )
C2/5DF7: FA PLX
C2/5DF8: 20 92 47 JSR $4792 (divide that by # of characters again)
C2/5DFB: 8D 35 2F STA $2F35 (save bottom byte of final quotient)
C2/5DFE: A5 EC LDA $EC (retrieve top 2 bytes of final quotient)
C2/5E00: 8D 36 2F STA $2F36
C2/5E03: 0D 35 2F ORA $2F35
C2/5E06: F0 06 BEQ $5E0E (if the XP per character is zero, branch)
C2/5E08: A9 27 00 LDA #$0027
C2/5E0B: 20 D4 5F JSR $5FD4
C2/5E0E: E2 20 SEP #$20 (set 8-bit Accumulator)
C2/5E10: A0 06 00 LDY #$0006
C2/5E13: B9 18 30 LDA $3018,Y
C2/5E16: 2C 74 3A BIT $3A74
C2/5E19: F0 58 BEQ $5E73 (Branch if character dead)
C2/5E1B: B9 59 3C LDA $3C59,Y
C2/5E1E: 29 10 AND #$10
C2/5E20: F0 0D BEQ $5E2F (Branch if not x2 Gold)
C2/5E22: 04 F0 TSB $F0
C2/5E24: D0 09 BNE $5E2F (Branch if gold has already been doubled by another
character)
C2/5E26: 0E 3E 2F ASL $2F3E
C2/5E29: 2E 3F 2F ROL $2F3F
C2/5E2C: 2E 40 2F ROL $2F40
C2/5E2F: B9 D8 3E LDA $3ED8,Y (Which character it is)
C2/5E32: C9 00 CMP #$00
C2/5E34: D0 13 BNE $5E49 (Branch if not Terra)
C2/5E36: A5 F1 LDA $F1
C2/5E38: F0 0F BEQ $5E49
C2/5E3A: 04 F0 TSB $F0
C2/5E3C: A5 FB LDA $FB (Number of Magic Points gained from battle)
C2/5E3E: 0A ASL (* 2)
C2/5E3F: 6D F6 1C ADC $1CF6 (Add to Morph supply)
C2/5E42: 90 02 BCC $5E46 (If it didn't overflow, branch)
C2/5E44: A9 FF LDA #$FF (Since it DID overflow, just set it to maximum)
C2/5E46: 8D F6 1C STA $1CF6 (Set Morph supply)
C2/5E49: BE 10 30 LDX $3010,Y (get offset to character info block)
C2/5E4C: 20 35 62 JSR $6235 (Add XP for battle)
C2/5E4F: B9 59 3C LDA $3C59,Y
C2/5E52: 89 08 BIT #$08
C2/5E54: F0 03 BEQ $5E59 (Branch if not x2 XP)
C2/5E56: 20 35 62 JSR $6235 (Add XP for battle)
C2/5E59: B9 D8 3E LDA $3ED8,Y (Which character it is)
C2/5E5C: C9 0C CMP #$0C
C2/5E5E: B0 13 BCS $5E73 (Branch if Gogo or Umaro)
C2/5E60: 20 83 62 JSR $6283 (Stores address for spells known by character in $F4)
C2/5E63: BE 10 30 LDX $3010,Y (get offset to character info block)
C2/5E66: 5A PHY
C2/5E67: 20 EF 5F JSR $5FEF (Cursed Shield check)
C2/5E6A: BD 1E 16 LDA $161E,X (Esper equipped)
C2/5E6D: 30 03 BMI $5E72 (Branch if no esper equipped)
C2/5E6F: 20 2A 60 JSR $602A (Learn spells taught by esper)
C2/5E72: 7A PLY
C2/5E73: 88 DEY
C2/5E74: 88 DEY
C2/5E75: 10 9C BPL $5E13 (Check next character)
C2/5E77: A5 F1 LDA $F1
C2/5E79: 25 F0 AND $F0
C2/5E7B: F0 12 BEQ $5E8F
C2/5E7D: A5 FB LDA $FB (Magic points gained from battle)
C2/5E7F: F0 0E BEQ $5E8F
C2/5E81: 8D 35 2F STA $2F35
C2/5E84: 9C 36 2F STZ $2F36
C2/5E87: 9C 37 2F STZ $2F37
C2/5E8A: A9 35 LDA #$35
C2/5E8C: 20 D4 5F JSR $5FD4
C2/5E8F: A0 06 00 LDY #$0006
C2/5E92: B9 18 30 LDA $3018,Y
C2/5E95: 2C 74 3A BIT $3A74
C2/5E98: F0 1F BEQ $5EB9
C2/5E9A: B9 D8 3E LDA $3ED8,Y
C2/5E9D: 20 83 62 JSR $6283
C2/5EA0: BE 10 30 LDX $3010,Y (get offset to character info block)
C2/5EA3: 98 TYA
C2/5EA4: 4A LSR
C2/5EA5: 8D 38 2F STA $2F38
C2/5EA8: A9 2E LDA #$2E
C2/5EAA: 85 F2 STA $F2
C2/5EAC: 20 6D 60 JSR $606D
C2/5EAF: B9 D8 3E LDA $3ED8,Y
C2/5EB2: C9 0C CMP #$0C
C2/5EB4: B0 03 BCS $5EB9
C2/5EB6: 20 33 61 JSR $6133
C2/5EB9: 88 DEY
C2/5EBA: 88 DEY
C2/5EBB: 10 D5 BPL $5E92
C2/5EBD: E2 10 SEP #$10
C2/5EBF: 7B TDC
C2/5EC0: 38 SEC
C2/5EC1: A2 02 LDX #$02
C2/5EC3: A0 17 LDY #$17
C2/5EC5: 6A ROR
C2/5EC6: 90 02 BCC $5ECA
C2/5EC8: 6A ROR
C2/5EC9: CA DEX
C2/5ECA: 3C 84 3A BIT $3A84,X
C2/5ECD: F0 13 BEQ $5EE2
C2/5ECF: 48 PHA
C2/5ED0: 1D 29 1D ORA $1D29,X
C2/5ED3: 9D 29 1D STA $1D29,X
C2/5ED6: 98 TYA
C2/5ED7: 69 8B ADC #$8B
C2/5ED9: 8D 35 2F STA $2F35
C2/5EDC: A9 2D LDA #$2D
C2/5EDE: 20 D4 5F JSR $5FD4
C2/5EE1: 68 PLA
C2/5EE2: 88 DEY
C2/5EE3: 10 E0 BPL $5EC5
C2/5EE5: AD 0A 30 LDA $300A (which character is Mog)
C2/5EE8: 30 16 BMI $5F00 (branch if not present in party)
C2/5EEA: AE E2 11 LDX $11E2 (get combat background)
C2/5EED: BF 5B 8E ED LDA $ED8E5B,X (get corresponding dance #)
C2/5EF1: 30 0D BMI $5F00 (branch if it's negative - presumably FF)
C2/5EF3: 20 17 52 JSR $5217
C2/5EF6: 0C 4C 1D TSB $1D4C (turn on dance in known dances)
C2/5EF9: D0 05 BNE $5F00 (if it was already on, don't display the
"Learned Dance!" message)
C2/5EFB: A9 40 LDA #$40
C2/5EFD: 20 D4 5F JSR $5FD4
C2/5F00: A5 F0 LDA $F0
C2/5F02: 4A LSR
C2/5F03: 90 05 BCC $5F0A
C2/5F05: A9 2A LDA #$2A
C2/5F07: 20 D4 5F JSR $5FD4
C2/5F0A: A2 05 LDX #$05 (with up to 6 different enemies, you can win up to
6 different types of items)
C2/5F0C: 7B TDC (clear A)
C2/5F0D: 3A DEC (set A to FF)
C2/5F0E: 95 F0 STA $F0,X (item type)
C2/5F10: 74 F6 STZ $F6,X (quantity of that item)
C2/5F12: CA DEX
C2/5F13: 10 F7 BPL $5F0C (loop. so in all 6 item slots, we'll have 0 of item #255)
C2/5F15: A0 0A LDY #$0A (point to last enemy)
C2/5F17: B9 EC 3E LDA $3EEC,Y (check enemy's 1st status byte)
C2/5F1A: 89 C2 BIT #$C2 (Petrify, Wound, or Zombied?)
C2/5F1C: F0 30 BEQ $5F4E (if not, skip this enemy)
C2/5F1E: 20 5A 4B JSR $4B5A (random #, 0 to 255)
C2/5F21: C9 20 CMP #$20 (Carry clear if A < 20h, set otherwise.
this means we'll use the Rare dropped item slot 1/8 of
the time, and the Common 7/8 of the time)
C2/5F23: C2 30 REP #$30 (Acc and Index regs 16-bit)
C2/5F25: 7B TDC (clear A)
C2/5F26: 6A ROR (put Carry in highest bit of A)
C2/5F27: 79 01 20 ADC $2001,Y (enemy number? $2001 is filled by code handling F2 script
command, which handles enemy formation)
C2/5F2A: 0A ASL
C2/5F2B: 2A ROL (multiply enemy # by 4, as Stolen+Dropped Item block is 4 bytes)
(and put Carry into lowest bit. Rare when bit is 0, Common for 1)
C2/5F2C: AA TAX (updated index with enemy num and rare/common slot)
C2/5F2D: BF 02 30 CF LDA $CF3002,X (item dropped - CF3002 is rare, CF3003 is common)
C2/5F31: E2 30 SEP #$30 (Acc and index regs 8-bit)
C2/5F33: C9 FF CMP #$FF (does chosen enemy slot have empty FF item?)
C2/5F35: F0 17 BEQ $5F4E (if so, skip to next enemy)
C2/5F37: A2 05 LDX #$05
C2/5F39: D5 F0 CMP $F0,X (is Item # the same as any of the others won?)
C2/5F3B: F0 0F BEQ $5F4C (if so, branch to increment its quantity)
C2/5F3D: EB XBA
C2/5F3E: B5 F0 LDA $F0,X (if not, check if current battle slot is empty)
C2/5F40: 1A INC
C2/5F41: D0 05 BNE $5F48 (if it wasn't empty, branch to check another battle slot)
C2/5F43: EB XBA
C2/5F44: 95 F0 STA $F0,X (if it was, we can store our item there)
C2/5F46: 80 04 BRA $5F4C
C2/5F48: EB XBA
C2/5F49: CA DEX
C2/5F4A: 10 ED BPL $5F39 (compare item won to next slot)
C2/5F4C: F6 F6 INC $F6,X (increment the quantity of the item won)
C2/5F4E: 88 DEY
C2/5F4F: 88 DEY (move down to next enemy)
C2/5F50: 10 C5 BPL $5F17 (loop for all the critters)
C2/5F52: A2 05 LDX #$05
C2/5F54: B5 F0 LDA $F0,X
C2/5F56: C9 FF CMP #$FF
C2/5F58: F0 1B BEQ $5F75
C2/5F5A: 8D 35 2F STA $2F35
C2/5F5D: 20 DC 54 JSR $54DC
C2/5F60: B5 F6 LDA $F6,X
C2/5F62: 8D 38 2F STA $2F38
C2/5F65: 8D 75 2E STA $2E75
C2/5F68: 20 79 62 JSR $6279
C2/5F6B: A9 20 LDA #$20
C2/5F6D: D6 F6 DEC $F6,X
C2/5F6F: F0 01 BEQ $5F72
C2/5F71: 1A INC
C2/5F72: 20 D4 5F JSR $5FD4
C2/5F75: CA DEX
C2/5F76: 10 DC BPL $5F54
C2/5F78: AD 3E 2F LDA $2F3E
C2/5F7B: 0D 3F 2F ORA $2F3F
C2/5F7E: 0D 40 2F ORA $2F40
C2/5F81: F0 42 BEQ $5FC5
C2/5F83: AD 3E 2F LDA $2F3E
C2/5F86: 8D 38 2F STA $2F38
C2/5F89: AD 3F 2F LDA $2F3F
C2/5F8C: 8D 39 2F STA $2F39
C2/5F8F: AD 40 2F LDA $2F40
C2/5F92: 8D 3A 2F STA $2F3A
C2/5F95: A9 26 LDA #$26
C2/5F97: 20 D4 5F JSR $5FD4
C2/5F9A: 18 CLC
C2/5F9B: A2 FD LDX #$FD
C2/5F9D: BD 63 17 LDA $1763,X
C2/5FA0: 7D 41 2E ADC $2E41,X
C2/5FA3: 9D 63 17 STA $1763,X
C2/5FA6: E8 INX
C2/5FA7: D0 F4 BNE $5F9D
(The following loops will compare the party's GP (held in $1860 - $1862) to
9999999, and if it exceeds that amount, cap it at 9999999.)
C2/5FA9: A2 02 LDX #$02 (start pointing to topmost bytes of party GP
and GP limit)
C2/5FAB: BF C7 5F C2 LDA $C25FC7,X (get current byte of GP limit)
C2/5FAF: DD 60 18 CMP $1860,X (compare to corresponding byte of party GP)
C2/5FB2: F0 0E BEQ $5FC2 (if the byte values match, we don't know how
the overall 24-bit values compare yet, so
go check the next lowest byte)
C2/5FB4: B0 0F BCS $5FC5 (if this byte of the GP limit exceeds the
corresponding byte of the party GP, we know
the overall value is also higher, so there's
no need to alter anything or compare further)
C2/5FB6: A2 02 LDX #$02 (if we reached here, we know party GP must
exceed the 9999999 limit, so cap it.)
C2/5FB8: BF C7 5F C2 LDA $C25FC7,X
C2/5FBC: 9D 60 18 STA $1860,X
C2/5FBF: CA DEX
C2/5FC0: 10 F6 BPL $5FB8 (update all 3 bytes of the party's GP)
C2/5FC2: CA DEX
C2/5FC3: 10 E6 BPL $5FAB
C2/5FC5: 28 PLP
C2/5FC6: 60 RTS
C2/5FC7 data
C2/5FC7: 7F 96 98 (GP cap: 9999999)
C2/5FCA unknow
C2/5FCA: 48 PHA C2/5FCB: A9 01 LDA #$01 C2/5FCD: 0C BC 3E TSB $3EBC C2/5FD0: 20 03 49 JSR $4903 C2/5FD3: 68 PLA C2/5FD4: 08 PHP C2/5FD5: E2 20 SEP #$20 C2/5FD7: C9 FF CMP #$FF C2/5FD9: F0 12 BEQ $5FED C2/5FDB: 8D 6F 2D STA $2D6F C2/5FDE: A9 02 LDA #$02 C2/5FE0: 8D 6E 2D STA $2D6E C2/5FE3: A9 FF LDA #$FF C2/5FE5: 8D 72 2D STA $2D72 C2/5FE8: A9 04 LDA #$04 C2/5FEA: 20 11 64 JSR $6411 C2/5FED: 28 PLP C2/5FEE: 60 RTS
C2/5FEF unknow
C2/5FEF: DA PHX C2/5FF0: A0 06 00 LDY #$0006 (Check all equipment and relic slots) C2/5FF3: BD 1F 16 LDA $161F,X (Item equipped, X determines slot to check) C2/5FF6: C9 FF CMP #$FF C2/5FF8: F0 2A BEQ $6024 (Branch if no item equipped) C2/5FFA: C9 66 CMP #$66 C2/5FFC: D0 0E BNE $600C (Branch if no cursed shield equipped) C2/5FFE: EE C0 3E INC $3EC0 (Increment number of battles fought with cursed shield) C2/6001: D0 09 BNE $600C (Branch if not 256 battles) C2/6003: A9 01 LDA #$01 C2/6005: 04 F0 TSB $F0 C2/6007: A9 67 LDA #$67 C2/6009: 9D 1F 16 STA $161F,X (Change to Paladin Shield) C2/600C: EB XBA C2/600D: A9 1E LDA #$1E C2/600F: 20 81 47 JSR $4781 C2/6012: DA PHX C2/6013: 5A PHY C2/6014: AA TAX C2/6015: 7B TDC C2/6016: BF 04 50 D8 LDA $D85004,X (Spell item teaches) C2/601A: A8 TAY C2/601B: BF 03 50 D8 LDA $D85003,X (Rate spell is learned) C2/601F: 20 4B 60 JSR $604B (Learn spell for equipped item) C2/6022: 7A PLY C2/6023: FA PLX C2/6024: E8 INX (Check next equipment slot) C2/6025: 88 DEY C2/6026: D0 CB BNE $5FF3 (Branch if not last slot to check) C2/6028: FA PLX C2/6029: 60 RTS