Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- print "INIT ",pc
- STZ !1510,x
- STZ !151C,x
- STZ $05
- PHX
- DEX
- -
- LDA !14C8,x
- BNE +
- INC $05
- BRA ++
- +
- DEX
- BPL -
- ++
- PLX
- ;try to force sprite into a lower slot
- LDA $05
- BEQ +
- PHX
- INX
- -
- LDA !14C8,x
- BNE ++
- LDA #$FF
- STA !14C8,x
- ++
- INX
- CPX #!SprSize
- BNE -
- PLX
- +
- LDA #$00
- JSR GetExtraByte
- STA $04
- stz $00
- stz $01
- stz $02
- stz $03
- lda !extra_bits,x ;\
- and #$04 ;| Extra bit set = custom
- lsr #3 ;/
- LDA $04
- %SpawnSprite()
- bcc + ;\
- stz !14C8,x ;| If spawn failed, kill the sprite.
- rtl ;/
- +
- tya
- sta !1504,x
- LDA #$03
- JSR GetExtraByte
- and #$0F ;| Set the sprite state
- beq + ;|
- sta !14C8,y ;/
- +
- LDA #$03
- JSR GetExtraByte
- bpl + ;|
- tyx ;|
- lda !extra_bits,x ;| Set the extra bit
- ora #$04 ;|
- sta !extra_bits,x ;|
- ldx $15E9|!Base2 ;/
- +
- ;lda #$01 ;\ Disable object interaction
- ;sta !15DC,y ;/
- ;restore sprite slots
- LDA $05
- BEQ +
- PHX
- INX
- -
- LDA !14C8,x
- CMP #$FF
- BNE ++
- STZ !14C8,x
- ++
- INX
- CPX #!SprSize
- BNE -
- PLX
- +
- ;Types 1 and 4 start out activated
- LDA #$04
- JSR GetExtraByte
- and #$F0
- lsr #4
- cmp #$01
- beq .startx
- cmp #$04
- bne .nox
- .startx:
- LDA #$01
- STA !1510,x
- .nox:
- LDA #$04
- JSR GetExtraByte
- and #$0F
- cmp #$01
- beq .starty
- cmp #$04
- bne .noy
- .starty:
- LDA #$01
- STA !151C,x
- .noy:
- rtl
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; MAIN
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- print "MAIN ",pc
- phb : phk : plb : jsr Main : plb
- rtl
- Main:
- lda $9D
- beq +
- rts
- +
- lda !1504,x
- tay
- lda !14C8,y
- bne CheckState
- Kill2:
- lda #$00 ;\ Re-enable object interaction.
- sta !15DC,y ;/
- Kill:
- stz !14C8,x
- lda #$FF ;\ Make it not respawn.
- sta !161A,x ;/
- rts
- CheckState:
- cmp #$02 ;\
- bcc Alive ;| If the sprite is dead, kill this one too.
- cmp #$07 ;|
- bcc Kill ;/
- cmp #$0B ;\
- beq Kill2 ;| If Mario or Yoshi grabbed the sprite,
- cmp #$07 ;| make it interact with objects and kill this sprite.
- beq Kill2 ;/
- lda !15D0,y ;\ If on Yoshi's tongue, kill.
- bne Kill2 ;/
- ldx #!SprSize-1 ;\
- - lda !14C8,x ;|
- cmp #$08 ;|
- bcc + ;|
- lda !9E,x ;|
- cmp #$2D ;|
- bne + ;| If the sprite is being eaten by Baby Yoshi, kill.
- tya ;|
- cmp !160E,x ;|
- bne + ;|
- ldx $15E9|!Base2 ;|
- bra Kill ;|
- + dex ;|
- bpl - ;|
- ldx $15E9|!Base2 ;/
- Alive:
- lda.w !9E,y ;\
- cmp #$35 ;| If it's Yoshi and he's not idle anymore,
- bne + ;| kill this sprite and enable object interaction for Yoshi.
- lda.w !C2,y ;|
- bne Kill2 ;/
- +
- lda $14AE|!Base2 ;\
- beq + ;|
- lda !190F,y ;|
- and #$40 ;|
- bne + ;|
- lda.w !9E,y ;| If the silver switch is active and the sprite is not a silver coin,
- cmp.b #read1($02B9DA) ;| turn it into a silver coin (if the tweaker is not set).
- bne ++ ;| This both fixes the issue where sprites spawned in the
- lda !15F6,y ;| 2 highest slots don't turn into silver coins, and
- and #$02 ;| the issue where spawning after hitting the switch
- bne + ;| wouldn't make it spawn as a silver coin.
- ++ phk ;|
- pea.w .jslrtsreturn-1 ;|
- pea.w $02B889-1 ;|
- jml $02B9D9|!BankB ;|
- .jslrtsreturn ;/
- +
- ;Run X lock routines
- LDA #$04
- JSR GetExtraByte
- AND #$F0
- BEQ ++
- CMP #$40
- BCS +
- JSR RelX
- BRA ++
- +
- JSR AbsX
- ++
- ;Run Y lock routines
- LDA #$04
- JSR GetExtraByte
- AND #$0F
- BEQ ++
- CMP #$04
- BCS +
- JSR RelY
- BRA ++
- +
- JSR AbsY
- ++
- ;Move wrapper with sprite
- lda.w !E4,y
- sta !E4,x
- lda !14E0,y
- sta !14E0,x
- lda.w !D8,y
- sta !D8,x
- lda !14D4,y
- sta !14D4,x
- rts
- print "relx", pc
- RelX:
- LDA #$01
- JSR GetExtraByte
- STA $00
- STZ $01
- LDA !1510,x
- BNE .Active
- LDA !14E0,y
- XBA
- LDA !E4,y
- REP #$20
- SEC
- SBC $1A
- SEC
- SBC $00
- CLC
- ADC #$0004
- CMP #$0008
- SEP #$20
- BCS .NotReady
- LDA #$01
- STA !1510,x
- BRA .Active
- .NotReady:
- REP #$20
- STA $0C
- LDA $00
- PHA
- SEP #$20
- LDA #$04
- JSR GetExtraByte
- AND #$F0
- CMP #$30
- BNE +
- LDA #$01
- STA !151C,x
- REP #$20
- PLA
- STA $00
- LDA #$0000
- BRA .SetPos
- +
- REP #$20
- PLA
- STA $00
- LDA $0C
- SEC
- SBC #$0004
- BMI +
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BRA ++
- +
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- ++
- .SetPos:
- CLC
- ADC $1A
- CLC
- ADC $00
- SEP #$20
- STA !E4,y
- XBA
- STA !14E0,y
- LDA #$00
- STA !B6,y
- RTS
- .Active:
- PHX
- TYX
- LDY #$00
- LDA $17BD|!Base2 ; move sprite with screen X
- BPL +
- DEY
- + CLC : ADC !E4,x
- STA !E4,x
- TYA
- ADC !14E0,x
- STA !14E0,x
- TXY
- PLX
- RTS
- RelY:
- LDA #$02
- JSR GetExtraByte
- STA $00
- STZ $01
- LDA !151C,x
- BNE .Active
- LDA !14D4,y
- XBA
- LDA !D8,y
- REP #$20
- SEC
- SBC $1C
- SEC
- SBC $00
- CLC
- ADC #$0004
- CMP #$0008
- SEP #$20
- BCS .NotReady
- LDA #$01
- STA !151C,x
- BRA .Active
- .NotReady:
- REP #$20
- STA $0C
- LDA $00
- PHA
- SEP #$20
- LDA #$04
- JSR GetExtraByte
- AND #$0F
- CMP #$03
- BNE +
- LDA #$01
- STA !151C,x
- REP #$20
- PLA
- STA $00
- LDA #$0000
- BRA .SetPos
- +
- REP #$20
- PLA
- STA $00
- LDA $0C
- SEC
- SBC #$0004
- BMI +
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BRA ++
- +
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- ++
- .SetPos:
- CLC
- ADC $1C
- CLC
- ADC $00
- SEP #$20
- STA !D8,y
- XBA
- STA !14D4,y
- LDA #$00
- STA !AA,y
- RTS
- .Active:
- PHX
- TYX
- LDY #$00
- LDA $17BC|!Base2 ; move sprite with screen Y
- BPL ++
- DEY
- ++ CLC : ADC !D8,x
- STA !D8,x
- TYA
- ADC !14D4,x
- STA !14D4,x
- TXY
- PLX
- RTS
- AbsX:
- LDA #$01
- JSR GetExtraByte
- STA $00
- STZ $01
- LDA !1510,x
- BNE .Active
- LDA !14E0,y
- XBA
- LDA !E4,y
- REP #$20
- SEC
- SBC $1A
- SEC
- SBC $00
- CLC
- ADC #$0004
- CMP #$0008
- SEP #$20
- BCS .NotReady
- LDA #$01
- STA !1510,x
- BRA .Active
- .NotReady:
- REP #$20
- SEC
- SBC #$0004
- BMI +
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BRA ++
- +
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- ++
- .SetPos:
- CLC
- ADC $1A
- CLC
- ADC $00
- SEP #$20
- STA !E4,y
- XBA
- STA !14E0,y
- LDA #$00
- STA !B6,y
- RTS
- .Active:
- REP #$20
- LDA #$0000
- BRA .SetPos
- AbsY:
- LDA #$02
- JSR GetExtraByte
- STA $00
- STZ $01
- LDA !151C,x
- BNE .Active
- LDA !14D4,y
- XBA
- LDA !D8,y
- REP #$20
- SEC
- SBC $1C
- SEC
- SBC $00
- CLC
- ADC #$0004
- CMP #$0008
- SEP #$20
- BCS .NotReady
- LDA #$01
- STA !151C,x
- BRA .Active
- .NotReady:
- REP #$20
- SEC
- SBC #$0004
- BMI +
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BEQ ++
- DEC
- BRA ++
- +
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- BEQ ++
- INC
- ++
- .SetPos:
- CLC
- ADC $1C
- CLC
- ADC $00
- SEP #$20
- STA !D8,y
- XBA
- STA !14D4,y
- LDA #$00
- STA !AA,y
- RTS
- .Active:
- REP #$20
- LDA #$0000
- BRA .SetPos
- GetExtraByte:
- PHY
- TAY
- LDA !extra_byte_1,x
- STA $00
- LDA !extra_byte_2,x
- STA $01
- LDA !extra_byte_3,x
- STA $02
- LDA [$00],y
- PLY
- RTS
Add Comment
Please, Sign In to add comment