Here's my code breakdown for the superjump. I don't guarantee that all of this is 100% accurate but I'm confident that the routine that polls the jump button and updates Junior's position while on the spring was intended to run every other frame.
Memory location $6A90 was set up for just this purpose and the first few lines of code from 4D6C to 4D79 handle the frame skipping.
Relevant memory locations:
$6010 = input from joystick and jump button: 01=right:02=left:03=down:04=up:80=jump:81=right jump:82=left jump
$6203 = Junior's X position
$6205 = Junior's Y position
$620F = ?? not sure.. sprite # maybe??
$6667 = spring position. 50=fully extended....53=fully compressed.
$6A87 = 1 if Junior collision with with spring detected else 0
$6A89 = 0 if spring on downstroke or bottom. 1 if spring on upstroke
$6A8A = normally 0 or 54 but records spring position from which superjump was successful = 51,52,or 53.
$6A8B = 1 if Junior on spring else 0.
$6A90 = alternates between 0 and 1 every frame
$6A9F = direction Junior was moving when he hit spring. 1=right: 2=left
Arrive here from 5816 when Junior is on spring:
4D6C: ld a,($6A90) // load $6A90 into A
4D6F: and a // clear carry flag
4D70: jr z,$4D77 // if zero, skip ahead to 4D77, else continue
4D72: dec a // decrement A to 0
4D73: ld ($6A90),a // load 0 into $6A90 so it will continue to springboard routine on the next frame
4D76: ret // return to main program
Springboard code:
4D77: ld a,$01 // load 01 into A
4D79: ld ($6A90),a // load 01 into $6A90 so it will skip this routine on the next frame
4D7C: ld a,($6010) // load control input into A
4D7F: ld e,$01 // load 01 into E
4D81: bit 0,a // set zero flag if NOT moving right
4D83: jr nz,$4D8D // jump ahead to 4D8D if moving right
4D85: ld e,$FF // load FF into E
4D87: bit 1,a // set zero flag if NOT moving left
4D89: jr nz,$4D8D // jump ahead to 4D8D if moving left
4D8B: ld e,$00 // load 00 into E (joystick is centered)
4D8D: ld a,($6203) // load Juniors X position into A
4D90: add a,e // add E to Juniors X positon
4D91: ld ($6203),a // update Juniors X position (this will move him 1 pixel in the direction the joystick is being held)
4D94: ld a,$01 // load 01 into A
4D96: ld ($620F),a // load 1 into $620F (?? not sure what $620F is.. sprite # ??)
4D99: ld a,($6A89) // load $6A89 into A ($6A89=0 on the downstroke or at the bottom, 1 on the upstroke)
4D9C: and a // clear carry flag, set zero flag if on the downstroke
4D9D: ld a,($6667) // load $6667 into A ($6667 =spring position. 50=fully extended..53=fully compressed. 0 if Junior is not on spring)
4DA0: jr nz,$4DF6 // jump ahead to 4DF6 if on the upstroke
4DA2: cp $53 // compare spring postion to 53
4DA4: jr z,$4DB1 // jump to 4DB1 if fully compressed
4DA6: inc a // increment spring position
4DA7: ld ($6667),a // update spring position
4DAA: ld b,a // load spring position into B
4DAB: ld c,$00 // load 00 into C
4DAD: ld a,$00 // load 00 into A
4DAF: jr $4DBA // jump to 4DBA
Arrive here from 4DA4 if spring fully compressed:
4DB1: dec a // decrement A
4DB2: ld ($6667),a // load into spring position
4DB5: ld b,a // load spring position into B
4DB6: ld c,$04 // load 04 into C
4DB8: ld a,$01 // load 01 into A
Arrive here from 4DAF if spring not fully compressed:
4DBA: ld ($6A89),a // load 00 into $6A89 (spring on downstroke)
4DBD: ld a,b // load spring position into A
4DBE: and $03 // AND A with 03
4DC0: or c // OR A with C
4DC1: ld e,a // load A into E
4DC2: ld d,$00 // load 00 into D
4DC4: ld hl,$4E19 // load $4E19 (start address of data table) into HL
4DC7: add hl,de // add offset to start address
4DC8: ld b,(hl) // load data from table into B
4DC9: ld a,($6205) // load Juniors Y position into A
4DCC: add a,b // add offset
4DCD: ld ($6205),a // load back into Junior's Y position
4DD0: ld ($694F),a // update left sprite position
4DD3: ld ($6957),a // update right sprite position
4DD6: ld a,($6A87) // load $6A87 into A
4DD9: and a // clear carry flag
4DDA: ret nz // return if not zero
4DDB: ld a,($6010) // springboard check for jump button. Jump button will set bit 7
4DDE: rlca //rotate left. if bit 7 set then carry flag will be set
4DDF: ret nc // if no superjump, return
4DE0: ld a,($6667) // load spring position into A
4DE3: ld ($6A8A),a // load A into $6A8A (superjump successful)
4DE6: ld a,$01 // load 01 into A
4DE8: ld ($6A87),a // load A into $6A87
4DEB: ld a,($6A89) // load $6A89 into A
4DEE: and a // clear carry flag
4DEF: ret nz // return if on upstroke
4DF0: ld a,$53 // load 53 into A
4DF2: ld ($6A8A),a // load 53 into $6A8A
4DF5: ret // return
Arrive here from 4DA0 when on the upstroke:
4DF6: cp $50 // compare A to 50
4DF8: jr nz,$4DB1 // jump to 4DB1 if spring not fully extended
4DFA: ld a,($6A8A) // load $6A8A into A
4DFD: and a // clear carry flag, check for zero
4DFE: jr nz,$4E05 // jump to 4E05 if not zero
4E00: ld a,$54 // load 54 into A
4E02: ld ($6A8A),a // load 54 into $6A8A (clear superjump indicator)
4E05: xor a // A=0
4E06: ld ($6A8B),a // load 0 into $6A8B..(Junior no longer on spring)
4E09: ld ($6398),a // load 0 into $6398
4E0C: ld a,($6A9F) // load $6A9F into A
4E0F: ld ($6010),a // load A into $6010
4E12: xor a // A=0
4E13: ld ($6A9F),a // load A into $6A9F
4E16: jp $1B6E // jump to 1B6E
data table:
4E19: 00
4E1A: 02
4E1B: 03
4E1C: 03
4E1D: FB
4E1E: FB
4E1F: FD
4E20: 00