Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; ;
- ; ***Sledge Brother*** ;
- ; Author of Sprite: Schwa ;
- ; Original Sprite: mikeyk ;
- ; ;
- ; What this does: ;
- ; He throws hammers at Mario, occasionally jumping into the air. ;
- ; ;
- ; This sprite will shake the ground whenever he falls and lands on it, stunning ;
- ; Mario if he's on the ground. He also takes two stomps to defeat-- the first stomp ;
- ; will knock him backwards, the second will defeat him. ;
- ; ;
- ; Extra Bit Clear: ;
- ; He throws 1 hammer at a time like a normal Hammer Bro. ;
- ; ;
- ; Extra Bit Set: ;
- ; He throws hammers 3 at a time. The throw formation is of a triangle shape, and ;
- ; they cover the inside of his arc unlike before, so the only reliable way to dodge ;
- ; is by weaving in-between the hammers. ;
- ; ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;
- ; variables and Ram ;
- ;;;;;;;;;;;;;;;;;;;;;
- r_JUMP = $163E
- r_THROW = $1504
- r_HP = $1528
- r_FLASH = $1534
- r_BIT = $7FAB10
- v_STUN = $38
- v_FLASHTIME = $6F
- v_HIT_YSPD = $D8
- v_HIT_SFX = $20
- v_SHOW_HMR = $20 ;time to display the hammer before it is thrown
- v_HAMMER_TILE = $6D
- t_XSPEED:
- dcb $00,$FC,$00,$04 ;rest at bottom, moving up, rest at top, moving down
- t_XSPEED_KILLED
- dcb $F0,$10 ; when killed with star
- t_TIME_IN_POS:
- dcb $48,$10,$48,$10 ;moving up, rest at top, moving down, rest at bottom
- t_UNTIL_THROW:
- dcb $43,$3C
- t_BOUNCE:
- dcb $E4,$1C ;x speed to give mario when he stomps the sprite
- t_XOFFSET_LO:
- dcb $F4,$0C
- t_XOFFSET_HI:
- dcb $FF,$00
- t_XSPEED_HAMMER:
- dcb $12,$EE,$10,$F0,$14,$EC,$1C,$E4
- t_YSPEED_HAMMER:
- dcb $D0,$D0,$D2,$D2,$C0,$C0,$C8,$C8
- t_TILEMAP:
- dcb $A6,$A9,$E0,$E1,$A6,$A9,$E3,$E4,$A6,$A7,$E0,$E1,$A6,$A7,$E3,$E4
- dcb $A6,$A9,$E0,$E1,$A6,$A9,$E3,$E4,$A6,$A7,$E0,$E1,$A6,$A7,$E3,$E4
- t_XDISP:
- dcb $FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04
- dcb $04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC
- t_YDISP:
- dcb $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
- dcb $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
- t_PROPFLASH:
- dcb $00,$02,$04,$06,$08,$0A,$0C,$0E
- t_PROPERTIES:
- dcb $40,$00 ;xyppccct format
- ;;;;;;;;;;;;;;;;
- ; init routine ;
- ;;;;;;;;;;;;;;;;
- dcb "INIT"
- JSR SUB_HORZ_POS
- TYA
- STA $157C,x
- LDA $1588,x
- ORA #$04
- STA $1588,x
- STZ $1602,x
- TXA
- AND #$03
- ;ASL A
- ;ASL A
- ASL A
- ASL A
- PHA
- ASL A
- ADC #$32
- STA r_THROW,x
- PLA
- ADC #$FE
- STA r_JUMP,x
- RTL
- ;;;;;;;;;;;;;;;;
- ; main routine ;
- ;;;;;;;;;;;;;;;;
- dcb "MAIN"
- HAMMER_BRO_JSL:
- PHB ; \
- PHK ; | main sprite function, just calls local subroutine
- PLB ; |
- JSR DecrementTimers ; |
- JSR START_HB_CODE ; |
- PLB ; |
- RTL ; /
- DecrementTimers:
- LDA $14C8,x
- CMP #$08
- BNE DoneDec2
- LDA $9D
- BNE DoneDec2
- LDA r_FLASH,x
- BEQ DoneDec1
- DEC r_FLASH,x
- DoneDec1:
- LDA r_THROW,x
- BEQ DoneDec2
- DEC r_THROW,x
- DoneDec2:
- RTS
- ;;;;;;;;;;;;;;;;;;;;
- ; main sprite code ;
- ;;;;;;;;;;;;;;;;;;;;
- STAR:
- INC r_THROW,x
- RETURN1:
- RTS
- START_HB_CODE:
- JSR SUB_GFX ; draw hammer bro gfx
- LDA $14C8,x ; \ if hammer bro status != 8...
- CMP #$02 ; | ... not (killed with spin jump [4] or star[2])
- BEQ STAR ; |
- CMP #$08 ; |
- BNE RETURN1 ; / ... return
- LDA $9D ; \ if sprites locked...
- BNE RETURN1 ; / ... return
- JSR SUB_HORZ_POS ; \ always face mario
- TYA ; |
- STA $157C,x ; /
- JSR SUB_OFF_SCREEN_X3 ; only process hammer bro while on screen
- INC $1570,x ; increment number of frames hammer bro has been on screen
- LDA $1570,x ; \ calculate which frame to show:
- LSR A ; |
- LSR A ; |
- LSR A ; |
- LSR A ; |
- AND #$01 ; | update every 16 cycles if normal
- STA $1602,x ; / write frame to show
- LDA r_THROW,x ; \ if time until spit >= $10
- CMP #v_SHOW_HMR ; | just go to normal walking code
- BCS JUMP_SPRITE ; /
- INC $1602,x
- INC $1602,x
- LDA r_THROW,x ; \ throw hammer if it's time
- BNE NO_RESET ; |
- LDY $C2,x ; |
- LDA t_UNTIL_THROW,y ; |
- STA r_THROW,x ; |
- NO_RESET:
- CMP #$01 ; |
- BNE JUMP_SPRITE ; |
- LDA $C2,x ; |
- EOR #$01 ; |
- STA $C2,x ; |
- JSR SUB_WEAPON ; /
- JUMP_SPRITE:
- LDA r_JUMP,x
- CMP #$40 ; \ just go to normal walking code
- BCS WALK_SPRITE ; /
- LDA $1602,x ; \ lock image while jumping
- ORA #$01 ; |
- STA $1602,x ; /
- INC $1540,x ; we didn't move the sprite this frame, so we don't want a decrement
- STZ $B6,x ; stop sprite from moving
- LDA r_JUMP,x
- CMP #$38
- BNE NO_JUMP2
- LDA #$B0 ; \ y speed
- STA $AA,x ; /
- BRA APPLY_SPEED
- NO_JUMP2:
- CMP #$00
- BNE APPLY_SPEED
- LDA #$FE
- STA r_JUMP,x
- BRA APPLY_SPEED
- WALK_SPRITE:
- LDA r_FLASH,x ; \ completely skip x speed code if flashing
- BNE FLASH_SPEED ; / to allow sprite to get knocked backwards
- LDA $151C,x ;
- TAY ;
- LDA $1540,x ;
- BEQ CHANGE_SPEED ;
- LDA t_XSPEED,y ; \ set x speed
- STA $B6,x ; /
- BRA APPLY_SPEED
- CHANGE_SPEED:
- LDA t_TIME_IN_POS,y
- STA $1540,x
- LDA $151C,x
- INC A
- AND #$03
- STA $151C,x
- BRA APPLY_SPEED
- FLASH_SPEED:
- LDA $1588,x ; \
- AND #$04 ; | if on the ground AND not moving upward...
- BEQ APPLY_SPEED ; |
- LDA $AA,x ; |
- BMI APPLY_SPEED ; /
- STZ $B6,x ; ...stop sprite from being knocked back
- APPLY_SPEED:
- LDA $1588,x ; push ground status so we can compare later
- PHA ;
- JSL $01802A ; update position based on speed values
- LDA $1588,x ; if on the ground now...
- AND #04 ;
- BEQ IN_AIR ;
- PLA ; ...and not on the ground before
- AND #04 ;
- BNE CHECK_TOUCH ;
- LDA #v_STUN ; \ shake ground
- STA $1887 ; /
- LDA #$09 ; \ play sound effect
- STA $1DFC ; /
- LDA $77
- AND #$04
- BEQ CHECK_TOUCH
- LDA #v_STUN ; set timer to freeze mario
- STA $18BD
- BRA CHECK_TOUCH
- IN_AIR:
- PLA
- CHECK_TOUCH:
- LDA $1588,x ; \ if hammer bro is touching the side of an object...
- AND #$03 ; |
- BEQ DONT_CHANGE_DIR ; |
- LDA $151C,x ; |
- INC A ; |
- AND #$03 ; |
- STA $151C,x ; /
- DONT_CHANGE_DIR:
- JSL $018032 ; interact with other sprites
- LDA r_FLASH,x ; \ no Mario contact allowed if flashing
- BNE NO_CONTACT ; /
- JSL $01A7DC ; \ check for mario/hammer bro contact
- BCC NO_CONTACT ; / do nothing if no contact
- BRA CONTACT
- NO_CONTACT:
- RTS ; return
- CONTACT:
- 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 RETURN2 ; /
- LDA #v_FLASHTIME ; \ prevent the Double-Edge glitch from happening
- STA $154C,x ; /
- JSR SUB_STOMP_PTS ; give mario points
- LDA $15 ; Save controller state
- PHA
- ORA #$C0 ; Set holding X/Y and A/B
- STA $15
- JSL $01AA33 ; set mario speed
- PLA
- STA $15
- JSR SUB_HORZ_POS
- TYA
- EOR #$01
- TAY
- LDA t_BOUNCE,y ; | bounce away horizontally
- STA $7B ; /
- JSL $01AB99 ; display contact graphic
- LDA r_HP,x ; \
- CMP #$02 ; | If this is the second stomp (i.e. has taken 3 or more dmg)...
- BCC STOMP1 ; /
- LDA #$02 ; \
- STA $14C8,x ; | ...kill the sprite and finish
- STZ $B6,x ; |
- STA $AA,x ; |
- RETURN2:
- RTS ; /
- SPRITE_WINS:
- LDA $154C,x ; \ if disable interaction set...
- ORA $15D0,x ; | ...or sprite being eaten...
- BNE RETURN2 ; / ...return
- LDA $1490 ; \ Branch if Mario has a star
- BNE HAS_STAR ; /
- JSL $00F5B7 ; damage Mario
- RTS
- STOMP1:
- LDA r_HP,x ; \
- CLC ; | deal 3 "damage" (applies to both stomping and fireballs)
- ADC #$03 ; |
- STA r_HP,x ; /
- LDA #v_HIT_SFX ; \ play sound effect
- STA $1DF9 ; /
- LDA #v_HIT_YSPD ; \ set y speed
- STA $AA,x ; /
- JSR SUB_HORZ_POS ; \
- LDA t_XSPEED_KILLED,y ; | set x speed
- STA $B6,x ; /
- LDA #$FE ; \ reset jump timer
- STA r_JUMP,x ; /
- LDA #$62 ; \ delay next hammer throw
- STA r_THROW,x ; /
- LDA #v_FLASHTIME ; \ cause sprite to flash palettes
- STA r_FLASH,x ; /
- RTS
- HAS_STAR:
- LDA #$02 ; \ status = 2 (being killed by star)
- STA $14C8,x ; /
- LDA #$D0 ; \ set y speed
- STA $AA,x ; /
- JSR SUB_HORZ_POS ; get new direction
- LDA t_XSPEED_KILLED,y ; \ set x speed based on direction
- STA $B6,x ; /
- INC $18D2 ; increment number consecutive enemies killed
- LDA $18D2 ; \
- CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
- BCC NO_RESET2 ; |
- LDA #$08 ; |
- STA $18D2 ; /
- NO_RESET2:
- JSL $02ACE5 ; give mario points
- LDY $18D2 ; \
- CPY #$08 ; | if consecutive enemies stomped < 8 ...
- BCS NO_SOUND2 ; |
- LDA STAR_SOUNDS,y ; | ... play sound effect
- STA $1DF9 ; /
- NO_SOUND2:
- RTS ; final return
- ;;;;;;;;;;;;;;;;;;;;;
- ; hammer routine ;
- ; (from Hammer Bro) ;
- ;;;;;;;;;;;;;;;;;;;;;
- X_OFFSET dcb $0C,$F4
- X_OFFSET2 dcb $00,$FF
- SUB_HAMMER_THROW LDA $15A0,x ; \ no egg if off screen
- ORA $186C,x ; |
- ORA $15D0,x ; |
- BNE NO_CONTACT ; /
- JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full
- BMI RETURN67 ; / after: Y has index of sprite being generated
- LDA #$37 ; \ sound effect
- STA $1DF9 ; /
- LDA #$01 ; \ set sprite status for new sprite
- STA $14C8,y ; /
- PHX
- LDA NEW_SPRITE_NUM,x
- INC A
- TYX
- STA NEW_SPRITE_NUM,x
- PLX
- PHY
- LDA $157C,x
- TAY
- LDA $E4,x ; \ set x position for new sprite
- CLC ; |
- ADC X_OFFSET,y ; |
- PLY ; |
- STA $00E4,y ; |
- PHY ; |
- LDA $157C,x ; |
- TAY ; |
- LDA $14E0,x ; |
- ADC X_OFFSET2,y ; |
- PLY ; |
- STA $14E0,y ; /
- LDA $D8,x ; \ set y position for new sprite
- SEC ; | (y position of generator - 1)
- SBC #$0E ; |
- STA $00D8,y ; |
- LDA $14D4,x ; |
- SBC #$00 ; |
- STA $14D4,y ; /
- PHX ; \ before: X must have index of sprite being generated
- TYX ; | routine clears *all* old sprite values...
- JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables
- JSL $0187A7 ; | get table values for custom sprite
- LDA #$08 ; |
- STA EXTRA_BITS,x ; |
- PLX ; /
- LDA $157C,x
- STA $157C,y
- RETURN67 RTS ; return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; graphics routine
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_GFX:
- JSR GET_DRAW_INFO ; after: Y = index to sprite tile map ($300)
- ; $00 = sprite x position relative to screen boarder
- ; $01 = sprite y position relative to screen boarder
- LDA $1602,x ; \
- ASL A ; | $03 = index to frame start (frame to show * 2 tile per frame)
- ASL A
- STA $03 ; /
- LDA $157C,x ; \ $02 = sprite direction
- STA $02 ; /
- BNE NO_ADD
- LDA $03
- CLC
- ADC #$10
- STA $03
- NO_ADD:
- PHX ; push sprite index
- LDX #$03 ; loop counter = (number of tiles per frame) - 1
- LOOP_START:
- PHX ; push current tile number
- TXA ; \ X = index to horizontal displacement
- ORA $03 ; / get index of tile (index to first tile of frame + current tile number)
- FACING_LEFT:
- TAX ; \
- LDA $00 ; \ tile x position = sprite x location ($00)
- CLC ; |
- ADC t_XDISP,x ; |
- STA $0300,y ; /
- LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
- CLC ; |
- ADC t_YDISP,x ; |
- STA $0301,y ; /
- LDA t_TILEMAP,x ; \ store tile
- STA $0302,y ; /
- LDX $02 ; \
- LDA t_PROPERTIES,x ; | get tile t_PROPERTIES using sprite direction
- LDX $15E9 ; |
- ORA $15F6,x ; | get palette info
- ORA $64 ; | put in level t_PROPERTIES
- STA $0303,y ; / store tile t_PROPERTIES
- LDA r_FLASH,x ; \ check to see if the sprite should be flashing
- BEQ NO_FLASH ; /
- LDA $14 ; \
- AND #$07 ; | cycle through all 8 sprite palettes
- TAX ; |
- LDA $0303,y ; |
- AND #$F1 ; | <-- F1 = 11110001 = clear all Palette-related bits
- ORA t_PROPFLASH,x ; |
- STA $0303,y ; /
- NO_FLASH:
- PLX ; \ pull, X = current tile of the frame we're drawing
- INY ; | increase index to sprite tile map ($300)...
- INY ; | ...we wrote 1 16x16 tile...
- INY ; | ...sprite OAM is 8x8...
- INY ; | ...so increment 4 times
- DEX ; | go to next tile of frame and loop
- BPL LOOP_START ; /
- PLX ; pull, X = sprite index
- LDA r_THROW,x
- CMP #$02
- BCC NO_SHOW_HAMMER
- CMP #30
- BCS NO_SHOW_HAMMER
- LDA $1602,x
- CMP #$02
- BCS SHOW_HAMMER_TOO
- NO_SHOW_HAMMER:
- LDY #$02 ; \ 02, because we didn't write to 460 yet
- LDA #$03 ; | A = number of tiles drawn - 1
- JSL $01B7B3 ; / don't draw if offscreen
- RTS ; return
- HAMMER_OFFSET:
- dcb $F4,$0C
- SHOW_HAMMER_TOO:
- PHX
- LDA $00
- LDX $02
- CLC
- ADC HAMMER_OFFSET,x
- STA $0300,y
- LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
- CLC ; |
- ADC #$E8
- STA $0301,y ; /
- LDA #v_HAMMER_TILE ; \ store tile
- STA $0302,y ; /
- LDA #$07
- CPX #$00
- BNE NO_FLIP_HAMMER
- ORA #$40
- NO_FLIP_HAMMER:
- ORA $64 ; | put in level t_PROPERTIES
- STA $0303,y ; / store tile t_PROPERTIES
- PLX
- INY ; | increase index to sprite tile map ($300)...
- INY ; | ...we wrote 1 16x16 tile...
- INY ; | ...sprite OAM is 8x8...
- INY ; | ...so increment 4 times
- LDY #$02 ; \ 02, because we didn't write to 460 yet
- LDA #$04 ; | A = number of tiles drawn - 1
- JSL $01B7B3 ; / don't draw if offscreen
- RTS ; return
- ;;;;;;;;;;;;;;;;;;
- ; points routine ;
- ;;;;;;;;;;;;;;;;;;
- STAR_SOUNDS
- dcb $00,$13,$14,$15,$16,$17,$18,$19
- SUB_STOMP_PTS:
- PHY
- LDA $1697 ; \
- CLC ; |
- ADC $1626,x ; / some enemies give higher pts/1ups quicker??
- INC $1697 ; 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 $1DF9 ; /
- NO_SOUND:
- TYA ; \
- CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
- BCC NO_RESET3 ; |
- LDA #$08 ; /
- NO_RESET3:
- JSL $02ACE5 ; give Mario points
- PLY
- RTS ; return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; routines below can be shared by all sprites. they are ripped from original
- ; SMW and poorly documented
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B760 - graphics routine helper - shared
- ; sets off screen flags and sets index to OAM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B75C
- TABLE1 dcb $0C,$1C
- TABLE2 dcb $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 TABLE1,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 TABLE2,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 ; /
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B817 - horizontal mario/sprite check - shared
- ; Y = 1 if mario left of sprite??
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B817 ; Y = 1 if contact
- 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 $E4,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 $14E0,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
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SUB_VERT_POS
- ; 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
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_VERT_POS:
- LDY #$00
- LDA $96
- SEC
- SBC $D8,x
- STA $0F
- LDA $97
- SBC $14D4,x
- BPL SPR_L11
- INY
- SPR_L11:
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B85D - off screen processing code - shared
- ; sprites enter at different points
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B83B
- TABLE3 dcb $40,$B0
- TABLE6 dcb $01,$FF
- TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
- TABLE5 dcb $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 $D8,x ; \
- CLC ; |
- ADC #$50 ; | 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_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 $E4,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 $14E0,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 $14C8,x ; \ if sprite status < 8, permanently erase sprite
- CMP #$08 ; |
- BCC KILL_SPRITE ; /
- LDY $161A,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
- STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
- KILL_SPRITE STZ $14C8,x ; erase sprite
- RETURN_2 RTS ; return
- VERTICAL_LEVEL LDA $167A,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 $D8,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 $001D ;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 $14D4,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 $15A0,x ; \ if sprite is on screen, accumulator = 0
- ORA $186C,x ; |
- RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement