Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;==========
- ;KooPhD's Vial
- ;Yellow Vial = 3 fireballs.
- ;Red Vial = Mushroom.
- ;Black Vial = Bomb explosion.
- ;Blue Vial = Blue shelless Koopa.
- ;Green Vial = Bomb explosion (only spawns when killed).
- ;==========
- !MushSFX = $03 ; SFX produced when a Mushroom is generated.
- !MushPort = $1DFC
- !FireSFX = $17
- !FirePort = $1DFC
- Rand: ; This table gets a random value.
- db $01,$01,$02,$03 ; More 00s = More Mushrooms.
- db $01,$02,$02,$01 ; More 01s = More chances of bomb explosions.
- db $01,$00,$03,$02 ; More 02s = More chances of fireballs.
- db $03,$02,$03,$00 ; More 03s = More chances of shelless Koopa.
- XPos: db $F0,$00,$10,$20 ; Some properties of the spawned fireballs.
- XSps: db $FA,$00,$05,$0A
- YSps: db $D0,$D2,$D1,$D0
- IMG: db $00,$02,$08,$02 ; Tile numbers of the vial, if you want it to use one frame then just keep all values the same.
- print "INIT ", pc
- JSR SUB_HORZ_POS
- TYA
- STA $157C,x
- LDA $13
- AND #$0F
- PHX
- TAX
- LDA Rand,x
- PLX
- STA $C2,x
- RTL
- Return:
- RTS
- print "MAIN ", pc
- PHB
- PHK
- PLB
- JSR Run
- LDA $1510,x
- STA $0EFB
- PLB
- RTL
- Run:
- JSR GFX
- JSR SUB_OFF_SCREEN_X0
- LDA $14C8,x ;If the sprite is dead..
- CMP #$08
- BNE Return ;..return
- LDA $9D
- BNE Return ;Also return if sprites are locked.
- LDA $1588,x
- AND #$04
- BEQ .A
- JMP OnGround
- .A LDA $1588,x
- AND #$03
- BEQ .B
- JMP OnGround
- .B
- LDA $1510,x
- BEQ +
- JMP EndAim
- ;===============;
- ;X SPEED AIMING ;
- ;===============;
- +
- LDA #$01
- STA $1510,x
- LDY $157C,x
- LDA naut,y
- STA $B6,x
- LDA #$C0
- STA $AA,x
- JSL $01802A
- RTS
- naut: db $30,$D0
- REP #$20
- LDA $14E0,x
- XBA
- LDA $E4,x
- SEC
- SBC $94
- SEP #$20
- PHA
- JSR SUB_HORZ_POS
- PLA
- EOR DirFix,y
- LSR #4
- PHY
- TAY
- LDA XSPEEDS,y
- PHA
- LDA $157C,x
- BEQ .R
- PLA
- EOR #$FF
- INC A
- BRA ++
- .R
- PLA
- ++
- ;STA $B6,x
- PLY
- ;===============;
- ;Y SPEED AIMING ;
- ;===============;
- REP #$20
- LDA $14D4,x
- XBA
- LDA $D8,x
- SEC
- SBC $96
- SEP #$20
- PHA
- JSR SUB_VERT_POS
- PLA
- EOR DirFix,y
- LSR #4
- PHY
- TAY
- LDA YSPEEDS,y
- STA $AA,x
- PLY
- EndAim:
- JSL $01802A
- RTS
- XSPEEDS:
- db $05,$0B,$10,$17
- db $1D,$22,$29,$2F
- db $35,$3C,$43,$4A
- db $50,$58,$60,$67
- YSPEEDS:
- db $E0,$D0,$C0,$C0
- db $BA,$B6,$AB,$A6
- db $A2,$A0,$97,$90
- db $8E,$8B,$D5,$D0
- OnGround:
- LDA $7FAB10,x
- AND #$04
- BNE Green
- LDA $C2,x
- BEQ Mush
- CMP #$01
- BNE +
- JMP Bomb
- + CMP #$03
- BEQ Koopa
- CMP #$02
- BNE +
- JMP Yellow
- + RTS
- DirFix: db $FF,$00
- Green:
- LDA $1504,x
- BNE EndSpawnX
- LDA $186C,x
- BNE EndSpawnX
- JSL $02A9DE
- BMI EndSpawnX
- LDA #$08
- STA $14C8,y
- LDA #$0D
- STA $009E,y
- LDA $E4,x
- STA $00E4,y
- LDA $14E0,x
- STA $14E0,y
- LDA $D8,x
- STA $00D8,y
- LDA $14D4,x
- STA $14D4,y
- LDA #$01
- STA $1540,y
- LDA #$01
- STA $1534,y
- LDA #$1B
- STA $167A,y
- LDA #$09
- STA $1686,y
- PHX
- TYX
- JSL $07F7D2
- PLX
- LDA #$01
- STA $1504,x
- EndSpawnX:
- STZ $14C8,x
- RTS
- Mush:
- LDA $186C,x
- BNE EndSpawn
- JSL $02A9DE
- BMI EndSpawn
- LDA #$08
- STA $14C8,y
- LDA #$74
- JMP SPAWNSPR
- Koopa:
- LDA $186C,x
- BNE EndSpawn
- JSL $02A9DE
- BMI EndSpawn
- LDA #$08
- STA $14C8,y
- LDA #$02
- SPAWNSPR:
- STA $009E,y
- LDA $E4,x
- STA $00E4,y
- LDA $14E0,x
- STA $14E0,y
- LDA $D8,x
- STA $00D8,y
- LDA $14D4,x
- STA $14D4,y
- PHX
- TYX
- JSL $07F7D2
- PLX
- LDA #!MushSFX
- STA !MushPort
- EndSpawn:
- LDA $1626,x
- BNE +
- JSR Smoke
- INC $1626,x
- +
- STZ $14C8,x
- RTS
- Bomb:
- LDA #$15
- STA $1887
- LDA #$0D
- STA $9E,x
- LDA #$08
- STA $14C8,x
- JSL $07F7D2
- LDA #$01
- STA $1534,x
- LDA #$40
- STA $1540,x
- LDA #$09
- STA $1DFC
- LDA #$1B
- STA $167A,x
- RTS
- Yellow:
- LDA #!FireSFX
- STA !FirePort
- LDA $E4,x
- STA $00
- LDA $14E0,x
- STA $01
- LDA $D8,x
- STA $02
- LDA $14D4,x
- STA $03
- PHX
- JSR SWNSPR
- PLX
- STZ $14C8,x
- RTS
- SWNSPR:
- LDX #$09
- LDY #$00
- Loop:
- CPY #$04
- BCS EndLoop
- LDA $170B,x
- BEQ EmptySlot
- DEX
- BPL Loop
- EndLoop:
- RTS
- EmptySlot:
- LDA #$0B
- STA $170B,x
- LDA $00
- CLC
- ADC XPos,y
- STA $171F,x ; X position low byte
- LDA $01
- ADC #$00
- STA $1733,x ; X position high byte
- LDA $02
- STA $1715,x ; Y position low byte
- LDA $03
- STA $1729,x ; Y position high byte
- LDA YSps,y
- STA $173D,x
- LDA XSps,y
- STA $1747,x
- LDA #$DC
- STA $176F,x
- INY
- DEX
- BRA Loop
- ;This routine makes a puff smoke effect.
- Smoke:
- LDY #$03
- -
- LDA $17C0,y
- BEQ +
- DEY
- BPL -
- RTS
- +
- LDA #$01
- STA $17C0,y
- LDA #$1C
- STA $17CC,y
- LDA $D8,x
- STA $17C4,y
- LDA $E4,x
- STA $17C8,y
- RTS
- Props:
- db $69,$29
- db $6D,$2D
- db $65,$25
- db $67,$27
- db $6B,$2B
- ;Sprite Routines
- GFX:
- JSR GET_DRAW_INFO
- LDA $C2,x
- STA $04
- LDA $157C,x
- STA $02
- LDA $00
- STA $0300,y
- LDA $01
- STA $0301,y
- LDA $14
- LSR
- AND #$03
- PHX
- TAX
- LDA IMG,x
- PLX
- STA $0302,y
- LDA $7FAB10,x
- AND #$04
- BEQ +
- PHX
- LDA #$08
- CLC
- ADC $02
- TAX
- LDA Props,x
- BRA ++
- +
- LDA $04
- ASL A
- CLC
- ADC $02
- PHX
- TAX
- LDA Props,x
- ++
- ORA $64
- STA $0303,y
- INY #4
- PLX
- LDY #$02
- LDA #$00
- JSL $01B7B3
- RTS
- ;=================;
- ;SUB_HORZ_POS
- ;=================;
- SUB_HORZ_POS:
- LDY #$00
- LDA $D1
- SEC
- SBC $E4,x
- STA $0F
- LDA $D2
- SBC $14E0,x
- BPL SPR_L16
- INY
- SPR_L16:
- RTS
- ;=================;
- ;SUB_VERT_POS
- ;=================;
- SUB_VERT_POS:
- LDY #$00
- LDA $D3
- SEC
- SBC $D8,x
- STA $0F
- LDA $D4
- SBC $14D4,x
- BPL SPR_L11
- INY
- SPR_L11:
- RTS
- ;=================;
- ;SUB_OFF_SCREEN
- ;=================;
- SPR_T12:
- db $40,$B0
- SPR_T13:
- db $01,$FF
- SPR_T14:
- db $30,$C0,$A0,$C0,$A0,$F0,$60,$90
- db $30,$C0,$A0,$80,$A0,$40,$60,$B0
- SPR_T15:
- db $01,$FF,$01,$FF,$01,$FF,$01,$FF
- db $01,$FF,$01,$FF,$01,$00,$01,$FF
- SUB_OFF_SCREEN_X1:
- LDA #$02
- BRA STORE_03
- 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
- BEQ RETURN_35
- LDA $5B
- AND #$01
- BNE VERTICAL_LEVEL
- LDA $D8,x
- CLC
- ADC #$50
- LDA $14D4,x
- ADC #$00
- CMP #$02
- BPL ERASE_SPRITE
- LDA $167A,x
- AND #$04
- BNE RETURN_35
- LDA $13
- AND #$01
- ORA $03
- STA $01
- TAY
- LDA $1A
- CLC
- ADC SPR_T14,y
- ROL $00
- CMP $E4,x
- PHP
- LDA $1B
- LSR $00
- ADC SPR_T15,y
- PLP
- SBC $14E0,x
- STA $00
- LSR $01
- BCC SPR_L31
- EOR #$80
- STA $00
- SPR_L31:
- LDA $00
- BPL RETURN_35
- ERASE_SPRITE:
- LDA $14C8,x
- CMP #$08
- BCC KILL_SPRITE
- LDY $161A,x
- CPY #$FF
- BEQ KILL_SPRITE
- LDA #$00
- STA $1938,y
- KILL_SPRITE:
- STZ $14C8,x
- RETURN_35:
- RTS
- VERTICAL_LEVEL:
- LDA $167A,x
- AND #$04
- BNE RETURN_35
- LDA $13
- LSR A
- BCS RETURN_35
- LDA $E4,x
- CMP #$00
- LDA $14E0,x
- SBC #$00
- CMP #$02
- BCS ERASE_SPRITE
- LDA $13
- LSR A
- AND #$01
- STA $01
- TAY
- LDA $1C
- CLC
- ADC SPR_T12,y
- ROL $00
- CMP $D8,x
- PHP
- LDA $001D
- LSR $00
- ADC SPR_T13,y
- PLP
- SBC $14D4,x
- STA $00
- LDY $01
- BEQ SPR_L38
- EOR #$80
- STA $00
- SPR_L38:
- LDA $00
- BPL RETURN_35
- BMI ERASE_SPRITE
- SUB_IS_OFF_SCREEN:
- LDA $15A0,x
- ORA $186C,x
- RTS
- ;================;
- ;GET_DRAW_INFO
- ;================;
- SPR_T1:
- db $0C,$1C
- SPR_T2:
- db $01,$02
- GET_DRAW_INFO:
- STZ $186C,x
- STZ $15A0,x
- LDA $E4,x
- CMP $1A
- 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
- CLC
- ADC.w #$0040
- CMP.w #$0180
- SEP #$20
- ROL A
- AND #$01
- STA $15C4,x
- BNE INVALID
- LDY #$00
- LDA $1662,x
- AND #$20
- BEQ ON_SCREEN_LOOP
- INY
- ON_SCREEN_LOOP:
- LDA $D8,x
- CLC
- ADC SPR_T1,y
- PHP
- CMP $1C
- ROL $00
- PLP
- LDA $14D4,x
- ADC #$00
- LSR $00
- SBC $1D
- BEQ ON_SCREEN_Y
- LDA $186C,x
- ORA SPR_T2,y
- STA $186C,x
- ON_SCREEN_Y:
- DEY
- BPL ON_SCREEN_LOOP
- LDY $15EA,x
- LDA $E4,x
- SEC
- SBC $1A
- STA $00
- LDA $D8,x
- SEC
- SBC $1C
- STA $01
- RTS
- INVALID:
- PLA
- PLA
- RTS
- CODE_01BF6A: STA $01
- PHX ;\ preserve sprite indexes of Magikoopa and magic
- PHY ;/
- JSR CODE_01AD42 ; $0E = vertical distance to Mario
- STY $02 ; $02 = vertical direction to Mario
- LDA $0E ;\ $0C = vertical distance to Mario, positive
- BPL CODE_01BF7C ; |
- EOR #$FF ; |
- CLC ; |
- ADC #$01 ; |
- CODE_01BF7C: STA $0C ;/
- JSR SUB_HORZ_POS ; $0F = horizontal distance to Mario
- STY $03 ; $03 = horizontal direction to Mario
- LDA $0F ;\ $0D = horizontal distance to Mario, positive
- BPL CODE_01BF8C ; |
- EOR #$FF ; |
- CLC ; |
- ADC #$01 ; |
- CODE_01BF8C: STA $0D ;/
- LDY #$00
- LDA $0D ;\ if vertical distance less than horizontal distance,
- CMP $0C ; |
- BCS CODE_01BF9F ;/ branch
- INY ; set y register
- PHA ;\ switch $0C and $0D
- LDA $0C ; |
- STA $0D ; |
- PLA ; |
- STA $0C ;/
- CODE_01BF9F: LDA #$00 ;\ zero out $00 and $0B
- STA $0B ; | ...what's wrong with STZ?
- STA $00 ;/
- LDX $01 ;\ divide $0C by $0D?
- CODE_01BFA7: LDA $0B ; |\ if $0C + loop counter is less than $0D,
- CLC ; | |
- ADC $0C ; | |
- CMP $0D ; | |
- BCC CODE_01BFB4 ; |/ branch
- SBC $0D ; | else, subtract $0D
- INC $00 ; | and increase $00
- CODE_01BFB4: STA $0B ; |
- DEX ; |\ if still cycles left to run,
- BNE CODE_01BFA7 ;/ / go to start of loop
- TYA ;\ if $0C and $0D was not switched,
- BEQ CODE_01BFC6 ;/ branch
- LDA $00 ;\ else, switch $00 and $01
- PHA ; |
- LDA $01 ; |
- STA $00 ; |
- PLA ; |
- STA $01 ;/
- CODE_01BFC6: LDA $00 ;\ if horizontal distance was inverted,
- LDY $02 ; | invert $00
- BEQ CODE_01BFD3 ; |
- EOR #$FF ; |
- CLC ; |
- ADC #$01 ; |
- STA $00 ;/
- CODE_01BFD3: LDA $01 ;\ if vertical distance was inverted,
- LDY $03 ; | invert $01
- BEQ CODE_01BFE0 ; |
- EOR #$FF ; |
- CLC ; |
- ADC #$01 ; |
- STA $01 ;/
- CODE_01BFE0: PLY ;\ retrieve Magikoopa and magic sprite indexes
- PLX ;/
- RTS ; return
- CODE_01AD42: LDY #$00
- LDA $D3
- SEC
- SBC $D8,x
- STA $0E
- LDA $D4
- SBC $14D4,x
- BPL Return01AD53
- INY
- Return01AD53: RTS ; return
Add Comment
Please, Sign In to add comment