Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;kuribo shoe WIP
- ;by smkdan
- !DIR = $03
- !PROPRAM = $04
- !TEMP = $09
- ;set to sprite # of kuribo shoe powerup sprite
- !POWERUPSPR = $05
- ;some definitions
- !STATE = $1570 ;the state
- !COUNTER = $1602 ;the counter
- !GOOMBAX = $C2 ;goomba x displacement
- !GOOMBAY = $1504 ;goomba y displacement
- !POWERUP = $1602 ;powerup state
- ;states
- !IDLESHOW = $00 ;idling with face showing
- !IDLESHOWTIME = $30
- !SINK = $01 ;sinking to prepare for jump
- !SINKTIME = $10
- !JUMPING = $02 ;in the air
- !RISE = $03 ;rising after the jump
- ;misc
- !JUMPYSPD = $50 ;change these if you please
- !JUMPXSPD = $0C
- !INITY = $F8
- print "MAIN ",pc
- PHB
- PHK
- PLB
- JSR SpriteMain
- PLB
- RTL
- print "INIT ",pc
- LDA #!IDLESHOWTIME ;initialise timer
- STA !COUNTER,x ;new counter
- LDA #!INITY ;set initial GOOMBAY
- STA !GOOMBAY,x
- JSR SUB_HORZ_POS ;face mario
- TYA
- STA $157C,x
- RTL
- SpriteMain:
- JSR SUB_OFF_SCREEN_X0
- JSR GET_DRAW_INFO
- JSR GFX ;draw sprite
- LDA $14C8,x ;check for falling
- CMP #$02
- BNE NoFall
- LDA !STATE,x ;check state high bit
- BMI NoFall
- JSR SetupCustom ;jump to generate shoe
- LDA #$80
- STA !STATE,x ;set high bit state to say it's already done
- LDA $1662,x ;no object interaction
- ORA #$80
- STA $1662,x
- NoFall:
- LDA $14C8,x ;status check
- CMP #$08
- BNE Return
- LDA $9D ;locked sprites?
- BNE Return
- LDA $15D0,x ;yoshi eating?
- BNE Return
- JSL $01802A ;update speed
- JSL $01A7DC ;mario interact
- LDA !STATE,x ;load state
- ASL A ;x2 into jump table
- TAX
- JSR (JumpTable,x)
- Return:
- RTS
- ;=====
- JumpTable:
- dw IdleShow
- dw Sink
- dw Jumping
- dw Rise
- ;=====
- IdleShow:
- LDX $15E9
- DEC !COUNTER,x ;update counters
- BNE KeepShowing
- LDA #!SINK ;update to sink
- STA !STATE,x
- KeepShowing:
- RTS
- Sink:
- LDX $15E9
- LDA $14 ;only update every 2nd frame
- LSR A
- BCC KeepSinking
- INC !GOOMBAY,x ;sink
- LDA !GOOMBAY,x ;test
- BNE KeepSinking
- ;jump
- LDA #!JUMPYSPD ;set yjump speed
- EOR #$FF
- INC A
- STA $AA,x ;yspd
- JSR SUB_HORZ_POS ;face mario BEFORE jumping
- TYA
- STA $157C,x
- LDA #!JUMPXSPD ;set xjump speed
- LDY $157C,x ;test direction
- BEQ JumpRight
- EOR #$FF ;two's complement
- INC A
- JumpRight:
- STA $B6,x ;xspd
- LDA #!JUMPING ;go into jump state
- STA !STATE,x
- KeepSinking:
- RTS
- Jumping:
- LDX $15E9
- LDA $1588,x ;check if on ground yet
- BIT #$04
- BEQ InAir
- ;landed
- STZ $B6,x ;on ground, no xspd
- LDA #!RISE ;set rise status
- STA !STATE,x
- InAir:
- LDA $1588,x ;if touching wall..
- BIT #$03
- BEQ NoWall
- LDA $B6,x ;invert xspd
- EOR #$FF
- INC A
- STA $B6,x
- LDA $157C,x ;and also direction
- EOR #$01
- STA $157C,x
- NoWall:
- LDA $1588,x ;if touching cieling...
- BIT #$08
- BEQ NoCieling
- LDA $AA,x ;invert yspd
- EOR #$FF
- INC A
- STA $AA,x
- NoCieling:
- RTS
- Rise:
- LDX $15E9
- LDA $14 ;rise every 2nd frame
- LSR A
- BCC KeepRising
- DEC !GOOMBAY,x ;rise again
- LDA !GOOMBAY,x ;test
- CMP #!INITY ;at original yet?
- BNE KeepRising
- ;risen
- LDA #!IDLESHOW ;back to idle show
- STA !STATE,x
- LDA #!IDLESHOWTIME
- STA !COUNTER,x
- KeepRising:
- RTS
- ;=====
- PowerUp:
- LDA #$80 ;set to always call main with no default handling
- STA $7FAB34,x
- INC !GOOMBAX,x
- INC !GOOMBAY,x
- STZ $AA,x
- STZ $B6,x
- RTS
- ;=====
- !GOOMBAFRAME = $4C ;16x16 goomba frame
- !GOOMBAPROP = $04 ;goomba frame properties
- SHOEFRAME:
- db $4E,$60 ;two shoe frames
- GFX:
- LDA $14C8,x ;if spin jumping / dead
- BEQ ReturnG
- CMP #$04
- BEQ ReturnG
- LDA $14C8,x
- CMP #$02
- BNE NoFallG
- NoFallG:
- LDA $15F6,x ;properties...
- STA !PROPRAM
- LDA $157C,x ;direction...
- BNE FaceLeft
- LDA #$40 ;set xflip
- TSB !PROPRAM
- FaceLeft:
- LDA $14C8,x ;is dieing?
- CMP #$02
- BNE NoFlip
- STZ !GOOMBAX,x ;hide goomba
- STZ !GOOMBAY,x
- LDA #$80 ;set yflip
- TSB !PROPRAM
- BRA DrawGoomba ;only draw goomba
- ;draw shoe
- NoFlip:
- LDA $00 ;xpos
- STA $0300,y
- LDA $01 ;ypos
- STA $0301,y
- LDA $14 ;framecounter for frame index
- LSR A
- LSR A
- LSR A ;every x frame
- AND #$01 ;2 frames
- TAX
- LDA SHOEFRAME,x
- STA $0302,y ;chr
- LDA !PROPRAM
- ORA $64
- STA $0303,y ;properties
- LDX $15E9 ;restore sprite index
- DrawGoomba:
- LDA $00 ;xpos plus xdisp
- CLC
- ADC !GOOMBAX,x
- STA $0304,y
- LDA $01 ;ypos plus ydisp
- CLC
- ADC !GOOMBAY,x
- STA $0305,y
- LDA #!GOOMBAFRAME
- STA $0306,y ;chr
- LDA !PROPRAM
- AND #$81 ;keep page bit and flip
- ORA #!GOOMBAPROP
- ORA $64
- STA $0307,y
- LDY #$02 ;16x16
- LDA #$01 ;2 tiles
- JSL $01B7B3 ;reserve
- ReturnG:
- RTS
- ;======
- SetupCustom:
- JSL $02A9E4 ;grab free sprite slot
- BMI ReturnGen ;return if none left before anything else...
- LDA #$01
- STA $14C8,y ;normal status, run init routine
- LDA #!POWERUPSPR
- PHX
- TYX
- STA $7FAB9E,x ;into sprite type table for custom sprites
- PLX
- ;set positions accordingly
- ;restore gen sprite index
- PHX ;preserve sprite
- TYX ;new sprite slot into X
- JSL $07F7D2 ;create sprite
- JSL $0187A7
- LDA #$88 ;set as custom sprite
- STA $7FAB10,X
- PLX ;restore sprite
- LDA $E4,x ;copy positions
- STA $00E4,y
- LDA $14E0,x
- STA $14E0,y
- LDA $D8,x
- STA $00D8,y
- LDA $14D4,x
- STA $14D4,y
- LDA $157C,x ;copy direction
- STA $157C,y
- ReturnGen:
- RTS ;return
- ;=================
- ;BORROWED ROUTINES
- ;=================
- ;GET_DRAW_INFO
- ;==============
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B760 - graphics routine helper - shared
- ; sets off screen flags and sets index to OAM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPR_T1: db $0C,$1C
- SPR_T2: 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 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: db $40,$B0
- SPR_T13: db $01,$FF
- SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
- db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
- SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
- db $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
- ;SUBHORZPOS
- ;==========
- 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
- SEP #$20
- 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 $0E ;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
- Here is the code for kribo power up
- ;kuribo powerup sprite
- ;by smkdan
- ;REQUIRED
- !SHOEGEN = $04 ;set this to the sprite # that generated this sprite (if applicable)
- ;sound effect
- !SHOELOSTSFX = $00 ;play what when shoe is lost? I forgot the # used in SMB3, but I know it's in the game
- !SHOELOSTSFXPORT = $1DFC
- !SHOEMOUNTSFX = $02 ;play when shoe is mounted
- !SHOEMOUNTSFXPORT = $1DF9
- ;stuff
- !PROPRAM = $04
- !TEMP = $09
- ;statuses
- !STATE = $C2 ;states, with the following masks
- !M_ACTIVE = $01 ;has mario touched the shoe and become powered up?
- !M_AIRBOOST = $02 ;has mario spent is mid-air boost?
- !M_CAPED = $04 ;was mario caped before touching?
- !M_FIRE = $08 ;was mario with fire before touching?
- !M_LOST = $10 ;shoe lost? (falling off screen)
- !M_LOSING = $20 ;set after 1 frame of lost
- !MARIOTILE = $1570 ;tile to draw for Mario's head
- ;othter stuff
- !MARIOHEADBLANK = $69
- ;SPRITES THAT INTERACT AS NORMAL APPEAR AS 01
- MarioSprInteract:
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00 ;$00-$0F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$10-$1F
- db $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $01 ;$20-$2F
- db $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00 ;$30-$3F
- db $00, $01, $01, $01, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$40-$4F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00 ;$50-$5F
- db $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $01, $00, $00 ;$60-$6F
- db $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01 ;$70-$7F
- db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01 ;$80-$8F
- db $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00 ;$90-$9F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$A0-$AF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00 ;$B0-$BF
- db $00, $01, $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $00, $00 ;$C0-$CF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$D0-$DF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$E0-$EF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$F0-$FF
- ;CUSTOM SPRITES THAT INTERACT AS NORMAL APPEAR AS 01
- MarioSprInteractCustom:
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$00-$0F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$10-$1F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$20-$2F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$30-$3F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$40-$4F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$50-$5F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$60-$6F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$70-$7F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$80-$8F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$90-$9F
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$A0-$AF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$B0-$BF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$C0-$CF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$D0-$DF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$E0-$EF
- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$F0-$FF
- print "MAIN ",pc
- PHB
- PHK
- PLB
- JSR SpriteMain
- PLB
- RTL
- print "INIT ",pc
- LDA #!MARIOHEADBLANK ;draw nothing where mario's head will be at start
- STA !MARIOTILE,x
- RTL
- SpriteMain:
- JSR SUB_OFF_SCREEN_X0
- JSR GET_DRAW_INFO
- JSR GFX ;draw sprite
- LDA !STATE,x ;don't kill if it's lost
- BIT #!M_LOST
- BNE MarioNotDead
- LDA $71 ;test mario animation
- CMP #$09
- BNE MarioNotDead
- STZ $14C8,x ;mario died, get rid of shoe
- MarioNotDead:
- JSR HandleAni
- LDA $14C8,x
- CMP #$08
- BNE Return
- LDA $9D ;locked sprites?
- BNE Return
- LDA !STATE,x ;test if mario has touched it yet
- BIT #!M_ACTIVE
- BNE PowerupActive
- ;inactive powerup
- BIT #!M_LOST ;is lost?
- BEQ NotLost
- ;lost
- BIT #!M_LOSING ;already ran lost code?
- BNE Speed ;just run speed code then
- JSR HandleLostShoe ;code related to losing shoe
- BRA Speed ;update speed
- NotLost:
- JSL $01A7DC ;mario interact
- BCC NoMario
- LDA #!M_ACTIVE ;set active powerup
- ORA !STATE,x
- STA !STATE,x
- LDA #!SHOEMOUNTSFX ;play mounting sound
- STA !SHOEMOUNTSFXPORT
- JSR HandleCape ;handle cape if needed
- JSR HandleFire ;handle fire if needed
- RTS
- NoMario:
- STZ $B6,x ;no speed while stationary
- Speed:
- JSL $01802A ;update the speed
- Return:
- RTS
- ;=====
- !MARIOHEADSMALL = $62
- !MARIOHEADBIG = $64
- PowerupActive:
- JSR FixInteraction
- JSR CopyPositions
- JSR GFXSetup
- JSR MarioMotion
- JSR HandleCape
- JSR HandleFire
- JSR SpriteInteract
- JSR MaskSound
- RTS
- ;=====
- HandleAni:
- LDA !STATE,x ;test for lost
- BIT #!M_LOST
- BNE .Return ;return if shoe is lost
- LDA #$FF ;hide all mario
- STA $78
- LDA $71 ;animation
- CMP #$01 ;01 = dieing
- BEQ .MushUpDown
- CMP #$02 ;02 = growing
- BEQ .MushUpDown
- CMP #$03 ;03 = cape powerup
- BEQ .Test ;show nothing
- CMP #$04 ;04 = fire powerup
- BEQ .Test ;show nothing
- CMP #$05 ;door/pipe exit
- BEQ .KillSelf
- CMP #$06 ;pipe exit
- BEQ .KillSelf
- STZ $78 ;cancel hiding
- RTS ;return if neither of these
- .MushUpDown
- LDY #!MARIOHEADSMALL
- LDA $13 ;frame counter not tied to pause
- LSR A
- LSR A
- BIT #$01
- BNE .ShowSmall
- LDY #!MARIOHEADBIG
- .ShowSmall
- TYA
- STA !MARIOTILE,x ;head to show as mario tile
- .Test
- JSR TestFireUp ;handle both cases of powerup replacement
- JSR TestFlowerUp
- .Return
- RTS
- .KillSelf
- JSR HandleLostShoe
- RTS
- ;=====
- TestFlowerUp:
- LDA !STATE,x ;already have cape?
- BIT #!M_CAPED
- CLC ;clc on no cape
- BEQ .Return ;test fire otherwise
- LDA #$04 ;set cape to item
- STA $0DC2
- SEC ;sec on cape
- .Return
- RTS
- ;=====
- TestFireUp:
- LDA !STATE,x ;already have fire?
- BIT #!M_FIRE
- CLC ;clc on no fire
- BEQ .Return
- LDA #$02 ;set fire to item
- STA $0DC2
- SEC ;sec on fire
- .Return
- RTS
- ;=====
- HandleCape:
- LDA $19 ;test for cape powerup
- CMP #$02
- BNE .NoCape
- LDA #!M_CAPED ;set caped flag
- ORA !STATE,x
- STA !STATE,x
- LDA #$01 ;set normal big mario state
- STA $19
- LDA #!M_FIRE ;clear fire flag because the powerup is not cape
- EOR #$FF
- AND !STATE,x
- STA !STATE,x ;new state without cape flag
- .NoCape
- RTS
- ;=====
- HandleFire:
- LDA $19 ;test for fire
- CMP #$03
- BNE .NoFire
- LDA #!M_FIRE ;set fire flag
- ORA !STATE,x
- STA !STATE,x
- LDA #$01 ;set big mario
- STA $19
- LDA #!M_CAPED ;clear cape flag because the powerup is not cape
- EOR #$FF
- AND !STATE,x
- STA !STATE,x ;new state without cape flag
- .NoFire
- RTS
- ;=====
- HandleLostShoe:
- LDA #!MARIOHEADBLANK ;don't draw mario's head
- STA !MARIOTILE,x
- LDA #$C0 ;set lost speed
- STA $AA,x
- LDA !STATE,x ;set losing bit
- ORA #!M_LOSING
- STA !STATE,x
- LDA $1686,x ;no object interaction, just fall offscreen
- ORA #$80
- STA $1686,x
- LDY #$00 ;reset loop index
- LDA #$00 ;value to store
- .Loop
- STA $154C,y ;zero disable interaction flag
- INY ;next sprite
- CPY #$0C ;12 sprites
- BNE .Loop
- LDA #$30 ;hurtmario sets invincibility timer to 30
- STA $1497
- LDA !STATE,x ;test flowerup
- BIT #!M_FIRE
- BEQ .NoFire
- LDA #$03 ;set fire
- STA $19
- RTS
- .NoFire
- BIT #!M_CAPED ;test cape
- BEQ .NoCape
- LDA #$02 ;set cape
- STA $19
- .NoCape
- RTS
- ;=====
- ;SUBS
- ;=====
- FixInteraction:
- LDA #$FF ;no block interaction
- STA $1497
- STZ $140D
- LDX #$00 ;set cape interaction disable + scenery to fool sprite thing
- .Loop
- LDA #$01
- STA $1FE2,x
- LDA $7FAB10,x ;test if it's a custom sprite
- BIT #$08
- BNE .Custom
- ;standard
- LDY $9E,x ;load sprite #
- LDA MarioSprInteract,y
- EOR #$01 ;invert
- BRA .Store
- .Custom
- LDA $7FAB9E,x ;load sprite # custom
- TAY
- LDA MarioSprInteractCustom,y
- EOR #$01 ;invert
- .Store
- ASL A ;it's a counter, so x2
- STA $154C,x ;store to disbale interaction flag
- INX ;next sprite
- CPX #$0C ;all 12
- BNE .Loop
- LDX $15E9 ;restore sprite
- RTS
- ;=====
- CopyPositions:
- LDA $94
- STA $E4,x
- LDA $95
- STA $14E0,x
- LDA $96
- CLC
- ADC #$10 ;16px below
- STA $D8,x
- LDA $97
- ADC #$00 ;carry
- STA $14D4,x
- RTS
- ;=====
- GFXSetup:
- LDA #$FF ;hide all mario
- STA $78
- LDA !STATE,x ;check for cape or flower power up
- BIT #!M_CAPED ;cape?
- BNE .Caped
- BIT #!M_FIRE ;fire?
- BNE .Fire
- LDA $19 ;neither, load normal powerup
- BRA .SetPal
- .Caped
- LDA #$02 ;cape power
- BRA .SetPal
- .Fire
- LDA #$03 ;fire power
- .SetPal
- ASL A ;as it was in all.log
- ORA $0DB3 ;player
- ASL A
- PHX
- TAX
- REP #$20
- LDA.l $00E2A2,x
- PLX
- STA $0D82 ;set palette address
- SEP #$20
- LDA #!MARIOHEADBLANK ;value to store if ducking
- LDY $73 ;load ducking flag
- BNE .Store
- LDY #!MARIOHEADSMALL
- LDA $19 ;test powerup
- BEQ .SmallMario
- LDY #!MARIOHEADBIG
- .SmallMario
- TYA
- .Store
- STA !MARIOTILE,x ;store head tile
- LDA $15 ;load pad data
- BIT #$01 ;right?
- BNE Right
- BIT #$02
- BEQ NeitherLR
- LDA #$01 ;set direction
- STA $157C,x
- RTS
- Right:
- STZ $157C,x ;set direction
- NeitherLR:
- RTS
- ;=====
- !YSPDBOUNCE = $24
- MarioMotion:
- LDA $77 ;test if mario is on ground
- BIT #$04
- BEQ InAir
- BRA NoBoost ;go to ground section
- InAir:
- LDA !STATE,x ;has air boost already been spent?
- BIT #!M_AIRBOOST
- BNE NoBounce
- LDA $16 ;test A and B
- ORA $18
- BIT #$80
- BEQ NoBounce
- Boost:
- JSL $01AA33 ;boost speed
- LDA !STATE,x
- ORA #!M_AIRBOOST
- STA !STATE,x
- RTS
- NoBoost:
- LDA $16 ;test B and A
- ORA $18
- BIT #$80
- BNE Boost
- LDA $15 ;test L or R
- BIT #$03
- BEQ NoBounce
- ;bounce it
- LDA #!YSPDBOUNCE
- EOR #$FF
- INC A
- STA $7D ;mario yspd
- LDA #!M_AIRBOOST
- EOR #$FF
- AND !STATE,x
- STA !STATE,x
- NoBounce:
- RTS
- ;=====
- SpriteInteract:
- LDX #$00 ;reset loop index
- .Loop
- CPX $15E9 ;skip self
- BEQ .NextSprite
- LDA $14C8,x ;only if sprite isn't dead
- BEQ .NextSprite
- CMP #$04 ;and not dieing
- BEQ .NextSprite
- LDA $7FAB10,x ;standard or custom?
- BIT #$08
- BNE .Custom
- ;standard
- LDY $9E,x ;load sprite #
- LDA MarioSprInteract,y
- BRA .Test
- .Custom
- LDA $7FAB9E,x ;load sprite # custom
- CMP #!SHOEGEN ;compare to shoe that generated (possibly)
- BNE .NotShoe
- LDA $14C8,x ;is falling?
- CMP #$02
- BEQ .NextSprite ;ignore dieing generator sprite
- .NotShoe
- TAY ;to Y index
- LDA MarioSprInteractCustom,y
- .Test
- BNE .NextSprite ;01 means don't try clipping test for hurt / kill
- TXY ;sprite X->Y
- PHX
- LDX $15E9 ;sprite index in X
- JSR ClipTest ;do clipping
- PLX
- BCS .Return ;clipped = return
- .NextSprite
- INX ;next sprite
- CPX #$0C ;12 sprites
- BNE .Loop
- .Return
- LDX $15E9 ;restore sprite index
- RTS
- ;=====
- ClipTest:
- JSL $03B69F ;clipA
- PHX
- TYX
- JSL $03B6E5 ;clipB
- PLX
- JSL $03B72B ;check contact between A and B
- BCC .ClippingReturn ;no contact = don't set
- REP #$20 ;adjust Y position
- LDA $96
- PHA
- CLC
- ADC.w #$0010 ;16px adjust, BROKEN, DOES NOTHING OR KILLS UNWANTEDLY
- STA $96
- SEP #$20
- PHX
- PHY
- TYX
- JSR SUB_VERT_POS
- PLY
- PLX
- REP #$20 ;restore Yposition
- PLA
- STA $96
- SEP #$20
- ;BCC .ClippingReturn
- LDA $14C8,y ;stunned = kill
- CMP #$09
- BEQ .Kill
- LDA $7D ;test mario's Yspd
- BMI .Lose
- BEQ .Lose
- CMP #$10 ;even on ground, there's a slight yspeed downward
- BCC .Lose
- BPL .Kill ;kill if falling
- .Lose
- PHX
- LDX $15E9
- LDA #!M_ACTIVE ;clear active mask
- EOR #$FF
- AND !STATE,x
- ORA #!M_LOST ;set shoe lost
- STA !STATE,x
- PLX
- LDA #!SHOELOSTSFX ;play shoe lost sound
- STA !SHOELOSTSFXPORT
- CLC
- RTS
- .Kill
- JSR SUB_STOMP_PTS ;give points
- LDA $1656,y ;set cloud of smoke dissappear
- ORA #$80
- STA $1656,y
- LDA #$02 ;falling
- STA $14C8,y
- JSL $01AA33 ;boost speed
- SEC ;set carry = processed
- .ClippingReturn
- RTS
- ;=====
- MaskSound:
- LDA $1DFA ;test for mario jump
- CMP #$01
- BNE TryN1
- STZ $1DFA ;wipe jump
- TryN1:
- LDA $1DF9 ;test for cape swipe
- CMP #$0F
- BNE TryN2
- STZ $1DF9
- TryN2:
- LDA $1DFC ;test for spin jump
- CMP #$04
- BNE TryN3
- STZ $1DFC
- TryN3:
- RTS
- ;=====
- SHOEFRAME:
- db $4E, $60
- GFX:
- LDA $15F6,x ;properties...
- STA !PROPRAM
- LDA $157C,x ;direction...
- BNE NoFlip
- LDA #$40 ;set mirror
- TSB !PROPRAM
- NoFlip:
- LDA $00 ;xpos
- STA $0300,y
- LDA $01 ;ypos
- STA $0301,y
- LDA $14 ;frame count to figure out shoe frame
- LSR A
- LSR A
- LSR A
- AND #$01
- TAX
- LDA SHOEFRAME,x
- STA $0302,y
- LDA !PROPRAM ;properties
- ORA $64
- STA $0303,y
- LDX $15E9 ;restore sprite
- ;draw mario head
- LDA $00 ;same xpos
- STA $0304,y
- LDA $01 ;sub 16px from ypos
- SEC
- SBC #$10
- STA $0305,y
- LDA !MARIOTILE,x ;set tile to mario's head / cap
- STA $0306,y
- LDA $0313 ;grab palette
- AND #$0E
- ORA #$01 ;set page bit
- PHY
- LDY $157C,x ;test directions
- BNE DrawLeft
- ORA #$40 ;set flip
- DrawLeft:
- ORA $64
- PLY
- STA $0307,y ;copy to sprite properties
- LDX $15E9 ;restore sprite index
- LDY #$02 ;16x16
- LDA #$01 ;2 tiles
- JSL $01B7B3 ;reserve
- RTS
- ;=================
- ;BORROWED ROUTINES
- ;=================
- STAR_SOUNDS:
- db $00,$13,$14,$15,$16,$17,$18,$19
- ;POINTS
- ;======
- 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
- ;GET_DRAW_INFO
- ;==============
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B760 - graphics routine helper - shared
- ; sets off screen flags and sets index to OAM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPR_T1: db $0C,$1C
- SPR_T2: 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 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 ; /
- ;SUBVERTPOS
- ;==========
- 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
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SUB_OFF_SCREEN
- ; This subroutine deals with sprites that have moved off screen
- ; It is adapted from the subroutine at $01AC0D
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SPR_T12: db $40,$B0
- SPR_T13: db $01,$FF
- SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
- db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
- SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
- db $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
Advertisement
Add Comment
Please, Sign In to add comment