har5452

Untitled

Apr 12th, 2025
5
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 49.65 KB | None | 0 0
  1.  
  2.  
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ; エリート中のエリート ノコノコエリートイエロー様!!
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6.  
  7. dcb "INIT"
  8. PHY
  9. JSR SUB_HORZ_POS
  10. TYA
  11. STA $157C,x
  12.  
  13. LDA #$03 ;AレジスタにHPを代入
  14. STA $151C,x ;$151C,xをHPとする。
  15.  
  16.  
  17. STZ $C2,x ;$C2,xをモーション番号とする。
  18. STZ $1534,x ;$1534,xをモーションカウンタとする。
  19.  
  20. PLY
  21. RTL
  22.  
  23.  
  24. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25. ; nokonokoY2 main JSL
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27.  
  28. dcb "MAIN"
  29. PHB ; \
  30. PHK ; | main sprite function, just calls local subroutine
  31. PLB ; |
  32. JSR CODE_START ; |
  33. PLB ; |
  34. RTL ; /
  35.  
  36.  
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38. ; nokonokoB2 main code
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40.  
  41. ;C2,x=モーション番号
  42. ; 0=歩行 1=踏まれた時 2=ジャンプ 3=立ち止まる 4=ファイアの構え 5=ファイア飛ばし
  43. ; 6=甲羅脱ぎ1 7=甲羅脱ぎ2 8=甲羅脱ぎ3&消滅&デフォに丸投げ 9=無敵スピンアタック!!
  44. ; 10=後ろにジャンプ 11=ジャンプしながらファイア
  45.  
  46. KILLED_X_SPEED dcb $F0,$10
  47.  
  48. CODE_START
  49. JSR SUB_OFF_SCREEN_HB ;スプライト画面外で消滅
  50.  
  51. LDA $C2,x ;モーション番号チェック
  52. STA $05 ;5に値を渡しておく
  53. CMP #$00
  54. BEQ MOTION0_GFX
  55. CMP #$01
  56. BEQ MOTION1_GFX
  57. CMP #$09
  58. BEQ MOTION9_GFX
  59.  
  60. JMP SUB_GFX3 ; graphics routine
  61. BRA GFX_ENDEND
  62.  
  63. MOTION0_GFX JMP SUB_GFX ;モーション0のときの描画
  64. MOTION1_GFX JMP SUB_GFX2 ;モーション1のときの描画
  65. MOTION9_GFX JMP SUB_GFX4 ;モーション1のときの描画
  66.  
  67. GFX_ENDEND ;描画おわり
  68.  
  69. LDA $14C8,x ; \
  70. CMP #$08 ; | if status != 8, return
  71. BNE RETURN ; /
  72. ;JSR SUB_OFF_SCREEN_X0 ; handle off screen situation
  73.  
  74. LDA $9D ; \ if sprites locked, return
  75. BNE RETURN ; /
  76. ;ここからメイン処理
  77. LDA $C2,x ;モーション番号チェック
  78. CMP #$01;1は踏まれた時
  79. BEQ MOTION_01
  80. CMP #$02;2はジャンプする
  81. BEQ MOTION_02
  82. CMP #$03;3は立ち止まる
  83. BEQ MOTION_03
  84. CMP #$04;4はファイア構え
  85. BEQ MOTION_04
  86. CMP #$05;5はファイア出す
  87. BEQ MOTION_05
  88. CMP #$09;9は無敵スピン
  89. BEQ MOTION_09
  90. CMP #$10;10は後ろジャンプ
  91. BEQ MOTION_10
  92. CMP #$11;11は後ろジャンプ&ファイア
  93. BEQ MOTION_11
  94.  
  95. ;それ以外はモーション0
  96.  
  97. JMP SUB_MOTION_00
  98.  
  99. RETURN RTS
  100.  
  101. MOTION_01 JMP SUB_MOTION_01
  102. MOTION_02 JMP SUB_MOTION_02
  103. MOTION_03 JMP SUB_MOTION_03
  104. MOTION_04 JMP SUB_MOTION_04
  105. MOTION_05 JMP SUB_MOTION_05
  106. MOTION_09 JMP SUB_MOTION_09
  107. MOTION_10 JMP SUB_MOTION_10
  108. MOTION_11 JMP SUB_MOTION_11
  109.  
  110. END_MOTION
  111.  
  112. LDA $1588,x ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0276 VC:077 00 FL:623
  113. AND #$04 ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0308 VC:077 00 FL:623
  114. PHA ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0324 VC:077 00 FL:623
  115.  
  116. JSL $018032 ; interact with other sprites
  117. LDA $1588,x ;A:254B X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0684 VC:085 00 FL:623
  118. AND #$04 ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0716 VC:085 00 FL:623
  119. BEQ IN_AIR ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0732 VC:085 00 FL:623
  120. STZ $AA,x ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0748 VC:085 00 FL:623
  121. PLA ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0778 VC:085 00 FL:623
  122. BRA ON_GROUND ;A:2500 X:0007 Y:0007 D:0000 DB:03 S:01EF P:envMXdiZcHC:0806 VC:085 00 FL:623
  123. IN_AIR PLA ;A:2500 X:0007 Y:0006 D:0000 DB:03 S:01EB P:envMXdiZcHC:0316 VC:085 00 FL:4955
  124. BEQ WAS_IN_AIR ;A:2504 X:0007 Y:0006 D:0000 DB:03 S:01EC P:envMXdizcHC:0344 VC:085 00 FL:4955
  125. LDA #$0A ;A:2504 X:0007 Y:0006 D:0000 DB:03 S:01EC P:envMXdizcHC:0360 VC:085 00 FL:4955
  126. STA $1540,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0376 VC:085 00 FL:4955
  127. 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
  128. BEQ ON_GROUND ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0440 VC:085 00 FL:4955
  129. STZ $AA,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0456 VC:085 00 FL:4955
  130. ON_GROUND
  131.  
  132. ;向きを変えない処理
  133. LDA $C2,x ;モーション番号チェック
  134. CMP #$02
  135. BEQ DONT_TCH_TURN
  136. CMP #$04
  137. BEQ DONT_TCH_TURN
  138. CMP #$05
  139. BEQ DONT_TCH_TURN
  140. CMP #$10
  141. BEQ DONT_TCH_TURN
  142. CMP #$11
  143. BEQ DONT_TCH_TURN
  144.  
  145. ;向きを変えてもいいモーション番号なら
  146. LDA $1588,x ; \ if sprite is in contact with an object...
  147. AND #$03 ; |
  148. BEQ DONT_UPDATE ; |
  149. LDA $157C,x ; | flip the direction status
  150. EOR #$01 ; |
  151. STA $157C,x ; /
  152.  
  153. DONT_TCH_TURN
  154.  
  155.  
  156.  
  157.  
  158. DONT_UPDATE
  159.  
  160.  
  161. JSL $01A7DC ; check for mario/sprite contact
  162. BCC RETURN_24 ; (carry set = contact)
  163. LDA $1490 ; \ if mario star timer > 0 ...
  164. BNE HAS_STAR ; / ... goto HAS_STAR
  165. LDA $7D ; \ if mario's y speed < 10 ...
  166. CMP #$10 ; } ... sprite will hurt mario
  167. BMI NOKO_WINS ; /
  168.  
  169. MARIO_WINS JSR SUB_STOMP_PTS ; give mario points
  170. JSL $01AA33 ; set mario speed
  171. JSL $01AB99 ; display contact graphic
  172. LDA $140D ; \ if mario is spin jumping...
  173. ORA $187A ; } ... or on yoshi ...
  174. BNE SPIN_KILL ; / ... goto SPIN_KILL
  175. LDA #$20 ; \ ... time to show defeated sprite = $20
  176. STA $1558,x ; /
  177. RETURN_24 RTS ; return
  178.  
  179. NOKO_WINS LDA $1497 ; \ if mario is invincible...
  180. ORA $187A ; } ... or mario on yoshi...
  181. ORA $15D0,x ; | ...or sprite being eaten...
  182. BNE RETURN2 ; / ... return
  183. JSR SUB_GET_DIR ; \ set new sprite direction
  184. TYA ; }
  185. STA $157C,x ; /
  186. JSL $00F5B7 ; hurt mario
  187. RETURN2 RTS ; return
  188.  
  189.  
  190.  
  191.  
  192. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  193. ; spin and star kill (still part of above routine)
  194. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  195.  
  196. STAR_SOUNDS dcb $00,$13,$14,$15,$16,$17,$18,$19
  197.  
  198. SPIN_KILL
  199. LDA $C2,x ;モーション番号チェック
  200. CMP #$09 ;9なら効かない!
  201. BEQ NO_SOUND2
  202.  
  203. LDA #$01
  204. STA $1632,x ;マリオと反応しなくする
  205.  
  206. STZ $B6,x ;X速度ゼロ
  207. STZ $AA,x ;Y速度ゼロ
  208. STZ $1534,x ;モーションカウンタ初期化
  209. LDA #$01
  210. STA $C2,x ;モーション番号に1をだいぬう
  211.  
  212. JSR GET_DRAW_INFO
  213. JSL $01AB99
  214.  
  215. RTS ; return
  216. HAS_STAR LDA #$02 ; \ status = 2 (being killed by star)
  217. STA $14C8,x ; /
  218. LDA #$D0 ; \ set y speed
  219. STA $AA,x ; /
  220. JSR SUB_HORZ_POS ; get new direction
  221. LDA KILLED_X_SPEED,y ; \ set x speed based on direction
  222. STA $B6,x ; /
  223. INC $18D2 ; increment number consecutive enemies killed
  224. LDA $18D2 ; \
  225. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  226. BCC NO_RESET2 ; |
  227. LDA #$08 ; |
  228. STA $18D2 ; /
  229. NO_RESET2 JSL $02ACE5 ; give mario points
  230. LDY $18D2 ; \
  231. CPY #$08 ; | if consecutive enemies stomped < 8 ...
  232. BCS NO_SOUND2 ; |
  233. LDA STAR_SOUNDS,y ; | ... play sound effect
  234. STA $1DF9 ; /
  235. NO_SOUND2 RTS ; final return
  236.  
  237.  
  238. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  239. ; graphics routine 縦2タイル
  240. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  241. TILEMAP: dcb $26,$46 ; 1フレーム目のタイル
  242. dcb $28,$48 ; 2フレーム目のタイル
  243. Y_OFFSET: dcb $F0,$00 ; 上のタイル.下のタイル
  244. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  245. SUB_GFX: JSR GET_DRAW_INFO ; Yレジスタ = OAM offset
  246.  
  247. LDA $157C,x ; \ スプライトの向きを$02に代入
  248. STA $02 ; /
  249.  
  250. LDA $14 ; \ フレームカウンタを
  251. LSR A ; | (1/2)
  252. LSR A ; | (1/4)
  253. LSR A ; | (1/8)
  254. AND #$01 ; | これで $00 → $01 → $00 → $01 となるカウンタになる
  255. ASL A ; | 2倍すると $00 → $02 → $00 → $02 となるカウンタになる
  256. STA $03 ; / これを$03に代入
  257.  
  258. LDA $14C8,x
  259. CMP #$08
  260. BEQ NON_ANIMATION
  261. STZ $03
  262. NON_ANIMATION
  263.  
  264.  
  265. PHX ; ループにXレジスタを使用するので、保護する
  266. LDX #$01 ; ループ回数 = タイル数(2) - 1 = 1
  267. LOOP_START:
  268. LDA $00 ; \ X座標はこれまで通り
  269. STA $0300,y ; /
  270.  
  271. LDA Y_OFFSET,x ; \
  272. CLC ; | タイル位置(基準=00)にF0と00を足すと
  273. ADC $01 ; | タイル位置はF0と00になりますね
  274. STA $0301,y ; /
  275.  
  276. PHX
  277. TXA ; X → A(つまりインデクス番号をAに持ってくる)
  278. CLC ; \ Aにカウンタの分を足してあげます
  279. ADC $03 ; /
  280. TAX ; A → X(足した値を戻す)
  281. LDA TILEMAP,x ; \ タイルマップを代入
  282. STA $0302,y ; /
  283. PLX
  284.  
  285. PHX
  286. LDX $15E9 ; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります
  287. LDA $15F6,x ; パレット
  288. LDX $02 ; \ このスプライトの向きを呼び出します
  289. BNE NO_FLIP ; | = 0(右向き)でないなら[NO_FLIP]に移動させます
  290. ORA #$40 ; | 左向きの場合、タイルを左右反転させます
  291. NO_FLIP: ORA $64 ; | 右向きなら左右反転をせずにそのまま$0303,yに代入します
  292. STA $0303,y ; / タイル属性を代入
  293. PLX
  294.  
  295. INY ; \
  296. INY ; | ループ毎にタイルのRAMのアドレスを増やす
  297. INY ; |
  298. INY ; /
  299. DEX ; \ ループの処理でこの記述は必須ですよね
  300. BPL LOOP_START ; /
  301. PLX ; ループが終了したのでインデクス番号を戻してあげる
  302.  
  303. LDY #$02 ; タイルサイズを16x16で統一
  304. LDA #$01 ; タイル数(2) - 1 = 1
  305. JSL $01B7B3 ; 画面外で描写しない
  306. ;RTS ; 終了
  307. JMP GFX_ENDEND
  308.  
  309.  
  310.  
  311. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  312. ; graphics routine 1タイル
  313. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  314.  
  315. SUB_GFX2 JSR GET_DRAW_INFO ; sets y = OAM offset
  316. LDA $157C,x ; \ $02 = direction
  317. STA $02 ; /
  318.  
  319. LDA $00 ; \ tile x position = sprite x location ($00)
  320. STA $0300,y ; /
  321.  
  322. LDA $01 ; \ tile y position = sprite y location ($01)
  323. STA $0301,y ; /
  324.  
  325. LDA $15F6,x ; tile properties xyppccct, format
  326. PHX
  327. LDX $02 ; \ if direction == 0...
  328. BNE NO_FLIP2 ; |
  329. ORA #$40 ; / ...flip tile
  330. NO_FLIP2 ORA $64 ; add in tile priority of level
  331. STA $0303,y ; store tile properties
  332.  
  333. LDA #$64 ; \ store tile
  334.  
  335. STA $0302,y ; /
  336. PLX
  337. INY ; \ increase index to sprite tile map ($300)...
  338. INY ; | ...we wrote 1 16x16 tile...
  339. INY ; | ...sprite OAM is 8x8...
  340. INY ; / ...so increment 4 times
  341.  
  342. LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
  343. LDA #$00 ; | A = (number of tiles drawn - 1)
  344. JSL $01B7B3 ; / don't draw if offscreen
  345. ;RTS ; return
  346. JMP GFX_ENDEND
  347.  
  348.  
  349. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  350. ; graphics routine 2タイル アニメしない
  351. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  352. TILEMAP3 dcb $28,$48
  353. TILEMAP4 dcb $06,$67
  354. TILEMAP5 dcb $2D,$4E
  355. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  356.  
  357. SUB_GFX3 JSR GET_DRAW_INFO ; Yレジスタ = OAM offset
  358.  
  359. LDA $157C,x ; \ スプライトの向きを$02に代入
  360. STA $02 ; /
  361.  
  362.  
  363. PHX ; ループにXレジスタを使用するので、保護する
  364. LDX #$01 ; ループ回数 = タイル数(2) - 1 = 1
  365. LOOP_START3
  366. LDA $00 ; \ X座標はこれまで通り
  367. STA $0300,y ; /
  368.  
  369. LDA Y_OFFSET,x ; \
  370. CLC ; | タイル位置(基準=00)にF0と00を足すと
  371. ADC $01 ; | タイル位置はF0と00になりますね
  372. STA $0301,y ; /
  373.  
  374. LDA $05 ;モーション番号チェック
  375. CMP #$04
  376. BEQ MOTION4_GFX_DRAW
  377. CMP #$05
  378. BEQ MOTION5_GFX_DRAW
  379.  
  380. LDA TILEMAP3,x ; \ タイルマップを代入
  381. BRA END_DRAW
  382.  
  383. MOTION4_GFX_DRAW LDA TILEMAP4,x
  384. BRA END_DRAW
  385. MOTION5_GFX_DRAW LDA TILEMAP5,x
  386. BRA END_DRAW
  387. END_DRAW
  388.  
  389.  
  390. STA $0302,y ;
  391.  
  392. PHX ; Xレジスタを使用するのでインデクス番号を保管
  393. LDX $15E9 ; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります
  394. LDA $15F6,x ; \
  395. ORA $64 ; | タイル属性
  396. STA $0303,y ; /
  397. PLX ; Xレジスタを使い終わったのでインデクス番号をもどす
  398.  
  399. PHX
  400. LDX $15E9 ; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります
  401. LDA $15F6,x ; パレット
  402. LDX $02 ; \ このスプライトの向きを呼び出します
  403. BNE NO_FLIP3 ; | = 0(右向き)でないなら[NO_FLIP]に移動させます
  404. ORA #$40 ; | 左向きの場合、タイルを左右反転させます
  405. NO_FLIP3 ORA $64 ; | 右向きなら左右反転をせずにそのまま$0303,yに代入します
  406. STA $0303,y ; / タイル属性を代入
  407. PLX
  408.  
  409. INY ; \
  410. INY ; | ループ毎にタイルのRAMのアドレスを増やす
  411. INY ; |
  412. INY ; /
  413. DEX ; \ ループの処理でこの記述は必須ですよね
  414. BPL LOOP_START3 ; /
  415. PLX ; ループが終了したのでインデクス番号を戻してあげる
  416.  
  417. LDY #$02 ; タイルサイズを16x16で統一
  418. LDA #$01 ; タイル数(2) - 1 = 1
  419. JSL $01B7B3 ; 画面外で描写しない
  420. ;RTS ; 終了
  421. JMP GFX_ENDEND
  422.  
  423.  
  424. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  425. ; graphics routine 1タイル アニメする
  426. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  427. TILEMAP9 dcb $64,$69,$6D,$69
  428. PALETTES dcb $05,$07,$09,$0B
  429.  
  430. SUB_GFX4 JSR GET_DRAW_INFO ; sets y = OAM offset
  431. LDA $157C,x ; \ $02 = direction
  432. STA $02 ; /
  433. LDA $14
  434. LSR A
  435. LSR A
  436. ;LSR A
  437. AND #$03
  438. STA $03
  439.  
  440. PHX
  441. LDA $00 ; \ tile x position = sprite x location ($00)
  442. STA $0300,y ; /
  443.  
  444. LDA $01 ; \ tile y position = sprite y location ($01)
  445. STA $0301,y ; /
  446. PLX
  447. ;LDA $15F6,x ; tile properties xyppccct, format
  448. PHX
  449.  
  450.  
  451. LDX $03
  452. LDA TILEMAP9,x
  453. STA $0302,y
  454.  
  455. LDA PALETTES,x ; tile properties xyppccct, format
  456.  
  457. LDX $03 ; \ 現在のカウンタを呼び出します
  458. CPX #$03
  459. BNE NO_YFLIP4 ; 特定のカウンタ値のときのみ反転
  460. ORA #$40 ; / ...flip tile
  461. NO_YFLIP4 ORA $64 ; add in tile priority of level
  462. STA $0303,y ; store tile properties
  463.  
  464.  
  465. PLX
  466. INY ; \ increase index to sprite tile map ($300)...
  467. INY ; | ...we wrote 1 16x16 tile...
  468. INY ; | ...sprite OAM is 8x8...
  469. INY ; / ...so increment 4 times
  470.  
  471. LDY #$02 ; \ 460 = 2 (all 16x16 tiles)
  472. LDA #$00 ; | A = (number of tiles drawn - 1)
  473. JSL $01B7B3 ; / don't draw if offscreen
  474. ;RTS ; return
  475. JMP GFX_ENDEND
  476.  
  477.  
  478.  
  479.  
  480.  
  481. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  482. ; points routine
  483. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  484.  
  485. SUB_STOMP_PTS
  486.  
  487.  
  488. LDA $C2,x ;モーション番号チェック
  489. CMP #$09 ;9なら効かないッ!
  490. BNE NOT_STOMPKILL2
  491. JSR GET_DRAW_INFO
  492. JSL $01AB99
  493.  
  494. RTS
  495. NOT_STOMPKILL2
  496.  
  497. LDA #$36 ;音ならす
  498. STA $1DFC ;チッ
  499.  
  500. LDA #$01
  501. STA $1632,x ;マリオと反応しなくする
  502.  
  503. STZ $B6,x ;X速度ゼロ
  504. STZ $AA,x ;Y速度ゼロ
  505. STZ $1534,x ;モーションカウンタ初期化
  506.  
  507. DEC $151C,x ;HPを減らす
  508.  
  509. LDA #$01
  510. STA $C2,x ;モーション番号に1をだいぬう
  511.  
  512.  
  513. RTS ; return
  514.  
  515.  
  516. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  517. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  518. ; routines below can be shared by all sprites. they are ripped from original
  519. ; SMW and poorly documented
  520. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  521. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  522.  
  523. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  524. ; $B760 - graphics routine helper - shared
  525. ; sets off screen flags and sets index to OAM
  526. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  527.  
  528. ;org $03B75C
  529.  
  530. TABLE1 dcb $0C,$1C
  531. TABLE2 dcb $01,$02
  532.  
  533. GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
  534. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  535. LDA $E4,x ; \
  536. CMP $1A ; | set horizontal offscreen if necessary
  537. LDA $14E0,x ; |
  538. SBC $1B ; |
  539. BEQ ON_SCREEN_X ; |
  540. INC $15A0,x ; /
  541.  
  542. ON_SCREEN_X LDA $14E0,x ; \
  543. XBA ; |
  544. LDA $E4,x ; |
  545. REP #$20 ; |
  546. SEC ; |
  547. SBC $1A ; | mark sprite invalid if far enough off screen
  548. CLC ; |
  549. ADC.W #$0040 ; |
  550. CMP.W #$0180 ; |
  551. SEP #$20 ; |
  552. ROL A ; |
  553. AND #$01 ; |
  554. STA $15C4,x ; /
  555. BNE INVALID ;
  556.  
  557. LDY #$00 ; \ set up loop:
  558. LDA $1662,x ; |
  559. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  560. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  561. INY ; /
  562. ON_SCREEN_LOOP LDA $D8,x ; \
  563. CLC ; | set vertical offscreen if necessary
  564. ADC TABLE1,y ; |
  565. PHP ; |
  566. CMP $1C ; | (vert screen boundry)
  567. ROL $00 ; |
  568. PLP ; |
  569. LDA $14D4,x ; |
  570. ADC #$00 ; |
  571. LSR $00 ; |
  572. SBC $1D ; |
  573. BEQ ON_SCREEN_Y ; |
  574. LDA $186C,x ; | (vert offscreen)
  575. ORA TABLE2,y ; |
  576. STA $186C,x ; |
  577. ON_SCREEN_Y DEY ; |
  578. BPL ON_SCREEN_LOOP ; /
  579.  
  580. LDY $15EA,x ; get offset to sprite OAM
  581. LDA $E4,x ; \
  582. SEC ; |
  583. SBC $1A ; | $00 = sprite x position relative to screen boarder
  584. STA $00 ; /
  585. LDA $D8,x ; \
  586. SEC ; |
  587. SBC $1C ; | $01 = sprite y position relative to screen boarder
  588. STA $01 ; /
  589. RTS ; return
  590.  
  591. INVALID PLA ; \ return from *main gfx routine* subroutine...
  592. PLA ; | ...(not just this subroutine)
  593. RTS ; /
  594.  
  595. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  596. ; $B817 - horizontal mario/sprite check - shared
  597. ; Y = 1 if mario left of sprite??
  598. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  599.  
  600. ;org $03B817 ; Y = 1 if contact
  601.  
  602. 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
  603. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  604. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  605. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  606. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  607. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  608. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  609. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  610. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  611. LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  612.  
  613. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  614. ; $B829 - vertical mario/sprite position check - shared
  615. ; Y = 1 if mario below sprite??
  616. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  617.  
  618. ;org $03B829
  619.  
  620. 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
  621. LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
  622. SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
  623. SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
  624. STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
  625. LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
  626. SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
  627. BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
  628. INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
  629. LABEL11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
  630.  
  631.  
  632. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  633. ; $B817 - horizontal mario/sprite check - shared
  634. ; Y = 1 if mario left of sprite??
  635. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  636.  
  637. ;org $03B817
  638.  
  639. 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
  640. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  641. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  642. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  643. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  644. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  645. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  646. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  647. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  648. LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  649.  
  650.  
  651. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  652. ; $B85D - off screen processing code - shared
  653. ; sprites enter at different points
  654. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  655.  
  656. ;org $03B83B
  657.  
  658. TABLE3 dcb $40,$B0
  659. TABLE6 dcb $01,$FF
  660. TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
  661. TABLE5 dcb $01,$FF,$01,$FF,$01,$00,$01,$FF
  662.  
  663. SUB_OFF_SCREEN_X0 LDA #$06 ; \ entry point of routine determines value of $03
  664. BRA STORE_03 ; |
  665. SUB_OFF_SCREEN_X1 LDA #$04 ; |
  666. BRA STORE_03 ; |
  667. SUB_OFF_SCREEN_X2 LDA #$02 ; |
  668. STORE_03 STA $03 ; |
  669. BRA START_SUB ; |
  670. SUB_OFF_SCREEN_HB STZ $03 ; /
  671.  
  672. START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  673. BEQ RETURN_2 ; /
  674. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  675. AND #$01 ; |
  676. BNE VERTICAL_LEVEL ; /
  677. LDA $D8,x ; \
  678. CLC ; |
  679. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  680. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  681. ADC #$00 ; |
  682. CMP #$02 ; |
  683. BPL ERASE_SPRITE ; / ...erase the sprite
  684. LDA $167A,x ; \ if "process offscreen" flag is set, return
  685. AND #$04 ; |
  686. BNE RETURN_2 ; /
  687. LDA $13 ; \
  688. AND #$01 ; |
  689. ORA $03 ; |
  690. STA $01 ; |
  691. TAY ; /
  692. LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
  693. CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
  694. ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
  695. ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
  696. 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
  697. PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
  698. 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
  699. LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
  700. ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
  701. PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
  702. 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
  703. STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
  704. LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
  705. BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
  706. EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
  707. STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
  708. LABEL20 LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
  709. BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
  710. ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  711. CMP #$08 ; |
  712. BCC KILL_SPRITE ; /
  713. LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
  714. CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
  715. BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
  716. 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
  717. STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
  718. KILL_SPRITE STZ $14C8,x ; erase sprite
  719. RETURN_2 RTS ; return
  720.  
  721. VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
  722. AND #$04 ; |
  723. BNE RETURN_2 ; /
  724. LDA $13 ; \ only handle every other frame??
  725. LSR A ; |
  726. BCS RETURN_2 ; /
  727. AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
  728. STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
  729. TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
  730. LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
  731. CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
  732. ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
  733. ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
  734. CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
  735. PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
  736. LDA.W $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
  737. LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
  738. ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
  739. PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
  740. SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
  741. STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
  742. LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
  743. BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
  744. EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
  745. STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
  746. LABEL22 LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
  747. BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
  748. BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
  749.  
  750. SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  751. ORA $186C,x ; |
  752. RTS ; / return
  753.  
  754. NOP
  755.  
  756. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  757. ; モーション別の処理
  758. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  759.  
  760. X_SPEED dcb $0C,$F4 ;歩行速度 右、左
  761.  
  762. SUB_MOTION_00 ;歩行モーション
  763.  
  764. LDY $157C,x ; \ set x speed based on direction
  765. LDA X_SPEED,y ; |
  766. STA $B6,x ; /
  767. JSL $01802A ; update position based on speed values
  768.  
  769.  
  770.  
  771. LDA $7FAB10,x
  772. AND #$04
  773. BNE EXTRABITS_M0
  774. ;特別な情報2でなんもなし
  775. BRA RTN_M0
  776. EXTRABITS_M0
  777. ;特別な情報3で
  778. ;落ちそうなら向きかえる
  779. LDA $1588,x
  780. AND #$04
  781. BNE NOT_TURN2
  782. LDA $157C,x
  783. EOR #$01
  784. STA $157C,x
  785. NOT_TURN2
  786. RTN_M0
  787.  
  788. LDA $1588,x ;オブジェクトと接しているのか
  789. AND #$04 ;着地した?
  790. BEQ NOT_GROUD_MOTION_0
  791. ;着地したよ
  792.  
  793. INC $1534,x ;モーションカウンタを増やす
  794. LDA $1534,x ;カウンタチェック
  795. CMP #$40 ;たまりましたか
  796. BNE COUNT_00
  797. ;たまったとき
  798. STZ $1534,x ;モーションカウンタ初期化
  799. LDA #$02
  800. STA $C2,x ;モーション番号に2をだいぬう
  801. COUNT_00
  802. NOT_GROUD_MOTION_0 ;着地してない
  803.  
  804.  
  805.  
  806. JMP END_MOTION
  807.  
  808. SUB_MOTION_01 ;踏まれたモーション
  809.  
  810. LDA $1534,x ;カウンタチェック
  811. CMP #$00 ;ゼロか?
  812. BNE MOTION_1_SET
  813. LDA $151C,x ;HPチェック
  814. CMP #$00 ;0か
  815. BNE MOTION_1_SET
  816. LDA #$02
  817. STA $14C8,x
  818. LDA #$47 ;音ならす
  819. STA $1DFC ;ポコ
  820. MOTION_1_SET
  821.  
  822. JSL $01802A ;速度を参考に座標移動する
  823.  
  824. LDA $1588,x ;オブジェクトと接しているのか
  825. AND #$04 ;着地した?
  826. BEQ NGRMOTION_1
  827. ;着地したよ
  828. INC $1534,x ;モーションカウンタを増やす
  829. LDA $1534,x ;カウンタチェック
  830. CMP #$40 ;じゃなければ
  831. BNE COUNT_01
  832. ;たまったとき
  833. STZ $1632,x ;マリオと反応するよう戻す(値をゼロに)
  834. STZ $B6,x ;X速度ゼロ
  835. STZ $1534,x ;モーションカウンタ初期化
  836. LDA #$02
  837. STA $C2,x ;モーション番号に2をだいぬう
  838. COUNT_01
  839. NGRMOTION_1 ;着地してない
  840.  
  841. JMP END_MOTION
  842.  
  843. JPING_X_SP dcb $08,$F8 ;ジャンプ移動速度 右、左
  844.  
  845. SUB_MOTION_02 ;ジャンプモーション
  846. LDA $1534,x ;カウンタチェック
  847. CMP #$00 ;ゼロか?
  848. BNE MOTION_2_SET
  849. JSR SUB_HORZ_POS ;マリオのほうを向く
  850. TYA
  851. STA $157C,x
  852. STZ $B6,x ;X速度ゼロ
  853. LDA #$C0
  854. STA $AA,x ;Y速度
  855. MOTION_2_SET
  856.  
  857. INC $1534,x ;モーションカウンタを増やす
  858.  
  859. LDY $157C,x ; \ set x speed based on direction
  860. LDA JPING_X_SP,y ; |
  861. STA $B6,x ; /
  862. JSL $01802A ;速度を参考に座標移動する
  863.  
  864. LDA $1588,x ;オブジェクトと接しているのか
  865. AND #$04 ;着地した?
  866. BEQ NOT_GROUD_MOTION_2
  867. ;着地したよ
  868. STZ $B6,x ;X速度ゼロ
  869. STZ $AA,x ;Y速度ゼロ
  870. JSR SUB_HORZ_POS ;マリオのほうを向く
  871. TYA
  872. STA $157C,x
  873.  
  874. STZ $1534,x ;モーションカウンタ初期化
  875. LDA #$09
  876. STA $C2,x ;モーション番号に9をだいぬう
  877. NOT_GROUD_MOTION_2 ;着地してない
  878.  
  879.  
  880. JSR SUB_TOUCHWALL_S
  881.  
  882. LDA $1588,x ;オブジェクトと接しているのか
  883. AND #$08 ;天井に頭ぶつけた?
  884. BEQ NOT_TENJO_MOTION_2
  885. STZ $AA,x ;Y速度ゼロ
  886. NOT_TENJO_MOTION_2 ;着地してない
  887.  
  888. JMP END_MOTION
  889.  
  890. SUB_MOTION_03 ;立ち止まる
  891. LDA $1534,x ;カウンタチェック
  892. CMP #$00 ;ゼロか?
  893. BNE MOTION_3_SET
  894. STZ $B6,x ;X速度ゼロ
  895. MOTION_3_SET
  896.  
  897. JSR SUB_HORZ_POS ;マリオのほうを向く
  898. TYA
  899. STA $157C,x
  900.  
  901. JSL $01802A ;速度を参考に座標移動する
  902.  
  903. INC $1534,x ;モーションカウンタを増やす
  904. LDA $1534,x ;カウンタチェック
  905. CMP #$10 ;たまりましたか
  906. BNE COUNT_03
  907. ;たまったとき
  908. STZ $1534,x ;モーションカウンタ初期化
  909. LDA #$00
  910. STA $C2,x ;モーション番号に6をだいぬう
  911. COUNT_03
  912. JMP END_MOTION
  913.  
  914. SUB_MOTION_04 ;ファイア構え
  915.  
  916. JSL $01802A ;速度を参考に座標移動する
  917.  
  918. INC $1534,x ;モーションカウンタを増やす
  919. LDA $1534,x ;カウンタチェック
  920. CMP #$06 ;たまりましたか
  921. BNE COUNT_04
  922. ;たまったとき
  923. STZ $1534,x ;モーションカウンタ初期化
  924. LDA #$05
  925. STA $C2,x ;モーション番号に5をだいぬう
  926. COUNT_04
  927.  
  928. JSR SUB_TOUCHWALL_S
  929. JSR SUB_GROUND_NMS
  930. JMP END_MOTION
  931.  
  932. SUB_MOTION_05 ;ファイア飛ばし
  933.  
  934. JSL $01802A ;速度を参考に座標移動する
  935.  
  936. LDA $1534,x ;カウンタチェック
  937. CMP #$00
  938. BNE MOTION_5_SET1
  939. JSR GEN_PUTITFIRE
  940. MOTION_5_SET1
  941.  
  942. LDA $1534,x ;カウンタチェック
  943. CMP #$06
  944. BNE MOTION_5_SET2
  945. JSR GEN_PUTITFIRE
  946. MOTION_5_SET2
  947.  
  948. LDA $1534,x ;カウンタチェック
  949. CMP #$0C
  950. BNE MOTION_5_SET3
  951. JSR GEN_PUTITFIRE
  952. MOTION_5_SET3
  953.  
  954. LDA $1534,x ;カウンタチェック
  955. CMP #$12
  956. BNE MOTION_5_SET4
  957. JSR GEN_PUTITFIRE
  958. MOTION_5_SET4
  959.  
  960.  
  961. INC $1534,x ;モーションカウンタを増やす
  962. LDA $1534,x ;カウンタチェック
  963. CMP #$18 ;たまりましたか
  964. BNE COUNT_05
  965. ;たまったとき
  966. STZ $1534,x ;モーションカウンタ初期化
  967. LDA #$11
  968. STA $C2,x ;モーション番号に11をだいぬう
  969. COUNT_05
  970.  
  971. JSR SUB_TOUCHWALL_S
  972. JSR SUB_GROUND_NMS
  973. JMP END_MOTION
  974.  
  975. SUB_TOUCHWALL_S ;壁に触ったら向きを変えずに反対方向の速度を持つルチン
  976. LDA $1588,x ;オブジェクトと接しているのか
  977. AND #$01 ;壁にぶつかった?右側に壁がある
  978. BEQ M9_N_TOUCHWALLRIGHT
  979. LDA #$E0
  980. STA $B6,x
  981. M9_N_TOUCHWALLRIGHT
  982.  
  983. LDA $1588,x ;オブジェクトと接しているのか
  984. AND #$02 ;壁にぶつかった?左側に壁がある
  985. BEQ M9_N_TOUCHWALLLEFT
  986. LDA #$20
  987. STA $B6,x
  988. M9_N_TOUCHWALLLEFT
  989.  
  990. LDA $1588,x ;オブジェクトと接しているのか
  991. AND #$08 ;天井に頭ぶつけた?
  992. BEQ NTMTAWLS
  993. STZ $AA,x ;Y速度ゼロ
  994. NTMTAWLS ;ぶつけてない
  995. RTS
  996.  
  997. SUB_MOTION_09 ;無敵スピン
  998.  
  999. JSR SUB_HORZ_POS ;マリオが左右どちらにいるか
  1000. TYA
  1001. CMP #$01
  1002. BEQ M9_KSKLEFT
  1003. ;M9_KSKRIGHT ;右に加速
  1004. LDA $B6,x ;速すぎじゃね?
  1005. CMP #$38
  1006. BPL END_KSK
  1007. ;速さが足りない!!
  1008. INC $B6,x
  1009. INC $B6,x
  1010. INC $B6,x
  1011. ;INC $B6,x ;さすがにやばかった
  1012. BRA END_KSK
  1013. M9_KSKLEFT
  1014. ;左に阿蘇区
  1015. LDA $B6,x ;速すぎじゃね?
  1016. CMP #$C8
  1017. BMI END_KSK
  1018. ;速さが足りない!!
  1019. DEC $B6,x
  1020. DEC $B6,x
  1021. DEC $B6,x
  1022. ;DEC $B6,x ;さすがにやばかった
  1023. END_KSK
  1024.  
  1025. JSL $01802A ;速度を参考に座標移動する
  1026.  
  1027. LDA $1588,x ;オブジェクトと接しているのか
  1028. AND #$01 ;壁にぶつかった?右側に壁がある
  1029. BEQ M9_N_TOUCHWALLRIGHT
  1030. LDA #$D0
  1031. STA $B6,x
  1032. LDA #$35 ;音ならす
  1033. STA $1DFC ;ゴッ
  1034. M9_N_TOUCHWALLRIGHT
  1035.  
  1036. LDA $1588,x ;オブジェクトと接しているのか
  1037. AND #$02 ;壁にぶつかった?左側に壁がある
  1038. BEQ M9_N_TOUCHWALLLEFT
  1039. LDA #$30
  1040. STA $B6,x
  1041. LDA #$35 ;音ならす
  1042. STA $1DFC ;ゴッ
  1043. M9_N_TOUCHWALLLEFT
  1044.  
  1045. INC $1534,x ;モーションカウンタを増やす
  1046. LDA $1534,x ;カウンタチェック
  1047. CMP #$60 ;たまりましたか
  1048. BNE COUNT_09
  1049. ;たまったとき
  1050. STZ $1534,x ;モーションカウンタ初期化
  1051. LDA #$10
  1052. STA $C2,x ;モーション番号をだいぬう
  1053. COUNT_09
  1054. JMP END_MOTION
  1055.  
  1056.  
  1057.  
  1058. ANTI_X_SPEED dcb $F0,$10 ;後ろジャンプ速度 右、左
  1059.  
  1060. SUB_MOTION_10 ;後ろジャンプ
  1061. LDA $1534,x ;カウンタチェック
  1062. CMP #$00 ;ゼロか?
  1063. BNE M10_SET
  1064. JSR SUB_HORZ_POS ;マリオのほうを向く
  1065. TYA
  1066. STA $157C,x
  1067. STZ $B6,x ;X速度ゼロ
  1068. LDA #$C0
  1069. STA $AA,x ;Y速度
  1070. M10_SET
  1071.  
  1072. INC $1534,x ;モーションカウンタを増やす
  1073.  
  1074. LDY $157C,x ; \ set x speed based on direction
  1075. LDA ANTI_X_SPEED,y ; |
  1076. STA $B6,x ; /
  1077. JSL $01802A ;速度を参考に座標移動する
  1078.  
  1079. JSR SUB_GROUND_NMS
  1080. JSR SUB_TOUCHWALL_S
  1081.  
  1082. LDA $1588,x ;オブジェクトと接しているのか
  1083. AND #$08 ;天井に頭ぶつけた?
  1084. BEQ NOT_TENJO_MOTION_10
  1085. STZ $AA,x ;Y速度ゼロ
  1086. NOT_TENJO_MOTION_10 ;着地してない
  1087.  
  1088. LDA $1534,x ;カウンタチェック
  1089. CMP #$08 ;たまりましたか
  1090. BNE COUNT_10
  1091. ;たまったとき
  1092. STZ $1534,x ;モーションカウンタ初期化
  1093. LDA #$04
  1094. STA $C2,x ;モーション番号をだいぬう
  1095. COUNT_10
  1096. JMP END_MOTION
  1097.  
  1098. SUB_MOTION_11 ;バックファイア終了
  1099. INC $1534,x ;モーションカウンタを増やす
  1100.  
  1101. LDY $157C,x ; \ set x speed based on direction
  1102. LDA ANTI_X_SPEED,y ; |
  1103. STA $B6,x ; /
  1104. JSL $01802A ;速度を参考に座標移動する
  1105.  
  1106. JSR SUB_GROUND_NMS
  1107. JSR SUB_TOUCHWALL_S
  1108.  
  1109. LDA $1588,x ;オブジェクトと接しているのか
  1110. AND #$08 ;天井に頭ぶつけた?
  1111. BEQ NTM11
  1112. STZ $AA,x ;Y速度ゼロ
  1113. NTM11 ;着地してない
  1114. JMP END_MOTION
  1115.  
  1116. SUB_GROUND_NMS ;着地したら通常モーションに戻る処理
  1117. LDA $1588,x ;オブジェクトと接しているのか
  1118. AND #$04 ;着地した?
  1119. BEQ NON_GR_S
  1120. ;着地したよ
  1121. STZ $B6,x ;X速度ゼロ
  1122. STZ $AA,x ;Y速度ゼロ
  1123. JSR SUB_HORZ_POS ;マリオのほうを向く
  1124. TYA
  1125. STA $157C,x
  1126.  
  1127. STZ $1534,x ;モーションカウンタ初期化
  1128. STZ $C2,x ;モーション番号ゼロ
  1129. NON_GR_S ;着地してない
  1130. RTS
  1131. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1132. ; generate extra sprite ポコッを再生
  1133. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1134. SUB_POKO LDY #$03
  1135. FINDFREE LDA $17C0,y
  1136. BEQ FOUNDONE
  1137. DEY
  1138. BPL FINDFREE
  1139. RTS
  1140. FOUNDONE LDA #$02 ;スプライトの種類
  1141. STA $17C0,y
  1142. LDA $E4,x ;x座標
  1143. STA $17C8,y
  1144. LDA $D8,x ;y座標
  1145.  
  1146. SEC
  1147. SBC #$10
  1148.  
  1149. STA $17C4,y
  1150. LDA #$04
  1151. STA $17CC,y ;タイマー
  1152. RTS
  1153.  
  1154.  
  1155.  
  1156. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1157. ; generate extra sprite ファイア飛ばし
  1158. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1159.  
  1160. LDY $157C,x ; \ set x speed based on direction
  1161. LDA X_SPEED,y ; |
  1162. STA $B6,x ; /
  1163. JSL $01802A ; update position based on speed values
  1164.  
  1165. GEN_PUTITFIRE LDY #$07
  1166. EXTRA_LOOP LDA $170B,y
  1167. BEQ EXTRA_1
  1168. DEY
  1169. BPL EXTRA_LOOP
  1170. RTS
  1171. EXTRA_1 LDA #$0B ;スプライトの種類
  1172. STA $170B,y
  1173.  
  1174. LDA $E4,x ;x座標下位バイト
  1175. STA $171F,y
  1176. LDA $14E0,x ;x座標上位バイト
  1177. STA $1733,y
  1178.  
  1179. LDA $D8,x ;y座標下位バイト
  1180. STA $1715,y
  1181. LDA $14D4,x ;y座標上位バイト
  1182. STA $1729,y
  1183.  
  1184. LDA #$D8 ;y方向初期速度
  1185. STA $173D,y
  1186.  
  1187. LDA $157C,x ;向きチェック
  1188. CMP #$00
  1189. BNE LEFT_FIREBALL
  1190. ;RIGHT_FIREBALL ;右向きのときのファイアとばす
  1191. LDA #$18 ;x方向初期速度
  1192. STA $1747,y
  1193. BRA END_X_FIREBALL
  1194. LEFT_FIREBALL ;左向きのときのファイアとばす
  1195. LDA #$E8 ;x方向初期速度
  1196. STA $1747,y
  1197. END_X_FIREBALL
  1198. LDA #$FF ;一部スプライト用のタイマー
  1199. STA $176F,y
  1200.  
  1201. LDA #$06 ;音ならす
  1202. STA $1DFC ;ピャッ
  1203.  
  1204. RTS
  1205.  
  1206.  
  1207.  
  1208.  
Add Comment
Please, Sign In to add comment