Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Custom Reznor
- ;; by Sonikku
- ;; Description: A custom clone of the default Reznor boss in SMW. If placed above or in the same position as (almost)
- ;; any sprite, it'll lock onto the center of it. This includes other instances of itself. If a Reznor is stacked on top of
- ;; another and it is killed, the one on top of it will attempt to ride on the sprite the parent Reznor was riding.
- ;;
- ;; If this sprite doesn't attach to another, place the sprite at the same X/Y position.
- ;;
- ;; This sprite will not function correctly when attempting to make it the child of a rotating platform.
- ;;
- ;; Support for more than 2 stacked Reznors is minimal. If two Reznors in a row of 3+ die at the same time, the top Reznors will not
- ;; be able to find the new parent sprite and will fall to the ground - often times at the same position of another Reznor or through sprites
- ;;
- ;; This sprite can be configured to be damaged by a variety of sources. If set to $00, that damage type will be ignored unless stated otherwise.
- ;; Damage above $7F is not recommended.
- !GrP = $02 ; Sprite number of the custom gray platform that can damage this sprite
- !StompDamage = $08 ; how much damage stomps and touching this sprite with a star deals; if zero, jumping on it hurts the player (or do nothing while invincible)
- !StompInvuln = $20 ; how long the sprite is invulnerable when damaged by stomps
- !FireDamage = $0C ; how much damage fireballs deal; if zero, fireballs turn into puffs of smoke
- !FireInvuln = $10 ; how long the sprite is invulnerable when damaged by fireballs
- !CapeDamage = $02 ; how much damage cape swings deal
- !CapeInvuln = $0C ; how long the sprite is invulnerable when damaged by cape swings
- !BlockDamage = $10 ; how much damage hit bounce blocks deal - this includes flying blocks
- !BlockInvuln = $30 ; how long the sprite is invulnerable when damaged by bounce blocks
- !ThrownDamage = $10 ; how much damage thrown sprites deal
- !ThrownInvuln = $30 ; how long the sprite is invulnerable when damaged by thrown sprites
- !Normal = $00 ; \ don't touch these
- !Custom = $01 ; /
- ;; Extra Property Byte 1 configures how much health this sprite has.
- ;; Health above $7F is not recommended.
- ;;
- ;; If the Extra Bit is set, it will check for a custom set of sprite tables, allowing for some parent-specific properties to be used.
- ;; The following table modifies alignment with certain sprites as well as some sprite-specific properties. Property Flag 2 currently has no use.
- ;; Format is as follows:
- ;; Sprite Number (8-bit), Custom Sprite flag (8-bit), X-positioning (16-bit), Y-Positioning (16-bit) : Property Flag 1 (8-bit), Property Flag 2 (8-bit)
- ;; Example: db $49 : db !Normal : dw $0008 : dw $FFF0 : db $00,$00 ; Shrinking/Growing Pipe
- SpriteProperties:
- db $62 : db !Normal : dw $FFF8 : dw $FFEA : db $00,$00 ; Brown line-guided platform
- db $63 : db !Normal : dw $FFF8 : dw $FFEA : db $00,$00 ; Brown line-guided platform
- db $49 : db !Normal : dw $0008 : dw $FFF0 : db $00,$00 ; Shrinking/Growing Pipe
- db $B9 : db !Normal : dw $0000 : dw $FFF0 : db $01,$00 ; Info Box (y tho)
- db $C8 : db !Normal : dw $0000 : dw $FFF0 : db $01,$00 ; Light Switch
- db $9C : db !Normal : dw $0008 : dw $FFF0 : db $01,$00 ; Left Flying Question Block
- db !GrP : db !Custom : dw $0000 : dw $FFF0 : db $02,$00 ; Custom Gray Block Platform <- copy this and change !GrP to $xx (where xx is your custom sprite number) if you intend on using these with more than 1 custom winged block platform sprite.
- ;; add more entries below here
- ;; add more entries above here
- SpritePropertiesEnd:
- print "INIT ",pc
- LDA $7FAB28,x
- STA $1528,x
- LDA #$04
- STA $15AC,x
- Sprite_Init:
- JSR SubHorzPos
- TYA
- STA $157C,x
- JSL $01ACF9
- EOR $13
- SBC $94
- STA $1570,x
- LDA #$FF
- STA $1510,x
- STA $151C,x
- LDY #$0B ;
- - STX $00 ;
- CPY $00 ;
- BEQ .loop ;
- LDA $14C8,x ;
- CMP #$0C ;
- BEQ .loop ;
- CMP #$01 ;
- BEQ + ;
- CMP #$08 ;
- BCC .loop ;
- + JSL $03B69F ;
- PHX ;
- TYX ;
- JSL $03B6E5 ;
- PLX ;
- JSL $03B72B ;
- BCC .loop ;
- LDA $00D8,y ;
- STA $00 ;
- LDA $14D4,y ;
- STA $01 ;
- LDA $14D4,x ;
- XBA ;
- LDA $D8,x ;
- REP #$20 ;
- SEC ;
- SBC $00 ;
- SEP #$20 ;
- BEQ + ;
- BPL .loop ;
- + TYA ;
- STA $1510,x ;
- RTL
- .loop DEY ;
- BPL - ;
- RTL
- print "MAIN ",pc
- MAIN:
- PHB
- PHK
- PLB
- JSR KeyGFXRt
- PLB
- RTL
- KeyGFXRt:
- LDA $15AC,x
- BEQ +
- JSL Sprite_Init
- RTS
- + LDA $167A,x ; \
- PHA ; |
- LDA $1510,x ; |
- BMI .normal ; |
- TAY ; |
- LDA $14C8,y ; |
- BNE .onscreen ; |
- LDA $15A0,y ; |
- BEQ .onscreen ; | attempt to inherit offscreen status from parent sprite if it's a child
- STZ $14C8,x ; | if the parent sprite despawns via going offscreen, reznor will too; otherwise it processes offscreen
- LDY $161A,x ; | this fixes an issue where the reznor could become unparented if the parent doesn't despawn but reznor does
- LDA #$00 ; |
- STA $1938,y ; |
- .onscreen
- LDA #$04 ; |
- STA $167A,x ; |
- .normal JSR SUB_OFF_SCREEN_X0
- PLA ; |
- STA $167A,x ; /
- LDA $1564,x ; \
- BEQ .showgfx ; |
- LSR : LSR ; |
- PHX ; |
- TAX ; | this just makes the sprite flash when $1564,x (invulnerability timer) is set
- LDA $00E292,x ; |
- PLX ; |
- AND $1564,x ; |
- ORA $9D ; |
- BNE + ; /
- .showgfx
- JSR SubGfx ;
- + LDA $14C8,x ; \
- CMP #$08 ; | don't run if dead
- BNE .return ; /
- LDA $9D ; \ don't run if sprites locked
- BEQ + ; /
- .return RTS
- + JSL $018032 ;
- LDA $14 ; \
- AND #$01 ; | run every other frame
- BNE + ; /
- JSR FireBallDamage
- JSR CapeDamage
- JSR ThrownDamage
- + JSR StompDamage
- LDA $1510,x ; \
- CMP #$FF ; | branch if parented
- BNE + ; /
- JSR BounceBlockDamage
- JSR CheckForNewParent
- JSL $01802A ; gravity
- LDA $1588,x ; \
- AND #$04 ; |
- BEQ .inair ; | stick to floors
- STZ $AA,x ; |
- STZ $B6,x ; /
- .inair JMP .finish ;
- + TAY ;
- LDA $15D0,y ; \ consider sprite dead if it's being eaten (this is off anyways but whatever)
- BNE .killed ; /
- LDA $14C8,y ; \
- CMP #$0C ; |
- BEQ .killed ; | check for killed grandparent
- CMP #$07 ; |
- BCS + ; /
- .killed LDA $1510,y ; \ make grandparent into new parent
- STA $151C,x ; /
- LDA #$FF ; \ set existing parent to null
- STA $1510,x ; /
- STZ $AA,x ; no y speed
- RTS
- + JSR CheckCustom ; \ check if locked-on sprite is custom or not
- BCS .not_custom ; /
- JSR ExecuteCustomPtr1
- BRA .finish
- .not_custom
- JSR LockXPos ; lock x position (it's a JSR because I use it elsewhere too)
- PHX ; \
- LDA $1662,y ; |
- AND #$3F ; |
- ASL ; |
- TAX ; |
- LDA $14D4,y ; |
- XBA ; |
- LDA $00D8,y ; | this just locks the sprite onto the parent sprite based on it's clipping
- REP #$20 ; |
- CLC ; |
- ADC Clipping_TopY,x
- SEP #$20 ; |
- PLX ; |
- STA $D8,x ; |
- XBA ; |
- STA $14D4,x ; /
- .finish LDA $1540,x ; \
- BEQ .not_turning; |
- CMP #$08 ; |
- BNE + ; |
- LDA $157C,x ; | turning animation-related code
- EOR #$01 ; |
- STA $157C,x ; |
- + LDY #$02 ; |
- BRA .showframe ; /
- .not_turning
- PHY ;
- LDA $1570,x ; \
- BNE ++ ; |
- JSR SubHorzPos ; |
- TYA ; | turn toward player if not facing them
- CMP $157C,x ; |
- BEQ + ; |
- PLY ; |
- BRA .turn ; /
- + LDY #$3F ; timer
- LDA #$00 ; \
- AND #$04 ; | early code that made reznor fire faster when extra bit was set
- BEQ + ; | probably will re-implement this at whatever point
- LDY #$4F ; /
- + TYA ; \ set timer
- STA $1558,x ; /
- JSL $01ACF9 ; \
- AND #$3F ; | make re-fire timer slightly randomized
- STA $1570,x ; /
- ++ PLY ;
- INC $1570,x ;
- LDA $1558,x ; \
- ORA $1570,x ; |
- BNE + ; |
- JSR SubHorzPos ; | another place for it to turn
- TYA ; |
- CMP $157C,x ; |
- BEQ + ; /
- .turn LDA $14 ; \
- AND #$1F ; | only turn once every half-second or so
- BNE + ; /
- LDA #$10 ; \ turn timer
- STA $1540,x ; /
- + LDY #$00 ; \
- LDA $1558,x ; |
- BEQ .showframe ; | firing animation
- LDY #$01 ; |
- PHY ; |
- LDY #$00 ; /
- LDA #$00 ; \
- AND #$04 ; | more early code that made reznor fire faster
- BEQ + ; |
- INY ; /
- + LDA .timer,y ; \
- PLY ; |
- AND $1558,x ; |
- BNE .showframe ; /
- PHY ;
- JSR ReznorFire ;
- PLY ;
- .showframe
- TYA ;
- STA $1602,x ;
- RTS
- .timer db $1F,$0F
- CheckForNewParent:
- LDY $151C,x ; \
- CPY #$FF ; |
- BEQ + ; |
- LDA $14C8,y ; |
- CMP #$08 ; |
- BCC + ; |
- JSR LockXPos ; |
- JSL $03B69F ; | this just makes it so if this sprite detects that the parent dies, it'll go to the grandparent
- PHX ; | a more advanced script may be able to loop and get great-grandparents and etc., too
- TYX ; | but this assumes that two reznors cannot die in the same second or two
- JSL $03B6E5 ; |
- PLX ; |
- JSL $03B72B ; |
- BCC + ; |
- TYA ; |
- STA $1510,x ; /
- + RTS
- LockXPos:
- PHX ; \
- LDA $1662,y ; |
- AND #$3F ; |
- ASL ; |
- TAX ; |
- REP #$20 ; |
- LDA Clipping_CenterX,x
- STA $0C ; |
- SEP #$20 ; |
- PLX ; |
- LDA $14E0,y ; | this just locks the sprite onto the location of it's parent's x position
- XBA ; |
- LDA $00E4,y ; |
- REP #$20 ; |
- CLC ; |
- ADC $0C ; |
- SEP #$20 ; |
- STA $E4,x ; |
- XBA ; |
- STA $14E0,x ; /
- RTS
- Clipping_CenterX:
- dw $0000,$0000,$0010,$0014,$0010,$0018,$0000,$0018 ; clipping 00-07
- dw $0000,$0000,$FFF8,$0000,$0000,$0000,$0008,$000C ; clipping 08-0F
- dw $0000,$0000,$FFFB,$FFFB,$0008,$0000,$0000,$0000 ; clipping 10-17
- dw $0000,$0000,$0000,$0000,$0000,$0008,$FFF0,$0000 ; clipping 18-1F
- dw $FFFC,$FFFC,$0000,$0008,$0008,$0008,$0000,$0000 ; clipping 20-27
- dw $FFF8,$FFF8,$0000,$0000,$FFFC,$0008,$0008,$0014 ; clipping 28-2F
- dw $0004,$0010,$0010,$0018,$FFFE,$0002,$0018,$0000 ; clipping 30-37
- dw $0010,$0000,$0000,$0000,$0004,$0004,$0004,$0004 ; clipping 38-3F
- Clipping_TopY:
- dw $FFF0,$FFF0,$FFF0,$FFF8,$FFF0,$FFF0,$FFF0,$FFF8 ; clipping 00-07
- dw $FFF0,$FFF8,$FFF8,$FFF8,$FFF0,$FFF0,$FFF8,$FFF0 ; clipping 08-0F
- dw $FFF0,$FFD8,$0000,$0010,$FFF0,$FFF0,$FFE4,$FFF8 ; clipping 10-17
- dw $0000,$0010,$0020,$0030,$003C,$FFF0,$FFE8,$FFF0 ; clipping 18-1F
- dw $FFD8,$0000,$FFF0,$FFD8,$0010,$FFF4,$0048,$FFF0 ; clipping 20-27
- dw $FFD8,$FFF0,$FFE8,$FFF0,$FFE8,$FFF4,$FFF0,$FFF0 ; clipping 28-2F
- dw $FFE0,$FFF0,$FFF0,$FFF0,$FFEC,$FFF0,$FFF8,$FFE8 ; clipping 30-37
- dw $FFF0,$0000,$0000,$FFF0,$FFF8,$0004,$0000,$FFF8 ; clipping 38-3F
- CheckCustom:
- STZ $00 ;
- REP #$20 ; \
- LDA #SpritePropertiesEnd
- SEC ; |
- SBC #SpriteProperties
- LSR : LSR : LSR ; | get loop count via some dumb math
- SEP #$20 ; |
- DEC ; |
- TAY ; /
- - PHY ;
- TYA ;
- ASL : ASL : ASL ;
- TAY ;
- LDA SpriteProperties+$1,y
- BNE .custom ;
- PHY ; \
- LDY $1510,x ; |
- LDA $009E,y ; | branch if sprite number doesn't match list
- PLY ; |
- CMP SpriteProperties,y
- BNE .loop ; /
- BRA .finish
- .custom PHX ; \
- LDA $1510,x ; |
- TAX ; |
- LDA $7FAB10,x ; | branch if parent sprite isn't a custom sprite
- PLX ; |
- AND #$08 ; |
- BEQ .loop ; /
- PHX ; \
- LDA $1510,x
- TAX
- LDA $7FAB9E,x ; | branch if custom sprite number doesn't match list
- PLX ; |
- CMP SpriteProperties,y
- BNE .loop ; /
- .finish PHY ;
- LDY $1510,x ; \
- LDA $14E0,y ; |
- XBA ; |
- LDA $00E4,y ; |
- PLY ; | lock sprite x position
- REP #$20 ; |
- CLC ; |
- ADC SpriteProperties+$2,y
- SEP #$20 ; |
- STA $E4,x ; |
- XBA ; |
- STA $14E0,x ; /
- PHY ; \
- LDY $1510,x ; |
- LDA $14D4,y ; |
- XBA ; |
- LDA $00D8,y ; |
- PLY ; | lock sprite y position
- REP #$20 ; |
- CLC ; |
- ADC SpriteProperties+$4,y
- SEP #$20 ; |
- STA $D8,x ; |
- XBA ; |
- STA $14D4,x ; /
- LDA SpriteProperties+$6,y
- STA $00 ; store type to scratch ram
- LDA SpriteProperties+$7,y
- STA $01 ; store type to scratch ram
- PLY ;
- LDY $1510,x ; restore index
- CLC ;
- RTS
- .loop PLY
- DEY ;
- BPL + ;
- LDY $1510,x ; restore index
- SEC ;
- RTS
- +
- JMP -
- ExecuteCustomPtr1:
- LDA $00 ;
- BEQ .return ;
- JSL $0086DF ;
- dw .return
- dw .flyingblocks
- dw .customflyingblocks
- .return RTS
- .flyingblocks
- LDA $1558,y ; \
- BEQ ++ ; | branch if "has been hit" timer is below#$08
- CMP #$08 ; |
- BCC + ; /
- .blockhurtsprite
- LDA #!BlockDamage;\
- BEQ + ; |
- STA $00 ; |
- JSR SubHorzPos ; |
- TYA ; | deal damage
- STA $02 ; |
- LDA #!BlockInvuln; |
- STZ $03 ; |
- JSR HurtSprite ; /
- + RTS
- ++ LDA #$00 ; \ clear "has been hit" flag
- STA $00C2,y ; /
- RTS
- .customflyingblocks
- LDY $1510,x ; parented sprite index
- LDA $1594,y ; \
- AND #$01 ; | get block count (odd/even)
- STA $00 ; /
- LDA $1594,y ; \
- ASL : ASL : ASL ; |
- SEC ; |
- SBC $00E4,y ; |
- CLC ; |
- ADC #$08 ; |
- CLC ; | check if block hit is the one reznor is on
- ADC $E4,x ; |
- LSR : LSR ; |
- LSR : LSR ; |
- SEC ; |
- SBC $1602,y ; |
- STA $01 ; /
- BEQ ++ ; hurt sprite
- LDA $00 ; \ branch if odd number of blocks
- BEQ + ; /
- LDA $01 ; \
- DEC ; | do some silliness to make it so reznor can be hurt by both blocks its on
- BNE + ; /
- ++ LDA $154C,y ;
- BNE .blockhurtsprite
- + RTS
- BounceBlockDamage:
- LDA $1564,x
- BNE .no_contact
- LDY #$03 ; get # of slots to check for
- - LDA $1699,y ; \ don't check clipping with nonexistent slots
- BEQ .loop ; /
- LDA $18F8,y ; \
- CMP #$03 ; | don't check clipping with bounce blocks that currently shouldn't interact with sprites
- BCS .loop ; /
- LDA $16CD,y ; \ load index for bounce block sprite clipping/position (?)
- BEQ .loop ; / don't interact if it's zero
- PHX ; \
- TAX ; |
- LDA $16D1,y ; |
- CLC ; |
- ADC $029656,x ; | set bounce block clipping x position
- STA $00 ; |
- LDA $16D5,y ; |
- ADC $029658,x ; |
- STA $08 ; /
- LDA $02965A,x ; \ set bounce block clipping width
- STA $02 ; /
- LDA $16D9,y ; \
- CLC ; |
- ADC $02965C,x ; |
- STA $01 ; | set bounce block clipping y position
- LDA $16DD,y ; |
- ADC $02965E,x ; |
- STA $09 ; /
- LDA $029660,x ; \ set bounce block clipping height
- STA $03 ; /
- PLX ;
- JSL $03B69F ; get sprite clipping
- JSL $03B72B ; check for contact
- BCS + ;
- .loop DEY ; \ loop if needed
- BPL - ; /
- .no_contact
- RTS ;
- + LDA #!BlockDamage
- BEQ +
- STA $00
- JSR SubHorzPos
- TYA
- STA $02
- LDA #!BlockInvuln
- STZ $03
- JSR HurtSprite
- RTS
- FireBallDamage:
- LDY #$09 ; times to loop
- - LDA $170B,y ; \
- CMP #$05 ; |
- BEQ + ; | only detect yoshi and mario fireballs
- CMP #$11 ; |
- BNE .loop ; /
- + LDA $171F,y ; \
- SEC ; |
- SBC #$02 ; |
- STA $00 ; | fireball clipping x position
- LDA $1733,y ; |
- SBC #$00 ; |
- STA $08 ; /
- LDA #$0C ; \ fireball clipping width
- STA $02 ; /
- LDA $1715,y ; \
- SEC ; |
- SBC #$04 ; |
- STA $01 ; | fireball clipping y position
- LDA $1729,y ; |
- SBC #$00 ; |
- STA $09 ; /
- LDA #$0C ; \ fireball clipping height
- STA $03 ; /
- JSL $03B69F ; get sprite clipping
- JSL $03B72B ; check for contact
- BCS + ;
- .loop DEY ;
- BPL - ;
- .no_contact
- RTS ;
- + LDA #$01 ; \
- STA $170B,y ; | turn fireball to smoke
- LDA #$10 ; |
- STA $176F,y ; /
- LDA #$01 ; \ play sound
- STA $1DF9 ; /
- LDA $1564,x ; \
- BNE + ; |
- LDA #!FireDamage; |
- BEQ .no_contact ; |
- STA $00 ; |
- STZ $02 ; | handle damaging sprite
- LDA $1747,y ; |
- BNE + ; |
- INC $02 ; |
- + LDA #!FireInvuln; |
- STZ $03 ; |
- JSR HurtSprite ; /
- RTS
- CapeDamage:
- LDA $1564,x ;
- BNE .no_contact ;
- LDA #!CapeDamage;
- BEQ .no_contact ;
- LDA $1632,x ; \
- PHY ; |
- LDY $74 ; |
- BEQ + ; | don't interact with cape if mario and the sprite
- EOR #$01 ; | are not both above/behind the foreground together
- + PLY ; |
- EOR $13F9 ; |
- BNE .no_contact ; /
- LDA $13E8 ; \ don't interact with cape if cape contact is disabled
- BEQ .no_contact ; /
- LDA $15D0,x ; \
- ORA $1FE2,x ; | don't interact with cape if sprite is being eaten or it just shouldn't
- BNE .no_contact ; /
- LDA $13E9 ; \
- SEC ; |
- SBC #$02 ; |
- STA $00 ; | set cape clipping x position
- LDA $13EA ; |
- SBC #$00 ; |
- STA $08 ; /
- LDA #$14 ; \ set cape clipping width
- STA $02 ; /
- LDA $13EB ; \
- STA $01 ; | set cape clipping y position
- LDA $13EC ; |
- STA $09 ; /
- LDA #$10 ; \ set cape clipping height
- STA $03 ; /
- JSL $03B69F ; get sprite clipping
- JSL $03B72B ; check for contact
- BCC .no_contact ;
- LDA #!CapeDamage; \
- STA $00 ; |
- JSR SubHorzPos ; |
- TYA ; | handle damaging sprite
- STA $02 ; |
- STZ $03 ; |
- LDA #!CapeInvuln; |
- JSR HurtSprite ; /
- .no_contact
- RTS
- StompDamage:
- JSL $01A7DC ; \ branch when no contact made
- BCC .no_contact ; /
- LDA $1490 ;
- BEQ + ;
- LDA #!StompDamage;\ branch if taking no damage from stomps
- BEQ .no_contact ; /
- STA $00 ; \
- STZ $03 ; |
- JSR SubHorzPos ; |
- TYA ; | manage damage taken
- STA $02 ; |
- LDA #!StompInvuln; |
- JSR HurtSprite ; /
- RTS
- + LDA $14D4,x ; \
- XBA ; |
- LDA $D8,x ; |
- REP #$20 ; |
- CLC ; |
- ADC #$FFF0 ; |
- SEC ; | hurt mario if not directly on top of sprite
- SBC $96 ; |
- LDY $187A ; |
- BEQ + ; |
- CLC ; |
- ADC #$FFF0 ; |
- + CMP #$0016 ; |
- SEP #$20 ; |
- BMI .hurt_mario ; /
- LDA $7B
- BMI .no_contact
- LDA #!StompDamage;\ branch if damage is taken from stomps
- BNE .stomp ; /
- LDA $140D ; \
- BEQ .hurt_mario ; | hurt mario if not spin jumping when no damage is taken from stomps
- BRA .finish ; /
- .stomp LDA $1564,x ; \ branch if invulnerable
- BNE .finish ; /
- LDA #!StompDamage;\ branch if taking no damage from stomps
- BEQ .finish ; /
- STA $00 ; \
- STA $03 ; |
- JSR SubHorzPos ; |
- TYA ; | manage damage taken
- STA $02 ; |
- LDA #!StompInvuln; |
- JSR HurtSprite ; /
- BRA +
- .finish LDA #$02 ; \ sound
- STA $1DF9 ; /
- + JSL $01AB99 ; contact graphic
- JSL $01AA33 ; boost mario speed
- .no_contact
- RTS
- .hurt_mario
- LDA $1564,x ; \ branch if invulnerable
- BNE .no_contact ; /
- LDA $187A ; \ branch if riding yoshi
- BNE .loseyoshi ; /
- JSL $00F5B7 ; hurt mario
- RTS
- .loseyoshi
- PHX ;
- LDX #$0B ;
- - LDA $9E,x ; \
- CMP #$35 ; | get index of yoshi
- BEQ + ; /
- DEX ;
- BPL - ;
- PLX ;
- RTS
- + LDA #$10 ; \
- STA $163E,x ; |
- LDA #$03 ; |
- STA $1DFA ; |
- LDA #$13 ; |
- STA $1DFC ; |
- LDA #$02 ; |
- STA $C2,x ; |
- STZ $187A ; |
- STZ $0DC1 ; |
- LDA #$C0 ; | basically ripped from $02A473
- STA $7D ; | forces mario to lose yoshi
- STZ $7B ; |
- LDA $157C,x ; |
- PHX ; |
- TAX ; |
- LDA $02A4B3,x ; |
- PLX ; |
- STA $B6,x ; |
- STZ $1594,x ; |
- STZ $151C,x ; |
- STZ $18AE ; |
- LDA #$30 ; |
- STA $1497 ; /
- PLX
- RTS
- ThrownDamage:
- LDA #!ThrownDamage
- BEQ .no_contact
- LDA $1564,x
- BNE .no_contact
- LDY #$0B ; times to loop
- - LDA $14C8,y ; \
- CMP #$0B ; |
- BEQ .loop ; | don't interact with non-carried non-carriable sprites
- CMP #$09 ; |
- BCC .loop ; /
- JSL $03B69F ; \
- PHX ; |
- TYX ; |
- JSL $03B6E5 ; | branch if no contact
- PLX ; |
- JSL $03B72B ; |
- BCS + ; /
- .loop DEY ;
- BPL - ;
- .no_contact
- RTS
- + LDA #$02 ; \ kill thrown sprite
- STA $14C8,y ; /
- PHX ; \
- LDX #$00 ; |
- LDA $00B6,y ; |
- BPL + ; | killed x speed based on direction it was moving
- INX ; |
- + TXA ; |
- EOR #$01 ; |
- STA $02 ; |
- LDA .killed_xspeed,x
- PLX ; |
- STA $00B6,y ; /
- LDA #$D0 ; \ killed y speed
- STA $00AA,y ; /
- LDA #!ThrownDamage
- STA $00
- STZ $03
- LDA #!ThrownInvuln
- JSR HurtSprite
- RTS
- .killed_xspeed
- db $F0,$10
- HurtSprite:
- STA $01
- LDA $1564,x
- BNE .return
- LDA #$03
- STA $1DF9
- LDA $1528,x
- SEC
- SBC $00
- DEC
- BPL .hurt
- LDA #$02
- STA $14C8,x
- LDA #$09
- JSL $02ACEF
- LDA $03
- BEQ BounceKill
- LDA #$E0
- STA $AA,x
- STZ $B6,x
- CLC
- RTS
- .hurt STA $1528,x
- LDA $01
- STA $1564,x
- LDA #$28
- STA $1DFC
- LDA #$03
- LDY $03
- BEQ +
- LDA #$02
- + STA $1DF9
- SEC
- .return RTS
- BounceKill:
- LDA #$C0
- STA $AA,x
- LDY $02
- LDA .killedx,y
- STA $B6,x
- CLC
- RTS
- .killedx
- db $F8,$08
- ReznorFire:
- LDY #$07
- - LDA $170B,y
- BEQ +
- DEY
- BPL -
- RTS
- + LDA #$10
- STA $1DF9
- LDA #$02
- STA $170B,y
- PHY
- LDA $157C,x
- ASL
- TAY
- LDA $14E0,x
- XBA
- LDA $E4,x
- REP #$20
- CLC
- ADC .x_pos,y
- SEP #$20
- PLY
- STA $171F,y
- SEC
- SBC $94
- STA $00
- XBA
- STA $1733,y
- SBC $95
- STA $01
- LDA $14D4,x
- XBA
- LDA $D8,x
- STA $1715,y
- SEC
- SBC $96
- STA $02
- XBA
- STA $1729,y
- SBC $97
- STA $03
- LDA #$18
- JSL aiming
- LDA $00
- STA $1747,y
- LDA $02
- STA $173D,y
- LDA #$01
- STA $1765,y
- RTS
- .x_pos
- dw $0008,$FFF8
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; MarioE's aiming routine
- ;; Source: http://smwc.me/1057883
- recip_sqrt_lookup:
- dw $0000,$FFFF,$B505,$93CD,$8000,$727D,$6883,$60C2
- dw $5A82,$5555,$50F4,$4D30,$49E7,$4700,$446B,$4219
- dw $4000,$3E17,$3C57,$3ABB,$393E,$37DD,$3694,$3561
- dw $3441,$3333,$3235,$3144,$3061,$2F8A,$2EBD,$2DFB
- dw $2D41,$2C90,$2BE7,$2B46,$2AAB,$2A16,$2987,$28FE
- dw $287A,$27FB,$2780,$270A,$2698,$262A,$25BF,$2557
- dw $24F3,$2492,$2434,$23D9,$2380,$232A,$22D6,$2285
- dw $2236,$21E8,$219D,$2154,$210D,$20C7,$2083,$2041
- dw $2000,$1FC1,$1F83,$1F46,$1F0B,$1ED2,$1E99,$1E62
- dw $1E2B,$1DF6,$1DC2,$1D8F,$1D5D,$1D2D,$1CFC,$1CCD
- dw $1C9F,$1C72,$1C45,$1C1A,$1BEF,$1BC4,$1B9B,$1B72
- dw $1B4A,$1B23,$1AFC,$1AD6,$1AB1,$1A8C,$1A68,$1A44
- dw $1A21,$19FE,$19DC,$19BB,$199A,$1979,$1959,$1939
- dw $191A,$18FC,$18DD,$18C0,$18A2,$1885,$1869,$184C
- dw $1831,$1815,$17FA,$17DF,$17C5,$17AB,$1791,$1778
- dw $175F,$1746,$172D,$1715,$16FD,$16E6,$16CE,$16B7
- dw $16A1,$168A,$1674,$165E,$1648,$1633,$161D,$1608
- dw $15F4,$15DF,$15CB,$15B7,$15A3,$158F,$157C,$1568
- dw $1555,$1542,$1530,$151D,$150B,$14F9,$14E7,$14D5
- dw $14C4,$14B2,$14A1,$1490,$147F,$146E,$145E,$144D
- dw $143D,$142D,$141D,$140D,$13FE,$13EE,$13DF,$13CF
- dw $13C0,$13B1,$13A2,$1394,$1385,$1377,$1368,$135A
- dw $134C,$133E,$1330,$1322,$1315,$1307,$12FA,$12ED
- dw $12DF,$12D2,$12C5,$12B8,$12AC,$129F,$1292,$1286
- dw $127A,$126D,$1261,$1255,$1249,$123D,$1231,$1226
- dw $121A,$120F,$1203,$11F8,$11EC,$11E1,$11D6,$11CB
- dw $11C0,$11B5,$11AA,$11A0,$1195,$118A,$1180,$1176
- dw $116B,$1161,$1157,$114D,$1142,$1138,$112E,$1125
- dw $111B,$1111,$1107,$10FE,$10F4,$10EB,$10E1,$10D8
- dw $10CF,$10C5,$10BC,$10B3,$10AA,$10A1,$1098,$108F
- dw $1086,$107E,$1075,$106C,$1064,$105B,$1052,$104A
- dw $1042,$1039,$1031,$1029,$1020,$1018,$1010,$1008
- aiming:
- PHX
- PHY
- PHP
- SEP #$30
- STA $0F
- LDX #$00
- REP #$20
- LDA $00
- BPL .pos_dx
- EOR #$FFFF
- INC
- INX
- INX
- STA $00
- .pos_dx SEP #$20
- STA $4202
- STA $4203
- NOP
- NOP
- NOP
- REP #$20
- LDA $4216
- STA $04
- LDA $02
- BPL .pos_dy
- EOR #$FFFF
- INC
- INX
- STA $02
- .pos_dy SEP #$20
- STA $4202
- STA $4203
- STX $0E
- REP #$30
- LDA $04
- CLC
- ADC $4216
- LDY #$0000
- BCC .loop
- INY
- ROR
- LSR
- .loop CMP #$0100
- BCC +
- INY
- LSR
- LSR
- BRA .loop
- + CLC
- ASL
- TAX
- LDA recip_sqrt_lookup,x
- - DEY
- BMI +
- LSR
- BRA -
- + SEP #$30
- STA $4202
- LDA $0F
- STA $4203
- NOP
- STZ $05
- STZ $07
- LDA $4217
- STA $04
- XBA
- STA $4202
- LDA $0F
- STA $4203
- REP #$20
- LDA $04
- CLC
- ADC $4216
- STA $04
- SEP #$20
- LDX #$02
- - LDA $04
- STA $4202
- LDA $00,x
- STA $4203
- NOP
- NOP
- NOP
- NOP
- LDA $4217
- STA $06
- LDA $05
- STA $4202
- LDA $00,x
- STA $4203
- REP #$20
- LDA $06
- CLC
- ADC $4216
- SEP #$20
- LSR $0E
- BCS +
- EOR #$FF
- INC
- + STA $00,x
- DEX
- DEX
- BPL -
- PLP
- PLY
- PLX
- RTL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Graphics routine
- SubGfx:
- JSR GET_DRAW_INFO
- LDA $157C,x
- ASL : ASL
- STA $02
- LDA $1602,x
- CMP #$02
- BNE +
- LDA #$04
- STA $02
- LDA $1602,x
- + ASL : ASL
- STA $03
- LDA $15F6,x
- STA $04
- STZ $05
- LDA $AA,x
- BMI +
- LDA $14C8,x
- CMP #$07
- BCS +
- STA $05
- + PHX
- LDX #$03
- - PHX
- TXA
- CLC
- ADC $02
- TAX
- LDA $00
- CLC
- ADC .xpos,x
- STA $0300,y
- PLX
- LDA .ypos,x
- PHX
- LDX $05
- BEQ +
- EOR #$FF
- INC
- CLC
- ADC #$F0
- + PLX
- CLC
- ADC $01
- STA $0301,y
- PHX
- TXA
- CLC
- ADC $03
- TAX
- LDA .tilemap,x
- STA $0302,y
- LDA .properties,x
- PHX
- LDX $02
- BNE +
- ORA #$40
- + LDX $05
- BEQ +
- ORA #$80
- +
- PLX
- ORA $04
- ORA $64
- STA $0303,y
- PLX
- INY : INY
- INY : INY
- DEX
- BPL -
- PLX
- LDY #$02
- LDA #$03
- JSL $01B7B3
- RTS
- .tilemap
- db $40,$42,$60,$62
- db $44,$46,$64,$66
- db $28,$28,$48,$48
- .xpos
- db $08,$F8,$08,$F8
- db $F8,$08,$F8,$08
- .ypos
- db $F0,$F0,$00,$00
- .properties
- db $00,$00,$00,$00
- db $00,$00,$00,$00
- db $00,$40,$00,$40
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; GET_DRAW_INFO
- ; This is a helper for the graphics routine. It sets off screen flags, and sets up
- ; variables. It will return with the following:
- ;
- ; Y = index to sprite OAM ($300)
- ; $00 = sprite x position relative to screen boarder
- ; $01 = sprite y position relative to screen boarder
- ;
- ; It is adapted from the subroutine at $03B760
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPR_T1: db $0C,$1C
- SPR_T2: db $01,$02
- GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
- STZ $15A0,x ; reset sprite offscreen flag, horizontal
- LDA $E4,x ; \
- CMP $1A ; | set horizontal offscreen if necessary
- LDA $14E0,x ; |
- SBC $1B ; |
- BEQ ON_SCREEN_X ; |
- INC $15A0,x ; /
- ON_SCREEN_X: LDA $14E0,x ; \
- XBA ; |
- LDA $E4,x ; |
- REP #$20 ; |
- SEC ; |
- SBC $1A ; | mark sprite invalid if far enough off screen
- CLC ; |
- ADC.w #$0040 ; |
- CMP.w #$0180 ; |
- SEP #$20 ; |
- ROL A ; |
- AND #$01 ; |
- STA $15C4,x ; /
- BNE INVALID ;
- LDY #$00 ; \ set up loop:
- LDA $1662,x ; |
- AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
- BEQ ON_SCREEN_LOOP ; | else, go through loop once
- INY ; /
- ON_SCREEN_LOOP: LDA $D8,x ; \
- CLC ; | set vertical offscreen if necessary
- ADC SPR_T1,y ; |
- PHP ; |
- CMP $1C ; | (vert screen boundry)
- ROL $00 ; |
- PLP ; |
- LDA $14D4,x ; |
- ADC #$00 ; |
- LSR $00 ; |
- SBC $1D ; |
- BEQ ON_SCREEN_Y ; |
- LDA $186C,x ; | (vert offscreen)
- ORA SPR_T2,y ; |
- STA $186C,x ; |
- ON_SCREEN_Y: DEY ; |
- BPL ON_SCREEN_LOOP ; /
- LDY $15EA,x ; get offset to sprite OAM
- LDA $E4,x ; \
- SEC ; |
- SBC $1A ; | $00 = sprite x position relative to screen boarder
- STA $00 ; /
- LDA $D8,x ; \
- SEC ; |
- SBC $1C ; | $01 = sprite y position relative to screen boarder
- STA $01 ; /
- RTS ; return
- INVALID: PLA ; \ return from *main gfx routine* subroutine...
- PLA ; | ...(not just this subroutine)
- RTS ; /
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SUB_OFF_SCREEN
- ; This subroutine deals with sprites that have moved off screen
- ; It is adapted from the subroutine at $01AC0D
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPR_T12: db $40,$B0
- SPR_T13: db $01,$FF
- SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
- db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
- SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
- db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
- SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
- BRA STORE_03 ; | (table entry to use on horizontal levels)
- SUB_OFF_SCREEN_X2: LDA #$04 ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X3: LDA #$06 ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X4: LDA #$08 ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X5: LDA #$0A ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X6: LDA #$0C ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X7: LDA #$0E ; |
- STORE_03: STA $03 ; |
- BRA START_SUB ; |
- SUB_OFF_SCREEN_X0: STZ $03 ; /
- START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
- BEQ RETURN_35 ; /
- LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
- AND #$01 ; |
- BNE VERTICAL_LEVEL ; /
- LDA $D8,x ; \
- CLC ; |
- ADC #$30 ; | if the sprite has gone off the bottom of the level...
- LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
- ADC #$00 ; |
- CMP #$02 ; |
- BPL ERASE_SPRITE ; / ...erase the sprite
- LDA $167A,x ; \ if "process offscreen" flag is set, return
- AND #$04 ; |
- BNE RETURN_35 ; /
- LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
- AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
- ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
- STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
- TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
- LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
- CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
- ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
- ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
- CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
- PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
- LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
- LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
- ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
- PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
- SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
- STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
- LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
- BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
- EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
- STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
- SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
- BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
- ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
- CMP #$08 ; |
- BCC KILL_SPRITE ; /
- LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
- CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
- BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
- LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
- STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
- KILL_SPRITE: STZ $14C8,x ; erase sprite
- RETURN_35: RTS ; return
- VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, return
- AND #$04 ; |
- BNE RETURN_35 ; /
- LDA $13 ; \
- LSR A ; |
- BCS RETURN_35 ; /
- LDA $E4,x ; \
- CMP #$00 ; | if the sprite has gone off the side of the level...
- LDA $14E0,x ; |
- SBC #$00 ; |
- CMP #$02 ; |
- BCS ERASE_SPRITE ; / ...erase the sprite
- LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
- LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
- AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
- STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
- TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
- LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
- CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
- ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
- ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
- CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
- PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
- LDA.w $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
- LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
- ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
- PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
- SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
- STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
- LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
- BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
- EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
- STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
- SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
- BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
- BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
- SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
- ORA $186C,x ; |
- RTS ; / return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SubHorzPos
- ; This routine determines which side of the sprite Mario is on. It sets the Y register
- ; to the direction such that the sprite would face Mario
- ; It is ripped from $03B817
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B817
- SubHorzPos:
- LDY #$00
- LDA $94
- SEC
- SBC $E4,x
- STA $0F
- LDA $95
- SBC $14E0,x
- BPL .Return
- INY
- .Return
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SubVertPos
- ; This routine determines if Mario is above or below the sprite. It sets the Y register
- ; to the direction such that the sprite would face Mario
- ; It is ripped from $03B829
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B817
- SubVertPos:
- LDY #$00
- LDA $D3
- SEC
- SBC $D8,x
- STA $0F
- LDA $D4
- SBC $14D4,x
- BPL .Return
- INY
- .Return
- RTS
Add Comment
Please, Sign In to add comment