Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- !mario_color = $5C
- !MarioPalette = $7F9E00
- !ptile_sprnum = $02
- ; Internal defines.
- ; Used to make code readable, nothing else: don't fiddle with them.
- !state = $C2
- !pose = $1510
- !ptile_count = $157C
- !gfxframe = $151C
- !waittime = $1540
- !vislvl = $1504
- !yposl = $D8
- !xposl = $E4
- !xposh = $14E0
- !yposh = $14dD4
- !xspd = $B6
- !yspd = $AA
- !hp = $1528
- !hit_timer = $154C
- print "INIT ", pc
- Init:
- LDA #$00 : STA !mario_color
- LDA #$05 : STA !hp,x
- LDA #$07 : STA !vislvl,x
- LDA #$01 : STA !state,x
- STA !pose,x
- RTL
- print "MAIN ", pc
- PHB
- PHK : PLB
- JSR Main
- PLB
- RTL
- mario_ctable:
- dw $7FFF, $7FFF, $7FFF, $7FFF ; unused
- dw $03E0, $1745, $2EAB, $4210 ; green
- dw $01FF, $14BA, $2D75, $4210 ; red
- dw $7C00, $68A5, $556B, $4210 ; blue
- Main:
- LDA !mario_color : ASL : TAY : REP #$20 : LDA mario_ctable,y : STA !MarioPalette : SEP #$20
- LDA !hit_timer,x : AND #$02 : BEQ .nohit
- .hit
- LDA !vislvl,x : PHA : ORA #$04 : STA !vislvl,x : BRA .dur
- .nohit
- LDA !vislvl,x : PHA
- .dur
- ; horrible, hacky shit to fake jsr (addr,x) without using x
- STZ $08
- LDA !pose,x
- REP #$20
- PEA.w .retpgfx-1
- ASL : TAY : LDA gfxrtnptr,y
- PHA : SEP #$20 : RTS
- .retpgfx
- PLA : STA !vislvl,x
- LDA $9D : BNE .endmain
- LDA !state,x
- REP #$20
- PEA.w .retpmain-1
- ASL : TAY : LDA mainrtnptr,y
- PHA : SEP #$20 : RTS
- .retpmain
- .endmain
- RTS
- gfxrtnptr:
- dw dead_gfx-1
- dw float_gfx-1
- dw attack_gfx-1
- mainrtnptr:
- dw dead-1
- dw fadein-1
- dw floatinit-1
- dw float-1
- dw fadeout-1
- dw teleport-1
- dw wait-1
- dw fadein-1
- dw attack_init-1
- dw attack-1
- dw floatinit-1
- dw float-1
- dw fadeout-1
- dw teleport-1
- dw wait-1
- dw restart-1
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; MAIN ROUTINES
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- dead:
- STZ !hit_timer,x ;\
- LDA #$08 : STA $18BD ; | Boss dead routine.
- LDA !hp,x ; | Basically:
- CMP #$0F : BCC .bigcircle ; | -Generate rainbow circle
- CMP #$40 : BEQ .tport ; | -Teleport
- BCS .reallydone ;/ -Done
- .whitescreen
- LDA #$10 : TRB $0D9F
- INC !hp,x
- RTS
- .tport
- LDA #$06 : STA $71
- STZ $88
- STZ $89
- .reallydone
- RTS
- .bigcircle
- REP #$10
- LDY #$3202 : STY $4340
- LDY.w #rainbow_table : STY $4342
- LDA.b #rainbow_table>>16 : STA $4344
- SEP #$10
- LDA #$10 : TSB $0D9F
- LDA #$40 : STA $212E
- LDA #$23 : STA $40
- LDA #$22 : STA $41 : STA $42 : STA $43
- LDA #$10 : STA $44
- LDA $1433 : LSR #4 : STA.l $7FC070
- STA !hp,x
- INC $1433 : INC $1433
- LDA !xposl,x : CLC : ADC #$10 : STA $00
- LDA $FFFFFF
- LDA !yposl,x : CLC : ADC #$10
- CMP #$70 : BCS .turd : LDA #$70
- .turd
- STA $01
- LDA $14 : LSR : BCC .ret
- REP #$30 : PHX
- LDA #$CB12 : STA $04 : STA $06 : SEP #$30
- PHB : LDA #$80 : PHA : PLB
- PHK : PEA.w .retp-1
- PEA.w $974F-1 ; set up long return for short subroutine
- LDA $01
- JML $00CA88|$800000
- .retp
- PLB : REP #$10 : PLX
- SEP #$30
- .ret
- RTS
- restart:
- LDA #$07 : STA !vislvl,x
- LDA #$01 : STA !state,x
- RTS
- floatinit:
- LDA #$60 : STA !waittime,x
- INC !state,x
- float:
- LDA #$01 : STA !pose,x
- LDA !waittime,x : BNE + : INC !state,x : +
- JSR collision
- RTS
- attack_init:
- ; get a random number between $01-$06
- ; and use it as a projectile count
- JSL $01ACF9
- STZ $4204 : LDA $148D : STA $4205
- LDA #$05 : STA $4206
- JSR divwait
- LDA $4216 : INC
- STA !ptile_count,x
- LDA #15 : STA !waittime,x
- INC !state,x
- RTS
- attack:
- LDA #$02 : STA !pose,x
- LDA !waittime,x : BNE .no_ptile
- .prep_ptile
- ; find free sprite slot
- LDY #$09
- - LDA $14C8,y : BEQ .make_ptile ; find a free sprite slot...
- DEY : BPL - : BMI .state_handle ; if there isn't one, don't fire
- .make_ptile
- JSL $01ACF9 ; random
- LDA #$20 : JSR Magikoopa_Aim
- PHX
- TYX : JSL $07F7D2 : JSL $0187A7
- LDA #$01 : STA $14C8,y
- LDA #!ptile_sprnum : STA $7FAB9E,x
- LDA #$88 : STA $7FAB10,x : STA $7FAB1C,x
- PLX
- LDA !xposl,x : STA.w !xposl,y
- LDA !xposh,x : STA !xposh,y
- LDA !yposl,x : STA.w !yposl,y
- LDA !yposh,x : STA !yposh,y
- LDA $148D : AND #$07 : CMP #$04 : BCS .color
- .gray
- LDA #$00 : STA $1510,y
- .color
- AND #$03 : STA $1510,y
- .state_handle
- DEC !ptile_count,x : BEQ .changestate
- LDA #15 : STA !waittime,x
- BRA .ret
- .changestate
- LDA #60 : STA !waittime,x
- INC !state,x
- BRA .ret
- .no_ptile
- .ret
- JSR collision
- RTS
- collision: ; Collide and interact with Mario.
- ; preserve x and y pos before moving to float
- LDA !hit_timer,x : BNE .ret
- LDA !xposh,x : PHA : XBA : LDA !xposl,x : PHA
- ; $00=xpos
- REP #$20 : STA $00 : SEP #$20
- LDA !yposh,x : PHA : XBA : LDA !yposl,x : PHA
- ; offset the y pos to match the floating
- JSR framesine : LSR #4 : STA $02 : STZ $03
- LDA !yposh,x : XBA : LDA !yposl,x
- ; $02=ypos
- REP #$20 : CLC : ADC $02 : STA $02 : SEP #$20
- STA !yposl,x : XBA : STA !yposh,x
- JSL $01A7DC
- BCC .notouch
- .touch
- LDA $0E : CMP #$E6 : BPL .spritewins
- .playerwins
- JSL $01AA33
- JSL $01AB99
- LDA #$13 : STA $1DF9
- LDA #30 : STA !hit_timer,x
- DEC !hp,x : BNE .notouch
- STZ !hp,x : STZ !state,x : STZ !pose,x
- BRA .notouch
- .spritewins
- JSL $00F5B7
- .notouch
- ; restore x and y pos
- PLA : STA !yposl,x : PLA : STA !yposh,x
- PLA : STA !xposl,x : PLA : STA !xposh,x
- .ret
- RTS
- teleport:
- LDA #$02 : STA !pose,x
- ; get a random number between $10-$E0
- JSL $01ACF9
- STZ $4204 : LDA $148D : STA $4205
- LDA #$D0 : STA $4206
- JSR divwait
- LDA #$10 : CLC : ADC $4216
- ; use it as our xpos
- STA !xposl,x
- ; get a random number between $10-$D0
- JSL $01ACF9
- STZ $4204 : LDA $148D : STA $4205
- LDA #$C0 : STA $4206
- JSR divwait
- LDA #$10 : CLC : ADC $4216
- ; use it as our ypos
- STA !yposl,x
- ; then we're done with this!
- LDA #60 : STA !waittime,x
- INC !state,x
- RTS
- fadeout:
- LDA $14 : AND #$03 : BNE .ret
- INC !vislvl,x : LDA !vislvl,x : CMP #$07 : BNE .noend
- ; if that puts visiblity at full, this state is done
- INC !state,x
- .noend
- LDA !vislvl,x : CMP #$04 : BCS .nocollide ; collide if he's visible enough
- JSR collision
- .nocollide
- .ret
- RTS
- fadein:
- LDA #$01 : STA !pose,x
- LDA $14 : AND #$03 : BNE .ret
- DEC !vislvl,x : LDA !vislvl,x : BNE .noend
- ; if that puts visiblity at 0, this state is done
- INC !state,x
- .noend
- LDA !vislvl,x : CMP #$04 : BCS .nocollide ; collide if he's visible enough
- JSR collision
- .nocollide
- .ret
- RTS
- wait:
- LDA !waittime,x : BNE .time
- .timeup
- INC !state,x
- .time
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; GRAPHICS ROUTINES
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Throughout these routines, $08 is used as a tile counter.
- ; $07 is used as a loop counter when x is not available.
- body_xoffsets:
- db $00,$10,$00,$10
- body_xoffsets_l:
- db $00,$10,$00,$10
- body_yoffsets:
- db $00,$00,$10,$10
- hand_xoffsets_r:
- db $00,$10
- hand_xoffsets_l:
- db $00,$10
- attack_gfx:
- float_gfx:
- LDA $9D : BNE +
- INC !gfxframe,x
- +
- dead_gfx:
- JSR GET_DRAW_INFO
- LDA #$06 : STA $04
- JSR body_draw
- LDY #$02 : LDA $08 : JSL $01B7B3
- no_gfx:
- RTS
- body_draw:
- PHX
- LDX #$03
- .loop
- LDA $04 : STA $0302,y
- LDA #$29 : STA $0303,y
- LDA $00 : CLC : ADC body_xoffsets,x : STA $0300,y
- JSR framesine : LSR #5
- CLC : ADC $01 : CLC : ADC body_yoffsets,x : STA $0301,y
- DEC $04 : DEC $04
- INC $08 : INY #4
- DEX : BPL .loop
- PLX
- JSR feet_draw
- JSR hand_draw
- JSR overlay
- RTS
- feet_draw:
- LDA $00 : STA $0300,y
- CLC : ADC #$0D : STA $0304,y
- LDA #$46 : STA $0302,y : STA $0306,y
- LDA #$29 : STA $0303,y : STA $0307,y
- ; move them vertically on a sine thing
- JSR framesine : LSR #4
- CLC : ADC $01
- CLC : ADC #$20
- STA $0301,y : STA $0305,y
- INC $08 : INC $08
- TYA : CLC : ADC #$08 : TAY
- RTS
- hand_draw:
- JSR framesine : LSR #5 : EOR #$FF : SEC : SBC #$06 : SEC : ADC $00 : STA $0300,y ; lhand xpos = body xpos - #$08 - framesine
- JSR framesine : LSR #5 : CLC : ADC $00 : CLC : ADC #$18 : STA $0304,y ; rhand xpos = body xpos + #$30 + framesine
- LDA #$08 : STA $0302,y ; lhand
- LDA #$0A : STA $0306,y ; rhand
- LDA #$23 : STA $0303,y : STA $0307,y
- ; move them vertically on a sine thing
- JSR framesine : LSR #4
- CLC : ADC $01
- CLC : ADC #$18
- STA $0301,y : STA $0305,y
- INC $08 : INC $08
- TYA : CLC : ADC #$08 : TAY
- RTS
- overlay: ; Used once all the other graphics are done to (partially) hide the boss.
- ; select overlay tile/whether to even draw overlay
- LDA !vislvl,x : BEQ .ret
- ASL : CLC : ADC #$60 : STA $0F
- PHX
- ; draw overlay
- LDA $08 : STA $09 : INC : ASL #2 : STA $0A
- TYA : SEC : SBC $0A : TAX
- .loop
- LDA $0300,x : STA $0300,y
- LDA $0301,x : STA $0301,y
- LDA $0302,x : STA $0302,y
- LDA $0303,x : STA $0303,y
- LDA $0F : STA $0302,x
- LDA $0303,x : AND #$CF : STA $0303,x
- INX #4 : INY #4
- DEC $09 : BPL .loop
- .end
- ASL $08
- PLX
- .ret
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; MISC ROUTINES
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- divwait:
- NOP #4 ; waste time
- RTS
- framesine: ; Fetch the sine of the current frame number>>1. Used for floating.
- PHX : REP #$30
- LDA !gfxframe,x : AND #$00FF : ASL : TAX : LDA $07F7DB,x
- LSR
- SEP #$30 : PLX
- RTS
- ; Note here the totally different coding style. :P
- Magikoopa_Aim:
- 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
- SUB_HORZ_POS: LDY #$00
- LDA $94
- SEC
- SBC $E4,x
- STA $0F
- LDA $95
- SBC $14E0,x
- BPL LABEL16
- INY
- LABEL16: RTS
- CODE_01AD42: LDY #$00
- LDA $D3
- SEC
- SBC !yposl,x
- STA $0E
- LDA $D4
- SBC !yposh,x
- BPL Return01AD53
- INY
- Return01AD53: RTS ; return
- 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 #$0040 ; |
- CMP #$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 ; | OMG YOU FOUND THIS HIDDEN z0mg place!111 you win a cookie!
- 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 $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
- rainbow_table:
- db $01, $3f, $c0
- db $01, $40, $00
- db $01, $41, $00
- db $01, $42, $00
- db $01, $43, $00
- db $01, $43, $00
- db $01, $44, $00
- db $01, $45, $00
- db $01, $46, $00
- db $01, $46, $00
- db $01, $47, $00
- db $01, $48, $00
- db $01, $49, $00
- db $01, $49, $00
- db $01, $4a, $00
- db $01, $4b, $00
- db $01, $4c, $00
- db $01, $4c, $00
- db $01, $4d, $00
- db $01, $4e, $00
- db $01, $4f, $00
- db $01, $4f, $00
- db $01, $50, $00
- db $01, $51, $00
- db $01, $52, $00
- db $01, $52, $00
- db $01, $53, $00
- db $01, $54, $00
- db $01, $55, $00
- db $01, $55, $00
- db $01, $56, $00
- db $01, $57, $00
- db $01, $57, $00
- db $01, $58, $00
- db $01, $59, $00
- db $01, $5a, $00
- db $01, $5b, $00
- db $01, $5b, $00
- db $01, $5c, $00
- db $01, $5d, $00
- db $01, $5e, $00
- db $01, $5e, $00
- db $01, $5f, $00
- db $01, $3f, $5f
- db $01, $3e, $00
- db $01, $3e, $00
- db $01, $3d, $00
- db $01, $3c, $00
- db $01, $3b, $00
- db $01, $3a, $00
- db $01, $3a, $00
- db $01, $39, $00
- db $01, $38, $00
- db $01, $38, $00
- db $01, $37, $00
- db $01, $36, $00
- db $01, $35, $00
- db $01, $35, $00
- db $01, $34, $00
- db $01, $33, $00
- db $01, $32, $00
- db $01, $32, $00
- db $01, $31, $00
- db $01, $30, $00
- db $01, $2f, $00
- db $01, $2f, $00
- db $01, $2e, $00
- db $01, $2d, $00
- db $01, $2c, $00
- db $01, $2c, $00
- db $01, $2b, $00
- db $01, $2a, $00
- db $01, $29, $00
- db $01, $29, $00
- db $01, $28, $00
- db $01, $27, $00
- db $01, $26, $00
- db $01, $26, $00
- db $01, $25, $00
- db $01, $24, $00
- db $01, $23, $00
- db $01, $23, $00
- db $01, $22, $00
- db $01, $21, $00
- db $01, $20, $00
- db $01, $20, $00
- db $01, $80, $00
- db $01, $81, $00
- db $01, $82, $00
- db $01, $83, $00
- db $01, $83, $00
- db $01, $84, $00
- db $01, $85, $00
- db $01, $85, $00
- db $01, $86, $00
- db $01, $87, $00
- db $01, $88, $00
- db $01, $88, $00
- db $01, $89, $00
- db $01, $8a, $00
- db $01, $8b, $00
- db $01, $8c, $00
- db $01, $8c, $00
- db $01, $8d, $00
- db $01, $8e, $00
- db $01, $8e, $00
- db $01, $8f, $00
- db $01, $90, $00
- db $01, $91, $00
- db $01, $91, $00
- db $01, $92, $00
- db $01, $93, $00
- db $01, $94, $00
- db $01, $94, $00
- db $01, $95, $00
- db $01, $96, $00
- db $01, $97, $00
- db $01, $97, $00
- db $01, $98, $00
- db $01, $99, $00
- db $01, $9a, $00
- db $01, $9a, $00
- db $01, $9b, $00
- db $01, $9c, $00
- db $01, $9d, $00
- db $01, $9d, $00
- db $01, $9e, $00
- db $01, $9f, $00
- db $01, $5f, $9f
- db $01, $5e, $00
- db $01, $5e, $00
- db $01, $5d, $00
- db $01, $5c, $00
- db $01, $5b, $00
- db $01, $5a, $00
- db $01, $5a, $00
- db $01, $59, $00
- db $01, $58, $00
- db $01, $58, $00
- db $01, $57, $00
- db $01, $56, $00
- db $01, $55, $00
- db $01, $54, $00
- db $01, $54, $00
- db $01, $53, $00
- db $01, $52, $00
- db $01, $52, $00
- db $01, $51, $00
- db $01, $50, $00
- db $01, $4f, $00
- db $01, $4e, $00
- db $01, $4e, $00
- db $01, $4d, $00
- db $01, $4c, $00
- db $01, $4c, $00
- db $01, $4b, $00
- db $01, $4a, $00
- db $01, $49, $00
- db $01, $48, $00
- db $01, $48, $00
- db $01, $47, $00
- db $01, $46, $00
- db $01, $46, $00
- db $01, $45, $00
- db $01, $44, $00
- db $01, $43, $00
- db $01, $42, $00
- db $01, $42, $00
- db $01, $41, $00
- db $01, $40, $00
- db $01, $40, $00
- db $01, $20, $00
- db $01, $21, $00
- db $01, $22, $00
- db $01, $23, $00
- db $01, $23, $00
- db $01, $24, $00
- db $01, $25, $00
- db $01, $26, $00
- db $01, $26, $00
- db $01, $27, $00
- db $01, $28, $00
- db $01, $28, $00
- db $01, $29, $00
- db $01, $2a, $00
- db $01, $2b, $00
- db $01, $2b, $00
- db $01, $2c, $00
- db $01, $2d, $00
- db $01, $2e, $00
- db $01, $2f, $00
- db $01, $2f, $00
- db $01, $30, $00
- db $01, $31, $00
- db $01, $31, $00
- db $01, $32, $00
- db $01, $33, $00
- db $01, $34, $00
- db $01, $35, $00
- db $01, $35, $00
- db $01, $36, $00
- db $01, $37, $00
- db $01, $38, $00
- db $01, $38, $00
- db $01, $39, $00
- db $01, $3a, $00
- db $01, $3a, $00
- db $01, $3b, $00
- db $01, $3c, $00
- db $01, $3d, $00
- db $01, $3d, $00
- db $01, $3e, $00
- db $01, $3f, $00
- db $01, $3f, $9f
- db $01, $9e, $00
- db $01, $9e, $00
- db $01, $9d, $00
- db $01, $9c, $00
- db $01, $9b, $00
- db $01, $9b, $00
- db $01, $9a, $00
- db $01, $99, $00
- db $01, $98, $00
- db $01, $98, $00
- db $01, $97, $00
- db $01, $96, $00
- db $01, $95, $00
- db $01, $95, $00
- db $01, $94, $00
- db $01, $93, $00
- db $01, $92, $00
- db $01, $91, $00
- db $01, $91, $00
- db $01, $90, $00
- db $01, $8f, $00
- db $01, $8f, $00
- db $01, $8e, $00
- db $01, $8d, $00
- db $01, $8c, $00
- db $01, $8b, $00
- db $01, $8b, $00
- db $01, $8a, $00
- db $01, $89, $00
- db $01, $88, $00
- db $01, $88, $00
- db $01, $87, $00
- db $01, $86, $00
- db $01, $86, $00
- db $01, $85, $00
- db $01, $84, $00
- db $01, $83, $00
- db $01, $83, $00
- db $01, $82, $00
- db $01, $81, $00
- db $01, $80, $00
- db $01, $80, $00
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement