If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
Final Fantasy VI/ROM map/Assembly C25: Difference between revisions
< Final Fantasy VI | ROM map
Jump to navigation
Jump to search
m (→set regen,poison,seizure or phantasm damage: corrected typos) |
m (→C2/500B set regen,poison,seizure or phantasm damage: typo correction) |
||
Line 1: | Line 1: | ||
==set regen,poison,seizure or phantasm damage== | ==C2/500B set regen,poison,seizure or phantasm damage== | ||
:check if monsters are alive | :check if monsters are alive | ||
C2/500B AD 77 3A LDA $3A77 number of monsters alive | C2/500B AD 77 3A LDA $3A77 number of monsters alive |
Revision as of 19:51, 14 February 2014
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