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

A rocket start gives a racer a boost for timing the accelerator against the countdown. Mario Kart 64 opens a short window near the end of Lakitu’s countdown, and a press inside it gives the Mushroom’s boost; revving too high without it spins the kart out1. Diddy Kong Racing instead grades the first press of A: a press in the countdown’s the last 14 counts of 802 sets the longest boost, an earlier press inside the window a shorter one, and a press before the window none. Ridge Racer has no boost, only a penalty: the further the revs are from 7500 as the race starts, the longer the wheelspin3.

  • Press windowMario Kart 64 (1996). A fresh press of A within 8 race frame counts of the window opening gives a Mushroom boost; revving to 90% of top speed without it spins the kart out.1
  • Graded pressDiddy Kong Racing (1997). The first press of A in the countdown's last 29 counts sets the boost timer, 20 for 14 or less, and 4 up to 11 as the reading falls from 29 to 15; an earlier press forfeits it.2
  • Rev targetRidge Racer (1993). With the accelerator held, the start's wheelspin lasts 4 updates when the tachometer reads 7500 as the race starts, and 61 when it reads 10000.3

Games

GameYearHowNote
Mario Kart 641996Press windowa fresh press of A within 8 race frame counts of the window opening gives a Mushroom boost; revving to 90% of top speed without it spins the kart out
Diddy Kong Racing1997Graded pressthe first press of A in the countdown's last 29 counts sets the boost timer, 20 for 14 or less, and 4 up to 11 as the reading falls from 29 to 15; an earlier press forfeits it
Ridge Racer1993Rev targetwith the accelerator held, the start's wheelspin lasts 4 updates when the tachometer reads 7500 as the race starts, and 61 when it reads 10000
Every claim about this mechanic, by game (3)
Ridge Racer 1993In Ridge Racer's Japanese release (SLPS-00001), the player's car starts a race in state 3 (func_80028294). When the grid phase ends at race update 211 and the race begins, func_8001B284 reads the rev counter shown on the tachometer (D_801D7800, the car's revs smoothed and held between 500 and 10000) and sets a counter to 1000 plus its distance below 7500, or 1000 plus six times its distance above 7500, in which case it also halves the engine field at car offset 0xB0. In state 3 the car moves a quarter of what its speed would carry it, and the counter falls each update by the accelerator plus the brake plus 8; at 10 or below the car goes to grip (state 0). With the accelerator held on a digital pad (0x100), revs of 7500 give 4 updates of this, 5000 give 14, and 10000 give 61 (computed).Code
Mario Kart 64 1996In the US version of Mario Kart 64, the start boost's window opens when Lakitu's countdown finishes the animation after its second light sound, before the green-light sound. A press of A that begins within 8 counts of the race frame counter from the first update the window is open (20 in Time Trials) sets START_BOOST_TRIGGER, and letting go of A before the start clears it. The trigger gives the kart the Mushroom's effect and the same boost timer, 80. Once the window is open, a kart that revs to 90% of its top speed without the trigger gets START_SPINOUT_TRIGGER, the spin-out for holding the gas.Code
Diddy Kong Racing 1997In the US 1.0 version of Diddy Kong Racing, a race, challenge, or time trial starts its countdown at 80, and once the HUD signals the start each update takes the update rate off it; "Get Ready" shows while it reads 2 or more. A racer's first fresh press of A after the countdown drops below 80 decides its start boost. A press while the countdown reads 29 to 15 sets a boost timer of 4 up to 11 as the reading falls, half of 24 less the reading's excess over 14, rounded down (computed), and a press while it reads 14 or less sets 20 with a select sound; holding Z also counts a reading of 15 as 20. A first press while it reads 30 to 79 gives no boost and spends the chance. A Master CPU driver takes the start boost a human set, or 5 if none did, and an Expert one copies a human's if there is one. In the car's ground routine, while the boost timer is above 0 after the countdown, the throttle is held open and the factor the code calls traction, unless it's 0, becomes 2.0. Mario Kart 64 instead takes a press of A that begins within 8 race frame counts of its window opening (20 in Time Trials), while the kart's THROTTLE flag isn't already set, and every such start gets the Mushroom's boost timer, 80.Code

References

  1. ^ abIn the US version of Mario Kart 64, the start boost's window opens when Lakitu's countdown finishes the animation after its second light sound, before the green-light sound. A press of A that begins within 8 counts of the race frame counter from the first update the window is open (20 in Time Trials) sets START_BOOST_TRIGGER, and letting go of A before the start clears it. The trigger gives the kart the Mushroom's effect and the same boost timer, 80. Once the window is open, a kart that revs to 90% of its top speed without the trigger gets START_SPINOUT_TRIGGER, the spin-out for holding the gas.Coden64decomp/mk64revised
    How we know
    3037        case 7:
    3038            if (set_and_run_timer_object(objectIndex, 0x00000014) != 0) {
    ⋮
    3041                    play_sound2(SOUND_ACTION_COUNTDOWN_LIGHT);
    ⋮
    3048        case 9:
    3049            if ((set_and_run_timer_object(objectIndex, 8) != 0) && (arg1 == 0)) {
    3050                play_sound2(SOUND_ACTION_COUNTDOWN_LIGHT);
    ⋮
    3053        case 10:
    3054            if ((func_80072E54(objectIndex, 0x00000010, 0x00000017, 1, 6, 0) != 0) && (arg1 == 0)) {
    3055                D_801656F0 = 1;
    ⋮
    3058        case 11:
    3059            if (set_and_run_timer_object(objectIndex, 8) != 0) {
    ⋮
    3062                    play_sound2(SOUND_ACTION_GREEN_LIGHT);
    
    src/update_objects.c lines 3037–3063 at 58cfcb0 · upstream ↗
    4749        } else if (D_8018D168 == 1) {
    4750            if (D_801656F0 == 1) {
    4751                if (D_801652E0[playerIndex] == 0) {
    4752                    D_801652E0[playerIndex] = gRaceFrameCounter;
    ⋮
    4755            if (controller->button & A_BUTTON) {
    4756                player_accelerate_during_start_sequence(player);
    4757            } else {
    4758                player_decelerate_during_start_sequence(player, 5.0f);
    
    src/player_controller.c lines 4749–4759 at 58cfcb0 · upstream ↗
    3669    if (D_801656F0 == 1) {
    3670        time_delta = gRaceFrameCounter - D_801652E0[playerIndex];
    3671        if (gModeSelection == TIME_TRIALS) {
    3672            var_v0 = 0x14;
    3673        } else {
    3674            var_v0 = 8;
    ⋮
    3676        if ((time_delta < var_v0) && ((player->kartProps & THROTTLE) != THROTTLE)) {
    3677            player->triggers |= START_BOOST_TRIGGER;
    3678        } else if ((player->topSpeed * 0.9f) <= player->currentSpeed) {
    3679            if ((player->triggers & START_BOOST_TRIGGER) != START_BOOST_TRIGGER) {
    3680                player->triggers |= START_SPINOUT_TRIGGER;
    ⋮
    3685    player->kartProps |= THROTTLE;
    
    src/player_controller.c lines 3669–3685 at 58cfcb0 · upstream ↗
    3703    player->triggers &= ~START_BOOST_TRIGGER;
    3704    player->kartProps &= ~THROTTLE;
    
    src/player_controller.c lines 3703–3704 at 58cfcb0 · upstream ↗
    1392    if ((player->triggers & START_BOOST_TRIGGER) == START_BOOST_TRIGGER) {
    1393        func_8002A704(player, playerId);
    
    src/player_controller.c lines 1392–1393 at 58cfcb0 · upstream ↗
    1112void func_8002A704(Player* player, s8 playerIndex) {
    1113    player->effects |= MUSHROOM_EFFECT;
    1114    player->triggers &= ~START_BOOST_TRIGGER;
    ⋮
    1120    player->boostTimer = 0x0050;
    
    src/player_controller.c lines 1112–1120 at 58cfcb0 · upstream ↗
    522void trigger_shroom(Player* player, s8 playerIndex) {
    ⋮
    526    player->effects |= MUSHROOM_EFFECT;
    ⋮
    544    player->boostTimer = 0x50;
    
    src/effects.c lines 522–544 at 58cfcb0 · upstream ↗
    441#define START_SPINOUT_TRIGGER    0x10000000 // Spinning out by holding gas at start of race
    
    include/defines.h line 441 at 58cfcb0 · upstream ↗
    1254    if (gIsGamePaused == false) {
    1255        func_8008C1D8(&D_80165678);
    1256        gRaceFrameCounter++;
    
    src/code_80057C60.c lines 1253–1256 at 58cfcb0 · 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

  2. ^ abIn the US 1.0 version of Diddy Kong Racing, a race, challenge, or time trial starts its countdown at 80, and once the HUD signals the start each update takes the update rate off it; "Get Ready" shows while it reads 2 or more. A racer's first fresh press of A after the countdown drops below 80 decides its start boost. A press while the countdown reads 29 to 15 sets a boost timer of 4 up to 11 as the reading falls, half of 24 less the reading's excess over 14, rounded down (computed), and a press while it reads 14 or less sets 20 with a select sound; holding Z also counts a reading of 15 as 20. A first press while it reads 30 to 79 gives no boost and spends the chance. A Master CPU driver takes the start boost a human set, or 5 if none did, and an Expert one copies a human's if there is one. In the car's ground routine, while the boost timer is above 0 after the countdown, the throttle is held open and the factor the code calls traction, unless it's 0, becomes 2.0. Mario Kart 64 instead takes a press of A that begins within 8 race frame counts of its window opening (20 in Time Trials), while the kart's THROTTLE flag isn't already set, and every such start gets the Mushroom's boost timer, 80.CodeDavidSM64/Diddy-Kong-Racing · n64decomp/mk64revised
    How we know
    1474    if (raceType == RACETYPE_DEFAULT || raceType & RACETYPE_CHALLENGE || gIsTimeTrial || D_8011AD3C != 0) {
    1475        gEventCountdown = 80;
    1476    } else {
    1477        gEventCountdown = 0;
    
    src/objects.c lines 1474–1478 at a5eb080 · upstream ↗
    2831    gEventStartTimer = gEventCountdown;
    2832    if (gEventCountdown > 0 && race_starting() != FALSE) {
    2833        gEventCountdown -= updateRate;
    ⋮
    2838    if (gEventCountdown <= 0) {
    2839        gEventCountdown = 0;
    
    src/objects.c lines 2831–2840 at a5eb080 · upstream ↗
    4143    gRaceStartTimer = get_race_countdown();
    
    src/racer.c line 4143 at a5eb080 · upstream ↗
    805                countdown = get_race_countdown() >> 1;
    
    src/game_ui.c line 805 at a5eb080 · upstream ↗
    1901        if (countdown > 0) {
    1902            if (gHudRaceStart) {
    ⋮
    1904                hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_START_READY]);
    
    src/game_ui.c lines 1901–1904 at a5eb080 · upstream ↗
    7465    timer3 = get_race_start_timer();
    ⋮
    7469    if (gRaceStartTimer > 0 && gRaceStartTimer < 30 && !racer->startInput) {
    7470        timer = gRaceStartTimer - 14;
    7471        if (gCurrentButtonsPressed & A_BUTTON) {
    7472            if (timer < 0 && timer3 >= 0) {
    7473                timer = 0;
    ⋮
    7479            if (gCurrentRacerInput & Z_TRIG) {
    7480                if (timer < 2) {
    7481                    timer = 0;
    ⋮
    7484            timer2 = 24 - timer;
    7485            racer->boostTimer = normalise_time(timer2 >> 1);
    7486            if (timer2 == 24) {
    ⋮
    
    src/racer.c lines 7465–7499 at a5eb080 · upstream ↗
    7501        // For the AI, expert AI will match the players start, and master AI will get a good start always.
    7502        if (racer->playerIndex == PLAYER_COMPUTER &&
    7503            (racer->aiSkill == AI_MASTER || (racer->aiSkill == AI_EXPERT && gStartBoostTime))) {
    7504            if (gStartBoostTime) {
    7505                racer->boostTimer = gStartBoostTime;
    7506            } else {
    7507                racer->boostTimer = normalise_time(5);
    
    src/racer.c lines 7501–7508 at a5eb080 · upstream ↗
    7521    if (gRaceStartTimer < 80 && gCurrentButtonsPressed & A_BUTTON) {
    7522        racer->startInput = 1;
    
    src/racer.c lines 7521–7523 at a5eb080 · upstream ↗
    938s32 normalise_time(s32 timer) {
    939    if (osTvType != OS_TV_TYPE_PAL || timer < 0) {
    940        return timer;
    941    } else {
    942        return (timer * 5) / 6;
    
    src/objects.c lines 938–944 at a5eb080 · upstream ↗
    5492    // Force the throttle wide open if boosting
    5493    if (racer->boostTimer > 0) {
    5494        if (gRaceStartTimer == 0) {
    5495            racer->throttle = 1.0f;
    5496            if (traction != 0.0) {
    5497                traction = 2.0f;
    ⋮
    5499            racer->boostTimer -= updateRate;
    
    src/racer.c lines 5492–5499 at a5eb080 · upstream ↗
    3669    if (D_801656F0 == 1) {
    3670        time_delta = gRaceFrameCounter - D_801652E0[playerIndex];
    3671        if (gModeSelection == TIME_TRIALS) {
    3672            var_v0 = 0x14;
    3673        } else {
    3674            var_v0 = 8;
    ⋮
    3676        if ((time_delta < var_v0) && ((player->kartProps & THROTTLE) != THROTTLE)) {
    3677            player->triggers |= START_BOOST_TRIGGER;
    
    src/player_controller.c lines 3669–3685 at 58cfcb0 · upstream ↗
    1112void func_8002A704(Player* player, s8 playerIndex) {
    1113    player->effects |= MUSHROOM_EFFECT;
    1114    player->triggers &= ~START_BOOST_TRIGGER;
    ⋮
    1120    player->boostTimer = 0x0050;
    
    src/player_controller.c lines 1112–1120 at 58cfcb0 · 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

  3. ^ abIn Ridge Racer's Japanese release (SLPS-00001), the player's car starts a race in state 3 (func_80028294). When the grid phase ends at race update 211 and the race begins, func_8001B284 reads the rev counter shown on the tachometer (D_801D7800, the car's revs smoothed and held between 500 and 10000) and sets a counter to 1000 plus its distance below 7500, or 1000 plus six times its distance above 7500, in which case it also halves the engine field at car offset 0xB0. In state 3 the car moves a quarter of what its speed would carry it, and the counter falls each update by the accelerator plus the brake plus 8; at 10 or below the car goes to grip (state 0). With the accelerator held on a digital pad (0x100), revs of 7500 give 4 updates of this, 5000 give 14, and 10000 give 61 (computed).Codekazuyette/rr-decomp
    How we know
    65    q->x5C = 3;
    
    src/fn/func_8001AA60.c line 65 at 3b42b36 · upstream ↗
    130    case 1:
    131        if (D_80173310 >= 211) {
    132            func_8001B284(p);
    133            D_801D9060 = 2;
    
    src/fn/func_80014C2C.c lines 130–134 at 3b42b36 · upstream ↗
    10    temp_a1 = D_801D7800 - 0x1D4C;
    11    if (temp_a1 < 0) {
    12        var_a1 = -temp_a1;
    13    } else {
    14        var_a1 = temp_a1 * 6;
    15        M2C_FIELD(arg0, s32 *, 0xB0) = (s32) ((s32) M2C_FIELD(arg0, s32 *, 0xB0) / 2);
    ⋮
    17    D_8012CFF0 = var_a1 + 0x3E8;
    
    src/fn/func_8001B284.c lines 10–17 at 3b42b36 · upstream ↗
    31        D_801D7800 += (D_8007C2DC - D_801D7800) / 4;
    32        if (D_801D7800 > 10000)
    33            D_801D7800 = 10000;
    34        if (D_801D7800 < 500)
    35            D_801D7800 = 500;
    
    src/fn/func_8001B0CC.c lines 31–35 at 3b42b36 · upstream ↗
    27    car->u.c.vx = func_80044D0C(car->u.c.dir) * car->u.c.spd / 256;
    ⋮
    31    car->u.c.vx = s * v.vz / 4096 / 4;
    32    car->u.c.vz = c * v.vz / 4096 / 4;
    33    if (D_8012CFF0 > 10) {
    34        D_8012CFF0 -= car->u.c.wear;
    35        w = car->u.c.grip + 8;
    36        D_8012CFF0 -= w;
    37        if (D_8012CFF0 <= 0)
    38            car->u.c.slide = 0;
    ⋮
    40    } else {
    41        car->u.c.slide = 0;
    
    src/fn/func_80028294.c lines 27–41 at 3b42b36 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

Sources

Code