If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working at any time.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
Contra (NES)/RAM map
< Contra (NES)(Redirected from Contra/RAM map)
Jump to navigation
Jump to search
The following article is a RAM map for Contra (NES).
Address Size Description
------- ---- -----------
18 1 Game Routine Index - which game routine to execute.
Index in game_routine_pointer_table (bank 7 CPU address $c24d)
19 1 Game End Routine Index/Game Routine Init Flag - after beating
the game, used to index into game_end_routine_tbl to sequence
the screen fade, helicopter animation, credits, restart level
1, among other things.
Also used during setup of a level to ensure routines have been
completed.
1a 1 Frame Counter - loops from 0x00 to 0xff increments once per
frame.
Also known as the global timer
1b 1 NMI Check - set to 0x01 at start of nmi and 0x00 at end. Used
to track if nmi occurred before game loop finished
1c 1 Demo Mode - 0x00 not in demo mode, 0x01 in demo mode
1d 1 Player Mode - 0x01 for 1 player, 0x07 for 2 player. Not sure
why developer just didn't use 0x22 (Player Mode) instead
1f 1 Demo Level End Flag - whether or not demo for the level has
been completed and the new demo level should start
20 1 PPU Ready - 0x00 when at least 5 executions of nmi_start have
happened indicating the PPU is ready
21 1 Graphics Buffer Offset - current write offset into
CPU_GRAPHICS_BUFFER (RAM address $700, which contains pattern
table tiles that are written to PPU.
22 1 Player Mode - 0x00 = single player, 0x01 = 2 player
23 1 Graphics Buffer Mode - defines format of the
CPU_GRAPHICS_BUFFER. 0xff is for super-tile data, 0x00 is for
text strings and palette data
24 1 Konami Code Status - 0x00 not entered, 0x01 entered
25 1 Pause State - 0x00 when not paused 0x01 when paused
27 1 Demo Level - the current level when in demo mode. Only ever
0x00, 0x01 or 0x02 as those are the only levels demoed
28 1 Intro Theme Delay - timer to prevent starting a level until the
intro theme is complete (including explosion sound).
29 1 Game Over Delay Timer - timer after dying before showing score.
Goes from 0x60 to 0x00
2a 2 Delay Time - the 2-byte value of the current delay
2c 1 Level Routine Index - which level routine to execute. Index
into level_routine_ptr_tbl (bank 7 CPU address $ce35)
2d 1 End Level Routine Index - index into either
end_level_sequence_ptr_tbl (bank 3 CPU address $be09)
or end_game_sequence_ptr_tbl (bank 4 CPU address $b949)
2e 1 Demo Fire Delay Timer - the number of frames to delay before
player starts firing when demoing
2f 1 Player Weapon Strength - the damage strength of the player 1's
current weapon. Based on bits 0-2 of P1 Current Weapon.
Default = 0x00, M = 0x02, F = 0x01, S = 0x03, L = 0x02.
Player 2's weapon doesn't affect this field.
30 1 Current Level - 0x00 to 0x07 represent levels 1 through 8.
0x9 is interpreted as game over sequence
31 1 Game Completion Count - the number of times the game has been
completed (final boss defeated)
32 1 P1 Number Lives - 0x00 is last life, on game over stays 0x00
and P1 Game Over Status becomes 0x01
33 1 P2 Number Lives - 0x00 is last life, on game over stays 0x00
and P2 Game Over Status becomes 0x01
34 1 Random Number - random number (randomized between interrupts)
36 1 Number Palettes To Load - the number of palettes to load into
CPU memory
37 1 Indoor Screen Cleared - whether indoor screen has had all cores
destroyed (0 = not cleared, 1 = cleared, 0x80 = cleared and
electric fence removed)
38 1 P1 Game Over Status - 0x00 not game over, 0x01 game over
39 1 P2 Game Over Status - 0x00 not game over, 0x01 game over or
player 2 not playing (1 player game)
3a 1 Number Continues - the number of continues remaining
3b 1 Boss Defeated Flag - whether or not the level boss has been
defeated (0x00 = no, 0x01 = yes). After set to 0x01, the end
level sequence logic uses this value as well using values
0x81 and 0x02.
3c 2 P1 Extra Life Score - the 2-byte value of the score required
for the next extra life
3e 2 P2 Extra Life Score Low (collides with Konami Code Number
Correct)
3f 1 Konami Code Number Correct - the number of successful inputs of
the Konami code sequence 0x0a for all correct.
3f 1 Extra Life Score High (P2)
40 1 Level Location Type - 0x00 = outdoor, 0x01 = indoor (base)
0x80 on indoor/base boss screen and indoor/base levels when
players advancing to next screen
41 1 Level Scrolling Type - 0x00 = horizontal (and indoor/base)
0x01 = vertical
42 2 Level Screen Supertiles Pointer - 2-byte address to bank 2
containing which super-tiles to use for each screen of the
level (level_x_supertiles_screen_ptr_table)
44 2 Level Supertile Data Pointer - 2-byte pointer to super-tile
data, which defines pattern table tiles of the super-tiles that
are used to make level blocks
46 2 Level Supertile Palette Data - 2-byte pointer address to the
palettes used for each super-tile. Each byte describes the 4
palettes for a single super-tile
48 1 Level Alternate Graphics Position - how far into level (in
number of screens) before loading alternate graphic data
49 1 Collision Code 1 Tile Index - pattern table tiles below this
index (but not 0x00) are considered Collision Code 1 (floor)
4a 1 Collision Code 0 Tile Index - pattern table tiles >= 0x49 and
less than this tile index are Collision Code 0 (empty)
4b 1 Collision Code 2 Tile Index - pattern table tiles >= $4a and
less than this tile index are Collision Code 2 (water)
4c 4 Level Palette Cycle Indexes - palette indexes into
game_palettes (bank 7 CPU address $d227) to cycle through for
the level for the 4th nametable palette index
50 8 Level Palette Index - the level's initial background palettes
[$50 to $54) and sprite palettes [$54 to $58).
Offsets into game_palettes (bank 7 CPU address $d227).
58 1 Level Stop Scroll - the screen of the level to stop scrolling.
Set to 0xff when boss auto scroll starts
59 1 Level Solid Background Collision Check - used to determine
whether to check for bullet and weapon item solid bg collisions
When non-zero, specifies weapon item should check for solid bg
collisions. When negative, used to let bullet (player and
enemy) collision detection code to know to look for
bullet-solid background collisions.
5a 1 P1 Demo Input Number of Frames - how many even-numbered frames
to continue pressing the button specified in Demo Input Value
($5c) for demo
5b 1 P2 Demo Input Number of Frames
5c 1 P1 Demo Input Value - the current controller input pressed
during demo
5d 1 P2 Demo Input Value
5e 1 P1 Demo Input Table Index - when in demo, stores the offset
into specific demo_input_tbl_lX_pX (bank 5)
5f 1 P2 Demo Input Table Index
60 1 PPU Write Tile Offset - the current write offset of the
super-tile data, number of tiles outside the current view.
Horizontal levels loops from 0x00 to 0x1f. Vertical starts with
0x1d goes down to 0x00 before looping.
61 1 Level Transition Timer - used in vertical levels to time
animation between sections for every 'up' input. Also used in
indoor levels between screens to animate moving forward.
62 2 PPU Write Address- 2-byte PPU write address to
CPU Graphics Buffer ($700)
64 1 Level Screen Number - the screen number of the current level,
i.e. how many screens into the level
65 1 Level Screen Scroll Offset - the number of pixels into Level
Screen Number the level has scrolled. Goes from 0x00-0xff for
each screen (256 pixels)
66 2 Attribute Table Write Address - the 2-byte attribute table
write address
68 1 Frame Scroll - how much to scroll the screen this frame based
on player velocity (usually 0x00 or 0x01). For vertical levels,
up to 0x04
69 1 Supertile Nametable Offset - base nametable offset into memory
address into CPU graphics buffer starting at Level Screen
Supertiles ($0600). Always either 0x00 (nametable 0) or 0x40
(nametable 1), points to area that contains the super-tile
indexes for screen
6a 1 Sprite Load Type - which sprites to load
0x00 = normal sprites, 0x01 = Heads Up Display (HUD) sprites
6b 1 Continue End Selection - 0x00 = "CONTINUE" is selected
0x01 = "END" is selected. Used in game over screen
71 1 Alternate Graphic Data Loading Flag
0x00 = alternate graphics data should not be loaded
0x01 = alternate graphics data should be loaded
0x02 = alternate graphics data are currently being loaded
72 1 Level Palette Cycle - the current iteration of the palette
animation loop. 0x00 up to entry for level in
lvl_palette_animation_count (bank 7 CPU address $d181)
73 1 Indoor Scroll - scrolling on indoor level changes
0x00 = not scrolling; 0x01 = scrolling, 0x02 = finished
74 1 Background Palette Adjust Timer - timer used for adjusting
background palette colors (not sprite palettes). Used for
fade-in effect of dragon and boss UFO as well as indoor
transitions
75 1 Auto Scroll Timer 0 - used when completing scroll to show a
boss, e.g. vertical level dragon screen
76 1 Auto Scroll Timer 1 - used when completing scroll to show a
boss, e.g. alien guardian
77 1 Tank Auto Scroll - amount to scroll every frame for snow field
tanks (dogras), regardless of Auto Scroll Timer 0 and 1
78 1 Pause Palette Cycle - 0x00 = nametable palettes
0x03 and 0x04 will cycle through colors like normal. Non-zero
values will pause palette color cycling.
79 1 Soldier Generation Routine - which routine is currently in use
for generating soldiers. Index into soldier_generation_ptr_tbl
(bank 2 CPU address $b537)
7a 1 Soldier Generation Timer - a timer between soldier generation.
0x00 = no generation.
7b 1 Soldier Generation X Position - the initial x position of the
generated soldier
7c 1 Soldier Generation Y Position - the initial y position of the
generated soldier
7d 1 Falcon Flash Timer - the number of frames to flash the screen
for falcon weapon item
7f 1 Tank Ice Join Scroll Flag - whether or not to have the ice
joint enemy move left while player walks right to simulate
being on the background. (snow field level)
80 2 Enemy Level Routines - 2-byte address to the correct
enemy_routine_level_XX (bank 7) for the current level, used to
retrieve enemy routines for the level-specific enemies
82 1 Enemy Screen Read Offset - read offset into
level_xx_enemy_screen_xx (bank 2) table, which specifies the
enemies on each screen of a level
83 1 Enemy Current Slot - specifies the current enemy slot that is
being executed
84 1 Boss Auto Scroll Complete - set when boss reveal auto-scrolling
has completed
85 1 Boss Screen Enemies Destroyed - used on level 3 and level 7
boss screens to keep track of how many dragon arm orbs or
mortar launchers have been destroyed respectively
86 1 Wall Core Remaining - remaining wall cores/wall platings to
destroy until can advance to next screen. For level 4 boss,
used to count remaining boss gemini
87 1 Wall Plating Destroyed Count - used in indoor/base boss levels
to keep track of how many wall platings (ENEMY_TYPE 0x0a) have
been destroyed
88 1 Indoor Enemy Attack Count - used in indoor/base levels to
specify how many 'rounds' of attack have happened per screen,
max 0x07 before certain enemies no longer generate. Indoor
soldiers, jumping soldiers, indoor rollers, and wall core check
this value
89 1 Indoor Red Soldier Created - used in indoor/base levels to
indicate if a red jumping soldier has been created, to prevent
creation of another
8a 1 Grenade Launcher Flag - used in indoor/base levels to indicate
that a grenade launcher enemy (ENEMY_TYPE 0x17) is on the
screen. Prevents other indoor enemies from being generated
8b 1 Alien Fetus Aim Timer Index - used to keep track of the index
into alien_fetus_aim_timer_tbl (bank 0 CPU address $b7e8) to
set the delay between re-aiming towards the player
8e 1 Enemy Attack Flag - whether or not enemies will fire at player,
also whether or not random enemies are generated, bosses ignore
this value
90 1 P1 Player State - 0x00 falling into level, 0x01 normal state,
0x02 when dead, 0x03 can't move
91 1 P2 Player State - same as P1 Player State. If p2 not playing,
set to 0x00
92 1 P1 Indoor Transition X Accumulator - used to help calculate
fractional x velocity when moving between screens on
indoor/base levels
93 1 P2 Indoor Transition X Accumulator
94 1 P1 Player Jump Coefficient - used to keep track of fractional y
velocity on vertical levels for overflowing fractional
velocity. Also used to help calculate fractional y velocity
when moving between screens on indoor/base levels.
95 1 P2 Player Jump Coefficient
96 1 P1 Indoor Transition X Fractional Velocity - indoor animation
transition when walking into screen x fractional velocity
97 1 P2 Indoor Transition X Fractional Velocity
98 1 P1 Player X Velocity - the player's x velocity (0x00, 0x01, or
0xff)
99 1 P2 Player X Velocity
9a 1 P1 Indoor Transition Y Fractional Velocity - indoor animation
transition when walking into screen y fractional velocity
9b 1 P2 Indoor Transition Y Fractional Velocity
9c 1 P1 Indoor Transition Y Fast Velocity - indoor animation
transition when walking into screen y fast velocity
9d 1 P2 Indoor Transition Y Fast Velocity
9e 1 P1 Player Animation Frame Timer - value that is incremented
every frame when player is walking. Used to wait 0x08 frames
before incrementing Player Animation Frame Index ($a6) for
animating player walking
9f 1 P2 Player Animation Frame Timer
a0 1 P1 Player Jump Status - the status of the player jump. Similar
to Edge Fall Code ($a4)
* high nibble is for facing direction
* bit 7 - set when jumping left
* low nibble is 0x01 when jumping, 0x00 when not
a1 1 P2 Player Jump Status
a2 1 P1 Player Frame Scroll - how much player is causing the frame
to scroll by, see Frame Scroll ($68)
a3 1 P2 Player Frame Scroll
a4 1 P1 Edge Fall Code - similar to Player Jump Status ($a0). Used
to initiate gravity pulling player down
* if bit 7 set, then falling through platform
* if bit 6 is set, then walking left off edge
* if bit 5 is set, then walking right off ledge
a5 1 P2 Edge Fall Code
a6 1 P1 Player Animation Frame Index - which frame of the player
animation. Depends on player state. For example, if player is
running, this cycles from 0x00 to 0x05.
a7 1 P2 Player Animation Frame Index
a8 1 P1 Player Indoor Animation Y - the y position the player was at
when they started walking into screen after clearing an indoor
level. I believe it's always 0xa8 since y position is
hard-coded for indoor levels
a9 1 P2 Player Indoor Animation Y
aa 1 P1 Current Weapon - low nibble is what weapon P1 has, high
nibble 1 is rapid fire flag, commonly abbreviated MFSL
0x00 - Regular, 0x01 - Machine Gun, 0x02 - Flame Thrower
0x03 - Spray, 0x04 - Laser, bit 4 set for rapid fire
ab 1 P2 Current Weapon
ac 1 P1 Player M Weapon Fire Time - used when holding down the B
button with the m weapon. High nibble is number of bullets
generated (up to 0x06), low nibble is counter before next
bullet is generated (up to 0x07)
ad 1 P2 Player M Weapon Fire Time
ae 1 P1 New Life Invincibility Timer - timer for invincibility after
dying
af 1 P2 New Life Invincibility Timer
b0 1 P1 Invincibility Timer - timer for player invincibility (b
weapon). Decreases every 8 frames., usually set to 0x80 except
level 7 when set to 0x90.
b1 1 P2 Invincibility Timer
b2 1 P1 Player Water State
* bit 1 - horizontal sprite flip flag
* bit 2 - set when player in water, or exiting water
* bit 3 - player is walking out of water
* bit 4 - finished initialization for entering water
* bit 7 - player is walking out of water
b3 1 P2 Player Water State
b4 1 P1 Player Death Flag - bit 0 specifies whether player has died,
bit 1 specifies player was facing left when hit, used so player
dies lying in appropriate direction
b5 1 P2 Player Death Flag
b6 1 P1 Player On Enemy - whether or not the player is on top of
another enemy (0x14 - mining cart, 0x15 - stationary mining
cart, 0x10 - floating rock platform)
b7 1 P2 Player On Enemy
b8 1 P1 Player Fall X Freeze - used to prevent changing X velocity
shortly after walking off/falling through ledge, set to Y post
of ledge + 0x14
b9 1 P2 Player Fall X Freeze
ba 1 P1 Player Hidden - 0x00 player visible, 0x01/0xff player
invisible (any non-zero). I believe it is meant to track
distance off screen the player is
bb 1 P2 Player Hidden
bc 1 P1 Player Sprite Sequence - which animation to show for the
player
* outdoor - 0x00 standing (no animation), 0x01 gun pointing
up, 0x02 crouching, 0x03 walking or curled jump animation,
0x04 dead animation
* indoor - 0x00 standing facing back wall, 0x01 electrocuted,
0x02 crouching, 0x03 walking left/right animation, 0x05
walking into screen (advancing), 0x06 dead animation
bd 1 P2 Player Sprite Sequence
be 1 P1 Player Indoor Animation X - the x position the player was at
when they started walking into screen after clearing an indoor
level
bf 1 P2 Player Indoor Animation X
c0 1 P1 Player Aim Previous Frame - backup of Player Aim Direction
($c2)
c1 1 P2 Player Aim Previous Frame - backup of Player Aim Direction
($c3)
c2 1 P1 Player Aim Direction - which direction the player is aiming
[0x00-0x0a] depends on level and jump status (00 up facing
right, 1 up-right, 2 right, 3 right-down, 4 crouching facing
right, 5 crouching facing left, etc). There are 0x02 up and
0x02 down values depending on facing direction.
c3 1 P2 Player Aim Direction
c4 1 P1 Player Y Fractional Velocity - the fractional portion of the
player's y velocity
c5 1 P2 Player Y Fractional Velocity
c6 1 P1 Player Y Fast Velocity - the integer portion of the player's
y velocity. Positive pulls down, negative pulls up
c7 1 P2 Player Y Fast Velocity
c8 1 P1 Electric Shock Timer - timer for player being shocked, used
to freeze player and modify look after touching electricity
c9 1 P2 Electric Shock Timer
ca 1 P1 Indoor Player Jump Flag - used when entering new screen to
tell the engine to cause the player to jump
cb 1 P2 Indoor Player Jump Flag
cc 1 P1 Player Water Timer - timer used for getting into and out of
water
cd 1 P2 Player Water Timer
ce 1 P1 Player Recoil Timer - how many frames to be pushed back/down
from recoil
cf 1 P2 Player Recoil Timer
d0 1 P1 Indoor Player Advance Flag - whether or not the player is
walking into screen when advancing between screens on indoor
levels, used for animating player
d1 1 P2 Indoor Player Advance Flag
d2 1 P1 Player Special Sprite Timer - used to track animation for
player death animation. For outdoor levels, it is a timer that
increments once player hit, every 0x08 frames updates to next
animation frame until 0x04. Also used to track jumping curl
animation (loops from 0x00-0x04)
d3 1 P2 Player Special Sprite Timer
d4 1 P1 Player Fast X Velocity Boost - the x fast velocity boost
from landing on a non-dangerous enemy, e.g. moving cart or
floating rock in vertical level
d5 1 P2 Player Fast X Velocity Boost
d6 1 P1 Player Sprite Code - sprite code of the player
d7 1 P2 Player Sprite Code - sprite code of the player
d8 1 P1 Player Sprite Flip - stores player sprite horizontal (bit 6)
and vertical (bit 7) flip flags before saving into SPRITE_ATTR.
Bit 3 specifies whether the Player Animation Frame Index ($a6)
is even or odd
d9 1 P2 Player Sprite Flip
da 1 P1 Player Background Flag and Edge Detect
* bit 7 specifies the player's sprite attribute for
background priority. Allows player to walk behind opaque
background (OAM byte 2 bit 5). 0x00 = sprite in
foreground, 0x01 = sprite is background
* bit 0 allows the player to keep walking horizontally off a
ledge without falling
db 1 P2 Player Background Flag and Edge Detect
df 1 Game Over Bit Field - combination of both players game over
status.
* 0x00 = p1 not game over, p2 game over (or not playing)
* 0x01 = p1 game over, p2 not game over
* 0x02 = p1 nor p2 are in game over
ec 2 Sound Table Pointer - 2-byte address pointing of index into
sound_table_00 (bank 1 CPU address $88e8)
f1 1 P1 Controller State - stores the currently-pressed buttons
* bit 7 - A
* bit 6 - B
* bit 5 - select
* bit 4 - start
* bit 3 - up
* bit 2 - down
* bit 1 - left
* bit 0 - right
f2 1 P2 Controller State
f5 1 P1 Controller State Diff - stores the difference between the
controller input between reads. Useful for events that should
only trigger on first button press
f6 1 P2 Controller State Diff
f9 1 P1 Controller Known Good - used in input-reading code to know
the last known valid read of controller input (similar to
P1 Controller State ($f1)
fa 1 P2 Controller Known Good
fc 1 Vertical Scroll - the number of pixels to vertically scroll
down.
* horizontal levels are always 0xe0 (224 pixels or
28 tiles down)
* indoor/base are always 0xe8 (232 or 29 tiles down)
* waterfall level (vertical level) starts at 0x00 and
decrements as players move up screen (wrapping)
fd 1 Horizontal Scroll - the horizontal scroll component of the
PPUSCROLL, [0x00 - 0xff]
fe 1 PPU Mask Settings - used to store value of PPUMASK before
writing to PPU
ff 1 PPU Control Settings - used to set PPUCTRL value for next frame
100 6 Sound Command Length - how many video frames the sound count
should last for, i.e. the time to wait before reading next
sound command. One for each of the 0x06 sound slots.
106 6 Sound Code - the sound code for each of the 0x06 sound slots
10c 6 Sound Pulse Length - APU_PULSE_LENGTH for each of the 0x06
sound slots
112 6 Sound Command Adress Low Byte - low byte of address to current
sound command. 0x06 slots, one for each sound slot
118 6 Sound Command Address High Byte - high byte of address to
current sound command. 0x06 slots, one for each sound slot
11e 2 Sound Volume Envelope - pulse channel volume. Either an
offset into pulse_volume_ptr_tbl (bank 1 CPU address $8001)
which specifies the volume for the frame or a specific volume
to use. When bit 7 is set, then the volume will auto
decrescendo.
120 1 Sound Current Slot - the current sound slot 0x00-0x05
inclusively.
121 1 Percussion Index Backup - backup location for
percussion_tbl (bank 1 CPU address $82 cd) index to restore
after call to play_sound (bank 7 CPU address $c16b)
122 1 Initial Sound Code - the sound code to load. Sound codes
greater than 0x5a are dmc sounds
123 1 Sound Channel Register Offset - 0x00 for first pulse channel,
0x04 for second, 0x08 for triangle, 0x0c for noise
124 1 Sound Flags - sound channel flags
* bit 0 - 0 = sound effect, 1 = music
* bit 1 - 1 = decrescendo end pause complete, resume
decrescendo, 0 = keep volume constant
* bit 2 - 0 = use lvl_config_pulse (bank 1 CPU address $8154)
to set volume for frame, 1 = automatic decrescendo logic
* bit 3 - signifies that a shared (child) sound command is
executing. Used to know, after finishing parsing a sound
command, whether or not to done or should return to parent
sound command
* bit 4 - slightly flatten note
* bit 5 - 1 = decrescendo should be paused for a duration
* bit 6 - mute flag (1 = muted, 0 = not muted)
* bit 7 - sweep flag
12a 1 Level Pulse Volume Index - index into level pulse volume table
12a 1 Pulse Volume Duration - the number of video frames to decrement
the volume for, before stopping decrescendo and keeping final
volume
12f 1 Pause State 1 - whether or not the game is paused, used for
sound logic (see Pause State ($25))
130 1 Pulse Channel 1 Decrescendo End Pause - number of video frames
before end of sound command in which the decrescendo will
resume
131 1 Pulse Channel 2 Decrescendo End Pause
132 4 Sound Pitch Adjust - the amount added to the sound byte low
nibble before loading the correct note period value
136 6 Sound Command Multiplier - amount to multiply to when
calculating when to stop decrescendo
13c 6 Sound Volume Adjust - used to adjust volume amount when setting
volume
142 1 Sound Slot 0 Config Low - the value to merge with the high
nibble before storing in APU channel config register for pulse
channel
143 1 Sound Slot 1 Config Low
144 1 Sound Triangle Config - in memory value for the triangle
channel configuration.
148 6 Sound Repeat Count - used for 0xfe sound commands to specify
how many times to repeat a shared sound part
14e 1 Pulse Channel 1 Sound Config High - the value to merge with the
volume when saving the pulse config
14f 1 Pulse Channel 2 Sound Config High
152 1 Pulse Channel 1 Sound Config High - Sound Slot 0x04
154 6 Sound Length Multiplier - value used when determining how many
video frames to wait before reading next sound command.
15a 6 Sound Period Rotate - when not 0x04, the number of times to
shift the high byte of note period index into the low byte
160 6 Pulse Volume - low nibble only, stores the volume for the pulse
channels
166 6 New Sound Code Low Address - sound command return location low
byte once sound command specified executes
16c 6 New Sound Code High Address - sound command return location
high byte once sound command specified executes
172 6 Sound Pulse Period - APU Pulse Period value
178 1 Sound Slot 0 Vibrato Control - [0x00-0x03], 0x80 = no vibrato.
Even values cause the note to stay the same, odd values cause
vibrato 0x03 = pitch up, 0x01 = pitch down
179 1 Sound Slot 1 Vibrato Control
17a 1 Sound Slot 0 Volume Timer - sound command counter; increments
up to Vibrato Delay ($17e), at which vibrato will be checked,
only increments when Vibrato Control ($178) is non-negative,
i.e. not 0x80
17b 1 Sound Slot 1 Volume Timer
17c 1 Sound Slot 0 Note - the pulse channel note that is sustained or
has the vibrato applied to for pulse channels (in Contra only
ever sustained no vibrato)
17d 1 Sound Slot 1 Note
17e 1 Sound Slot 0 Pulse Vibrato Delay - used to delay start of
vibrato until Sound Volume Timer ($17a) has counted up to this
value. If a note isn't as long as the delay, then vibrato
won't be considered for a note
17f 1 Sound Slot 1 Pulse Vibrato Delay
180 1 Sound Slot 0 Vibrato Amount - the amount of vibrato to apply
181 1 Sound Slot 1 Vibrato Amount - the amount of vibrato to apply
190 1 Level End Delay Timer - a delay timer before beginning level
end animation sequence
191 1 Level End Sequence 1 Timer - a delay timer specifying the
duration of end_level_sequence_01 (bank 3 CPU address $be3c).
Decremented every other frame
192 1 P1 Level End Level Routine State - used by level end routines
for managing animation state. For example, indoor level end
animations have 4 states: walk to elevator, initialize elevator
sprite, ride elevator
193 1 P2 Level End Level Routine State - used by level end routines
194 1 Level End Players Alive - the number of players alive at the
end of the level, used to know if should play level end music
195 1 Soldier Generation Screen - the current screen that soldiers
are being generated for
196 1 Screen Generation Soldiers - the total number of soldiers that
have been generated for the current screen
200 100 OAM DMA CPU Buffer - OAMDMA (sprite) data, read once per frame
300 a Player Sprites - player sprites, p1 and p2 sprite, then player
bullets
30a 10 Enemy Sprites - enemy sprites to load on screen
31a a Player Sprite Y Positions - y position on screen of each player
sprite.
324 10 Enemy Y Positions - y position on screen of each enemy sprite
334 10 Player Sprite X Positions - x position of screen of each player
sprite and player bullets
33e 10 Enemy X Positions - x position on screen of each enemy sprite
34e a Player Sprite Attributes - sprite attribute, specifies palette,
vertical flip, horizontal flip, and whether to adjust y
position
* bit 0 and 1 - sprite palette
* bit 2 - 0 to use default palette from sprite code
* - 1 to use palette specified in bits 0 and 1
* bit 3 - whether to add 0x01 to sprite y position, used for
recoil effect firing weapon
* bit 5 - bg priority
* bit 6 - whether to flip the sprite horizontally
* bit 7 - whether to flip the sprite vertically
358 10 Enemy Sprites Attributes - enemy sprite attribute. See
specification above for Player Sprite Attributes
368 10 Player Bullet Sprite Code - the sprite codes to load for the
bullet
378 10 Player Bullet Sprite Attribute - the sprite attributes for the
bullet (see Player Sprite Attributes ($34e) for specification)
Used for L bullets for flipping the angled sprites depending on
direction
388 10 Player Bullet Slot - 0x00 when no bullet, otherwise stores
bullet type + 1, i.e. 0x01 basic, 0x02 M, 0x03 F bullet,
0x04 S,0x05 L, can be negative sometimes
398 10 Player Bullet Velocity Y Accumulator - an accumulator to keep
track of Player Bullet Y Velocity Fractional ($3f8) being added
to itself have elapsed before adding 1 to Player Bullet Y
Position ($3b8)
3a8 10 Player Bullet Velocity X Accumulator - an accumulator to keep
track of Player Bullet X Velocity Fractional ($3e8) being added
to itself have elapsed before adding 1 to Player Bullet X
Position ($3c8)
3b8 10 Player Bullet Y Position - the bullet's sprite y position
3c8 10 Player Bullet X Position - the bullet's sprite x position. For
F bullets, Player Bullet FS X ($478) and this value together
determine x position
3d8 10 Player Bullet Y Velocity Fractional - percentage out of 0-255
set number of frames until Y position is incremented by an
additional 1 unit
3e8 10 Player Bullet X Velocity Fractional - percentage out of 0-255
set number of frames until X position is incremented by an
additional 1 unit
3f8 10 Player Bullet Y Velocity Fast - player bullet velocity y
integer part
408 10 Player Bullet X Velocity Fast - player bullet velocity x
integer part
418 10 Player Bullet Timer - 'timer' starts at 0x00. Used by F, S
(indoor only) and L
* for indoor S, used to specify size of bullet
* For F, used to set x and y pos when traveling to create
swirl. Increments or decrements every frame depending on
firing direction (left decrement, right increment)
* For L used to spread out 4 lasers for one shot
428 10 Player Bullet Aim Direction - the direction of the bullet
0x00 for up facing right, incrementing clockwise up to #09 for
up facing left
438 10 Player Bullet Routine - 0x00, 0x01, or 0x03
448 10 Player Bullet Owner - 0x00 player 1 bullet, 0x01 player 2
bullet
458 10 Player Bullet F Rapid - 0x01 for player indoor bullets for F
weapon when rapid fire is enabled
458 10 Player Bullet S Indoor Adjust - for indoor S bullets, specifies
whether to adjust Player bullet X Position ($3c8) by an
additional -1 (0xff) every frame
468 10 Player Bullet Distance - represents how far a bullet has
traveled
* for S outdoor bullets, used to determine the size (scale)
of the bullet
* for F on indoor levels, used to determine spiraling
position based on distance from player
468 10 Player Bullet S Adjust Accumulator - for indoor S weapons,
stores accumulated fractional velocity where overflow affects
Player Bullet S Indoor Adjust ($458)
478 10 Player Bullet FS X - used to offset from general x direction of
bullet for swirl effect in F bullet and spread effect in S
bullet (indoor). Specifies center x position on screen f bullet
swirls around. Used when firing f bullet either left, right, or
at an angle
488 10 Player Bullet F Y - center y position on screen f bullet swirls
around. Used when firing f bullet either up, down, or at an
angle.
488 10 Player Bullet S Rapid - for S weapon in indoor levels,
specifies whether weapon is rapid fire or not
498 10 Player Bullet Velocity FS X Accumulator - an accumulator to
keep track of Player Bullet X Velocity Fractional ($3e8) being
added to itself have elapsed before adding 1 to
Player Bullet X Position ($3c8)
4a8 10 Player Bullet Velocity F Y Accumulator - (for F weapon only) an
accumulator to keep track of Player Bullet Y Velocity
Fractional ($3d8) being added to itself have elapsed before
adding 1 to Player Bullet Y Position ($3b8)
4a8 10 Player Bullet S Bullet Number - for S weapon only, specifies
the number the bullet in the current 'spray' for the shot. Per
shot of S weapon, 0x05 bullets are generated. If no other
bullets exist then $04a8 would have 0x00, $04a9 would have 0x01
$04a9 would have 0x02, etc.
4b8 10 Enemy Routine - enemy routine indexes. Subtract 1 to get real
routine, since all offsets are off by 1
4c8 10 Enemy Y Velocity Accumulator - an accumulator to keep track of
Enemy Y Velocity Fractional ($4f8) being added to itself have
elapsed before adding 1 to Enemy Y Position ($324)
4d8 10 Enemy X Velocity Accumulator - an accumulator to keep track of
Enemy X Velocity Fractional ($518) being added to itself have
elapsed before adding 1 to Enemy X Position ($33e)
4e8 10 Enemy Y Velocity Fast - the number of units to add to Enemy Y
Position ($324) every frame
4f8 10 Enemy Y Velocity Fractional - percentage out of 0-255 of a unit
to add, e.g. if 0x80 (0x80/0xff = 50%), then every other frame
will cause Y position to increment by 1
508 10 Enemy X Velocity Fast - the number of units to add to
Enemy X Position ($33e) every frame
518 10 Enemy X Velocity Fractional - percentage out of 0-255 of a unit
to add, e.g. if 0x80 (0x80/0xff = 50%), then every other frame
will cause X position to increment by 1
528 10 Enemy Type - enemy type, e.g. 0x03 = flying capsule
538 10 Enemy Animation Delay - used for various delays by enemy logic
548 10 Enemy Variable A - variable used for various purposes by some
enemy types, e.g. the sound code to play when enemy hit by
player bullet. Dragon arm orb uses it for adjusting enemy
position, fire beam uses it for animation delay
558 10 Enemy Attack Delay - the delay before an enemy attacks, for
weapon items and grenades this is used for helping calculate
falling arc trajectory instead of enemy delay
558 10 Enemy Variable B - for weapon items and grenades this is used
for helping calculate falling arc trajectory instead of enemy
delay
568 10 Enemy Frame - animation frame the enemy is in, typically
indexes into an enemy type-specific table of sprite codes
588 10 Enemy Score Collision - represents 3 things for an enemy
* SSSS CCCC - score code and collision type
* also explosion type
578 10 Enemy HP - typically the HP of the enemy
598 10 Enemy State Width - various properties
* bit 7 set to allow bullets to travel through enemy, e.g.
weapon item
* bit 6 specifies whether player can land on enemy (floating
rock and moving cart), bit 4 also has to be 0
* bit 4 and 5 specify the collision box type
* bit 3 determines the explosion type
* bit 2 for bullets specifies whether to play sound on
collision
* bit 1 specifies whether to play explosion noise; also
specifies width of enemy
* bit 0 - 0x00 test player-enemy collision, 0x01 means to
skip player-enemy collision test
5a8 10 Enemy Attributes - enemy type-specific attributes that define
how an enemy behaves and/or looks
5b8 10 Enemy Variable 1 - a byte available to each enemy for whatever
they want to use it for
5c8 10 Enemy Variable 2 - a byte available to each enemy for whatever
they want to use it for
5d8 10 Enemy Variable 3 - a byte available to each enemy for whatever
they want to use it for
5e8 10 Enemy Variable 4 - a byte available to each enemy for whatever
they want to use it for
600 80 Level Screen Supertiles - CPU memory address where super tiles
indexes for the screens of the level are loaded. 2 screens are
stored in the CPU buffer. The second screen loaded at $0640.
680 20 Background Collision Data - map of collision types for each of
the super-tiles for both nametables, each 2 bits encode 1/4 of
a super-tile's collision information. First 8 nibbles are a row
of the top of super-tile, the next 8 are the middle middle.
Not used on base (indoor) levels
700 50 CPU Graphics Buffer - used to store data that will be then
moved to the PPU. repeating structure
* byte 0 is multifaceted
* if 0x0, then done writing graphics buffer to PPU
* if greater than 0x0, then there is data to write, this
byte is the offset into vram_address_increment
* both 0x01, and 0x03 signify VRAM address increment to
0, meaning to add 0x1 every write to PPU (write
across)
* 0x02 signifies VRAM address increment is 1, meaning
add 0x20 (32 in decimal) every write to PPU (write
down)
* if Graphics Buffer Mode ($23) is 0xff then
* byte 1 is length of the tiles being written per group
* byte 2 is the number of $701-sized blocks to write to the
PPU
* for each block, the block prefixed with 2 bytes
specifying PPU address (high byte, then low byte)
* if Graphics Buffer Mode ($23) is 0x00
* if byte 0x00 is 0x00, then no drawing takes place for
frame
* blocks of text/palette data prefixed with 2 bytes
specifying PPU address (high byte, then low byte). the
block of text is ended with a 0xff, if the byte after
0xff is the vram_address_increment offset. then the the
process continues, i.e. read 0x02 PPU address bytes,
read next text
7c0 20 Palette CPU Buffer - the CPU memory address of the palettes
eventually loaded into the PPU $3f00 to $3f1f
7e0 2 High Score - the 2-byte high score
7e2 2 Player 1 Score - the 2-byte score for player 1
7e4 2 Player 2 Score - the 2-byte score for player 2
7ec 1 Previous ROM Bank - the previously-loaded PRG BANK
7ed 1 Previous ROM Bank 1 - the previously-loaded PRG BANK, but used
only when playing sounds, otherwise a duplicate use of
Previous ROM Bank ($7ec)
Internal Data for Contra (NES)
| |
|---|---|