Advertisement
Erik557

Untitled

Nov 20th, 2015
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.56 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; SMW Bowser Bowling Ball (sprite A1), by imamelia
  4. ;;
  5. ;; This is a disassembly of sprite A1 in SMW, Bowser's bowling ball.
  6. ;;
  7. ;; Uses first extra bit: YES
  8. ;;
  9. ;; If the extra bit is set, the sprite will detect ground. If not, it will act like the
  10. ;; original and travel along hardcoded paths.
  11. ;;
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13.  
  14. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  15. ;;
  16. ;; defines and tables
  17. ;;
  18. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  19.  
  20. !ExtraBit = $04
  21.  
  22. BowserBallXSpeed:
  23. db $10,$F0
  24.  
  25. BowserBallYSpeed:
  26. db $00,$00,$00,$00,$FE,$FC,$F8,$EC
  27. db $EC,$EC,$E8,$E4,$E0,$DC,$D8,$D4
  28. db $D0,$CC,$C8
  29.  
  30. BowserBallDispX:
  31. db $F0,$00,$10,$F0,$00,$10,$F0,$00,$10,$00,$00,$F8
  32.  
  33. BowserBallDispY:
  34. db $E2,$E2,$E2,$F2,$F2,$F2,$02,$02,$02,$02,$02,$EA
  35.  
  36. BowserBallTilemap:
  37. db $45,$47,$45,$65,$66,$65,$45,$47,$45,$39,$38,$63
  38.  
  39. BowserBallTileProp:
  40. db $0D,$0D,$4D,$0D,$0D,$4D,$8D,$8D,$CD,$0D,$0D,$0D
  41.  
  42. BowserBallTileSize:
  43. db $02,$02,$02,$02,$02,$02,$02,$02,$02,$00,$00,$02
  44.  
  45. BowserBallDispX2:
  46. db $04,$0D,$10,$0D,$04,$FB,$F8,$FB
  47.  
  48. BowserBallDispY2:
  49. db $00,$FD,$F4,$EB,$E8,$EB,$F4,$FD
  50.  
  51. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  52. ;;
  53. ;; init routine
  54. ;;
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56.  
  57. print "INIT ",pc
  58. RTL
  59.  
  60. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  61. ;;
  62. ;; main routine wrapper
  63. ;;
  64. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  65.  
  66. print "MAIN ",pc
  67. PHB
  68. PHK
  69. PLB
  70. JSR BowserBallMain
  71. PLB
  72. RTL
  73.  
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ;;
  76. ;; main routine
  77. ;;
  78. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  79.  
  80. BowserBallMain:
  81.  
  82. JSR BowserBallGFX ;
  83.  
  84. LDA $9D ; if sprites are locked...
  85. BEQ + ; return
  86. JMP Return0
  87. +
  88.  
  89. JSR SubOffscreenX0 ;
  90. JSL $01A7DC ;
  91. JSL $018022 ;
  92. JSL $01801A ;
  93.  
  94. LDA $1594,x ;\ Check proximity flag
  95. BEQ + ;/
  96. LDA $AA,x ; if the sprite's Y speed
  97. CMP #$40 ; has not reached 40...
  98. BPL MaxSpeed ;
  99. CLC ;
  100. ADC #$03 ; make the sprite accelerate
  101. BRA StoreSpeed ;
  102.  
  103. +
  104. JSR SubHorzPos
  105. LDA $0F ;\ If Mario not closer than 0x30 pixels horizontally,
  106. CLC ; |
  107. ADC #$30 ; |
  108. CMP #$60 ; |
  109. BCS SkipSpeedSet ;/ branch
  110. INC $1594,x ;\ Set proximity flag
  111. BRA SkipSpeedSet ;/
  112.  
  113. MaxSpeed: ;
  114.  
  115. LDA #$40 ;
  116.  
  117. StoreSpeed: ;
  118.  
  119. STA $AA,x ;
  120.  
  121. LDA $AA,x ; if the sprite speed is negative...
  122. BMI SkipSpeedSet ;
  123. LDA $14D4,x ; or its Y position high byte is negative...
  124. BMI SkipSpeedSet ; branch
  125.  
  126. LDA $7FAB10,x ;
  127. AND #!ExtraBit ; if the extra bit is set...
  128. BNE DetectGround ; make the sprite detect ground like a normal sprite
  129.  
  130. LDA $D8,x ; if not...
  131. CMP #$B0 ; check the sprite's Y position
  132. BCC SkipSpeedSet ; don't set its X speed if the sprite Y position is less than B0
  133. LDA #$B0 ; if it is B0 or greater...
  134. STA $D8,x ; make it stay at B0
  135.  
  136. Continue: ;
  137.  
  138. LDA $AA,x ; if the sprite Y speed
  139. CMP #$3E ; is less than 3E...
  140. BCC NoShake ; don't shake the ground
  141.  
  142. LDY #$25 ;
  143. STY $1DFC ; play a sound effect
  144. LDY #$20 ;
  145. STY $1887 ; shake the ground
  146.  
  147. NoShake: ;
  148.  
  149. CMP #$08 ; if the sprite's Y speed is less than 08...
  150. BCC NoSound2 ; don't play the second sound effect
  151.  
  152. LDA #$01 ;
  153. STA $1DF9 ;
  154.  
  155. NoSound2: ;
  156.  
  157. JSR HandleYSpeed ;
  158.  
  159. LDA $B6,x ; if the sprite's X speed is nonzero...
  160. BNE SkipSpeedSet ; there is no need to set it again
  161.  
  162. JSR SubHorzPos ;
  163. LDA BowserBallXSpeed,y ;
  164. STA $B6,x
  165.  
  166. SkipSpeedSet:
  167.  
  168. LDA $B6,x ;
  169. BEQ Return0 ; return if the sprite's X speed is zero
  170. BMI IncFrame ; increment the frame if the sprite's X speed is negative
  171. DEC $1570,x ; decrement the frame if the sprite's X speed is positive
  172. DEC $1570,x ;
  173. IncFrame: ;
  174. INC $1570,x ;
  175.  
  176. Return0: ;
  177. RTS
  178.  
  179. DetectGround: ;
  180.  
  181. JSL $019138 ; interact with objects
  182.  
  183. LDA $1588,x ;
  184. AND #$04 ;
  185. BEQ SkipSpeedSet ;
  186. BRA Continue ;
  187.  
  188. HandleYSpeed: ;
  189.  
  190. LDA $AA,x ;
  191. STZ $AA,x ;
  192. LSR ;
  193. LSR ;
  194. TAY ;
  195. LDA BowserBallYSpeed,y ;
  196. LDY $1588,x ;
  197. BMI Return1 ;
  198. STA $AA,x ;
  199.  
  200. Return1: ;
  201. RTS
  202.  
  203. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  204. ;;
  205. ;; graphics routine
  206. ;;
  207. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  208.  
  209. BowserBallGFX:
  210.  
  211. JSR GetDrawInfo ;
  212.  
  213. ;LDA #$70 ;
  214. ;STA $15EA,x ;
  215.  
  216. PHX ;
  217. LDX #$0B ; 12 tiles to draw
  218.  
  219. GFXLoop: ;
  220.  
  221. LDA $00 ;
  222. CLC ;
  223. ADC BowserBallDispX,x ;
  224. STA $0300,y ;
  225.  
  226. LDA $01 ;
  227. CLC ;
  228. ADC BowserBallDispY,x ;
  229. STA $0301,y ;
  230.  
  231. LDA BowserBallTilemap,x ;
  232. STA $0302,y ;
  233.  
  234. LDA BowserBallTileProp,x ;
  235. ORA $64 ;
  236. STA $0303,y ;
  237.  
  238. PHY ;
  239. TYA ;
  240. LSR #2 ;
  241. TAY ;
  242. LDA BowserBallTileSize,x ;
  243. STA $0460,y ;
  244. PLY ;
  245.  
  246. INY #4 ;
  247. DEX ;
  248. BPL GFXLoop ;
  249.  
  250. PLX ;
  251. PHX ;
  252. LDY $15EA,x ;
  253. LDA $1570,x ;
  254. LSR #3 ;
  255. AND #$07 ;
  256. PHA ;
  257. TAX ;
  258.  
  259. LDA $0304,y ;
  260. CLC ;
  261. ADC BowserBallDispX2,x ;
  262. STA $0304,y ;
  263.  
  264. LDA $0305,y ;
  265. CLC ;
  266. ADC BowserBallDispY2,x ;
  267. STA $0305,y ;
  268.  
  269. PLA ;
  270. CLC ;
  271. ADC #$02 ;
  272. AND #$07 ;
  273. TAX ;
  274.  
  275. LDA $0308,y ;
  276. CLC ;
  277. ADC BowserBallDispX2,x ;
  278. STA $0308,y ;
  279.  
  280. LDA $0309,y ;
  281. CLC ;
  282. ADC BowserBallDispY2,x ;
  283. STA $0309,y ;
  284.  
  285. PLX ;
  286. LDA #$0B ;
  287. LDY #$FF ;
  288. JSL $81B7B3 ;
  289.  
  290. RTS
  291.  
  292. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  293. ;;
  294. ;; subroutines
  295. ;;
  296. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  297.  
  298. Table1: db $0C,$1C
  299. Table2: db $01,$02
  300. Table3: db $40,$B0
  301. Table6: db $01,$FF
  302. Table4: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90,$30,$C0,$A0,$80,$A0,$40,$60,$B0
  303. Table5: db $01,$FF,$01,$FF,$01,$FF,$01,$FF,$01,$FF,$01,$FF,$01,$00,$01,$FF
  304.  
  305. SubOffscreenX0:
  306. LDA #$00
  307. ;BRA SubOffscreenMain
  308. ;SubOffscreenX1:
  309. ;LDA #$02
  310. ;BRA SubOffscreenMain
  311. ;SubOffscreenX2:
  312. ;LDA #$04
  313. ;BRA SubOffscreenMain
  314. ;SubOffscreenX3:
  315. ;LDA #$06
  316. ;BRA SubOffscreenMain
  317. ;SubOffscreenX4:
  318. ;LDA #$08
  319. ;BRA SubOffscreenMain
  320. ;SubOffscreenX5:
  321. ;LDA #$0A
  322. ;BRA SubOffscreenMain
  323. ;SubOffscreenX6:
  324. ;LDA #$0C
  325. ;BRA SubOffscreenMain
  326. ;SubOffscreenX7:
  327. ;LDA #$0E
  328.  
  329. SubOffscreenMain:
  330.  
  331. STA $03
  332.  
  333. JSR SubIsOffscreen
  334. BEQ Return2
  335.  
  336. LDA $5B
  337. LSR
  338. BCS VerticalLevel
  339. LDA $D8,x
  340. CLC
  341. ADC #$50
  342. LDA $14D4,x
  343. ADC #$00
  344. CMP #$02
  345. BPL EraseSprite
  346. LDA $167A,x
  347. AND #$04
  348. BNE Return2
  349. LDA $13
  350. AND #$01
  351. ORA $03
  352. STA $01
  353. TAY
  354. LDA $1A
  355. CLC
  356. ADC Table4,y
  357. ROL $00
  358. CMP $E4,x
  359. PHP
  360. LDA $1B
  361. LSR $00
  362. ADC Table5,y
  363. PLP
  364. SBC $14E0,x
  365. STA $00
  366. LSR $01
  367. BCC Label20
  368. EOR #$80
  369. STA $00
  370. Label20:
  371. LDA $00
  372. BPL Return2
  373.  
  374. EraseSprite:
  375. LDA $14C8,x
  376. CMP #$08
  377. BCC KillSprite
  378. LDY $161A,x
  379. CPY #$FF
  380. BEQ KillSprite
  381. LDA #$00
  382. STA $1938,y
  383. KillSprite:
  384. STZ $14C8,x
  385. Return2:
  386. RTS
  387.  
  388. VerticalLevel:
  389.  
  390. LDA $167A,x
  391. AND #$04
  392. BNE Return2
  393. LDA $13
  394. LSR
  395. BCS Return2
  396. AND #$01
  397. STA $01
  398. TAY
  399. LDA $1C
  400. CLC
  401. ADC Table3,y
  402. ROL $00
  403. CMP $D8,x
  404. PHP
  405. LDA $1D
  406. LSR $00
  407. ADC Table6,y
  408. PLP
  409. SBC $14D4,x
  410. STA $00
  411. LDY $02
  412. BEQ Label22
  413. EOR #$80
  414. STA $00
  415. Label22:
  416. LDA $00
  417. BPL Return2
  418. BMI EraseSprite
  419.  
  420. SubIsOffscreen:
  421. LDA $15A0,x
  422. ORA $186C,x
  423. RTS
  424.  
  425. GetDrawInfo:
  426.  
  427. STZ $186C,x
  428. STZ $15A0,x
  429. LDA $E4,x
  430. CMP $1A
  431. LDA $14E0,x
  432. SBC $1B
  433. BEQ OnscreenX
  434. INC $15A0,x
  435. OnscreenX:
  436. LDA $14E0,x
  437. XBA
  438. LDA $E4,x
  439. REP #$20
  440. SEC
  441. SBC $1A
  442. CLC
  443. ADC.w #$0040
  444. CMP #$0180
  445. SEP #$20
  446. ROL A
  447. AND #$01
  448. STA $15C4,x
  449. BNE Invalid
  450.  
  451. LDY #$00
  452. LDA $1662,x
  453. AND #$20
  454. BEQ OnscreenLoop
  455. INY
  456. OnscreenLoop:
  457. LDA $D8,x
  458. CLC
  459. ADC Table1,y
  460. PHP
  461. CMP $1C
  462. ROL $00
  463. PLP
  464. LDA $14D4,x
  465. ADC #$00
  466. LSR $00
  467. SBC $1D
  468. BEQ OnscreenY
  469. LDA $186C,x
  470. ORA Table2,y
  471. STA $186C,x
  472. OnscreenY:
  473. DEY
  474. BPL OnscreenLoop
  475. LDY $15EA,x
  476. LDA $E4,x
  477. SEC
  478. SBC $1A
  479. STA $00
  480. LDA $D8,x
  481. SEC
  482. SBC $1C
  483. STA $01
  484. RTS
  485.  
  486. Invalid:
  487. PLA
  488. PLA
  489. RTS
  490.  
  491. SubHorzPos:
  492.  
  493. LDY #$00
  494. LDA $94
  495. SEC
  496. SBC $E4,x
  497. STA $0F
  498. LDA $95
  499. SBC $14E0,x
  500. BPL $01
  501. INY
  502. RTS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement