Super Mario Bros. 3:Notes
Back to Super Mario Bros. 3 page.
Various important bits of code follow below. Unless marked as "subroutine" you can NOT jump directly to these addresses, and even then there might be side effects.
$AC5A Jump power
$AC5A:A5 BD LDA $00BD = #$34 ; Load player horz velocity $AC5C:10 03 BPL $AC61 ; If negative, $AC5E:20 0F DD JSR $DD0F ; take absolute value $AC61:4A LSR ; Divide by 16 $AC62:4A LSR $AC63:4A LSR $AC64:4A LSR $AC65:AA TAX ; X = A, going to use it as an index $AC66:AD 47 A6 LDA $A647 = #$C8 ; Load default jump velocity $AC69:38 SEC $AC6A:FD 48 A6 SBC $A648,X @ $A64B = #$08 ; Subtract from the jump velocity (remember lower means more power) using the table 00,02,04,08. ; Thus a higher horizontal speed means a more powerful jump. $AC6D:85 CF STA $00CF = #$00 ; Store as new vertical velocity.
$ACA1 Application of gravity
$ACA1:A0 05 LDY #$05 ; Y = default falling gravity $ACA3:A5 CF LDA $00CF = #$0D ; Load current vertical velocity $ACA5:C9 E0 CMP #$E0 ; $ACA7:10 0D BPL $ACB6 ; If currently rising and v vel is still faster than E0, $ACA9:AD 79 05 LDA $0579 = #$00 ; Don't know what 0579 is... unused? Debugger never sees a nonzero value. $ACAC:D0 0D BNE $ACBB $ACAE:A5 17 LDA $0017 = #$00 ; Read gamepad. 80 is jump key, so value will appear negative! $ACB0:10 04 BPL $ACB6 ; If jump pressed, $ACB2:A0 01 LDY #$01 ; Y = jump gravity (lower than normal) $ACB4:D0 05 BNE $ACBB ; $ACB6:A9 00 LDA #$00 ; This is run if jump key is NOT pressed $ACB8:8D 79 05 STA $0579 = #$00 ; So what does it do? $ACBB:98 TYA ; A=Y $ACBC:18 CLC ; $ACBD:65 CF ADC $00CF = #$0D ; Add gravity to current vertical velocity $ACBF:85 CF STA $00CF = #$0D ; And store back
So, jumps are aborted either by the user releasing the button (bit 7 in 0017 is zero) or the 00CF is more positive than E0. Since SOME gravity is always applied, this ensures jumps are aborted.
$BFCC (Subroutine) Clamp Y velocity to the maximum
$BFCC:A5 CF LDA $00CF = #$05 ; Load current vertical velocity $BFCE:30 08 BMI $BFD8 ; Negative? Then skip clamping. $BFD0:C9 40 CMP #$40 ; #$40 is the maximum fall vel (note: gravity is added afterwards so the effective value is 45) $BFD2:30 04 BMI $BFD8 ; Less than this? Then skip clamping. $BFD4:A9 40 LDA #$40 ; Replace $00CF with the maximum fall vel. $BFD6:85 CF STA $00CF = #$05 $BFD8:A2 12 LDX #$12 ; UNKNOWN $BFDA:20 93 BF JSR $BF93 ; UNKNOWN $BFDD:60 RTS