Advertisement
Romano338

Mikeyk's Bowser

Oct 4th, 2018
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.12 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Bowser, by mikeyk
  3. ;;
  4. ;; Description: SMB1 style
  5. ;;
  6. ;; Uses first extra bit: YES
  7. ;; If the first extra bit is set, Bowser will throw hammers
  8. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  9.  
  10. !JUMP_TIMER = $163E
  11. !HAMMER_TIMER = $15AC
  12. !FIRE_TIMER = $1528
  13. !DIR_TIMER = $1540
  14. !SPRITE_DIR = $157C
  15. !SPRITE_IMG = $1602
  16. !SPRITE_STATUS = $14C8
  17. !SPRITE_STATE = $151C
  18.  
  19. !EXTRA_BITS = $7FAB10
  20. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. ; init JSL
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23.  
  24. PRINT "INIT ",pc
  25. JSR SUB_GET_DIR
  26. TYA
  27. STA !SPRITE_DIR,x
  28.  
  29. STZ !SPRITE_IMG,x
  30.  
  31. LDA !EXTRA_BITS,x
  32. AND #$04
  33. BEQ NO_SET_TIME
  34. LDA #$48
  35. STA !HAMMER_TIMER,x
  36. NO_SET_TIME:
  37. TXA
  38. AND #$03
  39. ASL A
  40. ASL A
  41. ASL A
  42. ASL A
  43. PHA
  44. ASL A
  45. ADC #$4
  46. STA !FIRE_TIMER,x
  47.  
  48. PLA
  49. ADC #$00
  50. STA !JUMP_TIMER,x
  51.  
  52. RTL
  53.  
  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  55. ; main sprite JSL
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57.  
  58. PRINT "MAIN ",pc
  59. HAMMER_BRO_JSL: PHB ; \
  60. PHK ; | main sprite function, just calls local subroutine
  61. PLB ; |
  62. JSR DECREMENTTIMERS
  63. JSR START_HB_CODE ; |
  64. PLB ; |
  65. RTL ; /
  66.  
  67. DECREMENTTIMERS:
  68. LDA $14C8,x
  69. CMP #$08
  70. BNE DONEDEC
  71. LDA $9D
  72. BNE DONEDEC
  73. LDA !FIRE_TIMER,x
  74. BEQ DONEDEC
  75. DEC !FIRE_TIMER,x
  76. DONEDEC:
  77. RTS
  78. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  79. ; main sprite routine
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81.  
  82.  
  83. !TIME_TO_LOCK = $28
  84. !TIME_TO_JUMP = $88
  85. !TIME_TO_SHOW = $12 ;time to display the boomerang before it is thrown
  86.  
  87. X_SPEED: db $00,$FA,$00,$06 ;rest at bottom, moving up, rest at top, moving down
  88. TIME_IN_POS: db $78,$14,$74,$14 ;moving up, rest at top, moving down, rest at bottom
  89. TIME_TILL_THROW: db $78,$A8
  90. TIME_TILL_HAMMER: db $0C,$0C,$0C,$0C,$0C,$43,$0C,$0C
  91. db $0C,$0C,$0C,$0C,$73,$0C,$0C,$0C
  92. db $0C,$0C,$63,$0C,$0C,$0C,$0C,$0C
  93. db $0C,$83,$0C,$0C,$0C,$0C,$0C,$53
  94.  
  95. STAR: INC !HAMMER_TIMER,x
  96. RETURN: RTS
  97. START_HB_CODE: JSR SUB_GFX ; draw sprite gfx
  98. LDA !SPRITE_STATUS,x ; \ if sprite status != 8...
  99. CMP #$02 ; } ... not (killed with spin jump [4] or STAR[2])
  100. BEQ STAR
  101. CMP #$08
  102. BNE RETURN ; / ... RETURN
  103. LDA $9D ; \ if sprites locked...
  104. BNE RETURN ; / ... RETURN
  105.  
  106. JSR SUB_GET_DIR ; \ always face mario
  107. TYA ; |
  108. STA !SPRITE_DIR,x ; /
  109.  
  110.  
  111. JSR SUB_OFF_SCREEN_X3 ; only process sprite while on screen
  112. INC $1570,x ; increment number of frames sprite has been on screen
  113.  
  114. LDA $1570,x ; \ calculate which frame to show:
  115. LSR A ; |
  116. LSR A ; |
  117. LSR A ; |
  118. LSR A ; |
  119. AND #$01 ; | update every 16 cycles if normal
  120. STA !SPRITE_IMG,x ; / write frame to show
  121.  
  122. LDA !FIRE_TIMER,x ; \ if time until spit >= $10
  123. CMP #!TIME_TO_SHOW ; | just go to normal walking code
  124. BCS TRY_HAMMER ; /
  125. INC !SPRITE_IMG,x
  126. INC !SPRITE_IMG,x
  127.  
  128. LDA !FIRE_TIMER,x ; throw fire if it's time
  129. BNE NO_RESET
  130. LDY $C2,x
  131. LDA TIME_TILL_THROW,y
  132. STA !FIRE_TIMER,x
  133. NO_RESET: CMP #$01
  134. BNE TRY_HAMMER
  135. LDA $C2,x
  136. EOR #$01
  137. STA $C2,x
  138. JSR SUB_FIRE_THROW
  139.  
  140. TRY_HAMMER: LDA !EXTRA_BITS,x ; only throw hammers if first extra bit is set
  141. AND #$04
  142. BEQ JUMP_SPRITE
  143. LDA !HAMMER_TIMER,x ; throw hammer if it's time
  144. BNE NO_RESET2
  145. LDA $1504,x
  146. TAY
  147. LDA TIME_TILL_HAMMER,y
  148. STA !HAMMER_TIMER,x
  149. NO_RESET2: CMP #$01
  150. BNE JUMP_SPRITE
  151. LDA $1504,x
  152. INC A
  153. AND #$1F
  154. STA $1504,x
  155. JSR SUB_HAMMER_THROW
  156.  
  157. JUMP_SPRITE: LDA !JUMP_TIMER,x
  158. CMP #$40 ; | just go to normal walking code
  159. BCS WALK_SPRITE ; /
  160. LDA !SPRITE_IMG,x ; \ lock image while jumping
  161. ORA #$01 ; |
  162. STA !SPRITE_IMG,x ; /
  163. INC !DIR_TIMER,x ; we didn't move the sprite this frame, so we don't want a decrement
  164. STZ $B6,x ; stop sprite from moving
  165. LDA !JUMP_TIMER,x
  166. CMP #$38
  167. BNE NO_JUMP2
  168. LDA #$B0 ; \ y speed
  169. STA $AA,x ; /
  170. BRA APPLY_SPEED
  171. NO_JUMP2: CMP #$00
  172. BNE APPLY_SPEED
  173. LDA #!TIME_TO_JUMP
  174. STA !JUMP_TIMER,x
  175.  
  176. BRA APPLY_SPEED
  177.  
  178. WALK_SPRITE: LDA $151C,x ;
  179. TAY ;
  180. LDA !DIR_TIMER,x ;
  181. BEQ CHANGE_SPEED ;
  182. LDA X_SPEED,y ; | set y speed
  183. STA $B6,x ; /
  184. BRA APPLY_SPEED
  185.  
  186. CHANGE_SPEED: LDA TIME_IN_POS,y ;A:0001 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZCHC:0654 VC:057 00 FL:24235
  187. STA !DIR_TIMER,x ;A:0020 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdizCHC:0686 VC:057 00 FL:24235
  188. LDA $151C,x
  189. INC A
  190. AND #$03
  191. STA $151C,x
  192.  
  193. APPLY_SPEED: JSL $01802A ; update position based on speed values
  194.  
  195. CHECK_TOUCH: LDA $1588,x ; \ if sprite is touching the side of an object...
  196. AND #$03 ; |
  197. BEQ DONT_CHANGE_DIR ; |
  198. LDA $151C,x
  199. INC A
  200. AND #$03
  201. STA $151C,x
  202.  
  203. DONT_CHANGE_DIR: JSL $018032 ; interact with other sprites
  204. JSL $01A7DC ; check for mario/sprite contact
  205.  
  206. NO_CONTACT: RTS ; RETURN
  207.  
  208.  
  209.  
  210. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  211. ; fire routine
  212. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  213.  
  214. XF_OFFSET: db $13,$FC
  215. XF_OFFSET2: db $00,$FF
  216.  
  217. RETURN68: RTS
  218. SUB_FIRE_THROW: ;LDA $15A0,x ; no fire if off screen
  219. LDA $186C,x
  220. ORA $15D0,x
  221. BNE RETURN68
  222.  
  223. JSL $02A9DE ; \ get an index to an unused sprite slot, RETURN if all slots full
  224. BMI RETURN68 ; / after: Y has index of sprite being generated
  225.  
  226. LDA #$01 ; \ set sprite status for new sprite
  227. STA !SPRITE_STATUS,y ; /
  228.  
  229. LDA #$B3
  230. STA $009E,y
  231.  
  232. PHY ; set x position for new sprite
  233. LDA !SPRITE_DIR,x
  234. TAY
  235. LDA $E4,x
  236. CLC
  237. ADC XF_OFFSET,y
  238. PLY
  239. STA $00E4,y
  240.  
  241. PHY ; set x position for new sprite
  242. LDA !SPRITE_DIR,x
  243. TAY
  244. LDA $14E0,x
  245. ADC XF_OFFSET2,y
  246. PLY
  247. STA $14E0,y
  248.  
  249. LDA $D8,x ; \ set y position for new sprite
  250. SEC ; | (y position of generator - 1)
  251. SBC #$03 ; |
  252. STA $00D8,y ; |
  253. LDA $14D4,x ; |
  254. SBC #$00 ; |
  255. STA $14D4,y ; /
  256.  
  257. PHX ; \ before: X must have index of sprite being generated
  258. TYX ; | routine clears *all* old sprite values...
  259. JSL $07F7D2 ; | ...and loads in new values for the 6 main sprite tables
  260. PLX ; /
  261.  
  262. LDA #$17
  263. STA $1DFC
  264.  
  265. RETURN67: RTS ; RETURN
  266.  
  267.  
  268.  
  269. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  270. ; hammer routine
  271. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  272.  
  273. X_OFFSET: db $02,$0C
  274. X_OFFSET2: db $00,$00
  275. X_SPEED_HAMMER: db $12,$EE
  276.  
  277. SUB_HAMMER_THROW: LDY #$E8 ;A:0218 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0522 VC:104 00 FL:19452
  278. LDA !SPRITE_DIR,x ;A:0218 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:0538 VC:104 00 FL:19452
  279. BNE LABEL9 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0570 VC:104 00 FL:19452
  280. LDY #$18 ;A:0200 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0210 VC:098 00 FL:21239
  281. LABEL9: STY $00 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0592 VC:104 00 FL:19452
  282. LDY #$07 ;A:0201 X:0009 Y:00E8 D:0000 DB:03 S:01E8 P:envMXdizcHC:0616 VC:104 00 FL:19452
  283. LABEL8: LDA $170B,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0632 VC:104 00 FL:19452
  284. BEQ LABEL7 ;A:0200 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0664 VC:104 00 FL:19452
  285. DEY ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0088 VC:103 00 FL:19638
  286. BPL LABEL8 ;A:0204 X:0009 Y:0006 D:0000 DB:03 S:01E8 P:envMXdizcHC:0102 VC:103 00 FL:19638
  287. RTS ;
  288. LABEL7: LDA #$04 ;A:0200 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdiZcHC:0686 VC:104 00 FL:19452
  289. STA $170B,y ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0702 VC:104 00 FL:19452
  290.  
  291. PHY
  292. LDA !SPRITE_DIR,x
  293. TAY
  294. LDA $E4,x ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0734 VC:104 00 FL:19452
  295. CLC
  296. ADC X_OFFSET,y
  297. PLY
  298. STA $171F,y ;A:02C9 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:0764 VC:104 00 FL:19452
  299.  
  300. PHY
  301. LDA !SPRITE_DIR,x
  302. TAY
  303. LDA $14E0,x ; |
  304. ADC X_OFFSET2,y
  305. PLY
  306. STA $1733,y ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0828 VC:104 00 FL:19452
  307.  
  308. LDA $D8,x ;A:0204 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0860 VC:104 00 FL:19452
  309. CLC
  310. ADC #$F0
  311. STA $1715,y ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0890 VC:104 00 FL:19452
  312. LDA $14D4,x ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0922 VC:104 00 FL:19452
  313. ADC #$FF
  314. STA $1729,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0954 VC:104 00 FL:19452
  315.  
  316. LDA #$D0 ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:0986 VC:104 00 FL:19452
  317. STA $173D,y ;A:02C8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1002 VC:104 00 FL:19452
  318. PHY
  319. LDA !SPRITE_DIR,x
  320. TAY
  321. LDA X_SPEED_HAMMER,y
  322. ;LDA #$F0 ;A:02C8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1034 VC:104 00 FL:19452
  323. PLY
  324. STA $1747,y ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1058 VC:104 00 FL:19452
  325. BRA LABEL10 ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1090 VC:104 00 FL:19452
  326. LABEL6: RTS ;A:0101 X:0009 Y:0009 D:0000 DB:03 S:01E8 P:envMXdizcHC:0248 VC:086 00 FL:19396
  327. LABEL10: LDA $1715,y ;A:02E8 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:eNvMXdizcHC:1112 VC:104 00 FL:19452
  328. ADC #$F7 ;A:0270 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizcHC:1144 VC:104 00 FL:19452
  329. STA $1715,y ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1160 VC:104 00 FL:19452
  330. BCC LABEL11 ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1192 VC:104 00 FL:19452
  331. LDA $1729,y ;A:0267 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1208 VC:104 00 FL:19452
  332. ADC #$FF ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1240 VC:104 00 FL:19452
  333. STA $1729,y ;A:0201 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1256 VC:104 00 FL:19452
  334. LABEL11: RTS ;A:0220 X:0009 Y:0007 D:0000 DB:03 S:01E8 P:envMXdizCHC:1336 VC:104 00 FL:19452
  335.  
  336.  
  337.  
  338. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  339. ; graphics routine
  340. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  341.  
  342. TILEMAP: db $00,$02,$27,$29,$00,$06,$4C,$4E,$04,$02,$27,$29,$04,$06,$4C,$4E
  343. db $00,$02,$27,$29,$00,$06,$4C,$4E,$04,$02,$27,$29,$04,$06,$4C,$4E
  344. HORIZ_DISP: db $00,$10,$00,$10,$00,$10,$00,$10,$00,$10,$00,$10,$00,$10,$00,$10
  345. db $10,$00,$10,$00,$10,$00,$10,$00,$10,$00,$10,$00,$10,$00,$10,$00
  346. VERT_DISP: db $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
  347. db $F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00,$F0,$F0,$00,$00
  348. PROPERTIES: db $40,$00 ;xyppccct format
  349.  
  350. !HAMMER_TILE = $6D
  351.  
  352.  
  353. SUB_GFX: JSR GET_DRAW_INFO ; after: Y = index to sprite tile map ($300)
  354. ; $00 = sprite x position relative to screen boarder
  355. ; $01 = sprite y position relative to screen boarder
  356. LDA !SPRITE_IMG,x ; \
  357. ASL A ; | $03 = index to frame start (frame to show * 2 tile per frame)
  358. ASL A
  359. STA $03 ; /
  360. LDA !SPRITE_DIR,x ; \ $02 = sprite direction
  361. STA $02 ; /
  362. BNE NO_ADD
  363. LDA $03
  364. CLC
  365. ADC #$10
  366. STA $03
  367. NO_ADD: PHX ; push sprite index
  368.  
  369. LDX #$03 ; loop counter = (number of tiles per frame) - 1
  370. LOOP_START: PHX ; push current tile number
  371. TXA ; \ X = index to horizontal displacement
  372. ORA $03 ; / get index of tile (index to first tile of frame + current tile number)
  373. FACING_LEFT: TAX ; \
  374.  
  375. LDA $00 ; \ tile x position = sprite x location ($00)
  376. CLC ; |
  377. ADC HORIZ_DISP,x ; |
  378. STA $0300,y ; /
  379.  
  380. LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
  381. CLC ; |
  382. ADC VERT_DISP,x ; |
  383. STA $0301,y ; /
  384.  
  385. LDA TILEMAP,x ; \ store tile
  386. STA $0302,y ; /
  387.  
  388. LDX $02 ; \
  389. LDA PROPERTIES,x ; | get tile PROPERTIES using sprite direction
  390. LDX $15E9 ; |
  391. ORA $15F6,x ; | get palette info
  392. ORA $64 ; | put in level PROPERTIES
  393. STA $0303,y ; / store tile PROPERTIES
  394.  
  395. PLX ; \ pull, X = current tile of the frame we're drawing
  396. INY ; | increase index to sprite tile map ($300)...
  397. INY ; | ...we wrote 1 16x16 tile...
  398. INY ; | ...sprite OAM is 8x8...
  399. INY ; | ...so increment 4 times
  400. DEX ; | go to next tile of frame and loop
  401. BPL LOOP_START ; /
  402.  
  403. PLX ; pull, X = sprite index
  404.  
  405. LDA !HAMMER_TIMER,x
  406. CMP #$02
  407. BCC NO_SHOW_HAMMER
  408. CMP #30
  409. BCS NO_SHOW_HAMMER
  410. LDA !SPRITE_IMG,x
  411. CMP #$00
  412. BCS SHOW_HAMMER_TOO
  413.  
  414. NO_SHOW_HAMMER: LDY #$02 ; \ 02, because we didn't write to 460 yet
  415. LDA #$03 ; | A = number of tiles drawn - 1
  416. JSL $01B7B3 ; / don't draw if offscreen
  417. RTS ; RETURN
  418.  
  419. SHOW_HAMMER_TOO: PHX
  420.  
  421. LDA $00
  422. LDX $02
  423. CLC
  424. ADC X_OFFSET,x
  425. STA $0300,y
  426.  
  427. LDA $01 ; \ tile y position = sprite y location ($01) + tile displacement
  428. CLC ; |
  429. ADC #$E8
  430. STA $0301,y ; /
  431.  
  432. LDA #!HAMMER_TILE ; \ store tile
  433. STA $0302,y ; /
  434.  
  435. LDA #$07
  436. CPX #$00
  437. BNE NO_FLIP_HAMMER
  438. ORA #$40
  439. NO_FLIP_HAMMER: ORA $64 ; | put in level PROPERTIES
  440. STA $0303,y ; / store tile PROPERTIES
  441.  
  442. PLX
  443. INY ; | increase index to sprite tile map ($300)...
  444. INY ; | ...we wrote 1 16x16 tile...
  445. INY ; | ...sprite OAM is 8x8...
  446. INY ; | ...so increment 4 times
  447.  
  448. LDY #$02 ; \ 02, because we didn't write to 460 yet
  449. LDA #$04 ; | A = number of tiles drawn - 1
  450. JSL $01B7B3 ; / don't draw if offscreen
  451. RTS ; RETURN
  452.  
  453. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  454. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  455. ; routines below can be shared by all sprites. they are ripped from original
  456. ; SMW and poorly documented
  457. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  458. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  459.  
  460. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  461. ; $B760 - graphics routine helper - shared
  462. ; sets off screen flags and sets index to OAM
  463. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  464.  
  465. ;org $03B75C
  466.  
  467. TABLE1: db $0C,$1C
  468. TABLE2: db $01,$02
  469.  
  470. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  471. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  472. LDA $E4,x ; \
  473. CMP $1A ; | set horizontal offscreen if necessary
  474. LDA $14E0,x ; |
  475. SBC $1B ; |
  476. BEQ ON_SCREEN_X ; |
  477. INC $15A0,x ; /
  478.  
  479. ON_SCREEN_X: LDA $14E0,x ; \
  480. XBA ; |
  481. LDA $E4,x ; |
  482. REP #$20 ; |
  483. SEC ; |
  484. SBC $1A ; | mark sprite INVALID if far enough off screen
  485. CLC ; |
  486. ADC.w #$0040 ; |
  487. CMP.w #$0180 ; |
  488. SEP #$20 ; |
  489. ROL A ; |
  490. AND #$01 ; |
  491. STA $15C4,x ; /
  492. BNE INVALID ;
  493.  
  494. LDY #$00 ; \ set up loop:
  495. LDA $1662,x ; |
  496. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  497. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  498. INY ; /
  499. ON_SCREEN_LOOP: LDA $D8,x ; \
  500. CLC ; | set vertical offscreen if necessary
  501. ADC TABLE1,y ; |
  502. PHP ; |
  503. CMP $1C ; | (vert screen boundry)
  504. ROL $00 ; |
  505. PLP ; |
  506. LDA $14D4,x ; |
  507. ADC #$00 ; |
  508. LSR $00 ; |
  509. SBC $1D ; |
  510. BEQ ON_SCREEN_Y ; |
  511. LDA $186C,x ; | (vert offscreen)
  512. ORA TABLE2,y ; |
  513. STA $186C,x ; |
  514. ON_SCREEN_Y: DEY ; |
  515. BPL ON_SCREEN_LOOP ; /
  516.  
  517. LDY $15EA,x ; get offset to sprite OAM
  518. LDA $E4,x ; \
  519. SEC ; |
  520. SBC $1A ; | $00 = sprite x position relative to screen boarder
  521. STA $00 ; /
  522. LDA $D8,x ; \
  523. SEC ; |
  524. SBC $1C ; | $01 = sprite y position relative to screen boarder
  525. STA $01 ; /
  526. RTS ; RETURN
  527.  
  528. INVALID: PLA ; \ RETURN from *main gfx routine* subroutine...
  529. PLA ; | ...(not just this subroutine)
  530. RTS ; /
  531.  
  532. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  533. ; $B817 - horizontal mario/sprite check - shared
  534. ; Y = 1 if mario left of sprite??
  535. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  536.  
  537. ;org $03B817 ; Y = 1 if contact
  538.  
  539. SUB_GET_DIR: LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
  540. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  541. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  542. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  543. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  544. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  545. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  546. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  547. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  548. LABEL16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  549.  
  550.  
  551. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  552. ; $B85D - off screen processing code - shared
  553. ; sprites enter at different points
  554. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  555.  
  556. ;org $03B83B
  557.  
  558. TABLE3: db $40,$B0
  559. TABLE6: db $01,$FF
  560. TABLE4: db $30,$C0,$A0,$80,$A0,$40,$60,$B0
  561. TABLE5: db $01,$FF,$01,$FF,$01,$00,$01,$FF
  562.  
  563. SUB_OFF_SCREEN_X0: LDA #$06 ; \ entry point of routine determines value of $03
  564. BRA STORE_03 ; |
  565. SUB_OFF_SCREEN_X1: LDA #$04 ; |
  566. BRA STORE_03 ; |
  567. SUB_OFF_SCREEN_X2: LDA #$02 ; |
  568. STORE_03: STA $03 ; |
  569. BRA START_SUB ; |
  570. SUB_OFF_SCREEN_X3: STZ $03 ; /
  571.  
  572. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, RETURN
  573. BEQ RETURN_2 ; /
  574. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  575. AND #$01 ; |
  576. BNE VERTICAL_LEVEL ; /
  577. LDA $D8,x ; \
  578. CLC ; |
  579. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  580. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  581. ADC #$00 ; |
  582. CMP #$02 ; |
  583. BPL ERASE_SPRITE ; / ...erase the sprite
  584. LDA $167A,x ; \ if "process offscreen" flag is set, RETURN
  585. AND #$04 ; |
  586. BNE RETURN_2 ; /
  587. LDA $13 ; \
  588. AND #$01 ; |
  589. ORA $03 ; |
  590. STA $01 ; |
  591. TAY ; /
  592. LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
  593. CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
  594. ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
  595. ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
  596. 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
  597. PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
  598. 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
  599. LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
  600. ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
  601. PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
  602. 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
  603. STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
  604. LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
  605. BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
  606. EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
  607. STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
  608. LABEL20: LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
  609. BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
  610. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  611. CMP #$08 ; |
  612. BCC KILL_SPRITE ; /
  613. LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
  614. CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
  615. BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
  616. 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
  617. STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
  618. KILL_SPRITE: STZ $14C8,x ; erase sprite
  619. RETURN_2: RTS ; RETURN
  620.  
  621. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, RETURN
  622. AND #$04 ; |
  623. BNE RETURN_2 ; /
  624. LDA $13 ; \ only handle every other frame??
  625. LSR A ; |
  626. BCS RETURN_2 ; /
  627. AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
  628. STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
  629. TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
  630. LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
  631. CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
  632. ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
  633. ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
  634. CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
  635. PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
  636. LDA.w $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
  637. LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
  638. ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
  639. PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
  640. SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
  641. STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
  642. LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
  643. BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
  644. EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
  645. STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
  646. LABEL22: LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
  647. BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
  648. BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
  649.  
  650. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  651. ORA $186C,x ; |
  652. RTS ; / RETURN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement