Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;~@sa1 <-- DO NOT REMOVE THIS LINE!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Shy Guy, by mikeyk
- ;;
- ;; Description: A Shy Guy with many available configurations.
- ;; Naaaaah, it's a giant giant giant friendly mega mole!
- ;; NOTE that graphics are not made by me.
- ;; Use the provided patch.
- ;;
- ;; Note: When rideable, clipping tables values should be: 03 0A FE 0E
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Uses first extra bit: NO
- ;;
- ;; Extra Property Byte 1
- ;; bit 0 - enable spin killing
- ;; bit 1 - stay on ledges
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- EXTRA_PROP_1 = $400057
- RAM_ADDRESS = $C2 ; !ramaddress of the patch
- !RAM_CustSprClip = $6000 ; 22 bytes of free RAM used for the custom sprite clipping value
- !RAM_SprClipXDisp = $6099 ; 22 bytes of free RAM used for the X displacement of a custom sprite clipping field
- !RAM_SprClipYDisp = $60AF ; 22 bytes of free RAM used for the Y displacement of a custom sprite clipping field
- !RAM_SprClipWidth = $60C5 ; 22 bytes of free RAM used for the width of a custom sprite clipping field
- !RAM_SprClipHeight = $60DB ; 22 bytes of free RAM used for the height of a custom sprite clipping field
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; sprite init JSL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- print "INIT ", pc
- PHY
- JSR SUB_HORZ_POS
- TYA
- STA $3334,x
- PLY
- LDA $334A,x ; if on the ground, reset the turn counter
- ORA #$04
- STA $334A,x ; if on the ground, reset the turn counter
- LDA #$00 ; use index 0 of table of objectclipping patch, good object clipping values for this sprite is in it.
- STA RAM_ADDRESS,x
- LDA #$00
- STA !RAM_CustSprClip
- RTL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; sprite code JSL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- print "MAIN ", pc
- PHB ; \
- PHK ; | main sprite function, just calls local subroutine
- PLB ; |
- JSR SPRITE_CODE_START ; |
- PLB ; |
- RTL ; /
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; sprite main code
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPRITE_GRAVITY = $20
- X_SPEED: db $18,$E6
- KILLED_X_SPEED: db $F0,$10
- RETURN1: RTS
- SPRITE_CODE_START: LDA #$25
- STA $7DF9
- JSR SPRITE_GRAPHICS ; graphics routine
- JSR SUB_OFF_SCREEN_X3 ; handle off screen situation
- LDA $3242,x ; \
- CMP #$08 ; ; \ if sprites locked, return
- BNE RETURN1 ; /
- LDA $9D
- BNE RETURN1
- LDA $14
- AND #$35 ; how many frames to wait before checking Mario's direction (valid: 0,1,3,7,F,1F,3F,7F,FF)
- BNE .noTurn
- %SubHorzPos()
- TYA
- STA !157C,x ;new direction
- .noTurn
- LDA $334A,x ; \ if sprite is in contact with an object...
- AND #$03 ; |
- BEQ NO_OBJ_CONTACT ; |
- LDA $3334,x ; | flip the direction status
- EOR #$01 ; |
- STA $3334,x ; /
- NO_OBJ_CONTACT: LDA EXTRA_PROP_1,x ; don't stay on ledges if bit is set
- AND #$02 ;
- BEQ FALLING ;
- LDA $334A,x ; run the subroutine if the sprite is in the air...
- ORA $3284,x ; ...and not already turning
- BNE ON_GROUND ;
- JSR SUB_CHANGE_DIR ;
- LDA #$01 ; set that we're already turning
- STA $3284,x ;
- ON_GROUND: LDA $334A,x ; if on the ground, reset the turn counter
- AND #$04
- BEQ IN_AIR
- STZ $3284,x
- STZ $9E,x
- BRA X_TIME
- FALLING: LDA $334A,x ; if on the ground, reset the turn counter
- AND #$04
- BEQ IN_AIR
- LDA #$10 ; \ y speed = 10
- STA $9E,x ; /
- X_TIME:
- LDY $3334,x ; \ set x speed based on direction
- LDA X_SPEED,y ; |
- STA $B6,x ; /
- IN_AIR: JSL $01802A ; update position based on speed values
- DONE_WITH_SPEED: JSL $018032 ; interact with sprites ; return if no contact
- JSL $01A7DC ; check for mario/sprite contact (carry set = contact)
- BCC RETURN_24B
- JSR SUB_VERT_POS ;
- LDA $0E ; \ if mario isn't above sprite, and there's vertical contact...
- CMP #$E6 ; | ... sprite wins
- BPL SPRITE_WINS ; /
- LDA $7D ; \if mario speed is upward, return
- BMI RETURN_24B ; /
- LDA EXTRA_PROP_1,x
- AND #$01
- BEQ SPIN_KILL_DISABLED ;
- LDA $740D ; \ if mario is spin jumping, goto SPIN_KILL
- BNE SPIN_KILL ; /
- SPIN_KILL_DISABLED:
- LDA #$01 ; \ set "on sprite" flag
- STA $7471 ; /
- LDA #$06 ; \ set riding sprite
- STA $32DC,x ; /
- STZ $7D ; y speed = 0
- LDA #$E1
- LDY $787A ; | mario's y position += E1 or D1 depending if on yoshi
- BEQ NO_YOSHI ; |
- LDA #$D1 ; |
- NO_YOSHI: CLC ; |
- ADC $3216,x ; |
- STA $96 ; |
- LDA $3258,x ; |
- ADC #$FF ; |
- STA $97 ; /
- LDY #$00 ; \
- LDA $7491 ; | $1491 == 01 or FF, depending on direction
- BPL LABEL9 ; | set mario's new x position
- DEY ; |
- LABEL9: CLC ; |
- ADC $94 ; |
- STA $94 ; |
- TYA ; |
- ADC $95 ; |
- STA $95 ; /
- RETURN_24B: RTS ;
- SPRITE_WINS: LDA #$25
- STA $7DF9
- LDA $32DC,x ; \ if riding sprite...
- ORA $754C,x ; | ...or sprite being eaten...
- BNE RETURN ; / ...return
- LDA $7490 ; \ if mario star timer > 0, goto HAS_STAR
- BNE HAS_STAR ; / NOTE: branch to HAS_STAR to enable star killing
- JSL $00F5B7 ; hurt mario>>>>>NOOOO!YOURE FRIENDLY!
- RETURN_24: RTS
- SPIN_KILL: JSR SUB_STOMP_PTS ; give mario points
- JSL $01AA33 ; set mario speed, NOTE: remove call to not bounce off sprite
- JSL $01AB99 ; display contact graphic
- LDA #$04 ; \ status = 4 (being killed by spin jump)
- STA $3242,x ; /
- LDA #$1F ; \ set spin jump animation timer
- STA $32C6,x ; /
- JSL $07FC3B ; show star animation
- LDA #$08 ; \ play sound effect
- STA $7DF9 ; /
- RTS ; return
- HAS_STAR: LDA #$02 ; \ status = 2 (being killed by star)
- STA $3242,x ; /
- LDA #$D0 ; \ set y speed
- STA $9E,x ; /
- JSR SUB_HORZ_POS ; get new direction
- LDA KILLED_X_SPEED,y ; \ set x speed based on direction
- STA $B6,x ; /
- INC $78D2 ; increment number consecutive enemies killed
- LDA $78D2 ; \
- CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
- BCC NO_RESET2 ; |
- LDA #$08 ; |
- STA $78D2 ; /
- NO_RESET2: JSL $02ACE5 ; give mario points
- LDY $78D2 ; \
- CPY #$08 ; | if consecutive enemies stomped < 8 ...
- BCS RETURN ; |
- LDA STAR_SOUNDS,y ; | ... play sound effect
- STA $7DF9 ; /
- RETURN: RTS ; final return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; sprite graphics routine
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;===== TILE MAP AND X,Y DISPLACEMENT ======================================;
- ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;10 ;11 ;12 ;13 ;14 ;15 ;16
- TILEMAP: db $80,$82,$84,$86,$A0,$A2,$A4,$A6,$C0,$C2,$C4,$C6,$E0,$E2,$E4,$E6 ;1st frame of animation
- db $88,$8A,$8C,$8E,$A8,$AA,$AC,$AE,$C8,$CA,$CC,$CE,$E8,$EA,$EC,$EE ;2nd frame of animation
- db $86,$84,$82,$80,$A6,$A4,$A2,$A0,$C6,$C4,$C2,$C0,$E6,$E4,$E2,$E0 ;1st frame of animation (reverse)
- db $8E,$8C,$8A,$88,$AE,$AC,$AA,$A8,$CE,$CC,$CA,$C8,$EE,$EC,$EA,$E8 ;2nd frame of animation (reverse)
- XDISP: db $F3,$03,$13,$23,$F3,$03,$13,$23,$F3,$03,$13,$23,$F3,$03,$13,$23 ;1st frame of animation
- YDISP: db $F8,$F8,$F8,$F8,$08,$08,$08,$08,$18,$18,$18,$18,$28,$28,$28,$28 ;1st frame of animation
- ;==========================================================================;
- SPRITE_GRAPHICS:
- JSR GET_DRAW_INFO
- LDA $13
- LSR ;\ A
- AND #$04 ; | N
- ASL ; | I
- ASL ; | MATION
- PHA
- LDA $3334,x
- STA $02
- BNE IHAS
- PLA
- CLC
- ADC #$20
- BRA PLOP
- IHAS:
- PLA
- PLOP:
- STA $03 ;/
- LDX #$00 ;Reset OAM
- OAM_Loop:
- LDA $00
- CLC
- ADC XDISP,x
- STA $6300,y ;Xpos
- LDA $01
- CLC
- ADC YDISP,x
- STA $6301,y ;Ypos
- PHX
- TXA
- CLC
- ADC $03
- TAX
- LDA TILEMAP,x
- STA $6302,y
- LDX $75E9 ;
- LDA $33B8,x ; get palette info
- LDX $02
- BNE CHEEZBURGR
- ORA #$40
- CHEEZBURGR:
- PLX
- ORA $64
- STA $6303,y ;Properties
- INY
- INY
- INY
- INY
- INX
- CPX #$10
- BNE OAM_Loop
- LDX $75E9 ;Restore sprite index
- LDY #$02 ;16x16
- LDA #$0F ;Number of tiles to draw - 1 (0F)
- JSL $01B7B3 ;Finish OAM Write
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SUB_CHANGE_DIR
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $019098
- SUB_CHANGE_DIR:
- LDA $15AC,x
- BNE LABEL41
- LDA #$08
- STA $15AC,x
- LDA $B6,x
- EOR #$FF
- INC A
- STA $B6,x
- LDA $3334,x
- EOR #$01
- STA $3334,x
- LABEL41: RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; routines below can be shared by all sprites. they are ripped from original
- ; SMW and poorly documented
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; points routine
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- STAR_SOUNDS: db $00,$13,$14,$15,$16,$17,$18,$19
- SUB_STOMP_PTS: PHY ;
- LDA $7697 ; \
- CLC ; |
- ADC $758E,x ; / some enemies give higher pts/1ups quicker??
- INC $7697 ; increase consecutive enemies stomped
- TAY ;
- INY ;
- CPY #$08 ; \ if consecutive enemies stomped >= 8 ...
- BCS NO_SOUND ; / ... don't play sound
- LDA STAR_SOUNDS,y ; \ play sound effect
- STA $7DF9 ; /
- NO_SOUND: TYA ; \
- CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
- BCC NO_RESET ; |
- LDA #$08 ; /
- NO_RESET: JSL $02ACE5 ; give mario points
- PLY ;
- RTS ; return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B760 - graphics routine helper - shared
- ; sets off screen flags and sets index to OAM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B75C
- TABLE1: db $0C,$1C
- TABLE2: db $01,$02
- GET_DRAW_INFO: STZ $7642,x ; reset sprite offscreen flag, vertical
- STZ $3376,x ; reset sprite offscreen flag, horizontal
- LDA $322C,x ; \
- CMP $1A ; | set horizontal offscreen if necessary
- LDA $326E,x ; |
- SBC $1B ; |
- BEQ ON_SCREEN_X ; |
- INC $3376,x ; /
- ON_SCREEN_X: LDA $326E,x ; \
- XBA ; |
- LDA $322C,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 $7536,x ; /
- BNE INVALID ;
- LDY #$00 ; \ set up loop:
- LDA $75EA,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 $3216,x ; \
- CLC ; | set vertical offscreen if necessary
- ADC TABLE1,y ; |
- PHP ; |
- CMP $1C ; | (vert screen boundry)
- ROL $00 ; |
- PLP ; |
- LDA $3258,x ; |
- ADC #$00 ; |
- LSR $00 ; |
- SBC $1D ; |
- BEQ ON_SCREEN_Y ; |
- LDA $7642,x ; | (vert offscreen)
- ORA TABLE2,y ; |
- STA $7642,x ; |
- ON_SCREEN_Y: DEY ; |
- BPL ON_SCREEN_LOOP ; /
- LDY $33A2,x ; get offset to sprite OAM
- LDA $322C,x ; \
- SEC ; |
- SBC $1A ; | $00 = sprite x position relative to screen boarder
- STA $00 ; /
- LDA $3216,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 ; /
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B829 - vertical mario/sprite position check - shared
- ; Y = 1 if mario below sprite??
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B829
- SUB_VERT_POS: LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
- LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
- SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
- SBC $3216,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
- STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
- LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
- SBC $3258,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
- BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
- INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
- LABEL11: RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B817 - horizontal mario/sprite check - shared
- ; Y = 1 if mario left of sprite??
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B817
- SUB_HORZ_POS: LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
- LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
- SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
- SBC $322C,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
- STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
- LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
- SBC $326E,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
- BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
- INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
- LABEL16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B85D - off screen processing code - shared
- ; sprites enter at different points
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B83B
- TABLE3: db $40,$B0
- TABLE6: db $01,$FF
- TABLE4: db $30,$C0,$A0,$80,$A0,$40,$60,$B0
- TABLE5: db $01,$FF,$01,$FF,$01,$00,$01,$FF
- SUB_OFF_SCREEN_X0: LDA #$06 ; \ entry point of routine determines value of $03
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X1: LDA #$04 ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X2: LDA #$02 ; |
- STORE_03: STA $03 ; |
- BRA START_SUB ; |
- SUB_OFF_SCREEN_X3: STZ $03 ; /
- START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
- BEQ RETURN_2 ; /
- LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
- AND #$01 ; |
- BNE VERTICAL_LEVEL ; /
- LDA $3216,x ; \
- CLC ; |
- ADC #$50 ; | if the sprite has gone off the bottom of the level...
- LDA $3258,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 $7616,x ; \ if "process offscreen" flag is set, return
- AND #$04 ; |
- BNE RETURN_2 ; /
- LDA $13 ; \
- AND #$01 ; |
- ORA $03 ; |
- STA $01 ; |
- TAY ; /
- LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
- CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
- ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
- ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
- CMP $322C,x ;x pos ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0364 VC:090 00 FL:16953
- PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
- LDA $1B ;x boundry hi ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizCHC:0416 VC:090 00 FL:16953
- LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
- ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
- PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
- SBC $326E,x ;x pos high ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0538 VC:090 00 FL:16953
- STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
- LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
- BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
- EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
- STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
- LABEL20: LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
- BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
- ERASE_SPRITE: LDA $3242,x ; \ if sprite status < 8, permanently erase sprite
- CMP #$08 ; |
- BCC KILL_SPRITE ; /
- LDY $7578,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
- CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
- BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
- LDA #$00 ; \ mark sprite to come back A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0204 VC:071 00 FL:21152
- PHX
- TYX
- STA $418A00,x
- PLX ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
- KILL_SPRITE: STZ $3242,x ; erase sprite
- RETURN_2: RTS ; return
- VERTICAL_LEVEL: LDA $7616,x ; \ if "process offscreen" flag is set, return
- AND #$04 ; |
- BNE RETURN_2 ; /
- LDA $13 ; \ only handle every other frame??
- LSR A ; |
- BCS RETURN_2 ; /
- AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
- STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
- TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
- LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
- CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
- ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
- ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
- CMP $3216,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
- PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
- LDA.W $301D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
- LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
- ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
- PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
- SBC $3258,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
- STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
- LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
- BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
- EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
- STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
- LABEL22: LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
- BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
- BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
- SUB_IS_OFF_SCREEN: LDA $3376,x ; \ if sprite is on screen, accumulator = 0
- ORA $7642,x ; |
- RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement