data/claims/mega-man.yamlMega Man (lsmmega/mm1)
Game: Mega Man.
A fresh A press on the ground sets Mega Man's upward speed to $04.$DF, 4.87 px/frame. mega-man/jump-speed
Value: 1247 1/256 px/frame
Codemm1: Mega Man disassembly (lsmmega/mm1) ·engine/run_megaman.asm#L157-L162 — the landed branch, after the frame's fall test found the floor@bottom:
LDA aobject_ycoord
STA z:zlast_ycoord
LDA z:zjoy1_pressed_bits
AND #a_button
BNE @start_jump_upmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L216-L221@start_jump_up:
LDA #$04
STA aobject_ycoord_speed
LDA #$DF
STA aobject_ycoord_speed_fraction
RTSChecked by claude, 2026-10-21 — read _run_megaman_on_stage at the pinned commit, from the A test on the landed branch to @start_jump_up1247/256 = 4.87109375 px/frame.
Cited by: Mega Man
Each airborne frame takes $40/256 = 0.25 px/frame off Mega Man's upward speed, and a fall is capped at 12 px/frame ($F4). mega-man/gravity
Value: 64 1/256 px/frame²
Codemm1: Mega Man disassembly (lsmmega/mm1) ·engine/objects_vertical.asm#L96-L110@is_megaman_2:
LDA aobject_ycoord_speed_fraction, X
SBC #$40
STA aobject_ycoord_speed_fraction, X
LDA aobject_ycoord_speed, X
SBC #$00
BPL @normal_ycoord_speed
CMP #$F4
BCS @normal_ycoord_speed
LDA #$00
STA aobject_ycoord_speed_fraction, X
LDA #$F4
…Checked by claude, 2026-10-21 — read _objects_vertical_moving at the pinned commit: the gravity step runs on the branch that found no floor or ceiling (@is_background), for Mega Man's slotCited by: Mega Man
On every rising frame with A not held, Mega Man's upward speed, if its whole part is 2 or more, drops to exactly 1 px/frame; the test follows the frame's vertical move. mega-man/release-cap
About: Mega Man Variable jump height
Value: 256 1/256 px/frame
Codemm1: Mega Man disassembly (lsmmega/mm1) ·engine/run_megaman.asm#L88-L109LDA aobject_ycoord_speed
BMI @start_landing
JSR _objects_vertical_moving
BCS @hit_wall_up
LDA z:zjoy1_pressed
AND #a_button
BEQ @start_jump_down
…
@start_jump_down:
LDA aobject_ycoord_speed
BMI @jumping_down
CMP #$01
…Checked by claude, 2026-10-21 — read _run_megaman_on_stage at the pinned commitCited by: Mega Man
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. mega-man/state-speeds
Value
{
"standing": 0,
"step": 32,
"running": 352,
"jumping": 336,
"slide": 128,
"landing": 0,
"hit": 144
}engine/ice_tsa.asm#L1-L22_ice_tsa_move:
LDY #$00
LDA aobject_pointer
LDX #$08
…
@loop:
CMP @special_object_id_table, X
BEQ @yes
DEX
BPL @loop
LDA z:zjoy1_pressed
AND #left_button | right_button
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/ice_tsa.asm#L146-L166@special_object_id_table:
.BYTE $00
.BYTE $03
.BYTE $06
.BYTE $0C
.BYTE $0F
.BYTE $12
.BYTE $13
.BYTE $14
.BYTE $6E
…
@special_object_id_index_xcoord_speed_table:
…mm1: Mega Man disassembly (lsmmega/mm1) · data/special_xcoord_speed_table.asm#L1-L12special_object_xcoord_speed_table:
;fraction, integer
.BYTE $00 | $00
.BYTE $00 | $20
.BYTE $01 | $20
.BYTE $00 | $80
.BYTE $01 | $00
.BYTE $04 | $00
.BYTE $05 | $10
.BYTE $01 | $50
.BYTE $01 | $60
.BYTE $00 | $90mm1: Mega Man disassembly (lsmmega/mm1) · home/write_special_object_xcoord_speed.asm#L22-L29 — each byte packs the fraction in its high nibble and the whole pixels in its low one_write_special_object_xcoord_speed_continue:
LDA special_object_xcoord_speed_table, Y
PHA
AND #%11110000
STA aobject_xcoord_speed_fraction, X
PLA
AND #%00001111
STA aobject_xcoord_speed, XChecked by claude, 2026-10-26 — read _ice_tsa_move, both lookup tables, the speed table, and the routine that unpacks it at the pinned commit. Animation pointers: $00 standing, $03 first step, $06 running, $0C slide to a stop, $0F landing (run_megaman.asm L175-L187), $12 hit (handle_special_megaman_objects.asm L60-L64), $09 jumping (run_megaman.asm L223-L225)Ice keeps a second speed that carries over and decays (zice_xcoord_speed, L23-L71); it isn't covered here.
Cited by: Mega Man, Mega Man (classic series)
A hit sets zmegaman_invincibility_time to 111 ($6F); while it is nonzero no contact damages Mega Man, and the stage loop counts it down by 1 on each pass that runs the enemies. mega-man/i-frames
About: Mega Man Invincibility frames
Value: 111 frames
Codemm1: Mega Man disassembly (lsmmega/mm1) ·engine/check_megaman_damaged.asm#L123-L131@not_death:
LDA z:z0D
AND #objects_right
EOR #objects_right
ORA #$03
STA aobject_flag
LDA #$6F
STA z:zmegaman_invincibility_time
RTSmm1: Mega Man disassembly (lsmmega/mm1) · engine/check_megaman_damaged.asm#L18-L19LDA z:zmegaman_invincibility_time
BNE @cant_damagemm1: Mega Man disassembly (lsmmega/mm1) · engine/stage_loop.asm#L41-L52LDA aobject_flag
AND #%00001111
CMP #can_collide_map
BEQ @can_collide_map
JSR _run_weapons_trajectory
JSR _run_bosses_ai
LDA z:zmegaman_invincibility_time
BEQ @no_invincibility
DEC z:zmegaman_invincibility_time
…
@no_invincibility:
JSR _check_megaman_damagedChecked by claude, 2026-10-21 — read _check_megaman_damaged (its first test, and the hit branch) and _stage_loop_unpause at the pinned commitThe loop skips the countdown when Mega Man's flag nibble equals can_collide_map (L41-L44); the atlas hasn't traced when that happens, so the count is in loop passes, not measured frames.
Cited by: Mega Man
A hit faces Mega Man against the enemy's facing and puts him in the hit animation ($12), which sets his upward speed to 1.25 px/frame ($01.$40) once and pushes him backward, against his own facing, at 0.5625 px/frame ($90) under the usual gravity until the animation ends. mega-man/knockback
Value
{
"up": 320,
"back": 144
}engine/check_megaman_damaged.asm#L124-L128 — faces him against the enemy's facing, and sets handler 3 in the flag's low nibbleLDA z:z0D
AND #objects_right
EOR #objects_right
ORA #$03
STA aobject_flagmm1: Mega Man disassembly (lsmmega/mm1) · engine/handle_special_megaman_objects.asm#L1-L64_handle_megaman_heavily_objects:
ASL
TAX
LDY megaman_heavily_objects_and_ycoord_speed_table - 2, X
LDA megaman_heavily_objects_and_ycoord_speed_table - 1, X
…
JSR _handle_special_megaman_objects
LDA aobject_frameset_timer
BEQ _handle_megaman_heavily_objects_unforced
JSR _ice_tsa_move
LDA z:zentire_toward
…
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/ice_tsa.asm#L151-L163 — animation $12 picks speed row 9, `$00 | $90`.BYTE $12
…
.BYTE $09mm1: Mega Man disassembly (lsmmega/mm1) · data/special_xcoord_speed_table.asm#L12.BYTE $00 | $90Checked by claude, 2026-10-21 — read _check_megaman_damaged's hit branch, _handle_megaman_heavily_objects with its table and _handle_special_megaman_objects (which stores the pointer and the speed only when the pointer changes, L67-L70 and on), and _ice_tsa_move's lookup at the pinned commitThe push runs while aobject_frameset_timer is nonzero, so its length is the hit animation's; the atlas hasn't read or measured that length.
Cited by: Mega Man
Mega Man 2 keeps Mega Man's jump and running numbers. Both take off at $04.$DF, subtract $40 of gravity a frame, cap a fall at $F4, cut a rise of 2 px/frame or more to 1 when A is up, and move at 0.125, 1.375, and 1.3125 px/frame stepping, running, and in the air. mega-man/keeps-into-mm2
engine/run_megaman.asm#L216-L221@start_jump_up:
LDA #$04
STA aobject_ycoord_speed
LDA #$DFmm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_vertical.asm#L97-L103LDA aobject_ycoord_speed_fraction, X
SBC #$40
…
CMP #$F4mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L100-L107@start_jump_down:
LDA aobject_ycoord_speed
BMI @jumping_down
CMP #$01
BCC @jumping_down
BEQ @jumping_down
LDA #$01
STA aobject_ycoord_speedmm1: Mega Man disassembly (lsmmega/mm1) · data/special_xcoord_speed_table.asm#L4-L11.BYTE $00 | $20
…
.BYTE $01 | $50
.BYTE $01 | $60mm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/check_object_horizontal_move.asm#L175-L185tsa_ycoord_speed_accelerate_fraction_table:
.BYTE $40, $1E
…
tsa_regular_water_jump_speed_table:
.BYTE $04, $05
…
tsa_regular_water_jump_speed_fraction_table:
.BYTE $DF, $80mm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/check_object_vertical_move.asm#L81-L82BPL @skip
CMP #$F4mm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/run_megaman.asm#L208-L217LDA z:zjoy1_pressed
AND #a_button
BNE @skip
LDA aobject_ycoord_speed
BMI @skip
CMP #$01
BCC @skip
BEQ @skip
LDA #$01
STA aobject_ycoord_speedmm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/turn_megaman.asm#L222-L243megaman_status_xcoord_speed_table:
…
megaman_status_xcoord_speed_fraction_table:
.BYTE $00
.BYTE $00
.BYTE $90
.BYTE $00
.BYTE $20
.BYTE $60
.BYTE $50
.BYTE $80Checked by claude, 2026-10-21 — read both games' jump start, gravity step, fall cap, release test, and speed tables at their pinned commits. Mega Man 2 moves the constants into tables indexed by water and by state (mega-man-2/jump-speed, mega-man-2/gravity, mega-man-2/state-speeds); the values match Mega Man's literals and table rowsMega Man 2 adds a water column (jump $05.$80, gravity $1E) that Mega Man doesn't have.
Cited by: Mega Man, Mega Man 2
Mega Man 2 keeps Mega Man's hit numbers too, 111 frames of invincibility ($6F) and a knockback of 1.25 px/frame up and 0.5625 back. mega-man/hit-into-mm2
engine/check_megaman_damaged.asm#L129-L130LDA #$6F
STA z:zmegaman_invincibility_timemm1: Mega Man disassembly (lsmmega/mm1) · engine/handle_special_megaman_objects.asm#L64.BYTE $12, $01 | $40mm1: Mega Man disassembly (lsmmega/mm1) · data/special_xcoord_speed_table.asm#L12.BYTE $00 | $90mm2: Mega Man 2 disassembly (lsmmega/mm2) · home/megaman_hit.asm#L11-L20LDA #$6F
STA z:zmegaman_invincibility_time
LDA #$01
STA aobject_ycoord_speed
LDA #$40
STA aobject_ycoord_speed_fraction
LDA #$00
STA aobject_xcoord_speed
LDA #$90
STA aobject_xcoord_speed_fractionChecked by claude, 2026-10-21 — read Mega Man's hit branch, hit table, and speed row, and Mega Man 2's _megaman_hit, at their pinned commitsCited by: Mega Man, Mega Man 2
_objects_vertical_moving first moves Mega Man by his 8.8 fixed-point vertical speed, positive up (his Y, which runs down the screen, subtracts it), and then, on a frame that meets no floor or ceiling, takes gravity off the speed. mega-man/motion-order
engine/objects_vertical.asm#L131-L138_objects_run_ycoord:
SEC
LDA aobject_ycoord_fraction, X
SBC aobject_ycoord_speed_fraction, X
STA z:zobject_in_process_ycoord_speed
LDA aobject_ycoord, X
SBC aobject_ycoord_speed, X
STA z:zobject_in_process_ycoordmm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_vertical.asm#L96-L118 — the moved position is stored after the speed loses its gravity, so the move used the old speed@is_megaman_2:
LDA aobject_ycoord_speed_fraction, X
SBC #$40
…
@not_temporary_2:
LDA z:zobject_in_process_ycoord
STA aobject_ycoord, X
LDA z:zobject_in_process_ycoord_speed
STA aobject_ycoord_fraction, X
CLC
RTSChecked by claude, 2026-10-26 — read _objects_vertical_moving and _objects_run_ycoord at the pinned commitMega Man's fall is capped at 12 px/frame ($F4). mega-man/max-fall
Value: -12 px/frame
Codemm1: Mega Man disassembly (lsmmega/mm1) ·engine/objects_vertical.asm#L100-L110LDA aobject_ycoord_speed, X
SBC #$00
BPL @normal_ycoord_speed
CMP #$F4
BCS @normal_ycoord_speed
LDA #$00
STA aobject_ycoord_speed_fraction, X
LDA #$F4
…
STA aobject_ycoord_speed, XChecked by claude, 2026-10-26 — read the gravity step of _objects_vertical_moving at the pinned commitMega Man's position is his center; the floor and ceiling are tested at x − 7 and x + 7, 12 px below or above it, and walls at x + 8 or x − 8, toward his facing, at 12 px and 4 px above and 11 px below it. Every animation he has on foot or in the air uses these offsets. mega-man/terrain-box
Value
{
"floor": {
"x": [
-7,
7
],
"y": 12
},
"ceiling": {
"x": [
-7,
7
],
"y": -12
},
"wall": {
"x": 8,
"y": [
-12,
-4,
11
]
}
}engine/objects_vertical.asm#L26-L45 — a rise tests z10 px above his center, a fall (@jump, L65-L67) z10 px below it@is_megaman_1:
LDY aobject_pointer, X
…
@not_enemies:
LDA non_enemies_collision_ycoord, Y
…
STA z:z10
LDA aobject_ycoord_speed, X
BMI @jump
LDA z:z10
EOR #%11111111
CLC
…mm1: Mega Man disassembly (lsmmega/mm1) · home/tsa_blockset.asm#L116-L143_check_object_xcoord_collision_with_background:
…
LDX #$03
…
@loop:
CLC
LDA z:z00
ADC @collision_xcoord, X
…
@collision_xcoord:
.BYTE +0, +7, -1, -7 ;right, left, each 2 bytesmm1: Mega Man disassembly (lsmmega/mm1) · home/tsa_blockset.asm#L1-L24_check_object_ycoord_collision_with_background:
…
LDX #$02
…
@loop:
CLC
LDA z:z03
ADC @collision_ycoord, X
…
@collision_ycoord:
.BYTE -12, -4, +11 ;top, middle, bottommm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_toward.asm#L44-L66@can_collide:
LDY aobject_pointer, X
…
@not_enemies:
LDA non_enemies_collision_xcoord, Y
…
STA z:z10
CLC
LDA z:zobject_in_process_xcoord
ADC z:z10
…
JSR _check_object_ycoord_collision_with_backgroundmm1: Mega Man disassembly (lsmmega/mm1) · home/object_collision_coord.asm#L1-L2non_enemies_collision_xcoord:
.BYTE 8mm1: Mega Man disassembly (lsmmega/mm1) · home/object_collision_coord.asm#L211-L212non_enemies_collision_ycoord:
.BYTE 12Checked by claude, 2026-10-26 — read _objects_vertical_moving, _objects_rightward and _objects_leftward, both background tests with their offset tables, and the two per-animation tables at the pinned commit; entries $00 to $14 of the tables (every animation of Mega Man's from standing to the hit) are all 8 and all 12The tables are indexed by the animation, but every one of Mega Man's has the same entries, so his box never changes shape.
_check_special_blockset_or_tsa_collision turns a test point into a tile: X / 32 and Y / 32 pick a 32 px block of the screen's map, bit 4 of Y and of X pick one of its four 16 px tiles, and the tile's top two bits give its kind through a per-stage table: background, block, and two of ladder, spike, ice, and water. mega-man/tile-lookup
Value: 16 px
Codemm1: Mega Man disassembly (lsmmega/mm1) ·home/tsa_blockset.asm#L216-L265@find_tsa_blockset:
…
LDA z:z0D
LSR
LSR
AND #%00111000
STA z:z07
LDA z:z0E
ROL
ROL
ROL
ROL
…mm1: Mega Man disassembly (lsmmega/mm1) · home/tsa_blockset.asm#L288-L290@tsa_block_type_index:
;tsa block type index
.BYTE background, block, ladder, spike ;cutmanChecked by claude, 2026-10-26 — read _check_special_blockset_or_tsa_collision and its per-stage kind table at the pinned commitEach frame on foot or in the air, _run_megaman_on_stage moves Mega Man horizontally first, testing for a wall, then vertically, testing the floor under a fall or the ceiling over a rise, and only then checks for a jump or lands, runs, slides, or stands, so a frame's floor test uses that frame's new X. The one change made before the move is a Left or Right pressed fresh, which sets the first step's animation (ground-states). mega-man/collision-order
engine/run_megaman.asm#L67-L96@not_change_direction:
JSR _ice_tsa_move
LDA z:zentire_toward
AND #objects_right
BEQ @left
JSR _objects_rightward
…
@continue_1:
JSR _objects_screen_moving
JSR _check_tsa_collision
…
@not_used:
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_screen.asm#L48-L55 — the moved X is stored before the vertical move, whose tests read aobject_xcoord (objects_vertical.asm L126-L127)_objects_screen_moving_done:
LDX z:zobject_ram_index
LDA z:zobject_in_process_screen
STA aobject_screen, X
LDA z:zobject_in_process_xcoord
STA aobject_xcoord, X
LDA z:zobject_in_process_xcoord_speed
STA aobject_xcoord_fraction, XChecked by claude, 2026-10-26 — read _run_megaman_on_stage, _objects_screen_moving, and _objects_vertical_moving at the pinned commitEvery frame that finds a floor under him sets Mega Man's vertical speed to $FF.$40, −0.75 px/frame, with no gravity after it, so each grounded frame's vertical move takes him 0.75 px down and tests x − 7 and x + 7 on the row under his feet; ground there puts him back on it with the Y fraction zeroed, and none starts a fall. mega-man/ground-check
About: Mega Man Coyote time
Value: -192 1/256 px/frame
Verifiedmm1: Mega Man disassembly (lsmmega/mm1) ·engine/objects_vertical.asm#L65-L86@jump:
LDA z:z10
JSR @check_collision_with_coord
BEQ @is_background
…
LDA z:z03
AND #%11110000
SEC
SBC z:z10
STA aobject_ycoord, X
LDA #$00
STA aobject_ycoord_fraction, X
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L87-L89@not_used:
LDA aobject_ycoord_speed
BMI @start_landingChecked by claude, 2026-10-26 — read _objects_vertical_moving and _run_megaman_on_stage at the pinned commit; in the probe (Bomb Man's stage start, Mesen) the vertical speed after every standing, walking, running, and sliding frame is $FF.$40 and the Y fraction 0Probe: probes/jump-physics/movement.mjsMega Man 2 keeps −0.25 px/frame on the ground instead (mega-man-2/ground-check).
When a falling Mega Man's floor points find a block, _objects_vertical_moving sets his Y to the top of that 16 px tile less 12, which puts his feet on it, zeroes the Y fraction, and sets the speed to −0.75 px/frame (ground-check); so a fall of up to 12 px a frame always ends on the top of the tile it meets. mega-man/floor-snap
engine/objects_vertical.asm#L65-L78@jump:
LDA z:z10
JSR @check_collision_with_coord
BEQ @is_background
LDX z:zobject_ram_index
CMP #$20
BEQ @done
LDA z:z03
AND #%11110000
SEC
SBC z:z10
STA aobject_ycoord, X
…Checked by claude, 2026-10-26 — read _objects_vertical_moving at the pinned commit; z03 is the moved Y plus 12 (L120-L123). In the probe's Mesen run from power-on, the walk-off at the start of Cut Man's stage moves the floor point 1 px into the lower floor's tile and lands at Y 180, 32 px down, with Y + 12 on a 16 px row, the fraction 0, and the speed $FF.$40Probe: probes/lab/mega-man-stage.mjsMega Man first counts as airborne on the frame whose move takes both floor points off the ledge; that frame still moves him at the ground animation's speed, drops him 0.75 px, and leaves him falling at 1 px/frame in the jumping animation, so his feet are 0, 1, 3, 4, 6, 8, and 10 px below the ledge on the walk-off frame and the six after. mega-man/walk-off
About: Mega Man Coyote time
Value
{
"drop": 192,
"v": -256,
"heights": [
0,
-1,
-3,
-4,
-6,
-8,
-10,
-13,
-15,
-18,
-22,
-25,
-29
]
}engine/run_megaman.asm#L114-L125@start_landing:
JSR _no_damage_collision
PHA
JSR _objects_vertical_moving
BCS @hit_wall_down
PLA
BEQ @no_objects_collided
…
@no_objects_collided:
JMP @jump_upmm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_vertical.asm#L96-L110@is_megaman_2:
LDA aobject_ycoord_speed_fraction, X
SBC #$40
STA aobject_ycoord_speed_fraction, X
LDA aobject_ycoord_speed, X
SBC #$00mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L223-L227@jump_up:
LDA #$09
STA aobject_pointer
LDA #$00
STA aobject_frameset_timerChecked by claude, 2026-10-26 — read _run_megaman_on_stage and _objects_vertical_moving at the pinned commit: the ground speed $FF.$40 moves him 0.75 px down, and with no floor gravity takes it to $FF.$00. Ran the probe, which walks left off the ledge at the start of Cut Man's stage (its first column X 128) in Mesen: x + 7 leaves the ledge on frame 14, which moves −352 subpixels, drops 0.75 px, and leaves the speed at $FF.$00, and the feet fall the 13 heights of the value before landing 32 px down; the lab's model on a stage with the same ledge matches every frameProbe: probes/lab/mega-man-stage.mjsMega Man 2 drops 0.25 px and falls at 0.5 px/frame from the next (mega-man-2/walk-off).
Mega Man gets no grace window after leaving a ledge; _run_megaman_on_stage reads a fresh A press only on the branch where the frame's fall test found ground, either the map's floor or an object he stands on (_no_damage_collision). mega-man/no-coyote-time
About: Mega Man Coyote time
Verifiedmm1: Mega Man disassembly (lsmmega/mm1) ·engine/run_megaman.asm#L114-L125@start_landing:
JSR _no_damage_collision
PHA
JSR _objects_vertical_moving
BCS @hit_wall_down
PLA
BEQ @no_objects_collided
…
@no_objects_collided:
JMP @jump_upmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L157-L162@bottom:
LDA aobject_ycoord
STA z:zlast_ycoord
LDA z:zjoy1_pressed_bits
AND #a_button
BNE @start_jump_upChecked by claude, 2026-10-26 — read every path through _run_megaman_on_stage at the pinned commit; only @bottom, after a floor, reads `zjoy1_pressed_bits` for A, and @start_landing reaches it only through a map floor (carry from _objects_vertical_moving) or a nonzero `_no_damage_collision` (L114-L122). In the probe's Mesen run from power-on, A pressed on the walk-off frame at the start of Cut Man's stage, or two frames after it, leaves the fall exactly as it is without a pressProbe: probes/lab/mega-man-stage.mjsWhen the horizontal move puts the wall point ahead in a solid tile, _objects_rightward or _objects_leftward puts x + 8 on that tile's first column moving right, or x − 8 on the first column past it moving left, and keeps the X fraction of the move; his speed and animation are untouched, so he runs in place. mega-man/wall-stop
engine/objects_toward.asm#L66-L77JSR _check_object_ycoord_collision_with_background
BEQ @is_background
LDA z:z00
AND #%11110000
LDX z:zobject_ram_index
SEC
SBC z:z10
STA z:zobject_in_process_xcoord
LDA z:z01
SBC #$00
STA z:zobject_in_process_screenmm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_toward.asm#L147-L162JSR _check_object_ycoord_collision_with_background
BEQ @is_background
CLC
LDX z:zobject_ram_index
LDY aobject_pointer, X
LDA z:z10
ADC #$10
STA z:z0F
LDA z:z00
AND #%11110000
CLC
ADC z:z0F
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_screen.asm#L54-L55 — the fraction stored is the move's (objects_toward.asm L5-L8); the push changes only the whole pixelLDA z:zobject_in_process_xcoord_speed
STA aobject_xcoord_fraction, XChecked by claude, 2026-10-26 — read _objects_rightward, _objects_leftward, and _objects_screen_moving at the pinned commit; in the probe's Mesen run from power-on, running right at the start of Cut Man's stage into a wall whose first column is X 160 leaves x + 8 on 160 on every pushed frame, with the X fraction of that frame's move (152.875, 152.25, 152.625, ...), the speed 352, and the running animation; a 16 px block added on the floor in Bomb Man's stage (probes/lab/mega-man-ceiling.mjs, tunnel16) stops him the same wayProbe: probes/lab/mega-man-stage.mjsMega Man 2 zeroes the X fraction on the push (mega-man-2/wall-stop).
When a rising Mega Man's move puts a ceiling point, x − 7 or x + 7 at 12 px above his center, in a block, _objects_vertical_moving puts that point on the first row under the block's 16 px tile, zeroes the Y fraction, and sets his speed to −0.75 px/frame, the speed a landing gets; _run_megaman_on_stage then returns before the release test and before setting the jumping animation, and he falls from the next frame. Measured in Mesen at the start of Bomb Man's stage, under 16 px blocks that the probe adds to the stage's collision. mega-man/ceiling-hit
Value: -192 1/256 px/frame
Verifiedmm1: Mega Man disassembly (lsmmega/mm1) ·engine/objects_vertical.asm#L41-L63LDA z:z10
EOR #%11111111
CLC
ADC #$01
JSR @check_collision_with_coord
BEQ @is_background
LDX z:zobject_ram_index
CMP #$20
BEQ @done
LDA z:z03
AND #%11110000
CLC
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L88-L98LDA aobject_ycoord_speed
BMI @start_landing
JSR _objects_vertical_moving
BCS @hit_wall_up
…
@hit_wall_up:
JMP @skipChecked by claude, 2026-10-26 — read _objects_vertical_moving's rising branch and _run_megaman_on_stage at the pinned commit; @skip is the routine's RTS (L229-L230). The probe, a Mesen run from power-on, adds 16 px blocks to the collision over Mega Man at the start of Bomb Man's stage (8, 24, and 40 px over his head; over x − 7 alone, x + 7 alone, or both; after a release; and at a corner during a running jump) in Mesen, and every hit leaves Y − 12 on the row under the block, the Y fraction 0, and the speed $FF.$40, and falls 0.75 px the next frame; the lab's model matches every frameProbe: probes/lab/mega-man-ceiling.mjsMega Man 2 leaves −0.25 px/frame after the hit (mega-man-2/ceiling-hit). On 16 px tiles the hit can't come on the first frame of a rise from the floor, which would leave the ground animation set, since standing, his top is 8 px into a tile row and the first rise is 4.87 px.
No grounded frame tests the ceiling, since Mega Man's vertical speed on the ground is −0.75 px/frame (ground-check) and the vertical move tests only the floor at a negative speed; the jump press then sets the jump speed without testing the ceiling, so a press under a block still starts the jump, and the rise meets the block on a later frame. Measured in Mesen at the start of Bomb Man's stage, under a 16 px block the probe adds to the stage's collision. mega-man/jump-under-ceiling
engine/objects_vertical.asm#L39-L40LDA aobject_ycoord_speed, X
BMI @jumpmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L216-L221@start_jump_up:
LDA #$04
STA aobject_ycoord_speed
LDA #$DF
STA aobject_ycoord_speed_fraction
RTSChecked by claude, 2026-10-26 — read _objects_vertical_moving and _run_megaman_on_stage at the pinned commit; in the probe's Mesen run from power-on, under a block the probe adds to the collision 8 px over his head at the start of Bomb Man's stage, a standing press and a press while running both set the speed $04.$DF on the press frame and meet the block two frames later (ceiling-hit)Probe: probes/lab/mega-man-ceiling.mjsMega Man's animation is his state. A Left or Right pressed fresh, with neither held the frame before, starts the first step ($03) with its timer at 0, on the ground or in the air; each frame on the ground after the move, a held direction turns the step into the run ($06) once its timer reads $22, and lands a jump running; a direction let go turns a run into the slide to a stop ($0C, timer 1) and anything else into standing; with no direction this frame or the last, a jump lands into the landing animation ($0F, timer 1), and the slide and the landing end in standing when their timer wraps to 0. mega-man/ground-states
engine/run_megaman.asm#L50-L65LDA z:zjoy1_pressed
AND #left_button | right_button
BEQ @not_change_direction
LDA z:zjoy1_pressed_frame
AND #left_button | right_button
BNE @change_first
LDA #$03
STA aobject_pointer
LDA #$00
STA aobject_frameset_timer
STA aobject_timer
…
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L163-L214LDA aobject_flag
AND #%10000000
BNE @running
LDA z:zjoy1_pressed_frame
AND #left_button | right_button
BNE @released
LDA aobject_pointer
CMP #$09
BNE @not_jump
…
LDA #$0F
BNE @continue_3
…mm1: Mega Man disassembly (lsmmega/mm1) · home/nmi_wait.asm#L1-L5 — `zjoy1_pressed_frame` is the previous frame's held buttons; the stage loop clears the flag's bit 7 each frame (run_megaman.asm L4-L6), so it marks a direction held this frame_nmi_wait:
LDA z:zwater_delay
BNE @yes
LDA z:zjoy1_pressed
STA z:zjoy1_pressed_frameChecked by claude, 2026-10-26 — read _megaman_on_stage and _run_megaman_on_stage at the pinned commit; the probe's traces (Bomb Man's stage start, Mesen) step through animations $00, $03, $06, $0C, and $00, and $09, $0F, and $00 after a landing with nothing heldProbe: probes/jump-physics/movement.mjsMega Man 2 keeps the same six states as numbered states with their own routines and changes the step and the slide at fixed animation frames (mega-man-2/ground-states).
After Mega Man's frame, _object_frameset_timer advances his animation's timer from the frameset's first byte: the low nibble counts up to the byte's low nibble, then the high nibble moves to the next animation frame or wraps to 0 after the last. The first step shows 3 frames for 3 frames each; the press frame sets its timer to 0 and the ground check reads it before that frame's advance, so the check first finds $22 on the step's 9th frame; the slide shows 2 frames for 7 each (8 in the shooting pose), and the landing 2 frames for 2 each. mega-man/animation-timer
Value
{
"standing": [
8,
10
],
"step": [
2,
2
],
"running": [
6,
3
],
"jumping": [
0,
0
],
"slide": [
6,
1
],
"landing": [
1,
1
],
"slideShooting": [
7,
1
]
}home/sprites.asm#L292-L324_object_frameset_timer:
LDY #$00
LDA (z00), Y
PHA
AND #%00001111
STA z:z0F
PLA
AND #%11110000
STA z:z11
LDA aobject_frameset_timer, X
AND #%00001111
CMP z:z0F
…mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L1-L7;oam sprites changed per frame(s) | (@start length - 1) << 4, oam frameset
oam_frameset_00:
.BYTE 8 | (@end - @start - 1) << 4
…
.BYTE $01, $01, $01, $01, $01, $01, $01, $01
.BYTE $01, $01, $00mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L26-L30oam_frameset_03:
.BYTE 2 | (@end - @start - 1) << 4
…
.BYTE $01, $02, $02mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L47-L51oam_frameset_06:
.BYTE 6 | (@end - @start - 1) << 4
…
.BYTE $03, $05, $04, $05mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L68-L72oam_frameset_09:
.BYTE 0 | (@end - @start - 1) << 4
…
.BYTE $06mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L89-L97oam_frameset_0c:
.BYTE 6 | (@end - @start - 1) << 4
…
.BYTE $05, $02
…
oam_frameset_0d:
.BYTE 7 | (@end - @start - 1) << 4mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L110-L114oam_frameset_0f:
.BYTE 1 | (@end - @start - 1) << 4
…
.BYTE $04, $03mm1: Mega Man disassembly (lsmmega/mm1) · engine/stage_loop.asm#L29-L58_stage_loop_unpause:
JSR _special_blockset_index
JSR _megaman_on_stage
…
@can_collide_map:
JSR _find_enemies
JSR _spritesChecked by claude, 2026-10-26 — read _object_frameset_timer, the call in _sprites that picks the frameset from aobject_pointer plus the pose in aobject_timer's high nibble (home/sprites.asm L49-L68), Mega Man's framesets $00-$10 (the shooting framesets $01, $04, $07, $0A, and $10 have the same first bytes as their plain ones; the slide's, $0D, has 7), and the stage loop's order, at the pinned commitThe run's and the standing animation's timers decide nothing about movement; the model keeps them only to step the same bytes as the game.
Measured from a standstill at the start of Bomb Man's stage, Mega Man's first step lasts 9 frames at 0.125 px/frame, and a released run slides 13 frames at 0.5 px/frame, 6.5 px in all, before he stands; a jump landed with nothing held shows the landing animation for 3 frames. mega-man/ground-measured
Value
{
"stepFrames": 9,
"slideFrames": 13,
"slide": 128,
"landingFrames": 3
}engine/run_megaman.asm#L199-L214@running:
LDA aobject_pointer
CMP #$09
BEQ @run_with_jump
CMP #$03
BNE @skip
LDA aobject_frameset_timer
CMP #$22
BNE @skipmm1: Mega Man disassembly (lsmmega/mm1) · home/sprites.asm#L292-L324_object_frameset_timer:
…
LDA aobject_frameset_timer, X
AND #%00001111
CMP z:z0F
BCS @next
INC aobject_frameset_timer, XChecked by claude, 2026-10-26 — read the step's and the slide's ends and the animation timer at the pinned commit (animation-timer); ran the probe from power-on in Mesen: holding Right from a standstill moves 32 subpixels on frames 1-9 and 352 from frame 10, and letting go after a run moves 352 on the release frame and 128 on each of the 13 afterProbe: probes/jump-physics/movement.mjsMega Man 2's first step lasts 7 frames and its slide 8 (mega-man-2/ground-measured).
Cited by: Mega Man
A buster shot sets aobject_timer to $1F, which shows Mega Man's shooting animations for 15 frames, counting the press frame; their framesets time the slide to a stop at 8 frames per animation frame instead of 7, so a shot fired shortly before or during the slide lengthens it. A Left or Right pressed fresh clears the pose. mega-man/shot-pose
Value: 15 frames
Codemm1: Mega Man disassembly (lsmmega/mm1) ·engine/weapons.asm#L633-L652_use_mega_buster:
LDX #$02
…
@loop:
LDA aobject_ycoord, X
CMP #$F8
BEQ @hidden
INX
CPX #$05
BNE @loop
BEQ @done
…
…mm1: Mega Man disassembly (lsmmega/mm1) · home/sprites.asm#L49-L55LDA aobject_timer, X
LSR
LSR
LSR
LSR
CLC
ADC aobject_pointer, Xmm1: Mega Man disassembly (lsmmega/mm1) · home/sprites.asm#L103-L114LDA aobject_timer, X
BEQ @timer_is_not_set
AND #%00001111
TAY
DEY
BEQ @is_zero
DEC aobject_timer, X
BNE @timer_is_not_zero
…
@is_zero:
LDA #0
STA aobject_timer, Xmm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L96-L97oam_frameset_0d:
.BYTE 7 | (@end - @start - 1) << 4mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L56-L60LDA #$03
STA aobject_pointer
LDA #$00
STA aobject_frameset_timer
STA aobject_timerChecked by claude, 2026-10-26 — read _use_mega_buster, the pose's countdown and frameset choice in _sprites, and the slide's framesets at the pinned commit; the frameset is picked before the countdown, so the values $1F down to $11 each pick the shooting frameset, 15 frames. The lab's conformance run (probes/lab/conformance.mjs mega-man, Bomb Man's stage start in Mesen: a shot on the release frame, and one 5 frames into the slide) matches the model, which follows this claim, frame for frameThe buster fires only while one of the three shot slots (objects 2-4) is free; the pose comes only with a shot.
Each frame _change_direction faces Mega Man toward a held Left or Right before his speed is looked up and he moves, so he reverses at full speed with no skid; a reversal from one held direction to the other isn't a fresh press, so a run stays a run. mega-man/turn-instant
engine/change_direction.asm#L1-L10_change_direction:
LDA aobject_flag
AND #~objects_right
STA aobject_flag
LDA z:zjoy1_pressed
AND #right_button
LSR
ORA aobject_flag
STA aobject_flag
RTSmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L62-L72@change_first:
JSR _change_direction
ORA #%10000000
STA aobject_flag
…
@not_change_direction:
JSR _ice_tsa_move
LDA z:zentire_toward
AND #objects_right
BEQ @left
JSR _objects_rightwardChecked by claude, 2026-10-26 — read _change_direction and _run_megaman_on_stage at the pinned commit (off ice, `zentire_toward` is the facing: ice_tsa.asm L272-L275 and L324-L326); in the probe (Bomb Man's stage start, Mesen), Left pressed during a run to the right moves him −352 subpixels on that very frame and keeps animation $06Probe: probes/jump-physics/movement.mjsA jump press returns before the animation changes, and the jumping animation is set only after the next frame's move, so the press frame and the one after both move at the ground animation's speed (two frames of 1.375 px/frame from a run, of 0.125 from a first step, and none from standing still); from the third frame the air speed applies. mega-man/takeoff-x
engine/run_megaman.asm#L216-L227@start_jump_up:
LDA #$04
STA aobject_ycoord_speed
LDA #$DF
STA aobject_ycoord_speed_fraction
RTS
…
@jump_up:
LDA #$09
STA aobject_pointer
LDA #$00
STA aobject_frameset_timermm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L87-L95@not_used:
LDA aobject_ycoord_speed
BMI @start_landing
JSR _objects_vertical_moving
BCS @hit_wall_up
LDA z:zjoy1_pressed
AND #a_button
BEQ @start_jump_down
JMP @jump_upChecked by claude, 2026-10-26 — read _run_megaman_on_stage at the pinned commit; in the probe (Bomb Man's stage start, Mesen) a running jump moves 352 subpixels on the press frame and the next, then 336, and Right and A pressed together from standing move 32 on both (the first step's), then 336Probe: probes/jump-physics/movement.mjsMega Man 2 changes state on the press frame, so only that frame moves at the ground speed (mega-man-2/takeoff-x).
In the air the jumping animation isn't in the speed lookup's table, so each frame sets Mega Man's speed to 1.3125 px/frame ($01.$50) toward a held Left or Right and to 0 with neither; a direction pressed fresh in the air first sets the first step's animation, so that one frame moves 0.125 px/frame. mega-man/air-speed
About: Mega Man Air control
Value: 336 1/256 px/frame
Verifiedmm1: Mega Man disassembly (lsmmega/mm1) ·engine/ice_tsa.asm#L1-L14_ice_tsa_move:
LDY #$00
LDA aobject_pointer
LDX #$08
…
@loop:
CMP @special_object_id_table, X
BEQ @yes
DEX
BPL @loop
LDA z:zjoy1_pressed
AND #left_button | right_button
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L53-L59LDA z:zjoy1_pressed_frame
AND #left_button | right_button
BNE @change_first
LDA #$03
STA aobject_pointer
LDA #$00
STA aobject_frameset_timerChecked by claude, 2026-10-26 — read _ice_tsa_move and _run_megaman_on_stage at the pinned commit (row 7 of the speed table is $01.$50, state-speeds); in the probe (Bomb Man's stage start, Mesen) a jump with Right pressed fresh in mid-air moves 32 subpixels on the press frame and 336 after, and none with the d-pad let goProbe: probes/jump-physics/movement.mjsMega Man 2 has no fresh-press frame in the air (mega-man-2/air-speed).
Mega Man lands running, at 1.375 px/frame from the next frame with no first step, only if Left or Right is held on the landing frame itself; with the direction let go on that frame he lands standing, and with nothing held then or the frame before he lands into the landing animation, which moves no faster than standing. A direction pressed fresh on the landing frame starts the first step. mega-man/landing
engine/run_megaman.asm#L163-L176LDA aobject_flag
AND #%10000000
BNE @running
LDA z:zjoy1_pressed_frame
AND #left_button | right_button
BNE @released
LDA aobject_pointer
CMP #$09
BNE @not_jump
LDA #$00
STA z:zice_xcoord_speed_fraction
STA z:zice_xcoord_speed
…mm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L199-L211@running:
LDA aobject_pointer
CMP #$09
BEQ @run_with_jump
…
@run_with_jump:
LDA #$06
STA aobject_pointerChecked by claude, 2026-10-26 — read the landed branch of _run_megaman_on_stage at the pinned commit; bit 7 of the flag is set only on a frame with a direction held (run_megaman.asm L4-L6, L62-L65). In the probe (Bomb Man's stage start, Mesen), Right held through the landing frame lands running, Right let go on the landing frame lands standing, Right pressed only on the landing frame starts the first step, and nothing held lands into $0F for 3 framesProbe: probes/jump-physics/movement.mjsMega Man 2 reads the frame before the landing instead (mega-man-2/landing).
Down changes nothing on open ground; _megaman_on_stage reads Up and Down only when a ladder tile is at hand. mega-man/down-on-ground
engine/run_megaman.asm#L19-L30LDA z:zladder_flag
AND #%01111111
BEQ _run_megaman_on_stage
LDA z:zjoy1_pressed
AND #up_button | down_button
BEQ _run_megaman_on_stage
…
JMP _ladder_tsaChecked by claude, 2026-10-26 — read _megaman_on_stage and _run_megaman_on_stage at the pinned commit; nothing else reads Down. In the probe (Bomb Man's stage start, Mesen), Down held with Right keeps the run at 352, and Down alone slides like a plain releaseProbe: probes/jump-physics/movement.mjsMega 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. mega-man/movement-differs-from-mega-man-2
engine/run_megaman.asm#L203-L207 — the step ends on its timer's $22 (animation-timer, ground-measured)CMP #$03
BNE @skip
LDA aobject_frameset_timer
CMP #$22
BNE @skipmm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/run_megaman.asm#L125-L129 — Mega Man 2's step ends at its animation's frame 1LDA aobject_frameset_upper_timer
CMP #$01mm1: Mega Man disassembly (lsmmega/mm1) · sprites/oam_frameset.asm#L89-L90 — the slide's 2 frames of 7, from a timer of 1, end it after 13 framesoam_frameset_0c:
.BYTE 6 | (@end - @start - 1) << 4mm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/run_megaman.asm#L258-L262 — Mega Man 2's slide ends at its animation's frame 2, 8 frames (mega-man-2/ground-measured)LDA aobject_frameset_upper_timer
CMP #$02
BNE @nz
LDA #$03
STA z:zmegaman_statusmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L216-L227 — the press returns with the ground animation set; the jump's is set after the next frame's move@start_jump_up:
LDA #$04
STA aobject_ycoord_speed
LDA #$DF
STA aobject_ycoord_speed_fraction
RTS
…
@jump_up:
LDA #$09
STA aobject_pointermm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/run_megaman.asm#L94-L103 — Mega Man 2 sets the jumping state on the press frame_run_megaman_landing_common_1:
LDA z:zjoy1_pressed_bits
AND #a_button
BEQ @not_pressed
LDA z:zjump_speed_fraction
STA aobject_ycoord_speed_fraction
LDA z:zjump_speed
STA aobject_ycoord_speed
LDA #$06
STA z:zmegaman_statusmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L163-L165 — bit 7 marks a direction held this frameLDA aobject_flag
AND #%10000000
BNE @runningmm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/run_megaman.asm#L230-L237 — `zjoy1_pressed_frame` is the previous frame's held buttonsLDX #$05
LDA z:zjoy1_pressed_frame
AND #left_button | right_button
BNE @horizontal_jump_down
LDX #$08
…
@horizontal_jump_down:
STX z:zmegaman_statusmm1: Mega Man disassembly (lsmmega/mm1) · engine/run_megaman.asm#L53-L59 — a fresh press sets the first step in the air too, before the speed lookupLDA z:zjoy1_pressed_frame
AND #left_button | right_button
BNE @change_first
LDA #$03
STA aobject_pointer
LDA #$00
STA aobject_frameset_timermm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/run_megaman.asm#L160-L167 — Mega Man 2's jumping state sets the air speed from the d-pad alone_run_megaman_jumping:
JSR _check_shoot_on_ladder
LDA #$00
STA aobject_xcoord_speed_fraction
STA aobject_xcoord_speed
LDA z:zjoy1_pressed
AND #left_button | right_button
BNE @horizontal_jumpingmm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_vertical.asm#L80-L84@done:
LDA #$FF
STA aobject_ycoord_speed, X
LDA #$40
STA aobject_ycoord_speed_fraction, Xmm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/check_object_vertical_move.asm#L68-L80 — zero less one step of gravity, −0.25 px/frame@mainloop:
LDA #$00
STA aobject_ycoord_speed_fraction
STA aobject_ycoord_speed
…
LDA aobject_ycoord_speed
SBC z:zobject_ycoord_speed_accelerate
STA aobject_ycoord_speedmm1: Mega Man disassembly (lsmmega/mm1) · engine/objects_screen.asm#L54-L55 — the push (objects_toward.asm L66-L77) changes only the whole pixelLDA z:zobject_in_process_xcoord_speed
STA aobject_xcoord_fraction, Xmm2: Mega Man 2 disassembly (lsmmega/mm2) · engine/check_object_horizontal_move.asm#L39-L43JSR _check_horizontal_collision
LDA z:z00
BEQ @air_1
LDA #$00
STA aobject_xcoord_fractionChecked by claude, 2026-10-26 — read each pair of routines above at both pinned commits; ran both games' lab models on the same scripts against each cartridge's traces in Mesen from power-on (probes/lab/conformance.mjs mega-man, Bomb Man's stage start; mega-man-2, Heat Man's), and the probe reads the 8th frame's step from mega-man/ground-measured against mega-man-2/ground-measured; the slide, take-off, landing, air press, ground speed, and wall push are measured in this set's ground-measured, takeoff-x, landing, air-speed, ground-check, and wall-stop and in the same claims of mega-man-2Probe: probes/jump-physics/movement.mjsCited by: Mega Man, Mega Man (classic series)