Advertisement
Romano338

smkdan's Rocky Wrench

Oct 13th, 2018
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.69 KB | None | 0 0
  1. ;SMB3 - Rocky Wrench
  2. ;by smkdan with gfx ripped by andy_k_250
  3.  
  4. DIR: = $03
  5. !PROPRAM = $04
  6. !TEMP = $09
  7.  
  8. ;!SET TO WRENCH SPRITE!
  9. !SPRITE_GEN = $35
  10.  
  11. ;sprite table definitions
  12. !STATE = $1528 ;my typical state/counter duo
  13. !COUNTER = $1602
  14. !FRAMEINDEX = $1570 ;index of frame to use
  15. !WRENCHHOLD = $1662 ;hold wrench
  16.  
  17. ;state defines
  18. !HIDE = $00 ;hiding pefore peeking
  19. !PEEK = $01 ;peeking, killable now
  20. !RISING = $02 ;rising, normal pose
  21. !FIRING = $03 ;firing, wait arm cocked, fire, arm forward
  22. !SINKING = $04 ;sinking, normal pose
  23.  
  24. ;counter defines
  25. !HIDECNT = $40
  26. !PEEKCNT = $40
  27. !FIRECNT = $40
  28. !FIRESHT = $10
  29. !RISECNT = $1B
  30. !SINKCNT = $22
  31.  
  32. ;frame defines
  33. !FRMIDLE = $00
  34. !FRMTHROW1 = $01
  35. !FRMTHROW2 = $02
  36. !FRMDUCK = $03
  37. !FRMDIE = $04
  38.  
  39. PRINT "INIT ",pc
  40.  
  41. LDA $14D4,x ;ypos high
  42. XBA
  43. LDA $D8,x ;ypos low
  44. REP #$20
  45. CLC
  46. ADC.w #$10 ;16pix under
  47. SEP #$20
  48. STA $D8,x ;new ypos low
  49. XBA
  50. STA $14D4,x ;new ypos high
  51.  
  52. LDA #!HIDECNT ;set hiding counter
  53. STA !COUNTER,x
  54. RTL
  55.  
  56. PRINT_TWO: "MAIN ",pc
  57. PHB
  58. PHK
  59. PLB
  60. JSR Run
  61. PLB
  62. RTL
  63.  
  64. RETURN_I:
  65. RTS
  66.  
  67. Run:
  68. LDA $14C8,x ;draw nothing if DIEING or spin jumped
  69. BEQ RETURN_I ;is dead? (one frame)
  70. CMP #$04
  71. BEQ RETURN_I ;is spin jumped? no graphics here
  72.  
  73. LDA $14C8,x
  74. STA $0EF9
  75.  
  76. JSR SUB_OFF_SCREEN_X0
  77. JSR GET_DRAW_INFO
  78. JSR GFX ;draw sprite
  79.  
  80. LDA $14C8,x
  81. CMP #$08
  82. BNE RETURN_I ;otherwise RETURN
  83.  
  84. LDA $9D ;locked sprites?
  85. BNE RETURN_I
  86. LDA $15D0,x ;yoshi eating?
  87. BNE RETURN_I
  88.  
  89. JSL $01A7DC ;mario interact
  90. JSL $018032 ;sprite interact
  91. JSL $01801A ;no gravity yspeed update
  92.  
  93. LDA !STATE,x ;load state
  94. ASL A ;x2
  95. TAX ;into X
  96. JSR (JUMPTABLE,x) ;jump to state code
  97.  
  98. RTS
  99.  
  100. ;TRASM's brokenness means it required the AND
  101. JUMPTABLE:
  102. dw DOHIDE&$FFFF
  103. dw DOPEEK&$FFFF
  104. dw DORISING&$FFFF
  105. dw DOFIRING&$FFFF
  106. dw DOSINKING&$FFFF
  107.  
  108. DOHIDE:
  109. LDX $15E9 ;restore sprite index
  110.  
  111. LDA #!FRMIDLE ;set idle frame
  112. STA !FRAMEINDEX,x
  113.  
  114. STZ $AA,x ;halt yspd
  115.  
  116. DEC !COUNTER,x ;just dec counter
  117. BNE RETURN_I
  118.  
  119. LDA #!PEEK ;move to peek
  120. STA !STATE,x
  121. LDA #!PEEKCNT ;counter
  122. STA !COUNTER,x
  123.  
  124. LDA $14D4,x ;ypos high
  125. XBA
  126. LDA $D8,x ;ypos low
  127. REP #$20
  128. SEC
  129. SBC.w #$04 ;4pix
  130. SEP #$20
  131. STA $D8,x ;new ypos low
  132. XBA
  133. STA $14D4,x ;new ypos high
  134.  
  135. JSR SUB_HORZ_POS
  136. TYA
  137. STA $157C,x ;face mario
  138.  
  139. RTS
  140.  
  141. DOPEEK:
  142. LDX $15E9 ;restore sprite index
  143.  
  144. DEC !COUNTER,x ;dec counter for peeking time
  145. BNE RETURN
  146.  
  147. LDA #!RISING ;move to rising
  148. STA !STATE,x
  149. LDA #!RISECNT ;counter to rise
  150. STA !COUNTER,x
  151.  
  152. RTS
  153.  
  154. DORISING:
  155. LDX $15E9 ;restore sprite index
  156.  
  157. DEC !COUNTER,x ;dec counter for rising time
  158. BEQ GOFIRING
  159.  
  160. LDA #$F8 ;set rising yspd
  161. STA $AA,x
  162.  
  163. RTS
  164.  
  165. GOFIRING:
  166. STZ $AA,x ;halt yspd
  167.  
  168. LDA #!FIRING ;set fire status
  169. STA !STATE,x
  170. LDA #!FIRECNT ;total fire time
  171. STA !COUNTER,x
  172.  
  173. RTS
  174.  
  175. DOFIRING:
  176. LDX $15E9 ;restore sprite index
  177.  
  178. DEC !COUNTER,x ;dec counter for duration of firing
  179. BEQ GOSINKING
  180.  
  181. ;go through poses and generate sprite
  182.  
  183. LDA !COUNTER,x ;frame depending on count
  184. CMP #$20 ;less than 20: arm cocked
  185. BEQ GENFIRE ;half = fire
  186. BCS PREFIRE ;less = holding
  187.  
  188. ;PostFire
  189. RTS
  190.  
  191. PREFIRE:
  192. LDA #!FRMTHROW1 ;first throwing frame
  193. STA !FRAMEINDEX,x
  194.  
  195. LDA #$01 ;set holding wrench
  196. STA !WRENCHHOLD,x
  197.  
  198. RTS
  199.  
  200. GENFIRE:
  201. LDA #!FRMTHROW2 ;second throwing frame
  202. STA !FRAMEINDEX,x
  203.  
  204. STZ !WRENCHHOLD,x
  205. JSR GENERATEC ;generate projectile
  206.  
  207. RTS
  208.  
  209. GOSINKING:
  210. LDA #!FRMIDLE ;idle frame
  211. STA !FRAMEINDEX,x
  212.  
  213. LDA #!SINKING ;set sinking status
  214. STA !STATE,x
  215. LDA #!SINKCNT ;duration of sinking
  216. STA !COUNTER,x
  217.  
  218. RTS
  219.  
  220. DOSINKING:
  221. LDX $15E9 ;restore sprite index
  222.  
  223. DEC !COUNTER,x ;dec counter for sinking time
  224. BEQ GOHIDE
  225.  
  226. LDA #$08 ;set sinking yspd
  227. STA $AA,x
  228.  
  229. RTS
  230.  
  231. GOHIDE:
  232. LDA #!HIDE ;set hide state
  233. STA !STATE,x
  234. LDA #!HIDECNT ;duration of hiding
  235. STA !COUNTER,x
  236.  
  237. RTS
  238.  
  239. RETURN:
  240. RTS
  241.  
  242. ;=====
  243.  
  244. TILEMAP: db $00,$24 ;idle; two tiles
  245. db $02,$24 ;throwing 1
  246. db $04,$24 ;throwing 2
  247. db $08,$24 ;ducking
  248.  
  249. db $06,$26 ;DIEING
  250.  
  251. YDISP: db $00,$10 ;only possible combination
  252.  
  253. GFX:
  254. LDA $14C8,x ;DIEING
  255. CMP #$02
  256. BEQ DIEING
  257. CMP #$03
  258. BEQ DIEING
  259. BRA NOTDIEING
  260.  
  261. DIEING:
  262. STZ !WRENCHHOLD,x ;no holding wrench
  263.  
  264. LDA #!FRMDIE
  265. STA !FRAMEINDEX,x ;set DIEING frame index
  266. LDA $14 ;toggle direction
  267. LSR A
  268. LSR A ;every 4th frame
  269. AND #$01
  270. STA $157C,x
  271.  
  272. NOTDIEING:
  273. LDA !FRAMEINDEX,x;set appropriate frame index
  274. ASL A ;2 frames
  275. STA !TEMP
  276.  
  277. LDA $15F6,x ;properties...
  278. STA !PROPRAM
  279.  
  280. LDA $157C,x ;direction...
  281. BEQ NOFLIP
  282.  
  283. LDA #$40 ;set xflip
  284. TSB !PROPRAM
  285.  
  286. NOFLIP:
  287. LDA !WRENCHHOLD,x ;draw wrench?
  288. BEQ NOWRENCH
  289.  
  290. ;draw wrench tile
  291. LDA $157C,x ;direction into X
  292.  
  293. TAX
  294. LDA $00
  295. CLC
  296. ADC WRENCHXDISP,x
  297. STA $0300,y
  298.  
  299. LDA $01
  300. CLC
  301. ADC #!WRENCHYDISP
  302. STA $0301,y
  303.  
  304. LDA #!WRENCHTILE
  305. STA $0302,y
  306.  
  307. LDA #!WRENCHPROP
  308. STA $0303,y
  309.  
  310. INY ;next tile
  311. INY
  312. INY
  313. INY
  314.  
  315. LDX $15E9 ;restore sprite index
  316.  
  317. NOWRENCH:
  318. LDX #$00 ;reset loop counter
  319. OAM_LOOP:
  320. LDA $00
  321. STA $0300,y ;static ypos
  322.  
  323. LDA $01
  324. CLC
  325. ADC YDISP,x
  326. STA $0301,y ;not static ypos
  327.  
  328. PHX
  329. LDX !TEMP
  330. LDA TILEMAP,x
  331. STA $0302,y ;chr
  332. PLX
  333.  
  334. LDA !PROPRAM
  335. ;ORA $64
  336. STA $0303,y ;properties
  337.  
  338. INY
  339. INY
  340. INY
  341. INY ;next tile
  342. INC !TEMP ;increment frame index
  343. INX ;next loop
  344. CPX #$02 ;2 tiles
  345. BNE OAM_LOOP
  346.  
  347. LDX $15E9 ;restore sprite index
  348.  
  349. LDA !WRENCHHOLD,x
  350. TAY
  351. LDA TILESCOUNT,y
  352.  
  353. LDY #$02 ;16x16
  354. JSL $01B7B3 ;reserve
  355.  
  356. RTS
  357.  
  358. WRENCHXDISP: db $02,$04
  359. !WRENCHYDISP = $F6
  360. !WRENCHTILE = $0A
  361. !WRENCHPROP = 03
  362. TILESCOUNT: db $01,$02 ;2 no wrench, 3 with
  363.  
  364. ;generate custom sprite
  365. ;======================
  366.  
  367. GENPOS: dw $0008,$FFFC
  368.  
  369. GENERATEC:
  370. JSL $02A9E4 ;grab free sprite slot
  371. BMI RETURNGC ;RETURN if none left...
  372.  
  373. LDA #$08
  374. STA $14C8,y ;normal status
  375.  
  376. LDA #!SPRITE_GEN ;load sprite to generate...
  377. PHX ;only xreg can be used with long absolute indexed
  378. TYX ;Y->X
  379. STA $7FAB9E,X
  380. TXY ;X->Y
  381. PLX ;and restore
  382.  
  383. TYX ;new sprite slot into X
  384. JSL $07F7D2 ;create
  385. JSL $0187A7
  386. LDA #$88 ;set as custom sprite
  387. STA $7FAB10,X
  388.  
  389. LDX $15E9 ;restore sprite index
  390.  
  391. LDA $E4,x ;store 16bits xposition at $00
  392. STA $00
  393. LDA $14E0,x
  394. STA $01
  395.  
  396. PHY
  397. LDY $157C,x ;direction of thrower
  398. TYA
  399. ASL A ;16bits
  400. TAY
  401. REP #$20
  402. LDA GENPOS,y
  403. CLC
  404. ADC $00
  405. SEP #$20
  406. PLY
  407.  
  408. STA $00E4,y ;store ypositions
  409. XBA
  410. STA $14E0,y
  411.  
  412. LDA $D8,x
  413. SEC
  414. SBC #$0E ;-14
  415. STA $00D8,y ;Ypos
  416. LDA $14D4,x
  417. SBC #$00 ;transfer carry
  418. STA $14D4,y ;same screen
  419.  
  420. LDA $157C,x
  421. STA $157C,y ;set direction
  422.  
  423. RETURNGC:
  424. RTS
  425.  
  426. ;=================
  427. ;BORROWED ROUTINES
  428. ;=================
  429.  
  430. ;GET_DRAW_INFO
  431. ;==============
  432.  
  433. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  434. ; $B760 - graphics routine helper - shared
  435. ; sets off screen flags and sets index to OAM
  436. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  437.  
  438. SPR_T1: db $0C,$1C
  439. SPR_T2: db $01,$02
  440.  
  441. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  442. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  443. LDA $E4,x ; \
  444. CMP $1A ; | set horizontal offscreen if necessary
  445. LDA $14E0,x ; |
  446. SBC $1B ; |
  447. BEQ ON_SCREEN_X ; |
  448. INC $15A0,x ; /
  449.  
  450. ON_SCREEN_X: LDA $14E0,x ; \
  451. XBA ; |
  452. LDA $E4,x ; |
  453. REP #$20 ; |
  454. SEC ; |
  455. SBC $1A ; | mark sprite INVALID if far enough off screen
  456. CLC ; |
  457. ADC.w #$0040 ; |
  458. CMP.w #$0180 ; |
  459. SEP #$20 ; |
  460. ROL A ; |
  461. AND #$01 ; |
  462. STA $15C4,x ; /
  463. BNE INVALID ;
  464.  
  465. LDY #$00 ; \ set up loop:
  466. LDA $1662,x ; |
  467. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  468. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  469. INY ; /
  470. ON_SCREEN_LOOP: LDA $D8,x ; \
  471. CLC ; | set vertical offscreen if necessary
  472. ADC SPR_T1,y ; |
  473. PHP ; |
  474. CMP $1C ; | (vert screen boundry)
  475. ROL $00 ; |
  476. PLP ; |
  477. LDA $14D4,x ; |
  478. ADC #$00 ; |
  479. LSR $00 ; |
  480. SBC $1D ; |
  481. BEQ ON_SCREEN_Y ; |
  482. LDA $186C,x ; | (vert offscreen)
  483. ORA SPR_T2,y ; |
  484. STA $186C,x ; |
  485. ON_SCREEN_Y: DEY ; |
  486. BPL ON_SCREEN_LOOP ; /
  487.  
  488. LDY $15EA,x ; get offset to sprite OAM
  489. LDA $E4,x ; \
  490. SEC ; |
  491. SBC $1A ; | $00 = sprite x position relative to screen boarder
  492. STA $00 ; /
  493. LDA $D8,x ; \
  494. SEC ; |
  495. SBC $1C ; | $01 = sprite y position relative to screen boarder
  496. STA $01 ; /
  497. RTS ; RETURN
  498.  
  499. INVALID: PLA ; \ RETURN from *main gfx routine* subroutine...
  500. PLA ; | ...(not just this subroutine)
  501. RTS ; /
  502.  
  503.  
  504. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  505. ; SUB_OFF_SCREEN
  506. ; This subroutine deals with sprites that have moved off screen
  507. ; It is adapted from the subroutine at $01AC0D
  508. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  509.  
  510. SPR_T12: db $40,$B0
  511. SPR_T13: db $01,$FF
  512. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  513. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  514. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  515. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  516.  
  517. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  518. BRA STORE_03 ; | (table entry to use on horizontal levels)
  519. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  520. BRA STORE_03 ; |
  521. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  522. BRA STORE_03 ; |
  523. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  524. BRA STORE_03 ; |
  525. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  526. BRA STORE_03 ; |
  527. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  528. BRA STORE_03 ; |
  529. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  530. STORE_03: STA $03 ; |
  531. BRA START_SUB ; |
  532. SUB_OFF_SCREEN_X0: STZ $03 ; /
  533.  
  534. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, RETURN
  535. BEQ RETURN_35 ; /
  536. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  537. AND #$01 ; |
  538. BNE VERTICAL_LEVEL ; /
  539. LDA $D8,x ; \
  540. CLC ; |
  541. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  542. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  543. ADC #$00 ; |
  544. CMP #$02 ; |
  545. BPL ERASE_SPRITE ; / ...erase the sprite
  546. LDA $167A,x ; \ if "process offscreen" flag is set, RETURN
  547. AND #$04 ; |
  548. BNE RETURN_35 ; /
  549. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  550. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  551. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  552. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  553. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  554. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  555. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  556. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  557. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  558. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  559. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  560. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  561. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  562. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  563. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  564. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  565. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  566. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  567. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  568. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  569. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  570. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  571. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  572. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  573. CMP #$08 ; |
  574. BCC KILL_SPRITE ; /
  575. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  576. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  577. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  578. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  579. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  580. KILL_SPRITE: STZ $14C8,x ; erase sprite
  581. RETURN_35: RTS ; RETURN
  582.  
  583. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, RETURN
  584. AND #$04 ; |
  585. BNE RETURN_35 ; /
  586. LDA $13 ; \
  587. LSR A ; |
  588. BCS RETURN_35 ; /
  589. LDA $E4,x ; \
  590. CMP #$00 ; | if the sprite has gone off the side of the level...
  591. LDA $14E0,x ; |
  592. SBC #$00 ; |
  593. CMP #$02 ; |
  594. BCS ERASE_SPRITE ; / ...erase the sprite
  595. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  596. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  597. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  598. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  599. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  600. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  601. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  602. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  603. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  604. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  605. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  606. LDA.w $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  607. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  608. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  609. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  610. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  611. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  612. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  613. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  614. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  615. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  616. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  617. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  618. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  619.  
  620. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  621. ORA $186C,x ; |
  622. RTS ; / RETURN
  623.  
  624. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  625. ; SUB_HORZ_POS
  626. ; This routine determines which side of the sprite Mario is on. It sets the Y register
  627. ; to the direction such that the sprite would face Mario
  628. ; It is ripped from $03B817
  629. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  630.  
  631. 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
  632. LDA $D1 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  633. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  634. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  635. STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  636. LDA $D2 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  637. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  638. BPL SPR_L16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  639. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  640. SPR_L16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement