;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Golem Rock, by Dispari Scuro ;; ;; With help from smkdan ;; ;; Based on the following sprites: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Tweeter, by mikeyk ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Shy Guy, by mikeyk ;; ;; Description: A Shy Guy with many available configurations. ;; ;; Note: When rideable, clipping tables values should be: 03 0A FE 0E ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Uses first extra bit: NO ;; ;; Extra Property Byte 1 ;; bit 0 - move fast ;; bit 1 - ;; bit 2 - follow mario ;; bit 3 - ;; bit 4 - enable spin killing (if rideable) ;; bit 5 - can be carried (if rideable) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; !ExtraProperty1 = $7FAB28 !RAM_SpriteDir = $157C !RAM_SprTurnTimer = $15AC !GetRand = $01ACF9 !BouncePattern = $1504 ; The bounce pattern determines which of 8 ; bounce strengths the rock will follow when ; spawned. This value is stored in a separate ; RAM address and determined in the INIT so that ; it keeps the same bounce pattern for its life. !BounceHealth = $1528 ; This is the HP of the rock. 8 bounces kills it. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; sprite init JSL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print "INIT ",pc ;LDA $167A,x ;STA $1528,x STZ !BounceHealth,x ; Set HP to 0, just in case it needs to be JSL !GetRand ; \ AND #$07 ; | Pick a random bounce pattern between 0 and 7 STA !BouncePattern,x ; / JSR SubHorzPos TYA STA $157C,x RTL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; sprite code JSL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print "MAIN ",pc PHB PHK PLB CMP #09 BCS HandleStunnd JSR SpriteMainSub PLB RTL HandleStunnd: LDA $1540,x CMP #$00 BEQ Normal_Code2 LDA #$1F STA $1540,x Normal_Code2: LDA $167A,x ; Set to interact with Mario AND #$7F STA $167A,x LDY $15EA,X ; Replace Goomba's tile PHX LDX Tilemap LDA $302,Y CMP #$A8 BEQ SetTile LDX Tilemap+1 SetTile: TXA STA $302,Y PLX PLB StunReturn: RTL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; sprite main code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Y_SPEED: db $D0 db $D0 db $D0 db $D0 db $D0 db $D0 db $D0 db $D0 KILLED_X_SPEED: db $00,$00 RETURN: RTS SpriteMainSub: SPRITE_CODE_START: LDA $1540,x CMP #$00 BEQ Normal_Code3 LDA #$FF STA $1540,x Normal_Code3: JSR SUB_GFX ; graphics routine LDA $14C8,x ; \ CMP #$08 ; | if status = 8, continue BEQ Normal_Code ; / STZ $B6,x STZ $AA,x ;LDA #$04 STZ $14C8,x LDA $D8,x ; \ STA $98 ; | LDA $14D4,x ; | STA $99 ; | Grab X/Y location of sprite... LDA $E4,x ; | ...to store for shatter block location. STA $9A ; | LDA $14E0,x ; | STA $9B ; / PHB ;preserve current bank LDA #$02 ;push 02 PHA PLB ;bank = 02 LDA #$00 ;default shatter JSL $028663 ;shatter block PLB ;restore bank RTS Normal_Code: LDA $9D ; \ if sprites locked, return BNE RETURN ; / JSR SUB_OFF_SCREEN_X3 ; handle off screen situation INC $1570,x ;LDY $157C,x ; Set x speed based on direction ;LDA !ExtraProperty1,x ;AND #$01 ;BEQ NoFastSpeed ; Increase speed if bit 0 is set ;INY ;INY NoFastSpeed: LDA !BouncePattern,x ; \ Take !BouncePattern... ASL A ; | ...multiply by 2... CLC ; | ADC $157C,x ; | ...add 1 if going right... TAY ; | ; / ...and store as X speed. JSR MaybeFaceMario ;LDA $1528,x ;STA $167A,x LDA $1588,x ; \ if sprite is in contact with an object... AND #$03 ; | BEQ NO_OBJ_CONTACT ; | LDA $157C,x ; | flip the direction status EOR #$01 ; | STA $157C,x ; / NO_OBJ_CONTACT: LDA $1588,x ; if on the ground, reset the turn counter AND #$04 BEQ IN_AIR LDA $151C,x INC A AND #$03 STA $151C,x LDY !BouncePattern,x ; \ LDA Y_SPEED,y ; | Sprite jumping STA $AA,x ; / INC !BounceHealth,x ; \ Increase bouncing HP counter LDA !BounceHealth,x ; | CMP #$01 ; | If HP bounce counter is 8... BNE IN_AIR ; / ...kill sprite. LDA #$04 ; \ status = 4 (being killed by spin jump) STA $14C8,x ; / STZ $B6,x STZ $AA,x STZ $14C8,x LDA $D8,x ; \ STA $98 ; | LDA $14D4,x ; | STA $99 ; | Grab X/Y location of sprite... LDA $E4,x ; | ...to store for shatter block location. STA $9A ; | LDA $14E0,x ; | STA $9B ; / PHB ;preserve current bank LDA #$02 ;push 02 PHA PLB ;bank = 02 LDA #$00 ;default shatter JSL $028663 ;shatter block PLB ;restore bank RTS IN_AIR: JSL $01802A ; update position based on speed values DONE_WITH_SPEED: JSL $018032 ; interact with sprites JSL $01A7DC ; check for mario/sprite contact (carry set = contact) BCC RETURN_24 ; return if no 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 RETURN_24 ; / LDA !ExtraProperty1,x AND #$10 BEQ SPIN_KILL_DISABLED ; LDA $140D ; \ if mario is spin jumping, goto SPIN_KILL BNE SPIN_KILL ; / SPIN_KILL_DISABLED: LDA $187A BNE RideSprite LDA !ExtraProperty1,x AND #$20 BEQ RideSprite BIT $16 ; Don't pick up sprite if not pressing button BVC RideSprite LDA #$0B ; Sprite status = Carried STA $14C8,x LDA #$F0 ; Set time until recovery STA $1540,x RTS RideSprite: LDA #$01 ; \ set "on sprite" flag STA $1471 ; / LDA #$06 ; \ set riding sprite STA $154C,x ; / STZ $7D ; y speed = 0 LDA #$E1 ; \ LDY $187A ; | mario's y position += E1 or D1 depending if on yoshi BEQ NO_YOSHI ; | LDA #$D1 ; | NO_YOSHI: CLC ; | ADC $D8,x ; | STA $96 ; | LDA $14D4,x ; | ADC #$FF ; | STA $97 ; / LDY #$00 ; \ LDA $1491 ; | $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 $154C,x ; \ if riding sprite... ORA $15D0,x ; | ...or sprite being eaten... BNE RETURN_24 ; / ...return LDA $1490 ; \ if mario star timer > 0, goto HAS_STAR BNE HAS_STAR ; / NOTE: branch to RETURN_24 to disable star killing JSL $00F5B7 ; hurt mario RETURN_24: RTS ; final return SPIN_KILL: JSR SUB_STOMP_PTS ; give mario points LDA #$F8 STA $7D JSL $01AB99 ; display contact graphic LDA #$04 ; \ status = 4 (being killed by spin jump) STA $14C8,x ; / LDA #$1F ; \ set spin jump animation timer STA $1540,x ; / JSL $07FC3B ; show star animation LDA #$28 ; \ play sound effect STA $1DF9 ; / RTS ; return HAS_STAR: LDA #$02 ; \ status = 2 (being killed by star) STA $14C8,x ; / LDA #$D0 ; \ set y speed STA $AA,x ; / JSR SubHorzPos ; get new direction LDA KILLED_X_SPEED,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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; sprite graphics routine ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TILEMAP: db $A6,$A6 SUB_GFX: JSR GET_DRAW_INFO ; sets y = OAM offset LDA $157C,x ; \ $02 = direction STA $02 ; / LDA $14 ; \ LSR A ; | LSR A ; | LSR A ; | CLC ; | ADC $15E9 ; | AND #$01 ; | STA $03 ; | $03 = index to frame start (0 or 1) ;STZ $03 PHX ; / LDA $14C8,x CMP #$02 BNE LOOP_START_2 STZ $03 LDA $15F6,x ORA #$80 STA $15F6,x LOOP_START_2: LDA $00 ; \ tile x position = sprite x location ($00) STA $0300,y ; / LDA $01 ; \ tile y position = sprite y location ($01) STA $0301,y ; / LDA $15F6,x ; tile properties xyppccct, format LDX $02 ; \ if direction == 0... BNE NO_FLIP ; | ORA #$40 ; / ...flip tile NO_FLIP: ORA $64 ; add in tile priority of level STA $0303,y ; store tile properties LDX $03 ; \ store tile LDA TILEMAP,x ; | STA $0302,y ; / INY ; \ increase index to sprite tile map ($300)... INY ; | ...we wrote 1 16x16 tile... INY ; | ...sprite OAM is 8x8... INY ; / ...so increment 4 times PLX ; pull, X = sprite index LDY #$02 ; \ 460 = 2 (all 16x16 tiles) LDA #$00 ; | A = (number of tiles drawn - 1) JSL $01B7B3 ; / don't draw if offscreen RTS ; return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MaybeFaceMario: LDA !ExtraProperty1,x ; Face Mario if bit 2 is set AND #$04 BEQ Return4 LDA $1570,x AND #$7F BNE Return4 LDA !RAM_SpriteDir,x PHA JSR SubHorzPos ; Face Mario TYA STA !RAM_SpriteDir,X PLA CMP !RAM_SpriteDir,x BEQ Return4 LDA #$08 STA !RAM_SprTurnTimer,x Return4: 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 $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_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 $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 ; / ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $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 $D8,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 $14D4,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 SubHorzPos: 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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $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 $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