Grapple beam code. Main grapple code in bank 9B Current 0D32 values: C4F0 (Inactive) C856 (Hit nothing / cancel) C8C5 (Released from swing or wallgrab) C51E (Fire / goto cancel) C703 (Firing) C77E C79D (Connected) C9CE (Walljumping) C814 (Wallgrab) C832 (Wallgrab, not holding jump) Code is jsred to at 90/DD5C according to which item is selected. 90/DD69 contains pointer to grapple code. Currently, the grapple code just JSLs to 9BC490. PHP PHB PHK PLB REP #$30 LDA $0CF6 BEQ BRANCH_ALPHA DEC A STA $0CF6 BRANCH_ALPHA LDA $0A64 AND #$FFFE STA $0A64 JSR $B861 ; $DB861 IN ROM PEA #$C4B0 JMP ($0D32) $DC4B1 ALTERNATE ENTRY POINT LDA $0D32 CMP #$C4F0 BEQ BRANCH_BETA CMP #$C856 BPL BRANCH_BETA LDA $0A74 ;Some sort of pallete index for Samus BIT #$0004 BNE BRANCH_BETA LDA $196E BEQ BRANCH_BETA JSL $90EC58 ;Get Samus's boundaries LDA $195E ;Liquid height BMI BRANCH_BETA CMP $12 BPL BRANCH_BETA LDA $0CF4 ORA #$0001 ;Set Samus below liquid STA $0CF4 PLB PLP RTL BRANCH_BETA LDA $0CF4 AND #$FFFE ;Set Samus above liquid STA $0CF4 PLB PLP RTL ;9B:B861 ;If Samus can't fire grapple beam, set 0D32 to C856 LDA $0A1F AND #$00FF TAX LDA $B8B8, X ;Check movement types that allow grapple beam (01 = not allowed) ;00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b ;00 00 00 01 01 00 00 01 01 01 01 00 00 01 01 01 00 01 01 01 01 00 00 01 01 01 00 01 AND #$00FF BEQ BRANCH_ALPHA BRANCH_GAMMA LDA $0D32 CMP #$C4F0 BEQ BRANCH_BETA LDA #$C856 STA $0D32 BRANCH_BETA RTS BRANCH_ALPHA LDA $0D32 CMP #$C4F0 BEQ BRANCH_BETA CMP #$C77E BPL BRANCH_BETA LDA $0A1C ASL A ASL A ASL A TAX LDA $91B62C, X AND #$00FF BIT #$00F0 ;Check pose firing direction BNE BRANCH_GAMMA CMP $0D34 BNE BRANCH_DELTA RTS BRANCH_DELTA LDA $0CF6 BEQ BRANCH_GAMMA LDA #$0007 JSL $809049 ; $1049 IN ROM LDA #$C51E STA $0D32 RTS ;C4F0: Do nothing if fire is/was not pressed. Clear charge beam if necessary. Setup grapple beam if fire is pressed. LDA $8F BIT $09B2 BNE BRANCH_ALPHA LDA $0E00 BIT $09B2 BNE BRANCH_ALPHA LDA $0CD0 BEQ BRANCH_BETA STZ $0CD0 STZ $0CD6 STZ $0CD8 STZ $0CDA STZ $0CDC STZ $0CDE STZ $0CE0 JSL $91DEBA ; $8DEBA IN ROM BRANCH_BETA RTS ;C51E: Act as if fire was just pressed. This is often used to *cancel* the beam during no-fire conditions BRANCH_ALPHA LDA $0A1C CMP #$00F0 BEQ BRANCH_GAMMA CMP #$00BE BEQ BRANCH_GAMMA ASL A ASL A ASL A TAX LDA $91B62D, X AND #$00FF STA $16 LDA $91B62C, X AND #$00FF BIT #$00F0 BEQ BRANCH_DELTA BRANCH_EPSILON LDA #$C856 STA $0D32 RTS BRANCH_GAMMA JSR $C6B2 ; Gets directions for Samus's aiming while held by Draygon { CMP #$00BE BEQ BRANCH_LAMBDA LDA #$0006 STA $16 LDA $8B BIT #$0100 BEQ BRANCH_MU BIT #$0400 BNE BRANCH_NU BIT #$0800 BNE BRANCH_XI BRANCH_MU LDA #$0002 SEC RTS BRANCH_XI LDA #$0001 SEC RTS BRANCH_NU LDA #$0003 SEC RTS BRANCH_LAMBDA LDA #$0006 STA $16 LDA $8B BIT #$0200 BEQ BRANCH_OMICRON BIT #$0400 BNE BRANCH_PI BIT #$0800 BNE BRANCH_RHO BRANCH_OMICRON LDA #$0007 SEC RTS BRANCH_RHO LDA #$0008 SEC RTS BRANCH_PI LDA #$0006 SEC RTS ;Two unused bytes after this: CLC, RTS } BCC BRANCH_EPSILON ;never branches, Samus can always fire when held by Draygon BRANCH_DELTA STA $0D34 ASL A TAX LDA $C0DB, X ;X speed STA $0D22 LDA $C0EF, X ;Y speed STA $0D24 LDA $C104, X ;Angle? STA $0CFA STA $0CFC LDA #$000A STA $0CF6 LDA $0A1C CMP #$0049 BEQ BRANCH_ZETA CMP #$004A BEQ BRANCH_ZETA LDA $0A1F AND #$00FF CMP #$0001 BEQ BRANCH_THETA BRANCH_ZETA ;Samus is not walking/running LDA $C122, X ;Initial grapple point X offset from Samus STA $0D02 LDA $C136, X ;Initial grapple point Y offset from Samus SEC SBC $16 STA $0D04 LDA $0AF6 PHA CLC ADC $C122, X STA $0D08 ;X position of grapple point STA $0D16 ;X position of grapple end PLA CLC ADC $C14A, X STA $0D1A ;X position of grapple start LDA $0AFA SEC SBC $16 PHA CLC ADC $C136, X STA $0D0C ;Y position of grapple point STA $0D18 ;Y position of grapple end PLA CLC ADC $C15E, X STA $0D1C ;Y position of grapple start BRA BRANCH_IOTA BRANCH_THETA ;Samus is walking/running LDA $C172, X STA $0D02 LDA $C186, X SEC SBC $16 STA $0D04 LDA $0AF6 PHA CLC ADC $C172, X STA $0D08 STA $0D16 PLA CLC ADC $C19A, X STA $0D1A LDA $0AFA SEC SBC $16 PHA CLC ADC $C186, X STA $0D0C STA $0D18 PLA CLC ADC $C1AE, X STA $0D1C BRANCH_IOTA ;Don't know most of the stuff here yet STZ $0D06 STZ $0D0A STZ $0D0E STZ $0D10 STZ $0D12 STZ $0D14 STZ $0CF4 LDA #$000C STA $0D00 STZ $0CFE STZ $0D26 STZ $0D28 STZ $0D2A STZ $0D2C STZ $0D2E STZ $0D30 STZ $0D1E STZ $0D20 LDA #$0002 STA $0D3A STZ $0D3C LDA #$0005 STA $0D3E LDA $C342 STA $0D40 STZ $0D82 STZ $0D84 STZ $0D86 STZ $0D88 STZ $0D8A STZ $0D8C STZ $0D8E STZ $0D90 STZ $0D38 STZ $0D36 STZ $0CF8 JSL $94AF87 ; $A2F87 IN ROM { LDX #$001E BRANCH_ALPHA LDA #$B197 STA $0D62, X ;0D80, 0D78, 0D70, 0D68 LDA #$B193 STA $0D60, X ;0D7E, 0D76, 0D6E, 0D66 LDA #$B18F STA $0D5E, X ;0D7C, 0D74, 0D6C, 0D64 LDA #$B18B STA $0D5C, X ;0D7A, 0D72, 0D6A, 0D62 LDA #$0001 STA $0D42, X ;0D60, 0D58, 0D50, 0D48 STA $0D40, X ;0D5E, 0D56, 0D4E, 0D46 STA $0D3E, X ;0D5C, 0D54, 0D4C, 0D44 STA $0D3C, X ;0D5A, 0D52, 0D4A, 0D42 TXA SEC SBC #$0008 TAX BPL BRANCH_ALPHA RTL } LDA #$EB86 STA $0A5C STZ $0A9E LDA #$0002 JSL $90ACF0 ; Just REP #$30 and JSR $ACFC, basically. ACFC shown here { AND #$0FFF ASL A TAY LDA #$0090 XBA STA $01 LDA $C3C9, Y STA $00 LDY #$0000 LDX #$0000 BRANCH_ALPHA LDA [$00], Y STA $7EC1C0, X ;Setting colors... for what? INX INX INY INY CPY #$0020 BMI BRANCH_ALPHA RTS } LDA #$7F91 STA $7EC1BE ; Setting some color LDA #$C703 STA $0D32 LDA #$0005 ; Start of grapple beam sound JSL $80903F ; $103F IN ROM LDA #$0001 STA $0CD0 ; Current charge... why is this set? STZ $0DC0 LDA $0A58 CMP #$946E ; Something with grapple BNE BRANCH_KAPPA LDA #$A337 ; Normal STA $0A58 BRANCH_KAPPA RTS ;C703: LDA $8B BIT $09B2 BNE BRANCH_SIGMA BRANCH_UPSILON LDA #$C856 STA $0D32 RTS BRANCH_SIGMA JSR $B8D4 ; RTS. >_> LDA $0CFE CLC ADC $0D00 STA $0CFE CMP #$0080 BMI BRANCH_TAU BRANCH_CHI BRA BRANCH_UPSILON BRANCH_TAU JSL $A09E9A ; Grapple beam collision detection? { PHB PHX PHY LDA #$000D JSL $90F084 ; A = 1 if GrappleFire != C4F0 BNE BRANCH_ALPHA JMP BRANCH_IOTA BRANCH_ALPHA STZ $18A6 STZ $17AA Jump_One LDY $17AA LDA $17EC, Y STA $0E54 CMP #$FFFF BNE BRANCH_BETA STZ $12 LDA #$0000 PLY PLX PLB RTL BRANCH_BETA TAX LDA $0FA0, X BNE BRANCH_GAMMA LDA $0F7A, X SEC SBC $0D08 BPL BRANCH_DELTA EOR #$FFFF INC A BRANCH_DELTA SEC SBC $0F82, X BCC BRANCH_EPSILON CMP #$0008 BCS BRANCH_GAMMA BRANCH_EPSILON LDA $0F7E, X SEC SBC $0D0C BPL BRANCH_ZETA EOR #$FFFF INC A BRANCH_ZETA SEC SBC $0F84, X BCC BRANCH_THETA CMP #$0008 BCC BRANCH_THETA BRANCH_GAMMA INC $17AA INC $17AA JMP Jump_One BRANCH_THETA LDA #$0001 STA $0F8A, X LDY #$0000 LDA $0F78, X TAX LDA $A0001A, X CMP #$8000 BEQ BRANCH_IOTA LDY #$0001 CMP #$8005 BEQ BRANCH_IOTA INY CMP #$800A BEQ BRANCH_IOTA INY CMP #$800F BEQ BRANCH_IOTA INY CMP #$8014 BEQ BRANCH_IOTA INY CMP #$8019 BEQ BRANCH_IOTA INY CMP #$801E BEQ BRANCH_IOTA LDY #$0000 BRANCH_IOTA STX $12 TYA CMP #$0001 BEQ BRANCH_KAPPA CMP #$0004 BEQ BRANCH_KAPPA CMP #$0005 BEQ BRANCH_KAPPA BRANCH_LAMBDA PLY PLX PLB RTL BRANCH_KAPPA ;Attach grapple point to enemy PHA LDX $0E54 LDA $0F7A, X STA $0D08 LDA $0F7E, X STA $0D0C PLA BRA BRANCH_LAMBDA } JSR $B907 ; $DB907 IN ROM { ASL A TAX JMP ($B90C, X) ; $DB90C IN ROM DW $B91A, $B91C, $B921, $B923, $B928, $B92D, $B932 ;$DB91A CLC RTS ;$DB91C ALTERNATE ENTRY POINT LDA #$0000 SEC RTS ;$DB921 ALTERNATE ENTRY POINT CLC RTS ;$DB923 ALTERNATE ENTRY POINT LDA #$0001 SEC RTS ;$DB928 ALTERNATE ENTRY POINT LDA #$0000 SEC RTS ;$DB92D ALTERNATE ENTRY POINT LDA #$0000 SEC RTS ;$DB932 ALTERNATE ENTRY POINT LDX $12 LDA $A00006, X ;Enemy contact damage STA $12 LDA $09A2 BIT #$0020 BNE BRANCH_ALPHA LSR A BCC BRANCH_BETA LSR $12 BRANCH_BETA LDA $12 BRA BRANCH_GAMMA BRANCH_ALPHA LSR $12 LSR $12 LDA $12 BRANCH_GAMMA JSL $91DF51 ;Deal damage (A) to Samus. Does NOT do any damage if damage = 300 (#$12C) or if time is paused by x-ray / reserve tanks, ignores suits. NOTE: If damage is negative, game will stop (JML $808573) LDA #$0060 ;Set invincibility timer STA $18A8 LDA #$0005 ;Set hurt-timer STA $18AA LDA $0A1E AND #$00FF CMP #$0004 ;Direction Samus is facing BEQ BRANCH_DELTA STZ $0A54 ;Direction Samus moves while hurt BRA BRANCH_EPSILON BRANCH_DELTA LDA #$0001 STA $0A54 BRANCH_EPSILON LDA #$0001 SEC RTS } BCC BRANCH_PHI TAY BNE BRANCH_CHI BRA BRANCH_PSI BRANCH_PHI JSL $94A85B ; Grapple beam block collision checking and reaction. BCC BRANCH_OMEGA BVC BRANCH_CHI BRANCH_PSI LDA #$0006 JSL $809049 ; Play grapple-attached sound JSR $B97C ; $DB97C IN ROM { LDA $0A1F AND #$00FF CMP #$001A BNE BRANCH_ALPHA LDA #$C77E STA $0D32 ;Set for 'grabbed by draygon' STZ $0D00 RTS BRANCH_ALPHA LDA $0D34 ASL A ASL A TAX LDA $0B2E BNE BRANCH_BETA LDA $0B2C BNE BRANCH_BETA LDA $0A1F AND #$00FF CMP #$0005 BEQ BRANCH_GAMMA LDA $C3C6, X ;C79D, C79D, C77E, C77E, C77E, C77E, C77E, C77E, C79D, C79D STA $0D32 LDA $C3C8, X ;B9D9, B9D9, B9EA, B9F3, B9FC, B9FC, B9FC, BA05, B9E2, B9E2 STA $0D82 JMP ($0D82) BRANCH_GAMMA ;Samus is crouching LDA $C416, X ;C79D, C79D, C77E, C77E, C77E, C77E, C77E, C77E, C79D, C79D STA $0D32 LDA $C418, X ;B9D9, B9D9, BA0E, BA17, B9FC, B9FC, BA20, BA29, B9E2, B9E2 STA $0D82 JMP ($0D82) BRANCH_BETA ;Samus is moving vertically LDA $C3EE, X ;C79D all STA $0D32 LDA $C3F0, X ;B9D9 left, B9E2 right STA $0D82 JMP ($0D82) ;B9D9: 0A2A = #00B2, goto BA61 ;B9E2: 0A2A = #00B3, goto BA61 ;B9EA: 0A2A = #00A8, goto BA9B ;B9F3: 0A2A = #00AA, goto BA9B ;B9FC: 0A2A = #00AB, goto BA9B ;BA05: 0A2A = #00A9, goto BA9B ;BA0E: 0A2A = #00B4, goto BA9B ;BA17: 0A2A = #00B6, goto BA9B ;BA20: 0A2A = #00B7, goto BA9B ;BA29: 0A2A = #00B5, goto BA9B ;BA61: LDA #$0009 STA $0A30 LDA $0AF6 SEC SBC $0D08 STA $12 LDA $0AFA SEC SBC $0D0C STA $14 JSL $A0C0AE ;Calculate angle from Grapple point to Samus XBA STA $0CFA STA $0CFC STZ $0D00 ;Keep grapple from shutting off LDA $0CFE CMP #$0040 BMI BRANCH_ALPHA SEC SBC #$0018 STA $0CFE BRANCH_ALPHA JSL $94AC11 ; $A2C11 IN ROM { LDA $0CFB AND #$00FF ASL A STA $0D82 LDA $0CFE STA $0D84 JSR $A957 ; $A2957 IN ROM LDA $0D90 STA $0D16 LDA $0D92 STA $0D18 RTL } RTS ;BA9B: 0A30 = #000A, rest is identical to BA61 } LDA #$0008 EOR #$FFFF INC A STA $0D00 LDA $0A64 ORA #$0001 STA $0A64 BRANCH_OMEGA RTS