;SML Marine Pop WIP ;by smkdan ;GFX from Mattrizzle FRAMEINDEX = $03 PROPRAM = $04 TEMP = $09 ;controller definitions PADA = $15 PADATRIG = $16 PADB = $17 PADBTRIG = $18 ;pad masks DPADUP = $08 DPADDOWN = $04 DPADLEFT = $02 DPADRIGHT = $01 JPADY = $40 ;mario MARIOPOWER = $19 MARIOX = $94 MARIOY = $96 MARIOHIDE = $78 MARIOXSPD = $7B MARIOYSPD = $7D MARIOXSCRN = $7E MARIOANI = $71 MARIOINVINCIBLE = $1497 MARIONOOBJCONTACT = $154C MARIOCARRY = $148F ;pop speeds POPSPDY = $20 POPSPDX = $27 ;!TORPEDO SPRITE NUMBER! PROJECTILE = $1D ;generated xspeed GENSPEEDX = $40 ;gen offsets GENPOSX = $0004 GENPOSY = $000E ;torpedo limit TORPEDOLIMIT = $03 ;sprite xy + speed SPRITEYLO = $D8 SPRITEYHI = $14D4 SPRITEXLO = $E4 SPRITEXHI = $14E0 SPRITEXSPD = $B6 SPRITEYSPD = $AA ;list of issues: ;TURN BLOCKS ARGRGHG ; dcb "INIT" RTL dcb "MAIN" PHB PHK PLB JSR Run PLB RTL Return_I RTS Run JSR SUB_OFF_SCREEN_X0 JSR GET_DRAW_INFO JSR GFX ;draw sprite ;first see if Mario is dieing LDA MARIOANI ;dieing mario = kill sprite CMP #$09 ;09 = dieing BNE MarioLives STZ $14C8,x ;erase sprite RTS ;return here LDA $14C8,x CMP #$08 BNE Return_I LDA $9D ;locked sprites? BNE Return_I MarioLives LDA #$FF ;ALWAYS hide Mario completely STA MARIOHIDE LDA $1DF9 ;block swimming sound CMP #$0E BNE NoSwimSound STZ $1DF9 ;zero sound NoSwimSound LDA $1DFA ;block jumping sound CMP #$01 BNE NoJumpSound STZ $1DFA ;zero sound NoJumpSound STZ MARIOCARRY ;mario never caries anything ;disable contact with Mario LDY #$00 ;zero loop index DisableLoop LDA $9E,y ;test sprite... CMP #$21 ;moving coin BEQ NextDLSprite CMP #$74 ;mushroom BEQ NextDLSprite CMP #$75 ;flower BEQ NextDLSprite CMP #$76 ;star BEQ NexTDLSprite CMP #$77 ;feather BEQ NextDLSprite LDA #$FF ;permanent no contact STA MARIONOOBJCONTACT,y NextDLSprite INY CPY #$0C ;12 sprites BNE DisableLoop LDA MARIOINVINCIBLE ;mario invincible, skip BNE NoSpriteHitTest ;interaction test code ;test sprites according to POP's HITBOX! CheckSprite STX TEMP ;store self to TEMP LDY #$0B ;12 entries CheckLoop CPY TEMP ;skip self BEQ NextSprite LDA $14C8,y ;check status BEQ NextSprite LDA $1686,Y ;skip sprites that don't interact with others AND #$08 BNE NextSprite JSL $03B69F ;clipA PHX TYX JSL $03B6E5 ;clipB PLX JSL $03B72B ;check contact between A and B BCC NextSprite ;no contact = don't set JSL $00F5B7 ;hurt mario RTS NextSprite DEY ;next sprite BPL CheckLoop NoSpriteHitTest ;remove all fireballs LDY #$00 ;loop index ExtendedLoop LDA $170B,y CMP #$05 ;test mario fireball BNE NotFireBall LDA #$00 ;zero slot STA $170B,y NotFireBall INY ;next ex sprite CPY #$0A ;10 sprites BNE ExtendedLoop ;loop ;INTERACTION ;test y movement LDA $1588,x ;first test cieling AND #$08 BEQ NoCieling REP #$20 ;16bit variable INC MARIOY ;increment MarioY if touching cieling SEP #$20 BRA SkipUp ;don't attempt UP if touching cieling NoCieling LDA PADA ;load controller data with the DPAD BIT #DPADUP ;test UP BEQ SkipUp LDA #POPSPDY ;load yspd EOR #$FF ;two's complement INC A STA MARIOYSPD ;store to mario yspd BRA TestHorz ;jump past down check SkipUp LDA PADA ;test down BIT #DPADDOWN BEQ NoYMove LDA #POPSPDY ;store pop speed to mario speed STA MARIOYSPD BRA TestHorz NoYMove STZ MARIOYSPD ;no Y speed if not moving down or up TestHorz LDA MARIOXSPD ;TEST!!! STA SPRITEXSPD,x LDA MARIOYSPD STA SPRITEYSPD,x JSL $01802A ;speed LDA $1588,x ;check Mario's wall status AND #$03 BEQ NotWalled STZ MARIOXSPD ;halt Mario LDA MARIOXSCRN ;see if Mario's screen position is less / equal to 8px from the left CMP #$09 BCS DoPosition ;if NOT being border forced, move along LDA $1588,x ;test if mario is on the right side AND #$03 CMP #$02 ;on right? BEQ SkipLeft ;if on right, process movement towards left JSL $00F606 ;kill mario BRA DoPosition NotWalled LDA MARIOXSCRN ;see if Mario's screen position is less / equal to 8px from the left CMP #$09 BCC DoPosition ;skip movement IF BEING border forced ;test x movement LDA PADA ;load controller data with the DPAD BIT #DPADLEFT ;test left BEQ SkipLeft LDA #POPSPDX ;load yspd EOR #$FF ;two's complement INC A INC A STA MARIOXSPD ;store to mario yspd BRA DoPosition ;jump past down check SkipLeft LDA PADA ;test right BIT #DPADRIGHT BEQ NoXMove LDA #POPSPDX ;store pop speed to mario speed STA MARIOXSPD BRA DoPosition NoXMove STZ MARIOXSPD ;no Y speed if not moving down or up DoPosition ;store mario position to sprite position REP #$20 ;16bitload LDA MARIOX ;mario x SEP #$20 ;8bit stores STA SPRITEXLO,x XBA STA SPRITEXHI,x REP #$20 LDA MARIOY ;mario y SEP #$20 STA SPRITEYLO,x XBA STA SPRITEYHI,x ;firing ;generate projectile LDA PADATRIG ;test Y BIT #JPADY BEQ NoFire STZ TEMP ;zero counter ;limit torpedos LDY #$0B ;12 sprites TorpedoLoop LDA $14C8,y ;check status BEQ NextTorpedo PHX ;preserve sprite index TYX ;Y->X LDA $7FAB9E,x ;load sprite type PLX ;restore sprite index CMP #PROJECTILE ;compare to torpedo sprite BNE NextTorpedo INC TEMP ;count++ LDA TEMP ;and compare CMP #TORPEDOLIMIT ;equal to count? BEQ NoFire ;cancel firing NextTorpedo DEY ;next sprite BPL TorpedoLoop GenCust JSL $02A9DE ;grab free sprite slot low priority BMI NoFire ;return if none left before anything else... LDA #$06 ;make fireball sound STA $1DFC JSR SetupCust ;run sprite generation routine NoFire Return RTS ;===== TILEMAP dcb $88,$8A,$8C,$8E ;small mario 1 dcb $A8,$AA,$AC,$AE dcb $80,$82,$84,$86 ;small mario 2 dcb $88,$8A,$8C,$8E dcb $80,$82,$84,$86 ;big mario 1 dcb $A8,$AA,$AC,$AE dcb $88,$8A,$8C,$8E ;big mario 2 dcb $80,$82,$84,$86 XDISP dcb $F0,$00,$10,$20 dcb $F0,$00,$10,$20 dcb $F0,$00,$10,$20 dcb $F0,$00,$10,$20 YDISP dcb $10,$10,$10,$10 dcb $00,$00,$00,$00 dcb $10,$10,$10,$10 dcb $00,$00,$00,$00 PROP dcb $00,$00,$00,$00 ;palettes dcb $02,$02,$02,$02 GFX LDA MARIOINVINCIBLE ;invincible = don't draw some of the time LSR A AND #$01 BEQ Display RTS ;just return here DIsplay LDA $15F6,x ;properties minus palette AND #$F1 STA PROPRAM LDA MARIOPOWER ;small mario gets the small frame BNE BigPop ;smallpop STZ FRAMEINDEX BRA Proceed BigPop LDA #$08 ;big mario gets the big frame STA FRAMEINDEX ;now change it if it's powering down / up Proceed LDA MARIOANI ;animation CMP #$01 ;01 = dieing BEQ PowerUpDown CMP #$02 ;02 = growing BEQ PowerUpDown BRA ProceedB PowerUpDown LDA $13 ;frame counter unaffected by gameplay LSR A LSR A ;/4 AND #$01 ASL A ASL A ASL A ;x8 STA FRAMEINDEX ;alternate frames BRA EnterLoop ProceedB LDA $14 ;frame counter LSR A LSR A ;every 4th frame AND #$01 ;00 or 01 ASL A ASL A ;x4 CLC ADC FRAMEINDEX ;add to frame index STA FRAMEINDEX ;new frame index EnterLoop LDX #$00 ;reset loop index OAM_Loop LDA $00 ;xpos CLC ADC XDISP,x STA $0300,y LDA $01 ;ypos CLC ADC YDISP,x STA $0301,y PHX ;preserve loop index LDX FRAMEINDEX ;load frame index LDA TILEMAP,x STA $0302,y ;chr INC FRAMEINDEX ;++ frame index PLX ;restore loop index LDA PROP,x ;load properties ORA PROPRAM ORA $64 ;level prop STA $0303,y INY INY INY INY INX CPX #$08 ;4 tiles BNE OAM_Loop LDX $15E9 ;restore sprite index LDY #$02 ;16x16 tiles LDA #$07 ;8 tiles JSL $01B7B3 ;reserve RTS ;generate custom projectile SetupCust LDA #$08 STA $14C8,y ;normal status, run init routine LDA #PROJECTILE PHX TYX STA $7FAB9E,x ;into sprite type table for custom sprites PLX ;set positions accordingly ;restore gen sprite index LDA $14E0,x ;create base 16bit pos XBA LDA $E4,x FacingRight LDA $14E0,x ;base xpos XBA LDA $E4,x REP #$20 CLC ADC.w #GENPOSX ;add SEP #$20 STA $E4,y ;store XBA STA $14E0,y LDA $14D4,x ;base ypos XBA LDA $D8,x REP #$20 CLC ADC.w #GENPOSY ;add SEP #$20 STA $D8,y ;store XBA STA $14D4,y TYX ;new sprite slot into X JSL $07F7D2 ;create sprite JSL $0187A7 LDA #$88 ;set as custom sprite STA $7FAB10,X ;set projectile speed according to Mario LDX $15E9 ;restore sprite index LDA #GENSPEEDX STA $B6,y ;set xspeed RTS ;return ;================= ;BORROWED ROUTINES ;================= ;GET_DRAW_INFO ;============== ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $B760 - graphics routine helper - shared ; sets off screen flags and sets index to OAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SPR_T1 dcb $0C,$1C SPR_T2 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 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 dcb $40,$B0 SPR_T13 dcb $01,$FF SPR_T14 dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes SPR_T15 dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes dcb $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 #$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_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