Advertisement
Guest User

Charging Goomba

a guest
Jan 2nd, 2013
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.91 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Classic Goomba, by mikeyk
  3. ;;
  4. ;; Description: A classic squashable goomba.
  5. ;;
  6. ;; Uses first extra bit: NO
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9.  
  10.  
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ; goomba init JSL
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14.  
  15. dcb "INIT"
  16. PHY
  17. JSR SUB_HORZ_POS
  18. TYA
  19. STA $157C,x
  20. PLY
  21. RTL
  22.  
  23.  
  24. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25. ; goomba main JSL
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27.  
  28. dcb "MAIN"
  29. PHB ; \
  30. PHK ; | main sprite function, just calls local subroutine
  31. PLB ; |
  32. JSR GOOMB_CODE_START ; |
  33. PLB ; |
  34. RTL ; /
  35.  
  36.  
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38. ; goomba main code
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40.  
  41. X_SPEED dcb $08,$F8
  42. X_CHARGE dcb $18,$e8
  43. KILLED_X_SPEED dcb $F0,$10
  44.  
  45. GOOMB_CODE_START JSR GOOMB_GRAPHICS ; graphics routine
  46. LDA $14C8,x ; \
  47. CMP #$08 ; | if status != 8, return
  48. BNE RETURN ; /
  49. JSR SUB_OFF_SCREEN_X0 ; handle off screen situation
  50.  
  51.  
  52.  
  53. JSR SUB_HORZ_POS ;determine if mario is close and act accordingly
  54. TYA
  55. CMP $157c,x
  56. BNE NO_CHARGE
  57.  
  58. LDA #$56
  59. STA $00
  60.  
  61.  
  62. JSR Proximity2
  63. TYA
  64. CMP #$01
  65.  
  66. BNE NO_CHARGE
  67.  
  68. LDA $96
  69. CLC
  70. ADC #$10
  71. CMP $D8,x
  72. BNE NO_CHARGE
  73.  
  74.  
  75.  
  76.  
  77. LDY $157C,x
  78. LDA X_CHARGE,y
  79. STA $B6,x
  80. LDA #$20
  81. STA $15AC,x
  82. JMP SPEED_SET
  83.  
  84. CHARGE2
  85. LDY $157C,x
  86. LDA X_CHARGE,y
  87. STA $B6,x
  88. JMP SPEED_SET
  89.  
  90.  
  91. NO_CHARGE
  92. LDA $15AC,x
  93. BNE CHARGE2
  94. LDY $157C,x ; \ set x speed based on direction
  95. LDA X_SPEED,y ; |
  96. STA $B6,x ; /
  97.  
  98.  
  99. SPEED_SET LDA $9D ; \ if sprites locked, return
  100. BNE RETURN ; /
  101. LDA $1558,x ; \ if sprite not defeated (timer to show remains > 0)...
  102. BEQ ALIVE ; / ... goto ALIVE
  103. STA $15D0,x ; \
  104. DEC A ; } if sprite remains don't disappear next frame...
  105. BNE RETURN ; / ... return
  106. STZ $14C8,x ; this is the last frame to show remains, so set sprite status = 0 (not alive)
  107. RETURN RTS ; return
  108. ALIVE LDA $1588,x ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0276 VC:077 00 FL:623
  109. AND #$04 ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0308 VC:077 00 FL:623
  110. PHA ;A:0100 X:0007 Y:0001 D:0000 DB:03 S:01EF P:envMXdiZCHC:0324 VC:077 00 FL:623
  111. JSL $01802A ; update position based on speed values
  112. JSL $018032 ; interact with other sprites
  113. LDA $1588,x ;A:254B X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0684 VC:085 00 FL:623
  114. AND #$04 ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0716 VC:085 00 FL:623
  115. BEQ IN_AIR ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0732 VC:085 00 FL:623
  116. STZ $AA,x ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0748 VC:085 00 FL:623
  117. PLA ;A:2504 X:0007 Y:0007 D:0000 DB:03 S:01EE P:envMXdizcHC:0778 VC:085 00 FL:623
  118. BRA ON_GROUND ;A:2500 X:0007 Y:0007 D:0000 DB:03 S:01EF P:envMXdiZcHC:0806 VC:085 00 FL:623
  119. IN_AIR PLA ;A:2500 X:0007 Y:0006 D:0000 DB:03 S:01EB P:envMXdiZcHC:0316 VC:085 00 FL:4955
  120. BEQ WAS_IN_AIR ;A:2504 X:0007 Y:0006 D:0000 DB:03 S:01EC P:envMXdizcHC:0344 VC:085 00 FL:4955
  121. LDA #$0A ;A:2504 X:0007 Y:0006 D:0000 DB:03 S:01EC P:envMXdizcHC:0360 VC:085 00 FL:4955
  122. STA $1540,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0376 VC:085 00 FL:4955
  123. WAS_IN_AIR LDA $1540,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0408 VC:085 00 FL:4955
  124. BEQ ON_GROUND ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0440 VC:085 00 FL:4955
  125. STZ $AA,x ;A:25FF X:0007 Y:0006 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0456 VC:085 00 FL:4955
  126. ON_GROUND
  127. LDA $1588,x ; | if sprite is in contact with an object...
  128. AND #$03 ; |
  129. BEQ DONT_UPDATE ; |
  130. LDA $157C,x ; | flip the direction status
  131. EOR #$01 ; |
  132. STA $157C,x ; /
  133.  
  134.  
  135. DONT_UPDATE JSL $01A7DC ; check for mario/sprite contact
  136. BCC RETURN_24 ; (carry set = contact)
  137. LDA $1490 ; \ if mario star timer > 0 ...
  138. BNE HAS_STAR ; / ... goto HAS_STAR
  139. LDA $7D ; \ if mario's y speed < 10 ...
  140. CMP #$10 ; } ... sprite will hurt mario
  141. BMI GOOB_WINS ; /
  142.  
  143. MARIO_WINS JSR SUB_STOMP_PTS ; give mario points
  144. JSL $01AA33 ; set mario speed
  145. JSL $01AB99 ; display contact graphic
  146. LDA $140D ; \ if mario is spin jumping...
  147. ORA $187A ; } ... or on yoshi ...
  148. BNE SPIN_KILL ; / ... goto SPIN_KILL
  149. LDA #$20 ; \ ... time to show defeated sprite = $20
  150. STA $1558,x ; /
  151. RETURN_24 RTS ; return
  152.  
  153. GOOB_WINS LDA $1497 ; \ if mario is invincible...
  154. ORA $187A ; } ... or mario on yoshi...
  155. ORA $15D0,x ; | ...or sprite being eaten...
  156. BNE RETURN2 ; / ... return
  157. JSR SUB_GET_DIR ; \ set new sprite direction
  158. TYA ; }
  159. STA $157C,x ; /
  160. JSL $00F5B7 ; hurt mario
  161. RETURN2 RTS ; return
  162.  
  163. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  164. ; spin and star kill (still part of above routine)
  165. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  166.  
  167. STAR_SOUNDS dcb $00,$13,$14,$15,$16,$17,$18,$19
  168.  
  169. SPIN_KILL LDA #$04 ; \ status = 4 (being killed by spin jump)
  170. STA $14C8,x ; /
  171. LDA #$1F ; \ set spin jump animation timer
  172. STA $1540,x ; /
  173. JSL $07FC3B ; show star animation
  174. LDA #$08 ; \ play sound effect
  175. STA $1DF9 ; /
  176. RTS ; return
  177. HAS_STAR LDA #$02 ; \ status = 2 (being killed by star)
  178. STA $14C8,x ; /
  179. LDA #$D0 ; \ set y speed
  180. STA $AA,x ; /
  181. JSR SUB_HORZ_POS ; get new direction
  182. LDA KILLED_X_SPEED,y ; \ set x speed based on direction
  183. STA $B6,x ; /
  184. INC $18D2 ; increment number consecutive enemies killed
  185. LDA $18D2 ; \
  186. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  187. BCC NO_RESET2 ; |
  188. LDA #$08 ; |
  189. STA $18D2 ; /
  190. NO_RESET2 JSL $02ACE5 ; give mario points
  191. LDY $18D2 ; \
  192. CPY #$08 ; | if consecutive enemies stomped < 8 ...
  193. BCS NO_SOUND2 ; |
  194. LDA STAR_SOUNDS,y ; | ... play sound effect
  195. STA $1DF9 ; /
  196. NO_SOUND2 RTS ; final return
  197.  
  198.  
  199. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  200. ; graphics routine
  201. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  202.  
  203. ;frame 1, frame 2, squashed, star killed (2 bytes each)
  204. TILE_SIZE dcb $02,$02,$02,$02,$00,$00,$02,$02
  205. GOOMB_HORIZ_DISP dcb $00,$00,$00,$00,$00,$08,$00,$00
  206. GOOMB_VERT_DISP dcb $00,$00,$00,$00,$08,$08,$00,$00
  207. GOOMB_TILEMAP dcb $a8,$a8,$aa,$aa,$38,$39,$aa,$aa
  208. GOOMB_PROPERTIES dcb $00,$00,$00,$00,$00,$00,$80,$80
  209.  
  210. GOOMB_GRAPHICS JSR GET_DRAW_INFO
  211. LDA $157C,x ; \ $02 = direction
  212. STA $02 ; /
  213.  
  214. LDA $14 ;\
  215. LSR A ; |
  216. LSR A ; |
  217. LSR A ; |
  218. CLC ; |
  219. ADC $15E9 ; |
  220. AND #$01 ; |
  221. ASL A
  222. STA $03 ; | $03 = index to frame start (0 or 2)
  223. PHX ; /
  224.  
  225. LDA $14C8,x
  226. CMP #$02
  227. BNE NO_STAR
  228. LDA #$06
  229. STA $03
  230.  
  231. NO_STAR LDA $1558,x ; \ if time to show sprite remains > 0...
  232. BEQ NOT_DEAD ; |
  233. LDA #$04 ; | $03 = 4
  234. STA $03 ; /
  235. STX $15E9
  236. NOT_DEAD
  237.  
  238. LDX #$01 ; run loop 4 times, cuz 4 tiles per frame
  239. LOOP_START_2 PHX ; push, current tile
  240.  
  241. TXA ; \ X = index of frame start + current tile
  242. CLC ; |
  243. ADC $03 ; |
  244. TAX ; /
  245.  
  246. PHY ; set tile to be 8x8 or 16x16
  247. TYA ;
  248. LSR A ;
  249. LSR A ;
  250. TAY ;
  251. LDA TILE_SIZE,x ;
  252. STA $0460,y ;
  253. PLY ;
  254.  
  255. LDA $00 ; \ tile x position = sprite x location ($00) + tile displacement
  256. CLC ; |
  257. ADC GOOMB_HORIZ_DISP,x ; |
  258. STA $0300,y ; /
  259.  
  260. LDA $01 ; |
  261. CLC ; | tile y position = sprite y location ($01) + tile displacement
  262. ADC GOOMB_VERT_DISP,x ; |
  263. STA $0301,y ; /
  264.  
  265. LDA GOOMB_TILEMAP,x ; \ store tile
  266. STA $0302,y ; /
  267.  
  268. PHX ;
  269. LDX $15E9 ;
  270. LDA $15F6,x ; get palette info
  271. PLX ;
  272. PHX
  273. LDX $02
  274. BNE NO_FLIP_1A
  275. ORA #$40 ; flip tile if necessary
  276. NO_FLIP_1A
  277. PLX
  278. ORA $64 ; add in tile priority of level
  279. STA $0303,y ; store tile properties
  280.  
  281. PLX ; \ pull, current tile
  282. INY ; | increase index to sprite tile map ($300)...
  283. INY ; | ...we wrote 1 16x16 tile...
  284. INY ; | ...sprite OAM is 8x8...
  285. INY ; | ...so increment 4 times
  286. DEX ; | go to next tile of frame and loop
  287. BPL LOOP_START_2 ; /
  288.  
  289. PLX ; pull, X = sprite index
  290. LDY #$FF ; \ we've already set 460 so use FF
  291. LDA #$01 ; | A = number of tiles drawn - 1
  292. JSL $01B7B3 ; / don't draw if offscreen
  293. RTS ; return
  294.  
  295.  
  296. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  297. ; points routine
  298. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  299.  
  300. SUB_STOMP_PTS PHY ;
  301. LDA $1697 ; \
  302. CLC ; |
  303. ADC $1626,x ; / some enemies give higher pts/1ups quicker??
  304. INC $1697 ; increase consecutive enemies stomped
  305. TAY ;
  306. INY ;
  307. CPY #$08 ; \ if consecutive enemies stomped >= 8 ...
  308. BCS NO_SOUND ; / ... don't play sound
  309. LDA STAR_SOUNDS,y ; \ play sound effect
  310. STA $1DF9 ; /
  311. NO_SOUND TYA ; \
  312. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  313. BCC NO_RESET ; |
  314. LDA #$08 ; /
  315. NO_RESET JSL $02ACE5 ; give mario points
  316. PLY ;
  317. RTS ; return
  318.  
  319. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  320. ;Proximity (horizontal)
  321. ;A will have 1 if the sprite is in range
  322. ;Otherwise it's 0
  323. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  324.  
  325. ;Store the range to check from in 00, then jump to this routine.
  326. ;E.g.
  327. ;LDA #$12
  328. ;STA $00
  329. ;JSR Proximity
  330.  
  331. DirFix: db $FF,$00
  332.  
  333. Proximity
  334. LDA $E4,x ;\
  335. SEC ; |
  336. SBC $94 ; |
  337. PHA ; |
  338. JSR SUB_HORZ_POS ; | Check sprite range ..
  339. PLA ; |
  340. EOR DirFix,y ; |
  341. CMP $00 ; | If Range > !Temp return.
  342. BCC RANGE ; | If in RANGE.. branch.
  343. RETURNX RTS ;/
  344. RANGE
  345. LDA #$01
  346. RTS
  347.  
  348.  
  349.  
  350.  
  351.  
  352. Proximity = $0012
  353. Proximity2:
  354. LDA $0ddc
  355. LDY #$00
  356. LDA $14E0,x
  357. XBA
  358. LDA $E4,x
  359. REP #$20
  360. SEC
  361. SBC $94
  362. CLC
  363. ; ADC.w #!Proximity
  364. ; CMP.w #!Proximity*2
  365.  
  366. ADC.w #$0012
  367. CMP.w #$0024
  368. SEP #$20
  369. BCS NOY
  370. INY
  371. NOY
  372. RTS
  373.  
  374.  
  375. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  376. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  377. ; routines below can be shared by all sprites. they are ripped from original
  378. ; SMW and poorly documented
  379. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  380. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  381.  
  382. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  383. ; $B760 - graphics routine helper - shared
  384. ; sets off screen flags and sets index to OAM
  385. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  386.  
  387. ;org $03B75C
  388.  
  389. TABLE1 dcb $0C,$1C
  390. TABLE2 dcb $01,$02
  391.  
  392. GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
  393. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  394. LDA $E4,x ; \
  395. CMP $1A ; | set horizontal offscreen if necessary
  396. LDA $14E0,x ; |
  397. SBC $1B ; |
  398. BEQ ON_SCREEN_X ; |
  399. INC $15A0,x ; /
  400.  
  401. ON_SCREEN_X LDA $14E0,x ; \
  402. XBA ; |
  403. LDA $E4,x ; |
  404. REP #$20 ; |
  405. SEC ; |
  406. SBC $1A ; | mark sprite invalid if far enough off screen
  407. CLC ; |
  408. ADC.W #$0040 ; |
  409. CMP.W #$0180 ; |
  410. SEP #$20 ; |
  411. ROL A ; |
  412. AND #$01 ; |
  413. STA $15C4,x ; /
  414. BNE INVALID ;
  415.  
  416. LDY #$00 ; \ set up loop:
  417. LDA $1662,x ; |
  418. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  419. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  420. INY ; /
  421. ON_SCREEN_LOOP LDA $D8,x ; \
  422. CLC ; | set vertical offscreen if necessary
  423. ADC TABLE1,y ; |
  424. PHP ; |
  425. CMP $1C ; | (vert screen boundry)
  426. ROL $00 ; |
  427. PLP ; |
  428. LDA $14D4,x ; |
  429. ADC #$00 ; |
  430. LSR $00 ; |
  431. SBC $1D ; |
  432. BEQ ON_SCREEN_Y ; |
  433. LDA $186C,x ; | (vert offscreen)
  434. ORA TABLE2,y ; |
  435. STA $186C,x ; |
  436. ON_SCREEN_Y DEY ; |
  437. BPL ON_SCREEN_LOOP ; /
  438.  
  439. LDY $15EA,x ; get offset to sprite OAM
  440. LDA $E4,x ; \
  441. SEC ; |
  442. SBC $1A ; | $00 = sprite x position relative to screen boarder
  443. STA $00 ; /
  444. LDA $D8,x ; \
  445. SEC ; |
  446. SBC $1C ; | $01 = sprite y position relative to screen boarder
  447. STA $01 ; /
  448. RTS ; return
  449.  
  450. INVALID PLA ; \ return from *main gfx routine* subroutine...
  451. PLA ; | ...(not just this subroutine)
  452. RTS ; /
  453.  
  454. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  455. ; $B817 - horizontal mario/sprite check - shared
  456. ; Y = 1 if mario left of sprite??
  457. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  458.  
  459. ;org $03B817 ; Y = 1 if contact
  460.  
  461. 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
  462. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  463. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  464. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  465. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  466. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  467. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  468. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  469. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  470. LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  471.  
  472. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  473. ; $B829 - vertical mario/sprite position check - shared
  474. ; Y = 1 if mario below sprite??
  475. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  476.  
  477. ;org $03B829
  478.  
  479. 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
  480. LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
  481. SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
  482. SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
  483. STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
  484. LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
  485. SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
  486. BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
  487. INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
  488. LABEL11 RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
  489.  
  490.  
  491. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  492. ; $B817 - horizontal mario/sprite check - shared
  493. ; Y = 1 if mario left of sprite??
  494. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  495.  
  496. ;org $03B817
  497.  
  498. 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
  499. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  500. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  501. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  502. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  503. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  504. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  505. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  506. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  507. LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  508.  
  509.  
  510. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  511. ; $B85D - off screen processing code - shared
  512. ; sprites enter at different points
  513. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  514.  
  515. ;org $03B83B
  516.  
  517. TABLE3 dcb $40,$B0
  518. TABLE6 dcb $01,$FF
  519. TABLE4 dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0
  520. TABLE5 dcb $01,$FF,$01,$FF,$01,$00,$01,$FF
  521.  
  522. SUB_OFF_SCREEN_X0 LDA #$06 ; \ entry point of routine determines value of $03
  523. BRA STORE_03 ; |
  524. SUB_OFF_SCREEN_X1 LDA #$04 ; |
  525. BRA STORE_03 ; |
  526. SUB_OFF_SCREEN_X2 LDA #$02 ; |
  527. STORE_03 STA $03 ; |
  528. BRA START_SUB ; |
  529. SUB_OFF_SCREEN_HB STZ $03 ; /
  530.  
  531. START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  532. BEQ RETURN_2 ; /
  533. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  534. AND #$01 ; |
  535. BNE VERTICAL_LEVEL ; /
  536. LDA $D8,x ; \
  537. CLC ; |
  538. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  539. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  540. ADC #$00 ; |
  541. CMP #$02 ; |
  542. BPL ERASE_SPRITE ; / ...erase the sprite
  543. LDA $167A,x ; \ if "process offscreen" flag is set, return
  544. AND #$04 ; |
  545. BNE RETURN_2 ; /
  546. LDA $13 ; \
  547. AND #$01 ; |
  548. ORA $03 ; |
  549. STA $01 ; |
  550. TAY ; /
  551. LDA $1A ;x boundry ;A:0101 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0256 VC:090 00 FL:16953
  552. CLC ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0280 VC:090 00 FL:16953
  553. ADC TABLE4,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0294 VC:090 00 FL:16953
  554. ROL $00 ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0326 VC:090 00 FL:16953
  555. 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
  556. PHP ;A:01C0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0394 VC:090 00 FL:16953
  557. 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
  558. LSR $00 ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0440 VC:090 00 FL:16953
  559. ADC TABLE5,y ;A:0100 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdizcHC:0478 VC:090 00 FL:16953
  560. PLP ;A:01FF X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNvMXdizcHC:0510 VC:090 00 FL:16953
  561. 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
  562. STA $00 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0570 VC:090 00 FL:16953
  563. LSR $01 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0594 VC:090 00 FL:16953
  564. BCC LABEL20 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0632 VC:090 00 FL:16953
  565. EOR #$80 ;A:01FE X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0648 VC:090 00 FL:16953
  566. STA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0664 VC:090 00 FL:16953
  567. LABEL20 LDA $00 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0688 VC:090 00 FL:16953
  568. BPL RETURN_2 ;A:017E X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0712 VC:090 00 FL:16953
  569. ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  570. CMP #$08 ; |
  571. BCC KILL_SPRITE ; /
  572. LDY $161A,x ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZCHC:0140 VC:071 00 FL:21152
  573. CPY #$FF ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizCHC:0172 VC:071 00 FL:21152
  574. BEQ KILL_SPRITE ;A:FF08 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0188 VC:071 00 FL:21152
  575. 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
  576. STA $1938,y ; / A:FF00 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdiZcHC:0220 VC:071 00 FL:21152
  577. KILL_SPRITE STZ $14C8,x ; erase sprite
  578. RETURN_2 RTS ; return
  579.  
  580. VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
  581. AND #$04 ; |
  582. BNE RETURN_2 ; /
  583. LDA $13 ; \ only handle every other frame??
  584. LSR A ; |
  585. BCS RETURN_2 ; /
  586. AND #$01 ;A:0227 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0228 VC:112 00 FL:1142
  587. STA $01 ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0244 VC:112 00 FL:1142
  588. TAY ;A:0201 X:0006 Y:00EC D:0000 DB:03 S:01ED P:envMXdizcHC:0268 VC:112 00 FL:1142
  589. LDA $1C ;A:0201 X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0282 VC:112 00 FL:1142
  590. CLC ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0306 VC:112 00 FL:1142
  591. ADC TABLE3,y ;A:02BD X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0320 VC:112 00 FL:1142
  592. ROL $00 ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0352 VC:112 00 FL:1142
  593. CMP $D8,x ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:enVMXdizCHC:0390 VC:112 00 FL:1142
  594. PHP ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0420 VC:112 00 FL:1142
  595. LDA.W $001D ;A:026D X:0006 Y:0001 D:0000 DB:03 S:01EC P:eNVMXdizcHC:0442 VC:112 00 FL:1142
  596. LSR $00 ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdiZcHC:0474 VC:112 00 FL:1142
  597. ADC TABLE6,y ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:enVMXdizCHC:0512 VC:112 00 FL:1142
  598. PLP ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01EC P:envMXdiZCHC:0544 VC:112 00 FL:1142
  599. SBC $14D4,x ;A:0200 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNVMXdizcHC:0572 VC:112 00 FL:1142
  600. STA $00 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0604 VC:112 00 FL:1142
  601. LDY $01 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizcHC:0628 VC:112 00 FL:1142
  602. BEQ LABEL22 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0652 VC:112 00 FL:1142
  603. EOR #$80 ;A:02FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0668 VC:112 00 FL:1142
  604. STA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0684 VC:112 00 FL:1142
  605. LABEL22 LDA $00 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0708 VC:112 00 FL:1142
  606. BPL RETURN_2 ;A:027F X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:0732 VC:112 00 FL:1142
  607. BMI ERASE_SPRITE ;A:0280 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:0170 VC:064 00 FL:1195
  608.  
  609. SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  610. ORA $186C,x ; |
  611. RTS ; / return
  612.  
  613. NOP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement