Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;=================================
- ; Final Boss - Mario
- ;=================================
- ; For Morton's Empire
- ;=================================
- print "INIT ",pc
- PHY
- JSR SubHorizPos
- TYA
- STA $157C,x
- LDA #$AF
- STA $1540,x
- PLY
- RTL
- print "MAIN ",pc
- PHB
- PHK
- PLB
- JSR Mario
- PLB
- RTL
- ;========================
- ; Main routine
- ;========================
- Mario:
- JSR Graphics
- LDA $14C8,x
- CMP #$08
- BNE .End
- LDA $9D
- BNE .End
- LDA $14
- LSR #3
- AND #$03
- ASL
- STA $1602,x
- LDA $1588,x
- AND #$04
- BNE .OnGround
- LDA $AA,x
- BMI .OnGround
- LDA #$08
- STA $1602,x
- .OnGround
- JSL $81802A
- LDA $C2,x
- ASL
- PHX
- TAX
- JMP (.pointers,x)
- .pointers
- dw Start
- dw SelectAttack
- .End
- RTS
- !MaxLeft = $0060
- !MaxRight = $0060
- Start:
- PLX
- STZ $7B
- STZ $7D
- LDA $1588,x
- AND #$04
- BEQ +
- LDA $163E,x
- BNE +
- STZ $1602,x
- + LDA $1540,x
- BEQ .EndIt
- CMP #$55
- BCS .Return
- CMP #$39
- BCS +
- CMP #$19
- BCC .SpeedSprite
- STZ $157C,x
- + LDA #$0A
- STA $1602,x
- BRA .Return
- .SpeedSprite
- LDA #$16
- STA $B6,x
- LDA $14
- LSR
- AND #$01
- BEQ .Return
- LDA $1588,x
- AND #$04
- BEQ .Return
- LDA #$AE
- STA $AA,x
- LDA #$01
- STA $1DFA
- BRA .Return
- .EndIt
- LDA $1588,x
- AND #$04
- BEQ .Return
- LDA #$0A
- STA $1DF9
- LDA #$74
- JSR SpawnSprite
- LDA #$7F
- STA $163E,x
- LDA #$DB
- STA $B6,x
- LDA #$01
- STA $157C,x
- LDA $14E0,x
- XBA
- LDA $E4,x
- REP #$20
- SBC $94
- ADC.w #!MaxLeft
- CMP.w #!MaxLeft+!MaxRight
- SEP #$20
- BCS .Return
- STZ $7B
- LDA $77
- AND #$04
- BEQ .Return
- LDA #$2F
- STA $1540,x
- STA $B6,x
- INC $C2,x
- .Return
- RTS
- SelectAttack:
- PLX
- STZ $B6,x
- LDA $1540,x
- BNE +
- JSR GenExtra
- LDA #$25
- STA $1540,x
- LDA #$06
- STA $1DFC
- + RTS
- ;========================
- ; Spawn Sprite
- ;========================
- SpawnSprite:
- XBA
- LDA $163E,x
- BNE .EndSpawn
- LDA $186C,x
- BNE .EndSpawn
- JSL $02A9DE
- BMI .EndSpawn
- LDA #$01
- STA $14C8,y
- XBA
- 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
- .EndSpawn
- RTS
- ;========================
- ; Spawn Extended Sprite
- ;========================
- GenExtra:
- LDY #$07
- ExtraLoop:
- LDA $170B,y
- BEQ Extra1
- DEY
- BPL ExtraLoop
- RTS
- Extra1:
- STY $00
- LDA #$05
- STA $170B,y
- LDA #$01
- STA $0F5E,y
- LDA #$30
- STA $173D,y
- LDY $157C,x
- LDA FireSpeeds,y
- LDY $00
- STA $1747,y
- LDY $157C,x
- LDA $E4,x
- CLC
- ADC FirePos,y
- LDY $00
- STA $171F,y
- LDA $14E0,x
- ADC #$00
- STA $1733,y
- LDA $D8,x
- CLC
- ADC #$08
- STA $1715,y
- LDA $14D4,x
- ADC #$00
- STA $1729,y
- LDA #$FF
- STA $176F,y
- RTS
- FirePos:
- db $08,$00
- FireSpeeds:
- db $03,$FD
- ;========================
- ; Graphics routine
- ;========================
- Tilemap:
- db $80,$A0 ; Stand still
- db $80,$82,$80,$A2,$80,$84 ; Walking
- db $86,$A6 ; Falling
- db $88,$A8 ; Looking surprised
- YDisp:
- db $F0,$00
- db $F0,$00,$F0,$00,$F0,$00
- db $F0,$00
- db $F0,$00
- Props:
- db $4F,$0F
- Graphics:
- JSR GetDrawInfo
- LDA $1602,x
- STA $03
- LDA $157C,x
- STA $02
- PHX
- LDX #$01
- - PHX
- TXA
- CLC : ADC $03
- TAX
- LDA $00
- STA $0300,y
- LDA $01
- CLC : ADC YDisp,x
- STA $0301,y
- LDA Tilemap,x
- STA $0302,y
- LDX $02
- LDA Props,x
- STA $0303,y
- PLX
- INY #4
- DEX
- BPL -
- PLX
- LDY #$02
- LDA #$01
- JSL $81B7B3
- 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
- GetDrawInfo:
- 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_Horiz_Pos
- ;==================
- SubHorizPos:
- LDY #$00
- LDA $94
- SEC
- SBC $E4,x
- STA $0F
- LDA $95
- SBC $14E0,x
- BPL $01
- INY
- RTS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement