F-Zero/RAM map

From Data Crystal
Jump to navigation Jump to search

Chip tiny.png The following article is a RAM map for F-Zero.

Address|  Length|Description
-------|--------|-----------
7E:0000|?? bytes|Scratch RAM, used for many purposes, such as temporary storage and indirect indexing.
7E:001D|  1 byte|Has two purposes:
                  1. Difference between 7E:0BD1 and 7E:0BE1 from the current machine being looped.
                      Actually used only for the player on the sliding routine.
                      Note that the angles wrap around at #$C0 (capped at #$BF), so if 7E:0BD1 is #$10 and 7E:0BE1 is #$BF, this address will be #$10.
                  2. Temporary storage for the checkpoint angle (7E:109C) from the current machine being looped.
                       Used for something related to wall bouncing."
7E:0034|  1 byte|Used in the graphics updating routine for machines.
                  How many sprites is the current machine that is being graphically updated is composed of.
                  Stored to 7E:11D0 when the routine ends."
7E:003E|2 bytes|Relevant value picked from the table at 7E:1076. Like mentioned on the table address description, the picked value depends on both the rank and the current lap of the player."
7E:0040| 1 byte|If the value in it is not zero, run the actual game; otherwise, loop forever. It's set to a non-zero value during NMI, and it's set to zero after the game mode has been run, so that the game runs exactly once a frame - one NMI trigger per frame."
7E:0041|2 bytes|Specifies the IRQ code destination.
7E:0043|2 bytes|Scanline where the Mode 7 starts? High byte is always set to #$00.
7E:0045| 1 byte|This value is either #$00 or #$80 normally, but any value is accepted: #$00 - #$7F = don't keep wreckage sounds playing/play sound effects; #$80 - #$FF = keep wreckage sounds playing/don't play sound effects.
                  Used to keep the wreckage sounds playing when 7E:0048 is #$80 or higher.
                  Can also be used as a ""play sound effects"" flag if 7E:0048 is #$7F or lower.
7E:0046|4 bytes|Mirror of APU I/O ports.
                  If 7E:0046 is set to #$80 or higher, the music and sound effects fade out.
7E:004A| 1 byte|Number of machines on screen, multiplied by 2. Used in a loop, of which purpose is unknown. NEEDS RESEARCHING.
7E:004B|2 bytes|OAM Table #1 (7E:0200) indexer. Used for some (but not all) routines that adds sprites to the screen.
7E:004D| 1 byte|OAM Table #2 (7E:0400) indexer. Used for some (but not all) routines that adds sprites to the screen.
7E:004E| 1 byte|Modifies OAM Table #2 in unknown ways. Used with 7E:004D in some routines.
7E:004F| 1 byte|Mirror of $2101 (OAM object size). Always #$02.
7E:0050| 1 byte|Is the game drawing machines flag.
                  #$00 = No; Other values = Yes. Used to correctly handle OAM DMA.
7E:0051| 1 byte|True frame counter. Increments once per frame, except when lagging (increments once every other frame).
7E:0052| 1 byte|Player's machine type.
                   #$00 = Blue Falcon; #$01 = Wild Goose; #$02 = Golden Fox; #$03 = Fire Stingray.
7E:0053| 1 byte|Current race number. From #$00 to #$04.
7E:0054| 1 byte|JSR indexer for the main game mode. The JSR table is located at 00:8050 and has 4 entries. 
                The address is multiplied by 2 before indexing, since the pointers are 16-bit.
7E:0055| 1 byte|JMP indexer for the game mode.
7E:0056| 1 byte|Another JMP indexer for the game mode.
7E:0057| 1 byte|Difficulty setting.
                  #$00 = Beginner; 
                  #$01 = Standard; 
                  #$02 = Expert. Master uses this address as #$02 and also the flag from 7E:0F3D.
7E:0058|1 byte|"Is practice mode flag.
                #$00 = GP mode; Other values = Practice mode.
7E:0059|1 byte|Spare machines.
7E:005A|1 byte|Used by most menus as current selected option.
7E:005B|1 byte|Is running pre-recorded race flag.
                #$00 = Player is in control; Other values = Pre-recorded race is running."
7E:005C|1 byte|When #$00:
                - HDMA channels 1 and 3 are disabled. Channel 1 is used for Mode 7 and BG1 horizon, channel 3 is used for the horizon gradient;
                - 7E:009B is stored to $2131;
                - 7E:0E27 is treated as the red color intensity for color addition/subtraction, it should range from #$00 to #$1F. (7E:0E27 | #$20)¹ is stored to $2132.
                - 7E:0E28 is treated as the green color intensity for color addition/subtraction, it should range from #$00 to #$1F. (7E:0E28 | #$40)¹ is stored to $2132.
                - 7E:0E29 is treated as the blue color intensity for color addition/subtraction, it should range from #$00 to #$1F. (7E:0E29 | #$80)¹ is stored to $2132.
                - IRQ is disabled.

                When #$01:
                  - HDMA channels 1 and 3 are enabled. Channel 1 is used for Mode 7 and BG1 horizon, channel 3 is used for the horizon gradient;
                  - BG mode is set to Mode 1 with BG3 priority;
                  - $212C (enabled layers on main screen) is set to (#$13 ^ 7E:005F)²;
                  - 7E:0E25 is stored to $2131;
                  - $2132 is set to #$E0;
                  - IRQ is enabled and all IRQ routines are ran.

                  When greater than #$01:
                    - HDMA channel 1 is enabled. Channel 1 is used for Mode 7 and BG1 horizon;
                    - HDMA channel 3 is disabled. Channel 3 is used for the horizon gradient;
                    - BG mode is set to Mode 1 with BG3 priority;
                    - $212C (enabled layers on main screen) is set to #$13;
                    - IRQ is enabled and only the ""set screen mode to Mode 7"" IRQ routine is ran;

                    ¹ The pipe character | means bitwise OR;
                    ² The circumflex character ^ means bitwise XOR;
7E:005D| 1 byte|Mirror of $2100 (screen brightness).
7E:005E| 1 byte|Mirror of $420C (enabled HDMA channels).
7E:005F| 1 byte|Flags related to hidden layers and also some sprite updating. Format: u--s4321
                 1 = Hide BG1; 
                 2 = Hide BG2; 
                 3 = Show BG3; 
                 4 = Hide BG4 (unused, F-Zero doesn't use BG4); 
                 s = Hide sprites; 
                 - = Unused; 
                 u = Stop updating rank, timer, score and speedometer.
7E:0060| 1 byte|Is screen fading flag.
                #$00 = Not fading; 
                #$01 = Fading in; 
                Other values = Fading out.
7E:0061| 1 byte|Screen fade speed.
                #$00 = Fastest; 
                #$FF = Slowest.
7E:0062| 1 byte|How many frames until the screen brightness increases/decreases when fading. When reaching #$00, 
               it's set to the value at 7E:0061.
7E:0063| 1 byte|Controller 1 data (held buttons). Format: axlr----.
                a = A; 
                x = X; 
                l = L; 
                r = R; 
                - = unused.
7E:0064| 1 byte|Controller 1 data, (held buttons). Format: byetUDLR.
                b = B; 
                y = Y; 
                e = Select; 
                t = Start; 
                U = Up; 
                D = Down; 
                L = Left; 
                R = Right.
7E:0065| 1 byte|Seems to be the exact same as 7E:0063?
7E:0066| 1 byte|Seems to be the exact same as 7E:0064?
7E:0067| 1 byte|Controller 1 data (buttons that started being pressed on current frame). Same format as 7E:0063.
7E:0068| 1 byte|Controller 1 data (buttons that started being pressed on current frame). Same format as 7E:0064.
7E:0069| 1 byte|Controller 1 data (buttons that were released on current frame). Same format as 7E:0063.
7E:006A| 1 byte|Controller 1 data (buttons that were released on current frame). Same format as 7E:0064.
7E:006B| 1 byte|When #$00:
                  - $212E and $212F are set to #$00;
                  - 7E:0070 is stored to $2130;
                  - HDMA channel 2 is disabled. Channel 2 is used for windowing effects, 
                  such as player's shadow and translucent rank number when finishing a race.

                When #$01:
                  - HDMA channel 2 is enabled. Channel 2 is used for windowing effects, 
                  such as player's shadow and translucent rank number when finishing a race.
                  - 7E:006C is stored to $4322 (16-bit, HDMA channel 2 table address);
                  - 7E:0E20 is stored to 7E:0DE3;
                  - 7E:006E is stored to $212E;
                  - 7E:006F is stored to $212F;
                  - 7E:0070 is stored to $2130;
                  - 7E:0071 is stored to $2123;
                  - 7E:0072 is stored to $2124;
                  - 7E:0073 is stored to $2125;

                When greater than #$01:
                  - HDMA channel 2 stays at the same state as it was the last frame.
                  - 7E:006E is stored to $212E;
                  - 7E:006F is stored to $212F;
                  - 7E:0070 is stored to $2130;
                  - 7E:0071 is stored to $2123;
                  - 7E:0072 is stored to $2124;
                  - 7E:0073 is stored to $2125;"
7E:006C|2 bytes|Pointer to RAM address with data for windowing effects. Points to 7E:0DD0 while racing and to 7E:0DF0 while showing transparent rank number after finishing a race.
7E:006E|2 bytes|Mirrors of $212E and $212F (window mask designation).
7E:0070| 1 byte|Mirror of $2130 (color math addition settings).
7E:0071|3 bytes|Mirror of $2123, $2124 and $2125 (Window properties for BG1, BG2, BG3, BG4 and OBJ).
7E:0074| 1 byte|Alternates between #$00 and #$10 every frame. This address indexes 7E:0EA0.
                It alternates to compensate for slowdowns somehow. If this didn't happen, 
                the Mode 7 layer updating would look jittery when a slowdown happens.
7E:0075|2 bytes|BG 1 horizontal scroll. Mirror of $210D.
7E:0077|2 bytes|BG 1 vertical scroll. Mirror of $210E.
7E:0079|2 bytes|BG 2 horizontal scroll. Mirror of $210F.
7E:007B|2 bytes|BG 2 vertical scroll. Mirror of $2110.
7E:007D|2 bytes|Mode 7 X center. Mirror of $211F.
7E:007F|2 bytes|Mode 7 Y center. Mirror of $2120.
7E:0081| 1 byte|Mode 7 rendering type.
                  #$00 = No updating (no need for the game to use mode 7?); 
                  #$01 = Perspective effect; 
                  Other values = Top-down view.
7E:0082| 1 byte|The value of this address + #$80 is written to $4342 and $4372. Similarly, 
                the value of this address + #$A0 is written to $4352 and $4362. 
                This address is responsible for updating the Mode 7 rotation through HDMA.
                Similar to 7E:0074, this address also alternates between #$00 and #$10 every frame to compensate for slowdowns.
                Only used if 7E:0081 == #$01.
7E:0083| 1 byte|Used after the track zooming in effect. When the layer has grown enough (7E:008E == #$0073), this address increases by 1 every frame to raise the viewpoint pitch. When it reaches #$10, it stops increasing."
7E:0084| 1 byte|Written to $4347. Only used if 7E:0081 == #$01.
7E:0085| 1 byte|Written to $4357. Only used if 7E:0081 == #$01.
7E:0086| 1 byte|Written to $4367. Only used if 7E:0081 == #$01.
7E:0087| 1 byte|Written to $4377. Only used if 7E:0081 == #$01.
7E:0088|2 bytes|Mode 7 Matrix A and Mode 7 Matrix D. Mirror of both $211B and $211E.
7E:008A|2 bytes|Mode 7 Matrix B. Mirror of $211C.
7E:008C|2 bytes|Mode 7 Matrix C. Mirror of $211D.
7E:008E|2 bytes|Mode 7 scaling. The mode 7 layer shrinks as this address is increased. Only used if 7E:0081 is greater than #$01.
7E:0090| 1 byte|Current cup.
                  #$00 = Practice/Knight; 
                  #$01 = Queen; 
                  #$02 = King.
7E:0091| 1 byte|Empty?
7E:0092| 1 byte|Used to DMA stuff to VRAM.
                When this value is zero, no DMA is done to VRAM.
                If not zero, the game will perform DMA n times (where n is the value at 7E:0092).
                This address can range from #$00 to #$04, 
                any higher value will send corrupt data to VRAM because of how the addresses that contain info on how to proceed with the DMA are laid out.
                For more info, see the description of the following addresses: 7E:0AE0, 7E:0AE8, 7E:0AF0 and 7E:0AF8."
7E:0094|2 bytes|VRAM destination address written to $2116 for horizontal writes on the mode 7 map updating. See also: 7F:4A00
7E:0096|2 bytes|VRAM destination address written to $2116 for vertical writes on the mode 7 map updating. See also: 7F:4B00
7E:0098| 1 byte|Relates to CGRAM DMA.
                  #$00 = Don't DMA to CGRAM (colors will not update); 
                  #$01 = DMA to CGRAM normally; 
                  Other values = set the whole background (colors 0-127) to the color at 7E:0E26 for this many frames. 
                    The latter is used for explosion effects, 
                    both for the player and for explosive machines.
7E:0099| 1 byte|Empty?
7E:009A| 1 byte|In race frame counter. Increases once per frame, only if unpaused (increases once every other frame if lagging).
7E:009B| 1 byte|Color math designation ($2131) for the whole screen. Only used when 7E:005C is zero.
7E:009C| 1 byte|Color math designation ($2131) for the horizon gradient.
7E:009D| 1 byte|Color math designation ($2131) for the player's machine shadow.
7E:009E| 1 byte|Flag for visually updating a landmine tile that has been exploded. Non zero = update based on info from 7E:0CFA and 7E:0CFC.
7E:009F| 1 byte|Similar to 7E:0092, it's used to DMA stuff to VRAM. Except this one is a bit trickier.
                I still need to study how this actually works, 
                but I know that if the MSB (most significant bit) is set, 
                the values in the info addresses are treated differently (they're treated as 1 byte values maybe?).
                For more info, see the description of the following addresses: 7E:0420, 7E:0422, ..."
7E:00A0|2 bytes|Seems to be a copy of the player's X sub-coordinate.
                Not actually used...?"
7E:00A2|2 bytes|Player's X coordinate minus #$0200. Wraps around at #$1FFF automatically.
                Important value used to scroll the Mode 7 layer.
7E:00A4|2 bytes|Seems to be a copy of the player's Y sub-coordinate.
                Not actually used...?
7E:00A6|2 bytes|Player's Y coordinate minus #$0200. Wraps around at #$0FFF automatically.
                Important value used to scroll the Mode 7 layer.
7E:00A8|2 bytes|Value from 7E:00A2 + value from 0A:ED00, indexed by 7E:0BD1. Wraps around at #$1FFF automatically.
                Each value from 0A:ED00 is 16-bit, so 7E:0BD1 is multiplied by 2 before indexing.
                Important value used to update the Mode 7 map.
7E:00AA|2 bytes|Value from 7E:00A6 + value from 0A:ED00, indexed by 7E:0BD1. Wraps around at #$0FFF automatically.
                Each value from 0A:ED00 is 16-bit, so 7E:0BD1 is multiplied by 2 before indexing.
                Important value used to update the Mode 7 map.
7E:00AC| 1 byte|Mode 7 rotation. Uses the angle format.
7E:00AD| 1 byte|How many checkpoints are there in the current track.
7E:00AE| 1 byte|High byte of the starting X coordinate of the current track.
7E:00AF| 1 byte|High byte of the starting Y coordinate of the current track.
7E:00B0|2 bytes|Indexes 7F:0000. Used to load the track panels. Can either point to 7F:4C00 or 7F:4E00, 
                depending if the track is a secondary variation.
7E:00B2|2 bytes|Most likely empty?
7E:00B4|2 bytes|Set to ($0B70,Y + ($0B70,Y / 2) - $B6) when the camera stops following the car after finishing a race and starts just focusing on it.
                Y being the CPU slot * 2 of the car being followed (always #$0A)
7E:00B6|2 bytes|"Set to ($0B70,Y + ($0B70,Y / 2)) when the high angle byte becomes #$00 after finishing a race and the camera is following the car.
                Y being the CPU slot * 2 of the car being followed (always #$0A)"
7E:00B8| 1 byte|Current screen text. Bitmask: rplLfyws
                  r = Reverse; 
                  p = Power down; 
                  l = Limit X; 
                  L = X laps left; 
                  f = Final lap; 
                  y = You lost ; 
                  w = You won/Goal in*; 
                  s = Special case (healing spaceship or Ready/Go sprites are on screen).
                  * ""Goal in"" is only used if in practice mode with no rival.
7E:00B9| 1 byte|"Non zero causes ""Push start"" to flash on screen. Keep in mind that 7E:00B8 has priority over 7E:00B9."
7E:00BA| 1 byte|Last screen text to be shown. Used to clear this bit from 7E:00B8 when 7E:00BB reaches zero.
7E:00BB| 1 byte|"Screen text timer. Decremented every frame, when reaching zero, the game clears the bit from 7E:00B8 based on the value in 7E:00BA.
                 This value starts at #$00 and increments for the you won/goal in and you lost texts."
7E:00BC| 1 byte|Offset to the table at 00:AFF8 (which has a pointer to code) for the current shown screen text. Used to get the sprite tiles and also to know if the text is already being shown (so the game doesn't keep setting the 7E:00BB timer all the time)
7E:00BD| 1 byte|Number of tiles used on the currently shown screen text * 8. Used for OAM indexing.
                Note that when the text flashes and goes away temporarily, this address will be zero."
7E:00BE|2 bytes|Timer for the final race ending. After you finish the race, it's set to #$0FFF and then decrases every frame. When it reaches #$017C, it's set to #$003B.
                After the value is #$003B, it will keep decreasing every frame, and the value / 4 is stored into 7E:005D to create a screen fade effect.
                When it reaches #$0020, the music starts to fade out."
7E:00C0|1 byte|Race time (minutes).
7E:00C1|1 byte|Race time (seconds).
7E:00C2|1 byte|Race time (centiseconds).
7E:00C3|1 byte|"Race finish state. Bitmask: lefcr--h
                l = Race lost (ranked/timed out); 
                e = Executing explosion animation (player); 
                f = Crossed finish line; 
                c = Camera is following CPU car; 
                r = Show results; - = Unknown; 
                h = Horizon moves with X coordinate instead of angle.
7E:00C4|1 byte|Empty?
7E:00C5|1 byte|Player's current checkpoint angle.
7E:00C6|1 byte|Empty?
7E:00C7|1 byte|Player surface flags. Format: irlp----
                i = Ice; 
                r = Right wind tile; 
                l = Left wind tile; 
                p = Pit area; 
                - = unused."
7E:00C8| 1 byte|Player ""hurt timer"". Only do damage if this address is #$00.
7E:00C9|2 bytes|Player's machine power. The game actually lets this value go below #$0000 before it explodes you.
7E:00CB| 1 byte|May be likely unused. Cleared on level initialization.
7E:00CC| 1 byte|How many frames until the healing spaceship starts to go away. Set to #$10 while in pit area, when out of pit area it decreases every frame. When zero, decrease the value from 7E:00F3."
7E:00CD| 1 byte|A timer that decrements by 1 every frame, used for multiple purposes:
                  Set to #$44 before starting the countdown, to show the cars getting positioned on the finish line;
                  Set to #$B4 when the countdown starts;
                  Set to #$05 after the countdown finished, unknown purpose;
                  Set to #$B4 after finishing a race. If the player finished first, the timer resets to #$B4 when it reaches #$00. Otherwise, it resets to #$5A.
                  Set to #$20 before showing the results of the laps, after finishing or losing a race.
                  Set to #$10 after showing the results of a lap, after finishing or losing a race.
7E:00CE| 1 byte|Used for three purposes:
                1. The cars' Y screen position offset, used before starting the countdown to show the cars getting positioned on the finish line;
                2. Increases by 4 every time the ""GO!!"" sprites are moved to the left. When it reaches #$6C, it increases to #$6D. Then, the track's music starts playing and is never modified thorough the entire race.
                3. How many lap results are currently being shown on screen. Also counts ""Total""."
7E:00CF| 1 byte|Related to player explosion animation. (frame counter thingy?)
7E:00D0| 1 byte|Directly related to the ""machine malfunction"" animation timer (7E:0F3C). Counts up until reaching a certain value when executing the animation."
7E:00D1| 1 byte|Set to 7E:0052 * 2 when the level is being initialized. Used to index tables which hold 16-bit values for machine properties, such as spin time on collision."
7E:00D2| 1 byte|Stored to 7E:040C. Used to determine whether to show one or two digits for the rank.
                  #$00 = Two digits (rank 10 or above), #$0F = One digit (rank 9 or below).
7E:00D3|2 bytes|Empty?
7E:00D5| 1 byte|Doesn't hold any meaningful value, but it shouldn't be used as free ram since it's used to read 7E:00D6 while in 16-bit mode and the game sets it to zero at certain points."
7E:00D6| 1 byte|Player turning stage. Increases when turning left, decreases when turning right. Zero means not turning.
                When turning left:
                  Increases until reaching #$0E if not sharp-cornering, if sharp-cornering it's set to #$10. Decreases when not turning left.
                When turning right:
                  Decreases until reaching #$F2 if not sharp-cornering, if sharp-cornering it's set to #$F0. Increases when not turning right.
                Different values will lead to weird sprite animations and turning speed.
7E:00D7|2 bytes|Related to turning stage incrementing (if turning left) and decrementing (if turning right) somehow.
                Still need to investigate it.
7E:00D9| 1 byte|Related to grip?
                Set to #$01 when gaining grip by tapping the gas.
                #$02 = Sliding with L or R?
7E:00DA| 1 byte|Used for the ""boost"" that the player receives when hitting a jump plate. When the player hits a jump plate, this address is set to zero.

                While the player is midair, this address will increment every frame until reaching the value of #$14.
                The first byte of the acceleration curve will be used if the player is midair and this address is between #$04 and #$13 (inclusive)."
7E:00DB| 1 byte|Indexes the table at 00:9B7E. Set to #$01 when acceleration starts, and then incremented every frame until it reaches #$06.
                The table has the following values: #$01, #$02, #$03, #$04, #$04, #$03, #$02.
                If one of these values are greater than the current value of 7E:00DC, they're directly stored into 7E:00DC.
                Otherwise, 7E:00DC is decremented every frame until it reaches the value on the table.

                This address is ignored if the player is not accelerating.
7E:00DC| 1 byte|Minimum value that 7E:0BC1 (high byte of player's machine height) can have while on ground.
                This value is modified during certain conditions (driving on dirt while going faster than 26km/h or accelerating) and then stored to 7E:0BC1.
                Keep in mind that this only happens while the machine is on ground.
                This address is set to #$00 when the player is not accelerating.
7E:00DD| 1 byte|Current player steer animation:
                  #$00 = sharp left steering; 
                  #$01 = full left steering; 
                  #$02 = left steering step 3; 
                  #$03 = left steering step 2; 
                  #$04 = left steering step 1;
                  #$05 = going straight;
                  #$06 = right steering step 1; 
                  #$07 = right steering step 2; 
                  #$08 = right steering step 3; 
                  #$09 = full right steering; 
                  #$0A = sharp right steering;
                  #$80 = left sliding; #$81 = right sliding.
7E:00DE| 1 byte|Related to 7E:00DD in an unknown way, but also specifies the jumping animation:
                  #$80 = Jumping animation."
7E:00DF| 1 byte|Current sharp cornering ground sparkling animation:
                  #$01 through #$0A = full animation cycle for the sparking (from the left);
                  #$81 through #$8A = full animation cycle for the sparking (from the right);
7E:00E0| 1 byte|Player's sprite animation (overrides 7E:00DD)

                  #$20 = Sliding left;
                  #$21 = Sliding right;

                  The following are used when the player is driving over the electric barrier:
                  #$80, #$82, #$84 and #$87 = Going straight;
                  #$81, #$85 and #$86 = Fully turning right;
                  #$83, #$88 and #$89 = Fully turning left;
                  (When the player starts driving over the barrier, this address is set to #$89 and then decrements every frame. When it reaches #$80, it's set to #$89 again.)
                  Still need to map out the rest.
7E:00E1| 1 byte|How long it takes to advance the player's blast fire animation. If #$80 or higher, the color (7E:00E2) is set to zero."
7E:00E2| 1 byte|Color for player's blast fire. #$00 = darker; #$5D = brighter.
7E:00E3| 1 byte|Current animation frame for player's blast fire.
                #$00 = None; 
                #$01 = Big; 
                #$02 = Medium; 
                #$03 = Small.
7E:00E4| 1 byte|"Player’s blast fire animation transition timer. Set to the value from 7E:00E1 and decreased every frame. When it reaches zero, reset the value and decrease 7E:00E3 (if it’s zero, set to #$03)."
7E:00E5| 1 byte|Y position of the player's blast fire (relative to the machine).
7E:00E6|2 bytes|Pointer to the code used to set the positions of the player's blast fire. Different for each machine.
7E:00E8| 1 byte|Electric barrier flashing timer. Set to #$08 when a machine runs over the barrier, decreases every frame.
7E:00E9| 1 byte|Used to play electric barrier and rough landing effects. Also flashes the player's machine black.
                Decrements every frame. When the low nibble is zero, the entire address is set to zero.
                Set to #$8B when playing electric barrier effects. Set to #$45 when playing rough landing effects.
                When #$8A, it plays the electric barrier sound effect.
7E:00EA| 1 byte|Empty? Cleared on level initialization
7E:00EB| 1 byte|Y position of the first spaceship ""light beam"" sprite. Initialized to #$00 when the spaceship starts shooting the ""light beam"".
                Increases by #$10 every frame until it reaches #$B0, where it resets to #$00."
7E:00EC| 1 byte|Y position of the second spaceship ""light beam"" sprite. Initialized to #$50 when the spaceship starts shooting the ""light beam"".
                Increases by #$10 every frame until it reaches #$B0, where it resets to #$00.
7E:00ED|1 byte?|Related to the color of the blast fire pipes of the player's machine. Will research later.
7E:00EE| 1 byte|Empty? Cleared on level initialization
7E:00EF| 1 byte|Base offset to the table at 02:C9AB (and 02:C9F7) for the player's machine. These tables have the turn performance values.
                  This value is gotten directly from the table at 00:FA7D:
                  #$00 = Blue Falcon;
                  #$13 = Wild Goose;
                  #$26 = Golden Fox;
                  #$39 = Fire Stingray;
7E:00F0|2 bytes|Has two purposes:
                  - In the title screen, it acts as a countdown for the demo race. It increases every frame, and when it reaches #$0500, the demo race is played;
                  - While in a race, this value is related to how much power the player has left somehow."
7E:00F2| 1 byte|Has two purposes:
                  - In the records menu, it acts as the current selected option:
                    - #$00 = Mute City I, #$01 = Big Blue, ..., #$0D = Red Canyon II, #$0E = Fire Field, #$0F = Exit.
                  - In a race, this value is set to the track index of the first track in the cup:
                    - #$00 = Knight, #$05 = Queen, #$0A = King."
7E:00F3| 1 byte|How much of the healing spaceship is currently on screen. Increases every frame when on the pit area. Stops when reaching #$23.
7E:00F4| 1 byte|Empty? Cleared on level initialization
7E:00F5| 1 byte|Road flashing timer. Set to #$09 when a machine hits a wall. Decreases every frame.
7E:00F6| 1 byte|"Doesn't seem to be used, but it's reset to #$00 when unpausing the game for some reason."
7E:00F7| 1 byte|Empty? Cleared on level initialization
7E:00F8|2 bytes|Multipurpose.
                  1. Used to increase the score when finishing a lap.
                  2. Used to calculate a damage modifier based on the machine speeds on a back/front collision.
                  3. Used to in SRAM-related code also as a multipurpose address (to calculate checksum and as a flag if corruption was detected);
                  4. During a pre-recorded race, this holds the address of the next input to be gotten (treated as a 3-byte long address);"
7E:00FA|2 bytes|During a pre-recorded race, it's treated as the bank byte from the long address from 7E:00F8. (1 byte)
                  This address is also used in SRAM-related code in an unknown way. (2 bytes)"
7E:00FE|2 bytes|Has two purposes:
                  1. Pointer to values for $4300-$4306 when the game needs to DMA after a screen fade-out. Used multiple times.
                  2. Stores the code pointer to the currently shown screen text (7E:00B8)."