I analyzed this game roughly, so I put the result for reference (as you might already know).
EDIT: I analyzed only about platforming levels.
First, I put some memory addresses:
$05 U8 input_1 # ABSTUDLR
$06 U8 input_2
$07 U8 input_new_1
$08 U8 input_new_2
$09 U8 input_prev_not_1
$0A U8 input_prev_not_2
$0B U16 scroll_x
$0D U8 scroll_y
$0E U8 prg_id_saved(16k)
$93 U8 flags # bit7:paused, bit0:cheat allowed
$EF U8 weapon # 0:whip, 1:gun, 2:grenade
$0100-$013F U8[0x40] stack
# objects
# -------
# the hero is always the first object.
# velocity and acceleration are signed-magnitude format.
# (i.e. bit7:sign, bit6-0:absolute value)
$0190-$019F U8[16] obj_accel_y
$01A0-$01AF U8[16] obj_vel_y
$01B0-$01BF U8[16] obj_pos_y_subpx # 0..15
$01C0-$01CF U8[16] obj_accel_x
$01D0-$01DF U8[16] obj_vel_x
$01E0-$01EF U8[16] obj_pos_x_subpx # 0..15
$01F0-$01FF U8[16] obj_pos_x_px_lo
$0200-$020F U8[16] obj_pos_x_px_hi
$0210-$021F U8[16] obj_pos_y_px_lo
$0220-$022F U8[16] obj_pos_y_px_hi
$0280-$028F U8[16] obj_hp
$035D U8 time(frame)
$035E U8 time(sec)
$035F U8 bullet_num
$0360 U8 grenade_num
$0361 U8 coin_num # 0..99
$0362 U8 life # 0..9
$0363 U16 score # 100x
$036F U8 cheat:slow_motion
$0700-$07FF Sprite[64] sprite_buffer
For the cheat, see
gamefaqs. I think 2P input is used only for the cheat.
I wrote a
HUD script to display position, velocity, acceleration, and HPs.
As you may notice by using the HUD script, velocity value is actually not correct when you go leftward. For some reason, the actual velocity is oscillated when you go leftward. I suspect this might be the reason why you can perform the wallzipping only leftward.
As
the latest submission says, it seems that you can manipulate y-subpixel by pressing select at the moment you jump.
For object position calculation code, see $06:88A0 and $06:891B (object index is passed via X register).
Bank switching (16K, $8000-$BFFF) routine is at $DFC2, $DFC6. $DFC6 simply switches bank. $DFC2 saves the specified PRG-ID to $0E.