Advertisement
Guest User

Custom Sprite

a guest
Apr 7th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.68 KB | None | 0 0
  1. ;~@sa1 <-- DO NOT REMOVE THIS LINE!
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;; Shy Guy, by mikeyk
  4. ;;
  5. ;; Description: A Shy Guy with many available configurations.
  6. ;; Naaaaah, it's a giant giant giant friendly mega mole!
  7. ;; NOTE that graphics are not made by me.
  8. ;; Use the provided patch.
  9. ;;
  10. ;; Note: When rideable, clipping tables values should be: 03 0A FE 0E
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ;; Uses first extra bit: NO
  13. ;;
  14. ;; Extra Property Byte 1
  15. ;; bit 0 - enable spin killing
  16. ;; bit 1 - stay on ledges
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18.  
  19. EXTRA_PROP_1 = $400057
  20. RAM_ADDRESS = $C2 ; !ramaddress of the patch
  21.  
  22. !RAM_CustSprClip = $6000 ; 22 bytes of free RAM used for the custom sprite clipping value
  23. !RAM_SprClipXDisp = $6099 ; 22 bytes of free RAM used for the X displacement of a custom sprite clipping field
  24. !RAM_SprClipYDisp = $60AF ; 22 bytes of free RAM used for the Y displacement of a custom sprite clipping field
  25. !RAM_SprClipWidth = $60C5 ; 22 bytes of free RAM used for the width of a custom sprite clipping field
  26. !RAM_SprClipHeight = $60DB ; 22 bytes of free RAM used for the height of a custom sprite clipping field
  27.  
  28.  
  29.  
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. ; sprite init JSL
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33.  
  34. print "INIT ", pc
  35. PHY
  36. JSR SUB_HORZ_POS
  37. TYA
  38. STA $3334,x
  39. PLY
  40. LDA $334A,x ; if on the ground, reset the turn counter
  41. ORA #$04
  42. STA $334A,x ; if on the ground, reset the turn counter
  43.  
  44.  
  45. LDA #$00 ; use index 0 of table of objectclipping patch, good object clipping values for this sprite is in it.
  46. STA RAM_ADDRESS,x
  47. LDA #$00
  48. STA !RAM_CustSprClip
  49.  
  50.  
  51. RTL
  52.  
  53.  
  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  55. ; sprite code JSL
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57.  
  58. print "MAIN ", pc
  59. PHB ; \
  60. PHK ; | main sprite function, just calls local subroutine
  61. PLB ; |
  62. JSR SPRITE_CODE_START ; |
  63. PLB ; |
  64. RTL ; /
  65.  
  66.  
  67. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  68. ; sprite main code
  69. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  70.  
  71. SPRITE_GRAVITY = $20
  72.  
  73.  
  74. X_SPEED: db $18,$E6
  75. KILLED_X_SPEED: db $F0,$10
  76.  
  77. RETURN1: RTS
  78.  
  79. SPRITE_CODE_START: LDA #$25
  80. STA $7DF9
  81. JSR SPRITE_GRAPHICS ; graphics routine
  82. JSR SUB_OFF_SCREEN_X3 ; handle off screen situation
  83. LDA $3242,x ; \
  84. CMP #$08 ; ; \ if sprites locked, return
  85. BNE RETURN1 ; /
  86. LDA $9D
  87. BNE RETURN1
  88.  
  89.  
  90. LDA $14
  91. AND #$35 ; how many frames to wait before checking Mario's direction (valid: 0,1,3,7,F,1F,3F,7F,FF)
  92. BNE .noTurn
  93.  
  94. %SubHorzPos()
  95. TYA
  96. STA !157C,x ;new direction
  97.  
  98.  
  99. .noTurn
  100. LDA $334A,x ; \ if sprite is in contact with an object...
  101. AND #$03 ; |
  102. BEQ NO_OBJ_CONTACT ; |
  103. LDA $3334,x ; | flip the direction status
  104. EOR #$01 ; |
  105. STA $3334,x ; /
  106.  
  107.  
  108. NO_OBJ_CONTACT: LDA EXTRA_PROP_1,x ; don't stay on ledges if bit is set
  109. AND #$02 ;
  110. BEQ FALLING ;
  111.  
  112. LDA $334A,x ; run the subroutine if the sprite is in the air...
  113. ORA $3284,x ; ...and not already turning
  114. BNE ON_GROUND ;
  115. JSR SUB_CHANGE_DIR ;
  116. LDA #$01 ; set that we're already turning
  117. STA $3284,x ;
  118.  
  119. ON_GROUND: LDA $334A,x ; if on the ground, reset the turn counter
  120. AND #$04
  121. BEQ IN_AIR
  122. STZ $3284,x
  123. STZ $9E,x
  124. BRA X_TIME
  125.  
  126. FALLING: LDA $334A,x ; if on the ground, reset the turn counter
  127. AND #$04
  128. BEQ IN_AIR
  129. LDA #$10 ; \ y speed = 10
  130. STA $9E,x ; /
  131.  
  132. X_TIME:
  133. LDY $3334,x ; \ set x speed based on direction
  134. LDA X_SPEED,y ; |
  135. STA $B6,x ; /
  136.  
  137. IN_AIR: JSL $01802A ; update position based on speed values
  138.  
  139. DONE_WITH_SPEED: JSL $018032 ; interact with sprites ; return if no contact
  140. JSL $01A7DC ; check for mario/sprite contact (carry set = contact)
  141. BCC RETURN_24B
  142. JSR SUB_VERT_POS ;
  143. LDA $0E ; \ if mario isn't above sprite, and there's vertical contact...
  144. CMP #$E6 ; | ... sprite wins
  145. BPL SPRITE_WINS ; /
  146. LDA $7D ; \if mario speed is upward, return
  147. BMI RETURN_24B ; /
  148. LDA EXTRA_PROP_1,x
  149. AND #$01
  150. BEQ SPIN_KILL_DISABLED ;
  151. LDA $740D ; \ if mario is spin jumping, goto SPIN_KILL
  152. BNE SPIN_KILL ; /
  153. SPIN_KILL_DISABLED:
  154. LDA #$01 ; \ set "on sprite" flag
  155. STA $7471 ; /
  156. LDA #$06 ; \ set riding sprite
  157. STA $32DC,x ; /
  158. STZ $7D ; y speed = 0
  159. LDA #$E1
  160. LDY $787A ; | mario's y position += E1 or D1 depending if on yoshi
  161. BEQ NO_YOSHI ; |
  162. LDA #$D1 ; |
  163. NO_YOSHI: CLC ; |
  164. ADC $3216,x ; |
  165. STA $96 ; |
  166. LDA $3258,x ; |
  167. ADC #$FF ; |
  168. STA $97 ; /
  169. LDY #$00 ; \
  170. LDA $7491 ; | $1491 == 01 or FF, depending on direction
  171. BPL LABEL9 ; | set mario's new x position
  172. DEY ; |
  173. LABEL9: CLC ; |
  174. ADC $94 ; |
  175. STA $94 ; |
  176. TYA ; |
  177. ADC $95 ; |
  178. STA $95 ; /
  179. RETURN_24B: RTS ;
  180.  
  181. SPRITE_WINS: LDA #$25
  182. STA $7DF9
  183. LDA $32DC,x ; \ if riding sprite...
  184. ORA $754C,x ; | ...or sprite being eaten...
  185. BNE RETURN ; / ...return
  186. LDA $7490 ; \ if mario star timer > 0, goto HAS_STAR
  187. BNE HAS_STAR ; / NOTE: branch to HAS_STAR to enable star killing
  188.  
  189. JSL $00F5B7 ; hurt mario>>>>>NOOOO!YOURE FRIENDLY!
  190.  
  191. RETURN_24: RTS
  192.  
  193. SPIN_KILL: JSR SUB_STOMP_PTS ; give mario points
  194. JSL $01AA33 ; set mario speed, NOTE: remove call to not bounce off sprite
  195. JSL $01AB99 ; display contact graphic
  196. LDA #$04 ; \ status = 4 (being killed by spin jump)
  197. STA $3242,x ; /
  198. LDA #$1F ; \ set spin jump animation timer
  199. STA $32C6,x ; /
  200. JSL $07FC3B ; show star animation
  201. LDA #$08 ; \ play sound effect
  202. STA $7DF9 ; /
  203. RTS ; return
  204. HAS_STAR: LDA #$02 ; \ status = 2 (being killed by star)
  205. STA $3242,x ; /
  206. LDA #$D0 ; \ set y speed
  207. STA $9E,x ; /
  208. JSR SUB_HORZ_POS ; get new direction
  209. LDA KILLED_X_SPEED,y ; \ set x speed based on direction
  210. STA $B6,x ; /
  211. INC $78D2 ; increment number consecutive enemies killed
  212. LDA $78D2 ; \
  213. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  214. BCC NO_RESET2 ; |
  215. LDA #$08 ; |
  216. STA $78D2 ; /
  217. NO_RESET2: JSL $02ACE5 ; give mario points
  218. LDY $78D2 ; \
  219. CPY #$08 ; | if consecutive enemies stomped < 8 ...
  220. BCS RETURN ; |
  221. LDA STAR_SOUNDS,y ; | ... play sound effect
  222. STA $7DF9 ; /
  223.  
  224.  
  225. RETURN: RTS ; final return
  226.  
  227.  
  228. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  229. ; sprite graphics routine
  230. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  231.  
  232.  
  233. ;===== TILE MAP AND X,Y DISPLACEMENT ======================================;
  234. ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;10 ;11 ;12 ;13 ;14 ;15 ;16
  235.  
  236. TILEMAP: db $80,$82,$84,$86,$A0,$A2,$A4,$A6,$C0,$C2,$C4,$C6,$E0,$E2,$E4,$E6 ;1st frame of animation
  237. db $88,$8A,$8C,$8E,$A8,$AA,$AC,$AE,$C8,$CA,$CC,$CE,$E8,$EA,$EC,$EE ;2nd frame of animation
  238. db $86,$84,$82,$80,$A6,$A4,$A2,$A0,$C6,$C4,$C2,$C0,$E6,$E4,$E2,$E0 ;1st frame of animation (reverse)
  239. db $8E,$8C,$8A,$88,$AE,$AC,$AA,$A8,$CE,$CC,$CA,$C8,$EE,$EC,$EA,$E8 ;2nd frame of animation (reverse)
  240.  
  241. XDISP: db $F3,$03,$13,$23,$F3,$03,$13,$23,$F3,$03,$13,$23,$F3,$03,$13,$23 ;1st frame of animation
  242.  
  243. YDISP: db $F8,$F8,$F8,$F8,$08,$08,$08,$08,$18,$18,$18,$18,$28,$28,$28,$28 ;1st frame of animation
  244.  
  245.  
  246.  
  247.  
  248. ;==========================================================================;
  249.  
  250. SPRITE_GRAPHICS:
  251.  
  252. JSR GET_DRAW_INFO
  253. LDA $13
  254.  
  255. LSR ;\ A
  256. AND #$04 ; | N
  257. ASL ; | I
  258. ASL ; | MATION
  259.  
  260. PHA
  261. LDA $3334,x
  262. STA $02
  263. BNE IHAS
  264. PLA
  265. CLC
  266. ADC #$20
  267. BRA PLOP
  268. IHAS:
  269. PLA
  270. PLOP:
  271. STA $03 ;/
  272.  
  273.  
  274.  
  275. LDX #$00 ;Reset OAM
  276.  
  277. OAM_Loop:
  278.  
  279.  
  280. LDA $00
  281. CLC
  282. ADC XDISP,x
  283. STA $6300,y ;Xpos
  284.  
  285.  
  286. LDA $01
  287. CLC
  288. ADC YDISP,x
  289. STA $6301,y ;Ypos
  290.  
  291.  
  292. PHX
  293. TXA
  294. CLC
  295. ADC $03
  296. TAX
  297. LDA TILEMAP,x
  298. STA $6302,y
  299.  
  300. LDX $75E9 ;
  301. LDA $33B8,x ; get palette info
  302.  
  303. LDX $02
  304. BNE CHEEZBURGR
  305. ORA #$40
  306. CHEEZBURGR:
  307. PLX
  308. ORA $64
  309. STA $6303,y ;Properties
  310.  
  311. INY
  312. INY
  313. INY
  314. INY
  315.  
  316. INX
  317. CPX #$10
  318. BNE OAM_Loop
  319.  
  320. LDX $75E9 ;Restore sprite index
  321. LDY #$02 ;16x16
  322. LDA #$0F ;Number of tiles to draw - 1 (0F)
  323. JSL $01B7B3 ;Finish OAM Write
  324.  
  325. RTS
  326.  
  327.  
  328. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  329. ; SUB_CHANGE_DIR
  330. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  331.  
  332. ;org $019098
  333.  
  334. SUB_CHANGE_DIR:
  335.  
  336.  
  337. LDA $15AC,x
  338. BNE LABEL41
  339. LDA #$08
  340. STA $15AC,x
  341. LDA $B6,x
  342. EOR #$FF
  343. INC A
  344. STA $B6,x
  345. LDA $3334,x
  346. EOR #$01
  347. STA $3334,x
  348. LABEL41: RTS
  349.  
  350.  
  351.  
  352. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  353. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  354. ; routines below can be shared by all sprites. they are ripped from original
  355. ; SMW and poorly documented
  356. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  357. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  358.  
  359. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  360. ; points routine
  361. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  362.  
  363. STAR_SOUNDS: db $00,$13,$14,$15,$16,$17,$18,$19
  364.  
  365. SUB_STOMP_PTS: PHY ;
  366. LDA $7697 ; \
  367. CLC ; |
  368. ADC $758E,x ; / some enemies give higher pts/1ups quicker??
  369. INC $7697 ; increase consecutive enemies stomped
  370. TAY ;
  371. INY ;
  372. CPY #$08 ; \ if consecutive enemies stomped >= 8 ...
  373. BCS NO_SOUND ; / ... don't play sound
  374. LDA STAR_SOUNDS,y ; \ play sound effect
  375. STA $7DF9 ; /
  376. NO_SOUND: TYA ; \
  377. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  378. BCC NO_RESET ; |
  379. LDA #$08 ; /
  380. NO_RESET: JSL $02ACE5 ; give mario points
  381. PLY ;
  382. RTS ; return
  383.  
  384.  
  385. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  386. ; $B760 - graphics routine helper - shared
  387. ; sets off screen flags and sets index to OAM
  388. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  389.  
  390. ;org $03B75C
  391.  
  392. TABLE1: db $0C,$1C
  393. TABLE2: db $01,$02
  394.  
  395. GET_DRAW_INFO: STZ $7642,x ; reset sprite offscreen flag, vertical
  396. STZ $3376,x ; reset sprite offscreen flag, horizontal
  397. LDA $322C,x ; \
  398. CMP $1A ; | set horizontal offscreen if necessary
  399. LDA $326E,x ; |
  400. SBC $1B ; |
  401. BEQ ON_SCREEN_X ; |
  402. INC $3376,x ; /
  403.  
  404. ON_SCREEN_X: LDA $326E,x ; \
  405. XBA ; |
  406. LDA $322C,x ; |
  407. REP #$20 ; |
  408. SEC ; |
  409. SBC $1A ; | mark sprite invalid if far enough off screen
  410. CLC ; |
  411. ADC.W #$0040 ; |
  412. CMP.W #$0180 ; |
  413. SEP #$20 ; |
  414. ROL A ; |
  415. AND #$01 ; |
  416. STA $7536,x ; /
  417. BNE INVALID ;
  418.  
  419. LDY #$00 ; \ set up loop:
  420. LDA $75EA,x ; |
  421. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  422. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  423. INY ; /
  424. ON_SCREEN_LOOP: LDA $3216,x ; \
  425. CLC ; | set vertical offscreen if necessary
  426. ADC TABLE1,y ; |
  427. PHP ; |
  428. CMP $1C ; | (vert screen boundry)
  429. ROL $00 ; |
  430. PLP ; |
  431. LDA $3258,x ; |
  432. ADC #$00 ; |
  433. LSR $00 ; |
  434. SBC $1D ; |
  435. BEQ ON_SCREEN_Y ; |
  436. LDA $7642,x ; | (vert offscreen)
  437. ORA TABLE2,y ; |
  438. STA $7642,x ; |
  439. ON_SCREEN_Y: DEY ; |
  440. BPL ON_SCREEN_LOOP ; /
  441.  
  442. LDY $33A2,x ; get offset to sprite OAM
  443. LDA $322C,x ; \
  444. SEC ; |
  445. SBC $1A ; | $00 = sprite x position relative to screen boarder
  446. STA $00 ; /
  447. LDA $3216,x ; \
  448. SEC ; |
  449. SBC $1C ; | $01 = sprite y position relative to screen boarder
  450. STA $01 ; /
  451. RTS ; return
  452.  
  453. INVALID: PLA ; \ return from *main gfx routine* subroutine...
  454. PLA ; | ...(not just this subroutine)
  455. RTS ; /
  456.  
  457.  
  458. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  459. ; $B829 - vertical mario/sprite position check - shared
  460. ; Y = 1 if mario below sprite??
  461. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  462.  
  463. ;org $03B829
  464.  
  465. SUB_VERT_POS: LDY #$00 ;A:25A1 X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizCHC:0130 VC:085 00 FL:924
  466. LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
  467. SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
  468. SBC $3216,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
  469. STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
  470. LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
  471. SBC $3258,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
  472. BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
  473. INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
  474. LABEL11: RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
  475.  
  476.  
  477. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  478. ; $B817 - horizontal mario/sprite check - shared
  479. ; Y = 1 if mario left of sprite??
  480. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  481.  
  482. ;org $03B817
  483.  
  484. 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
  485. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  486. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  487. SBC $322C,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  488. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  489. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  490. SBC $326E,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  491. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  492. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  493. LABEL16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  494.  
  495.  
  496. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  497. ; $B85D - off screen processing code - shared
  498. ; sprites enter at different points
  499. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  500.  
  501. ;org $03B83B
  502.  
  503. TABLE3: db $40,$B0
  504. TABLE6: db $01,$FF
  505. TABLE4: db $30,$C0,$A0,$80,$A0,$40,$60,$B0
  506. TABLE5: db $01,$FF,$01,$FF,$01,$00,$01,$FF
  507.  
  508. SUB_OFF_SCREEN_X0: LDA #$06 ; \ entry point of routine determines value of $03
  509. BRA STORE_03 ; |
  510. SUB_OFF_SCREEN_X1: LDA #$04 ; |
  511. BRA STORE_03 ; |
  512. SUB_OFF_SCREEN_X2: LDA #$02 ; |
  513. STORE_03: STA $03 ; |
  514. BRA START_SUB ; |
  515. SUB_OFF_SCREEN_X3: STZ $03 ; /
  516.  
  517. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  518. BEQ RETURN_2 ; /
  519. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  520. AND #$01 ; |
  521. BNE VERTICAL_LEVEL ; /
  522. LDA $3216,x ; \
  523. CLC ; |
  524. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  525. LDA $3258,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  526. ADC #$00 ; |
  527. CMP #$02 ; |
  528. BPL ERASE_SPRITE ; / ...erase the sprite
  529. LDA $7616,x ; \ if "process offscreen" flag is set, return
  530. AND #$04 ; |
  531. BNE RETURN_2 ; /
  532. LDA $13 ; \
  533. AND #$01 ; |
  534. ORA $03 ; |
  535. STA $01 ; |
  536. TAY ; /
  537. LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
  538. CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
  539. ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
  540. ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
  541. CMP $322C,x ;x pos ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0364 VC:090 00 FL:16953
  542. PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
  543. 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
  544. LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
  545. ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
  546. PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
  547. SBC $326E,x ;x pos high ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0538 VC:090 00 FL:16953
  548. STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
  549. LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
  550. BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
  551. EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
  552. STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
  553. LABEL20: LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
  554. BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
  555. ERASE_SPRITE: LDA $3242,x ; \ if sprite status < 8, permanently erase sprite
  556. CMP #$08 ; |
  557. BCC KILL_SPRITE ; /
  558. LDY $7578,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
  559. CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
  560. BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
  561. 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
  562. PHX
  563. TYX
  564. STA $418A00,x
  565. PLX ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
  566. KILL_SPRITE: STZ $3242,x ; erase sprite
  567. RETURN_2: RTS ; return
  568.  
  569. VERTICAL_LEVEL: LDA $7616,x ; \ if "process offscreen" flag is set, return
  570. AND #$04 ; |
  571. BNE RETURN_2 ; /
  572. LDA $13 ; \ only handle every other frame??
  573. LSR A ; |
  574. BCS RETURN_2 ; /
  575. AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
  576. STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
  577. TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
  578. LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
  579. CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
  580. ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
  581. ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
  582. CMP $3216,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
  583. PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
  584. LDA.W $301D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
  585. LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
  586. ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
  587. PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
  588. SBC $3258,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
  589. STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
  590. LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
  591. BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
  592. EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
  593. STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
  594. LABEL22: LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
  595. BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
  596. BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
  597.  
  598. SUB_IS_OFF_SCREEN: LDA $3376,x ; \ if sprite is on screen, accumulator = 0
  599. ORA $7642,x ; |
  600. RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement