!Hammer_Projectile = $10 !Boomerang_Projectile = $11 !Bullet_Projectile = $12 !Laser_Projectile = $13 !Ice_Projectile = $14 !Metal_Music = $0D !Lamp_Music = $0D !Ghost_Music = $0D !Plant_Music = $0D !TimeroutSFX = $24 print "INIT ",pc RTL print "MAIN ",pc PHB PHK PLB LDA $19 CMP #$01 BEQ Power STZ $0DC6 Power: JSR Code_Start PLB RTL Code_Start: JMP Pointers Pointers: LDA $0DC6 JSL $0086DF dw Nothing ;00 dw Hammer ;01 dw Boomerang ;02 dw Flare ;03 dw Ice ;04 dw Shell ;05 dw Bullet ;06 dw Bomber ;07 dw Quake ;08 dw Metal ;09 dw Invisible ;0A dw Jumper ;0B dw Lamp ;0C dw Laser ;0D dw Plant ;0E Flare: JSR NotTimered Nothing: RTS Shell: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust: BEQ CanShoot DEC STA $7F8820 RTS CanShoot: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn LDA $73 ORA $187A BNE Returnn LDA $16 AND #$40 BEQ Returnn BIT $15 BVC Returnn LDA $0DC6 BEQ Returnn BRA Ahead Returnn: RTS Ahead: LDA #$20 STA $1558,x ;generate projectileGenCust JSL $02A9DE ;grab free sprite slot low priority BMI NoFire ;return if none left before anything else... LDA #$09 ;make fireball sound STA $1DFC JSR SetupCust ;run sprite generation routine NoFire: RTS Speed: db $C0,$40 SetupCust: LDA #$0A STA $14C8,y ;normal status, run init routine LDA #$04 LDA $14E0,x ;create base 16bit pos XBA LDA $E4,x FacingRight: TYX ;new sprite slot into X LDA #$04 ; Sprite = Bullet Bill STA $9E,x LDA #$0A STA $14C8,x JSL $07F7D2 ; Reset sprite tables. PHX LDA #$05 STA $1497 LDA #$3F STA $13E0 LDA #$0F STA $149C LDX $76 LDA Speed,x STA $00B6,y ;set xspeed TYX LDA $76 EOR #$01 STA $157C,x LDA $94 CLC : ADC #$01 STA $E4,x LDA $95 ADC #$00 STA $14E0,x LDA $96 CLC ADC #$08 STA $D8,x LDA $97 ADC #$00 STA $14D4,x PLX LDA #$4E ; \ set timer until change direction STA $1540,y ; / ;set projectile speed according to Mario LDX $15E9 ;restore sprite index RTS ;return Bomber: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust2 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust2: BEQ CanShoot2 DEC STA $7F8820 RTS CanShoot2: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn2 LDA $73 ORA $187A BNE Returnn2 LDA $16 AND #$40 BEQ Returnn2 BIT $15 BVC Returnn2 LDA $0DC6 BEQ Returnn2 BRA Ahead2 Returnn2: RTS Ahead2: LDA $1497 ORA $18BD BNE Return2 LDA #$20 STA $1558,x ;generate projectileGenCust JSL $02A9DE ;grab free sprite slot low priority BMI Return2 ;return if none left before anything else... LDA #$09 ;make fireball sound STA $1DFC LDA #$01 STA $14C8,y ;normal status, run init routine LDA #$04 LDA $14E0,x ;create base 16bit pos XBA LDA $E4,x Fight: TYX ;new sprite slot into X LDA #$0D ; Sprite = Bullet Bill STA $9E,x LDA #$08 STA $14C8,x JSL $07F7D2 ; Reset sprite tables. PHX LDA $94 CLC : ADC #$00 STA $E4,x LDA $95 ADC #$00 STA $14E0,x LDA $96 CLC ADC #$00 STA $D8,x LDA $97 ADC #$00 STA $14D4,x PLX LDA #$01 ;\ .. and flag explosion status. STA $1534,x ;/ LDA #$40 ;\ Time for explosion. STA $1540,x JSL $028086 LDA #$09 ;\ STA $1DFC ;/ Sound effect. LDA #$1B STA $167A,x LDA #$80 STA $1497 LDA #$20 STA $18BD LDA #$15 STA $1887 ; shake the ground ;set projectile speed according to Mario LDX $15E9 ;restore sprite index Return2: RTS ;return Quake: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust3 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust3: BEQ CanShoot3 DEC STA $7F8820 RTS CanShoot3: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn3 LDA $73 ORA $187A BNE Returnn3 LDA $16 AND #$40 BEQ Returnn3 BIT $15 BVC Returnn3 LDA $0DC6 BEQ Returnn3 BRA Earth Returnn3: RTS Earth: LDA $18BD ORA $1497 ORA $72 BNE Noquake LDA #$30 STA $1887 : STA $18BD LDA #$09 STA $1DFC JSL $0294C1 LDA #$50 STA $1497 Noquake: RTS Hammer: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust4 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust4: BEQ CanShoot4 DEC STA $7F8820 RTS CanShoot4: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn4 LDA $73 ORA $187A BNE Returnn4 LDA $16 AND #$40 BEQ Returnn4 BIT $15 BVC Returnn4 LDA $0DC6 BEQ Returnn4 BRA HShot Returnn4: RTS HShot: STZ $09 LDY #$0B LOOP: LDA $14C8,y BEQ NEXT PHX TYX LDA $7FAB9E,x PLX CMP #!Hammer_Projectile BNE NEXT INC $09 LDA $09 CMP #$02 BEQ NOFIRE BRA NEXT NOFIRE: RTS NEXT: DEY BPL LOOP LDA #$06 ;make fireball sound STA $1DFC JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full BMI RETURN2 ; / after: Y has index of sprite being generated LDA #$0C STA $7F8820 LDA #$01 ; \ set sprite status for new sprite STA $14C8,y ; / PHX ; \ before: X must have index of sprite being generated TYX ; | routine clears *all* old sprite values... LDA #!Hammer_Projectile ; Store custom sprite number STA $7FAB9E,x JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables JSL $0187A7 ; get table values for custom sprite LDA #$08 STA $7FAB10,x PLX PHX LDA #$3F STA $13E0 LDA #$0F STA $149C TYX LDA $94 STA $E4,x LDA $95 STA $14E0,x LDA $96 CLC ADC #$08 STA $D8,x LDA $97 ADC #$00 STA $14D4,x LDA $76 EOR #$01 STA $157C,x PLX LDA #$4E ; \ set timer until change direction STA $1540,y ; / RETURN2: RTS Boomerang: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust5 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust5: BEQ CanShoot5 DEC STA $7F8820 RTS CanShoot5: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn5 LDA $73 ORA $187A BNE Returnn5 LDA $16 AND #$40 BEQ Returnn5 BIT $15 BVC Returnn5 LDA $0DC6 BEQ Returnn5 BRA BShot Returnn5: RTS BShot: STZ $09 LDY #$0B LOOP2: LDA $14C8,y BEQ NEXT2 PHX TYX LDA $7FAB9E,x PLX CMP #!Boomerang_Projectile BNE NEXT2 INC $09 LDA $09 CMP #$02 BEQ NOFIRE2 BRA NEXT2 NOFIRE2: RTS NEXT2: DEY BPL LOOP2 LDA #$06 ;make fireball sound STA $1DFC JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full BMI RETURN3 ; / after: Y has index of sprite being generated LDA #$0C STA $7F8820 LDA #$01 ; \ set sprite status for new sprite STA $14C8,y ; / PHX ; \ before: X must have index of sprite being generated TYX ; | routine clears *all* old sprite values... LDA #!Boomerang_Projectile ; Store custom sprite number STA $7FAB9E,x JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables JSL $0187A7 ; get table values for custom sprite LDA #$08 STA $7FAB10,x PLX PHX LDA #$3F STA $13E0 LDA #$0F STA $149C TYX LDA $94 STA $E4,x LDA $95 STA $14E0,x LDA $96 CLC ADC #$08 STA $D8,x LDA $97 ADC #$00 STA $14D4,x LDA $76 EOR #$01 STA $157C,x PLX LDA #$4E ; \ set timer until change direction STA $1540,y ; / RETURN3: RTS Bullet: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust6 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust6: BEQ CanShoot6 DEC STA $7F8820 RTS CanShoot6: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn6 LDA $73 ORA $187A BNE Returnn6 LDA $16 AND #$40 BEQ Returnn6 BIT $15 BVC Returnn6 LDA $0DC6 BEQ Returnn6 BRA BuShot Returnn6: RTS BuShot: STZ $09 LDY #$0B LOOP3: LDA $14C8,y BEQ NEXT3 PHX TYX LDA $7FAB9E,x PLX CMP #!Bullet_Projectile BNE NEXT3 INC $09 LDA $09 CMP #$02 BEQ NOFIRE3 BRA NEXT3 NOFIRE3: RTS NEXT3: DEY BPL LOOP3 LDA #$09 ;make fireball sound STA $1DFC JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full BMI RETURN4 ; / after: Y has index of sprite being generated LDA #$0C STA $7F8820 LDA #$01 ; \ set sprite status for new sprite STA $14C8,y ; / PHX ; \ before: X must have index of sprite being generated TYX ; | routine clears *all* old sprite values... LDA #!Bullet_Projectile ; Store custom sprite number STA $7FAB9E,x JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables JSL $0187A7 ; get table values for custom sprite LDA #$08 STA $7FAB10,x PLX PHX LDA #$3F STA $13E0 LDA #$0F STA $149C TYX LDA $94 STA $E4,x LDA $95 STA $14E0,x LDA $96 CLC ADC #$08 STA $D8,x LDA $97 ADC #$00 STA $14D4,x LDA $76 STA $157C,x PLX LDA #$4E ; \ set timer until change direction STA $1540,y ; / RETURN4: RTS Laser: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust7 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust7: BEQ CanShoot7 DEC STA $7F8820 RTS CanShoot7: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn7 LDA $73 ORA $187A BNE Returnn7 LDA $16 AND #$40 BEQ Returnn7 BIT $15 BVC Returnn7 LDA $0DC6 BEQ Returnn7 BRA LShot Returnn7: RTS LShot: STZ $09 LDY #$0B LOOP4: LDA $14C8,y BEQ NEXT4 PHX TYX LDA $7FAB9E,x PLX CMP #!Laser_Projectile BNE NEXT4 INC $09 LDA $09 CMP #$02 BEQ NOFIRE4 BRA NEXT4 NOFIRE4: RTS SpeedLaser: db $90,$70 NEXT4: DEY BPL LOOP4 LDA #$06 ;make fireball sound STA $1DFC JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full BMI RETURN5 ; / after: Y has index of sprite being generated LDA #$0C STA $7F8820 LDA #$01 ; \ set sprite status for new sprite STA $14C8,y ; / PHX ; \ before: X must have index of sprite being generated TYX ; | routine clears *all* old sprite values... LDA #!Laser_Projectile ; Store custom sprite number STA $7FAB9E,x JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables JSL $0187A7 ; get table values for custom sprite LDA #$08 STA $7FAB10,x PLX PHX LDA #$3F STA $13E0 LDA #$0F STA $149C LDX $76 LDA SpeedLaser,x STA $00B6,y ;set xspeed TYX LDA $94 STA $E4,x LDA $95 STA $14E0,x LDA $96 CLC ADC #$08 STA $D8,x LDA $97 ADC #$00 STA $14D4,x LDA $76 EOR #$01 STA $157C,x PLX LDA #$4E ; \ set timer until change direction STA $1540,y ; / RETURN5: RTS Jumper: JSR BounceUp JSR Double BounceUp: LDA $17 AND #$40 BEQ NoJump BIT $18 BVC NoJump LDA $77 AND #$04 BEQ NoJump LDA #$80 STA $7D LDA #$08 STA $1DFC NoJump: RTS Double: LDA $77 ;\ AND #$04 ;| If Mario is touching the ground, reset the jump flag BNE Reset ;/ LDA $0DC5 ;\ If jump flag is working, then disable everything else BEQ Disable ;/ LDA $16 ;\ AND #$80 ;| If pressing B then do jump code BNE Jump ;/ Disable: ; This sprite was actually based off a cutscene tool I made a while back. RTS ; I worked forever on it; and it worked really nicely. Too bad Romi beat me too it. Then again mine just did the transitions! Reset: ; Oh well. LDA #$01 ;\ STA $0DC5 ;/ Resetting jump flag RTS Jump: LDA #$A9 STA $7D LDA #$08 STA $1DFC STZ $0DC5 RTS Invisible: REP #$20 LDA $0DC4 BEQ EndVanishPower DEC $0DC4 JSR Timegoing SEP #$20 LDA #!Ghost_Music STA $1DFB LDA #$FF STA $1497 LDA $14 AND #$01 TAX LDA InvTable,x STA $78 RTS InvTable: db $00,$FF EndVanishPower: SEP #$20 LDY $0DDA ; Resume Regular Music STY $1DFB ;/ STZ $0DC6 STZ $1497 RTS Ice: JSR NotTimered LDA $7F8820 CMP #$0D BCC NoAdjust8 LDA #$00 ; Initialize RAM the first time STA $7F8820 NoAdjust8: BEQ CanShoot8 DEC STA $7F8820 RTS CanShoot8: LDA $19 ; Only shoot if Big Mario CMP #$01 BNE Returnn8 LDA $73 ORA $187A BNE Returnn8 LDA $16 AND #$40 BEQ Returnn8 BIT $15 BVC Returnn8 LDA $0DC6 BEQ Returnn8 BRA IShot Returnn8: RTS IShot: STZ $09 LDY #$0B LOOP5: LDA $14C8,y BEQ NEXT5 PHX TYX LDA $7FAB9E,x PLX CMP #!Ice_Projectile BNE NEXT5 INC $09 LDA $09 CMP #$02 BEQ NOFIRE5 BRA NEXT5 NOFIRE5: RTS SpeedIce: db $D0,$30 NEXT5: DEY BPL LOOP5 LDA #$06 ;make fireball sound STA $1DFC JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full BMI RETURN6 ; / after: Y has index of sprite being generated LDA #$0C STA $7F8820 LDA #$01 ; \ set sprite status for new sprite STA $14C8,y ; / PHX ; \ before: X must have index of sprite being generated TYX ; | routine clears *all* old sprite values... LDA #!Ice_Projectile ; Store custom sprite number STA $7FAB9E,x JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables JSL $0187A7 ; get table values for custom sprite LDA #$08 STA $7FAB10,x PLX PHX LDA #$3F STA $13E0 LDA #$0F STA $149C LDX $76 LDA SpeedIce,x STA $00B6,y ;set xspeed TYX LDA $94 STA $E4,x LDA $95 STA $14E0,x LDA $96 CLC ADC #$08 STA $D8,x LDA $97 ADC #$00 STA $14D4,x LDA $76 EOR #$01 STA $157C,x PLX LDA #$4E ; \ set timer until change direction STA $1540,y ; / RETURN6: RTS Lamp: REP #$20 LDA $0DC4 CMP.w #$0000 BEQ Darkness DEC $0DC4 JSR Timegoing SEP #$20 LDA #!Lamp_Music STA $1DFB REP #$30 LDA $7FC0FC ORA #$0001 STA $7FC0FC SEP #$30 RTS Darkness: SEP #$20 LDY $0DDA ; Resume Regular Music STY $1DFB ;/ STZ $0DC6 REP #$20 LDA $7Fc0FC AND.w #$0000 STA $7FC0FC SEP #$20 RTS Plant: REP #$20 LDA $0DC4 CMP.w #$0000 BEQ NoMuncherKill DEC $0DC4 JSR Timegoing SEP #$20 LDA #!Plant_Music STA $1DFB RTS NoMuncherKill: SEP #$20 LDY $0DDA ; Resume Regular Music STY $1DFB ;/ STZ $0DC6 RTS Metal: REP #$20 LDA $0DC4 CMP.w #$0000 BEQ Organic DEC $0DC4 JSR Timegoing SEP #$20 LDA #!Metal_Music STA $1DFB LDA #$02 STA $1490 RTS Organic: SEP #$20 LDY $0DDA STY $1DFB STZ $0DC6 STZ $1490 RTS NotTimered: REP #$20 LDA $0DC4 BEQ AlreadyZero STZ $0DC4 SEP #$20 LDY $0DDA ; Resume Regular Music STY $1DFB ;/ REP #$20 LDA $7Fc0FC AND.w #$0000 STA $7FC0FC SEP #$20 RTS AlreadyZero: SEP #$20 RTS Timegoing: REP #$20 LDA $0DC4 CMP.w #$0025 BNE NoSound SEP #$20 LDA #!TimeroutSFX STA $1DFC NoSound: SEP #$20 RTS