data/claims/chrono-trigger-tables.yamlChrono Trigger's data tables (dscotton's ct_disassembly)
Game: Chrono Trigger.
Each of the 256 enemy slots has 23 bytes of stats, which the battle copies into the enemy's combatant record as it loads the enemy: HP (two bytes), level, five status bytes, Stamina, Speed, Magic, Hit, Evade, Magic Defense, Attack and Defense, four elemental bytes, and three more bytes. HP goes to both current and maximum HP. chrono-trigger-tables/enemies
bank_FD.asm#L1681-L1761Battle_LoadEnemyStats: TDC ;FDB438|7B | ; Copies a 23-byte enemy record from EnemyStatData $CC4700 + id*0x17 into the battle combatant stat record. Field map (rec->battle): 0x00-01->+3/+5 & +4/+6; 0x02->+0x12; 0x03-07->+0x22; 0x08-0F->+0x37; 0x10-13 elem defenses->+0x3F ($5E6C array); 0x14-16->+0x19. Enemy id from $7EAF0D,x.
TAY ;FDB439|A8 | ;
STY.B $04 ;FDB43A|8404 |000004;
LDA.W !Enemy03OriginalIndex,X ;FDB43C|BD0DAF |7EAF0D;
STA.B $04 ;FDB43F|8504 |000004;
REP #$20 ;FDB441|C220 | ;
ASL A ;FDB443|0A | ;
ASL A ;FDB444|0A | ;
ASL A ;FDB445|0A | ;
STA.B $00 ;FDB446|8500 |000000;
ASL A ;FDB448|0A | ;
CLC ;FDB449|18 | ;
…Chrono Trigger (USA) · 0xc4700-0xc5dff — $CC:4700-$CC:5DFFChrono Trigger (USA) · 0xc6500-0xc6fff — $CC:6500-$CC:6FFFct_disassembly: Chrono Trigger (US v1.0) disassembly · battle_work.asm#L40-L48BatWork_CurPower = $5E63 ; +0x36 live Power
BatWork_CurStamina = $5E64 ; +0x37 live Stamina
BatWork_CurSpeed = $5E65 ; +0x38 live Speed
BatWork_CurMagic = $5E66 ; +0x39 live Magic
BatWork_CurHit = $5E67 ; +0x3A live Hit (accuracy)
BatWork_CurEvade = $5E68 ; +0x3B live Evade
BatWork_CurMagDef = $5E69 ; +0x3C live Magic Defense
BatWork_CurAttack = $5E6A ; +0x3D live Attack
BatWork_CurDefense = $5E6B ; +0x3E live Defensect_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L30489-L30521Battle_ApplyElemResist: LDA.W $B190 ;C1EF3A|AD90B1 |7EB190; Elemental resistance. ENTRY: reached ONLY via the byte8 TechFxHandler dispatch -- handler 10 (C1EF39 = TDC + fall-through here) or handler 11 (C1EFBC, after the damage multiplier). No direct callers, so a tech gets elemental resistance ONLY if its byte8 selects handler 10/11 (elemental techs); physical combos (handler 2) skip it. A = attack element $7EB190. Despite looking like a bitmask, the consumer is a PRIORITY CASCADE, not a multi-bit test: BIT #$80 Lightning(idx0) / #$40 Shadow(idx1) / #$20 Water(idx2) / #$10 Fire(idx3), and the FIRST set bit branches straight out -- only the HIGHEST set bit is honored, lower bits are ignored. So an attack has exactly ONE element (the field is effectively a priority-encoded enum Lightning>Shadow>Water>Fire; a multi-element value like $30 = Water|Fire resolves to Water only). Only the high nibble selects element. The low nibble is an attack-CLASS tag (0x00 support/no-damage incl. heals, 0x02 magical/elemental damage, 0x04 physical damage -- mutually exclusive; e.g. Antipode $42 = Shadow + magical). It is maintained consistently across the whole table but is INERT at runtime: byte3's ONLY consumer in the ROM is this load -> $B190, and the cascade tests only the high nibble (0x02/0x04/0x00 are all "no element" to it). Actual physical-vs-magical behavior comes from the property record, not this nibble. The chosen index reads target per-element defense $7E5E6C,x (x = target base $7EB1F6 + index) and scales damage once. Absorb/immune flag pass at $C1E575 (target flags $7E5E4E/$7E5E53).
STA.B $2C ;C1EF3D|852C |00002C;
BIT.B #$80 ;C1EF3F|8980 | ;
BEQ + ;C1EF41|F003 |C1EF46;
TDC ;C1EF43|7B | ;
BRA ++ ;C1EF44|8016 |C1EF5C;
; | | ;
+ BIT.B #$40 ;C1EF46|8940 | ;
BEQ + ;C1EF48|F004 |C1EF4E;
LDA.B #$01 ;C1EF4A|A901 | ;
BRA ++ ;C1EF4C|800E |C1EF5C;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FD.asm#L1268-L1292StatBoost_BitmaskApply: LDA.L CharInitData,X ;FDB15F|BF0000CC|CC0000; applies capped +0x0A boosts to current stats (+36 power cap 99, +38 speed cap 16, ...) selected by a bitmask byte read from CC0000,X. Purpose TBD (stat tab / tonic?). NOT the join routine despite reading CharInitData base
STA.B $04 ;FDB163|8504 |000004;
BPL + ;FDB165|1011 |FDB178;
LDX.B $00 ;FDB167|A600 |000000;
LDA.W $0036,X ;FDB169|BD3600 |7E0036;
CLC ;FDB16C|18 | ;
ADC.B $0A ;FDB16D|650A |00000A;
CMP.B #$63 ;FDB16F|C963 | ;
BCC ++ ;FDB171|9002 |FDB175;
LDA.B #$63 ;FDB173|
; | | ;
++ STA.W $0036,X ;FDB175|9D3600 |7E0036;
…Checked by claude, 2026-11-08 — read the routine that loads an enemy's record and the offsets it writes each byte to, then read the 256 records from the ROM; names from the enemy name table at $CC:6500, 11 bytes eachRevised after a check by a second AI model, 2026-11-08.Names are the ROM's own text; a slot whose name holds no text is left blank. The loader writes the five status bytes into the second of the combatant record's two status sets (record bytes $22-$26) and copies the last two of them into the first set; bytes 8-19 go to record bytes $37-$42 and bytes 20-22 to $19-$1B. Stat names are the disassembly's labels for the combatant record's bytes $36-$3E (Power, Stamina, Speed, Magic, Hit, Evade, Magic Defense, Attack, Defense), which the stat boost code bears out for Power at $36 (capped at 99) and Speed at $38 (capped at 16); enemies have no Power byte. The elemental resistance code reads the four elemental bytes, $3F-$42, in the order of the attack element's bits $80, $40, $20 and $10, which the disassembly names Lightning, Shadow, Water and Fire; $04 is the common value. Status and elemental bytes are listed in hexadecimal.
Each of the 256 enemy slots has 7 bytes of rewards: experience and gold (two bytes each), the item it drops after the battle, a second item, and tech points. After a battle the game adds each defeated enemy's experience, gold and tech points to the totals, then its drop unless the drop byte is 0: when the drop and the second item differ, the drop goes on the list of items won only if the enemy's drop flag is set and a roll of 0 to 99 comes under 90; when they are the same item, it goes on a second list without a roll. Each list holds three items; an item already on a list is not added again, and one that finds its list full is lost. chrono-trigger-tables/enemy-rewards
bank_FD.asm#L481-L558LDA.L EnemyRewardTable,X ;FDABD6|BF005ECC|CC5E00;
CLC ;FDABDA|18 | ;
ADC.W !TotalAmountExpWon ;FDABDB|6D8CB2 |7EB28C;
STA.W !TotalAmountExpWon ;FDABDE|8D8CB2 |7EB28C;
LDA.L UNREACH_CC5E02,X ;FDABE1|BF025ECC|CC5E02;
CLC ;FDABE5|18 | ;
ADC.W !TotalAmountGoldWon_B2A5 ;FDABE6|6DA5B2 |7EB2A5;
STA.W !TotalAmountGoldWon_B2A5 ;FDABE9|8DA5B2 |7EB2A5;
TDC ;FDABEC|7B | ;
SEP #$20 ;FDABED|E220 | ;
LDA.L UNREACH_CC5E06,X ;FDABEF|BF065ECC|CC5E06;
REP #$20 ;FDABF3|C220 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L29795-L29819LDA.W $B2CC ;C1EA1B|
STA.B $20 ;C1EA1E|
JSR.W Battle_DispatchTechFx ;C1EA20|
LDA.B $1A ;C1EA23|
BEQ _LEA40 ;C1EA25|
LDX.B $0C ;C1EA27|
LDA.W $AE5A,X ;C1EA29|
BIT.B #$80 ;C1EA2C|
BEQ _LEA40 ;C1EA2E|
AND.B #$7F ;C1EA30|
STA.W $AE5A,X ;C1EA32|
INC.W $B3BF ;C1EA35|
…Chrono Trigger (USA) · 0xc5e00-0xc64ff — $CC:5E00-$CC:64FFChecked by claude, 2026-11-08 — read the battle-end sums of experience (bytes 0-1), gold (2-3) and tech points (6), the drop code on byte 4 and its two lists, and the steal helper that takes byte 5 or byte 4; then read the 256 records from the ROMRevised after a check by a second AI model, 2026-11-08.The disassembly's layout names byte 4 the charm item and byte 5 the drop; the battle-end code reads byte 4 as the drop. A helper the disassembly ties to Ayla's Charm takes byte 5 when a check it runs first succeeds and the first of the enemy's two item flags is set, and otherwise byte 4 when the second flag is set, clearing the flag it uses. Item names are the ROM's own text.
Cited by: Item drop table
The 89 weapon slots ($01-$59) each have a six-byte record (flags, price, who may equip it, a stat bonus, and an element bonus) and a five-byte one whose first byte is the weapon's attack; the menu takes the equipped weapon's as the weapon attack it works the character's attack from. chrono-trigger-tables/weapons
bank_C2.asm#L12969-L13031; Classifies item id A by category boundaries $5A/$7B/$94/$BC: stores class 0-4 to $04CC and the id relative to its class base to $04CE.
Item_ClassifyId: PHX ;C28881|DA | ;
PHP ;C28882|08 | ;
SEP #$30 ;C28883|E230 | ;
LDX.B #$00 ;C28885|A200 | ;
; | | ;
- CMP.L DATA8_C288A8,X ;C28887|DFA888C2|C288A8;
BCC + ;C2888B|9005 |C28892;
INX ;C2888D|E8 | ;
CPX.B #$04 ;C2888E|E004 | ;
BCC - ;C28890|90F5 |C28887;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FF.asm#L538-L542DATA8_FFCF0E = $FFCF0E
DATA8_FFCF18 = $FFCF18
DATA8_FFCF1D = $FFCF1D
DATA8_FFCF27 = $FFCF27
StatTab_DerivedOffsetTable = $FFCF2BChrono Trigger (USA) · 0x288a7-0x288ac — $C2:88A7-$C2:88ACChrono Trigger (USA) · 0x3fcf0e-0x3fcf2b — $FF:CF0E-$FF:CF2Bct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14416-L14426Item_CheckCharCanEquip: PHX ;C293A8|DA | ;
PHP ;C293A9|08 | ;
SEP #$30 ;C293AA|E230 | ;
LDX.W $04C9 ;C293AC|AEC904 |7E04C9;
LDA.W $7A00,X ;C293AF|BD007A |7E7A00;
STA.W $0D71 ;C293B2|8D710D |7E0D71;
LDX.W $9A90 ;C293B5|AE909A |7E9A90;
AND.L CharPartyFlagTable,X ;C293B8|3FBBF9FF|FFF9BB;
PLP ;C293BC|28 | ;
PLX ;C293BD|FA | ;
RTS ;C293BE|60 | ;Chrono Trigger (USA) · 0x3ff9bb-0x3ff9c2 — $FF:F9BB-$FF:F9C2Chrono Trigger (USA) · 0xc0b5e-0xc15c3 — $CC:0B5E-$CC:15C3ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14996-L15070- SEP #$20 ;C298B7|E220 | ;
LDA.B $00 ;C298B9|A500 |000000;
JSR.W Item_GetStatsPtr ;C298BB|20AD88 |C288AD;
LDY.B $00 ;C298BE|A400 |000000;
LDA.L CharInitData,X ;C298C0|BF0000CC|CC0000;
AND.B #$1E ;C298C4|291E | ;
STA.W $7700,Y ;C298C6|990077 |7E7700;
LDA.L DATA8_CC0003,X ;C298C9|BF0300CC|CC0003;
STA.W $7A00,Y ;C298CD|99007A |7E7A00;
LDA.L DATA8_CC0004,X ;C298D0|BF0400CC|CC0004;
STA.W $7B00,Y ;C298D4|99007B |7E7B00;
REP #$20 ;C298D7|C220 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FD.asm#L1250-L1356StatBoost_CheckAndApply: TDC ;FDB141|7B | ;
LDX.B $08 ;FDB142|A608 |000008;
LDA.L DATA8_CC0004,X ;FDB144|BF0400CC|CC0004;
BNE StatBoost_ApplyIndexed ;FDB148|D003 |FDB14D;
JMP.W CODE_JP_FDB200 ;FDB14A|4C00B2 |FDB200;
; | | ;
; Loads boost amount $0A from CC0001,X then falls into StatBoost_BitmaskApply (bitmask CC0000,X selects which stats +$36..$3C get +$0A, capped 99/16/255).
StatBoost_ApplyIndexed: REP #$20 ;FDB14D|C220 | ;
ASL A ;FDB14F|0A | ;
CLC ;FDB150|18 | ;
ADC.B $0E ;FDB151|650E |00000E;
TAX ;FDB153|AA | ;
…Chrono Trigger (USA) · 0xc29d7-0xc2a04 — $CC:29D7-$CC:2A04Chrono Trigger (USA) · 0xc06a4-0xc08bf — $CC:06A4-$CC:08BFChrono Trigger (USA) · 0xc0262-0xc0423 — $CC:0262-$CC:0423ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14147-L14264Menu_ComputeEquippedStats: PHP ;C2916E|08 | ;
…
JSR.W (DATA8_C291DB,X) ;C291B4|FCDB91 |C291DB;
…
LDA.B #$05 ;C291EB|A905 | ;
STA.L !WRMPYA ;C291ED|8F024200|004202;
LDA.W $0DB5 ;C291F1|ADB50D |7E0DB5;
STA.L !WRMPYB ;C291F4|8F034200|004203;
…
Menu_AccumEquipSlotStats: PHP ;C29261|08 | ;
…
JSR.W (DATA8_C2926E,X) ;C29269|FC6E92 |C2926E;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L26365-L26410; gear record byte5 (CC0005+[$08]): bits7..4 select record field +0x3F/+0x40/+0x41/+0x42, low nibble = amount added (gear stat-boost effects)
Battle_ApplyGearStatBonus: TDC ;C1CF69|7B | ;
LDX.B $08 ;C1CF6A|A608 |000008;
LDA.L DATA8_CC0005,X ;C1CF6C|BF0500CC|CC0005;
BNE + ;C1CF70|D003 |C1CF75;
JMP.W CODE_JP_C1CFBD ;C1CF72|4CBDCF |C1CFBD;
; | | ;
+ STA.B $04 ;C1CF75|8504 |000004;
AND.B #$0F ;C1CF77|290F | ;
STA.B $0A ;C1CF79|850A |00000A;
LDA.B $04 ;C1CF7B|A504 |000004;
BPL + ;C1CF7D|100B |C1CF8A;
…Checked by claude, 2026-11-08 — read how the menu finds an item's two records (its class by id: weapons below $5A, armor to $7A, helmets to $93, accessories to $BB, the rest consumables; each class's base and size in bank $FF), which bytes it copies (flags, price, who may equip, stat-bonus index, and the first byte of the second record), the battle code that adds a stat bonus and an element bonus, and the equip check against the character bits $80 (Crono) to $02 (Magus); then read every record from the ROMRevised after a check by a second AI model, 2026-11-08.Names are the ROM's own text (the US release's abbreviations, such as SteelSaber). Who equips an item is its fourth-byte mask; "all" is $FE, the seven characters. A stat bonus is an index into a table of two-byte entries, a mask of stats and one amount for all of them, capped at 99, except Speed at 16 and Evade, which stops only at 255; an element bonus is one byte whose high four bits pick elements and whose low four add to them. Element names follow the disassembly's order (Lightning, Shadow, Water, Fire). Flags are the first byte, in hexadecimal. No weapon has an element bonus. Bytes 2-4 of the second record are listed as stored: the disassembly calls byte 2 a damage spread and bytes 3-4 an on-hit technique and its switch.
The 32 armor slots ($5B-$7A) each have a six-byte record (flags, price, who may equip it, a stat bonus, and an element bonus) and a three-byte one whose first byte is its defense; the menu adds the equipped armor's and helmet's to the defense it totals. chrono-trigger-tables/armor
bank_C2.asm#L12969-L13031; Classifies item id A by category boundaries $5A/$7B/$94/$BC: stores class 0-4 to $04CC and the id relative to its class base to $04CE.
Item_ClassifyId: PHX ;C28881|DA | ;
PHP ;C28882|08 | ;
SEP #$30 ;C28883|E230 | ;
LDX.B #$00 ;C28885|A200 | ;
; | | ;
- CMP.L DATA8_C288A8,X ;C28887|DFA888C2|C288A8;
BCC + ;C2888B|9005 |C28892;
INX ;C2888D|E8 | ;
CPX.B #$04 ;C2888E|E004 | ;
BCC - ;C28890|90F5 |C28887;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FF.asm#L538-L542DATA8_FFCF0E = $FFCF0E
DATA8_FFCF18 = $FFCF18
DATA8_FFCF1D = $FFCF1D
DATA8_FFCF27 = $FFCF27
StatTab_DerivedOffsetTable = $FFCF2BChrono Trigger (USA) · 0x288a7-0x288ac — $C2:88A7-$C2:88ACChrono Trigger (USA) · 0x3fcf0e-0x3fcf2b — $FF:CF0E-$FF:CF2Bct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14416-L14426Item_CheckCharCanEquip: PHX ;C293A8|DA | ;
PHP ;C293A9|08 | ;
SEP #$30 ;C293AA|E230 | ;
LDX.W $04C9 ;C293AC|AEC904 |7E04C9;
LDA.W $7A00,X ;C293AF|BD007A |7E7A00;
STA.W $0D71 ;C293B2|8D710D |7E0D71;
LDX.W $9A90 ;C293B5|AE909A |7E9A90;
AND.L CharPartyFlagTable,X ;C293B8|3FBBF9FF|FFF9BB;
PLP ;C293BC|28 | ;
PLX ;C293BD|FA | ;
RTS ;C293BE|60 | ;Chrono Trigger (USA) · 0x3ff9bb-0x3ff9c2 — $FF:F9BB-$FF:F9C2Chrono Trigger (USA) · 0xc0b5e-0xc15c3 — $CC:0B5E-$CC:15C3ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14996-L15070- SEP #$20 ;C298B7|E220 | ;
LDA.B $00 ;C298B9|A500 |000000;
JSR.W Item_GetStatsPtr ;C298BB|20AD88 |C288AD;
LDY.B $00 ;C298BE|A400 |000000;
LDA.L CharInitData,X ;C298C0|BF0000CC|CC0000;
AND.B #$1E ;C298C4|291E | ;
STA.W $7700,Y ;C298C6|990077 |7E7700;
LDA.L DATA8_CC0003,X ;C298C9|BF0300CC|CC0003;
STA.W $7A00,Y ;C298CD|99007A |7E7A00;
LDA.L DATA8_CC0004,X ;C298D0|BF0400CC|CC0004;
STA.W $7B00,Y ;C298D4|99007B |7E7B00;
REP #$20 ;C298D7|C220 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FD.asm#L1250-L1356StatBoost_CheckAndApply: TDC ;FDB141|7B | ;
LDX.B $08 ;FDB142|A608 |000008;
LDA.L DATA8_CC0004,X ;FDB144|BF0400CC|CC0004;
BNE StatBoost_ApplyIndexed ;FDB148|D003 |FDB14D;
JMP.W CODE_JP_FDB200 ;FDB14A|4C00B2 |FDB200;
; | | ;
; Loads boost amount $0A from CC0001,X then falls into StatBoost_BitmaskApply (bitmask CC0000,X selects which stats +$36..$3C get +$0A, capped 99/16/255).
StatBoost_ApplyIndexed: REP #$20 ;FDB14D|C220 | ;
ASL A ;FDB14F|0A | ;
CLC ;FDB150|18 | ;
ADC.B $0E ;FDB151|650E |00000E;
TAX ;FDB153|AA | ;
…Chrono Trigger (USA) · 0xc29d7-0xc2a04 — $CC:29D7-$CC:2A04ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L26365-L26410; gear record byte5 (CC0005+[$08]): bits7..4 select record field +0x3F/+0x40/+0x41/+0x42, low nibble = amount added (gear stat-boost effects)
Battle_ApplyGearStatBonus: TDC ;C1CF69|7B | ;
LDX.B $08 ;C1CF6A|A608 |000008;
LDA.L DATA8_CC0005,X ;C1CF6C|BF0500CC|CC0005;
BNE + ;C1CF70|D003 |C1CF75;
JMP.W CODE_JP_C1CFBD ;C1CF72|4CBDCF |C1CFBD;
; | | ;
+ STA.B $04 ;C1CF75|8504 |000004;
AND.B #$0F ;C1CF77|290F | ;
STA.B $0A ;C1CF79|850A |00000A;
LDA.B $04 ;C1CF7B|A504 |000004;
BPL + ;C1CF7D|100B |C1CF8A;
…Chrono Trigger (USA) · 0xc08c0-0xc0985 — $CC:08C0-$CC:0985Chrono Trigger (USA) · 0xc047e-0xc04e0 — $CC:047E-$CC:04E0ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14249-L14273; Dispatches on equip slot $0DAD (table C2926E): weapon rank $7C00 -> $0DB5; armor/helm add $7C00 defense into $0DB6; accessory: effect idx $7B00 -> CC29D7 bit mask adds boosts into $0DAE+ and HP +25%/50% for items $A0/$A1 -> $9B25.
Menu_AccumEquipSlotStats: PHP ;C29261|08 | ;
SEP #$30 ;C29262|E230 | ;
LDA.W $0DAD ;C29264|ADAD0D |7E0DAD;
ASL A ;C29267|0A | ;
TAX ;C29268|AA | ;
JSR.W (DATA8_C2926E,X) ;C29269|FC6E92 |C2926E;
PLP ;C2926C|28 | ;
RTS ;C2926D|60 | ;
; | | ;
DATA8_C2926E = $C2926E
incbin "data/bank_C2.bin":$926E..$9276 ;C2926E..C29276
…Checked by claude, 2026-11-08 — read how the menu finds an item's two records (its class by id: weapons below $5A, armor to $7A, helmets to $93, accessories to $BB, the rest consumables; each class's base and size in bank $FF), which bytes it copies (flags, price, who may equip, stat-bonus index, and the first byte of the second record), the battle code that adds a stat bonus and an element bonus, and the equip check against the character bits $80 (Crono) to $02 (Magus); then read every record from the ROMRevised after a check by a second AI model, 2026-11-08.Names are the ROM's own text (the US release's abbreviations, such as SteelSaber). Who equips an item is its fourth-byte mask; "all" is $FE, the seven characters. A stat bonus is an index into a table of two-byte entries, a mask of stats and one amount for all of them, capped at 99, except Speed at 16 and Evade, which stops only at 255; an element bonus is one byte whose high four bits pick elements and whose low four add to them. Element names follow the disassembly's order (Lightning, Shadow, Water, Fire). Flags are the first byte, in hexadecimal. The effect column is the second record's second byte, in hexadecimal; the disassembly reads it as switched on by the third byte and as an index into a table of three-byte entries at $CC:2A05 that set bits in the combatant's record (the four Mails' absorb an element).
The 24 helmet slots ($7C-$93) each have a six-byte record (flags, price, who may equip it, a stat bonus, and an element bonus) and a three-byte one whose first byte is its defense; the menu adds the equipped armor's and helmet's to the defense it totals. chrono-trigger-tables/helmets
bank_C2.asm#L12969-L13031; Classifies item id A by category boundaries $5A/$7B/$94/$BC: stores class 0-4 to $04CC and the id relative to its class base to $04CE.
Item_ClassifyId: PHX ;C28881|DA | ;
PHP ;C28882|08 | ;
SEP #$30 ;C28883|E230 | ;
LDX.B #$00 ;C28885|A200 | ;
; | | ;
- CMP.L DATA8_C288A8,X ;C28887|DFA888C2|C288A8;
BCC + ;C2888B|9005 |C28892;
INX ;C2888D|E8 | ;
CPX.B #$04 ;C2888E|E004 | ;
BCC - ;C28890|90F5 |C28887;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FF.asm#L538-L542DATA8_FFCF0E = $FFCF0E
DATA8_FFCF18 = $FFCF18
DATA8_FFCF1D = $FFCF1D
DATA8_FFCF27 = $FFCF27
StatTab_DerivedOffsetTable = $FFCF2BChrono Trigger (USA) · 0x288a7-0x288ac — $C2:88A7-$C2:88ACChrono Trigger (USA) · 0x3fcf0e-0x3fcf2b — $FF:CF0E-$FF:CF2Bct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14416-L14426Item_CheckCharCanEquip: PHX ;C293A8|DA | ;
PHP ;C293A9|08 | ;
SEP #$30 ;C293AA|E230 | ;
LDX.W $04C9 ;C293AC|AEC904 |7E04C9;
LDA.W $7A00,X ;C293AF|BD007A |7E7A00;
STA.W $0D71 ;C293B2|8D710D |7E0D71;
LDX.W $9A90 ;C293B5|AE909A |7E9A90;
AND.L CharPartyFlagTable,X ;C293B8|3FBBF9FF|FFF9BB;
PLP ;C293BC|28 | ;
PLX ;C293BD|FA | ;
RTS ;C293BE|60 | ;Chrono Trigger (USA) · 0x3ff9bb-0x3ff9c2 — $FF:F9BB-$FF:F9C2Chrono Trigger (USA) · 0xc0b5e-0xc15c3 — $CC:0B5E-$CC:15C3ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14996-L15070- SEP #$20 ;C298B7|E220 | ;
LDA.B $00 ;C298B9|A500 |000000;
JSR.W Item_GetStatsPtr ;C298BB|20AD88 |C288AD;
LDY.B $00 ;C298BE|A400 |000000;
LDA.L CharInitData,X ;C298C0|BF0000CC|CC0000;
AND.B #$1E ;C298C4|291E | ;
STA.W $7700,Y ;C298C6|990077 |7E7700;
LDA.L DATA8_CC0003,X ;C298C9|BF0300CC|CC0003;
STA.W $7A00,Y ;C298CD|99007A |7E7A00;
LDA.L DATA8_CC0004,X ;C298D0|BF0400CC|CC0004;
STA.W $7B00,Y ;C298D4|99007B |7E7B00;
REP #$20 ;C298D7|C220 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FD.asm#L1250-L1356StatBoost_CheckAndApply: TDC ;FDB141|7B | ;
LDX.B $08 ;FDB142|A608 |000008;
LDA.L DATA8_CC0004,X ;FDB144|BF0400CC|CC0004;
BNE StatBoost_ApplyIndexed ;FDB148|D003 |FDB14D;
JMP.W CODE_JP_FDB200 ;FDB14A|4C00B2 |FDB200;
; | | ;
; Loads boost amount $0A from CC0001,X then falls into StatBoost_BitmaskApply (bitmask CC0000,X selects which stats +$36..$3C get +$0A, capped 99/16/255).
StatBoost_ApplyIndexed: REP #$20 ;FDB14D|C220 | ;
ASL A ;FDB14F|0A | ;
CLC ;FDB150|18 | ;
ADC.B $0E ;FDB151|650E |00000E;
TAX ;FDB153|AA | ;
…Chrono Trigger (USA) · 0xc29d7-0xc2a04 — $CC:29D7-$CC:2A04ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L26365-L26410; gear record byte5 (CC0005+[$08]): bits7..4 select record field +0x3F/+0x40/+0x41/+0x42, low nibble = amount added (gear stat-boost effects)
Battle_ApplyGearStatBonus: TDC ;C1CF69|7B | ;
LDX.B $08 ;C1CF6A|A608 |000008;
LDA.L DATA8_CC0005,X ;C1CF6C|BF0500CC|CC0005;
BNE + ;C1CF70|D003 |C1CF75;
JMP.W CODE_JP_C1CFBD ;C1CF72|4CBDCF |C1CFBD;
; | | ;
+ STA.B $04 ;C1CF75|8504 |000004;
AND.B #$0F ;C1CF77|290F | ;
STA.B $0A ;C1CF79|850A |00000A;
LDA.B $04 ;C1CF7B|A504 |000004;
BPL + ;C1CF7D|100B |C1CF8A;
…Chrono Trigger (USA) · 0xc0986-0xc0a1b — $CC:0986-$CC:0A1BChrono Trigger (USA) · 0xc04e1-0xc052b — $CC:04E1-$CC:052Bct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14249-L14273; Dispatches on equip slot $0DAD (table C2926E): weapon rank $7C00 -> $0DB5; armor/helm add $7C00 defense into $0DB6; accessory: effect idx $7B00 -> CC29D7 bit mask adds boosts into $0DAE+ and HP +25%/50% for items $A0/$A1 -> $9B25.
Menu_AccumEquipSlotStats: PHP ;C29261|08 | ;
SEP #$30 ;C29262|E230 | ;
LDA.W $0DAD ;C29264|ADAD0D |7E0DAD;
ASL A ;C29267|0A | ;
TAX ;C29268|AA | ;
JSR.W (DATA8_C2926E,X) ;C29269|FC6E92 |C2926E;
PLP ;C2926C|28 | ;
RTS ;C2926D|60 | ;
; | | ;
DATA8_C2926E = $C2926E
incbin "data/bank_C2.bin":$926E..$9276 ;C2926E..C29276
…Checked by claude, 2026-11-08 — read how the menu finds an item's two records (its class by id: weapons below $5A, armor to $7A, helmets to $93, accessories to $BB, the rest consumables; each class's base and size in bank $FF), which bytes it copies (flags, price, who may equip, stat-bonus index, and the first byte of the second record), the battle code that adds a stat bonus and an element bonus, and the equip check against the character bits $80 (Crono) to $02 (Magus); then read every record from the ROMRevised after a check by a second AI model, 2026-11-08.Names are the ROM's own text (the US release's abbreviations, such as SteelSaber). Who equips an item is its fourth-byte mask; "all" is $FE, the seven characters. A stat bonus is an index into a table of two-byte entries, a mask of stats and one amount for all of them, capped at 99, except Speed at 16 and Evade, which stops only at 255; an element bonus is one byte whose high four bits pick elements and whose low four add to them. Element names follow the disassembly's order (Lightning, Shadow, Water, Fire). Flags are the first byte, in hexadecimal. The effect column is the second record's second byte, in hexadecimal; the disassembly reads it as switched on by the third byte and as an index into a table of three-byte entries at $CC:2A05 that set bits in the combatant's record (the four Mails' absorb an element).
The 39 accessory slots ($95-$BB) each have a four-byte record (flags, price, and who may equip it) and a four-byte one; when the second byte of that has bit 6 set, its third byte is a stat bonus, as a weapon's is. chrono-trigger-tables/accessories
bank_C2.asm#L12969-L13031; Classifies item id A by category boundaries $5A/$7B/$94/$BC: stores class 0-4 to $04CC and the id relative to its class base to $04CE.
Item_ClassifyId: PHX ;C28881|DA | ;
PHP ;C28882|08 | ;
SEP #$30 ;C28883|E230 | ;
LDX.B #$00 ;C28885|A200 | ;
; | | ;
- CMP.L DATA8_C288A8,X ;C28887|DFA888C2|C288A8;
BCC + ;C2888B|9005 |C28892;
INX ;C2888D|E8 | ;
CPX.B #$04 ;C2888E|E004 | ;
BCC - ;C28890|90F5 |C28887;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FF.asm#L538-L542DATA8_FFCF0E = $FFCF0E
DATA8_FFCF18 = $FFCF18
DATA8_FFCF1D = $FFCF1D
DATA8_FFCF27 = $FFCF27
StatTab_DerivedOffsetTable = $FFCF2BChrono Trigger (USA) · 0x288a7-0x288ac — $C2:88A7-$C2:88ACChrono Trigger (USA) · 0x3fcf0e-0x3fcf2b — $FF:CF0E-$FF:CF2Bct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14416-L14426Item_CheckCharCanEquip: PHX ;C293A8|DA | ;
PHP ;C293A9|08 | ;
SEP #$30 ;C293AA|E230 | ;
LDX.W $04C9 ;C293AC|AEC904 |7E04C9;
LDA.W $7A00,X ;C293AF|BD007A |7E7A00;
STA.W $0D71 ;C293B2|8D710D |7E0D71;
LDX.W $9A90 ;C293B5|AE909A |7E9A90;
AND.L CharPartyFlagTable,X ;C293B8|3FBBF9FF|FFF9BB;
PLP ;C293BC|28 | ;
PLX ;C293BD|FA | ;
RTS ;C293BE|60 | ;Chrono Trigger (USA) · 0x3ff9bb-0x3ff9c2 — $FF:F9BB-$FF:F9C2Chrono Trigger (USA) · 0xc0b5e-0xc15c3 — $CC:0B5E-$CC:15C3ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14996-L15070- SEP #$20 ;C298B7|E220 | ;
LDA.B $00 ;C298B9|A500 |000000;
JSR.W Item_GetStatsPtr ;C298BB|20AD88 |C288AD;
LDY.B $00 ;C298BE|A400 |000000;
LDA.L CharInitData,X ;C298C0|BF0000CC|CC0000;
AND.B #$1E ;C298C4|291E | ;
STA.W $7700,Y ;C298C6|990077 |7E7700;
LDA.L DATA8_CC0003,X ;C298C9|BF0300CC|CC0003;
STA.W $7A00,Y ;C298CD|99007A |7E7A00;
LDA.L DATA8_CC0004,X ;C298D0|BF0400CC|CC0004;
STA.W $7B00,Y ;C298D4|99007B |7E7B00;
REP #$20 ;C298D7|C220 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FD.asm#L1250-L1356StatBoost_CheckAndApply: TDC ;FDB141|7B | ;
LDX.B $08 ;FDB142|A608 |000008;
LDA.L DATA8_CC0004,X ;FDB144|BF0400CC|CC0004;
BNE StatBoost_ApplyIndexed ;FDB148|D003 |FDB14D;
JMP.W CODE_JP_FDB200 ;FDB14A|4C00B2 |FDB200;
; | | ;
; Loads boost amount $0A from CC0001,X then falls into StatBoost_BitmaskApply (bitmask CC0000,X selects which stats +$36..$3C get +$0A, capped 99/16/255).
StatBoost_ApplyIndexed: REP #$20 ;FDB14D|C220 | ;
ASL A ;FDB14F|0A | ;
CLC ;FDB150|18 | ;
ADC.B $0E ;FDB151|650E |00000E;
TAX ;FDB153|AA | ;
…Chrono Trigger (USA) · 0xc29d7-0xc2a04 — $CC:29D7-$CC:2A04Chrono Trigger (USA) · 0xc0a1c-0xc0abb — $CC:0A1C-$CC:0ABBChrono Trigger (USA) · 0xc052c-0xc05cb — $CC:052C-$CC:05CBChecked by claude, 2026-11-08 — read how the menu finds an item's two records (its class by id: weapons below $5A, armor to $7A, helmets to $93, accessories to $BB, the rest consumables; each class's base and size in bank $FF), which bytes it copies (flags, price, who may equip, stat-bonus index, and the first byte of the second record), the battle code that adds a stat bonus and an element bonus, and the equip check against the character bits $80 (Crono) to $02 (Magus); then read every record from the ROMRevised after a check by a second AI model, 2026-11-08.Names are the ROM's own text (the US release's abbreviations, such as SteelSaber). Who equips an item is its fourth-byte mask; "all" is $FE, the seven characters. A stat bonus is an index into a table of two-byte entries, a mask of stats and one amount for all of them, capped at 99, except Speed at 16 and Evade, which stops only at 255; an element bonus is one byte whose high four bits pick elements and whose low four add to them. Element names follow the disassembly's order (Lightning, Shadow, Water, Fire). Flags are the first byte, in hexadecimal. The effect bytes are the second record, in hexadecimal. The menu adds a quarter of maximum HP for item $A0 (SilverErng) and half for $A1 (Gold Erng), to at most 999. Prices of 2 belong to accessories the game never sells.
The 53 slots from $BD to $F1 hold the consumables and key items, each with a three-byte record (flags and price) and a four-byte one that the item-use code reads for its effect. chrono-trigger-tables/consumables
bank_C2.asm#L12969-L13031; Classifies item id A by category boundaries $5A/$7B/$94/$BC: stores class 0-4 to $04CC and the id relative to its class base to $04CE.
Item_ClassifyId: PHX ;C28881|DA | ;
PHP ;C28882|08 | ;
SEP #$30 ;C28883|E230 | ;
LDX.B #$00 ;C28885|A200 | ;
; | | ;
- CMP.L DATA8_C288A8,X ;C28887|DFA888C2|C288A8;
BCC + ;C2888B|9005 |C28892;
INX ;C2888D|E8 | ;
CPX.B #$04 ;C2888E|E004 | ;
BCC - ;C28890|90F5 |C28887;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_FF.asm#L538-L542DATA8_FFCF0E = $FFCF0E
DATA8_FFCF18 = $FFCF18
DATA8_FFCF1D = $FFCF1D
DATA8_FFCF27 = $FFCF27
StatTab_DerivedOffsetTable = $FFCF2BChrono Trigger (USA) · 0x288a7-0x288ac — $C2:88A7-$C2:88ACChrono Trigger (USA) · 0x3fcf0e-0x3fcf2b — $FF:CF0E-$FF:CF2Bct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14416-L14426Item_CheckCharCanEquip: PHX ;C293A8|DA | ;
PHP ;C293A9|08 | ;
SEP #$30 ;C293AA|E230 | ;
LDX.W $04C9 ;C293AC|AEC904 |7E04C9;
LDA.W $7A00,X ;C293AF|BD007A |7E7A00;
STA.W $0D71 ;C293B2|8D710D |7E0D71;
LDX.W $9A90 ;C293B5|AE909A |7E9A90;
AND.L CharPartyFlagTable,X ;C293B8|3FBBF9FF|FFF9BB;
PLP ;C293BC|28 | ;
PLX ;C293BD|FA | ;
RTS ;C293BE|60 | ;Chrono Trigger (USA) · 0x3ff9bb-0x3ff9c2 — $FF:F9BB-$FF:F9C2Chrono Trigger (USA) · 0xc0b5e-0xc15c3 — $CC:0B5E-$CC:15C3Chrono Trigger (USA) · 0xc0abc-0xc0b5d — $CC:0ABC-$CC:0B5DChrono Trigger (USA) · 0xc05cc-0xc06a3 — $CC:05CC-$CC:06A3ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L26711-L26740TAX ;C1D1D4|AA | ;
STX.B $16 ;C1D1D5|8616 |000016;
STX.B $18 ;C1D1D7|8618 |000018;
STX.B $1A ;C1D1D9|861A |00001A;
TDC ;C1D1DB|7B | ;
LDA.W $B18C ;C1D1DC|AD8CB1 |7EB18C;
ASL A ;C1D1DF|0A | ;
ASL A ;C1D1E0|0A | ;
TAX ;C1D1E1|AA | ;
LDA.L UNREACH_CC05CF,X ;C1D1E2|BFCF05CC|CC05CF;
AND.B #$3F ;C1D1E6|293F | ;
STA.B $16 ;C1D1E8|8516 |000016;
…Checked by claude, 2026-11-08 — read how the menu finds the two records by item class and copies the flags and price, and the battle item code's reads of the second record; then read the records from the ROMChecked by a second AI model, 2026-11-08.Names are the ROM's own text; slots $E8-$F1 have no name and $FF effect bytes. The effect bytes are listed in hexadecimal: the disassembly reads the first as the effect type (bit 7 restores HP or MP), the second as what it restores, and the last two as a multiplier and an amount (Tonic $01 and $32, Mid Tonic $04 and $32).
Chrono Trigger has 24 shop lists: a table of 24 pointers in bank $CC, the first list starting right after them, each to a list of item numbers ended by 0. Opening a shop copies its list, picked by the shop's number, into RAM and counts it to the first 0. The price the shop charges is the item record's price times a 16-bit factor kept at $7F:01CD, over 256 and rounded up, at least 1, and 65,000 when the product passes 24 bits. chrono-trigger-tables/shops
bank_C2.asm#L22873-L22881LDA.B $71 ;C2DAF5|A571 |000071;
AND.W #$00FF ;C2DAF7|29FF00 | ;
ASL A ;C2DAFA|0A | ;
TAX ;C2DAFB|AA | ;
LDA.L DATA8_CC2C6D,X ;C2DAFC|BF6D2CCC|CC2C6D;
TAX ;C2DB00|AA | ;
LDY.W #$1000 ;C2DB01|A00010 | ;
LDA.W #$001F ;C2DB04|A91F00 | ;
MVN $7E,$CC ;C2DB07|547ECC | ;Chrono Trigger (USA) · 0xc2c6d-0xc2d67 — $CC:2C6D-$CC:2D67ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L23081-L23096Menu_ShopCountBuyList: PHP ;C2DCBE|08 | ;
SEP #$30 ;C2DCBF|E230 | ;
LDY.B #$00 ;C2DCC1|A000 | ;
; | | ;
- LDA.W !Unknown,Y ;C2DCC3|B90010 |7E1000;
BEQ + ;C2DCC6|F003 |C2DCCB;
INY ;C2DCC8|C8 | ;
BRA - ;C2DCC9|80F8 |C2DCC3;
; | | ;
+ STY.W $104A ;C2DCCB|8C4A10 |7E104A;
LDA.B #$00 ;C2DCCE|A900 | ;
; | | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L22933-L22971REP #$30 ;C2DBA0|C230 | ;
LDA.L $7F01CD ;C2DBA2|AFCD017F|7F01CD;
STA.B $04 ;C2DBA6|8504 |000004;
LDA.W #$0002 ;C2DBA8|A90200 | ;
STA.B $02 ;C2DBAB|8502 |000002;
STZ.B $22 ;C2DBAD|6422 |000022;
; | | ;
- LDX.B $22 ;C2DBAF|A622 |000022;
LDA.W !Unknown,X ;C2DBB1|BD0010 |7E1000;
AND.W #$00FF ;C2DBB4|29FF00 | ;
BEQ + ;C2DBB7|F02D |C2DBE6;
ASL A ;C2DBB9|0A | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L27231-L27264; Variant of Menu_MulAccumByteList: first runs it with multiplicand $00, then reruns the loop with multiplicand $01 accumulating into $3F,Y (Y=1) - a two-byte multiplicand spread over two passes.
Menu_MulAccumByteList2: PHP ;C2FD58|08 | ;
JSR.W Menu_MulAccumByteList ;C2FD59|2068FD |C2FD68;
SEP #$30 ;C2FD5C|E230 | ;
LDA.B $01 ;C2FD5E|A501 |000001;
STA.L !WRMPYA ;C2FD60|8F024200|004202;
LDY.B #$01 ;C2FD64|A001 | ;
BRA + ;C2FD66|8011 |C2FD79;
; | | ;
; Hardware-multiply accumulate: for each byte $04,X (X=$51..$02-1) computes $00 * $04,X and adds the 16-bit product into $3E,Y (Y starts at $51); $3E/$40 cleared first.
Menu_MulAccumByteList: PHP ;C2FD68|08 | ;
REP #$30 ;C2FD69|C230 | ;
…Checked by claude, 2026-11-08 — read the shop screen's setup, which indexes the pointer table by the shop number and copies 32 bytes of its list, then read the lists from the ROMRevised after a check by a second AI model, 2026-11-08.Shop 18's list is empty. Item names are the ROM's own text.
The treasure table gives each of the 512 locations a range of four-byte chest records: the chest's tile (two bytes, which the map code masks to an index into the location's tile arrays) and its contents, an item number, or gold when the top bit is set (the low 15 bits times 2), or nothing when the next bit is set. A location whose first record has tile 0 uses another location's chests. 244 chests are listed: 228 items and 16 of gold. chrono-trigger-tables/treasure
bank_C0.asm#L22979-L23036LDA.L DATA8_F5F000 ;C0A73C|AF00F0F5|F5F000;
STA.B $06 ;C0A740|8506 |001D06;
LDA.W $0100 ;C0A742|AD0001 |000100;
AND.W #$01FF ;C0A745|29FF01 | ;
_C0LA748:
ASL A ;C0A748|0A | ;
TAX ;C0A749|AA | ;
LDA.L DATA8_F5F002,X ;C0A74A|BF02F0F5|F5F002;
STA.B $56 ;C0A74E|8556 |001D56;
LDA.L DATA8_F5F000,X ;C0A750|BF00F0F5|F5F000;
CMP.B $56 ;C0A754|C556 |001D56;
BEQ + ;C0A756|F061 |C0A7B9;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C0.asm#L3906-L3931LDX.B $DD ;C01E54|A6DD |0001DD;
REP #$20 ;C01E56|C220 | ;
LDA.L A5LocationMapBlackbirdOverhead_0002,X ;C01E58|BF0200F5|F50002;
BMI ++ ;C01E5C|301D |C01E7B;
BIT.W #$4000 ;C01E5E|890040 | ;
BEQ +++ ;C01E61|F003 |C01E66;
SEP #$20 ;C01E63|
RTS ;C01E65|
; | | ;
+++ AND.W #$01FF ;C01E66|29FF01 | ;
STA.L !IndexItemTextControl ;C01E69|8F00027F|7F0200;
TAY ;C01E6D|A8 | ;
…Chrono Trigger (USA) · 0x35f000-0x35f401 — $F5:F000-$F5:F401Chrono Trigger (USA) · 0x35f402-0x35f7e5 — $F5:F402-$F5:F7E5Checked by claude, 2026-11-08 — read the routine that marks a location's chests on its map (the pointer pair per location, the redirect when a record's tile is 0) and the one that opens a chest (gold, empty, or item), then read every record from the ROMRevised after a check by a second AI model, 2026-11-08.Locations are the game's location numbers, in hexadecimal. Gold is shown as the amount the chest message gets, twice the stored 15 bits.
A character needs 20 experience to go from level 1 to 2 and 51250 to go from 98 to 99, 1743570 in all; level 99 is the cap, where the table's entry is 0. Every character uses the same table. chrono-trigger-tables/experience
bank_C1.asm#L31580-L31663Battle_LevelUpCheck: LDA.B #$FF ;C1F7B9|A9FF | ; One level-up step: if gained XP $B28C >= XP-to-next (record +0x2B), subtract it, INC level (+0x12, cap 99 = $63), set level-up result flag ($B2B0,X bit7), reload +0x2B from XpToNextLevelTable CC2632[newLevel*2]; else deduct gained XP from +0x2B
STA.W $B28B ;C1F7BB|8D8BB2 |7EB28B;
LDX.W $B285 ;C1F7BE|AE85B2 |7EB285;
LDA.W $001D,X ;C1F7C1|BD1D00 |7E001D;
AND.B #$80 ;C1F7C4|2980 | ;
BEQ + ;C1F7C6|F003 |C1F7CB;
JMP.W Battle_LevelUpCheck_CapCheck ;C1F7C8|
; | | ;
+ LDX.W $B285 ;C1F7CB|AE85B2 |7EB285;
LDA.W $0012,X ;C1F7CE|BD1200 |7E0012;
CMP.B #$63 ;C1F7D1|C963 | ;
BCC + ;C1F7D3|9010 |C1F7E5;
…Chrono Trigger (USA) · 0xc2632-0xc26f9 — $CC:2632-$CC:26F9Checked by claude, 2026-11-08 — read the level-up step (gained experience against the record's experience-to-next, the level raised to at most 99, the next requirement read from the table by the new level) and read the 100 entries from the ROMChecked by a second AI model, 2026-11-08.The total column sums the table from level 1.
Cited by: Growth rate
Each character has eight two-byte entries, the tech points to learn each of their eight techniques in turn. After a battle the tech points won go toward the next technique; on learning it, the next entry becomes the target and what was won beyond the old one carries over. While the next technique's record has its magic bit set, the character gains no tech points toward it until that character's magic flag is set. chrono-trigger-tables/tech-points
Value: character Crono, Marle, Lucca, Robo, Frog, Ayla, Magus · Technique 1 5, 10, 10, 0, 10, 10, 0 · Technique 2 90, 50, 60, 0, 15, 60, 0 · Technique 3 0, 0, 0, 5, 0, 100, 0 · Technique 4 200, 150, 160, 150, 160, 200, 400 · Technique 5 500, 250, 250, 400, 250, 400, 400 · Technique 6 400, 400, 400, 600, 400, 600, 400 · Technique 7 800, 600, 600, 800, 600, 800, 900 · Technique 8 1000, 900, 1000, 1000, 1000, 1000, 900
Codect_disassembly: Chrono Trigger (US v1.0) disassembly ·bank_C1.asm#L31065-L31236Battle_AwardTp: LDX.W $B2DB ;C1F39A|AEDBB2 |7EB2DB; Award battle TP ($B2DB) to the char: while TP >= next-tech requirement (TpToNextTechTable CC26FA[char*16 + learned*2] vs running TP $5E5A,X), call Tech_Learn and carry the remainder; then add TP to BatWork_TechPoints (+0x16, 24-bit), cap 9,999,999
STX.B $30 ;C1F39D|8630 |000030;
…
- LDA.B #$FF ;C1F39F|A9FF | ;
STA.W $B2DA ;C1F3A1|8DDAB2 |7EB2DA;
JSR.W Tech_GetNextTechId ;C1F3A4|205FF4 |C1F45F;
TDC ;C1F3A7|7B | ;
LDA.W $B2DA ;C1F3A8|ADDAB2 |7EB2DA;
CMP.B #$FF ;C1F3AB|C9FF | ;
BEQ + ;C1F3AD|F06A |C1F419;
LDA.W $B2D1 ;C1F3AF|ADD1B2 |7EB2D1;
REP #$20 ;C1F3B2|C220 | ;
…Chrono Trigger (USA) · 0xc26fa-0xc2769 — $CC:26FA-$CC:2769Checked by claude, 2026-11-08 — read the routine that awards tech points (the next technique's requirement from the table by character and techniques learned, the carry-over, the cap) and read the 56 entries from the ROMRevised after a check by a second AI model, 2026-11-08.Entry 1 is also each character's starting requirement in their starting record. Robo's first two entries and Magus's first three are 0. The magic flag is one bit for each character, which the disassembly ties to Spekkio.
Each character's maximum HP grows by a fixed amount per level, set by up to four level brackets of two bytes each (the bracket's last level and the gain), and is capped at 999. A level-up adds the gain of the first bracket whose last level is at or above the new level. chrono-trigger-tables/hp-growth
bank_C1.asm#L31665-L31704Battle_ApplyHpMpGrowth: TDC ;C1F871|7B | ; Per level gained: scan HpGrowthTable CC258A[charId*8] (4 pairs [maxLevel, gain]) for first maxLevel >= level, add gain to MaxHP (+0x05, cap 999); same with MpGrowthTable CC25C2 for MaxMP (+0x09, cap 99)
TAX ;C1F872|AA | ;
STX.B $10 ;C1F873|8610 |000010;
; | | ;
- TDC ;C1F875|7B | ;
LDX.W $B285 ;C1F876|AE85B2 |7EB285;
LDA.W !TemporaryValues,X ;C1F879|BD0000 |7E0000;
ASL A ;C1F87C|0A | ;
ASL A ;C1F87D|0A | ;
ASL A ;C1F87E|0A | ;
CLC ;C1F87F|18 | ;
ADC.B $10 ;C1F880|6510 |000010;
…Chrono Trigger (USA) · 0xc258a-0xc25c1 — $CC:258A-$CC:25C1Checked by claude, 2026-11-08 — read the HP half of the growth routine (the bracket scan by character, the gain added to the record's maximum HP, the cap) and read the brackets from the ROMChecked by a second AI model, 2026-11-08.Levels are the level reached. A bracket whose last level is $FF covers the rest; the listing stops at 99.
Cited by: Growth rate
Each character's maximum MP grows by a fixed amount per level, set by up to four level brackets of two bytes each (the bracket's last level and the gain), and is capped at 99. A level-up adds the gain of the first bracket whose last level is at or above the new level. chrono-trigger-tables/mp-growth
bank_C1.asm#L31665-L31746Battle_ApplyHpMpGrowth: TDC ;C1F871|7B | ; Per level gained: scan HpGrowthTable CC258A[charId*8] (4 pairs [maxLevel, gain]) for first maxLevel >= level, add gain to MaxHP (+0x05, cap 999); same with MpGrowthTable CC25C2 for MaxMP (+0x09, cap 99)
TAX ;C1F872|AA | ;
STX.B $10 ;C1F873|8610 |000010;
; | | ;
- TDC ;C1F875|7B | ;
LDX.W $B285 ;C1F876|AE85B2 |7EB285;
LDA.W !TemporaryValues,X ;C1F879|BD0000 |7E0000;
ASL A ;C1F87C|0A | ;
ASL A ;C1F87D|0A | ;
ASL A ;C1F87E|0A | ;
CLC ;C1F87F|18 | ;
ADC.B $10 ;C1F880|6510 |000010;
…Chrono Trigger (USA) · 0xc25c2-0xc25f9 — $CC:25C2-$CC:25F9Checked by claude, 2026-11-08 — read the MP half of the growth routine (the bracket scan by character, the gain added to the record's maximum MP, the cap) and read the brackets from the ROMChecked by a second AI model, 2026-11-08.Levels are the level reached. A bracket whose last level is $FF covers the rest; the listing stops at 99.
On each level-up the game recomputes six of a character's base stats as their level-1 value plus the growth rate times (level − 1) divided by 100, rounded down: Power, Stamina, Hit, Evade, Magic and Magic Defense, each capped at 99. Speed is not recomputed (its rate is 0 for everyone), and is capped at 50. chrono-trigger-tables/stat-growth
Value: character Crono, Marle, Lucca, Robo, Frog, Ayla, Magus · power 1.4, 0.3, 0.28, 1.6, 1.3, 1.5, 1.2 · stamina 1.65, 0.7, 0.8, 1.78, 1.6, 1.72, 1 · hit 0.3, 0.3, 0.42, 0.42, 0.32, 0.72, 0.78 · evade 0.38, 0.36, 0.32, 0.3, 0.42, 0.8, 0.66 · magic 0.42, 0.9, 1, 0.52, 0.52, 0.3, 1.13 · Magic Defense 1.6, 1.72, 1.68, 1.3, 1.63, 1.52, 1.75 · speed 0, 0, 0, 0, 0, 0, 0
Codect_disassembly: Chrono Trigger (US v1.0) disassembly ·bank_C1.asm#L31403-L31556Battle_LevelUp_RecomputeStats: JSR.W Battle_ApplyHpMpGrowth ;C1F630|2071F8 |C1F871; (mid-routine label) recomputes base stats from level-1 baseline + StatGrowthTable per stat; char ID from record +00 indexes table
…
ADC.W #StatGrowthTable-CharInitData ;C1F64A|69FA25 | ; index origin is CharInitData($CC0000); reach StatGrowthTable via the delta
…
LDA.L CharInitData,X ;C1F656|BF0000CC|CC0000;
…
LDA.W $0012,X ;C1F660|BD1200 |7E0012;
DEC A ;C1F663|3A | ;
…
JSR.W Battle_Mul16 ;C1F667|200BC9 |C1C90B;
…
LDX.W #$0064 ;C1F66E|A26400 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L31557-L31578TDC ;C1F791|7B | ;
TAY ;C1F792|A8 | ;
LDX.W $B285 ;C1F793|AE85B2 |7EB285;
; | | ;
- LDA.W $000B,X ;C1F796|BD0B00 |7E000B;
CMP.B #$63 ;C1F799|C963 | ;
BCC + ;C1F79B|9005 |C1F7A2;
LDA.B #$63 ;C1F79D|
STA.W $000B,X ;C1F79F|
; | | ;
+ INX ;C1F7A2|E8 | ;
INY ;C1F7A3|C8 | ;
…Chrono Trigger (USA) · 0xc25fa-0xc2631 — $CC:25FA-$CC:2631Checked by claude, 2026-11-08 — read the recompute routine (each rate times level − 1, over 100, added to the level-1 value kept in the record at bytes $2F-$35, written to bytes $0B-$11; the caps) and read the 7 rates per character from the ROMRevised after a check by a second AI model, 2026-11-08.Rates are per level, as the table's hundredths. The rates are stored in the order Power, Stamina, Speed, Hit, Evade, Magic, Magic Defense, which differs from the record's order (Power, Stamina, Speed, Magic, Hit, Evade, Magic Defense). An eighth row of zeros follows Magus's.
Cited by: Growth rate
A new game copies seven 80-byte character records from the start of bank $CC into RAM, one per playable character: level, HP, MP, the seven base stats, experience, the four pieces of equipment, the experience and tech points to the next level and technique, and the level-1 stats that growth starts from. chrono-trigger-tables/starting-stats
Value: character Crono, Marle, Lucca, Robo, Frog, Ayla, Magus · level 1, 1, 2, 10, 5, 18, 37 · HP 70, 65, 75, 235, 128, 335, 650 · MP 8, 12, 14, 24, 17, 38, 84 · power 5, 2, 2, 21, 9, 35, 51 · stamina 8, 6, 6, 26, 14, 38, 43 · speed 12, 8, 6, 6, 11, 13, 12 · magic 5, 8, 8, 7, 8, 8, 50 · hit 8, 8, 8, 9, 9, 22, 20 · evade 8, 8, 8, 8, 9, 25, 33 · Magic Defense 2, 8, 10, 12, 9, 26, 72 · Experience 0, 0, 20, 1840, 240, 11520, 97780 · weapon Wood Sword, Bronze Bow, Air Gun, Tin Arm, BronzeEdge, Fist, DarkScythe · armor Hide Tunic, Hide Tunic, Karate Gi, Titan Vest, BronzeMail, Ruby Vest, RavenArmor · helmet Hide Cap, Hide Cap, Hide Cap, Iron Helm, BronzeHelm, Rock Helm, Doom Helm · accessory Bandana, Ribbon, SightScope, Defender, PowerGlove, PowerScarf, Amulet · Experience to next 20, 20, 40, 650, 160, 2050, 9200 · Tech points to next 5, 10, 10, 5, 15, 10, 400
Codect_disassembly: Chrono Trigger (US v1.0) disassembly ·bank_C2.asm#L14647-L14659NewGame_SeedCharStatsAndTechs: PHP ;C2956E|08 | ; MVN $CC0000 -> $7E2600, 0x280 bytes: at new game, seeds all 7 CharInitData stat records ($CC0000, 0x50 each) AND the starting-tech tables that follow them (learned-count $CC0230, learned-mask $CC0237) into live WRAM ($7E2600 stats / $7E2830 count / $7E2837 mask). Called from C28048. This is why editing CharInitData changes stats only on a NEW game.
REP #$30 ;C2956F|C230 | ;
JSR.W NewGame_InitFlagsAndSettings ;C29571|20BB95 |C295BB;
STZ.W !InventoryItem ;C29574|9C0024 |7E2400;
LDX.W #$2400 ;C29577|A20024 | ;
LDY.W #$2402 ;C2957A|A00224 | ;
LDA.W #$01FD ;C2957D|A9FD01 | ;
MVN $7E,$7E ;C29580|547E7E | ;
LDX.W #$0000 ;C29583|A20000 | ;
LDY.W #$2600 ;C29586|A00026 | ;
LDA.W #$027F ;C29589|A97F02 | ;
MVN $7E,$CC ;C2958C|547ECC | ;
…Chrono Trigger (USA) · 0xc0000-0xc022f — $CC:0000-$CC:022Fct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L12938-L12951Menu_LoadCharRecordToBuf: STA.L !WRMPYA ;C28839|8F024200|004202; char id*0x50 + $7E2600 -> copy 0x4F-byte stat record to display buffer $7E9A90
ORA.B #$00 ;C2883D|0900 | ;
BMI + ;C2883F|303F |C28880;
LDA.B #$50 ;C28841|A950 | ;
STA.L !WRMPYB ;C28843|8F034200|004203;
NOP ;C28847|EA | ;
REP #$31 ;C28848|C231 | ;
LDA.W #$2600 ;C2884A|A90026 | ;
ADC.L !RDMPYL ;C2884D|6F164200|004216;
STA.B $6F ;C28851|856F |00006F;
TAX ;C28853|AA | ;
LDY.W #$9A90 ;C28854|A0909A | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · ramvars.asm#L103-L111!CronoPortrait = $7E2600 ; Crono Portrait
!CronoHP = $7E2603 ; Crono current HP
!CronoMaxHP = $7E2605 ; Crono max HP
!CronoMP = $7E2607 ; Crono current MP
!CronoMaxMP = $7E2609 ; Crono max MP
!CronoPower = $7E260B ; Crono power
!CronoStamina = $7E260C ; Crono stamina
!CronoMagic = $7E260E ; Crono magic
!CronoWeaponEquipped = $7E2629 ; Crono Weapon Equippedct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L31403-L31556Battle_LevelUp_RecomputeStats: JSR.W Battle_ApplyHpMpGrowth ;C1F630|2071F8 |C1F871; (mid-routine label) recomputes base stats from level-1 baseline + StatGrowthTable per stat; char ID from record +00 indexes table
…
ADC.W #StatGrowthTable-CharInitData ;C1F64A|69FA25 | ; index origin is CharInitData($CC0000); reach StatGrowthTable via the delta
…
LDA.L CharInitData,X ;C1F656|BF0000CC|CC0000;
…
LDA.W $0012,X ;C1F660|BD1200 |7E0012;
DEC A ;C1F663|3A | ;
…
JSR.W Battle_Mul16 ;C1F667|200BC9 |C1C90B;
…
LDX.W #$0064 ;C1F66E|A26400 | ;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L31580-L31663Battle_LevelUpCheck: LDA.B #$FF ;C1F7B9|A9FF | ; One level-up step: if gained XP $B28C >= XP-to-next (record +0x2B), subtract it, INC level (+0x12, cap 99 = $63), set level-up result flag ($B2B0,X bit7), reload +0x2B from XpToNextLevelTable CC2632[newLevel*2]; else deduct gained XP from +0x2B
STA.W $B28B ;C1F7BB|8D8BB2 |7EB28B;
LDX.W $B285 ;C1F7BE|AE85B2 |7EB285;
LDA.W $001D,X ;C1F7C1|BD1D00 |7E001D;
AND.B #$80 ;C1F7C4|2980 | ;
BEQ + ;C1F7C6|F003 |C1F7CB;
JMP.W Battle_LevelUpCheck_CapCheck ;C1F7C8|
; | | ;
+ LDX.W $B285 ;C1F7CB|AE85B2 |7EB285;
LDA.W $0012,X ;C1F7CE|BD1200 |7E0012;
CMP.B #$63 ;C1F7D1|C963 | ;
BCC + ;C1F7D3|9010 |C1F7E5;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L31748-L31755Battle_AddXpToChar: REP #$20 ;C1F908|C220 | ; Add gained XP $B28C to char record total XP (+0x13, 24-bit), cap 9,999,999
LDA.W $0013,X ;C1F90A|BD1300 |7E0013;
CLC ;C1F90D|18 | ;
ADC.W !TotalAmountExpWon ;C1F90E|6D8CB2 |7EB28C;
STA.W $0013,X ;C1F911|9D1300 |7E0013;
BCC + ;C1F914|9005 |C1F91B;
SEP #$20 ;C1F916|
INC.W $0015,X ;C1F918|ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C2.asm#L14249-L14292; Dispatches on equip slot $0DAD (table C2926E): weapon rank $7C00 -> $0DB5; armor/helm add $7C00 defense into $0DB6; accessory: effect idx $7B00 -> CC29D7 bit mask adds boosts into $0DAE+ and HP +25%/50% for items $A0/$A1 -> $9B25.
Menu_AccumEquipSlotStats: PHP ;C29261|08 | ;
SEP #$30 ;C29262|E230 | ;
LDA.W $0DAD ;C29264|ADAD0D |7E0DAD;
ASL A ;C29267|0A | ;
TAX ;C29268|AA | ;
JSR.W (DATA8_C2926E,X) ;C29269|FC6E92 |C2926E;
PLP ;C2926C|28 | ;
RTS ;C2926D|60 | ;
; | | ;
DATA8_C2926E = $C2926E
incbin "data/bank_C2.bin":$926E..$9276 ;C2926E..C29276
…Checked by claude, 2026-11-08 — read the new-game copy of the records to $7E:2600, and the routines that read each field (level-up, growth, tech points), then read the seven records from the ROMRevised after a check by a second AI model, 2026-11-08.HP and MP are both current and maximum. Speed includes no equipment: Crono's Bandana adds 1 to it in battle. Frog starts at level 5 and Robo at 10, Ayla at 18 and Magus at 37; the levels are the stored ones, not where the story has them join. The menu copies a record (character number times 80, from $7E:2600) to a buffer and reads the equipment there: the weapon at byte $29, two defense pieces at $27 and $28 (the starting records hold a helmet's number at $27 and an armor's at $28), and the accessory at $2A. Growth reads the level at $12 and the level-1 stats at $2F-$35 and writes the stats at $0B-$11; the level-up reads the experience to next at $2B, and the experience is three bytes at $13. HP and MP are at $03 and $07 by the disassembly's labels; tech points to next are at $2D, where the battle's copy of the record keeps them.
Each of the 116 named techniques (records 1-116) has an 11-byte record: a first byte whose low seven bits pick a targeting pattern and whose top bit gates the technique on the character's magic flag, and the effect component each of up to three participants brings. A participant's MP cost is its component's entry in a one-byte MP table, and a component marked with the high bit pays its MP but runs no effect. chrono-trigger-tables/techniques
bank_C1.asm#L25793-L25856Tech_GetMpCostSlot0: TAX ;C1CB48|AA | ;
Loc_C1CB49:
STX.B $28 ;C1CB49|8628 |000028;
LDA.B #$0B ;C1CB4B|A90B | ;
TAX ;C1CB4D|AA | ;
STX.B $2A ;C1CB4E|862A |00002A;
JSR.W Battle_Mul16 ;C1CB50|200BC9 |C1C90B;
LDX.B $2C ;C1CB53|A62C |00002C;
LDA.L DATA8_CC1BF0,X ;C1CB55|BFF01BCC|CC1BF0;
AND.B #$7F ;C1CB59|297F | ;
TAX ;C1CB5B|AA | ;
LDA.L TechMPCost,X ;C1CB5C|BF3B25CC|CC253B;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L27187-L27219Battle_TechParticipantLoop: TDC ;C1D5B9|7B | ;
LDA.W $B2ED ;C1D5BA|ADEDB2 |7EB2ED;
STA.W $AD8D ;C1D5BD|8D8DAD |7EAD8D;
LDA.W $B2C7 ;C1D5C0|ADC7B2 |7EB2C7;
REP #$20 ;C1D5C3|C220 | ;
CLC ;C1D5C5|18 | ;
ADC.W !TechIndexUseX ;C1D5C6|6DC3B2 |7EB2C3;
TAX ;C1D5C9|AA | ;
TDC ;C1D5CA|7B | ;
SEP #$20 ;C1D5CB|E220 | ;
LDA.L DATA8_CC1BF0,X ;C1D5CD|BFF01BCC|CC1BF0;
STA.W $B2C8 ;C1D5D1|8DC8B2 |7EB2C8;
…Chrono Trigger (USA) · 0xc1beb-0xc20f1 — $CC:1BEB-$CC:20F1Chrono Trigger (USA) · 0xc253b-0xc2582 — $CC:253B-$CC:2582Chrono Trigger (USA) · 0xc249f-0xc253a — $CC:249F-$CC:253AChrono Trigger (USA) · 0xc15c4-0xc1aca — $CC:15C4-$CC:1ACAct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L31167-L31200Tech_GetNextTechId: TDC ;C1F45F|7B | ; For char $B2D1: base $3B = CC276A[char]; index = techs-learned count $7E2830[char] + $3B, x0x0B -> CharTechIdTables CC1BEB -> global tech-id of the char's NEXT tech to learn (id bit 0x80 = magic tech).
LDA.W $B2D1 ;C1F460|ADD1B2 |7EB2D1;
ASL A ;C1F463|0A | ;
TAX ;C1F464|AA | ;
LDA.L CharTechBaseTable,X ;C1F465|BF6A27CC|CC276A;
STA.B $3B ;C1F469|853B |00003B;
LDA.W $B2D1 ;C1F46B|ADD1B2 |7EB2D1;
TAX ;C1F46E|AA | ;
LDA.W !TechLearnNext1,X ;C1F46F|BD3028 |7E2830;
CLC ;C1F472|18 | ;
ADC.B $3B ;C1F473|653B |00003B;
TAX ;C1F475|AA | ;
…Checked by claude, 2026-11-08 — read the MP lookups for the three participant slots (record bytes 5-7, high bit masked, into the MP table), the targeting lookup (byte 0's low 7 bits times 3), and the loop that runs each participant's component unless its high bit is set; then read the records from the ROMRevised after a check by a second AI model, 2026-11-08.Names are the ROM's own text. Components 1-56 are the seven characters' single techniques in order (eight each, Crono's first); a component in parentheses pays its MP without running an effect. Participants are named from their components. The record and target bytes are in hexadecimal; the record's other bytes are read by code this claim doesn't cover. The name table holds names for records 0-116 and ends at $CC:1ACB; seven more records follow technique 116 in the record table with no name text.
A table of 25 five-byte groups, ended by $FF, sets when double and triple techniques are learned: each group names its participants by character bits, its first technique and how many follow (three for each pair, one for each trio with Crono), and a list giving, per technique, how many single techniques each participant must know. After a battle the game checks each pair and the trio of the party against it. chrono-trigger-tables/combo-requirements
bank_C1.asm#L30911-L30968LDX.W #$2778 ;C1F260|A27827 | ; DualTechReqTable (bank CC): post-battle combo-learn scan; sets bits in $283E+g
STX.B $02 ;C1F263|8602 |000002;
STZ.W $B2D2 ;C1F265|9CD2B2 |7EB2D2;
; | | ;
-- LDX.B $02 ;C1F268|A602 |000002;
LDA.L CharInitData,X ;C1F26A|BF0000CC|CC0000;
CMP.B #$FF ;C1F26E|C9FF | ;
BEQ + ;C1F270|F05E |C1F2D0;
STA.B $08 ;C1F272|8508 |000008;
LDA.W $B2D0 ;C1F274|ADD0B2 |7EB2D0;
TAY ;C1F277|A8 | ;
LDA.B $08 ;C1F278|A508 |000008;
…ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C1.asm#L31303-L31336Tech_ComboReq_CheckOne: LDX.B $00 ;C1F565|A600 |000000;
LDA.W !TemporaryValues,X ;C1F567|BD0000 |7E0000;
AND.W $B2DF ;C1F56A|2DDFB2 |7EB2DF;
BEQ + ;C1F56D|F003 |C1F572;
JMP.W Tech_ComboReq_Next ;C1F56F|4C01F6 |C1F601;
; | | ;
+ TDC ;C1F572|7B | ;
TAX ;C1F573|AA | ;
STX.B $0E ;C1F574|860E |00000E;
STX.B $10 ;C1F576|8610 |000010;
LDA.B #$00 ;C1F578|A900 | ;
STA.W $B2E9 ;C1F57A|8DE9B2 |7EB2E9;
…Chrono Trigger (USA) · 0xc2778-0xc27f5 — $CC:2778-$CC:27F5Chrono Trigger (USA) · 0xc27fa-0xc28da — $CC:27FA-$CC:28DAChecked by claude, 2026-11-08 — read the post-battle scan (each group's participant mask against the party's pair and trio masks, its first technique, count and list pointer) and the check that each participant's count of techniques learned is at least the list's byte; then read the groups from the ROMChecked by a second AI model, 2026-11-08.The 15 pairs are every pair of Crono, Marle, Lucca, Robo, Frog and Ayla; Magus has none. The ten trios here all include Crono. The other trios, the four that need a Rock and those without Crono, are not in this table: the disassembly points to separate requirement tables at $CC:2935 and $CC:2953.
The sound driver's song table holds 83 three-byte pointers to song scripts, numbered $00-$52; a request to play a song at or above the count byte before the table is ignored. This is the game's track listing by song number. chrono-trigger-tables/tracks
bank_C7.asm#L218-L221Audio_PlaySongCmd: SEP #$20 ;C701A1|E220 | ; cmd $10/$11/$14/$15 handler: arg = SONG number; loads song's instrument list (SongInstrumentTables), uploads missing instrument samples, plays sequence via SongSequencePtrs
LDA.B $01 ;C701A3|A501 |001E01;
CMP.L SongCount ;C701A5|CFE90AC7|C70AE9;
BCS Audio_ServiceExit ;C701A9|B0E7 |C70192;ct_disassembly: Chrono Trigger (US v1.0) disassembly · bank_C7.asm#L636-L638TAX ;C7050C|AA | ;
SEP #$20 ;C7050D|E220 | ;
LDA.L SongSequencePtrs,X ;C7050F|BF180DC7|C70D18;Chrono Trigger (USA) · 0x70ae9-0x70ae9 — $C7:0AE9: the song countChrono Trigger (USA) · 0x70d18-0x70e10 — $C7:0D18: the song tableChecked by a second AI model, 2026-11-08.Song numbers are hexadecimal, as the play requests give them. The names are the disassembly's, after the soundtrack's titles; the ROM holds no song titles. The disassembly's song constants write its decimal song numbers as hexadecimal from 10 on (its $10 is song $0A), so its constants above $09 are not the numbers the game uses; the song files' decimal numbers are.