On this page
  1. Related
  2. Games
  3. References
  4. Sources

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

GameYearHowNote
Star Fox 641997Press to fireholding A charges; with A up the charge falls 1 an update, and a new press at 10 or more fires
Mega Man 41991Tiers on releasehold B to charge; let go for a half-charged shot or, held three times as long, a full one
Mega Man 51992Tiers on releasehold B for a half or a full charge; the full one comes at a lower count than in Mega Man 4
Mega Man 61993Tiers on releasehold B for a half or a full charge; the Power adaptor's punch charges faster
Every claim about this mechanic, by game (5)
Mega Man 2 1988Mega Man 2's Mega Buster has no charge. It fires only on the frame B goes down, with a free shot slot.Code
Mega Man 4 1991A 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.Code
Mega Man 5 1992Mega Man 5 moves Mega Man 4's charge thresholds. On release its counter $38 fires 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.Code
Mega Man 6 1993Mega Man 6's buster fires a normal shot on the press of B, which sets the charge counter $9E to 0; each later frame with B held adds 1, and on release the counter fires a half-charged shot from 36 ($24) and a full one from 90 ($5A, kept in $06AB), and nothing under 36. Between games these are counts, not frames: Mega Man 5's counter, whose start isn't traced, fires its half charge from 40 and its full one from 80, and Mega Man 4's, which starts at 1 on the press, from 32 and 92.Code
With the Power adaptor ($9B 2) the charge counter gains 2 a frame and caps at 60 ($3C), so a half-strength punch comes from 18 frames held and a full one from 30 (computed). Each punch (shot types $0C, $0E, $0F by tier) holds him in a 12-frame pose that keeps the charge off ($9E = $FF).Code

References

  1. ^ 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.

    In the claim ledger

  2. ^ 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.

    In the claim ledger

  3. ^ abMega Man 5 moves Mega Man 4's charge thresholds. On release its counter $38 fires 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-ca65revised
    How 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 claim ledger

  4. ^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/sf64revised
    How 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.

    In the claim ledger

Sources

Code