Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.88 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; ;
  3. ; ***Sledge Brother*** ;
  4. ; Author of Sprite: Schwa ;
  5. ; Original Sprite: mikeyk ;
  6. ; ;
  7. ; What this does: ;
  8. ; He throws hammers at Mario, occasionally jumping into the air. ;
  9. ; ;
  10. ; This sprite will shake the ground whenever he falls and lands on it, stunning ;
  11. ; Mario if he's on the ground. He also takes two stomps to defeat-- the first stomp ;
  12. ; will knock him backwards, the second will defeat him. ;
  13. ; ;
  14. ; Extra Bit Clear: ;
  15. ; He throws 1 hammer at a time like a normal Hammer Bro. ;
  16. ; ;
  17. ; Extra Bit Set: ;
  18. ; He throws hammers 3 at a time. The throw formation is of a triangle shape, and ;
  19. ; they cover the inside of his arc unlike before, so the only reliable way to dodge ;
  20. ; is by weaving in-between the hammers. ;
  21. ; ;
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23.  
  24. ;;;;;;;;;;;;;;;;;;;;;
  25. ; variables and Ram ;
  26. ;;;;;;;;;;;;;;;;;;;;;
  27.  
  28. r_JUMP = $163E
  29. r_THROW = $1504
  30. r_HP = $1528
  31. r_FLASH = $1534
  32. r_BIT = $7FAB10
  33.  
  34. v_STUN = $38
  35. v_FLASHTIME = $6F
  36. v_HIT_YSPD = $D8
  37. v_HIT_SFX = $20
  38. v_SHOW_HMR = $20 ;time to display the hammer before it is thrown
  39. v_HAMMER_TILE = $6D
  40.  
  41. t_XSPEED:
  42. dcb $00,$FC,$00,$04 ;rest at bottom, moving up, rest at top, moving down
  43. t_XSPEED_KILLED
  44. dcb $F0,$10 ; when killed with star
  45. t_TIME_IN_POS:
  46. dcb $48,$10,$48,$10 ;moving up, rest at top, moving down, rest at bottom
  47. t_UNTIL_THROW:
  48. dcb $43,$3C
  49. t_BOUNCE:
  50. dcb $E4,$1C ;x speed to give mario when he stomps the sprite
  51. t_XOFFSET_LO:
  52. dcb $F4,$0C
  53. t_XOFFSET_HI:
  54. dcb $FF,$00
  55. t_XSPEED_HAMMER:
  56. dcb $12,$EE,$10,$F0,$14,$EC,$1C,$E4
  57. t_YSPEED_HAMMER:
  58. dcb $D0,$D0,$D2,$D2,$C0,$C0,$C8,$C8
  59. t_TILEMAP:
  60. dcb $A6,$A9,$E0,$E1,$A6,$A9,$E3,$E4,$A6,$A7,$E0,$E1,$A6,$A7,$E3,$E4
  61. dcb $A6,$A9,$E0,$E1,$A6,$A9,$E3,$E4,$A6,$A7,$E0,$E1,$A6,$A7,$E3,$E4
  62. t_XDISP:
  63. dcb $FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04
  64. dcb $04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC,$04,$FC
  65. t_YDISP:
  66. dcb $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
  67. dcb $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
  68. t_PROPFLASH:
  69. dcb $00,$02,$04,$06,$08,$0A,$0C,$0E
  70. t_PROPERTIES:
  71. dcb $40,$00 ;xyppccct format
  72.  
  73. ;;;;;;;;;;;;;;;;
  74. ; init routine ;
  75. ;;;;;;;;;;;;;;;;
  76.  
  77. dcb "INIT"
  78. JSR SUB_HORZ_POS
  79. TYA
  80. STA $157C,x
  81.  
  82. LDA $1588,x
  83. ORA #$04
  84. STA $1588,x
  85.  
  86. STZ $1602,x
  87.  
  88. TXA
  89. AND #$03
  90. ;ASL A
  91. ;ASL A
  92. ASL A
  93. ASL A
  94. PHA
  95. ASL A
  96. ADC #$32
  97. STA r_THROW,x
  98.  
  99. PLA
  100. ADC #$FE
  101. STA r_JUMP,x
  102.  
  103. RTL
  104.  
  105. ;;;;;;;;;;;;;;;;
  106. ; main routine ;
  107. ;;;;;;;;;;;;;;;;
  108.  
  109. dcb "MAIN"
  110. HAMMER_BRO_JSL:
  111. PHB ; \
  112. PHK ; | main sprite function, just calls local subroutine
  113. PLB ; |
  114. JSR DecrementTimers ; |
  115. JSR START_HB_CODE ; |
  116. PLB ; |
  117. RTL ; /
  118.  
  119. DecrementTimers:
  120. LDA $14C8,x
  121. CMP #$08
  122. BNE DoneDec2
  123. LDA $9D
  124. BNE DoneDec2
  125.  
  126. LDA r_FLASH,x
  127. BEQ DoneDec1
  128. DEC r_FLASH,x
  129. DoneDec1:
  130. LDA r_THROW,x
  131. BEQ DoneDec2
  132. DEC r_THROW,x
  133. DoneDec2:
  134. RTS
  135.  
  136. ;;;;;;;;;;;;;;;;;;;;
  137. ; main sprite code ;
  138. ;;;;;;;;;;;;;;;;;;;;
  139.  
  140. STAR:
  141. INC r_THROW,x
  142. RETURN1:
  143. RTS
  144. START_HB_CODE:
  145. JSR SUB_GFX ; draw hammer bro gfx
  146. LDA $14C8,x ; \ if hammer bro status != 8...
  147. CMP #$02 ; | ... not (killed with spin jump [4] or star[2])
  148. BEQ STAR ; |
  149. CMP #$08 ; |
  150. BNE RETURN1 ; / ... return
  151. LDA $9D ; \ if sprites locked...
  152. BNE RETURN1 ; / ... return
  153.  
  154. JSR SUB_HORZ_POS ; \ always face mario
  155. TYA ; |
  156. STA $157C,x ; /
  157.  
  158. JSR SUB_OFF_SCREEN_X3 ; only process hammer bro while on screen
  159. INC $1570,x ; increment number of frames hammer bro has been on screen
  160.  
  161. LDA $1570,x ; \ calculate which frame to show:
  162. LSR A ; |
  163. LSR A ; |
  164. LSR A ; |
  165. LSR A ; |
  166. AND #$01 ; | update every 16 cycles if normal
  167. STA $1602,x ; / write frame to show
  168.  
  169. LDA r_THROW,x ; \ if time until spit >= $10
  170. CMP #v_SHOW_HMR ; | just go to normal walking code
  171. BCS JUMP_SPRITE ; /
  172. INC $1602,x
  173. INC $1602,x
  174.  
  175. LDA r_THROW,x ; \ throw hammer if it's time
  176. BNE NO_RESET ; |
  177. LDY $C2,x ; |
  178. LDA t_UNTIL_THROW,y ; |
  179. STA r_THROW,x ; |
  180. NO_RESET:
  181. CMP #$01 ; |
  182. BNE JUMP_SPRITE ; |
  183. LDA $C2,x ; |
  184. EOR #$01 ; |
  185. STA $C2,x ; |
  186. JSR SUB_WEAPON ; /
  187.  
  188. JUMP_SPRITE:
  189. LDA r_JUMP,x
  190. CMP #$40 ; \ just go to normal walking code
  191. BCS WALK_SPRITE ; /
  192. LDA $1602,x ; \ lock image while jumping
  193. ORA #$01 ; |
  194. STA $1602,x ; /
  195. INC $1540,x ; we didn't move the sprite this frame, so we don't want a decrement
  196. STZ $B6,x ; stop sprite from moving
  197. LDA r_JUMP,x
  198. CMP #$38
  199. BNE NO_JUMP2
  200. LDA #$B0 ; \ y speed
  201. STA $AA,x ; /
  202. BRA APPLY_SPEED
  203. NO_JUMP2:
  204. CMP #$00
  205. BNE APPLY_SPEED
  206. LDA #$FE
  207. STA r_JUMP,x
  208.  
  209. BRA APPLY_SPEED
  210.  
  211. WALK_SPRITE:
  212. LDA r_FLASH,x ; \ completely skip x speed code if flashing
  213. BNE FLASH_SPEED ; / to allow sprite to get knocked backwards
  214.  
  215. LDA $151C,x ;
  216. TAY ;
  217. LDA $1540,x ;
  218. BEQ CHANGE_SPEED ;
  219. LDA t_XSPEED,y ; \ set x speed
  220. STA $B6,x ; /
  221. BRA APPLY_SPEED
  222.  
  223. CHANGE_SPEED:
  224. LDA t_TIME_IN_POS,y
  225. STA $1540,x
  226. LDA $151C,x
  227. INC A
  228. AND #$03
  229. STA $151C,x
  230.  
  231. BRA APPLY_SPEED
  232.  
  233. FLASH_SPEED:
  234. LDA $1588,x ; \
  235. AND #$04 ; | if on the ground AND not moving upward...
  236. BEQ APPLY_SPEED ; |
  237. LDA $AA,x ; |
  238. BMI APPLY_SPEED ; /
  239.  
  240. STZ $B6,x ; ...stop sprite from being knocked back
  241.  
  242. APPLY_SPEED:
  243. LDA $1588,x ; push ground status so we can compare later
  244. PHA ;
  245.  
  246. JSL $01802A ; update position based on speed values
  247.  
  248. LDA $1588,x ; if on the ground now...
  249. AND #04 ;
  250. BEQ IN_AIR ;
  251. PLA ; ...and not on the ground before
  252. AND #04 ;
  253. BNE CHECK_TOUCH ;
  254. LDA #v_STUN ; \ shake ground
  255. STA $1887 ; /
  256.  
  257. LDA #$09 ; \ play sound effect
  258. STA $1DFC ; /
  259.  
  260. LDA $77
  261. AND #$04
  262. BEQ CHECK_TOUCH
  263. LDA #v_STUN ; set timer to freeze mario
  264. STA $18BD
  265.  
  266. BRA CHECK_TOUCH
  267. IN_AIR:
  268. PLA
  269.  
  270. CHECK_TOUCH:
  271. LDA $1588,x ; \ if hammer bro is touching the side of an object...
  272. AND #$03 ; |
  273. BEQ DONT_CHANGE_DIR ; |
  274. LDA $151C,x ; |
  275. INC A ; |
  276. AND #$03 ; |
  277. STA $151C,x ; /
  278.  
  279. DONT_CHANGE_DIR:
  280. JSL $018032 ; interact with other sprites
  281.  
  282. LDA r_FLASH,x ; \ no Mario contact allowed if flashing
  283. BNE NO_CONTACT ; /
  284.  
  285. JSL $01A7DC ; \ check for mario/hammer bro contact
  286. BCC NO_CONTACT ; / do nothing if no contact
  287.  
  288. BRA CONTACT
  289. NO_CONTACT:
  290. RTS ; return
  291.  
  292. CONTACT:
  293. JSR SUB_VERT_POS ; \
  294. LDA $0E ; | if mario isn't above sprite, and there's vertical contact...
  295. CMP #$E6 ; | ... sprite wins
  296. BPL SPRITE_WINS ; /
  297. LDA $7D ; \ if mario speed is upward, return
  298. BMI RETURN2 ; /
  299.  
  300. LDA #v_FLASHTIME ; \ prevent the Double-Edge glitch from happening
  301. STA $154C,x ; /
  302. JSR SUB_STOMP_PTS ; give mario points
  303.  
  304. LDA $15 ; Save controller state
  305. PHA
  306. ORA #$C0 ; Set holding X/Y and A/B
  307. STA $15
  308. JSL $01AA33 ; set mario speed
  309. PLA
  310. STA $15
  311.  
  312. JSR SUB_HORZ_POS
  313. TYA
  314. EOR #$01
  315. TAY
  316. LDA t_BOUNCE,y ; | bounce away horizontally
  317. STA $7B ; /
  318.  
  319. JSL $01AB99 ; display contact graphic
  320.  
  321. LDA r_HP,x ; \
  322. CMP #$02 ; | If this is the second stomp (i.e. has taken 3 or more dmg)...
  323. BCC STOMP1 ; /
  324.  
  325. LDA #$02 ; \
  326. STA $14C8,x ; | ...kill the sprite and finish
  327. STZ $B6,x ; |
  328. STA $AA,x ; |
  329. RETURN2:
  330. RTS ; /
  331.  
  332. SPRITE_WINS:
  333. LDA $154C,x ; \ if disable interaction set...
  334. ORA $15D0,x ; | ...or sprite being eaten...
  335. BNE RETURN2 ; / ...return
  336.  
  337. LDA $1490 ; \ Branch if Mario has a star
  338. BNE HAS_STAR ; /
  339.  
  340. JSL $00F5B7 ; damage Mario
  341.  
  342. RTS
  343.  
  344. STOMP1:
  345. LDA r_HP,x ; \
  346. CLC ; | deal 3 "damage" (applies to both stomping and fireballs)
  347. ADC #$03 ; |
  348. STA r_HP,x ; /
  349.  
  350. LDA #v_HIT_SFX ; \ play sound effect
  351. STA $1DF9 ; /
  352.  
  353. LDA #v_HIT_YSPD ; \ set y speed
  354. STA $AA,x ; /
  355.  
  356. JSR SUB_HORZ_POS ; \
  357. LDA t_XSPEED_KILLED,y ; | set x speed
  358. STA $B6,x ; /
  359.  
  360. LDA #$FE ; \ reset jump timer
  361. STA r_JUMP,x ; /
  362. LDA #$62 ; \ delay next hammer throw
  363. STA r_THROW,x ; /
  364.  
  365. LDA #v_FLASHTIME ; \ cause sprite to flash palettes
  366. STA r_FLASH,x ; /
  367.  
  368. RTS
  369.  
  370. HAS_STAR:
  371. LDA #$02 ; \ status = 2 (being killed by star)
  372. STA $14C8,x ; /
  373. LDA #$D0 ; \ set y speed
  374. STA $AA,x ; /
  375. JSR SUB_HORZ_POS ; get new direction
  376. LDA t_XSPEED_KILLED,y ; \ set x speed based on direction
  377. STA $B6,x ; /
  378. INC $18D2 ; increment number consecutive enemies killed
  379. LDA $18D2 ; \
  380. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  381. BCC NO_RESET2 ; |
  382. LDA #$08 ; |
  383. STA $18D2 ; /
  384. NO_RESET2:
  385. JSL $02ACE5 ; give mario points
  386. LDY $18D2 ; \
  387. CPY #$08 ; | if consecutive enemies stomped < 8 ...
  388. BCS NO_SOUND2 ; |
  389. LDA STAR_SOUNDS,y ; | ... play sound effect
  390. STA $1DF9 ; /
  391. NO_SOUND2:
  392. RTS ; final return
  393.  
  394. ;;;;;;;;;;;;;;;;;;;;;
  395. ; hammer routine ;
  396. ; (from Hammer Bro) ;
  397. ;;;;;;;;;;;;;;;;;;;;;
  398.  
  399. X_OFFSET dcb $0C,$F4
  400. X_OFFSET2 dcb $00,$FF
  401.  
  402. SUB_HAMMER_THROW LDA $15A0,x ; \ no egg if off screen
  403. ORA $186C,x ; |
  404. ORA $15D0,x ; |
  405. BNE NO_CONTACT ; /
  406.  
  407. JSL $02A9DE ; \ get an index to an unused sprite slot, return if all slots full
  408. BMI RETURN67 ; / after: Y has index of sprite being generated
  409.  
  410. LDA #$37 ; \ sound effect
  411. STA $1DF9 ; /
  412.  
  413. LDA #$01 ; \ set sprite status for new sprite
  414. STA $14C8,y ; /
  415.  
  416. PHX
  417. LDA NEW_SPRITE_NUM,x
  418. INC A
  419. TYX
  420. STA NEW_SPRITE_NUM,x
  421. PLX
  422.  
  423. PHY
  424. LDA $157C,x
  425. TAY
  426. LDA $E4,x ; \ set x position for new sprite
  427. CLC ; |
  428. ADC X_OFFSET,y ; |
  429. PLY ; |
  430. STA $00E4,y ; |
  431.  
  432. PHY ; |
  433. LDA $157C,x ; |
  434. TAY ; |
  435. LDA $14E0,x ; |
  436. ADC X_OFFSET2,y ; |
  437. PLY ; |
  438. STA $14E0,y ; /
  439.  
  440. LDA $D8,x ; \ set y position for new sprite
  441. SEC ; | (y position of generator - 1)
  442. SBC #$0E ; |
  443. STA $00D8,y ; |
  444. LDA $14D4,x ; |
  445. SBC #$00 ; |
  446. STA $14D4,y ; /
  447.  
  448. PHX ; \ before: X must have index of sprite being generated
  449. TYX ; | routine clears *all* old sprite values...
  450. JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables
  451. JSL $0187A7 ; | get table values for custom sprite
  452. LDA #$08 ; |
  453. STA EXTRA_BITS,x ; |
  454. PLX ; /
  455.  
  456. LDA $157C,x
  457. STA $157C,y
  458.  
  459. RETURN67 RTS ; return
  460.  
  461. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  462. ; graphics routine
  463. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  464.  
  465. SUB_GFX:
  466. JSR GET_DRAW_INFO ; after: Y = index to sprite tile map ($300)
  467. ; $00 = sprite x position relative to screen boarder
  468. ; $01 = sprite y position relative to screen boarder
  469. LDA $1602,x ; \
  470. ASL A ; | $03 = index to frame start (frame to show * 2 tile per frame)
  471. ASL A
  472. STA $03 ; /
  473. LDA $157C,x ; \ $02 = sprite direction
  474. STA $02 ; /
  475. BNE NO_ADD
  476. LDA $03
  477. CLC
  478. ADC #$10
  479. STA $03
  480. NO_ADD:
  481. PHX ; push sprite index
  482.  
  483. LDX #$03 ; loop counter = (number of tiles per frame) - 1
  484. LOOP_START:
  485. PHX ; push current tile number
  486. TXA ; \ X = index to horizontal displacement
  487. ORA $03 ; / get index of tile (index to first tile of frame + current tile number)
  488. FACING_LEFT:
  489. TAX ; \
  490.  
  491. LDA $00 ; \ tile x position = sprite x location ($00)
  492. CLC ; |
  493. ADC t_XDISP,x ; |
  494. STA $0300,y ; /
  495.  
  496. LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
  497. CLC ; |
  498. ADC t_YDISP,x ; |
  499. STA $0301,y ; /
  500.  
  501. LDA t_TILEMAP,x ; \ store tile
  502. STA $0302,y ; /
  503.  
  504. LDX $02 ; \
  505. LDA t_PROPERTIES,x ; | get tile t_PROPERTIES using sprite direction
  506. LDX $15E9 ; |
  507. ORA $15F6,x ; | get palette info
  508. ORA $64 ; | put in level t_PROPERTIES
  509. STA $0303,y ; / store tile t_PROPERTIES
  510.  
  511. LDA r_FLASH,x ; \ check to see if the sprite should be flashing
  512. BEQ NO_FLASH ; /
  513.  
  514. LDA $14 ; \
  515. AND #$07 ; | cycle through all 8 sprite palettes
  516. TAX ; |
  517. LDA $0303,y ; |
  518. AND #$F1 ; | <-- F1 = 11110001 = clear all Palette-related bits
  519. ORA t_PROPFLASH,x ; |
  520. STA $0303,y ; /
  521.  
  522. NO_FLASH:
  523. PLX ; \ pull, X = current tile of the frame we're drawing
  524. INY ; | increase index to sprite tile map ($300)...
  525. INY ; | ...we wrote 1 16x16 tile...
  526. INY ; | ...sprite OAM is 8x8...
  527. INY ; | ...so increment 4 times
  528. DEX ; | go to next tile of frame and loop
  529. BPL LOOP_START ; /
  530.  
  531. PLX ; pull, X = sprite index
  532.  
  533. LDA r_THROW,x
  534. CMP #$02
  535. BCC NO_SHOW_HAMMER
  536. CMP #30
  537. BCS NO_SHOW_HAMMER
  538. LDA $1602,x
  539. CMP #$02
  540. BCS SHOW_HAMMER_TOO
  541.  
  542. NO_SHOW_HAMMER:
  543. LDY #$02 ; \ 02, because we didn't write to 460 yet
  544. LDA #$03 ; | A = number of tiles drawn - 1
  545. JSL $01B7B3 ; / don't draw if offscreen
  546. RTS ; return
  547.  
  548. HAMMER_OFFSET:
  549. dcb $F4,$0C
  550.  
  551. SHOW_HAMMER_TOO:
  552. PHX
  553.  
  554. LDA $00
  555. LDX $02
  556. CLC
  557. ADC HAMMER_OFFSET,x
  558. STA $0300,y
  559.  
  560. LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
  561. CLC ; |
  562. ADC #$E8
  563. STA $0301,y ; /
  564.  
  565. LDA #v_HAMMER_TILE ; \ store tile
  566. STA $0302,y ; /
  567.  
  568. LDA #$07
  569. CPX #$00
  570. BNE NO_FLIP_HAMMER
  571. ORA #$40
  572. NO_FLIP_HAMMER:
  573. ORA $64 ; | put in level t_PROPERTIES
  574. STA $0303,y ; / store tile t_PROPERTIES
  575.  
  576. PLX
  577. INY ; | increase index to sprite tile map ($300)...
  578. INY ; | ...we wrote 1 16x16 tile...
  579. INY ; | ...sprite OAM is 8x8...
  580. INY ; | ...so increment 4 times
  581.  
  582. LDY #$02 ; \ 02, because we didn't write to 460 yet
  583. LDA #$04 ; | A = number of tiles drawn - 1
  584. JSL $01B7B3 ; / don't draw if offscreen
  585. RTS ; return
  586.  
  587. ;;;;;;;;;;;;;;;;;;
  588. ; points routine ;
  589. ;;;;;;;;;;;;;;;;;;
  590.  
  591. STAR_SOUNDS
  592. dcb $00,$13,$14,$15,$16,$17,$18,$19
  593.  
  594. SUB_STOMP_PTS:
  595. PHY
  596. LDA $1697 ; \
  597. CLC ; |
  598. ADC $1626,x ; / some enemies give higher pts/1ups quicker??
  599. INC $1697 ; increase consecutive enemies stomped
  600. TAY ;
  601. INY ;
  602. CPY #$08 ; \ if consecutive enemies stomped >= 8 ...
  603. BCS NO_SOUND ; / ... don't play sound
  604. LDA STAR_SOUNDS,y ; \ play sound effect
  605. STA $1DF9 ; /
  606. NO_SOUND:
  607. TYA ; \
  608. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  609. BCC NO_RESET3 ; |
  610. LDA #$08 ; /
  611. NO_RESET3:
  612. JSL $02ACE5 ; give Mario points
  613. PLY
  614. RTS ; return
  615.  
  616. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  617. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  618. ; routines below can be shared by all sprites. they are ripped from original
  619. ; SMW and poorly documented
  620. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  621. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  622.  
  623. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  624. ; $B760 - graphics routine helper - shared
  625. ; sets off screen flags and sets index to OAM
  626. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  627.  
  628. ;org $03B75C
  629.  
  630. TABLE1 dcb $0C,$1C
  631. TABLE2 dcb $01,$02
  632.  
  633. GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
  634. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  635. LDA $E4,x ; \
  636. CMP $1A ; | set horizontal offscreen if necessary
  637. LDA $14E0,x ; |
  638. SBC $1B ; |
  639. BEQ ON_SCREEN_X ; |
  640. INC $15A0,x ; /
  641.  
  642. ON_SCREEN_X LDA $14E0,x ; \
  643. XBA ; |
  644. LDA $E4,x ; |
  645. REP #$20 ; |
  646. SEC ; |
  647. SBC $1A ; | mark sprite invalid if far enough off screen
  648. CLC ; |
  649. ADC.W #$0040 ; |
  650. CMP.W #$0180 ; |
  651. SEP #$20 ; |
  652. ROL A ; |
  653. AND #$01 ; |
  654. STA $15C4,x ; /
  655. BNE INVALID ;
  656.  
  657. LDY #$00 ; \ set up loop:
  658. LDA $1662,x ; |
  659. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  660. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  661. INY ; /
  662. ON_SCREEN_LOOP LDA $D8,x ; \
  663. CLC ; | set vertical offscreen if necessary
  664. ADC TABLE1,y ; |
  665. PHP ; |
  666. CMP $1C ; | (vert screen boundry)
  667. ROL $00 ; |
  668. PLP ; |
  669. LDA $14D4,x ; |
  670. ADC #$00 ; |
  671. LSR $00 ; |
  672. SBC $1D ; |
  673. BEQ ON_SCREEN_Y ; |
  674. LDA $186C,x ; | (vert offscreen)
  675. ORA TABLE2,y ; |
  676. STA $186C,x ; |
  677. ON_SCREEN_Y DEY ; |
  678. BPL ON_SCREEN_LOOP ; /
  679.  
  680. LDY $15EA,x ; get offset to sprite OAM
  681. LDA $E4,x ; \
  682. SEC ; |
  683. SBC $1A ; | $00 = sprite x position relative to screen boarder
  684. STA $00 ; /
  685. LDA $D8,x ; \
  686. SEC ; |
  687. SBC $1C ; | $01 = sprite y position relative to screen boarder
  688. STA $01 ; /
  689. RTS ; return
  690.  
  691. INVALID PLA ; \ return from *main gfx routine* subroutine...
  692. PLA ; | ...(not just this subroutine)
  693. RTS ; /
  694.  
  695. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  696. ; $B817 - horizontal mario/sprite check - shared
  697. ; Y = 1 if mario left of sprite??
  698. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  699.  
  700. ;org $03B817 ; Y = 1 if contact
  701.  
  702. 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
  703. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  704. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  705. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  706. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  707. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  708. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  709. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  710. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  711. LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  712.  
  713. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  714. ; SUB_VERT_POS
  715. ; This routine determines if Mario is above or below the sprite. It sets the Y register
  716. ; to the direction such that the sprite would face Mario
  717. ; It is ripped from $03B829
  718. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  719.  
  720. SUB_VERT_POS:
  721. LDY #$00
  722. LDA $96
  723. SEC
  724. SBC $D8,x
  725. STA $0F
  726. LDA $97
  727. SBC $14D4,x
  728. BPL SPR_L11
  729. INY
  730. SPR_L11:
  731. RTS
  732.  
  733. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  734. ; $B85D - off screen processing code - shared
  735. ; sprites enter at different points
  736. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  737.  
  738. ;org $03B83B
  739.  
  740. TABLE3 dcb $40,$B0
  741. TABLE6 dcb $01,$FF
  742. TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
  743. TABLE5 dcb $01,$FF,$01,$FF,$01,$00,$01,$FF
  744.  
  745. SUB_OFF_SCREEN_X0 LDA #$06 ; \ entry point of routine determines value of $03
  746. BRA STORE_03 ; |
  747. SUB_OFF_SCREEN_X1 LDA #$04 ; |
  748. BRA STORE_03 ; |
  749. SUB_OFF_SCREEN_X2 LDA #$02 ; |
  750. STORE_03 STA $03 ; |
  751. BRA START_SUB ; |
  752. SUB_OFF_SCREEN_X3 STZ $03 ; /
  753.  
  754. START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  755. BEQ RETURN_2 ; /
  756. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  757. AND #$01 ; |
  758. BNE VERTICAL_LEVEL ; /
  759. LDA $D8,x ; \
  760. CLC ; |
  761. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  762. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  763. ADC #$00 ; |
  764. CMP #$02 ; |
  765. BPL ERASE_SPRITE ; / ...erase the sprite
  766. LDA $167A,x ; \ if "process offscreen" flag is set, return
  767. AND #$04 ; |
  768. BNE RETURN_2 ; /
  769. LDA $13 ; \
  770. AND #$01 ; |
  771. ORA $03 ; |
  772. STA $01 ; |
  773. TAY ; /
  774. LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
  775. CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
  776. ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
  777. ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
  778. 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
  779. PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
  780. 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
  781. LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
  782. ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
  783. PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
  784. 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
  785. STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
  786. LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
  787. BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
  788. EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
  789. STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
  790. LABEL20 LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
  791. BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
  792. ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  793. CMP #$08 ; |
  794. BCC KILL_SPRITE ; /
  795. LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
  796. CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
  797. BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
  798. 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
  799. STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
  800. KILL_SPRITE STZ $14C8,x ; erase sprite
  801. RETURN_2 RTS ; return
  802.  
  803. VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
  804. AND #$04 ; |
  805. BNE RETURN_2 ; /
  806. LDA $13 ; \ only handle every other frame??
  807. LSR A ; |
  808. BCS RETURN_2 ; /
  809. AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
  810. STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
  811. TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
  812. LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
  813. CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
  814. ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
  815. ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
  816. CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
  817. PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
  818. LDA.W $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
  819. LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
  820. ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
  821. PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
  822. SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
  823. STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
  824. LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
  825. BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
  826. EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
  827. STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
  828. LABEL22 LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
  829. BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
  830. BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
  831.  
  832. SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  833. ORA $186C,x ; |
  834. RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement