Series · part of Mega Man

Mega Man (classic series)

The original Mega Man series, begun on the NES in 1987.

Mega Man let the player take on six Robot Masters in any order, each one beaten giving up its weapon1,2. Mega Man 2 kept both ideas and made each weapon a weakness of another boss3, and retrospectives credit them with the series’ long run4.

#How he moves, game by game

Each NES game sets Mega Man’s speed outright instead of building it up5, but the numbers and their timing change from game to game. Mega Man 2 keeps the first game’s speeds and shortens its first step from 9 frames to 76. Mega Man 3 trades the slow step for a short pause, adds the slide, and ends a jump differently when A is let go7. Mega Man 4 takes off at 5 px/frame and slides longer8, and Mega Man 5 moves the same way on open floor, differing only at the end of a slide and in where he meets walls and ceilings9. Mega Man 6 takes off faster still10, and pressing A in its slide ends the slide instead of jumping11.

Interactive: movement-lab (needs JavaScript)

Mega Man’s NES games, each one’s model checked against its cartridge

Games

Interactive: timeline (needs JavaScript)

The series by year

Mechanics

MechanicMega Man
1987
Mega Man 2
1988
Mega Man 3
1990
Mega Man 4
1991
Mega Man 5
1992
Mega Man 6
1993
Air controlDirectDirectDirectDirect
Boss weaknessBoss tableEvery enemy
Charge shotNoneTiers on releaseTiers on releaseTiers on release
ClimbingVine or ladder
Coyote timeNone
Destructible terrainBreakable tiles
FlightHeld height
GravityOne gravityOne gravityOne gravityOne gravity
Ground slideNoneTimedTimedTimedTimed
HitboxBox
Invincibility framesFrame timerFrame timerFrame timerFrame timer
JumpOne speedOne speedOne speedOne speedOne speedOne speed
KnockbackFixed shoveFixed shoveFixed shoveFixed shoveFixed shoveFixed shove
Palette cyclingPalette sets
Password and battery savePassworduses
RunningSteppedSteppedSteppedStepped
Sprite flickerAlternating order
Status bar splitSprite overlay
Variable jump heightRelease capRelease capRelease capRelease capRelease capRelease cap
Weapon energyPer weaponPer weapon
Cooperative multitaskinguses
Stage selectuses

A marked cell changed from the game before. “Uses” means the game has the mechanic, with no variant recorded yet.

Every claim, by mechanic and game
ConceptMega Man
1987
Mega Man 2
1988
Mega Man 3
1990
Mega Man 4
1991
Mega Man 5
1992
Mega Man 6
1993
Air controluses
Area transition
Boot sequence
Boss weakness
Charge shot
CHR RAM
Climbinguses
Controller reading
Cooperative multitasking
Coyote time
Destructible terrainuses
Enemy explosion
Enemy spawning
Enemy targeting
Flight
Forced blanking
Game loop
Gravity
Ground slide
Hitbox
Invincibility frames
Jumpuses
Jump physics
Knockback
Level loading
Music driver
Palette cycling
Password and battery saveuses
PRG bank switching
Running
Sound effects
Sprite flicker
Stage selectuses
Status bar split
Tile collision
Variable jump height
VRAM buffer
Weapon energy

Code lineage

FromToMatchBytesWhat
Mega Man audio-controlMega Man 2 audio-controlchanged565Mega Man 2's sound engine entry and channel setup are Mega Man's, with two changes: `_music_fade_in_out` no longer ignores a new fade while one is running, and where Mega Man steps X with INX, four operands use an address plus 1 instead and one writes `SQ1_SWEEP` plus X. The engine starts at $8000 instead of $9000, so its jump and call addresses differ too.
Mega Man audio-music-readerMega Man 2 audio-music-readerrelocated705Mega Man 2's song data reader is Mega Man's, instruction for instruction and with the same RAM, so the two games read the same note and command format. It sits $100C lower: only its jump and call addresses, its command table, and the address of the note table differ.
Mega Man audio-processingMega Man 2 audio-processingchanged824Mega Man 2's per-frame channel update is Mega Man's, except that `_break_frame` and the end of `_pitch_envelope_common` address the next APU register as `SQ1_SWEEP` plus X, where Mega Man steps X with INX and writes `SQ1_VOL` plus X. The code sits $100A lower, so its jump and call addresses differ too.
Mega Man audio-sfx-readerMega Man 2 audio-sfx-readerrelocated327Mega Man 2's sound effect reader is Mega Man's, instruction for instruction and with the same RAM, moved $100C lower: only its jump and call addresses and the addresses in its command table differ.
Mega Man audio-tablesMega Man 2 audio-tableschanged219Mega Man 2's note length and pitch tables are Mega Man's but for one pitch: the period of the note the disassembly names `nEb1` drops from $059E to $0594, about 12 cents higher (computed). The region also ends with 3 bytes of $FF filler instead of 7.
Mega Man b0-menu-font-tilesMega Man 2 stage-common-tilesidentical96Mega Man 2's six menu border tiles, the end of its common stage tiles, are Mega Man's six menu tiles, byte for byte.
Mega Man b0-menu-font-tilesMega Man 2 ready-font-tileschanged80Mega Man 2's five READY letter tiles have Mega Man's letter shapes, row for row, but in each tile's second bit plane instead of its first, so the letters draw in color 2 of their palette where Mega Man's draw in color 1.
Mega Man bankswitchMega Man 2 bankswitchrewritten81Both games' bank switch routines map a PRG bank at $8000, but Mega Man 2's is new code for a different board: Mega Man writes the bank number once, to its own byte of a bank table (the disassembly's `uxrom_prg_bank`), and Mega Man 2 writes it to MMC1 one bit at a time, then runs any sound an NMI put off during the switch.
Mega Man create-explosionMega Man 2 create-explosionidentical60Mega Man 2's death explosion takes its twelve pieces' x and y speeds and facing flags from five 12-byte tables identical to Mega Man's explosion tables. The code around them is new: Mega Man's `_create_explosion_object` sets up one piece per call, and Mega Man 2's `_create_explosion` loops over all twelve.
Mega Man cutman-wily1-mapMega Man 2 metalman-mapidentical1,024The last 16 screens of Metal Man's map, $1C to $2B (1,024 bytes), are byte for byte the last 16 of Mega Man's Cut Man and Wily stage 1 map: Cut Man's screens $0C to $0F and Wily stage 1's $10 to $1B. Metal Man's screens $18 to $1B repeat four of them, Wily stage 1's $18 to $1B.
Mega Man joyMega Man 2 joyrelocated30Mega Man 2's `_joy` is Mega Man's, line for line; only the two button bytes it writes moved in zero page, from $14 and $18 to $23 and $27.
Mega Man nmi-waitMega Man 2 nmi-waitchanged129Mega Man 2's `_nmi_wait_0e` and `_nmi_wait_0d` keep the steps of Mega Man's `_nmi_wait`: save the last buttons, wait for the NMI, call `_joy`, and mark the newly pressed buttons. The two differ only in the bank they map at the end, and each first calls `_background_palette`. Mega Man 2 drops the path for buttons the game forces and moves the water frame into `_nmi_wait_water`.
Mega Man object-tilesMega Man 2 object-tiles-updatechanged26Mega Man 2's `_object_tiles_update` is the loop Mega Man enters at `_init_object_tiles`, which copies the tile buffer to CHR RAM, with its RAM at new addresses. Mega Man 2 drops the test in front of it and the `_object_tiles_update_yellow_devil` path, which writes two bytes at each of several PPU addresses, a row ($20) apart.
Mega Man scrollingMega Man 2 scrollingchanged246Mega Man 2's `_scrolling_vertical` follows Mega Man's `_scrolling_up_down`: the same name table and attribute address math and the same loop writing four 8x8 tiles per 16x16 quarter. Mega Man 2 computes the 32x32 block's address from the screen number, where Mega Man looks the screen up in a pointer table and checks `_special_blockset_collision` for a block the disassembly labels removed; some of its RAM moved too. The rest of each region is different code.
Mega Man stage-loopMega Man 2 stage-start-main-looprewritten273Both games' stage loops run a frame of play and wait for the NMI, but Mega Man 2's is new code: it calls its own routines in its own order, opens the menu on Start with no Select pause, and waits an extra frame now and then in water. Its region also starts the stage before the loop.
Mega Man title-tilesMega Man 2 opening-title-tilesidentical1,344Tiles 1 to 84 of Mega Man 2's title screen patterns (1,344 bytes) are byte for byte tiles 1 to 84 of Mega Man's.
Mega Man 2 airman-aiMega Man 3 doc-airidentical155Doc Robot's Air Man fight in Mega Man 3 uses Air Man's tornado tables from Mega Man 2 byte for byte (155 bytes): the five delays between rounds, then five patterns of six tornadoes each, with their Y and X speeds (whole and fraction) and how long each flies.
Mega Man 2 audio-controlMega Man 3 sound-driver-entryrewritten108Both games run their sound driver from the NMI, but Mega Man 3's is new code with a new layout. Mega Man 2 keeps the driver and its songs together in bank 12, queues up to 16 tracks, and works out a note's length as a table value times its channel's tempo byte. Mega Man 3 keeps the code in bank 22 and the data in bank 23, reading bank 24 for data addresses from $C000; it takes sound IDs from an eight-entry ring buffer in the fixed bank, and refuses a sound whose priority byte is lower than the one playing.
Mega Man 2 bankswitchMega Man 3 select-prg-banksrewritten37Both games flag a bank switch in progress and catch up on the frame's sound afterward if the NMI arrived during it, but Mega Man 3's switch is new code for a different board: Mega Man 2 maps one 16 KB bank at $8000 by writing its number to MMC1 one bit at a time, and Mega Man 3 writes two 8 KB banks, at $8000 and $A000, to the MMC3 as whole bytes.
Mega Man 2 divideMega Man 3 dividechanged103Mega Man 3's `divide_8bit` is Mega Man 2's `_divide_mod` with its zero-page operands one byte lower ($00-$03 for $01-$04). Its 16-bit division is Mega Man 2's `_divide_fraction` with its RAM moved and two changes: Mega Man 3 saves and restores X around the loop, and stores the low byte of each successful subtraction back in the remainder ($01), where Mega Man 2 writes it to $09, outside its shift chain.
Mega Man 2 enemy-collide-and-moveMega Man 3 gravity-moverrewritten132Both games move an object each frame by a speed with a fraction and change its Y speed by gravity, but Mega Man 3's movers are new code that Mega Man and the enemies share. Mega Man 2's enemy routine, left undecoded by its disassembly, checks the object's hits, moves it by its Y speed, subtracts gravity from that speed when a flag bit asks for it, moves it by its X speed in the way it faces, and removes it once it leaves the screen; walls and floors are a separate routine, and Mega Man moves with his own code. Mega Man 3's `move_vertical_gravity` and `move_right_collide` serve slot 0, the player, and every enemy alike, and run the tile check inside each move, snapping the object to the floor, ceiling, or wall it reaches.
Mega Man 2 find-objectsMega Man 3 enemy-spawn-checkchanged128Mega Man 3's `check_new_enemies` is the enemy half of Mega Man 2's `_find_objects`, instruction for instruction, with new RAM and table addresses: both take the screen's left and right edges, then on the side the screen moves toward spawn each placement that comes into range and on the other side move a second cursor past placements left behind. Mega Man 3 drops Mega Man 2's matching walk over a separate item list and the switch to the stage bank around it. The spawn routine each calls starts the same way, skipping a placement already in a slot and taking a free one, and then differs: Mega Man 2 fills the slot from per-type tables in its fixed bank, and Mega Man 3 skips a placement marked defeated and copies the type's properties from bank 0.
Mega Man 2 font-3Mega Man 3 chr-wily-background-bidentical160Mega Man 3's background CHR bank $66, mapped for Wily stage 6, holds 27 of the 31 non-blank tiles of Mega Man 2's third font set (the disassembly's `font_3.chr`), the longest aligned run 10 tiles (160 bytes).
Mega Man 2 heatman-wily1-sprite-tiles-l11Mega Man 3 chr-player-and-weapon-spritesidentical384Mega Man 3's sprite CHR banks $00-$01, mapped at sprite tiles $00-$7F throughout play, start from Mega Man 2's first 128 sprite tiles (the disassembly's `megaman_capsule_e_tank_bullet_mega_buster.chr`): 84 of the 127 non-blank tiles are the same at the same numbers, the longest run tiles $20-$37 (384 bytes).
Mega Man 2 heatman-wily1-sprite-tiles-l11Mega Man 3 chr-stage-spritesidentical336The first 32 tiles of 17 of Mega Man 3's sprite CHR banks ($08, $0A, $0C, $0F, $11, $13, $15, $1D, $20, $24, $26, $27, $2A, $2C, $2E, $32, and $3C) are Mega Man 2's sprite tiles $60-$7F, from the same set as Mega Man's own: 29 of the 32 are the same at the same numbers, the longest run tiles $0B-$1F (336 bytes).
Mega Man 2 joyMega Man 3 read-controllersrewritten88Both games strobe the controllers and merge each port's two data bits, but Mega Man 3's routine is new code. Mega Man 2's `_joy` reads one pad after the other and leaves the newly pressed buttons to the frame wait that calls it; Mega Man 3's `read_controllers` reads both pads in one loop, works out the new presses itself, and clears the d-pad when opposite directions are held together.
Mega Man 2 metalman-sprite-tiles-l199Mega Man 3 chr-doc-robot-spritesidentical144Mega Man 3's sprite CHR bank $22 holds 17 tiles of Mega Man 2's boss sets, 9 from Wood Man's and 8 from Heat Man's, and bank $21 holds 4 of Crash Man's; the longest run is 9 of Wood Man's tiles (144 bytes).
Mega Man 2 nmiMega Man 3 nmirewritten231Both games' NMI handlers copy the sprites by DMA, write the queued screen and palette updates, set the scroll, and run the sound driver, but Mega Man 3's handler is new code. Mega Man 2's offsets the scroll for the Mecha Dragon and puts the sound off when the NMI interrupts a bank switch; Mega Man 3's also loads the MMC3's scanline counter for the frame's split-screen interrupt and picks the interrupt handler for the screen mode.
Mega Man 2 nmi-waitMega Man 3 task-schedulerrewritten146Both games run a stage a frame at a time in step with the NMI, but Mega Man 3's frame loop is new code built on a task scheduler. Mega Man 2's stage loop calls its routines in turn and then spins in `_nmi_wait_0e` until the NMI sets a flag, reading the pads after it. Mega Man 3 runs up to four tasks, each resumed from its own saved stack pointer; `gameplay_frame_loop` gives up the CPU for a frame through the scheduler, which reads the controllers only when it resumes task 0.
Mega Man 2 opening-title-tilesMega Man 3 chr-title-backgroundidentical256Mega Man 3's title screen background tiles (CHR banks $76-$77) are largely Mega Man 2's title set (`title.chr`, loaded at `_load_title_chr`), moved a few tile numbers: 102 of their 128 non-blank tiles appear in it, 96 different ones, in runs of up to 16 tiles (256 bytes).
Mega Man 2 stage-selectMega Man 3 stage-select-inputrewritten298Both games' stage selects move a cursor over the bosses' portraits and start the chosen stage, but Mega Man 3's is new code. Mega Man 2's `_stage_select` blanks a beaten boss's portrait by writing empty tiles to the name table, and on a d-pad press calls `_stage_select_set` to move the cursor; Mega Man 3 keeps the cursor's column and row apart, moves each by a table offset and ignores a move off its 3 by 3 grid, redraws the six sprites of Mega Man's eyes in the center portrait for the cursor's position, and confirms on A as well as Start.
Mega Man 2 tsa-collisionMega Man 3 tile-check-verticalrewritten333Both games find the 32-pixel block at a point in the screen's layout and then its 16-pixel quarter, but Mega Man 3's tile check is new code with a new type format. Mega Man 2's `_tsa_collision` tests one point a call and takes its type from the quarter byte's top two bits, which a per-stage table remaps; Mega Man 3's `check_tile_collision` tests a list of points from a hitbox table in one call, clamps them to the screen, takes each type from the upper four bits of the tile's entry in a table at $BF00 in the stage bank, and ORs the types together.
Mega Man 2 wily-sprite-tiles-b8Mega Man 3 chr-screen-spritesidentical96Mega Man 3's sprite CHR bank $3C holds 13 of the 23 non-blank tiles of Mega Man 2's set of Dr. Wily bowing down (the disassembly's `dogeza.chr`), six of them in a run (96 bytes).
Mega Man 3 boss-door-closeMega Man 4 boss-door-animationchanged207Mega Man 4's first boss door routine follows Mega Man 3's `close_boss_door` step for step: the door sound, then four 16x16 blocks of tiles and attributes through the same buffer, one every 4 frames. Mega Man 4 runs it from the fixed bank, with the stage's bank mapped at $A000, and reads the door's addresses and tiles from fixed places in that bank ($B570-$B57B), where Mega Man 3 indexes tables in its door bank by the door's number.
Mega Man 3 boss-door-openMega Man 4 boss-door-animationchanged195Mega Man 4's second boss door routine follows Mega Man 3's `open_boss_door` the same way, with the same changes: it runs from the fixed bank and reads its door's data from $B57C-$B587 in the stage's bank.
Mega Man 3 chr-password-backgroundMega Man 4 chr-wily1-backgroundidentical416Mega Man 4 has Mega Man 3's 26 letter tiles, A to Z, byte for byte (416 bytes), in its bank 19 at $9800. Mega Man 3 has two copies, in its password screen tiles (after its digits 0 to 9) and in its stage start sprite tiles; Mega Man 4's digits before them differ.
Mega Man 3 chr-player-and-weapon-spritesMega Man 4 chr-common-spritesidentical912The first 57 sprite tiles ($00-$38) of the set Mega Man 4 shares across its stages (912 bytes) are byte for byte the first 57 tiles of Mega Man 3's sprite CHR banks $00-$01, the set it maps throughout play. Of the first 128 tiles, 96 are the same at the same numbers.
Mega Man 3 chr-title-backgroundMega Man 4 chr-menu-and-cossack-map-backgroundchanged2,048Mega Man 4's bank 20 holds, at $8800-$8FFF, Mega Man 3's 128 title screen background tiles (CHR banks $76-$77), the same in all but two: tiles $20 and $2F, which in Mega Man 4 are plain outlined squares.
Mega Man 3 collide-moversMega Man 4 entity-moverschanged248Mega Man 4's four routines that move an entity by its speed and stop it at a wall, floor, or ceiling follow Mega Man 3's `move_right_collide`, `move_left_collide`, `move_down_collide`, and `move_up_collide` step for step. Each saves the player's position before the move, checks for a platform, pushes the player off it, and on a push that crosses a screen retries with the opposite side's tile check. Two things changed. Each tile check is one call, where Mega Man 3 calls its tile check and then `update_collision_flags`. And when the right mover hits a solid tile, Mega Man 4 first copies $45 to $3F for the player, which its disassembly reads as the ground tile type. Two of the screen-crossing tests also test their two flags in the other order, to the same effect.
Mega Man 3 divideMega Man 4 entity-aimidentical103Mega Man 4's 8-bit and 16-bit division routines, used to aim enemies, are Mega Man 3's `divide_8bit` and its 16-bit version, byte for byte (103 bytes), at $FC14 in its fixed bank where Mega Man 3 has them at $FCEB.
Mega Man 3 drain-ppu-bufferMega Man 4 nametable-flush-ppu-controlidentical37Mega Man 4's name table buffer flush is Mega Man 3's `drain_ppu_buffer`, byte for byte (37 bytes). Mega Man 4 follows it with four short routines: two that change PPUCTRL and two that turn rendering off and on.
Mega Man 3 enemy-spawn-checkMega Man 4 spawn-enginerelocated128Mega Man 4's enemy spawn engine is Mega Man 3's `check_new_enemies` instruction for instruction, moved from bank 26 at $9C00 to bank 56 at $8000; only the addresses of the stage's placement tables and one zero-page variable ($2E in Mega Man 3, $2F in Mega Man 4) differ.
Mega Man 3 fill-nametableMega Man 4 fill-nametableidentical76Mega Man 4's routine that fills a name table and its attributes with one value is Mega Man 3's `fill_nametable`, byte for byte.
Mega Man 3 frequency-outputMega Man 4 frequency-outputidentical224Mega Man 4's code that writes each channel's pitch to the APU, with vibrato, detune, and slides, is Mega Man 3's, byte for byte at the same address.
Mega Man 3 music-parserMega Man 4 sfx-streamidentical321Mega Man 4's sound effect reader is Mega Man 3's (labeled `parse_music_data` there), byte for byte at the same address.
Mega Man 3 note-frequencyMega Man 4 note-frequencyidentical220Mega Man 4's note-to-pitch routines are Mega Man 3's, byte for byte at the same address.
Mega Man 3 plain-moversMega Man 4 plain-moverschanged258Mega Man 4's routines that move an entity by its speed without checking tiles, and apply gravity, follow Mega Man 3's with the entity arrays moved, and with four changes. Mega Man 4 drops Mega Man 3's routine that sets a behind-the-background flag from the tile hit. Its gravity tests one flag at $43 first, where Mega Man 3 tests for the player and then a flag at $B9. It drops Mega Man 3's exemption, for one animation ($13), from the cap on falling speed. And when gravity resets, it sets one speed ($FF00) for every entity, where Mega Man 3 sets $FFC0 for the player and $FFAB for the rest.
Mega Man 3 play-soundMega Man 4 play-soundidentical340Mega Man 4's routine that starts a song or an effect, and takes the stop, pause, fade, and transpose commands, is Mega Man 3's, byte for byte at the same address.
Mega Man 3 read-controllersMega Man 4 read-controllersidentical88Mega Man 4's controller read, which works out the new presses and cancels opposite directions, is Mega Man 3's `read_controllers`, byte for byte.
Mega Man 3 rendering-on-offMega Man 4 nametable-flush-ppu-controlrelocated40Mega Man 4's four routines after its name table buffer flush, two that reset or set bits of PPUCTRL and two that turn rendering off and on, are Mega Man 3's `disable_nmi`, `dead_code_enable_nmi`, `rendering_off`, and `rendering_on` instruction for instruction; only the zero-page counter the last two step differs ($EE in Mega Man 3, $EA in Mega Man 4).
Mega Man 3 sfx-channelMega Man 4 music-track-readeridentical587Mega Man 4's music track reader is Mega Man 3's (labeled `process_sfx_channel` there), byte for byte at the same address, so the two games read the same track format.
Mega Man 3 sound-driver-entryMega Man 4 sound-driver-entrychanged108Mega Man 4's sound bank opens with Mega Man 3's entry jumps, multiply, and sound-data read, at the same addresses; only the two bank numbers the read maps differ: the overflow data bank, $18 in Mega Man 3 and $1D in Mega Man 4, and the data bank it restores, $17 and $1F.
Mega Man 3 sound-driver-tablesMega Man 4 sound-driver-tableschanged299Mega Man 4's sound driver tables, through the note period table, are Mega Man 3's at the same addresses; the 37 bytes after it ($8A1B-$8A3F), all zero in Mega Man 3, hold data in Mega Man 4.
Mega Man 3 sound-driver-updateMega Man 4 sound-driver-updateidentical146Mega Man 4's per-frame sound tick is Mega Man 3's `sound_driver_update`, byte for byte at the same address.
Mega Man 3 sprite-offsets-defaultMega Man 4 anim-0c-player-sprite-dataidentical304304 bytes of Mega Man 3's default sprite position offsets, $A078-$A1A7 of its bank $19, are byte for byte in Mega Man 4's player animation bank $0C at $97BE-$98ED. They are position sets $08-$17 in both games' pointer tables: sixteen lists of signed Y and X offsets, one pair per tile, 4 to 12 tiles each.
Mega Man 3 task-schedulerMega Man 4 task-schedulerrelocated146Mega Man 4's cooperative task scheduler, with its routines to start, kill, and yield tasks, is Mega Man 3's `task_scheduler` instruction for instruction; it sits 5 bytes lower, and only its jump and call addresses differ.
Mega Man 3 volume-envelopeMega Man 4 volume-envelopeidentical379Mega Man 4's volume envelope and fade code is Mega Man 3's, byte for byte at the same address.
Mega Man 3 wall-snapMega Man 4 tile-alignmentrelocated102Mega Man 4's four routines that push an entity out of a wall, ceiling, or floor after a tile hit are Mega Man 3's `snap_x_to_wall_right`, `snap_x_to_wall_left`, `snap_y_to_ceil`, and `snap_y_to_floor` instruction for instruction; only the addresses of the entity position arrays differ. Mega Man 3 follows them with two calls into its boss door bank, which Mega Man 4 doesn't have there.
Mega Man 4 bank-switch-applyMega Man 5 bank-switchingidentical37Mega Man 5's routine that maps the two switchable PRG banks from their shadows, and then runs a sound request that arrived while it was busy, is Mega Man 4's, byte for byte (37 bytes). Mega Man 5 enters it through 6 new bytes that set both shadows from one bank number, the bank and the one after it.
Mega Man 4 bank24-tailMega Man 5 chr-bank-18identical83252 tiles of Mega Man 4's font in bank 36 ($BB00-$BE3F), which look like Japanese kana when drawn out, are byte for byte tiles in Mega Man 5's CHR at $30300-$3063F (832 bytes).
Mega Man 4 chr-menu-and-cossack-map-backgroundMega Man 5 chr-bank-18identical2,048Mega Man 5's CHR at $31800-$31FFF holds the 128 background tiles of Mega Man 4's bank 20 at $8800-$8FFF, byte for byte (2,048 bytes): the block Mega Man 4 took from Mega Man 3's title screen tiles, with Mega Man 4's two changed tiles.
Mega Man 4 chr-wily1-backgroundMega Man 5 chr-bank-19identical416Mega Man 5 has the 26 letter tiles, A to Z, that Mega Man 4 took from Mega Man 3, byte for byte (416 bytes), in its CHR at $32410.
Mega Man 4 distance-and-directionMega Man 5 distance-and-directionchanged181Mega Man 5's routines for an object's distance to the player on each axis, and the direction to him in 16 steps, are Mega Man 4's, with two changes. It adds two routines that measure the same two distances to another slot's object. And its direction routine starts by setting Y to 0, the player's slot, and falls into the copy of slot Y's position, where Mega Man 4 has a separate entry that copies the player's position and jumps on. The rest is byte for byte, except the address of the 48-byte direction table, which is the same in both and follows the code directly in Mega Man 5.
Mega Man 4 entity-aimMega Man 5 aim-and-divideidentical103Mega Man 5's 8-bit and 16-bit division routines are Mega Man 4's, which are Mega Man 3's, byte for byte (103 bytes), at $F207 in its fixed bank.
Mega Man 4 entity-moversMega Man 5 entity-moverschanged240Mega Man 5's routines that move an object right, left, down, or up and then check tiles, and for the player the platforms it stands on, follow Mega Man 4's with three changes besides addresses. The facing flag they set or clear is bit 5 of the object's flags, where Mega Man 4 uses bit 6. A right-wall hit no longer copies the player's ground tile type from $45 to $3F. And before a vertical move, Mega Man 5 saves the player's vertical screen in $03, where Mega Man 4 saves its horizontal screen.
Mega Man 4 fill-nametableMega Man 5 fill-and-clearidentical76Mega Man 5's routine that fills a name table and its attributes with one value is Mega Man 4's, byte for byte; Mega Man 5 follows it with routines that clear the sprite buffer and the object slots.
Mega Man 4 frequency-outputMega Man 5 frequency-outputidentical224Mega Man 5's code that writes each channel's pitch to the APU, with vibrato, detune, and slides, is Mega Man 4's, byte for byte at the same address.
Mega Man 4 music-track-readerMega Man 5 music-track-readeridentical587Mega Man 5's music track reader is Mega Man 4's, byte for byte at the same address.
Mega Man 4 nametable-flush-ppu-controlMega Man 5 nametable-flush-ppu-controlrelocated77Mega Man 5's name table buffer flush and the four PPU routines after it are Mega Man 4's instruction for instruction; only the zero-page counter the rendering switches step differs ($EA in Mega Man 4, $F0 in Mega Man 5).
Mega Man 4 note-frequencyMega Man 5 note-frequencyidentical220Mega Man 5's note-to-pitch routines is Mega Man 4's, byte for byte at the same address.
Mega Man 4 plain-moversMega Man 5 entity-collide-moverschanged345Mega Man 5's routines that move an object by its speed without checking tiles, and apply gravity, follow Mega Man 4's, with the gravity amount at $A1 instead of $99 and these changes. Eight bytes before the left mover clear the facing bit and fall into it. The player's gravity is skipped whenever a flag at $52 is set, where Mega Man 4 skips it only while a timer at $43 counts down. And Mega Man 5 adds four routines after them, one of which adds gravity to the vertical speed instead of subtracting it, capped at 7 pixels a frame.
Mega Man 4 platform-collisionMega Man 5 platform-collisionchanged288Mega Man 5's two checks for a platform object that the player meets moving vertically or horizontally, and their two distance helpers, follow Mega Man 4's test for test. Both walk the slots down from $17 and skip empty, off-screen, and non-solid ones. A one-way platform only catches a falling player, and the push is capped at 8 pixels. The changes: both checks also give up unless the moving object's own Y screen is 0. The horizontal check skips objects of type $02. The helper reads both of the shape's sizes from two tables through X, which it then sets to 0, the player's slot, where Mega Man 4 looks up the second size in the vertical check itself. The smaller box for a sliding player is chosen by `player_state` $02, where Mega Man 4 tests the player's sub-type for $10. And the horizontal distance helper no longer masks the screen difference to one bit. The four routines that push the player off a platform, which close Mega Man 4's region, sit after the position nudges in Mega Man 5.
Mega Man 4 play-soundMega Man 5 play-soundidentical340Mega Man 5's routine that starts a song or an effect, and takes the stop, pause, fade, and transpose commands, is Mega Man 4's, byte for byte at the same address.
Mega Man 4 queue-soundMega Man 5 queue-soundidentical27Mega Man 5's fixed-bank routine that adds a sound to the queue is Mega Man 4's, byte for byte (27 bytes), at $EC5B where Mega Man 4 has it at $F6BC.
Mega Man 4 read-controllersMega Man 5 read-controllerschanged94Mega Man 5's controller read is Mega Man 4's, byte for byte, with one addition: before it returns, it zeroes controller 2's new presses and held buttons ($15 and $17).
Mega Man 4 resetMega Man 5 resetidentical98Mega Man 5's reset begins with Mega Man 4's first 98 bytes, byte for byte at the same address ($FE00-$FE61): the interrupt, sound, and rendering shutdown, the wait through four vblanks, the PPU address precharge, the RAM clear, the sound queue's empty markers, and the PPU mask shadow. From the mapper setup on, the two differ.
Mega Man 4 sfx-streamMega Man 5 sfx-streamidentical321Mega Man 5's sound effect reader is Mega Man 4's, byte for byte at the same address.
Mega Man 4 sound-driver-entryMega Man 5 sound-driver-entrychanged108Mega Man 5's sound bank, bank $18, opens with Mega Man 4's entry jumps, multiply, and sound-data read at the same addresses; only the two bank numbers the read maps differ: the overflow data bank, $1D in Mega Man 4 and $1A in Mega Man 5, and the data bank it restores, $1F and $19.
Mega Man 4 sound-driver-tablesMega Man 5 sound-driver-tableschanged299Mega Man 5's sound driver tables, through the note period table, are Mega Man 4's at the same addresses. The 37 bytes after it ($8A1B-$8A3F), which hold data in Mega Man 4, are all zero in Mega Man 5, as in Mega Man 3.
Mega Man 4 sound-driver-updateMega Man 5 sound-driver-updateidentical146Mega Man 5's per-frame sound tick is Mega Man 4's, byte for byte at the same address.
Mega Man 4 spawn-engineMega Man 5 spawn-enginerelocated128Mega Man 5's spawn engine walks its stage's spawn list ahead of and behind the camera with Mega Man 4's code, instruction for instruction; only the addresses differ: the stage's placement tables, the two list cursors ($9E and $9F in Mega Man 4, $AD and $AE in Mega Man 5), the scroll direction flag ($2F, $AC), and the four window temporaries, two bytes higher.
Mega Man 4 spawn-entryMega Man 5 spawn-enemychanged173Mega Man 5's routine that spawns an enemy from a spawn list entry follows Mega Man 4's step for step: the same checks for a live copy and the no-respawn bitmap, and the same slot fill from the entry's position and the parameter tables for its code, with the tables and temporaries at other addresses. It changes two things: it keeps the spawn code in the object's $0510 byte, which Mega Man 4 clears, and it masks bit 7 off the flags parameter and, when that bit is clear, ends by calling `entity_facing_to_flags`.
Mega Man 4 task-schedulerMega Man 5 task-schedulerrelocated146Mega Man 5's cooperative task scheduler is Mega Man 4's instruction for instruction; it sits 6 bytes higher, and only its jump and call addresses differ.
Mega Man 4 tile-alignmentMega Man 5 position-nudgeschanged216Mega Man 5's four routines that push an object out of a wall, ceiling, or floor after a tile hit are Mega Man 4's, byte for byte but for one instruction: after a ceiling hit, Mega Man 5 clears the carry before adding where Mega Man 4 sets it, so the object ends one pixel higher than in Mega Man 4. Mega Man 5 follows them with four new routines that move an object along X or Y by the amount in $10 or $11 and compare its position with one saved in $02-$03.
Mega Man 4 volume-envelopeMega Man 5 volume-envelopeidentical379Mega Man 5's volume envelope and fade code is Mega Man 4's, byte for byte at the same address.
Mega Man 5 aim-and-divideMega Man 6 divide-16relocated65Mega Man 6's 16-bit division at $CC70 is Mega Man 5's `div16` at $F22D, except that it saves X in $08 instead of $09.
Mega Man 5 chr-bank-00Mega Man 6 tiles-bank-00identical176116 of the 157 non-blank sprite tiles in Mega Man 6's bank $00 at $8000-$89FF (115 distinct) appear in Mega Man 5's sprite CHR at $00000-$01FFF, rearranged: the longest stretch that matches tile for tile is 11 tiles (176 bytes), Mega Man 5's tiles $0A-$14 as Mega Man 6's $0B-$15.
Mega Man 5 chr-bank-18Mega Man 6 tiles-bank-10changed2,064Mega Man 6's bank $10 holds, at $8800-$900F, the 129 tiles of Mega Man 5's CHR at $31800-$3200F (2,064 bytes), the title screen block of claim mm4-mm5-title-tiles plus one tile, with one tile changed: the 33rd ($8A00), a hollow square in Mega Man 5 and a circled R in Mega Man 6.
Mega Man 5 chr-bank-19Mega Man 6 tiles-bank-11changed416Mega Man 6's bank $11 holds, at $82B0-$844F, Mega Man 5's 26 letter tiles, A to Z, from its CHR at $32410 (416 bytes), with the J redrawn: its hook reaches a pixel further left.
Mega Man 5 chr-bank-19Mega Man 6 tiles-bank-11identical160Mega Man 6's background bank $11 has 83 different tiles of Mega Man 5's background CHR at $32000-$33FFF. Besides the 26 letters (claim mm5-mm6-letter-tiles), the ten tiles right before them, at $8200-$829F, are byte for byte Mega Man 5's ten tiles at $32300 (160 bytes); the rest come in stretches of up to 10 tiles.
Mega Man 5 frequency-outputMega Man 6 frequency-outputchanged232Mega Man 6's period output is Mega Man 5's with one step added: after adding the channel's signed offset at $0714 to the period, a period of zero becomes 1. The added 8 bytes push the sound tables seven bytes higher, and the routine's table operands follow.
Mega Man 5 music-track-readerMega Man 6 music-track-readerrelocated587Mega Man 6's music track reader is Mega Man 5's, one byte lower ($8392 against $8393); only its call and jump targets, jump-table entries, and the addresses of the tables it reads differ.
Mega Man 5 note-frequencyMega Man 6 note-frequencyrelocated220Mega Man 6's note-to-period lookup is Mega Man 5's, one byte lower; the only differences are the two operands that address the period table, which sits seven bytes higher in Mega Man 6 ($8960 against $8959).
Mega Man 5 play-soundMega Man 6 play-soundchanged339Mega Man 6's sound command routine is Mega Man 5's with one change: where Mega Man 5 steps the sound's data pointer by incrementing $C1 and, on a carry, $C2 before copying it to $D0 and $D1, Mega Man 6 carries into X instead, so $C2 is left as it was, and the routine is a byte shorter. Code after it sits one byte lower, and its jumps, calls, and jump-table entries follow.
Mega Man 5 sfx-streamMega Man 6 sfx-streamrelocated321Mega Man 6's sound effect stream reader is Mega Man 5's, one byte lower ($8251 against $8252); only its call and jump targets and jump-table entries differ.
Mega Man 5 sound-data-bank1aMega Man 6 sound-data-bank36changed875Mega Man 6's sounds $23-$3C, the first 26 after its music, at $B758-$BAC2 of bank $36, are 22 of Mega Man 5's sounds from $1A to $3E plus four new ones ($2A-$2D). The 22 keep Mega Man 5's order, except that its $3E comes in as $2E. Seventeen are byte for byte. In the other five only addresses differ, each moved as far as the sound: one address inside each of four effects, and the four track pointers of $39, a sound with music's priority $00 (Mega Man 5's $30). Mega Man 6 leaves out 12 of Mega Man 5's $1A-$3A: $1F, $21, $23, $2B, $2F, $31-$34, and $36-$38. The Mega Man 5 disassembly's notes name two of the carried sounds, the ricochet ($1E, Mega Man 6's $27) and the hit ($2A, Mega Man 6's $35); the kill sound ($2B) is one of those left out.
Mega Man 5 sound-data-bank1aMega Man 6 sound-data-bank36identical79Mega Man 6's sound effects $61 and $62, at $BE99-$BEE7 of bank $36, are byte for byte Mega Man 5's $17 and $18, the first two effects after its music.
Mega Man 5 sound-data-bank1aMega Man 6 sound-data-bank36relocated116Mega Man 6's music $13, 116 bytes at $A19B-$A20E of bank $36, is Mega Man 5's music $11 moved. Only the four track pointers in its header differ, each $625 lower, as far as the song's start moved.
Mega Man 5 sound-directory-and-instrumentsMega Man 6 sound-directory-and-instrumentschanged568Mega Man 6's instrument table, 71 instruments of 8 bytes at $8B0F, has as many instruments as Mega Man 5's at $8ADB, but only 27 are the same under the same number. The longest such run is nine instruments, $3D-$45 (72 bytes). One more of Mega Man 6's is in Mega Man 5's table under another number.
Mega Man 5 sound-driver-entryMega Man 6 sound-driver-entrychanged108Mega Man 6's sound bank, bank $34, opens with Mega Man 5's entry jumps, multiply, and sound-data read at the same addresses; only the two bank numbers the read maps differ: the overflow data bank, $1A in Mega Man 5 and $36 in Mega Man 6, and the data bank it restores, $19 and $35.
Mega Man 5 sound-driver-tablesMega Man 6 sound-driver-tablesidentical292Mega Man 6's sound tables (note lengths, octave offsets, envelope steps, octave thresholds, and the period table) are Mega Man 5's byte for byte, seven bytes higher at $891C; the zero padding after them, up to the song directory at $8A40, is seven bytes shorter.
Mega Man 5 sound-driver-updateMega Man 6 sound-driver-updaterelocated146Mega Man 6's per-frame sound tick is Mega Man 5's at the same address; three call targets differ, because the stream readers they call sit one byte lower in Mega Man 6.
Mega Man 5 spawn-engineMega Man 6 stage-spawnerrewritten663Both games walk a stage's sorted spawn list with two cursors, one for each side of the screen, comparing the scroll position with each entry's screen and X position, but Mega Man 6's spawner is new code. Mega Man 5 reads fixed tables in the stage bank ($A9FF, $AA7F, $AB80), keeps its cursors in $AD and $AE, and treats codes from $C0 up as palette and CHR commands; Mega Man 6 reaches each stage's lists through pointers it sets in $74-$7F from tables in bank $3A, keeps its cursors in $0649 and $064A, and skips entries whose bit in $0650 marks them used.
Mega Man 5 vertical-section-transitionMega Man 6 vertical-section-transitionrewritten442Both games slide the screen to a new section when Mega Man leaves by the top or bottom, but Mega Man 6's is new code. Mega Man 5 tests the player's Y ($0378) against $08 and $E8 inside its per-frame scroll update, reads the section layout from the stage bank at $A950, and steps the slide 4 pixels a frame from there; Mega Man 6's transitions are separate routines that clear the object slots, reset the spawner, and run their own loop of 120 frames for a vertical move, drawing and waiting a frame each time.
Mega Man 5 volume-envelopeMega Man 6 volume-enveloperelocated379Mega Man 6's volume envelope code is Mega Man 5's, one byte lower; only its jump-table entries, call targets, and the address of the envelope step table, seven bytes higher, differ.

References

  1. ^Mega Man chooses which of six Robot Masters to fight from a menu, in any order; they are Cut Man, Guts Man, Ice Man, Bomb Man, Fire Man, and Elec Man.ManualMega Man NES manual · GameSpot, History of Mega Man
    How we know
    Player selects the character he chooses to challenge
    p. 9 (PDF 5), How to Play · archived copy ↗
    any one of six stages of your choice - Bomb Man, Fire Man, Ice Man, Guts Man, Elec Man, or Cut Man.
    1987, Mega Man (Rockman in Japan), Gameplay · archived copy ↗

    The quote matches our archived copy.

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

    In the claim ledger

  2. ^Each Robot Master Mega Man beats gives him a new weapon.ManualMega Man NES manual
    How we know
    acquires new firepower he will need
    p. 5 (PDF 3), Helpful Game-Playing Hints · archived copy ↗

    The quote matches our archived copy.

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

    In the claim ledger

  3. ^Mega Man 2 kept the free choice of boss and the weapon taken from each one, used against another boss's weakness.MagazineNintendo Power 219
    How we know
    Like its predecessor, Mega Man 2 … to exploit another boss's weakness
    p. 82, Playback: Mega Man 2 · archived copy ↗

    The quote matches our archived copy.

    In the claim ledger

  4. ^Retrospectives credit the free stage order and the stolen weapons with the series' long run.WebGameSpot, History of Mega Man · 1UP, Mega Man retrospective
    How we know
    the innovative idea of stealing the weapons of defeated bosses were what earmarked this series for longevity
    1987, Mega Man (Rockman in Japan), Gameplay · archived copy ↗
    Rockman allowed players to conquer levels in any order they wished.
    p. 1 · archived copy ↗

    The quote matches our archived copy.

    In the claim ledger

  5. ^Off ice, Mega Man never accelerates. Each frame his animation picks a speed from special_object_xcoord_speed_table, 0 standing, 0.125 px/frame on the first step, 1.375 running, 0.5 sliding to a stop, 0 landing, and 0.5625 when hit; any other animation, such as the jump, moves at 1.3125 with a direction held and 0 without.Codelsmmega/mm1revised
    How we know
    1_ice_tsa_move:
    2	LDY #$00
    3	LDA aobject_pointer
    4	LDX #$08
    ⋮
    6@loop:
    7	CMP @special_object_id_table, X
    8	BEQ @yes
    9	DEX
    10	BPL @loop
    11	LDA z:zjoy1_pressed
    12	AND #left_button | right_button
    13	BEQ @regular
    ⋮
    
    engine/ice_tsa.asm lines 1–22 at b606a84 · upstream ↗
    146@special_object_id_table:
    147	.BYTE $00
    148	.BYTE $03
    149	.BYTE $06
    150	.BYTE $0C
    151	.BYTE $0F
    152	.BYTE $12
    153	.BYTE $13
    154	.BYTE $14
    155	.BYTE $6E
    ⋮
    157@special_object_id_index_xcoord_speed_table:
    158	.BYTE $00
    ⋮
    
    engine/ice_tsa.asm lines 146–166 at b606a84 · upstream ↗
    1special_object_xcoord_speed_table:
    2;fraction, integer
    3	.BYTE $00 | $00
    4	.BYTE $00 | $20
    5	.BYTE $01 | $20
    6	.BYTE $00 | $80
    7	.BYTE $01 | $00
    8	.BYTE $04 | $00
    9	.BYTE $05 | $10
    10	.BYTE $01 | $50
    11	.BYTE $01 | $60
    12	.BYTE $00 | $90
    
    data/special_xcoord_speed_table.asm lines 1–12 at b606a84 · upstream ↗
    22_write_special_object_xcoord_speed_continue:
    23	LDA special_object_xcoord_speed_table, Y
    24	PHA
    25	AND #%11110000
    26	STA aobject_xcoord_speed_fraction, X
    27	PLA
    28	AND #%00001111
    29	STA aobject_xcoord_speed, X
    
    home/write_special_object_xcoord_speed.asm lines 22–29 at b606a84 · upstream ↗

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

    Revised after a check by a second AI model, 2026-10-21.

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

    In the claim ledger

  6. ^Mega Man's ordinary-floor movement differs from Mega Man 2's, measured in Mesen at the start of Bomb Man's stage and of Heat Man's. The first difference: holding Right from a standstill, Mega Man is still in his first step on the 8th frame, moving 0.125 px, where Mega Man 2 runs at 1.375. After it: a slide of 13 frames, not 8; two frames at the ground speed after a jump press, not one; a landing that runs only with a direction held on the landing frame, not the frame before; 0.125 px/frame on a fresh press in mid-air; −0.75 px/frame on the ground, not −0.25, so a walk-off and a ceiling hit fall faster; and a wall push that keeps the X fraction.Verifiedlsmmega/mm1 · lsmmega/mm2revised
    How we know
    203	CMP #$03
    204	BNE @skip
    205	LDA aobject_frameset_timer
    206	CMP #$22
    207	BNE @skip
    
    engine/run_megaman.asm lines 203–207 at b606a84 · upstream ↗
    125	LDA aobject_frameset_upper_timer
    126	CMP #$01
    
    engine/run_megaman.asm lines 125–129 at 94f0bf3 · upstream ↗
    89oam_frameset_0c:
    90	.BYTE 6 | (@end - @start - 1) << 4
    
    sprites/oam_frameset.asm lines 89–90 at b606a84 · upstream ↗
    258	LDA aobject_frameset_upper_timer
    259	CMP #$02
    260	BNE @nz
    261	LDA #$03
    262	STA z:zmegaman_status
    
    engine/run_megaman.asm lines 258–262 at 94f0bf3 · upstream ↗
    216@start_jump_up:
    217	LDA #$04
    218	STA aobject_ycoord_speed
    219	LDA #$DF
    220	STA aobject_ycoord_speed_fraction
    221	RTS
    ⋮
    223@jump_up:
    224	LDA #$09
    225	STA aobject_pointer
    
    engine/run_megaman.asm lines 216–227 at b606a84 · upstream ↗
    94_run_megaman_landing_common_1:
    95	LDA z:zjoy1_pressed_bits
    96	AND #a_button
    97	BEQ @not_pressed
    98	LDA z:zjump_speed_fraction
    99	STA aobject_ycoord_speed_fraction
    100	LDA z:zjump_speed
    101	STA aobject_ycoord_speed
    102	LDA #$06
    103	STA z:zmegaman_status
    
    engine/run_megaman.asm lines 94–103 at 94f0bf3 · upstream ↗
    163	LDA aobject_flag
    164	AND #%10000000
    165	BNE @running
    
    engine/run_megaman.asm lines 163–165 at b606a84 · upstream ↗
    230	LDX #$05
    231	LDA z:zjoy1_pressed_frame
    232	AND #left_button | right_button
    233	BNE @horizontal_jump_down
    234	LDX #$08
    ⋮
    236@horizontal_jump_down:
    237	STX z:zmegaman_status
    
    engine/run_megaman.asm lines 230–237 at 94f0bf3 · upstream ↗
    53	LDA z:zjoy1_pressed_frame
    54	AND #left_button | right_button
    55	BNE @change_first
    56	LDA #$03
    57	STA aobject_pointer
    58	LDA #$00
    59	STA aobject_frameset_timer
    
    engine/run_megaman.asm lines 53–59 at b606a84 · upstream ↗
    160_run_megaman_jumping:
    161	JSR _check_shoot_on_ladder
    162	LDA #$00
    163	STA aobject_xcoord_speed_fraction
    164	STA aobject_xcoord_speed
    165	LDA z:zjoy1_pressed
    166	AND #left_button | right_button
    167	BNE @horizontal_jumping
    
    engine/run_megaman.asm lines 160–167 at 94f0bf3 · upstream ↗
    80@done:
    81	LDA #$FF
    82	STA aobject_ycoord_speed, X
    83	LDA #$40
    84	STA aobject_ycoord_speed_fraction, X
    
    engine/objects_vertical.asm lines 80–84 at b606a84 · upstream ↗
    68@mainloop:
    69	LDA #$00
    70	STA aobject_ycoord_speed_fraction
    71	STA aobject_ycoord_speed
    ⋮
    77	STA aobject_ycoord_speed_fraction
    78	LDA aobject_ycoord_speed
    79	SBC z:zobject_ycoord_speed_accelerate
    80	STA aobject_ycoord_speed
    
    engine/check_object_vertical_move.asm lines 68–80 at 94f0bf3 · upstream ↗
    54	LDA z:zobject_in_process_xcoord_speed
    55	STA aobject_xcoord_fraction, X
    
    engine/objects_screen.asm lines 54–55 at b606a84 · upstream ↗
    39	JSR _check_horizontal_collision
    40	LDA z:z00
    41	BEQ @air_1
    42	LDA #$00
    43	STA aobject_xcoord_fraction
    
    engine/check_object_horizontal_move.asm lines 39–43 at 94f0bf3 · upstream ↗

    Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.

    The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-26.

    Revised after a check by a second AI model, 2026-10-26.

    In the claim ledger

  7. ^Mega Man 3's ordinary-floor movement differs from Mega Man 2's from the first frame of a walk: Right held from a standstill moves him 1.30 px, then nothing for 5 frames, then 1.30 px a frame, where Mega Man 2 moves 0.125 px a frame for 7 frames, then 1.375. A jump differs from its press frame, which lifts him 4.89 px where Mega Man 2 lifts him 0. Letting go of A mid-rise starts the fall at once, where Mega Man 2 cuts a rise of 2 px/frame or more to 1, and falls cap at 7 px/frame instead of 12. He keeps Mega Man 2's gravity, floor and ceiling corners, and 16 px tiles, and adds the slide.Codeplasticsmoke/megaman3-disassembly-ca65 · lsmmega/mm2revised
    How we know
    115player_ground_turning_anim:  lda     #$0D ; OAM $0D = turning animation
    116        jsr     reset_sprite_anim       ; set turning animation
    117        lda     shoot_anim_timer               ; check if shooting
    118        beq     player_ground_move_facing ; not shooting, move facing
    119        jsr     shoot_oam_advance_variant ; update shoot animation variant
    120player_ground_move_facing:  lda     player_facing ; move in facing direction
    121        jmp     player_ground_move_horizontal ; move in facing direction
    
    src/fixed/player_ground.asm lines 115–121 at 58ca1c3 · upstream ↗
    642prelude_reset_walk_speed:  lda     #$4C ; reset walk speed to $01.4C
    643        sta     ent_xvel_sub            ; store walk sub-pixel speed
    644        lda     #$01                    ; walk speed whole = $01
    645        sta     ent_xvel                ; store walk whole speed
    
    src/fixed/game_loop.asm lines 642–645 at 58ca1c3 · upstream ↗
    208	LDA z:zjoy1_pressed
    209	AND #a_button
    210	BNE @skip
    211	LDA aobject_ycoord_speed
    212	BMI @skip
    213	CMP #$01
    214	BCC @skip
    215	BEQ @skip
    216	LDA #$01
    217	STA aobject_ycoord_speed
    218	LDA #$00
    219	STA aobject_ycoord_speed_fraction
    
    engine/run_megaman.asm lines 208–219 at 94f0bf3 · upstream ↗
    71player_ground_normal_jump:  lda     joy2_held ; P2 held buttons
    72        and     #$01                    ; bit 0 = Right held?
    73        bne     player_ground_super_jump ; yes → debug super jump
    74        lda     #$E5                    ; normal jump: Y vel = $04.E5
    75        sta     ent_yvel_sub,x          ; store Y velocity sub-pixel
    76        lda     #$04                    ; Y velocity whole = $04
    77        sta     ent_yvel,x              ; store Y velocity whole
    78        jmp     player_airborne         ; enter airborne state
    
    src/fixed/player_ground.asm lines 71–78 at 58ca1c3 · upstream ↗
    260player_airborne:  lda     ent_yvel      ; check Y velocity sign
    261        bmi     player_airborne_variable_jump ; negative (falling) → skip to clear flag
    262        lda     force_full_jump         ; check force-full-jump flag
    263        bne     player_airborne_wall_check ; nonzero → skip variable jump
    264        lda     joy1_held               ; check if A button held
    265        and     #BTN_A                  ; A button mask
    266        bne     player_airborne_variable_jump ; held → keep rising (variable jump)
    267        jsr     reset_gravity           ; A released → clamp Y speed to 0 (variable jump)
    
    src/fixed/player_ground.asm lines 260–267 at 58ca1c3 · upstream ↗
    393apply_gravity_player_check:  lda     ent_yvel_sub,x ; Y sub velocity -= gravity
    394        sec                             ; prepare for subtraction
    395        sbc     gravity                 ; subtract gravity value
    396        sta     ent_yvel_sub,x          ; store new Y sub velocity
    397        lda     ent_yvel,x              ; Y velocity -= borrow
    398        sbc     #$00                    ; propagate borrow to whole byte
    399        sta     ent_yvel,x              ; store new Y velocity
    400        bpl     apply_gravity_exit      ; still positive (rising)? done
    401        cmp     #$F9                    ; check against terminal velocity $F9
    402        bcs     apply_gravity_exit      ; within limit (-7 to -1)? done
    
    src/fixed/movement.asm lines 393–402 at 58ca1c3 · upstream ↗
    84	JSR _megaman_status_parameter
    85	JSR _check_object_horizontal_move
    86	JSR _check_object_vertical_move
    87	LDA z:z00
    88	BNE _run_megaman_landing_common_1
    
    engine/run_megaman.asm lines 84–88 at 94f0bf3 · upstream ↗
    81	BPL @skip
    82	CMP #$F4
    83	BCS @skip
    84	LDA #$00
    85	STA aobject_ycoord_speed_fraction
    86	LDA #$F4
    87	STA aobject_ycoord_speed
    
    engine/check_object_vertical_move.asm lines 81–87 at 94f0bf3 · upstream ↗

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

    Revised after a check by a second AI model, 2026-10-26.

    In the claim ledger

  8. ^Mega Man 4's movement on ordinary floor differs from Mega Man 3's in five numbers. The first is the jump's take-off speed: 5 px/frame ($05.$00) against Mega Man 3's 4.89 ($04.$E5). The second is the speed on the ground and after a landing: -1 px/frame ($FF.$00) against -0.25 ($FF.$C0). Third, a release cuts a rise to 0, where Mega Man 3 sets the same -0.25. Fourth, the slide timer starts at 26 ($1A) against 20 ($14), so the slide moves on 26 frames against 21 (slide-line, mega-man-3/slide). Fifth, Mega Man 4 tests for the jump out of a slide on every slide frame, where Mega Man 3 skips the test while the timer is 12 ($0C) or more, so the earliest jump out comes on the 3rd frame against the 9th.Codeplasticsmoke/megaman4-disassembly-ca65 · plasticsmoke/megaman3-disassembly-ca65revised
    How we know
    186    LDA #$00                            ; zero sub-velocity
    187    STA ent_yvel_sub                    ; Y velocity sub = 0
    188    LDA #$05                            ; jump speed 5 px/frame
    189    STA ent_yvel                        ; Y velocity = +5 (up)
    
    src/bank3C.asm lines 186–189 at a63bb6e · upstream ↗
    74        lda     #$E5                    ; normal jump: Y vel = $04.E5
    75        sta     ent_yvel_sub,x          ; store Y velocity sub-pixel
    76        lda     #$04                    ; Y velocity whole = $04
    77        sta     ent_yvel,x              ; store Y velocity whole
    
    src/fixed/player_ground.asm lines 74–77 at 58ca1c3 · upstream ↗
    648L_F324:
    649    LDA #$00                    ; zero
    650    STA ent_yvel_sub,X          ; clear vert velocity sub-pixel
    651    LDA #$FF                    ; $FF = stopped / minimal
    652    STA ent_yvel,X              ; set vert velocity pixel
    
    src/fixed/fixed_entity_physics.asm lines 648–652 at a63bb6e · upstream ↗
    203gravity_snap_floor:  jsr     snap_y_to_floor ; snap to tile boundary (down)
    204gravity_reset_vel:  jsr     reset_gravity ; reset velocity to rest value
    
    src/fixed/movement.asm lines 203–204 at 58ca1c3 · upstream ↗
    424reset_gravity_player:  lda     #$C0     ; player rest vel sub = $C0
    425        sta     ent_yvel_sub,x          ; store Y sub velocity
    426        lda     #$FF                    ; player rest vel = $FF ($FFC0 = -0.25)
    427        sta     ent_yvel,x              ; store Y velocity whole byte
    428        rts                             ; player rest vel = $FFC0
    
    src/fixed/movement.asm lines 424–428 at 58ca1c3 · upstream ↗
    425    LDA joy1_held                       ; held buttons
    426    AND #$80                            ; A still held?
    427    BNE L_8338                          ; held: full jump
    428    LDA #$00                            ; zero
    429    STA ent_yvel_sub                    ; cut jump: Y vel sub = 0
    430    STA ent_yvel                        ; cut jump: Y vel = 0
    
    src/bank3C.asm lines 425–430 at a63bb6e · upstream ↗
    264        lda     joy1_held               ; check if A button held
    265        and     #BTN_A                  ; A button mask
    266        bne     player_airborne_variable_jump ; held → keep rising (variable jump)
    267        jsr     reset_gravity           ; A released → clamp Y speed to 0 (variable jump)
    
    src/fixed/player_ground.asm lines 264–267 at 58ca1c3 · upstream ↗
    217    LDA #$1A                            ; slide duration 26 frames
    218    STA $34                             ; set slide timer
    
    src/bank3C.asm lines 217–218 at a63bb6e · upstream ↗
    288        lda     #$14                    ; slide timer = 20 frames
    289        sta     $33                     ; store slide timer
    
    src/fixed/player_states.asm lines 288–289 at 58ca1c3 · upstream ↗
    473L_8368:
    474    LDA joy1_press                      ; newly pressed
    475    AND #$80                            ; A button?
    476    BEQ L_839D                          ; no jump: steering
    477    LDA joy1_held                       ; held buttons
    478    AND #$04                            ; Down held?
    
    src/bank3C.asm lines 473–478 at a63bb6e · upstream ↗
    349        dec     $33                     ; decrement timer
    350        lda     $33                     ; check slide timer phase
    351        cmp     #$0C                    ; >= $0C? (uncancellable phase)
    352        bcs     slide_continue_moving   ; yes → uncancellable, keep sliding
    353        lda     joy1_press              ; A button pressed? (cancellable phase)
    354        and     #BTN_A                  ; check A button
    355        bne     slide_end_ground_check  ; yes → cancel into slide jump
    
    src/fixed/player_states.asm lines 349–355 at 58ca1c3 · upstream ↗

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

    Revised after a check by a second AI model, 2026-10-26.

    In the claim ledger

  9. ^Mega Man 5's ordinary-floor movement differs from Mega Man 4's, though the walk, the step pose, the jump, gravity, the fall cap, air control, and the slide's speed, length, and start are the same. The first difference on flat ground: on a slide's last frame Mega Man 5 raises his center the 2 px the slide lowered it and sets −0.25 px/frame, where Mega Man 4 leaves it 2 px low at −1 px/frame, so for that frame Mega Man 5 stands 2 px higher, and each of its slides adds $40 to his Y fraction. Against blocks, Mega Man 5's ceiling points are 10 px above his center (Mega Man 4's 9) and his wall points 9 px above it (Mega Man 4's 8); its slide's wall points are 5 px above and 9 px below the slide's center (Mega Man 4's level and 9 below), and its slide's ceiling points 8 px above it (Mega Man 4's level with it).Codeplasticsmoke/megaman5-disassembly-ca65 · plasticsmoke/megaman4-disassembly-ca65revised
    How we know
    ldy $AF lda $0378 sec sbc ynudge_tbl,y sta $0378
    src/bank1B.asm#L424-L428 · upstream ↗
    525L_83D3:
    
    src/bank3C.asm lines 525–539 at a63bb6e · upstream ↗
    648L_F324:
    ⋮
    653L_F32E:
    
    src/fixed/fixed_entity_physics.asm lines 648–654 at a63bb6e · upstream ↗
    2039ynudge_tbl:
    ⋮
    2042slide_yvel_sub:
    ⋮
    2044slide_yvel_px:
    
    src/bank1B.asm lines 2039–2045 at 7fd6512 · upstream ↗
    1428    .byte $F9,$07,$07
    1429    .byte $01,$F7
    1430    .byte $F9,$0E,$00
    
    src/fixed/fixed_tile_collision.asm lines 1426–1430 at a63bb6e · upstream ↗
    1700    .byte $F8
    1701    .byte $08
    
    src/fixed/fixed_tile_collision.asm lines 1699–1702 at a63bb6e · upstream ↗
    1301    .byte $1E,$23,$27
    1302    .byte $2A
    
    src/fixed/fixed_tile_collision.asm lines 1301–1304 at a63bb6e · upstream ↗
    1439    .byte $0E,$0E,$02
    1440    .byte $00
    ⋮
    1442    .byte $0E,$0E,$02
    
    src/fixed/fixed_tile_collision.asm lines 1439–1442 at a63bb6e · upstream ↗
    1592    .byte $88
    1593    .byte $8D,$92,$92
    
    src/fixed/fixed_tile_collision.asm lines 1592–1595 at a63bb6e · upstream ↗
    1711    .byte $05,$01
    ⋮
    1713    .byte $00
    1714    .byte $09,$01
    
    src/fixed/fixed_tile_collision.asm lines 1711–1714 at a63bb6e · upstream ↗
    .byte $F9,$07,$07,$01,$F6,$F9,$0E,$02,$F2,$F2,$0E,$0E,$02,$0C,$F2,$0E .byte $0E,$02,$0A,$F2,$0E,$0E,$02,$F8,$F2,$0E,$0E
    src/fixed_bank.asm#L1259-L1260 · upstream ↗
    .byte $F7,$09,$0B .byte $05,$0B,$01,$0F,$FB,$0E
    src/fixed_bank.asm#L1279-L1280 · upstream ↗

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

    Revised after a check by a second AI model, 2026-10-26.

    In the claim ledger

  10. ^Mega Man 6's ordinary-floor movement isn't Mega Man 5's: the first difference is a jump's take-off. Mega Man 6 sets his vertical speed to $FA.$CC, 5.20 px/frame up; Mega Man 5 sets its whole byte $03F0 to $05 and its fraction $03D8 to $00, 5 px/frame (jump-speed). Letting go of A sets only the whole byte to 0 in Mega Man 6 and both bytes in Mega Man 5 (release-cut), and Mega Man 5 tests for headroom before a slide where Mega Man 6 doesn't (jump-under-ceiling). The two run different code: Mega Man 5's player is a state machine dispatched each frame from $30, Mega Man 6's a coroutine of loops (coroutine-scheduler).Coderefreshing-lemonade/megaman6-disassembly · plasticsmoke/megaman5-disassembly-ca65revised
    How we know
    105loc_700D7:
    ⋮
    112loc_700E5:
    ⋮
    115loc_700EA:
    116code_3880EA:
    
    bank38_3F.asm lines 105–118 at f0763c4 · upstream ↗
    L80A4: lda $AF bne L80B5 lda #$00 sta $03D8 lda #$05 sta $03F0
    src/bank1B.asm#L122-L128 · upstream ↗
    lda $03D8,x clc adc #$10 sta $03D8,x lda $03F0,x adc #$00 sta $03F0,x
    src/bank0A.asm#L612-L618 · upstream ↗
    LDA $40 AND #$80 BNE loc_70143 LDA $05C8 BPL loc_70143 … LDA #$00 STA $05C8
    bank38_3F.asm#L146-L162 · upstream ↗
    L8259: lda $03F0 bmi L8283 L825E: lda $16 and #$80 bne L8283 lda #$00 sta $03D8 sta $03F0
    src/bank1B.asm#L335-L343 · upstream ↗
    L80D9: lda $08 lsr a clc adc #$08 tay jsr probe_vert lda L0010 and #$10 bne L814A
    src/bank1B.asm#L149-L157 · upstream ↗
    L8025: ldx #$00 stx $37 ldy $30 lda player_state_lo,y sta L0000 lda player_state_hi,y sta $01 jmp (L0000)
    src/bank1B.asm#L77-L84 · upstream ↗

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

    Revised after a check by a second AI model, 2026-10-26.

    In the claim ledger

  11. ^A press of A without Down ends Mega Man 6's slide but doesn't jump: the slide hands over to the standing loop, which looks for a jump only in a later frame's fresh press ($9A). In Mega Man 5 the same press jumps out of the slide when there is headroom. Measured in Mesen from power-on, at the start of Tomahawk Man's stage, an A press on a slide's 8th frame with Down let go ended the slide that frame, and A held for the next 6 frames left him on the floor.Verifiedrefreshing-lemonade/megaman6-disassembly · plasticsmoke/megaman5-disassembly-ca65revised
    How we know
    382loc_702E3:
    
    bank38_3F.asm lines 382–395 at f0763c4 · upstream ↗
    423loc_70332:
    ⋮
    435loc_7034B:
    
    bank38_3F.asm lines 423–436 at f0763c4 · upstream ↗
    30loc_7004F:
    
    bank38_3F.asm lines 27–33 at f0763c4 · upstream ↗
    20043code_3FE41C:
    
    bank38_3F.asm lines 20043–20051 at f0763c4 · upstream ↗
    lda $14 and #$80 beq L82C8 lda $16 and #$04 bne L82C8 … jmp L80A4
    src/bank1B.asm#L377-L393 · upstream ↗

    Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.

    The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.

    Revised after a check by a second AI model, 2026-10-25.

    In the claim ledger

Sources

Code

Primary

Secondary