Advertisement
Guest User

Untitled

a guest
Jun 21st, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.20 KB | None | 0 0
  1. ;===============================================================
  2. ; NSMBWii-styled sprite status bar
  3. ; By Erik557
  4. ;===============================================================
  5. ; A status bar which was intended as a replica of NSMBWii's HUD,
  6. ; however I ended up making some modifications to it.
  7. ;===============================================================
  8. ; NOTE: It's reccomended to install the No More Sprite Tile
  9. ; limits patch!
  10. ;===============================================================
  11.  
  12.  
  13. ; RAM addreses (you can change them if you want, however
  14. ; it's not really needed.)
  15.  
  16. !LivesCounterXPos = $0EF9
  17. !LivesCounterYPos = $0EFA
  18. !CoinCounterXPos = $0EFB
  19. !CoinCounterYPos = $0EFC
  20. !YCCounterXPos = $0EFD
  21. !YCCounterYPos = $0EFE
  22. !TimerXPos = $0EFF
  23. !TimerYPos = $0F00
  24. !ScoreCounterXPos = $0F01
  25. !ScoreCounterYPos = $0F02
  26. !StatusBarDisable = $0F03
  27. !Freeram = $79 ; same as the flagpole patch
  28.  
  29. ; Customizable values
  30.  
  31. !CoinsFor1Up = 100 ; How many coins are needed for a 1-Up
  32. ; Decimal, maximum of 100.
  33.  
  34. !TimerSpeed = $28 ; Timer speed.
  35. ; $3C means 1 SMW Second = 1 second.
  36. ; Default: 3 SMW Seconds = 2 seconds.
  37.  
  38. !YCLimit = 5 ; Limit of yoshi coins displayed.
  39. ; i.e. if this is 5 and someone get 7 yoshi coins it
  40. ; would still only diaplay 5.
  41.  
  42. !Style = 1 ; 0 is ultra-compact (1 row), 1 is 2 rows.
  43.  
  44. ; Tilemaps (GFX00/01)
  45.  
  46. !PlayerHeadTile = $66
  47. !YoshiCoinTile = $4A
  48. !CrossTile = $0D
  49. !ClockTile = $0C
  50. !Number0 = $20
  51. !Number1 = $21
  52. !Number2 = $22
  53. !Number3 = $23
  54. !Number4 = $30
  55. !Number5 = $31
  56. !Number6 = $32
  57. !Number7 = $33
  58. !Number8 = $7E
  59. !Number9 = $1B
  60.  
  61. ; Nuke that old ugly bar
  62. ; (hijacks by Lui37)
  63.  
  64. org $0081F4
  65. BRA + : NOP : +
  66. org $0082E8
  67. BRA + : NOP : +
  68. org $008C81
  69. pad $009045
  70. org $009051
  71. pad $0090D1
  72. org $00985A
  73. BRA $01 : NOP
  74. org $00A2D5
  75. BRA $01 : NOP
  76. org $00A5A8
  77. BRA $01 : NOP
  78. org $00A5D5
  79. BRA $01 : NOP
  80. if read1($00F5F3) != $22 ; powerdown check
  81. org $00F5F8
  82. BRA $02 : NOP #2
  83. endif
  84. org $01C540
  85. BRA + : NOP #11 : +
  86.  
  87. ; Remap some tiles
  88.  
  89. org $00FBA4
  90. db $64,$64,$62,$60,$E8,$EA,$EC,$EA
  91. org $01E985
  92. db $64,$64,$62,$60
  93. org $028C6A
  94. db $64,$64,$62,$60
  95. org $028D42
  96. db $68,$68,$6A,$6A,$6A,$62,$62,$62
  97. db $64,$64,$64,$64,$64
  98. org $0296D8
  99. db $64,$62,$64,$62,$60,$62,$60
  100. org $029922
  101. db $64,$62,$64,$62,$62
  102. org $029922
  103. db $64,$62,$64,$62,$62
  104. org $029C33
  105. db $64,$64,$62,$60,$60,$60,$60,$60
  106. org $02A347
  107. db $64,$64,$60,$62
  108. org $028ECC
  109. db $69
  110. ;============================================
  111.  
  112. ; SA-1 check
  113.  
  114. !dp = $0000
  115. !addr = $0000
  116. !sa1 = 0
  117. !gsu = 0
  118.  
  119. if read1($00FFD6) == $15
  120. sfxrom
  121. !dp = $6000
  122. !addr = !dp
  123. !gsu = 1
  124. elseif read1($00FFD5) == $23
  125. sa1rom
  126. !dp = $3000
  127. !addr = $6000
  128. !sa1 = 1
  129. endif
  130.  
  131. if !Freeram >= $0100
  132. !FreeramB = !Freeram|!addr
  133. else
  134. !FreeramB = !Freeram
  135. endif
  136. ;============================================
  137.  
  138. ; Hijacks
  139.  
  140. org $008292
  141. autoclean JML IRQHack
  142.  
  143. org $00A5AB
  144. autoclean JML StatusBarInit
  145.  
  146. org $00A2E6
  147. autoclean JML StatusBarMain
  148.  
  149. freecode
  150.  
  151. print "Inserted at $",pc
  152.  
  153. ;============================================
  154.  
  155. ; Actual code
  156.  
  157. ;==================
  158. ; IRQ Hack
  159. ;==================
  160.  
  161. IRQHack:
  162. PHB : PHK : PLB
  163. LDX $0100|!addr
  164. LDA .allowedModes,x
  165. BNE .disableIRQ
  166.  
  167. .defaultIRQ
  168. PLB
  169. LDY #$00
  170. LDA $4211
  171. JML $008297
  172.  
  173. .disableIRQ
  174. PLB
  175. LDY #$E0
  176. LDA $4211
  177. STY $4209
  178. STZ $420A
  179. LDA $0DAE|!addr
  180. STA $2100
  181. LDA $0D9F|!addr
  182. STA $420C
  183. JML $008394
  184.  
  185. .allowedModes
  186. db $00,$00,$00,$00,$00,$00,$00,$00
  187. db $00,$00,$00,$01,$00,$00,$00,$01
  188. db $00,$00,$01,$01,$01,$01,$00,$00
  189. db $00,$00,$00,$00,$00
  190.  
  191. ;==================
  192. ; INIT Code
  193. ;==================
  194.  
  195. StatusBarInit:
  196. JSL $05809E ; restore hijacked code
  197. PHA ; preserve accumulator
  198.  
  199. ; Set the position of every timer.
  200.  
  201. LDA #10
  202. STA !LivesCounterXPos|!addr
  203. if !Style == 1
  204. STA !TimerXPos|!addr
  205. endif
  206. LDA #50
  207. STA !CoinCounterXPos|!addr
  208. if !Style == 1
  209. INC #3
  210. else
  211. LDA #120
  212. endif
  213. STA !ScoreCounterXPos|!addr
  214. if !Style == 0
  215. LDA #130
  216. STA !TimerXPos|!addr
  217. endif
  218. LDA #90
  219. STA !YCCounterXPos|!addr
  220. LDA #10
  221. STA !LivesCounterYPos|!addr
  222. STA !CoinCounterYPos|!addr
  223. STA !YCCounterYPos|!addr
  224. if !Style == 1
  225. LDA #30
  226. endif
  227. INC #3
  228. STA !TimerYPos|!addr
  229. if !Style == 0
  230. LDA #5
  231. endif
  232. STA !ScoreCounterYPos|!addr
  233.  
  234. LDA #!TimerSpeed ;\ initialize timer
  235. STA $0F30|!addr ;/
  236. PLA ; restore accumulator
  237. JML $00A5AF ; return
  238.  
  239. ;==================
  240. ; MAIN Code
  241. ;==================
  242.  
  243. StatusBarMain:
  244. JSL $028AB1 ; restore hijacked code
  245.  
  246. PHP : SEP #$30 ;\ Preserve p.flags/8-bit AXY
  247. PHB : PHK : PLB ;/ set data bank
  248.  
  249. ; Rewrite the functions of the counters which were removed by hijacks above.
  250.  
  251. ; coins
  252. LDA $13CC|!addr
  253. BEQ .NoCoinIncrease
  254. DEC $13CC|!addr
  255. INC $0DBF|!addr
  256. LDA $0DBF|!addr
  257. CMP #!CoinsFor1Up
  258. BCC .NoCoinIncrease
  259. SEC : SBC #!CoinsFor1Up
  260. STA $0DBF|!addr
  261. INC $18E4|!addr
  262.  
  263. ; timer
  264. .NoCoinIncrease
  265. LDA $1493|!addr
  266. ORA $9D
  267. BNE .NoTimerDecrease
  268. LDA $0D9B|!addr
  269. CMP #$C1
  270. BEQ .NoTimerDecrease
  271. DEC $0F30|!addr
  272. BPL .NoTimerDecrease
  273. LDA #!TimerSpeed
  274. STA $0F30|!addr
  275. LDA !FreeramB
  276. BNE .NoTimerDecrease
  277. LDA $0F31|!addr
  278. ORA $0F32|!addr
  279. ORA $0F33|!addr
  280. BEQ .NoTimerDecrease
  281. LDX #$02
  282. .TimerLoop
  283. DEC $0F31|!addr,x
  284. BPL .zero
  285. LDA #$09
  286. STA $0F31|!addr,x
  287. DEX
  288. BPL .TimerLoop
  289. .zero
  290. LDA $0F31|!addr
  291. BNE .NoSpeed
  292. LDA $0F32|!addr
  293. AND $0F33|!addr
  294. CMP #$09
  295. BNE .NoSpeed
  296. LDA #$FF
  297. STA $1DF9|!addr
  298. .NoSpeed
  299. LDA $0F31|!addr
  300. ORA $0F32|!addr
  301. ORA $0F33|!addr
  302. BNE .NoTimerDecrease
  303. JSL $00F606
  304.  
  305. ; This is the actual start of the status bar.
  306.  
  307. .NoTimerDecrease
  308. LDA !StatusBarDisable|!addr ;\ if status bar disabled, return
  309. BNE .return ;/
  310. LDA $0100|!addr ;\ if on the title screen, return
  311. CMP #$07 ; |
  312. BEQ .return ;/
  313.  
  314. JSR DrawLives ;\
  315. JSR DrawCoins ; | Draw timers.
  316. JSR DrawYCoins ; |
  317. JSR DrawTimer ; |
  318. JSR DrawScore ;/
  319.  
  320. .return
  321. PLB ;\ restore
  322. PLP ;/
  323. JML $00A2EA ; return
  324.  
  325. numberTable:
  326. db !Number0,!Number1,!Number2,!Number3,!Number4
  327. db !Number5,!Number6,!Number7,!Number8,!Number9
  328.  
  329. ;========================
  330. ; Draw the lives counter
  331. ;========================
  332.  
  333. ; this is the only counter I'll comment. Most of the others work the same way, anyway.
  334. DrawLives:
  335. REP #$10 ; 16 bit XY
  336. LDX #$0020 ; start from 9th slot as others are reserved
  337.  
  338. LDY #$0004 ;\ reserve Y+1 free slots
  339. STY $00 ; | returns if not enough
  340. JSR findFreeSlots ;/
  341.  
  342. ; "x" tile
  343. JSR findSlot ; get slot
  344. LDA !LivesCounterXPos|!addr ;\
  345. CLC : ADC #10 ; | Tile X position
  346. STA $0200|!addr,x ;/
  347. LDA !LivesCounterYPos|!addr ;\
  348. CLC : ADC #11 ; | Tile Y position
  349. STA $0201|!addr,x ;/
  350. LDA #!CrossTile ;\ Tile number
  351. STA $0202|!addr,x ;/
  352. LDA #$3E ;\ Properties of the tile
  353. STA $0203|!addr,x ;/
  354. STZ $00 ;\ Drew one 8x8 tile, so $00 = 00
  355. JSR setOAMInfo ;/
  356.  
  357. ; the rest is similar.
  358. ; mario's head
  359. JSR findSlot
  360. LDA !LivesCounterXPos|!addr
  361. STA $0200|!addr,x
  362. LDA !LivesCounterYPos|!addr
  363. STA $0201|!addr,x
  364. LDA #!PlayerHeadTile
  365. STA $0202|!addr,x
  366. LDA #$70
  367. STA $0203|!addr,x
  368. LDA #$02 ;\ Drew one 16x16 tile, so $00 = 02
  369. STA $00 ; |
  370. JSR setOAMInfo ;/
  371.  
  372. LDA $0DBE|!addr ;\
  373. BMI + ; |
  374. CMP #98 ; |
  375. BCC + ; | hotfix:
  376. LDA #98 ; | prevent the player from getting more than 99 lives
  377. STA $0DBE|!addr ;/
  378.  
  379. + INC ;\
  380. CMP #$0A ; | Determine number of digits to show
  381. BCS .twoDigits ;/
  382.  
  383. .oneDigit
  384. TAY
  385. JSR findSlot
  386. LDA !LivesCounterXPos|!addr
  387. CLC : ADC #23
  388. STA $0200|!addr,x
  389. LDA !LivesCounterYPos|!addr
  390. CLC : ADC #11
  391. STA $0201|!addr,x
  392. LDA numberTable,y
  393. STA $0202|!addr,x
  394. LDA #$3E
  395. STA $0203|!addr,x
  396. STZ $00
  397. JSR setOAMInfo
  398. JMP +
  399.  
  400. .twoDigits
  401. JSR hexToDec
  402. JSR findSlot
  403. LDA !LivesCounterXPos|!addr
  404. CLC : ADC #20
  405. STA $0200|!addr,x
  406. LDA !LivesCounterYPos|!addr
  407. CLC : ADC #11
  408. STA $0201|!addr,x
  409. LDA numberTable,y
  410. STA $0202|!addr,x
  411. LDA #$3E
  412. STA $0203|!addr,x
  413. STZ $00
  414. JSR setOAMInfo
  415.  
  416. LDA $0DBE|!addr : INC
  417. JSR hexToDec
  418. TAY
  419. JSR findSlot
  420. LDA !LivesCounterXPos|!addr
  421. CLC : ADC #28
  422. STA $0200|!addr,x
  423. LDA !LivesCounterYPos|!addr
  424. CLC : ADC #11
  425. STA $0201|!addr,x
  426. LDA numberTable,y
  427. STA $0202|!addr,x
  428. LDA #$3E
  429. STA $0203|!addr,x
  430. STZ $00
  431. JSR setOAMInfo
  432.  
  433. + SEP #$10 ; 8-bit XY
  434. RTS ; return
  435.  
  436. ;=======================
  437. ; Draw the coin counter
  438. ;=======================
  439.  
  440. DrawCoins:
  441. REP #$10
  442. LDX #$0020
  443.  
  444. LDY #$0004
  445. STY $00
  446. JSR findFreeSlots
  447.  
  448. JSR findSlot
  449. LDA !CoinCounterXPos|!addr
  450. CLC : ADC #10
  451. STA $0200|!addr,x
  452. LDA !CoinCounterYPos|!addr
  453. CLC
  454. ADC #11
  455. STA $0201|!addr,x
  456. LDA #!CrossTile
  457. STA $0202|!addr,x
  458. LDA #$3C
  459. STA $0203|!addr,x
  460. STZ $00
  461. JSR setOAMInfo
  462.  
  463. JSR findSlot
  464. LDA !CoinCounterXPos|!addr
  465. STA $0200|!addr,x
  466. LDA !CoinCounterYPos|!addr
  467. STA $0201|!addr,x
  468. LDA #$E8
  469. STA $0202|!addr,x
  470. LDA #$34
  471. STA $0203|!addr,x
  472. LDA #$02
  473. STA $00
  474. JSR setOAMInfo
  475.  
  476. LDA $0DBF|!addr
  477. CMP #$0A
  478. BCS .twoDigits
  479. .oneDigit
  480. TAY
  481. JSR findSlot
  482. LDA !CoinCounterXPos|!addr
  483. CLC : ADC #23
  484. STA $0200|!addr,x
  485. LDA !CoinCounterYPos|!addr
  486. CLC : ADC #11
  487. STA $0201|!addr,x
  488. LDA numberTable,y
  489. STA $0202|!addr,x
  490. LDA #$3C
  491. STA $0203|!addr,x
  492. STZ $00
  493. JSR setOAMInfo
  494. JMP +
  495.  
  496. .twoDigits
  497. JSR hexToDec
  498. JSR findSlot
  499. LDA !CoinCounterXPos|!addr
  500. CLC : ADC #20
  501. STA $0200|!addr,x
  502. LDA !CoinCounterYPos|!addr
  503. CLC : ADC #11
  504. STA $0201|!addr,x
  505. LDA numberTable,y
  506. STA $0202|!addr,x
  507. LDA #$3C
  508. STA $0203|!addr,x
  509. STZ $00
  510. JSR setOAMInfo
  511.  
  512. LDA $0DBF|!addr
  513. JSR hexToDec
  514. TAY
  515. JSR findSlot
  516. LDA !CoinCounterXPos|!addr
  517. CLC : ADC #28
  518. STA $0200|!addr,x
  519. LDA !CoinCounterYPos|!addr
  520. CLC : ADC #11
  521. STA $0201|!addr,x
  522. LDA numberTable,y
  523. STA $0202|!addr,x
  524. LDA #$3C
  525. STA $0203|!addr,x
  526. STZ $00
  527. JSR setOAMInfo
  528.  
  529. + SEP #$10
  530. RTS
  531.  
  532. ;=============================
  533. ; Draw the yoshi coin counter
  534. ;=============================
  535.  
  536. DrawYCoins:
  537. REP #$10
  538. LDX #$0020
  539.  
  540. LDY #$0002
  541. STY $00
  542. JSR findFreeSlots
  543.  
  544. JSR findSlot
  545. LDA !YCCounterXPos|!addr
  546. CLC : ADC #10
  547. STA $0200|!addr,x
  548. LDA !YCCounterYPos|!addr
  549. CLC
  550. ADC #11
  551. STA $0201|!addr,x
  552. LDA #!CrossTile
  553. STA $0202|!addr,x
  554. LDA #$3C
  555. STA $0203|!addr,x
  556. STZ $00
  557. JSR setOAMInfo
  558.  
  559. JSR findSlot
  560. LDA !YCCounterXPos|!addr
  561. STA $0200|!addr,x
  562. LDA !YCCounterYPos|!addr
  563. STA $0201|!addr,x
  564. LDA #!YoshiCoinTile
  565. STA $0202|!addr,x
  566. LDA #$34
  567. STA $0203|!addr,x
  568. LDA #$02
  569. STA $00
  570. JSR setOAMInfo
  571.  
  572. LDY #$0000
  573. LDA $1422|!addr
  574. CMP.b #!YCLimit+1
  575. BCC +
  576. LDY.w #!YCLimit
  577. BRA ++
  578. + TAY
  579. ++ JSR findSlot
  580. LDA !YCCounterXPos|!addr
  581. CLC : ADC #22
  582. STA $0200|!addr,x
  583. LDA !YCCounterYPos|!addr
  584. CLC : ADC #11
  585. STA $0201|!addr,x
  586. LDA numberTable,y
  587. STA $0202|!addr,x
  588. LDA #$3C
  589. STA $0203|!addr,x
  590. STZ $00
  591. JSR setOAMInfo
  592.  
  593. SEP #$10
  594. RTS
  595.  
  596. ;================
  597. ; Draw the timer
  598. ;================
  599.  
  600. DrawTimer:
  601. REP #$10
  602. LDX #$0020
  603.  
  604. LDY #$0003
  605. STY $00
  606. JSR findFreeSlots
  607.  
  608. JSR findSlot
  609. LDA !TimerXPos|!addr
  610. INC : INC
  611. STA $0200|!addr,x
  612. LDA !TimerYPos|!addr
  613. CLC : ADC #9
  614. STA $0201|!addr,x
  615. LDA #!ClockTile
  616. STA $0202|!addr,x
  617. LDA #$3E
  618. STA $0203|!addr,x
  619. STZ $00
  620. JSR setOAMInfo
  621.  
  622. SEP #$10
  623. LDY #$02
  624. .loop
  625. PHY
  626. LDA $0F31|!addr,y
  627. TAY
  628. STY $00
  629. REP #$10
  630. JSR findSlot
  631. SEP #$10
  632. LDA !TimerXPos|!addr
  633. PLY
  634. CLC : ADC .offsets,y
  635. STA $0200|!addr,x
  636. PHY
  637. LDY $00
  638. LDA !TimerYPos|!addr
  639. CLC : ADC #8
  640. STA $0201|!addr,x
  641. LDA numberTable,y
  642. STA $0202|!addr,x
  643. LDA #$3E
  644. STA $0203|!addr,x
  645. REP #$10
  646. STZ $00
  647. JSR setOAMInfo
  648. SEP #$10
  649.  
  650. PLY
  651. DEY
  652. BPL .loop
  653.  
  654. SEP #$10
  655. RTS
  656.  
  657. .offsets
  658. db 12,20,28
  659.  
  660. ;================
  661. ; Draw the score
  662. ;================
  663.  
  664. DrawScore:
  665. SEP #$10
  666. JSR HandleScore ; score is handled by separate
  667. REP #$10
  668. LDX #$0020
  669.  
  670. LDY #$0006
  671. STY $00
  672. JSR findFreeSlots
  673.  
  674. JSR findSlot
  675. LDA !ScoreCounterXPos|!addr
  676. CLC : ADC #60
  677. STA $0200|!addr,x
  678. LDA !ScoreCounterYPos|!addr
  679. CLC : ADC #8
  680. STA $0201|!addr,x
  681. LDA #!Number0
  682. STA $0202|!addr,x
  683. LDA #$3E
  684. STA $0203|!addr,x
  685. STZ $00
  686. JSR setOAMInfo
  687.  
  688. SEP #$10
  689. LDY #$05
  690. .loop
  691. PHY
  692. REP #$10
  693. JSR findSlot
  694. SEP #$10
  695. LDA $0F29|!addr,y
  696. TAY
  697. LDA numberTable,y
  698. STA $0202|!addr,x
  699. PLY
  700. LDA !ScoreCounterXPos|!addr
  701. CLC : ADC .offsets,y
  702. STA $0200|!addr,x
  703. LDA !ScoreCounterYPos|!addr
  704. CLC : ADC #8
  705. STA $0201|!addr,x
  706. LDA #$3E
  707. STA $0203|!addr,x
  708. REP #$10
  709. STZ $00
  710. JSR setOAMInfo
  711. SEP #$10
  712. DEY
  713. BPL .loop
  714.  
  715. SEP #$10
  716. RTS
  717.  
  718. .offsets
  719. db 12,20,28,36,44,52
  720.  
  721.  
  722. ;===================
  723. ; Handles the score
  724. ;===================
  725.  
  726. HandleScore:
  727. REP #$20
  728. LDX #$03
  729. CODE_008E97:
  730. LDA $0F36|!addr,X
  731. STA $00 ;$008E9A
  732. STZ $01 ;$008E9C
  733. REP #$20 ;$008E9E
  734. LDA $0F34|!addr,X ;$008EA0
  735. SEC ;$008EA3
  736. SBC #$423F ;$008EA4
  737. LDA $00 ;$008EA7
  738. SBC #$000F ;$008EA9
  739. BCC CODE_008EBF ;$008EAC
  740. SEP #$20 ;$008EAE
  741. LDA #$0F ;$008EB0
  742. STA $0F36|!addr,X ;$008EB2
  743. LDA #$42 ;$008EB5
  744. STA $0F35|!addr,X ;$008EB7
  745. LDA #$3F ;$008EBA
  746. STA $0F34|!addr,X ;$008EBC
  747. CODE_008EBF:
  748. SEP #$20
  749. DEX ;$008EC1
  750. DEX ;$008EC2
  751. DEX ;$008EC3
  752. BPL CODE_008E97 ;$008EC4
  753.  
  754. LDA $0F36|!addr ;$008EC6
  755. STA $00 ;$008EC9
  756. STZ $01 ;$008ECB
  757. LDA $0F35|!addr ;$008ECD
  758. STA $03 ;$008ED0
  759. LDA $0F34|!addr ;$008ED2
  760. STA $02 ;$008ED5
  761. LDX #$14 ;$008ED7
  762. LDY #$00 ;$008ED9
  763. CODE_009012:
  764. SEP #$20
  765. STZ $0F15|!addr,X ;$009014
  766. CODE_009017:
  767. REP #$20
  768. LDA $02 ;$009019
  769. SEC ;$00901B
  770. SBC DATA_008FFC,Y ;$00901C
  771. STA $06 ;$00901F
  772. LDA $00 ;$009021
  773. SBC DATA_008FFA,Y ;$009023
  774. STA $04 ;$009026
  775. BCC CODE_009039 ;$009028
  776. LDA $06 ;$00902A
  777. STA $02 ;$00902C
  778. LDA $04 ;$00902E
  779. STA $00 ;$009030
  780. SEP #$20 ;$009032
  781. INC $0F15|!addr,X ;$009034
  782. BRA CODE_009017 ;$009037
  783.  
  784. CODE_009039:
  785. INX
  786. INY ;$00903A
  787. INY ;$00903B
  788. INY ;$00903C
  789. INY ;$00903D
  790. CPY #$18 ;$00903E
  791. BNE CODE_009012 ;$009040
  792. SEP #$20 ;$009042
  793. RTS ;$009044
  794.  
  795. DATA_008FFA:
  796. db $01,$00
  797.  
  798. DATA_008FFC:
  799. db $A0,$86,$00,$00,$10,$27,$00,$00
  800. db $E8,$03,$00,$00,$64,$00,$00,$00
  801. db $0A,$00,$00,$00,$01,$00
  802.  
  803. ;========================
  804. ; Other misc. routines
  805. ;========================
  806.  
  807. ; Looks for the next free sprite slot in $0200-$03FC
  808. ; (16-bit X)
  809.  
  810. findSlot:
  811. - CPX #$0200
  812. BEQ .break
  813. LDA $0201|!addr,x
  814. CMP #$F0
  815. BEQ .break
  816. INX #4
  817. BRA -
  818. .break
  819. RTS
  820.  
  821. ; Finds n free slots
  822. ; Entry: $00 for number of slots (16 bit)
  823. ; (returns from the "calling" graphics routine if less than n found)
  824.  
  825. findFreeSlots:
  826. PHY : LDY #$0000
  827. LDX #$0020
  828. .loop
  829. CPX #$0200
  830. BEQ .notEnoughFound
  831.  
  832. LDA $0201|!addr,x
  833. CMP #$F0
  834. BNE .notFree
  835. INY
  836. CPY.w $00|!dp
  837. BEQ .enoughFound
  838. .notFree
  839. INX #4
  840. BRA .loop
  841. .notEnoughFound
  842. PLY
  843. PLA
  844. PLA
  845. RTS
  846. .enoughFound
  847. PLY
  848. RTS
  849.  
  850. ; Sets OAM info in $0420+
  851. ; Entry: $00 with the size (#$00 is 8x8, #$02 is 16x16)
  852.  
  853. setOAMInfo:
  854. PHX
  855. LDA $0200|!addr,x
  856. REP #$20
  857. TXA : LSR #2 : TAX
  858. SEP #$20
  859. LDA $00
  860. .store
  861. STA $0420|!addr,x
  862. PLX
  863. RTS
  864.  
  865.  
  866. ; Converts Hex to decimal (16 bit indexes)
  867. ; Entry: A with the number
  868.  
  869. hexToDec:
  870. LDY #$0000
  871. .loop
  872. CMP #$0A
  873. BCC .break
  874. SBC #$0A
  875. INY
  876. BRA .loop
  877. .break
  878. RTS
  879.  
  880. ;==============================================
  881. ; Install the Mario GFX DMA patch if necessary
  882. ;==============================================
  883.  
  884. if read1($00A300) != $5C
  885.  
  886. print " The Mario GFX DMAer patch has not been applied yet. Applying it now..."
  887.  
  888.  
  889. ; vvv CODE BELOW BY LADIDA vvv
  890.  
  891. !Tile = $0A ;Tile where the extended tiles will be loaded to. Takes up 2 8x8's
  892. ;located in SP1
  893.  
  894. if !sa1 == 1
  895.  
  896. org $00A300
  897. autoclean JML BEGINDMA
  898.  
  899.  
  900. org $00DF1A
  901. db $00,$00,$00,$00,$00,$00,$00,$00
  902. db $00,$00,$00,$00,$00,$00,$00,$00
  903. db $00,$00,$00,$00,$00,$00,$00,$00
  904. db $00,$00,$00,$00,$00,$00,$00,$00
  905. db $00,$00,$00,$00,$00,$00,$00,$00
  906. db $00,$00,$00,$00,$00,$00,$00,$00
  907. db $00,$00,$00,$00,$00,$00,$00,$00
  908. db $00,$00,$00,$00,$00
  909.  
  910. db $00,$00,$00,$00,$00,$00,$28,$00
  911. db $00
  912.  
  913. db $00,$00,$00,$00,$04,$04,$04,$00
  914. db $00,$00,$00,$00,$04,$00,$00,$00
  915. db $00,$04,$04,$04,$00,$00,$04,$04
  916. db $04,$04,$04,$04,$00,$00,$04,$00
  917. db $00,$00,$00,$04,$00,$00,$00,$00
  918. db $04,$00,$00,$00,$00,$00,$00,$00
  919. db $00,$00,$00,$00,$00,$00,$00,$00
  920. db $00,$00,$00,$00,$00
  921.  
  922. db $00,$00,$00,$00,$04,$04,$04,$00
  923. db $00,$00,$00,$00,$04,$00,$00,$00
  924. db $00,$04,$04,$04,$00,$00,$04,$04
  925. db $04,$04,$04,$04,$00,$00,$04,$00
  926. db $00,$00,$00,$04,$00,$00,$00,$00
  927. db $04,$00,$00,$00,$00,$00,$00,$00
  928. db $00,$00,$00,$00,$00,$00,$00,$00
  929. db $00,$00,$00,$00,$00
  930.  
  931. org $00DFDA
  932. db $00,$02,$80,$80 ;[00-03]
  933. db $00,$02,!Tile,!Tile+$1 ;[04-07]
  934. db $00,$00,$00,$00 ;[08-0B]
  935. db $00,$00,$00,$00 ;[0C-0F]
  936. db $00,$00,$00,$00 ;[10-13]
  937. db $00,$00,$00,$00 ;[14-17]
  938. db $00,$00,$00,$00 ;[18-1B]
  939. db $00,$00,$00,$00 ;[1C-1F]
  940. db $00,$00,$00,$00 ;[20-23]
  941. db $00,$00,$00,$00 ;[24-27]
  942. db $00,$02,$02,$80 ;[28-2B] Balloon Mario
  943. db $04 ;[2C] Cape
  944. db $7F ;[2D] Random Gliding tile
  945. db $4A,$5B,$4B,$5A ;[2E-31] Random Gliding frames
  946.  
  947.  
  948. freecode
  949.  
  950. BEGINDMA:
  951. PHB : PHK : PLB
  952. REP #$20
  953. LDX #$02
  954. LDY $6D84
  955. BEQ CODE_00A328
  956.  
  957. ;;
  958. ;Mario's Palette
  959. ;;
  960.  
  961. LDY #$86
  962. STY $2121
  963. LDA #$2200
  964. STA $4310
  965. LDA $6D82
  966. STA $4312
  967. LDY #$00
  968. STY $4314
  969. LDA #$0014
  970. STA $4315
  971. STX $420B
  972.  
  973. CODE_00A328:
  974. LDY #$80
  975. STY $2115
  976. LDA #$1801
  977. STA $4310
  978.  
  979. LDY $6100
  980. CPY #$14
  981. BEQ ContinUpload
  982. CPY #$07
  983. BEQ ContinUpload
  984. JMP StopUpload
  985.  
  986. ContinUpload:
  987. ;;
  988. ;Random Cape Tile
  989. ;;
  990.  
  991. LDA #$67F0
  992. STA $2116
  993. LDA $6D99
  994. STA $4312
  995. LDY #$7E
  996. STY $4314
  997. LDA #$0020
  998. STA $4315
  999. STX $420B
  1000.  
  1001. ;;
  1002. ;Mario's 8x8 tiles
  1003. ;;
  1004.  
  1005. LDA.w #!Tile<<4|$6000
  1006. STA $2116
  1007.  
  1008. LDA #$0040
  1009. STA $4315
  1010. SEP #$20
  1011. LDY $19
  1012. LDA $73E0
  1013. CLC : ADC DMAGFXtable,y
  1014. TAY
  1015. LDA DMAGFXbigtables,y
  1016. REP #$20
  1017. ASL #2
  1018. CLC : ADC.w #BEGINXTND
  1019. STA $4312
  1020. LDY.b #BEGINXTND>>16
  1021. STY $4314
  1022. STX $420B
  1023.  
  1024.  
  1025. StopUpload:
  1026. ;;
  1027. ;Mario's top tiles
  1028. ;;
  1029.  
  1030. LDA #$6000
  1031. STA $2116
  1032. LDX #$00
  1033. .loop
  1034. LDA $6D85,x
  1035. STA $4312
  1036. LDY #$7E
  1037. STY $4314
  1038. LDA #$0040
  1039. STA $4315
  1040. LDY #$02
  1041. STY $420B
  1042. INX #2
  1043. CPX $6D84
  1044. BCC .loop
  1045.  
  1046. ;;
  1047. ;Mario's bottom tiles
  1048. ;;
  1049.  
  1050. LDA #$6100
  1051. STA $2116
  1052. LDX #$00
  1053. .loop2
  1054. LDA $6D8F,x
  1055. STA $4312
  1056. LDY #$7E
  1057. STY $4314
  1058. LDA #$0040
  1059. STA $4315
  1060. LDY #$02
  1061. STY $420B
  1062. INX #2
  1063. CPX $6D84
  1064. BCC .loop2
  1065. SEP #$20
  1066.  
  1067. PLB
  1068. JML $00A38F
  1069.  
  1070.  
  1071. DMAGFXtable: ;Don't mess with this unless you know what you're doing
  1072. db $00,$46,$8C,$46
  1073.  
  1074. DMAGFXbigtables:
  1075. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1076. ;Basically, each tile takes up $20 bytes. Since we are uploading 2 tiles, it's $40 bytes
  1077. ;This table shows which frames use which tiles (The tiles are in ExtendGFX.bin)
  1078. ;
  1079. ;except in this table, each 8x8 tile is $08 bytes, so 2 of them are $10 bytes
  1080.  
  1081. ;Small Mario
  1082.  
  1083. db $00,$00,$00,$00,$00,$00,$00,$00 ;1
  1084. db $00,$00,$00,$00,$00,$00,$00,$00 ;2
  1085. db $00,$00,$00,$00,$00,$00,$00,$00 ;3
  1086. db $00,$00,$00,$00,$00,$00,$00,$00 ;4
  1087. db $00,$00,$00,$00,$00,$00,$00,$00 ;5
  1088. db $00,$00,$00,$00,$00,$00,$00,$00 ;6
  1089. db $00,$00,$00,$00,$00,$00,$00,$00 ;7
  1090. db $00,$00,$00,$00,$00 ;8
  1091. db $00,$00,$00,$00,$00,$00,$00,$00 ;9
  1092. db $00 ;10
  1093.  
  1094. ;Big/Fire Mario:
  1095.  
  1096. db $00,$00,$00,$00,$10,$10,$10,$00 ;1
  1097. db $00,$00,$00,$00,$20,$00,$00,$00 ;2
  1098. db $00,$30,$30,$30,$00,$00,$40,$40 ;3
  1099. db $50,$50,$60,$60,$00,$00,$80,$00 ;4
  1100. db $00,$00,000,$70,$00,$00,$00,$00 ;5
  1101. db $90,$00,$00,$00,$00,$00,$00,$00 ;6
  1102. db $00,$00,$00,$00,$00,$00,$00,$00 ;7
  1103. db $00,$00,$00,$00,$00 ;8
  1104. db $00,$00,$00,$00,$00,$00,$00,$00 ;9
  1105. db $00 ;10
  1106.  
  1107. ;Cape Mario:
  1108.  
  1109. db $00,$00,$00,$00,$10,$10,$10,$00 ;1
  1110. db $00,$00,$00,$00,$20,$00,$00,$00 ;2
  1111. db $00,$30,$30,$30,$00,$00,$40,$40 ;3
  1112. db $50,$50,$60,$60,$00,$00,$80,$00 ;4
  1113. db $00,$00,000,$70,$00,$00,$00,$00 ;5
  1114. db $90,$00,$00,$00,$00,$00,$00,$00 ;6
  1115. db $00,$00,$00,$00,$00,$00,$00,$00 ;7
  1116. db $00,$00,$00,$00,$00 ;8
  1117. db $00,$00,$00,$00,$00,$00,$00,$00 ;9
  1118. db $00 ;10
  1119.  
  1120. BEGINXTND:
  1121. incbin extendgfx.bin
  1122.  
  1123. else
  1124.  
  1125. org $00A300
  1126. autoclean JML BEGINDMA
  1127.  
  1128. org $00F691
  1129. ADC #BEGINXTND
  1130.  
  1131. org $00E1D4+$2B
  1132. db $00,$8C,$14,$14,$2E
  1133. db $00,$CA,$16,$16,$2E
  1134. db $00,$8E,$18,$18,$2E
  1135. db $00,$EB,$1A,$1A,$2E
  1136. db $04,$ED,$1C,$1C
  1137.  
  1138. org $00DF1A
  1139. db $00,$00,$00,$00,$00,$00,$00,$00
  1140. db $00,$00,$00,$00,$00,$00,$00,$00
  1141. db $00,$00,$00,$00,$00,$00,$00,$00
  1142. db $00,$00,$00,$00,$00,$00,$00,$00
  1143. db $00,$00,$00,$00,$00,$00,$00,$00
  1144. db $00,$00,$00,$00,$00,$00,$00,$00
  1145. db $00,$00,$00,$00,$00,$00,$00,$00
  1146. db $00,$00,$00,$00,$00
  1147.  
  1148. db $00,$00,$00,$00,$00,$00,$28,$00
  1149. db $00
  1150.  
  1151. db $00,$00,$00,$00,$82,$82,$82,$00
  1152. db $00,$00,$00,$00,$84,$00,$00,$00
  1153. db $00,$86,$86,$86,$00,$00,$88,$88
  1154. db $8A,$8A,$8C,$8C,$00,$00,$90,$00
  1155. db $00,$00,$00,$8E,$00,$00,$00,$00
  1156. db $92,$00,$00,$00,$00,$00,$00,$00
  1157. db $00,$00,$00,$00,$00,$00,$00,$00
  1158. db $00,$00,$00,$00,$00
  1159.  
  1160. db $00,$00,$00,$00,$82,$82,$82,$00
  1161. db $00,$00,$00,$00,$84,$00,$00,$00
  1162. db $00,$86,$86,$86,$00,$00,$88,$88
  1163. db $8A,$8A,$8C,$8C,$00,$00,$90,$00
  1164. db $00,$00,$00,$8E,$00,$00,$00,$00
  1165. db $92,$00,$00,$00,$00,$00,$00,$00
  1166. db $00,$00,$00,$00,$00,$00,$00,$00
  1167. db $00,$00,$00,$00,$00
  1168.  
  1169. org $00E3B1
  1170. JSR chartilehijack
  1171.  
  1172. org $00E40D
  1173. JSR capetilehijack
  1174.  
  1175. org $00DFDA
  1176. db $00,$02,$80,$80 ;[00-03]
  1177. db $00,$02,!Tile,!Tile+$1 ;[04-07]
  1178. chartilehijack:
  1179. LDA $DF1A,y
  1180. BPL +
  1181. AND #$7F
  1182. STA $0D
  1183. LDA #$04
  1184. + RTS
  1185. capetilehijack:
  1186. LDA $0D
  1187. CPX #$2B
  1188. BCC +
  1189. CPX #$40
  1190. BCS +
  1191. LDA $E1D7,x
  1192. + RTS
  1193.  
  1194. db $FF,$FF ;[22-23]
  1195. db $FF,$FF,$FF,$FF ;[24-27]
  1196. db $00,$02,$02,$80 ;[28-2B] Balloon Mario
  1197. db $04 ;[2C] Cape
  1198. db !Tile,!Tile+$1 ;[2D-2E] Random Gliding tiles
  1199. db $FF,$FF,$FF ;[2F-31]
  1200.  
  1201. freedata
  1202.  
  1203. BEGINDMA:
  1204. REP #$20
  1205. LDX #$02
  1206. LDY $0D84
  1207. BNE +
  1208. JMP .skipall
  1209. +
  1210.  
  1211. ;;
  1212. ;Mario's Palette
  1213. ;;
  1214.  
  1215. LDY #$86
  1216. STY $2121
  1217. LDA #$2200
  1218. STA $4310
  1219. TAY
  1220. LDA $0D82
  1221. STA $4312
  1222. STY $4314
  1223. LDA #$0014
  1224. STA $4315
  1225. STX $420B
  1226.  
  1227. LDY #$80
  1228. STY $2115
  1229. LDA #$1801
  1230. STA $4310
  1231. LDY #$7E
  1232. STY $4314
  1233.  
  1234. ;;
  1235. ;Misc top tiles (mario, cape, yoshi, podoboo)
  1236. ;;
  1237.  
  1238. LDA #$6000
  1239. STA $2116
  1240. TAY
  1241. -
  1242. LDA $0D85,y
  1243. STA $4312
  1244. LDA #$0040
  1245. STA $4315
  1246. STX $420B
  1247. INY #2
  1248. CPY $0D84
  1249. BCC -
  1250.  
  1251. ;;
  1252. ;Misc bottom tiles (mario, cape, yoshi, podoboo)
  1253. ;;
  1254.  
  1255. LDA #$6100
  1256. STA $2116
  1257. TAY
  1258. -
  1259. LDA $0D8F,y
  1260. STA $4312
  1261. LDA #$0040
  1262. STA $4315
  1263. STX $420B
  1264. INY #2
  1265. CPY $0D84
  1266. BCC -
  1267.  
  1268. ;;
  1269. ;Mario's 8x8 tiles
  1270. ;;
  1271.  
  1272. LDY $0D9B
  1273. CPY #$02
  1274. BEQ .skipall
  1275.  
  1276. LDA #!Tile<<4|$6000
  1277. STA $2116
  1278. LDA $0D99
  1279. STA $4312
  1280. LDY #BEGINXTND>>16
  1281. STY $4314
  1282. LDA #$0040
  1283. STA $4315
  1284. STX $420B
  1285.  
  1286. .skipall
  1287. SEP #$20
  1288. JML $00A38F
  1289.  
  1290.  
  1291. BEGINXTND:
  1292. incbin extendgfx.bin
  1293.  
  1294. endif
  1295.  
  1296. print " ",bytes," bytes used by the DMAer patch."
  1297.  
  1298. endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement