Guest User

Untitled

a guest
Sep 17th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.20 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Custom Reznor
  3. ;; by Sonikku
  4. ;; Description: A custom clone of the default Reznor boss in SMW. If placed above or in the same position as (almost)
  5. ;; any sprite, it'll lock onto the center of it. This includes other instances of itself. If a Reznor is stacked on top of
  6. ;; another and it is killed, the one on top of it will attempt to ride on the sprite the parent Reznor was riding.
  7. ;;
  8. ;; If this sprite doesn't attach to another, place the sprite at the same X/Y position.
  9. ;;
  10. ;; This sprite will not function correctly when attempting to make it the child of a rotating platform.
  11. ;;
  12. ;; Support for more than 2 stacked Reznors is minimal. If two Reznors in a row of 3+ die at the same time, the top Reznors will not
  13. ;; be able to find the new parent sprite and will fall to the ground - often times at the same position of another Reznor or through sprites
  14. ;;
  15. ;; This sprite can be configured to be damaged by a variety of sources. If set to $00, that damage type will be ignored unless stated otherwise.
  16. ;; Damage above $7F is not recommended.
  17.  
  18. !GrP = $02 ; Sprite number of the custom gray platform that can damage this sprite
  19.  
  20. !StompDamage = $08 ; how much damage stomps and touching this sprite with a star deals; if zero, jumping on it hurts the player (or do nothing while invincible)
  21. !StompInvuln = $20 ; how long the sprite is invulnerable when damaged by stomps
  22.  
  23. !FireDamage = $0C ; how much damage fireballs deal; if zero, fireballs turn into puffs of smoke
  24. !FireInvuln = $10 ; how long the sprite is invulnerable when damaged by fireballs
  25.  
  26. !CapeDamage = $02 ; how much damage cape swings deal
  27. !CapeInvuln = $0C ; how long the sprite is invulnerable when damaged by cape swings
  28.  
  29. !BlockDamage = $10 ; how much damage hit bounce blocks deal - this includes flying blocks
  30. !BlockInvuln = $30 ; how long the sprite is invulnerable when damaged by bounce blocks
  31.  
  32. !ThrownDamage = $10 ; how much damage thrown sprites deal
  33. !ThrownInvuln = $30 ; how long the sprite is invulnerable when damaged by thrown sprites
  34.  
  35. !Normal = $00 ; \ don't touch these
  36. !Custom = $01 ; /
  37.  
  38. ;; Extra Property Byte 1 configures how much health this sprite has.
  39. ;; Health above $7F is not recommended.
  40. ;;
  41. ;; If the Extra Bit is set, it will check for a custom set of sprite tables, allowing for some parent-specific properties to be used.
  42. ;; The following table modifies alignment with certain sprites as well as some sprite-specific properties. Property Flag 2 currently has no use.
  43. ;; Format is as follows:
  44. ;; Sprite Number (8-bit), Custom Sprite flag (8-bit), X-positioning (16-bit), Y-Positioning (16-bit) : Property Flag 1 (8-bit), Property Flag 2 (8-bit)
  45. ;; Example: db $49 : db !Normal : dw $0008 : dw $FFF0 : db $00,$00 ; Shrinking/Growing Pipe
  46.  
  47. SpriteProperties:
  48. db $62 : db !Normal : dw $FFF8 : dw $FFEA : db $00,$00 ; Brown line-guided platform
  49. db $63 : db !Normal : dw $FFF8 : dw $FFEA : db $00,$00 ; Brown line-guided platform
  50. db $49 : db !Normal : dw $0008 : dw $FFF0 : db $00,$00 ; Shrinking/Growing Pipe
  51. db $B9 : db !Normal : dw $0000 : dw $FFF0 : db $01,$00 ; Info Box (y tho)
  52. db $C8 : db !Normal : dw $0000 : dw $FFF0 : db $01,$00 ; Light Switch
  53. db $9C : db !Normal : dw $0008 : dw $FFF0 : db $01,$00 ; Left Flying Question Block
  54. db !GrP : db !Custom : dw $0000 : dw $FFF0 : db $02,$00 ; Custom Gray Block Platform <- copy this and change !GrP to $xx (where xx is your custom sprite number) if you intend on using these with more than 1 custom winged block platform sprite.
  55. ;; add more entries below here
  56.  
  57. ;; add more entries above here
  58. SpritePropertiesEnd:
  59.  
  60. print "INIT ",pc
  61. LDA $7FAB28,x
  62. STA $1528,x
  63.  
  64. LDA #$04
  65. STA $15AC,x
  66. Sprite_Init:
  67. JSR SubHorzPos
  68. TYA
  69. STA $157C,x
  70.  
  71. JSL $01ACF9
  72. EOR $13
  73. SBC $94
  74. STA $1570,x
  75. LDA #$FF
  76. STA $1510,x
  77. STA $151C,x
  78.  
  79. LDY #$0B ;
  80. - STX $00 ;
  81. CPY $00 ;
  82. BEQ .loop ;
  83. LDA $14C8,x ;
  84. CMP #$0C ;
  85. BEQ .loop ;
  86. CMP #$01 ;
  87. BEQ + ;
  88. CMP #$08 ;
  89. BCC .loop ;
  90. + JSL $03B69F ;
  91. PHX ;
  92. TYX ;
  93. JSL $03B6E5 ;
  94. PLX ;
  95. JSL $03B72B ;
  96. BCC .loop ;
  97.  
  98. LDA $00D8,y ;
  99. STA $00 ;
  100. LDA $14D4,y ;
  101. STA $01 ;
  102. LDA $14D4,x ;
  103. XBA ;
  104. LDA $D8,x ;
  105. REP #$20 ;
  106. SEC ;
  107. SBC $00 ;
  108. SEP #$20 ;
  109. BEQ + ;
  110. BPL .loop ;
  111. + TYA ;
  112. STA $1510,x ;
  113. RTL
  114. .loop DEY ;
  115. BPL - ;
  116. RTL
  117.  
  118. print "MAIN ",pc
  119. MAIN:
  120. PHB
  121. PHK
  122. PLB
  123. JSR KeyGFXRt
  124. PLB
  125. RTL
  126.  
  127. KeyGFXRt:
  128. LDA $15AC,x
  129. BEQ +
  130. JSL Sprite_Init
  131. RTS
  132. + LDA $167A,x ; \
  133. PHA ; |
  134. LDA $1510,x ; |
  135. BMI .normal ; |
  136. TAY ; |
  137. LDA $14C8,y ; |
  138. BNE .onscreen ; |
  139. LDA $15A0,y ; |
  140. BEQ .onscreen ; | attempt to inherit offscreen status from parent sprite if it's a child
  141. STZ $14C8,x ; | if the parent sprite despawns via going offscreen, reznor will too; otherwise it processes offscreen
  142. LDY $161A,x ; | this fixes an issue where the reznor could become unparented if the parent doesn't despawn but reznor does
  143. LDA #$00 ; |
  144. STA $1938,y ; |
  145. .onscreen
  146. LDA #$04 ; |
  147. STA $167A,x ; |
  148. .normal JSR SUB_OFF_SCREEN_X0
  149. PLA ; |
  150. STA $167A,x ; /
  151. LDA $1564,x ; \
  152. BEQ .showgfx ; |
  153. LSR : LSR ; |
  154. PHX ; |
  155. TAX ; | this just makes the sprite flash when $1564,x (invulnerability timer) is set
  156. LDA $00E292,x ; |
  157. PLX ; |
  158. AND $1564,x ; |
  159. ORA $9D ; |
  160. BNE + ; /
  161. .showgfx
  162. JSR SubGfx ;
  163. + LDA $14C8,x ; \
  164. CMP #$08 ; | don't run if dead
  165. BNE .return ; /
  166. LDA $9D ; \ don't run if sprites locked
  167. BEQ + ; /
  168. .return RTS
  169. + JSL $018032 ;
  170. LDA $14 ; \
  171. AND #$01 ; | run every other frame
  172. BNE + ; /
  173. JSR FireBallDamage
  174. JSR CapeDamage
  175. JSR ThrownDamage
  176. + JSR StompDamage
  177. LDA $1510,x ; \
  178. CMP #$FF ; | branch if parented
  179. BNE + ; /
  180. JSR BounceBlockDamage
  181. JSR CheckForNewParent
  182. JSL $01802A ; gravity
  183. LDA $1588,x ; \
  184. AND #$04 ; |
  185. BEQ .inair ; | stick to floors
  186. STZ $AA,x ; |
  187. STZ $B6,x ; /
  188. .inair JMP .finish ;
  189. + TAY ;
  190. LDA $15D0,y ; \ consider sprite dead if it's being eaten (this is off anyways but whatever)
  191. BNE .killed ; /
  192. LDA $14C8,y ; \
  193. CMP #$0C ; |
  194. BEQ .killed ; | check for killed grandparent
  195. CMP #$07 ; |
  196. BCS + ; /
  197. .killed LDA $1510,y ; \ make grandparent into new parent
  198. STA $151C,x ; /
  199. LDA #$FF ; \ set existing parent to null
  200. STA $1510,x ; /
  201. STZ $AA,x ; no y speed
  202. RTS
  203. + JSR CheckCustom ; \ check if locked-on sprite is custom or not
  204. BCS .not_custom ; /
  205. JSR ExecuteCustomPtr1
  206. BRA .finish
  207. .not_custom
  208. JSR LockXPos ; lock x position (it's a JSR because I use it elsewhere too)
  209. PHX ; \
  210. LDA $1662,y ; |
  211. AND #$3F ; |
  212. ASL ; |
  213. TAX ; |
  214. LDA $14D4,y ; |
  215. XBA ; |
  216. LDA $00D8,y ; | this just locks the sprite onto the parent sprite based on it's clipping
  217. REP #$20 ; |
  218. CLC ; |
  219. ADC Clipping_TopY,x
  220. SEP #$20 ; |
  221. PLX ; |
  222. STA $D8,x ; |
  223. XBA ; |
  224. STA $14D4,x ; /
  225. .finish LDA $1540,x ; \
  226. BEQ .not_turning; |
  227. CMP #$08 ; |
  228. BNE + ; |
  229. LDA $157C,x ; | turning animation-related code
  230. EOR #$01 ; |
  231. STA $157C,x ; |
  232. + LDY #$02 ; |
  233. BRA .showframe ; /
  234. .not_turning
  235. PHY ;
  236. LDA $1570,x ; \
  237. BNE ++ ; |
  238. JSR SubHorzPos ; |
  239. TYA ; | turn toward player if not facing them
  240. CMP $157C,x ; |
  241. BEQ + ; |
  242. PLY ; |
  243. BRA .turn ; /
  244. + LDY #$3F ; timer
  245. LDA #$00 ; \
  246. AND #$04 ; | early code that made reznor fire faster when extra bit was set
  247. BEQ + ; | probably will re-implement this at whatever point
  248. LDY #$4F ; /
  249. + TYA ; \ set timer
  250. STA $1558,x ; /
  251. JSL $01ACF9 ; \
  252. AND #$3F ; | make re-fire timer slightly randomized
  253. STA $1570,x ; /
  254. ++ PLY ;
  255. INC $1570,x ;
  256. LDA $1558,x ; \
  257. ORA $1570,x ; |
  258. BNE + ; |
  259. JSR SubHorzPos ; | another place for it to turn
  260. TYA ; |
  261. CMP $157C,x ; |
  262. BEQ + ; /
  263. .turn LDA $14 ; \
  264. AND #$1F ; | only turn once every half-second or so
  265. BNE + ; /
  266. LDA #$10 ; \ turn timer
  267. STA $1540,x ; /
  268. + LDY #$00 ; \
  269. LDA $1558,x ; |
  270. BEQ .showframe ; | firing animation
  271. LDY #$01 ; |
  272. PHY ; |
  273. LDY #$00 ; /
  274. LDA #$00 ; \
  275. AND #$04 ; | more early code that made reznor fire faster
  276. BEQ + ; |
  277. INY ; /
  278. + LDA .timer,y ; \
  279. PLY ; |
  280. AND $1558,x ; |
  281. BNE .showframe ; /
  282. PHY ;
  283. JSR ReznorFire ;
  284. PLY ;
  285. .showframe
  286. TYA ;
  287. STA $1602,x ;
  288. RTS
  289.  
  290. .timer db $1F,$0F
  291.  
  292. CheckForNewParent:
  293. LDY $151C,x ; \
  294. CPY #$FF ; |
  295. BEQ + ; |
  296. LDA $14C8,y ; |
  297. CMP #$08 ; |
  298. BCC + ; |
  299. JSR LockXPos ; |
  300. JSL $03B69F ; | this just makes it so if this sprite detects that the parent dies, it'll go to the grandparent
  301. PHX ; | a more advanced script may be able to loop and get great-grandparents and etc., too
  302. TYX ; | but this assumes that two reznors cannot die in the same second or two
  303. JSL $03B6E5 ; |
  304. PLX ; |
  305. JSL $03B72B ; |
  306. BCC + ; |
  307. TYA ; |
  308. STA $1510,x ; /
  309. + RTS
  310. LockXPos:
  311. PHX ; \
  312. LDA $1662,y ; |
  313. AND #$3F ; |
  314. ASL ; |
  315. TAX ; |
  316. REP #$20 ; |
  317. LDA Clipping_CenterX,x
  318. STA $0C ; |
  319. SEP #$20 ; |
  320. PLX ; |
  321. LDA $14E0,y ; | this just locks the sprite onto the location of it's parent's x position
  322. XBA ; |
  323. LDA $00E4,y ; |
  324. REP #$20 ; |
  325. CLC ; |
  326. ADC $0C ; |
  327. SEP #$20 ; |
  328. STA $E4,x ; |
  329. XBA ; |
  330. STA $14E0,x ; /
  331. RTS
  332. Clipping_CenterX:
  333. dw $0000,$0000,$0010,$0014,$0010,$0018,$0000,$0018 ; clipping 00-07
  334. dw $0000,$0000,$FFF8,$0000,$0000,$0000,$0008,$000C ; clipping 08-0F
  335. dw $0000,$0000,$FFFB,$FFFB,$0008,$0000,$0000,$0000 ; clipping 10-17
  336. dw $0000,$0000,$0000,$0000,$0000,$0008,$FFF0,$0000 ; clipping 18-1F
  337. dw $FFFC,$FFFC,$0000,$0008,$0008,$0008,$0000,$0000 ; clipping 20-27
  338. dw $FFF8,$FFF8,$0000,$0000,$FFFC,$0008,$0008,$0014 ; clipping 28-2F
  339. dw $0004,$0010,$0010,$0018,$FFFE,$0002,$0018,$0000 ; clipping 30-37
  340. dw $0010,$0000,$0000,$0000,$0004,$0004,$0004,$0004 ; clipping 38-3F
  341. Clipping_TopY:
  342. dw $FFF0,$FFF0,$FFF0,$FFF8,$FFF0,$FFF0,$FFF0,$FFF8 ; clipping 00-07
  343. dw $FFF0,$FFF8,$FFF8,$FFF8,$FFF0,$FFF0,$FFF8,$FFF0 ; clipping 08-0F
  344. dw $FFF0,$FFD8,$0000,$0010,$FFF0,$FFF0,$FFE4,$FFF8 ; clipping 10-17
  345. dw $0000,$0010,$0020,$0030,$003C,$FFF0,$FFE8,$FFF0 ; clipping 18-1F
  346. dw $FFD8,$0000,$FFF0,$FFD8,$0010,$FFF4,$0048,$FFF0 ; clipping 20-27
  347. dw $FFD8,$FFF0,$FFE8,$FFF0,$FFE8,$FFF4,$FFF0,$FFF0 ; clipping 28-2F
  348. dw $FFE0,$FFF0,$FFF0,$FFF0,$FFEC,$FFF0,$FFF8,$FFE8 ; clipping 30-37
  349. dw $FFF0,$0000,$0000,$FFF0,$FFF8,$0004,$0000,$FFF8 ; clipping 38-3F
  350.  
  351. CheckCustom:
  352. STZ $00 ;
  353. REP #$20 ; \
  354. LDA #SpritePropertiesEnd
  355. SEC ; |
  356. SBC #SpriteProperties
  357. LSR : LSR : LSR ; | get loop count via some dumb math
  358. SEP #$20 ; |
  359. DEC ; |
  360. TAY ; /
  361. - PHY ;
  362. TYA ;
  363. ASL : ASL : ASL ;
  364. TAY ;
  365. LDA SpriteProperties+$1,y
  366. BNE .custom ;
  367. PHY ; \
  368. LDY $1510,x ; |
  369. LDA $009E,y ; | branch if sprite number doesn't match list
  370. PLY ; |
  371. CMP SpriteProperties,y
  372. BNE .loop ; /
  373. BRA .finish
  374. .custom PHX ; \
  375. LDA $1510,x ; |
  376. TAX ; |
  377. LDA $7FAB10,x ; | branch if parent sprite isn't a custom sprite
  378. PLX ; |
  379. AND #$08 ; |
  380. BEQ .loop ; /
  381. PHX ; \
  382. LDA $1510,x
  383. TAX
  384. LDA $7FAB9E,x ; | branch if custom sprite number doesn't match list
  385. PLX ; |
  386. CMP SpriteProperties,y
  387. BNE .loop ; /
  388. .finish PHY ;
  389. LDY $1510,x ; \
  390. LDA $14E0,y ; |
  391. XBA ; |
  392. LDA $00E4,y ; |
  393. PLY ; | lock sprite x position
  394. REP #$20 ; |
  395. CLC ; |
  396. ADC SpriteProperties+$2,y
  397. SEP #$20 ; |
  398. STA $E4,x ; |
  399. XBA ; |
  400. STA $14E0,x ; /
  401.  
  402. PHY ; \
  403. LDY $1510,x ; |
  404. LDA $14D4,y ; |
  405. XBA ; |
  406. LDA $00D8,y ; |
  407. PLY ; | lock sprite y position
  408. REP #$20 ; |
  409. CLC ; |
  410. ADC SpriteProperties+$4,y
  411. SEP #$20 ; |
  412. STA $D8,x ; |
  413. XBA ; |
  414. STA $14D4,x ; /
  415.  
  416. LDA SpriteProperties+$6,y
  417. STA $00 ; store type to scratch ram
  418. LDA SpriteProperties+$7,y
  419. STA $01 ; store type to scratch ram
  420. PLY ;
  421. LDY $1510,x ; restore index
  422. CLC ;
  423. RTS
  424. .loop PLY
  425. DEY ;
  426. BPL + ;
  427. LDY $1510,x ; restore index
  428. SEC ;
  429. RTS
  430. +
  431. JMP -
  432. ExecuteCustomPtr1:
  433. LDA $00 ;
  434. BEQ .return ;
  435. JSL $0086DF ;
  436. dw .return
  437. dw .flyingblocks
  438. dw .customflyingblocks
  439. .return RTS
  440. .flyingblocks
  441. LDA $1558,y ; \
  442. BEQ ++ ; | branch if "has been hit" timer is below#$08
  443. CMP #$08 ; |
  444. BCC + ; /
  445. .blockhurtsprite
  446. LDA #!BlockDamage;\
  447. BEQ + ; |
  448. STA $00 ; |
  449. JSR SubHorzPos ; |
  450. TYA ; | deal damage
  451. STA $02 ; |
  452. LDA #!BlockInvuln; |
  453. STZ $03 ; |
  454. JSR HurtSprite ; /
  455. + RTS
  456. ++ LDA #$00 ; \ clear "has been hit" flag
  457. STA $00C2,y ; /
  458. RTS
  459.  
  460. .customflyingblocks
  461. LDY $1510,x ; parented sprite index
  462. LDA $1594,y ; \
  463. AND #$01 ; | get block count (odd/even)
  464. STA $00 ; /
  465. LDA $1594,y ; \
  466. ASL : ASL : ASL ; |
  467. SEC ; |
  468. SBC $00E4,y ; |
  469. CLC ; |
  470. ADC #$08 ; |
  471. CLC ; | check if block hit is the one reznor is on
  472. ADC $E4,x ; |
  473. LSR : LSR ; |
  474. LSR : LSR ; |
  475. SEC ; |
  476. SBC $1602,y ; |
  477. STA $01 ; /
  478. BEQ ++ ; hurt sprite
  479. LDA $00 ; \ branch if odd number of blocks
  480. BEQ + ; /
  481. LDA $01 ; \
  482. DEC ; | do some silliness to make it so reznor can be hurt by both blocks its on
  483. BNE + ; /
  484. ++ LDA $154C,y ;
  485. BNE .blockhurtsprite
  486. + RTS
  487.  
  488.  
  489.  
  490. BounceBlockDamage:
  491. LDA $1564,x
  492. BNE .no_contact
  493. LDY #$03 ; get # of slots to check for
  494. - LDA $1699,y ; \ don't check clipping with nonexistent slots
  495. BEQ .loop ; /
  496. LDA $18F8,y ; \
  497. CMP #$03 ; | don't check clipping with bounce blocks that currently shouldn't interact with sprites
  498. BCS .loop ; /
  499. LDA $16CD,y ; \ load index for bounce block sprite clipping/position (?)
  500. BEQ .loop ; / don't interact if it's zero
  501. PHX ; \
  502. TAX ; |
  503. LDA $16D1,y ; |
  504. CLC ; |
  505. ADC $029656,x ; | set bounce block clipping x position
  506. STA $00 ; |
  507. LDA $16D5,y ; |
  508. ADC $029658,x ; |
  509. STA $08 ; /
  510. LDA $02965A,x ; \ set bounce block clipping width
  511. STA $02 ; /
  512. LDA $16D9,y ; \
  513. CLC ; |
  514. ADC $02965C,x ; |
  515. STA $01 ; | set bounce block clipping y position
  516. LDA $16DD,y ; |
  517. ADC $02965E,x ; |
  518. STA $09 ; /
  519. LDA $029660,x ; \ set bounce block clipping height
  520. STA $03 ; /
  521. PLX ;
  522. JSL $03B69F ; get sprite clipping
  523. JSL $03B72B ; check for contact
  524. BCS + ;
  525. .loop DEY ; \ loop if needed
  526. BPL - ; /
  527. .no_contact
  528. RTS ;
  529. + LDA #!BlockDamage
  530. BEQ +
  531. STA $00
  532. JSR SubHorzPos
  533. TYA
  534. STA $02
  535. LDA #!BlockInvuln
  536. STZ $03
  537. JSR HurtSprite
  538. RTS
  539. FireBallDamage:
  540. LDY #$09 ; times to loop
  541. - LDA $170B,y ; \
  542. CMP #$05 ; |
  543. BEQ + ; | only detect yoshi and mario fireballs
  544. CMP #$11 ; |
  545. BNE .loop ; /
  546. + LDA $171F,y ; \
  547. SEC ; |
  548. SBC #$02 ; |
  549. STA $00 ; | fireball clipping x position
  550. LDA $1733,y ; |
  551. SBC #$00 ; |
  552. STA $08 ; /
  553. LDA #$0C ; \ fireball clipping width
  554. STA $02 ; /
  555. LDA $1715,y ; \
  556. SEC ; |
  557. SBC #$04 ; |
  558. STA $01 ; | fireball clipping y position
  559. LDA $1729,y ; |
  560. SBC #$00 ; |
  561. STA $09 ; /
  562. LDA #$0C ; \ fireball clipping height
  563. STA $03 ; /
  564. JSL $03B69F ; get sprite clipping
  565. JSL $03B72B ; check for contact
  566. BCS + ;
  567. .loop DEY ;
  568. BPL - ;
  569. .no_contact
  570. RTS ;
  571. + LDA #$01 ; \
  572. STA $170B,y ; | turn fireball to smoke
  573. LDA #$10 ; |
  574. STA $176F,y ; /
  575. LDA #$01 ; \ play sound
  576. STA $1DF9 ; /
  577. LDA $1564,x ; \
  578. BNE + ; |
  579. LDA #!FireDamage; |
  580. BEQ .no_contact ; |
  581. STA $00 ; |
  582. STZ $02 ; | handle damaging sprite
  583. LDA $1747,y ; |
  584. BNE + ; |
  585. INC $02 ; |
  586. + LDA #!FireInvuln; |
  587. STZ $03 ; |
  588. JSR HurtSprite ; /
  589. RTS
  590. CapeDamage:
  591. LDA $1564,x ;
  592. BNE .no_contact ;
  593. LDA #!CapeDamage;
  594. BEQ .no_contact ;
  595. LDA $1632,x ; \
  596. PHY ; |
  597. LDY $74 ; |
  598. BEQ + ; | don't interact with cape if mario and the sprite
  599. EOR #$01 ; | are not both above/behind the foreground together
  600. + PLY ; |
  601. EOR $13F9 ; |
  602. BNE .no_contact ; /
  603. LDA $13E8 ; \ don't interact with cape if cape contact is disabled
  604. BEQ .no_contact ; /
  605. LDA $15D0,x ; \
  606. ORA $1FE2,x ; | don't interact with cape if sprite is being eaten or it just shouldn't
  607. BNE .no_contact ; /
  608. LDA $13E9 ; \
  609. SEC ; |
  610. SBC #$02 ; |
  611. STA $00 ; | set cape clipping x position
  612. LDA $13EA ; |
  613. SBC #$00 ; |
  614. STA $08 ; /
  615. LDA #$14 ; \ set cape clipping width
  616. STA $02 ; /
  617. LDA $13EB ; \
  618. STA $01 ; | set cape clipping y position
  619. LDA $13EC ; |
  620. STA $09 ; /
  621. LDA #$10 ; \ set cape clipping height
  622. STA $03 ; /
  623. JSL $03B69F ; get sprite clipping
  624. JSL $03B72B ; check for contact
  625. BCC .no_contact ;
  626. LDA #!CapeDamage; \
  627. STA $00 ; |
  628. JSR SubHorzPos ; |
  629. TYA ; | handle damaging sprite
  630. STA $02 ; |
  631. STZ $03 ; |
  632. LDA #!CapeInvuln; |
  633. JSR HurtSprite ; /
  634. .no_contact
  635. RTS
  636. StompDamage:
  637. JSL $01A7DC ; \ branch when no contact made
  638. BCC .no_contact ; /
  639. LDA $1490 ;
  640. BEQ + ;
  641. LDA #!StompDamage;\ branch if taking no damage from stomps
  642. BEQ .no_contact ; /
  643. STA $00 ; \
  644. STZ $03 ; |
  645. JSR SubHorzPos ; |
  646. TYA ; | manage damage taken
  647. STA $02 ; |
  648. LDA #!StompInvuln; |
  649. JSR HurtSprite ; /
  650. RTS
  651. + LDA $14D4,x ; \
  652. XBA ; |
  653. LDA $D8,x ; |
  654. REP #$20 ; |
  655. CLC ; |
  656. ADC #$FFF0 ; |
  657. SEC ; | hurt mario if not directly on top of sprite
  658. SBC $96 ; |
  659. LDY $187A ; |
  660. BEQ + ; |
  661. CLC ; |
  662. ADC #$FFF0 ; |
  663. + CMP #$0016 ; |
  664. SEP #$20 ; |
  665. BMI .hurt_mario ; /
  666. LDA $7B
  667. BMI .no_contact
  668. LDA #!StompDamage;\ branch if damage is taken from stomps
  669. BNE .stomp ; /
  670. LDA $140D ; \
  671. BEQ .hurt_mario ; | hurt mario if not spin jumping when no damage is taken from stomps
  672. BRA .finish ; /
  673. .stomp LDA $1564,x ; \ branch if invulnerable
  674. BNE .finish ; /
  675. LDA #!StompDamage;\ branch if taking no damage from stomps
  676. BEQ .finish ; /
  677. STA $00 ; \
  678. STA $03 ; |
  679. JSR SubHorzPos ; |
  680. TYA ; | manage damage taken
  681. STA $02 ; |
  682. LDA #!StompInvuln; |
  683. JSR HurtSprite ; /
  684. BRA +
  685. .finish LDA #$02 ; \ sound
  686. STA $1DF9 ; /
  687. + JSL $01AB99 ; contact graphic
  688. JSL $01AA33 ; boost mario speed
  689. .no_contact
  690. RTS
  691.  
  692. .hurt_mario
  693. LDA $1564,x ; \ branch if invulnerable
  694. BNE .no_contact ; /
  695. LDA $187A ; \ branch if riding yoshi
  696. BNE .loseyoshi ; /
  697. JSL $00F5B7 ; hurt mario
  698. RTS
  699. .loseyoshi
  700. PHX ;
  701. LDX #$0B ;
  702. - LDA $9E,x ; \
  703. CMP #$35 ; | get index of yoshi
  704. BEQ + ; /
  705. DEX ;
  706. BPL - ;
  707. PLX ;
  708. RTS
  709. + LDA #$10 ; \
  710. STA $163E,x ; |
  711. LDA #$03 ; |
  712. STA $1DFA ; |
  713. LDA #$13 ; |
  714. STA $1DFC ; |
  715. LDA #$02 ; |
  716. STA $C2,x ; |
  717. STZ $187A ; |
  718. STZ $0DC1 ; |
  719. LDA #$C0 ; | basically ripped from $02A473
  720. STA $7D ; | forces mario to lose yoshi
  721. STZ $7B ; |
  722. LDA $157C,x ; |
  723. PHX ; |
  724. TAX ; |
  725. LDA $02A4B3,x ; |
  726. PLX ; |
  727. STA $B6,x ; |
  728. STZ $1594,x ; |
  729. STZ $151C,x ; |
  730. STZ $18AE ; |
  731. LDA #$30 ; |
  732. STA $1497 ; /
  733. PLX
  734. RTS
  735. ThrownDamage:
  736. LDA #!ThrownDamage
  737. BEQ .no_contact
  738. LDA $1564,x
  739. BNE .no_contact
  740. LDY #$0B ; times to loop
  741. - LDA $14C8,y ; \
  742. CMP #$0B ; |
  743. BEQ .loop ; | don't interact with non-carried non-carriable sprites
  744. CMP #$09 ; |
  745. BCC .loop ; /
  746. JSL $03B69F ; \
  747. PHX ; |
  748. TYX ; |
  749. JSL $03B6E5 ; | branch if no contact
  750. PLX ; |
  751. JSL $03B72B ; |
  752. BCS + ; /
  753. .loop DEY ;
  754. BPL - ;
  755. .no_contact
  756. RTS
  757. + LDA #$02 ; \ kill thrown sprite
  758. STA $14C8,y ; /
  759. PHX ; \
  760. LDX #$00 ; |
  761. LDA $00B6,y ; |
  762. BPL + ; | killed x speed based on direction it was moving
  763. INX ; |
  764. + TXA ; |
  765. EOR #$01 ; |
  766. STA $02 ; |
  767. LDA .killed_xspeed,x
  768. PLX ; |
  769. STA $00B6,y ; /
  770. LDA #$D0 ; \ killed y speed
  771. STA $00AA,y ; /
  772. LDA #!ThrownDamage
  773. STA $00
  774. STZ $03
  775. LDA #!ThrownInvuln
  776. JSR HurtSprite
  777. RTS
  778. .killed_xspeed
  779. db $F0,$10
  780. HurtSprite:
  781. STA $01
  782. LDA $1564,x
  783. BNE .return
  784. LDA #$03
  785. STA $1DF9
  786. LDA $1528,x
  787. SEC
  788. SBC $00
  789. DEC
  790. BPL .hurt
  791. LDA #$02
  792. STA $14C8,x
  793. LDA #$09
  794. JSL $02ACEF
  795. LDA $03
  796. BEQ BounceKill
  797. LDA #$E0
  798. STA $AA,x
  799. STZ $B6,x
  800. CLC
  801. RTS
  802. .hurt STA $1528,x
  803. LDA $01
  804. STA $1564,x
  805. LDA #$28
  806. STA $1DFC
  807. LDA #$03
  808. LDY $03
  809. BEQ +
  810. LDA #$02
  811. + STA $1DF9
  812. SEC
  813. .return RTS
  814.  
  815. BounceKill:
  816. LDA #$C0
  817. STA $AA,x
  818. LDY $02
  819. LDA .killedx,y
  820. STA $B6,x
  821. CLC
  822. RTS
  823. .killedx
  824. db $F8,$08
  825.  
  826.  
  827. ReznorFire:
  828. LDY #$07
  829. - LDA $170B,y
  830. BEQ +
  831. DEY
  832. BPL -
  833. RTS
  834. + LDA #$10
  835. STA $1DF9
  836. LDA #$02
  837. STA $170B,y
  838.  
  839. PHY
  840. LDA $157C,x
  841. ASL
  842. TAY
  843. LDA $14E0,x
  844. XBA
  845. LDA $E4,x
  846. REP #$20
  847. CLC
  848. ADC .x_pos,y
  849. SEP #$20
  850. PLY
  851. STA $171F,y
  852. SEC
  853. SBC $94
  854. STA $00
  855. XBA
  856. STA $1733,y
  857. SBC $95
  858. STA $01
  859.  
  860. LDA $14D4,x
  861. XBA
  862. LDA $D8,x
  863. STA $1715,y
  864. SEC
  865. SBC $96
  866. STA $02
  867. XBA
  868. STA $1729,y
  869. SBC $97
  870. STA $03
  871.  
  872. LDA #$18
  873. JSL aiming
  874.  
  875. LDA $00
  876. STA $1747,y
  877.  
  878. LDA $02
  879. STA $173D,y
  880.  
  881. LDA #$01
  882. STA $1765,y
  883. RTS
  884.  
  885. .x_pos
  886. dw $0008,$FFF8
  887.  
  888. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  889. ;; MarioE's aiming routine
  890. ;; Source: http://smwc.me/1057883
  891.  
  892. recip_sqrt_lookup:
  893. dw $0000,$FFFF,$B505,$93CD,$8000,$727D,$6883,$60C2
  894. dw $5A82,$5555,$50F4,$4D30,$49E7,$4700,$446B,$4219
  895. dw $4000,$3E17,$3C57,$3ABB,$393E,$37DD,$3694,$3561
  896. dw $3441,$3333,$3235,$3144,$3061,$2F8A,$2EBD,$2DFB
  897. dw $2D41,$2C90,$2BE7,$2B46,$2AAB,$2A16,$2987,$28FE
  898. dw $287A,$27FB,$2780,$270A,$2698,$262A,$25BF,$2557
  899. dw $24F3,$2492,$2434,$23D9,$2380,$232A,$22D6,$2285
  900. dw $2236,$21E8,$219D,$2154,$210D,$20C7,$2083,$2041
  901. dw $2000,$1FC1,$1F83,$1F46,$1F0B,$1ED2,$1E99,$1E62
  902. dw $1E2B,$1DF6,$1DC2,$1D8F,$1D5D,$1D2D,$1CFC,$1CCD
  903. dw $1C9F,$1C72,$1C45,$1C1A,$1BEF,$1BC4,$1B9B,$1B72
  904. dw $1B4A,$1B23,$1AFC,$1AD6,$1AB1,$1A8C,$1A68,$1A44
  905. dw $1A21,$19FE,$19DC,$19BB,$199A,$1979,$1959,$1939
  906. dw $191A,$18FC,$18DD,$18C0,$18A2,$1885,$1869,$184C
  907. dw $1831,$1815,$17FA,$17DF,$17C5,$17AB,$1791,$1778
  908. dw $175F,$1746,$172D,$1715,$16FD,$16E6,$16CE,$16B7
  909. dw $16A1,$168A,$1674,$165E,$1648,$1633,$161D,$1608
  910. dw $15F4,$15DF,$15CB,$15B7,$15A3,$158F,$157C,$1568
  911. dw $1555,$1542,$1530,$151D,$150B,$14F9,$14E7,$14D5
  912. dw $14C4,$14B2,$14A1,$1490,$147F,$146E,$145E,$144D
  913. dw $143D,$142D,$141D,$140D,$13FE,$13EE,$13DF,$13CF
  914. dw $13C0,$13B1,$13A2,$1394,$1385,$1377,$1368,$135A
  915. dw $134C,$133E,$1330,$1322,$1315,$1307,$12FA,$12ED
  916. dw $12DF,$12D2,$12C5,$12B8,$12AC,$129F,$1292,$1286
  917. dw $127A,$126D,$1261,$1255,$1249,$123D,$1231,$1226
  918. dw $121A,$120F,$1203,$11F8,$11EC,$11E1,$11D6,$11CB
  919. dw $11C0,$11B5,$11AA,$11A0,$1195,$118A,$1180,$1176
  920. dw $116B,$1161,$1157,$114D,$1142,$1138,$112E,$1125
  921. dw $111B,$1111,$1107,$10FE,$10F4,$10EB,$10E1,$10D8
  922. dw $10CF,$10C5,$10BC,$10B3,$10AA,$10A1,$1098,$108F
  923. dw $1086,$107E,$1075,$106C,$1064,$105B,$1052,$104A
  924. dw $1042,$1039,$1031,$1029,$1020,$1018,$1010,$1008
  925.  
  926. aiming:
  927. PHX
  928. PHY
  929. PHP
  930. SEP #$30
  931. STA $0F
  932.  
  933. LDX #$00
  934. REP #$20
  935. LDA $00
  936. BPL .pos_dx
  937. EOR #$FFFF
  938. INC
  939. INX
  940. INX
  941. STA $00
  942. .pos_dx SEP #$20
  943. STA $4202
  944. STA $4203
  945.  
  946. NOP
  947. NOP
  948. NOP
  949. REP #$20
  950. LDA $4216
  951. STA $04
  952. LDA $02
  953. BPL .pos_dy
  954. EOR #$FFFF
  955. INC
  956. INX
  957. STA $02
  958. .pos_dy SEP #$20
  959. STA $4202
  960. STA $4203
  961. STX $0E
  962.  
  963. REP #$30
  964. LDA $04
  965. CLC
  966. ADC $4216
  967. LDY #$0000
  968. BCC .loop
  969. INY
  970. ROR
  971. LSR
  972. .loop CMP #$0100
  973. BCC +
  974. INY
  975. LSR
  976. LSR
  977. BRA .loop
  978. + CLC
  979. ASL
  980. TAX
  981. LDA recip_sqrt_lookup,x
  982. - DEY
  983. BMI +
  984. LSR
  985. BRA -
  986. + SEP #$30
  987.  
  988. STA $4202
  989. LDA $0F
  990. STA $4203
  991. NOP
  992. STZ $05
  993. STZ $07
  994. LDA $4217
  995. STA $04
  996. XBA
  997. STA $4202
  998. LDA $0F
  999. STA $4203
  1000.  
  1001. REP #$20
  1002. LDA $04
  1003. CLC
  1004. ADC $4216
  1005. STA $04
  1006. SEP #$20
  1007.  
  1008. LDX #$02
  1009. - LDA $04
  1010. STA $4202
  1011. LDA $00,x
  1012. STA $4203
  1013.  
  1014. NOP
  1015. NOP
  1016. NOP
  1017. NOP
  1018.  
  1019. LDA $4217
  1020. STA $06
  1021. LDA $05
  1022. STA $4202
  1023. LDA $00,x
  1024. STA $4203
  1025.  
  1026. REP #$20
  1027. LDA $06
  1028. CLC
  1029. ADC $4216
  1030. SEP #$20
  1031.  
  1032. LSR $0E
  1033. BCS +
  1034. EOR #$FF
  1035. INC
  1036. + STA $00,x
  1037. DEX
  1038. DEX
  1039. BPL -
  1040.  
  1041. PLP
  1042. PLY
  1043. PLX
  1044. RTL
  1045.  
  1046. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1047. ;; Graphics routine
  1048.  
  1049. SubGfx:
  1050. JSR GET_DRAW_INFO
  1051.  
  1052.  
  1053. LDA $157C,x
  1054. ASL : ASL
  1055. STA $02
  1056.  
  1057. LDA $1602,x
  1058. CMP #$02
  1059. BNE +
  1060. LDA #$04
  1061. STA $02
  1062. LDA $1602,x
  1063. + ASL : ASL
  1064. STA $03
  1065.  
  1066. LDA $15F6,x
  1067. STA $04
  1068.  
  1069. STZ $05
  1070. LDA $AA,x
  1071. BMI +
  1072. LDA $14C8,x
  1073. CMP #$07
  1074. BCS +
  1075. STA $05
  1076. + PHX
  1077. LDX #$03
  1078. - PHX
  1079. TXA
  1080. CLC
  1081. ADC $02
  1082. TAX
  1083. LDA $00
  1084. CLC
  1085. ADC .xpos,x
  1086. STA $0300,y
  1087. PLX
  1088. LDA .ypos,x
  1089. PHX
  1090. LDX $05
  1091. BEQ +
  1092. EOR #$FF
  1093. INC
  1094. CLC
  1095. ADC #$F0
  1096. + PLX
  1097. CLC
  1098. ADC $01
  1099. STA $0301,y
  1100. PHX
  1101. TXA
  1102. CLC
  1103. ADC $03
  1104. TAX
  1105. LDA .tilemap,x
  1106. STA $0302,y
  1107.  
  1108. LDA .properties,x
  1109. PHX
  1110. LDX $02
  1111. BNE +
  1112. ORA #$40
  1113. + LDX $05
  1114. BEQ +
  1115. ORA #$80
  1116. +
  1117. PLX
  1118. ORA $04
  1119. ORA $64
  1120. STA $0303,y
  1121. PLX
  1122.  
  1123. INY : INY
  1124. INY : INY
  1125. DEX
  1126. BPL -
  1127. PLX
  1128.  
  1129. LDY #$02
  1130. LDA #$03
  1131. JSL $01B7B3
  1132. RTS
  1133. .tilemap
  1134. db $40,$42,$60,$62
  1135. db $44,$46,$64,$66
  1136. db $28,$28,$48,$48
  1137.  
  1138. .xpos
  1139. db $08,$F8,$08,$F8
  1140. db $F8,$08,$F8,$08
  1141. .ypos
  1142. db $F0,$F0,$00,$00
  1143.  
  1144. .properties
  1145. db $00,$00,$00,$00
  1146. db $00,$00,$00,$00
  1147. db $00,$40,$00,$40
  1148.  
  1149.  
  1150. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1151. ; GET_DRAW_INFO
  1152. ; This is a helper for the graphics routine. It sets off screen flags, and sets up
  1153. ; variables. It will return with the following:
  1154. ;
  1155. ; Y = index to sprite OAM ($300)
  1156. ; $00 = sprite x position relative to screen boarder
  1157. ; $01 = sprite y position relative to screen boarder
  1158. ;
  1159. ; It is adapted from the subroutine at $03B760
  1160. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1161.  
  1162. SPR_T1: db $0C,$1C
  1163. SPR_T2: db $01,$02
  1164.  
  1165. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  1166. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  1167. LDA $E4,x ; \
  1168. CMP $1A ; | set horizontal offscreen if necessary
  1169. LDA $14E0,x ; |
  1170. SBC $1B ; |
  1171. BEQ ON_SCREEN_X ; |
  1172. INC $15A0,x ; /
  1173.  
  1174. ON_SCREEN_X: LDA $14E0,x ; \
  1175. XBA ; |
  1176. LDA $E4,x ; |
  1177. REP #$20 ; |
  1178. SEC ; |
  1179. SBC $1A ; | mark sprite invalid if far enough off screen
  1180. CLC ; |
  1181. ADC.w #$0040 ; |
  1182. CMP.w #$0180 ; |
  1183. SEP #$20 ; |
  1184. ROL A ; |
  1185. AND #$01 ; |
  1186. STA $15C4,x ; /
  1187. BNE INVALID ;
  1188.  
  1189. LDY #$00 ; \ set up loop:
  1190. LDA $1662,x ; |
  1191. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  1192. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  1193. INY ; /
  1194. ON_SCREEN_LOOP: LDA $D8,x ; \
  1195. CLC ; | set vertical offscreen if necessary
  1196. ADC SPR_T1,y ; |
  1197. PHP ; |
  1198. CMP $1C ; | (vert screen boundry)
  1199. ROL $00 ; |
  1200. PLP ; |
  1201. LDA $14D4,x ; |
  1202. ADC #$00 ; |
  1203. LSR $00 ; |
  1204. SBC $1D ; |
  1205. BEQ ON_SCREEN_Y ; |
  1206. LDA $186C,x ; | (vert offscreen)
  1207. ORA SPR_T2,y ; |
  1208. STA $186C,x ; |
  1209. ON_SCREEN_Y: DEY ; |
  1210. BPL ON_SCREEN_LOOP ; /
  1211.  
  1212. LDY $15EA,x ; get offset to sprite OAM
  1213. LDA $E4,x ; \
  1214. SEC ; |
  1215. SBC $1A ; | $00 = sprite x position relative to screen boarder
  1216. STA $00 ; /
  1217. LDA $D8,x ; \
  1218. SEC ; |
  1219. SBC $1C ; | $01 = sprite y position relative to screen boarder
  1220. STA $01 ; /
  1221. RTS ; return
  1222.  
  1223. INVALID: PLA ; \ return from *main gfx routine* subroutine...
  1224. PLA ; | ...(not just this subroutine)
  1225. RTS ; /
  1226.  
  1227.  
  1228. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1229. ; SUB_OFF_SCREEN
  1230. ; This subroutine deals with sprites that have moved off screen
  1231. ; It is adapted from the subroutine at $01AC0D
  1232. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1233.  
  1234. SPR_T12: db $40,$B0
  1235. SPR_T13: db $01,$FF
  1236. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  1237. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  1238. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  1239. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  1240.  
  1241. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  1242. BRA STORE_03 ; | (table entry to use on horizontal levels)
  1243. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  1244. BRA STORE_03 ; |
  1245. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  1246. BRA STORE_03 ; |
  1247. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  1248. BRA STORE_03 ; |
  1249. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  1250. BRA STORE_03 ; |
  1251. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  1252. BRA STORE_03 ; |
  1253. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  1254. STORE_03: STA $03 ; |
  1255. BRA START_SUB ; |
  1256. SUB_OFF_SCREEN_X0: STZ $03 ; /
  1257.  
  1258. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  1259. BEQ RETURN_35 ; /
  1260. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  1261. AND #$01 ; |
  1262. BNE VERTICAL_LEVEL ; /
  1263. LDA $D8,x ; \
  1264. CLC ; |
  1265. ADC #$30 ; | if the sprite has gone off the bottom of the level...
  1266. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  1267. ADC #$00 ; |
  1268. CMP #$02 ; |
  1269. BPL ERASE_SPRITE ; / ...erase the sprite
  1270. LDA $167A,x ; \ if "process offscreen" flag is set, return
  1271. AND #$04 ; |
  1272. BNE RETURN_35 ; /
  1273. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  1274. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  1275. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  1276. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  1277. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  1278. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  1279. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  1280. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  1281. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  1282. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  1283. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  1284. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  1285. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  1286. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  1287. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  1288. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  1289. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  1290. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  1291. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  1292. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  1293. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  1294. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  1295. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  1296. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  1297. CMP #$08 ; |
  1298. BCC KILL_SPRITE ; /
  1299. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  1300. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  1301. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  1302. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  1303. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  1304. KILL_SPRITE: STZ $14C8,x ; erase sprite
  1305. RETURN_35: RTS ; return
  1306.  
  1307. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, return
  1308. AND #$04 ; |
  1309. BNE RETURN_35 ; /
  1310. LDA $13 ; \
  1311. LSR A ; |
  1312. BCS RETURN_35 ; /
  1313. LDA $E4,x ; \
  1314. CMP #$00 ; | if the sprite has gone off the side of the level...
  1315. LDA $14E0,x ; |
  1316. SBC #$00 ; |
  1317. CMP #$02 ; |
  1318. BCS ERASE_SPRITE ; / ...erase the sprite
  1319. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  1320. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  1321. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  1322. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  1323. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  1324. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  1325. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  1326. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  1327. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  1328. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  1329. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  1330. LDA.w $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  1331. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  1332. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  1333. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  1334. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  1335. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  1336. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  1337. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  1338. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  1339. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  1340. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  1341. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  1342. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  1343.  
  1344. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  1345. ORA $186C,x ; |
  1346. RTS ; / return
  1347. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1348. ; SubHorzPos
  1349. ; This routine determines which side of the sprite Mario is on. It sets the Y register
  1350. ; to the direction such that the sprite would face Mario
  1351. ; It is ripped from $03B817
  1352. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1353.  
  1354. ;org $03B817
  1355.  
  1356. SubHorzPos:
  1357. LDY #$00
  1358. LDA $94
  1359. SEC
  1360. SBC $E4,x
  1361. STA $0F
  1362. LDA $95
  1363. SBC $14E0,x
  1364. BPL .Return
  1365. INY
  1366. .Return
  1367. RTS
  1368.  
  1369. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1370. ; SubVertPos
  1371. ; This routine determines if Mario is above or below the sprite. It sets the Y register
  1372. ; to the direction such that the sprite would face Mario
  1373. ; It is ripped from $03B829
  1374. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1375.  
  1376. ;org $03B817
  1377.  
  1378. SubVertPos:
  1379. LDY #$00
  1380. LDA $D3
  1381. SEC
  1382. SBC $D8,x
  1383. STA $0F
  1384. LDA $D4
  1385. SBC $14D4,x
  1386. BPL .Return
  1387. INY
  1388. .Return
  1389. RTS
Add Comment
Please, Sign In to add comment