If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
Super Mario Bros. 3/Notes: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
(Removed tracing values) |
||
Line 6: | Line 6: | ||
===$AC5A Jump power=== | ===$AC5A Jump power=== | ||
$AC5A:A5 BD LDA $00BD | $AC5A:A5 BD LDA $00BD ; Load player horz velocity | ||
$AC5C:10 03 BPL $AC61 ; If negative, | $AC5C:10 03 BPL $AC61 ; If negative, | ||
$AC5E:20 0F DD JSR $DD0F ; take absolute value | $AC5E:20 0F DD JSR $DD0F ; take absolute value | ||
Line 14: | Line 14: | ||
$AC64:4A LSR | $AC64:4A LSR | ||
$AC65:AA TAX ; X = A, going to use it as an index | $AC65:AA TAX ; X = A, going to use it as an index | ||
$AC66:AD 47 A6 LDA $A647 | $AC66:AD 47 A6 LDA $A647 ; Load default jump velocity | ||
$AC69:38 SEC | $AC69:38 SEC | ||
$AC6A:FD 48 A6 SBC $A648,X | $AC6A:FD 48 A6 SBC $A648,X ; 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. | ; Thus a higher horizontal speed means a more powerful jump. | ||
$AC6D:85 CF STA $00CF | $AC6D:85 CF STA $00CF ; Store as new vertical velocity. | ||
---- | ---- | ||
Line 24: | Line 24: | ||
===$ACA1 Application of gravity=== | ===$ACA1 Application of gravity=== | ||
$ACA1:A0 05 LDY #$05 ; Y = default falling gravity | $ACA1:A0 05 LDY #$05 ; Y = default falling gravity | ||
$ACA3:A5 CF LDA $00CF | $ACA3:A5 CF LDA $00CF ; Load current vertical velocity | ||
$ACA5:C9 E0 CMP #$E0 ; | $ACA5:C9 E0 CMP #$E0 ; | ||
$ACA7:10 0D BPL $ACB6 ; If currently rising and v vel is still faster than E0, | $ACA7:10 0D BPL $ACB6 ; If currently rising and v vel is still faster than E0, | ||
$ACA9:AD 79 05 LDA $0579 | $ACA9:AD 79 05 LDA $0579 ; Don't know what 0579 is... unused? Debugger never sees a nonzero value. | ||
$ACAC:D0 0D BNE $ACBB | $ACAC:D0 0D BNE $ACBB | ||
$ACAE:A5 17 LDA $0017 | $ACAE:A5 17 LDA $0017 ; Read gamepad. 80 is jump key, so value will appear negative! | ||
$ACB0:10 04 BPL $ACB6 ; If jump pressed, | $ACB0:10 04 BPL $ACB6 ; If jump pressed, | ||
$ACB2:A0 01 LDY #$01 ; Y = jump gravity (lower than normal) | $ACB2:A0 01 LDY #$01 ; Y = jump gravity (lower than normal) | ||
$ACB4:D0 05 BNE $ACBB ; | $ACB4:D0 05 BNE $ACBB ; | ||
$ACB6:A9 00 LDA #$00 ; This is run if jump key is NOT pressed | $ACB6:A9 00 LDA #$00 ; This is run if jump key is NOT pressed | ||
$ACB8:8D 79 05 STA $0579 | $ACB8:8D 79 05 STA $0579 ; So what does it do? | ||
$ACBB:98 TYA ; A=Y | $ACBB:98 TYA ; A=Y | ||
$ACBC:18 CLC ; | $ACBC:18 CLC ; | ||
$ACBD:65 CF ADC $00CF | $ACBD:65 CF ADC $00CF ; Add gravity to current vertical velocity | ||
$ACBF:85 CF STA $00CF | $ACBF:85 CF STA $00CF ; 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. | 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. | ||
Line 45: | Line 45: | ||
===$BFCC (Subroutine) Clamp Y velocity to the maximum=== | ===$BFCC (Subroutine) Clamp Y velocity to the maximum=== | ||
$BFCC:A5 CF LDA $00CF | $BFCC:A5 CF LDA $00CF ; Load current vertical velocity | ||
$BFCE:30 08 BMI $BFD8 ; Negative? Then skip clamping. | $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) | $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. | $BFD2:30 04 BMI $BFD8 ; Less than this? Then skip clamping. | ||
$BFD4:A9 40 LDA #$40 ; Replace $00CF with the maximum fall vel. | $BFD4:A9 40 LDA #$40 ; Replace $00CF with the maximum fall vel. | ||
$BFD6:85 CF STA $00CF | $BFD6:85 CF STA $00CF | ||
$BFD8:A2 12 LDX #$12 ; UNKNOWN | $BFD8:A2 12 LDX #$12 ; UNKNOWN | ||
$BFDA:20 93 BF JSR $BF93 ; UNKNOWN | $BFDA:20 93 BF JSR $BF93 ; UNKNOWN | ||
$BFDD:60 RTS | $BFDD:60 RTS |
Revision as of 21:59, 8 January 2010
Back to Super Mario Bros. 3 page.
Disassembly notes
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.
Player physics/movement
$AC5A Jump power
$AC5A:A5 BD LDA $00BD ; 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 ; Load default jump velocity $AC69:38 SEC $AC6A:FD 48 A6 SBC $A648,X ; 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 ; Store as new vertical velocity.
$ACA1 Application of gravity
$ACA1:A0 05 LDY #$05 ; Y = default falling gravity $ACA3:A5 CF LDA $00CF ; 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 ; Don't know what 0579 is... unused? Debugger never sees a nonzero value. $ACAC:D0 0D BNE $ACBB $ACAE:A5 17 LDA $0017 ; 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 ; So what does it do? $ACBB:98 TYA ; A=Y $ACBC:18 CLC ; $ACBD:65 CF ADC $00CF ; Add gravity to current vertical velocity $ACBF:85 CF STA $00CF ; 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 ; 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 $BFD8:A2 12 LDX #$12 ; UNKNOWN $BFDA:20 93 BF JSR $BF93 ; UNKNOWN $BFDD:60 RTS