Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- print "INIT ",pc
- JSR SUB_HORZ_POS
- TYA
- STA $157C,x
- RTL
- print "MAIN ",pc
- PHB
- PHK
- PLB
- JSR SPR_MAIN
- PLB
- RTL
- RETURN: RTS
- SPR_MAIN:
- JSR SPR_GFX
- LDA $14C8,x
- CMP #$08
- BNE RETURN
- LDA $9D
- BNE RETURN
- JSL $018032
- LDA $1588,x
- AND #$03
- BEQ NOTWALL
- LDA $157C,x
- EOR #$01
- STA $157C,x
- NOTWALL:
- LDA $C2,x
- CMP #$01
- BNE NORMAL
- STZ $B6,x
- BRA CONTACT_STUFF
- RTS
- NORMAL:
- LDA $1588,x
- AND #$04
- BEQ CONTACT_STUFF
- LDY $157C,x
- LDA XSPD,y
- STA $B6,x
- LDA #$10
- STA $AA,x
- CONTACT_STUFF:
- JSL $01802A
- JSL $01A7DC
- BCC NOCONTACT
- LDA $1490
- BNE HasStar
- JSL $00F5B7
- RTS
- HasStar:
- LDA #$02 ;\ Set the sprite status to ..
- STA $14C8,x ;/ Killed by a star.
- LDA #$D0 ;
- STA $AA,x ;/ Set Y speed so sprite falls down.
- INC $18D2 ; Increase number of consective enemies stomped/ killed by star.
- LDA $18D2 ; IF consecutive # of enemies killed by star/stomped ..
- CMP #$08 ; IS 8 ..
- BCC NotEight
- LDA #$08 ;\ Keep it static at 8, because you get 1-ups all the time afterwards.
- STA $18D2 ;/
- NotEight:
- JSL $02ACE5 ; This code calls the "give points" routine.
- LDY $18D2 ; Get consecutive # of enemies stomped in Y.
- CPY #$08 ; If it's less than 8 once again, return.
- BCC NoSound
- LDA StarSFX,y
- STA $1DF9
- RTS
- NoSound:
- LDA #$13
- STA $1DF9
- RTS ; Return.
- StarSFX: db $00,$13,$14,$15,$16,$17,$18,$19
- NOCONTACT:
- LDA $1534,x
- CMP #$BE
- BEQ SHOOTFIRE
- INC $1534,x
- LDA $1594,x
- CMP #$50
- BEQ ENDNOW
- INC $1594,x
- RTS
- ENDNOW:
- STZ $1594,x
- STZ $C2,x
- RTS
- XSPD: db $10,$F0
- SHOOTFIRE:
- PHY
- JSR SUB_HORZ_POS
- TYA
- STA $157C,x
- PLY
- LDA #$01
- STA $C2,x
- STZ $1534,x
- LDY #$01 ; number of projectiles to spawn
- - TYA ; \
- STA $00 ; / get number within loop
- PHY
- JSR .spawnfireball ; spawn fireball
- PLY
- DEY
- BPL -
- RTS
- .spawnfireball
- LDY #$07 ; number of slots to check for (#$07 = 8 slots; leaves the last 2 slots for Mario's fireballs)
- - LDA $170B,y
- BEQ Extra1
- DEY
- BPL -
- RTS
- Extra1:
- LDA #$02
- STA $170B,y
- LDA $E4,x
- STA $171F,y
- LDA $14E0,x
- STA $1733,y
- LDA $D8,x
- STA $1715,y
- LDA $14D4,x
- STA $1729,y
- PHY
- LDY $157C,x
- LDA .fireball_xspeed,y
- PLY
- STA $1747,y
- PHY
- LDY $00
- LDA .fireball_yspeed,y
- PLY
- STA $173D,y
- LDA #$06
- STA $1DFC
- LDA #$FF
- STA $176F,y
- RTS
- .fireball_xspeed
- db $16,$EA
- .fireball_yspeed
- db $00,$FB
- ;;;;;;;;;;;;;; GFX ROUTINE ;;;;;;;;;;;;;;;;;;
- TILEMAP:
- db $82,$8C ; FRAME 1
- db $84,$88 ; FRAME 2
- PROP:
- db $00,$40
- YDISP:
- db $10,$00 ; RIGHT
- db $10,$00 ; LEFT
- SPR_GFX:
- JSR GET_DRAW_INFO
- PHX
- LDA $157C,x
- STA $02
- TAX
- LDA PROP,x
- STA $0F
- PLX
- LDA $14
- LSR #3
- CLC : ADC $15E9
- AND #$01 ; ANIMATE BETWEEN TWO FRAMES
- ASL A
- STA $03
- LDA $C2,x
- CMP #$01
- BEQ SPR_GFX1
- PHX
- LDX #$01 ; 2 TILES DRAWN SO LOOP ONCE
- LOOP:
- LDA $00
- STA $0300,y
- LDA $01
- SEC : SBC YDISP,x
- STA $0301,y
- PHX
- LDX $15E9
- LDA $15F6,x
- ORA $0F
- ORA $64
- STA $0303,y
- PLX
- PHX
- TXA
- CLC : ADC $03
- TAX
- LDA TILEMAP,x
- STA $0302,y
- PLX
- INY #4
- DEX
- BPL LOOP
- PLX
- LDY #$02 ; 16X16 TILES
- LDA #$01 ; 2 TILES DRAWN
- JSL $01B7B3
- RTS
- ;;;;;;;;;;;;;;;
- FIRE_TILEMAP:
- db $82,$86 ; FRAME 1
- db $84,$86 ; FRAME 2
- SPR_GFX1:
- PHX
- LDX #$01 ; 2 TILES DRAWN SO LOOP ONCE
- LOOP1:
- LDA $00
- STA $0300,y
- LDA $01
- SEC : SBC YDISP,x
- STA $0301,y
- PHX
- LDX $15E9
- LDA $15F6,x
- ORA $0F
- ORA $64
- STA $0303,y
- PLX
- PHX
- TXA
- CLC : ADC $03
- TAX
- LDA FIRE_TILEMAP,x
- STA $0302,y
- PLX
- INY #4
- DEX
- BPL LOOP1
- PLX
- LDY #$02 ; 16X16 TILES
- LDA #$01 ; 2 TILES DRAWN
- JSL $01B7B3
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; GET_DRAW_INFO
- ; This is a helper for the graphics routine. It sets off screen flags, and sets up
- ; variables. It will return with the following:
- ;
- ; Y = index to sprite OAM ($300)
- ; $00 = sprite x position relative to screen boarder
- ; $01 = sprite y position relative to screen boarder
- ;
- ; It is adapted from the subroutine at $03B760
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- 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 horz pos
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_HORZ_POS: LDY #$00
- LDA $94
- SEC
- SBC $E4,x
- STA $0F
- LDA $95
- SBC $14E0,x
- BPL SPR_L16
- INY
- SPR_L16: RTS
- recip_sqrt_lookup:
- dw $0000,$FFFF,$B505,$93CD,$8000,$727D,$6883,$60C2
- dw $5A82,$5555,$50F4,$4D30,$49E7,$4700,$446B,$4219
- dw $4000,$3E17,$3C57,$3ABB,$393E,$37DD,$3694,$3561
- dw $3441,$3333,$3235,$3144,$3061,$2F8A,$2EBD,$2DFB
- dw $2D41,$2C90,$2BE7,$2B46,$2AAB,$2A16,$2987,$28FE
- dw $287A,$27FB,$2780,$270A,$2698,$262A,$25BF,$2557
- dw $24F3,$2492,$2434,$23D9,$2380,$232A,$22D6,$2285
- dw $2236,$21E8,$219D,$2154,$210D,$20C7,$2083,$2041
- dw $2000,$1FC1,$1F83,$1F46,$1F0B,$1ED2,$1E99,$1E62
- dw $1E2B,$1DF6,$1DC2,$1D8F,$1D5D,$1D2D,$1CFC,$1CCD
- dw $1C9F,$1C72,$1C45,$1C1A,$1BEF,$1BC4,$1B9B,$1B72
- dw $1B4A,$1B23,$1AFC,$1AD6,$1AB1,$1A8C,$1A68,$1A44
- dw $1A21,$19FE,$19DC,$19BB,$199A,$1979,$1959,$1939
- dw $191A,$18FC,$18DD,$18C0,$18A2,$1885,$1869,$184C
- dw $1831,$1815,$17FA,$17DF,$17C5,$17AB,$1791,$1778
- dw $175F,$1746,$172D,$1715,$16FD,$16E6,$16CE,$16B7
- dw $16A1,$168A,$1674,$165E,$1648,$1633,$161D,$1608
- dw $15F4,$15DF,$15CB,$15B7,$15A3,$158F,$157C,$1568
- dw $1555,$1542,$1530,$151D,$150B,$14F9,$14E7,$14D5
- dw $14C4,$14B2,$14A1,$1490,$147F,$146E,$145E,$144D
- dw $143D,$142D,$141D,$140D,$13FE,$13EE,$13DF,$13CF
- dw $13C0,$13B1,$13A2,$1394,$1385,$1377,$1368,$135A
- dw $134C,$133E,$1330,$1322,$1315,$1307,$12FA,$12ED
- dw $12DF,$12D2,$12C5,$12B8,$12AC,$129F,$1292,$1286
- dw $127A,$126D,$1261,$1255,$1249,$123D,$1231,$1226
- dw $121A,$120F,$1203,$11F8,$11EC,$11E1,$11D6,$11CB
- dw $11C0,$11B5,$11AA,$11A0,$1195,$118A,$1180,$1176
- dw $116B,$1161,$1157,$114D,$1142,$1138,$112E,$1125
- dw $111B,$1111,$1107,$10FE,$10F4,$10EB,$10E1,$10D8
- dw $10CF,$10C5,$10BC,$10B3,$10AA,$10A1,$1098,$108F
- dw $1086,$107E,$1075,$106C,$1064,$105B,$1052,$104A
- dw $1042,$1039,$1031,$1029,$1020,$1018,$1010,$1008
- aiming: PHX
- PHY
- PHP
- SEP #$30
- STA $0F
- LDX #$00
- REP #$20
- LDA $00
- BPL .pos_dx
- EOR #$FFFF
- INC
- INX
- INX
- STA $00
- .pos_dx SEP #$20
- STA $4202
- STA $4203
- NOP
- NOP
- NOP
- REP #$20
- LDA $4216
- STA $04
- LDA $02
- BPL .pos_dy
- EOR #$FFFF
- INC
- INX
- STA $02
- .pos_dy SEP #$20
- STA $4202
- STA $4203
- STX $0E
- REP #$30
- LDA $04
- CLC
- ADC $4216
- LDY #$0000
- BCC .loop
- INY
- ROR
- LSR
- .loop CMP #$0100
- BCC +
- INY
- LSR
- LSR
- BRA .loop
- + CLC
- ASL
- TAX
- LDA recip_sqrt_lookup,x
- - DEY
- BMI +
- LSR
- BRA -
- + SEP #$30
- STA $4202
- LDA $0F
- STA $4203
- NOP
- STZ $05
- STZ $07
- LDA $4217
- STA $04
- XBA
- STA $4202
- LDA $0F
- STA $4203
- REP #$20
- LDA $04
- CLC
- ADC $4216
- STA $04
- SEP #$20
- LDX #$02
- - LDA $04
- STA $4202
- LDA $00,x
- STA $4203
- NOP
- NOP
- NOP
- NOP
- LDA $4217
- STA $06
- LDA $05
- STA $4202
- LDA $00,x
- STA $4203
- REP #$20
- LDA $06
- CLC
- ADC $4216
- SEP #$20
- LSR $0E
- BCS +
- EOR #$FF
- INC
- + STA $00,x
- DEX
- DEX
- BPL -
- PLP
- PLY
- PLX
- RTL
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement