Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; エリート中のエリート ノコノコエリートイエロー様!!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- dcb "INIT"
- PHY
- JSR SUB_HORZ_POS
- TYA
- STA $157C,x
- LDA #$03 ;AレジスタにHPを代入
- STA $151C,x ;$151C,xをHPとする。
- STZ $C2,x ;$C2,xをモーション番号とする。
- STZ $1534,x ;$1534,xをモーションカウンタとする。
- PLY
- RTL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; nokonokoY2 main JSL
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- dcb "MAIN"
- PHB ; \
- PHK ; | main sprite function, just calls local subroutine
- PLB ; |
- JSR CODE_START ; |
- PLB ; |
- RTL ; /
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; nokonokoB2 main code
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;C2,x=モーション番号
- ; 0=歩行 1=踏まれた時 2=ジャンプ 3=立ち止まる 4=ファイアの構え 5=ファイア飛ばし
- ; 6=甲羅脱ぎ1 7=甲羅脱ぎ2 8=甲羅脱ぎ3&消滅&デフォに丸投げ 9=無敵スピンアタック!!
- ; 10=後ろにジャンプ 11=ジャンプしながらファイア
- KILLED_X_SPEED dcb $F0,$10
- CODE_START
- JSR SUB_OFF_SCREEN_HB ;スプライト画面外で消滅
- LDA $C2,x ;モーション番号チェック
- STA $05 ;5に値を渡しておく
- CMP #$00
- BEQ MOTION0_GFX
- CMP #$01
- BEQ MOTION1_GFX
- CMP #$09
- BEQ MOTION9_GFX
- JMP SUB_GFX3 ; graphics routine
- BRA GFX_ENDEND
- MOTION0_GFX JMP SUB_GFX ;モーション0のときの描画
- MOTION1_GFX JMP SUB_GFX2 ;モーション1のときの描画
- MOTION9_GFX JMP SUB_GFX4 ;モーション1のときの描画
- GFX_ENDEND ;描画おわり
- LDA $14C8,x ; \
- CMP #$08 ; | if status != 8, return
- BNE RETURN ; /
- ;JSR SUB_OFF_SCREEN_X0 ; handle off screen situation
- LDA $9D ; \ if sprites locked, return
- BNE RETURN ; /
- ;ここからメイン処理
- LDA $C2,x ;モーション番号チェック
- CMP #$01;1は踏まれた時
- BEQ MOTION_01
- CMP #$02;2はジャンプする
- BEQ MOTION_02
- CMP #$03;3は立ち止まる
- BEQ MOTION_03
- CMP #$04;4はファイア構え
- BEQ MOTION_04
- CMP #$05;5はファイア出す
- BEQ MOTION_05
- CMP #$09;9は無敵スピン
- BEQ MOTION_09
- CMP #$10;10は後ろジャンプ
- BEQ MOTION_10
- CMP #$11;11は後ろジャンプ&ファイア
- BEQ MOTION_11
- ;それ以外はモーション0
- JMP SUB_MOTION_00
- RETURN RTS
- MOTION_01 JMP SUB_MOTION_01
- MOTION_02 JMP SUB_MOTION_02
- MOTION_03 JMP SUB_MOTION_03
- MOTION_04 JMP SUB_MOTION_04
- MOTION_05 JMP SUB_MOTION_05
- MOTION_09 JMP SUB_MOTION_09
- MOTION_10 JMP SUB_MOTION_10
- MOTION_11 JMP SUB_MOTION_11
- END_MOTION
- LDA $1588,x ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0276 VC:077 00 FL:623
- AND #$04 ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0308 VC:077 00 FL:623
- PHA ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0324 VC:077 00 FL:623
- JSL $018032 ; interact with other sprites
- LDA $1588,x ;A:254B X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0684 VC:085 00 FL:623
- AND #$04 ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0716 VC:085 00 FL:623
- BEQ IN_AIR ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0732 VC:085 00 FL:623
- STZ $AA,x ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0748 VC:085 00 FL:623
- PLA ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0778 VC:085 00 FL:623
- BRA ON_GROUND ;A:2500 X:0007 Y:0007 D:0000 DB:03 S:01EF P:envMXdiZcHC:0806 VC:085 00 FL:623
- IN_AIR PLA ;A:2500 X:0007 Y:0006 D:0000 DB:03 S:01EB P:envMXdiZcHC:0316 VC:085 00 FL:4955
- BEQ WAS_IN_AIR ;A:2504 X:0007 Y:0006 D:0000 DB:03 S:01EC P:envMXdizcHC:0344 VC:085 00 FL:4955
- LDA #$0A ;A:2504 X:0007 Y:0006 D:0000 DB:03 S:01EC P:envMXdizcHC:0360 VC:085 00 FL:4955
- STA $1540,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0376 VC:085 00 FL:4955
- WAS_IN_AIR LDA $1540,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0408 VC:085 00 FL:4955
- BEQ ON_GROUND ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0440 VC:085 00 FL:4955
- STZ $AA,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0456 VC:085 00 FL:4955
- ON_GROUND
- ;向きを変えない処理
- LDA $C2,x ;モーション番号チェック
- CMP #$02
- BEQ DONT_TCH_TURN
- CMP #$04
- BEQ DONT_TCH_TURN
- CMP #$05
- BEQ DONT_TCH_TURN
- CMP #$10
- BEQ DONT_TCH_TURN
- CMP #$11
- BEQ DONT_TCH_TURN
- ;向きを変えてもいいモーション番号なら
- LDA $1588,x ; \ if sprite is in contact with an object...
- AND #$03 ; |
- BEQ DONT_UPDATE ; |
- LDA $157C,x ; | flip the direction status
- EOR #$01 ; |
- STA $157C,x ; /
- DONT_TCH_TURN
- DONT_UPDATE
- JSL $01A7DC ; check for mario/sprite contact
- BCC RETURN_24 ; (carry set = contact)
- LDA $1490 ; \ if mario star timer > 0 ...
- BNE HAS_STAR ; / ... goto HAS_STAR
- LDA $7D ; \ if mario's y speed < 10 ...
- CMP #$10 ; } ... sprite will hurt mario
- BMI NOKO_WINS ; /
- MARIO_WINS JSR SUB_STOMP_PTS ; give mario points
- JSL $01AA33 ; set mario speed
- JSL $01AB99 ; display contact graphic
- LDA $140D ; \ if mario is spin jumping...
- ORA $187A ; } ... or on yoshi ...
- BNE SPIN_KILL ; / ... goto SPIN_KILL
- LDA #$20 ; \ ... time to show defeated sprite = $20
- STA $1558,x ; /
- RETURN_24 RTS ; return
- NOKO_WINS LDA $1497 ; \ if mario is invincible...
- ORA $187A ; } ... or mario on yoshi...
- ORA $15D0,x ; | ...or sprite being eaten...
- BNE RETURN2 ; / ... return
- JSR SUB_GET_DIR ; \ set new sprite direction
- TYA ; }
- STA $157C,x ; /
- JSL $00F5B7 ; hurt mario
- RETURN2 RTS ; return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; spin and star kill (still part of above routine)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- STAR_SOUNDS dcb $00,$13,$14,$15,$16,$17,$18,$19
- SPIN_KILL
- LDA $C2,x ;モーション番号チェック
- CMP #$09 ;9なら効かない!
- BEQ NO_SOUND2
- LDA #$01
- STA $1632,x ;マリオと反応しなくする
- STZ $B6,x ;X速度ゼロ
- STZ $AA,x ;Y速度ゼロ
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$01
- STA $C2,x ;モーション番号に1をだいぬう
- JSR GET_DRAW_INFO
- JSL $01AB99
- RTS ; return
- HAS_STAR LDA #$02 ; \ status = 2 (being killed by star)
- STA $14C8,x ; /
- LDA #$D0 ; \ set y speed
- STA $AA,x ; /
- JSR SUB_HORZ_POS ; get new direction
- LDA KILLED_X_SPEED,y ; \ set x speed based on direction
- STA $B6,x ; /
- INC $18D2 ; increment number consecutive enemies killed
- LDA $18D2 ; \
- CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
- BCC NO_RESET2 ; |
- LDA #$08 ; |
- STA $18D2 ; /
- NO_RESET2 JSL $02ACE5 ; give mario points
- LDY $18D2 ; \
- CPY #$08 ; | if consecutive enemies stomped < 8 ...
- BCS NO_SOUND2 ; |
- LDA STAR_SOUNDS,y ; | ... play sound effect
- STA $1DF9 ; /
- NO_SOUND2 RTS ; final return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; graphics routine 縦2タイル
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- TILEMAP: dcb $26,$46 ; 1フレーム目のタイル
- dcb $28,$48 ; 2フレーム目のタイル
- Y_OFFSET: dcb $F0,$00 ; 上のタイル.下のタイル
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_GFX: JSR GET_DRAW_INFO ; Yレジスタ = OAM offset
- LDA $157C,x ; \ スプライトの向きを$02に代入
- STA $02 ; /
- LDA $14 ; \ フレームカウンタを
- LSR A ; | (1/2)
- LSR A ; | (1/4)
- LSR A ; | (1/8)
- AND #$01 ; | これで $00 → $01 → $00 → $01 となるカウンタになる
- ASL A ; | 2倍すると $00 → $02 → $00 → $02 となるカウンタになる
- STA $03 ; / これを$03に代入
- LDA $14C8,x
- CMP #$08
- BEQ NON_ANIMATION
- STZ $03
- NON_ANIMATION
- PHX ; ループにXレジスタを使用するので、保護する
- LDX #$01 ; ループ回数 = タイル数(2) - 1 = 1
- LOOP_START:
- LDA $00 ; \ X座標はこれまで通り
- STA $0300,y ; /
- LDA Y_OFFSET,x ; \
- CLC ; | タイル位置(基準=00)にF0と00を足すと
- ADC $01 ; | タイル位置はF0と00になりますね
- STA $0301,y ; /
- PHX
- TXA ; X → A(つまりインデクス番号をAに持ってくる)
- CLC ; \ Aにカウンタの分を足してあげます
- ADC $03 ; /
- TAX ; A → X(足した値を戻す)
- LDA TILEMAP,x ; \ タイルマップを代入
- STA $0302,y ; /
- PLX
- PHX
- LDX $15E9 ; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります
- LDA $15F6,x ; パレット
- LDX $02 ; \ このスプライトの向きを呼び出します
- BNE NO_FLIP ; | = 0(右向き)でないなら[NO_FLIP]に移動させます
- ORA #$40 ; | 左向きの場合、タイルを左右反転させます
- NO_FLIP: ORA $64 ; | 右向きなら左右反転をせずにそのまま$0303,yに代入します
- STA $0303,y ; / タイル属性を代入
- PLX
- INY ; \
- INY ; | ループ毎にタイルのRAMのアドレスを増やす
- INY ; |
- INY ; /
- DEX ; \ ループの処理でこの記述は必須ですよね
- BPL LOOP_START ; /
- PLX ; ループが終了したのでインデクス番号を戻してあげる
- LDY #$02 ; タイルサイズを16x16で統一
- LDA #$01 ; タイル数(2) - 1 = 1
- JSL $01B7B3 ; 画面外で描写しない
- ;RTS ; 終了
- JMP GFX_ENDEND
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; graphics routine 1タイル
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_GFX2 JSR GET_DRAW_INFO ; sets y = OAM offset
- LDA $157C,x ; \ $02 = direction
- STA $02 ; /
- LDA $00 ; \ tile x position = sprite x location ($00)
- STA $0300,y ; /
- LDA $01 ; \ tile y position = sprite y location ($01)
- STA $0301,y ; /
- LDA $15F6,x ; tile properties xyppccct, format
- PHX
- LDX $02 ; \ if direction == 0...
- BNE NO_FLIP2 ; |
- ORA #$40 ; / ...flip tile
- NO_FLIP2 ORA $64 ; add in tile priority of level
- STA $0303,y ; store tile properties
- LDA #$64 ; \ store tile
- STA $0302,y ; /
- PLX
- INY ; \ increase index to sprite tile map ($300)...
- INY ; | ...we wrote 1 16x16 tile...
- INY ; | ...sprite OAM is 8x8...
- INY ; / ...so increment 4 times
- LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
- LDA #$00 ; | A = (number of tiles drawn - 1)
- JSL $01B7B3 ; / don't draw if offscreen
- ;RTS ; return
- JMP GFX_ENDEND
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; graphics routine 2タイル アニメしない
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- TILEMAP3 dcb $28,$48
- TILEMAP4 dcb $06,$67
- TILEMAP5 dcb $2D,$4E
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_GFX3 JSR GET_DRAW_INFO ; Yレジスタ = OAM offset
- LDA $157C,x ; \ スプライトの向きを$02に代入
- STA $02 ; /
- PHX ; ループにXレジスタを使用するので、保護する
- LDX #$01 ; ループ回数 = タイル数(2) - 1 = 1
- LOOP_START3
- LDA $00 ; \ X座標はこれまで通り
- STA $0300,y ; /
- LDA Y_OFFSET,x ; \
- CLC ; | タイル位置(基準=00)にF0と00を足すと
- ADC $01 ; | タイル位置はF0と00になりますね
- STA $0301,y ; /
- LDA $05 ;モーション番号チェック
- CMP #$04
- BEQ MOTION4_GFX_DRAW
- CMP #$05
- BEQ MOTION5_GFX_DRAW
- LDA TILEMAP3,x ; \ タイルマップを代入
- BRA END_DRAW
- MOTION4_GFX_DRAW LDA TILEMAP4,x
- BRA END_DRAW
- MOTION5_GFX_DRAW LDA TILEMAP5,x
- BRA END_DRAW
- END_DRAW
- STA $0302,y ;
- PHX ; Xレジスタを使用するのでインデクス番号を保管
- LDX $15E9 ; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります
- LDA $15F6,x ; \
- ORA $64 ; | タイル属性
- STA $0303,y ; /
- PLX ; Xレジスタを使い終わったのでインデクス番号をもどす
- PHX
- LDX $15E9 ; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります
- LDA $15F6,x ; パレット
- LDX $02 ; \ このスプライトの向きを呼び出します
- BNE NO_FLIP3 ; | = 0(右向き)でないなら[NO_FLIP]に移動させます
- ORA #$40 ; | 左向きの場合、タイルを左右反転させます
- NO_FLIP3 ORA $64 ; | 右向きなら左右反転をせずにそのまま$0303,yに代入します
- STA $0303,y ; / タイル属性を代入
- PLX
- INY ; \
- INY ; | ループ毎にタイルのRAMのアドレスを増やす
- INY ; |
- INY ; /
- DEX ; \ ループの処理でこの記述は必須ですよね
- BPL LOOP_START3 ; /
- PLX ; ループが終了したのでインデクス番号を戻してあげる
- LDY #$02 ; タイルサイズを16x16で統一
- LDA #$01 ; タイル数(2) - 1 = 1
- JSL $01B7B3 ; 画面外で描写しない
- ;RTS ; 終了
- JMP GFX_ENDEND
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; graphics routine 1タイル アニメする
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- TILEMAP9 dcb $64,$69,$6D,$69
- PALETTES dcb $05,$07,$09,$0B
- SUB_GFX4 JSR GET_DRAW_INFO ; sets y = OAM offset
- LDA $157C,x ; \ $02 = direction
- STA $02 ; /
- LDA $14
- LSR A
- LSR A
- ;LSR A
- AND #$03
- STA $03
- PHX
- LDA $00 ; \ tile x position = sprite x location ($00)
- STA $0300,y ; /
- LDA $01 ; \ tile y position = sprite y location ($01)
- STA $0301,y ; /
- PLX
- ;LDA $15F6,x ; tile properties xyppccct, format
- PHX
- LDX $03
- LDA TILEMAP9,x
- STA $0302,y
- LDA PALETTES,x ; tile properties xyppccct, format
- LDX $03 ; \ 現在のカウンタを呼び出します
- CPX #$03
- BNE NO_YFLIP4 ; 特定のカウンタ値のときのみ反転
- ORA #$40 ; / ...flip tile
- NO_YFLIP4 ORA $64 ; add in tile priority of level
- STA $0303,y ; store tile properties
- PLX
- INY ; \ increase index to sprite tile map ($300)...
- INY ; | ...we wrote 1 16x16 tile...
- INY ; | ...sprite OAM is 8x8...
- INY ; / ...so increment 4 times
- LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
- LDA #$00 ; | A = (number of tiles drawn - 1)
- JSL $01B7B3 ; / don't draw if offscreen
- ;RTS ; return
- JMP GFX_ENDEND
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; points routine
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_STOMP_PTS
- LDA $C2,x ;モーション番号チェック
- CMP #$09 ;9なら効かないッ!
- BNE NOT_STOMPKILL2
- JSR GET_DRAW_INFO
- JSL $01AB99
- RTS
- NOT_STOMPKILL2
- LDA #$36 ;音ならす
- STA $1DFC ;チッ
- LDA #$01
- STA $1632,x ;マリオと反応しなくする
- STZ $B6,x ;X速度ゼロ
- STZ $AA,x ;Y速度ゼロ
- STZ $1534,x ;モーションカウンタ初期化
- DEC $151C,x ;HPを減らす
- LDA #$01
- STA $C2,x ;モーション番号に1をだいぬう
- RTS ; return
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; routines below can be shared by all sprites. they are ripped from original
- ; SMW and poorly documented
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B760 - graphics routine helper - shared
- ; sets off screen flags and sets index to OAM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B75C
- TABLE1 dcb $0C,$1C
- TABLE2 dcb $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 TABLE1,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 TABLE2,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 ; /
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B817 - horizontal mario/sprite check - shared
- ; Y = 1 if mario left of sprite??
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B817 ; Y = 1 if contact
- SUB_GET_DIR LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
- LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
- SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
- SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
- STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
- LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
- SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
- BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
- INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
- LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B829 - vertical mario/sprite position check - shared
- ; Y = 1 if mario below sprite??
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B829
- SUB_VERT_POS LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
- LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
- SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
- SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
- STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
- LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
- SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
- BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
- INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
- LABEL11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B817 - horizontal mario/sprite check - shared
- ; Y = 1 if mario left of sprite??
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B817
- SUB_HORZ_POS LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
- LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
- SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
- SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
- STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
- LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
- SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
- BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
- INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
- LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; $B85D - off screen processing code - shared
- ; sprites enter at different points
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;org $03B83B
- TABLE3 dcb $40,$B0
- TABLE6 dcb $01,$FF
- TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
- TABLE5 dcb $01,$FF,$01,$FF,$01,$00,$01,$FF
- SUB_OFF_SCREEN_X0 LDA #$06 ; \ entry point of routine determines value of $03
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X1 LDA #$04 ; |
- BRA STORE_03 ; |
- SUB_OFF_SCREEN_X2 LDA #$02 ; |
- STORE_03 STA $03 ; |
- BRA START_SUB ; |
- SUB_OFF_SCREEN_HB STZ $03 ; /
- START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
- BEQ RETURN_2 ; /
- 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_2 ; /
- LDA $13 ; \
- AND #$01 ; |
- ORA $03 ; |
- STA $01 ; |
- TAY ; /
- LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
- CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
- ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
- ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
- CMP $E4,x ;x pos ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0364 VC:090 00 FL:16953
- PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
- LDA $1B ;x boundry hi ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizCHC:0416 VC:090 00 FL:16953
- LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
- ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
- PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
- SBC $14E0,x ;x pos high ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0538 VC:090 00 FL:16953
- STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
- LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
- BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
- EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
- STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
- LABEL20 LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
- BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
- ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
- CMP #$08 ; |
- BCC KILL_SPRITE ; /
- LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
- CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
- BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
- LDA #$00 ; \ mark sprite to come back A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0204 VC:071 00 FL:21152
- STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
- KILL_SPRITE STZ $14C8,x ; erase sprite
- RETURN_2 RTS ; return
- VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
- AND #$04 ; |
- BNE RETURN_2 ; /
- LDA $13 ; \ only handle every other frame??
- LSR A ; |
- BCS RETURN_2 ; /
- AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
- STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
- TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
- LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
- CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
- ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
- ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
- CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
- PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
- LDA.W $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
- LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
- ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
- PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
- SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
- STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
- LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
- BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
- EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
- STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
- LABEL22 LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
- BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
- BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
- SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
- ORA $186C,x ; |
- RTS ; / return
- NOP
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; モーション別の処理
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- X_SPEED dcb $0C,$F4 ;歩行速度 右、左
- SUB_MOTION_00 ;歩行モーション
- LDY $157C,x ; \ set x speed based on direction
- LDA X_SPEED,y ; |
- STA $B6,x ; /
- JSL $01802A ; update position based on speed values
- LDA $7FAB10,x
- AND #$04
- BNE EXTRABITS_M0
- ;特別な情報2でなんもなし
- BRA RTN_M0
- EXTRABITS_M0
- ;特別な情報3で
- ;落ちそうなら向きかえる
- LDA $1588,x
- AND #$04
- BNE NOT_TURN2
- LDA $157C,x
- EOR #$01
- STA $157C,x
- NOT_TURN2
- RTN_M0
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$04 ;着地した?
- BEQ NOT_GROUD_MOTION_0
- ;着地したよ
- INC $1534,x ;モーションカウンタを増やす
- LDA $1534,x ;カウンタチェック
- CMP #$40 ;たまりましたか
- BNE COUNT_00
- ;たまったとき
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$02
- STA $C2,x ;モーション番号に2をだいぬう
- COUNT_00
- NOT_GROUD_MOTION_0 ;着地してない
- JMP END_MOTION
- SUB_MOTION_01 ;踏まれたモーション
- LDA $1534,x ;カウンタチェック
- CMP #$00 ;ゼロか?
- BNE MOTION_1_SET
- LDA $151C,x ;HPチェック
- CMP #$00 ;0か
- BNE MOTION_1_SET
- LDA #$02
- STA $14C8,x
- LDA #$47 ;音ならす
- STA $1DFC ;ポコ
- MOTION_1_SET
- JSL $01802A ;速度を参考に座標移動する
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$04 ;着地した?
- BEQ NGRMOTION_1
- ;着地したよ
- INC $1534,x ;モーションカウンタを増やす
- LDA $1534,x ;カウンタチェック
- CMP #$40 ;じゃなければ
- BNE COUNT_01
- ;たまったとき
- STZ $1632,x ;マリオと反応するよう戻す(値をゼロに)
- STZ $B6,x ;X速度ゼロ
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$02
- STA $C2,x ;モーション番号に2をだいぬう
- COUNT_01
- NGRMOTION_1 ;着地してない
- JMP END_MOTION
- JPING_X_SP dcb $08,$F8 ;ジャンプ移動速度 右、左
- SUB_MOTION_02 ;ジャンプモーション
- LDA $1534,x ;カウンタチェック
- CMP #$00 ;ゼロか?
- BNE MOTION_2_SET
- JSR SUB_HORZ_POS ;マリオのほうを向く
- TYA
- STA $157C,x
- STZ $B6,x ;X速度ゼロ
- LDA #$C0
- STA $AA,x ;Y速度
- MOTION_2_SET
- INC $1534,x ;モーションカウンタを増やす
- LDY $157C,x ; \ set x speed based on direction
- LDA JPING_X_SP,y ; |
- STA $B6,x ; /
- JSL $01802A ;速度を参考に座標移動する
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$04 ;着地した?
- BEQ NOT_GROUD_MOTION_2
- ;着地したよ
- STZ $B6,x ;X速度ゼロ
- STZ $AA,x ;Y速度ゼロ
- JSR SUB_HORZ_POS ;マリオのほうを向く
- TYA
- STA $157C,x
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$09
- STA $C2,x ;モーション番号に9をだいぬう
- NOT_GROUD_MOTION_2 ;着地してない
- JSR SUB_TOUCHWALL_S
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$08 ;天井に頭ぶつけた?
- BEQ NOT_TENJO_MOTION_2
- STZ $AA,x ;Y速度ゼロ
- NOT_TENJO_MOTION_2 ;着地してない
- JMP END_MOTION
- SUB_MOTION_03 ;立ち止まる
- LDA $1534,x ;カウンタチェック
- CMP #$00 ;ゼロか?
- BNE MOTION_3_SET
- STZ $B6,x ;X速度ゼロ
- MOTION_3_SET
- JSR SUB_HORZ_POS ;マリオのほうを向く
- TYA
- STA $157C,x
- JSL $01802A ;速度を参考に座標移動する
- INC $1534,x ;モーションカウンタを増やす
- LDA $1534,x ;カウンタチェック
- CMP #$10 ;たまりましたか
- BNE COUNT_03
- ;たまったとき
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$00
- STA $C2,x ;モーション番号に6をだいぬう
- COUNT_03
- JMP END_MOTION
- SUB_MOTION_04 ;ファイア構え
- JSL $01802A ;速度を参考に座標移動する
- INC $1534,x ;モーションカウンタを増やす
- LDA $1534,x ;カウンタチェック
- CMP #$06 ;たまりましたか
- BNE COUNT_04
- ;たまったとき
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$05
- STA $C2,x ;モーション番号に5をだいぬう
- COUNT_04
- JSR SUB_TOUCHWALL_S
- JSR SUB_GROUND_NMS
- JMP END_MOTION
- SUB_MOTION_05 ;ファイア飛ばし
- JSL $01802A ;速度を参考に座標移動する
- LDA $1534,x ;カウンタチェック
- CMP #$00
- BNE MOTION_5_SET1
- JSR GEN_PUTITFIRE
- MOTION_5_SET1
- LDA $1534,x ;カウンタチェック
- CMP #$06
- BNE MOTION_5_SET2
- JSR GEN_PUTITFIRE
- MOTION_5_SET2
- LDA $1534,x ;カウンタチェック
- CMP #$0C
- BNE MOTION_5_SET3
- JSR GEN_PUTITFIRE
- MOTION_5_SET3
- LDA $1534,x ;カウンタチェック
- CMP #$12
- BNE MOTION_5_SET4
- JSR GEN_PUTITFIRE
- MOTION_5_SET4
- INC $1534,x ;モーションカウンタを増やす
- LDA $1534,x ;カウンタチェック
- CMP #$18 ;たまりましたか
- BNE COUNT_05
- ;たまったとき
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$11
- STA $C2,x ;モーション番号に11をだいぬう
- COUNT_05
- JSR SUB_TOUCHWALL_S
- JSR SUB_GROUND_NMS
- JMP END_MOTION
- SUB_TOUCHWALL_S ;壁に触ったら向きを変えずに反対方向の速度を持つルチン
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$01 ;壁にぶつかった?右側に壁がある
- BEQ M9_N_TOUCHWALLRIGHT
- LDA #$E0
- STA $B6,x
- M9_N_TOUCHWALLRIGHT
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$02 ;壁にぶつかった?左側に壁がある
- BEQ M9_N_TOUCHWALLLEFT
- LDA #$20
- STA $B6,x
- M9_N_TOUCHWALLLEFT
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$08 ;天井に頭ぶつけた?
- BEQ NTMTAWLS
- STZ $AA,x ;Y速度ゼロ
- NTMTAWLS ;ぶつけてない
- RTS
- SUB_MOTION_09 ;無敵スピン
- JSR SUB_HORZ_POS ;マリオが左右どちらにいるか
- TYA
- CMP #$01
- BEQ M9_KSKLEFT
- ;M9_KSKRIGHT ;右に加速
- LDA $B6,x ;速すぎじゃね?
- CMP #$38
- BPL END_KSK
- ;速さが足りない!!
- INC $B6,x
- INC $B6,x
- INC $B6,x
- ;INC $B6,x ;さすがにやばかった
- BRA END_KSK
- M9_KSKLEFT
- ;左に阿蘇区
- LDA $B6,x ;速すぎじゃね?
- CMP #$C8
- BMI END_KSK
- ;速さが足りない!!
- DEC $B6,x
- DEC $B6,x
- DEC $B6,x
- ;DEC $B6,x ;さすがにやばかった
- END_KSK
- JSL $01802A ;速度を参考に座標移動する
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$01 ;壁にぶつかった?右側に壁がある
- BEQ M9_N_TOUCHWALLRIGHT
- LDA #$D0
- STA $B6,x
- LDA #$35 ;音ならす
- STA $1DFC ;ゴッ
- M9_N_TOUCHWALLRIGHT
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$02 ;壁にぶつかった?左側に壁がある
- BEQ M9_N_TOUCHWALLLEFT
- LDA #$30
- STA $B6,x
- LDA #$35 ;音ならす
- STA $1DFC ;ゴッ
- M9_N_TOUCHWALLLEFT
- INC $1534,x ;モーションカウンタを増やす
- LDA $1534,x ;カウンタチェック
- CMP #$60 ;たまりましたか
- BNE COUNT_09
- ;たまったとき
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$10
- STA $C2,x ;モーション番号をだいぬう
- COUNT_09
- JMP END_MOTION
- ANTI_X_SPEED dcb $F0,$10 ;後ろジャンプ速度 右、左
- SUB_MOTION_10 ;後ろジャンプ
- LDA $1534,x ;カウンタチェック
- CMP #$00 ;ゼロか?
- BNE M10_SET
- JSR SUB_HORZ_POS ;マリオのほうを向く
- TYA
- STA $157C,x
- STZ $B6,x ;X速度ゼロ
- LDA #$C0
- STA $AA,x ;Y速度
- M10_SET
- INC $1534,x ;モーションカウンタを増やす
- LDY $157C,x ; \ set x speed based on direction
- LDA ANTI_X_SPEED,y ; |
- STA $B6,x ; /
- JSL $01802A ;速度を参考に座標移動する
- JSR SUB_GROUND_NMS
- JSR SUB_TOUCHWALL_S
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$08 ;天井に頭ぶつけた?
- BEQ NOT_TENJO_MOTION_10
- STZ $AA,x ;Y速度ゼロ
- NOT_TENJO_MOTION_10 ;着地してない
- LDA $1534,x ;カウンタチェック
- CMP #$08 ;たまりましたか
- BNE COUNT_10
- ;たまったとき
- STZ $1534,x ;モーションカウンタ初期化
- LDA #$04
- STA $C2,x ;モーション番号をだいぬう
- COUNT_10
- JMP END_MOTION
- SUB_MOTION_11 ;バックファイア終了
- INC $1534,x ;モーションカウンタを増やす
- LDY $157C,x ; \ set x speed based on direction
- LDA ANTI_X_SPEED,y ; |
- STA $B6,x ; /
- JSL $01802A ;速度を参考に座標移動する
- JSR SUB_GROUND_NMS
- JSR SUB_TOUCHWALL_S
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$08 ;天井に頭ぶつけた?
- BEQ NTM11
- STZ $AA,x ;Y速度ゼロ
- NTM11 ;着地してない
- JMP END_MOTION
- SUB_GROUND_NMS ;着地したら通常モーションに戻る処理
- LDA $1588,x ;オブジェクトと接しているのか
- AND #$04 ;着地した?
- BEQ NON_GR_S
- ;着地したよ
- STZ $B6,x ;X速度ゼロ
- STZ $AA,x ;Y速度ゼロ
- JSR SUB_HORZ_POS ;マリオのほうを向く
- TYA
- STA $157C,x
- STZ $1534,x ;モーションカウンタ初期化
- STZ $C2,x ;モーション番号ゼロ
- NON_GR_S ;着地してない
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; generate extra sprite ポコッを再生
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SUB_POKO LDY #$03
- FINDFREE LDA $17C0,y
- BEQ FOUNDONE
- DEY
- BPL FINDFREE
- RTS
- FOUNDONE LDA #$02 ;スプライトの種類
- STA $17C0,y
- LDA $E4,x ;x座標
- STA $17C8,y
- LDA $D8,x ;y座標
- SEC
- SBC #$10
- STA $17C4,y
- LDA #$04
- STA $17CC,y ;タイマー
- RTS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; generate extra sprite ファイア飛ばし
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- LDY $157C,x ; \ set x speed based on direction
- LDA X_SPEED,y ; |
- STA $B6,x ; /
- JSL $01802A ; update position based on speed values
- GEN_PUTITFIRE LDY #$07
- EXTRA_LOOP LDA $170B,y
- BEQ EXTRA_1
- DEY
- BPL EXTRA_LOOP
- RTS
- EXTRA_1 LDA #$0B ;スプライトの種類
- STA $170B,y
- LDA $E4,x ;x座標下位バイト
- STA $171F,y
- LDA $14E0,x ;x座標上位バイト
- STA $1733,y
- LDA $D8,x ;y座標下位バイト
- STA $1715,y
- LDA $14D4,x ;y座標上位バイト
- STA $1729,y
- LDA #$D8 ;y方向初期速度
- STA $173D,y
- LDA $157C,x ;向きチェック
- CMP #$00
- BNE LEFT_FIREBALL
- ;RIGHT_FIREBALL ;右向きのときのファイアとばす
- LDA #$18 ;x方向初期速度
- STA $1747,y
- BRA END_X_FIREBALL
- LEFT_FIREBALL ;左向きのときのファイアとばす
- LDA #$E8 ;x方向初期速度
- STA $1747,y
- END_X_FIREBALL
- LDA #$FF ;一部スプライト用のタイマー
- STA $176F,y
- LDA #$06 ;音ならす
- STA $1DFC ;ピャッ
- RTS
Add Comment
Please, Sign In to add comment