Charge shot
Holding the fire button builds up a stronger shot that fires on release.
On this page
A charge shot rewards waiting. The Mega Buster in Mega Man 2 fires only on the press1. Mega Man 4 fires on the press and then counts while B stays held; the release fires a half charge from 32 and a full one from 922. Mega Man 5 lowers the full charge to 803.
- NoneMega Man 2 (1988). No charge; the buster fires when B goes down.1
- Press to fireStar Fox 64 (1997). Holding A charges; with A up the charge falls 1 an update, and a new press at 10 or more fires.4
- Tiers on releaseMega Man 4 (1991). Hold B to charge; let go for a half-charged shot or, held three times as long, a full one.2Mega Man 5 (1992). Hold B for a half or a full charge; the full one comes at a lower count than in Mega Man 4.3
Games
| Game | Year | How | Note |
|---|---|---|---|
| Star Fox 64 | 1997 | Press to fire | holding A charges; with A up the charge falls 1 an update, and a new press at 10 or more fires |
| Mega Man 4 | 1991 | Tiers on release | hold B to charge; let go for a half-charged shot or, held three times as long, a full one |
| Mega Man 5 | 1992 | Tiers on release | hold B for a half or a full charge; the full one comes at a lower count than in Mega Man 4 |
| Mega Man 6 | 1993 | Tiers on release | hold B for a half or a full charge; the Power adaptor's punch charges faster |
Every claim about this mechanic, by game (5)
References
- ^ abMega Man 2's Mega Buster has no charge. It fires only on the frame B goes down, with a free shot slot.Codelsmmega/mm2
How we know
20@mega_buster: 21 LDA z:zjoy1_pressed_bits 22 AND #b_button 23 BEQ @skip_2 24 LDX #$04 ⋮ 26@loop_1: 27 LDA aobject_flag, X 28 BPL @not_exist_1 29 DEX 30 CPX #$01
home/weapons.asm lines 20–30 at 94f0bf3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abA B press fires a normal shot and sets the charge counter to 1; each frame B stays held in a state below 4 the counter rises by 1, looping from 100 back to 92. On release, a counter under 32 (
$20) fires nothing more, 32 or more fires a half-charged shot, and 92 ($5C) or more a full one.Codeplasticsmoke/megaman4-disassembly-ca65 · “Mega Man 4 (USA) (Rev 1)”How we know
73L_8073: 74 LDA $35 ; charge counter 75 BEQ L_80CF ; not charging: done 76 LDA player_state ; player state 77 CMP #$04 ; states >= 4 (Rush riding etc.) 78 BCS L_80CF ; cannot charge: done 79 LDA joy1_held ; held buttons 80 AND #$40 ; B button still held? 81 BEQ L_80CF ; released: fire handled at L_8CCC 82 INC $35 ; advance charge 83 LDA $35 ; reload charge ⋮ 89 LDA $35 ; reload charge ⋮
src/bank3C.asm lines 73–95 at a63bb6e · upstream ↗ 1694 LDA $35 ; charge counter 1695 BEQ L_8D2F ; no charge: check B press 1696 LDA current_weapon ; current weapon 1697 BNE L_8D2F ; not buster: check B press 1698 LDA joy1_held ; held buttons 1699 AND #$40 ; B still held? 1700 BNE L_8D59 ; still charging: no fire 1701 LDA #$21 ; charged spawn offset $21 1702 STA $11 ; set spawn-offset index ⋮ 1705 LDA $35 ; charge counter ⋮ 1707 LDA #$00 ; zero ⋮ 1710 CMP #$20 ; level 1 threshold ($20) ⋮
src/bank3C.asm lines 1694–1722 at a63bb6e · upstream ↗ 1743L_8D2F: 1744 LDA joy1_press ; newly pressed 1745 AND #$40 ; B button? 1746 BEQ L_8D5B ; no fire: done 1747L_8D35: 1748 LDY #$00 ; slot 0 marker 1749 STY temp_00 ; clear chosen-slot temp 1750 INY ; Y = 1 1751 STY $35 ; minimum charge (tap)
src/bank3C.asm lines 1743–1751 at a63bb6e · upstream ↗ 1769L_8D59: 1770 LDA #$00 ; A = 0 (no shot fired) 1771L_8D5B: 1772 RTS ; done
src/bank3C.asm lines 1769–1772 at a63bb6e · upstream ↗ In the cartridge (“Mega Man 4 (USA) (Rev 1)”): bank $3C $8073, the counter in the Rev 1 ROM; bank $3C $8CF2, the thresholds in the Rev 1 ROM. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abMega Man 5 moves Mega Man 4's charge thresholds. On release its counter
$38fires a normal shot from 16 ($10), a half-charged one from 40 ($28), and a full one from 80 ($50), and nothing under 16; Mega Man 4's counter, which starts at 1 on the press, fires nothing under 32, a half charge from 32, and a full one from 92. So the full charge needs a lower count and the half charge a higher one.Codeplasticsmoke/megaman5-disassembly-ca65 · plasticsmoke/megaman4-disassembly-ca65revisedHow we know
buster_charge_ctl: lda $32 bne L910F lda $30 cmp #$04 beq L910F lda $16 and #$40 bne buster_charge_tick lda $38 cmp #$10 bcc L910F cmp #$50 …
src/bank1B.asm#L2291-L2311 · upstream ↗ buster_charge_tick: lda $38 cmp #$20 bne L9148 … L9148: inc $38
src/bank1B.asm#L2314-L2319 · upstream ↗ buster_tier_threshold:.byte $28,$50,$FF
src/bank1B.asm#L2891 · upstream ↗ buster_tier_preset:.byte $18,$A8,$A9
src/bank1B.asm#L2892 · upstream ↗ 1751 STY $35 ; minimum charge (tap)src/bank3C.asm line 1751 at a63bb6e · upstream ↗ 1710 CMP #$20 ; level 1 threshold ($20) 1711 BCC L_8D59 ; tap shot: normal spawn 1712 INC $36 ; flash phase 8 1713 CMP #$40 ; level 2 threshold ($40) 1714 BCC L_8D0C ; small charge 1715 INC $36 ; flash phase 9 1716 CMP #$5C ; full charge threshold ($5C)
src/bank3C.asm lines 1710–1716 at a63bb6e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^In the US 1.1 version of Star Fox 64, holding A counts a charge counter up by 1 a player update to a cap of 21, and an update without A held counts it down by 1 (
Player_UpdateLockOn). A fresh press of A, whose own update first adds 1 to the counter, fires the charged shot (PLAYERSHOT_LOCK_ON) if an enemy is locked on or the counter is then above 10 (so 10 or more before the press). Either path fires only if the player's charged-shot slot (gPlayerShots[14 - player->num]) is free, holds a shot of another type, or holds a charged shot that has lost its target (the locked path) or grown past scale 1 (the counter path); a press that fires nothing sets the counter to 0. Once the counter is above 20, while A is held, nothing is locked, and Z and R aren't both held, it launches a search shot every fourth game frame, and the first targetable enemy within 300 units of that shot on each axis (200 in all-range mode) is locked on for a count of 20, which counts down only while A is up. Each update while its target stays locked, the charged shot turns toward it (PlayerShot_UpdateLockOnShot).Codesonicdcer/sf64revisedHow we know
3186bool Player_UpdateLockOn(Player* player) { ⋮ 3190 if (gInputHold->button & A_BUTTON) { 3191 gChargeTimers[player->num]++; 3192 if (gChargeTimers[player->num] > 21) { 3193 gChargeTimers[player->num] = 21; ⋮ 3201 ((gGameFrameCount % 4) == 0) && Player_CanLockOn(player->num)) { 3202 if (gChargeTimers[player->num] > 20) { ⋮ 3206 Player_SetupArwingShot(player, &gPlayerShots[i], 0.0f, 0.0f, PLAYERSHOT_LOCK_SEARCH, ⋮ 3217 if (gChargeTimers[player->num] != 0) { 3218 gChargeTimers[player->num]--;
src/engine/fox_play.c lines 3186–3220 at 4235c59 · upstream ↗ 3164bool Player_CanLockOn(s32 playerNum) { ⋮ 3169 if ((actor->obj.status == OBJ_ACTIVE) && (actor->lockOnTimers[playerNum] != 0)) { 3170 return false;
src/engine/fox_play.c lines 3164–3172 at 4235c59 · upstream ↗ 3222 if (gInputPress->button & A_BUTTON) { 3223 for (i = 0; i < ARRAY_COUNT(gActors); i++) { 3224 if ((gActors[i].obj.status == OBJ_ACTIVE) && (gActors[i].lockOnTimers[player->num] != 0)) { 3225 if ((gPlayerShots[14 - player->num].obj.status == SHOT_FREE) || 3226 (gPlayerShots[14 - player->num].obj.id != PLAYERSHOT_LOCK_ON) || 3227 ((gPlayerShots[14 - player->num].obj.id == PLAYERSHOT_LOCK_ON) && 3228 (gPlayerShots[14 - player->num].unk_60 != 0))) { ⋮ 3230 Player_SetupArwingShot(player, &gPlayerShots[14 - player->num], 0.0f, 0.0f, PLAYERSHOT_LOCK_ON, ⋮ 3239 break; ⋮ 3243 if (gChargeTimers[player->num] > 10) { 3244 if ((gPlayerShots[14 - player->num].obj.status == SHOT_FREE) || 3245 (gPlayerShots[14 - player->num].obj.id != PLAYERSHOT_LOCK_ON) || ⋮
src/engine/fox_play.c lines 3222–3260 at 4235c59 · upstream ↗ 69 gControllerPress[i].button = 70 (gControllerHold[i].button ^ sPrevController[i].button) & gControllerHold[i].button;
src/sys/sys_joybus.c lines 69–70 at 4235c59 · upstream ↗ 1758 if (gLevelMode == LEVELMODE_ON_RAILS) { 1759 lockRange = 300.0f; 1760 } else { 1761 lockRange = 200.0f; ⋮ 1765 if ((actor->obj.status == OBJ_ACTIVE) && (actor->info.targetOffset != 0.0f) && 1766 ((actor->lockOnTimers[shot->sourceId] == 0) && (fabsf(shot->obj.pos.x - actor->obj.pos.x) <= lockRange) && 1767 (fabsf(shot->obj.pos.y - (actor->obj.pos.y + actor->info.targetOffset)) <= lockRange) && 1768 (fabsf(shot->obj.pos.z - actor->obj.pos.z) <= lockRange))) { 1769 actor->lockOnTimers[shot->sourceId] = 20;
src/engine/fox_beam.c lines 1758–1769 at 4235c59 · upstream ↗ 2848 } else if (this->lockOnTimers[TEAM_ID_FOX] != 0) { 2849 if (!(gControllerHold[gMainController].button & A_BUTTON)) { 2850 this->lockOnTimers[TEAM_ID_FOX]--; ⋮ 2852 gChargeTimers[0] = 0;
src/engine/fox_enmy.c lines 2848–2852 at 4235c59 · upstream ↗ 2174 if (shot->unk_60 == 0) { ⋮ 2177 (actor->lockOnTimers[shot->sourceId] != 0)) { 2178 var_a3 = 1; 2179 actor->lockOnTimers[shot->sourceId] = 2; 2180 sLockOnPos = actor->obj.pos; ⋮ 2188 var_a3 = 1; ⋮ 2193 } else { ⋮ 2200 if (var_a3 != 0) { ⋮ 2218 Math_SmoothStepToAngle(&shot->vec_2C.y, sp58, 1.0f, shot->unk_50, 0.0f); 2219 Math_SmoothStepToAngle(&shot->vec_2C.x, sp5C, 1.0f, shot->unk_50, 0.0f); ⋮ 2221 } else { 2222 shot->unk_60 = 1;
src/engine/fox_beam.c lines 2174–2222 at 4235c59 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
Sources
Code
- lsmmega. 2026. “mm2: Mega Man 2 disassembly (lsmmega/mm2).” Commit 94f0bf3. lsmmega/mm2 @ 94f0bf3 · licence, all uses
- plasticsmoke. 2026. “Mega Man 4 (U), annotated ca65 disassembly (plasticsmoke).” Commit a63bb6e. plasticsmoke/megaman4-disassembly-ca65 @ a63bb6e · licence, all uses
- 1992. “Mega Man 4 (USA) (Rev 1).” · licence, all uses
- plasticsmoke. 2026. “Mega Man 5 (U), annotated ca65 disassembly (plasticsmoke).” Commit 7fd6512. plasticsmoke/megaman5-disassembly-ca65 @ 7fd6512 · licence, all uses