Guest User

Untitled

a guest
Sep 4th, 2011
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 50.03 KB | None | 0 0
  1. ;kuribo shoe WIP
  2. ;by smkdan
  3. !DIR = $03
  4. !PROPRAM = $04
  5. !TEMP = $09
  6.  
  7. ;set to sprite # of kuribo shoe powerup sprite
  8. !POWERUPSPR = $05
  9.  
  10. ;some definitions
  11. !STATE = $1570 ;the state
  12. !COUNTER = $1602 ;the counter
  13.  
  14. !GOOMBAX = $C2 ;goomba x displacement
  15. !GOOMBAY = $1504 ;goomba y displacement
  16.  
  17. !POWERUP = $1602 ;powerup state
  18.  
  19. ;states
  20. !IDLESHOW = $00 ;idling with face showing
  21. !IDLESHOWTIME = $30
  22. !SINK = $01 ;sinking to prepare for jump
  23. !SINKTIME = $10
  24. !JUMPING = $02 ;in the air
  25. !RISE = $03 ;rising after the jump
  26.  
  27. ;misc
  28. !JUMPYSPD = $50 ;change these if you please
  29. !JUMPXSPD = $0C
  30.  
  31. !INITY = $F8
  32.  
  33.  
  34. print "MAIN ",pc
  35. PHB
  36. PHK
  37. PLB
  38. JSR SpriteMain
  39. PLB
  40. RTL
  41.  
  42. print "INIT ",pc
  43. LDA #!IDLESHOWTIME ;initialise timer
  44. STA !COUNTER,x ;new counter
  45. LDA #!INITY ;set initial GOOMBAY
  46. STA !GOOMBAY,x
  47.  
  48. JSR SUB_HORZ_POS ;face mario
  49. TYA
  50. STA $157C,x
  51.  
  52. RTL
  53.  
  54. SpriteMain:
  55. JSR SUB_OFF_SCREEN_X0
  56. JSR GET_DRAW_INFO
  57. JSR GFX ;draw sprite
  58.  
  59. LDA $14C8,x ;check for falling
  60. CMP #$02
  61. BNE NoFall
  62.  
  63. LDA !STATE,x ;check state high bit
  64. BMI NoFall
  65.  
  66. JSR SetupCustom ;jump to generate shoe
  67. LDA #$80
  68. STA !STATE,x ;set high bit state to say it's already done
  69.  
  70. LDA $1662,x ;no object interaction
  71. ORA #$80
  72. STA $1662,x
  73.  
  74. NoFall:
  75. LDA $14C8,x ;status check
  76. CMP #$08
  77. BNE Return
  78.  
  79. LDA $9D ;locked sprites?
  80. BNE Return
  81. LDA $15D0,x ;yoshi eating?
  82. BNE Return
  83.  
  84. JSL $01802A ;update speed
  85. JSL $01A7DC ;mario interact
  86.  
  87. LDA !STATE,x ;load state
  88. ASL A ;x2 into jump table
  89. TAX
  90. JSR (JumpTable,x)
  91.  
  92. Return:
  93. RTS
  94.  
  95. ;=====
  96.  
  97. JumpTable:
  98. dw IdleShow
  99. dw Sink
  100. dw Jumping
  101. dw Rise
  102.  
  103. ;=====
  104.  
  105. IdleShow:
  106. LDX $15E9
  107. DEC !COUNTER,x ;update counters
  108. BNE KeepShowing
  109.  
  110. LDA #!SINK ;update to sink
  111. STA !STATE,x
  112.  
  113. KeepShowing:
  114. RTS
  115.  
  116. Sink:
  117. LDX $15E9
  118.  
  119. LDA $14 ;only update every 2nd frame
  120. LSR A
  121. BCC KeepSinking
  122.  
  123. INC !GOOMBAY,x ;sink
  124. LDA !GOOMBAY,x ;test
  125. BNE KeepSinking
  126.  
  127. ;jump
  128. LDA #!JUMPYSPD ;set yjump speed
  129. EOR #$FF
  130. INC A
  131. STA $AA,x ;yspd
  132.  
  133. JSR SUB_HORZ_POS ;face mario BEFORE jumping
  134. TYA
  135. STA $157C,x
  136.  
  137. LDA #!JUMPXSPD ;set xjump speed
  138. LDY $157C,x ;test direction
  139. BEQ JumpRight
  140.  
  141. EOR #$FF ;two's complement
  142. INC A
  143. JumpRight:
  144. STA $B6,x ;xspd
  145. LDA #!JUMPING ;go into jump state
  146. STA !STATE,x
  147.  
  148.  
  149. KeepSinking:
  150. RTS
  151.  
  152. Jumping:
  153. LDX $15E9
  154.  
  155. LDA $1588,x ;check if on ground yet
  156. BIT #$04
  157. BEQ InAir
  158.  
  159. ;landed
  160. STZ $B6,x ;on ground, no xspd
  161.  
  162. LDA #!RISE ;set rise status
  163. STA !STATE,x
  164. InAir:
  165. LDA $1588,x ;if touching wall..
  166. BIT #$03
  167. BEQ NoWall
  168.  
  169. LDA $B6,x ;invert xspd
  170. EOR #$FF
  171. INC A
  172. STA $B6,x
  173.  
  174. LDA $157C,x ;and also direction
  175. EOR #$01
  176. STA $157C,x
  177. NoWall:
  178. LDA $1588,x ;if touching cieling...
  179. BIT #$08
  180. BEQ NoCieling
  181.  
  182. LDA $AA,x ;invert yspd
  183. EOR #$FF
  184. INC A
  185. STA $AA,x
  186. NoCieling:
  187. RTS
  188.  
  189. Rise:
  190. LDX $15E9
  191.  
  192. LDA $14 ;rise every 2nd frame
  193. LSR A
  194. BCC KeepRising
  195.  
  196. DEC !GOOMBAY,x ;rise again
  197. LDA !GOOMBAY,x ;test
  198. CMP #!INITY ;at original yet?
  199. BNE KeepRising
  200.  
  201. ;risen
  202. LDA #!IDLESHOW ;back to idle show
  203. STA !STATE,x
  204. LDA #!IDLESHOWTIME
  205. STA !COUNTER,x
  206.  
  207. KeepRising:
  208. RTS
  209.  
  210. ;=====
  211.  
  212. PowerUp:
  213. LDA #$80 ;set to always call main with no default handling
  214. STA $7FAB34,x
  215.  
  216. INC !GOOMBAX,x
  217. INC !GOOMBAY,x
  218.  
  219. STZ $AA,x
  220. STZ $B6,x
  221. RTS
  222.  
  223. ;=====
  224.  
  225. !GOOMBAFRAME = $4C ;16x16 goomba frame
  226. !GOOMBAPROP = $04 ;goomba frame properties
  227.  
  228. SHOEFRAME:
  229. db $4E,$60 ;two shoe frames
  230.  
  231. GFX:
  232. LDA $14C8,x ;if spin jumping / dead
  233. BEQ ReturnG
  234. CMP #$04
  235. BEQ ReturnG
  236.  
  237. LDA $14C8,x
  238. CMP #$02
  239. BNE NoFallG
  240.  
  241. NoFallG:
  242. LDA $15F6,x ;properties...
  243. STA !PROPRAM
  244.  
  245. LDA $157C,x ;direction...
  246. BNE FaceLeft
  247. LDA #$40 ;set xflip
  248. TSB !PROPRAM
  249.  
  250. FaceLeft:
  251. LDA $14C8,x ;is dieing?
  252. CMP #$02
  253. BNE NoFlip
  254.  
  255. STZ !GOOMBAX,x ;hide goomba
  256. STZ !GOOMBAY,x
  257. LDA #$80 ;set yflip
  258. TSB !PROPRAM
  259.  
  260. BRA DrawGoomba ;only draw goomba
  261.  
  262. ;draw shoe
  263. NoFlip:
  264. LDA $00 ;xpos
  265. STA $0300,y
  266. LDA $01 ;ypos
  267. STA $0301,y
  268. LDA $14 ;framecounter for frame index
  269. LSR A
  270. LSR A
  271. LSR A ;every x frame
  272. AND #$01 ;2 frames
  273. TAX
  274. LDA SHOEFRAME,x
  275. STA $0302,y ;chr
  276. LDA !PROPRAM
  277. ORA $64
  278. STA $0303,y ;properties
  279.  
  280. LDX $15E9 ;restore sprite index
  281.  
  282. DrawGoomba:
  283. LDA $00 ;xpos plus xdisp
  284. CLC
  285. ADC !GOOMBAX,x
  286. STA $0304,y
  287. LDA $01 ;ypos plus ydisp
  288. CLC
  289. ADC !GOOMBAY,x
  290. STA $0305,y
  291. LDA #!GOOMBAFRAME
  292. STA $0306,y ;chr
  293. LDA !PROPRAM
  294. AND #$81 ;keep page bit and flip
  295. ORA #!GOOMBAPROP
  296. ORA $64
  297. STA $0307,y
  298.  
  299. LDY #$02 ;16x16
  300. LDA #$01 ;2 tiles
  301. JSL $01B7B3 ;reserve
  302.  
  303. ReturnG:
  304. RTS
  305.  
  306. ;======
  307.  
  308. SetupCustom:
  309. JSL $02A9E4 ;grab free sprite slot
  310. BMI ReturnGen ;return if none left before anything else...
  311.  
  312. LDA #$01
  313. STA $14C8,y ;normal status, run init routine
  314.  
  315. LDA #!POWERUPSPR
  316. PHX
  317. TYX
  318. STA $7FAB9E,x ;into sprite type table for custom sprites
  319. PLX
  320.  
  321. ;set positions accordingly
  322. ;restore gen sprite index
  323.  
  324. PHX ;preserve sprite
  325. TYX ;new sprite slot into X
  326. JSL $07F7D2 ;create sprite
  327. JSL $0187A7
  328. LDA #$88 ;set as custom sprite
  329. STA $7FAB10,X
  330. PLX ;restore sprite
  331.  
  332. LDA $E4,x ;copy positions
  333. STA $00E4,y
  334. LDA $14E0,x
  335. STA $14E0,y
  336.  
  337. LDA $D8,x
  338. STA $00D8,y
  339. LDA $14D4,x
  340. STA $14D4,y
  341.  
  342. LDA $157C,x ;copy direction
  343. STA $157C,y
  344.  
  345. ReturnGen:
  346. RTS ;return
  347.  
  348. ;=================
  349. ;BORROWED ROUTINES
  350. ;=================
  351.  
  352. ;GET_DRAW_INFO
  353. ;==============
  354.  
  355. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  356. ; $B760 - graphics routine helper - shared
  357. ; sets off screen flags and sets index to OAM
  358. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  359.  
  360. SPR_T1: db $0C,$1C
  361. SPR_T2: db $01,$02
  362.  
  363. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  364. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  365. LDA $E4,x ; \
  366. CMP $1A ; | set horizontal offscreen if necessary
  367. LDA $14E0,x ; |
  368. SBC $1B ; |
  369. BEQ ON_SCREEN_X ; |
  370. INC $15A0,x ; /
  371.  
  372. ON_SCREEN_X: LDA $14E0,x ; \
  373. XBA ; |
  374. LDA $E4,x ; |
  375. REP #$20 ; |
  376. SEC ; |
  377. SBC $1A ; | mark sprite invalid if far enough off screen
  378. CLC ; |
  379. ADC.w #$0040 ; |
  380. CMP.w #$0180 ; |
  381. SEP #$20 ; |
  382. ROL A ; |
  383. AND #$01 ; |
  384. STA $15C4,x ; /
  385. BNE INVALID ;
  386.  
  387. LDY #$00 ; \ set up loop:
  388. LDA $1662,x ; |
  389. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  390. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  391. INY ; /
  392. ON_SCREEN_LOOP: LDA $D8,x ; \
  393. CLC ; | set vertical offscreen if necessary
  394. ADC SPR_T1,y ; |
  395. PHP ; |
  396. CMP $1C ; | (vert screen boundry)
  397. ROL $00 ; |
  398. PLP ; |
  399. LDA $14D4,x ; |
  400. ADC #$00 ; |
  401. LSR $00 ; |
  402. SBC $1D ; |
  403. BEQ ON_SCREEN_Y ; |
  404. LDA $186C,x ; | (vert offscreen)
  405. ORA SPR_T2,y ; |
  406. STA $186C,x ; |
  407. ON_SCREEN_Y: DEY ; |
  408. BPL ON_SCREEN_LOOP ; /
  409.  
  410. LDY $15EA,x ; get offset to sprite OAM
  411. LDA $E4,x ; \
  412. SEC ; |
  413. SBC $1A ; | $00 = sprite x position relative to screen boarder
  414. STA $00 ; /
  415. LDA $D8,x ; \
  416. SEC ; |
  417. SBC $1C ; | $01 = sprite y position relative to screen boarder
  418. STA $01 ; /
  419. RTS ; return
  420.  
  421. INVALID: PLA ; \ return from *main gfx routine* subroutine...
  422. PLA ; | ...(not just this subroutine)
  423. RTS ; /
  424.  
  425.  
  426. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  427. ; SUB_OFF_SCREEN
  428. ; This subroutine deals with sprites that have moved off screen
  429. ; It is adapted from the subroutine at $01AC0D
  430. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  431.  
  432. SPR_T12: db $40,$B0
  433. SPR_T13: db $01,$FF
  434. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  435. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  436. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  437. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  438.  
  439. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  440. BRA STORE_03 ; | (table entry to use on horizontal levels)
  441. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  442. BRA STORE_03 ; |
  443. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  444. BRA STORE_03 ; |
  445. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  446. BRA STORE_03 ; |
  447. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  448. BRA STORE_03 ; |
  449. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  450. BRA STORE_03 ; |
  451. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  452. STORE_03: STA $03 ; |
  453. BRA START_SUB ; |
  454. SUB_OFF_SCREEN_X0: STZ $03 ; /
  455.  
  456. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  457. BEQ RETURN_35 ; /
  458. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  459. AND #$01 ; |
  460. BNE VERTICAL_LEVEL ; /
  461. LDA $D8,x ; \
  462. CLC ; |
  463. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  464. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  465. ADC #$00 ; |
  466. CMP #$02 ; |
  467. BPL ERASE_SPRITE ; / ...erase the sprite
  468. LDA $167A,x ; \ if "process offscreen" flag is set, return
  469. AND #$04 ; |
  470. BNE RETURN_35 ; /
  471. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  472. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  473. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  474. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  475. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  476. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  477. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  478. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  479. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  480. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  481. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  482. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  483. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  484. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  485. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  486. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  487. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  488. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  489. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  490. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  491. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  492. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  493. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  494. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  495. CMP #$08 ; |
  496. BCC KILL_SPRITE ; /
  497. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  498. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  499. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  500. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  501. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  502. KILL_SPRITE: STZ $14C8,x ; erase sprite
  503. RETURN_35: RTS ; return
  504.  
  505. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, return
  506. AND #$04 ; |
  507. BNE RETURN_35 ; /
  508. LDA $13 ; \
  509. LSR A ; |
  510. BCS RETURN_35 ; /
  511. LDA $E4,x ; \
  512. CMP #$00 ; | if the sprite has gone off the side of the level...
  513. LDA $14E0,x ; |
  514. SBC #$00 ; |
  515. CMP #$02 ; |
  516. BCS ERASE_SPRITE ; / ...erase the sprite
  517. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  518. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  519. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  520. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  521. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  522. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  523. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  524. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  525. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  526. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  527. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  528. LDA.w $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  529. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  530. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  531. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  532. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  533. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  534. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  535. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  536. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  537. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  538. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  539. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  540. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  541.  
  542. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  543. ORA $186C,x ; |
  544. RTS ; / return
  545.  
  546. ;SUBHORZPOS
  547. ;==========
  548.  
  549. 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
  550. SEP #$20
  551. LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
  552. SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
  553. SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
  554. STA $0E ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
  555. LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
  556. SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
  557. BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
  558. INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
  559. LABEL16: RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642
  560.  
  561. Here is the code for kribo power up
  562.  
  563. ;kuribo powerup sprite
  564. ;by smkdan
  565.  
  566. ;REQUIRED
  567. !SHOEGEN = $04 ;set this to the sprite # that generated this sprite (if applicable)
  568.  
  569. ;sound effect
  570. !SHOELOSTSFX = $00 ;play what when shoe is lost? I forgot the # used in SMB3, but I know it's in the game
  571. !SHOELOSTSFXPORT = $1DFC
  572. !SHOEMOUNTSFX = $02 ;play when shoe is mounted
  573. !SHOEMOUNTSFXPORT = $1DF9
  574.  
  575. ;stuff
  576. !PROPRAM = $04
  577. !TEMP = $09
  578.  
  579. ;statuses
  580. !STATE = $C2 ;states, with the following masks
  581. !M_ACTIVE = $01 ;has mario touched the shoe and become powered up?
  582. !M_AIRBOOST = $02 ;has mario spent is mid-air boost?
  583. !M_CAPED = $04 ;was mario caped before touching?
  584. !M_FIRE = $08 ;was mario with fire before touching?
  585. !M_LOST = $10 ;shoe lost? (falling off screen)
  586. !M_LOSING = $20 ;set after 1 frame of lost
  587.  
  588. !MARIOTILE = $1570 ;tile to draw for Mario's head
  589.  
  590. ;othter stuff
  591. !MARIOHEADBLANK = $69
  592.  
  593.  
  594.  
  595. ;SPRITES THAT INTERACT AS NORMAL APPEAR AS 01
  596. MarioSprInteract:
  597. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00 ;$00-$0F
  598. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$10-$1F
  599. db $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $01 ;$20-$2F
  600. db $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00 ;$30-$3F
  601. db $00, $01, $01, $01, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$40-$4F
  602. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00 ;$50-$5F
  603. db $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $01, $00, $00 ;$60-$6F
  604. db $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01 ;$70-$7F
  605. db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01 ;$80-$8F
  606. db $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00 ;$90-$9F
  607. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$A0-$AF
  608. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00 ;$B0-$BF
  609. db $00, $01, $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $00, $00 ;$C0-$CF
  610. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$D0-$DF
  611. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$E0-$EF
  612. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$F0-$FF
  613.  
  614. ;CUSTOM SPRITES THAT INTERACT AS NORMAL APPEAR AS 01
  615. MarioSprInteractCustom:
  616. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$00-$0F
  617. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$10-$1F
  618. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$20-$2F
  619. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$30-$3F
  620. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$40-$4F
  621. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$50-$5F
  622. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$60-$6F
  623. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$70-$7F
  624. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$80-$8F
  625. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$90-$9F
  626. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$A0-$AF
  627. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$B0-$BF
  628. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$C0-$CF
  629. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$D0-$DF
  630. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$E0-$EF
  631. db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;$F0-$FF
  632.  
  633.  
  634. print "MAIN ",pc
  635. PHB
  636. PHK
  637. PLB
  638. JSR SpriteMain
  639. PLB
  640. RTL
  641.  
  642. print "INIT ",pc
  643. LDA #!MARIOHEADBLANK ;draw nothing where mario's head will be at start
  644. STA !MARIOTILE,x
  645.  
  646. RTL
  647.  
  648. SpriteMain:
  649. JSR SUB_OFF_SCREEN_X0
  650. JSR GET_DRAW_INFO
  651. JSR GFX ;draw sprite
  652.  
  653. LDA !STATE,x ;don't kill if it's lost
  654. BIT #!M_LOST
  655. BNE MarioNotDead
  656.  
  657. LDA $71 ;test mario animation
  658. CMP #$09
  659. BNE MarioNotDead
  660.  
  661. STZ $14C8,x ;mario died, get rid of shoe
  662.  
  663. MarioNotDead:
  664. JSR HandleAni
  665.  
  666. LDA $14C8,x
  667. CMP #$08
  668. BNE Return
  669. LDA $9D ;locked sprites?
  670. BNE Return
  671.  
  672. LDA !STATE,x ;test if mario has touched it yet
  673. BIT #!M_ACTIVE
  674. BNE PowerupActive
  675.  
  676. ;inactive powerup
  677. BIT #!M_LOST ;is lost?
  678. BEQ NotLost
  679.  
  680. ;lost
  681. BIT #!M_LOSING ;already ran lost code?
  682. BNE Speed ;just run speed code then
  683.  
  684. JSR HandleLostShoe ;code related to losing shoe
  685.  
  686. BRA Speed ;update speed
  687.  
  688. NotLost:
  689. JSL $01A7DC ;mario interact
  690. BCC NoMario
  691.  
  692. LDA #!M_ACTIVE ;set active powerup
  693. ORA !STATE,x
  694. STA !STATE,x
  695.  
  696. LDA #!SHOEMOUNTSFX ;play mounting sound
  697. STA !SHOEMOUNTSFXPORT
  698.  
  699. JSR HandleCape ;handle cape if needed
  700. JSR HandleFire ;handle fire if needed
  701.  
  702. RTS
  703.  
  704. NoMario:
  705. STZ $B6,x ;no speed while stationary
  706. Speed:
  707. JSL $01802A ;update the speed
  708. Return:
  709. RTS
  710.  
  711. ;=====
  712.  
  713. !MARIOHEADSMALL = $62
  714. !MARIOHEADBIG = $64
  715.  
  716. PowerupActive:
  717. JSR FixInteraction
  718. JSR CopyPositions
  719. JSR GFXSetup
  720. JSR MarioMotion
  721.  
  722. JSR HandleCape
  723. JSR HandleFire
  724.  
  725. JSR SpriteInteract
  726.  
  727. JSR MaskSound
  728.  
  729. RTS
  730.  
  731.  
  732. ;=====
  733.  
  734. HandleAni:
  735. LDA !STATE,x ;test for lost
  736. BIT #!M_LOST
  737. BNE .Return ;return if shoe is lost
  738.  
  739. LDA #$FF ;hide all mario
  740. STA $78
  741.  
  742. LDA $71 ;animation
  743. CMP #$01 ;01 = dieing
  744. BEQ .MushUpDown
  745. CMP #$02 ;02 = growing
  746. BEQ .MushUpDown
  747. CMP #$03 ;03 = cape powerup
  748. BEQ .Test ;show nothing
  749. CMP #$04 ;04 = fire powerup
  750. BEQ .Test ;show nothing
  751. CMP #$05 ;door/pipe exit
  752. BEQ .KillSelf
  753. CMP #$06 ;pipe exit
  754. BEQ .KillSelf
  755.  
  756. STZ $78 ;cancel hiding
  757.  
  758. RTS ;return if neither of these
  759.  
  760. .MushUpDown
  761. LDY #!MARIOHEADSMALL
  762. LDA $13 ;frame counter not tied to pause
  763. LSR A
  764. LSR A
  765. BIT #$01
  766. BNE .ShowSmall
  767. LDY #!MARIOHEADBIG
  768.  
  769. .ShowSmall
  770. TYA
  771. STA !MARIOTILE,x ;head to show as mario tile
  772.  
  773. .Test
  774. JSR TestFireUp ;handle both cases of powerup replacement
  775. JSR TestFlowerUp
  776.  
  777. .Return
  778. RTS
  779.  
  780. .KillSelf
  781. JSR HandleLostShoe
  782.  
  783. RTS
  784.  
  785. ;=====
  786.  
  787. TestFlowerUp:
  788. LDA !STATE,x ;already have cape?
  789. BIT #!M_CAPED
  790. CLC ;clc on no cape
  791. BEQ .Return ;test fire otherwise
  792.  
  793. LDA #$04 ;set cape to item
  794. STA $0DC2
  795.  
  796. SEC ;sec on cape
  797.  
  798. .Return
  799. RTS
  800.  
  801. ;=====
  802.  
  803. TestFireUp:
  804. LDA !STATE,x ;already have fire?
  805. BIT #!M_FIRE
  806. CLC ;clc on no fire
  807. BEQ .Return
  808.  
  809. LDA #$02 ;set fire to item
  810. STA $0DC2
  811.  
  812. SEC ;sec on fire
  813. .Return
  814. RTS
  815.  
  816. ;=====
  817.  
  818. HandleCape:
  819. LDA $19 ;test for cape powerup
  820. CMP #$02
  821. BNE .NoCape
  822.  
  823. LDA #!M_CAPED ;set caped flag
  824. ORA !STATE,x
  825. STA !STATE,x
  826.  
  827. LDA #$01 ;set normal big mario state
  828. STA $19
  829.  
  830. LDA #!M_FIRE ;clear fire flag because the powerup is not cape
  831. EOR #$FF
  832. AND !STATE,x
  833. STA !STATE,x ;new state without cape flag
  834.  
  835. .NoCape
  836. RTS
  837.  
  838. ;=====
  839.  
  840. HandleFire:
  841. LDA $19 ;test for fire
  842. CMP #$03
  843. BNE .NoFire
  844.  
  845. LDA #!M_FIRE ;set fire flag
  846. ORA !STATE,x
  847. STA !STATE,x
  848.  
  849. LDA #$01 ;set big mario
  850. STA $19
  851.  
  852. LDA #!M_CAPED ;clear cape flag because the powerup is not cape
  853. EOR #$FF
  854. AND !STATE,x
  855. STA !STATE,x ;new state without cape flag
  856.  
  857. .NoFire
  858. RTS
  859.  
  860. ;=====
  861.  
  862. HandleLostShoe:
  863. LDA #!MARIOHEADBLANK ;don't draw mario's head
  864. STA !MARIOTILE,x
  865.  
  866. LDA #$C0 ;set lost speed
  867. STA $AA,x
  868.  
  869. LDA !STATE,x ;set losing bit
  870. ORA #!M_LOSING
  871. STA !STATE,x
  872.  
  873. LDA $1686,x ;no object interaction, just fall offscreen
  874. ORA #$80
  875. STA $1686,x
  876.  
  877. LDY #$00 ;reset loop index
  878. LDA #$00 ;value to store
  879. .Loop
  880. STA $154C,y ;zero disable interaction flag
  881. INY ;next sprite
  882. CPY #$0C ;12 sprites
  883. BNE .Loop
  884.  
  885. LDA #$30 ;hurtmario sets invincibility timer to 30
  886. STA $1497
  887.  
  888. LDA !STATE,x ;test flowerup
  889. BIT #!M_FIRE
  890. BEQ .NoFire
  891.  
  892. LDA #$03 ;set fire
  893. STA $19
  894.  
  895. RTS
  896.  
  897. .NoFire
  898. BIT #!M_CAPED ;test cape
  899. BEQ .NoCape
  900.  
  901. LDA #$02 ;set cape
  902. STA $19
  903.  
  904. .NoCape
  905. RTS
  906.  
  907. ;=====
  908. ;SUBS
  909. ;=====
  910.  
  911. FixInteraction:
  912. LDA #$FF ;no block interaction
  913. STA $1497
  914.  
  915. STZ $140D
  916.  
  917. LDX #$00 ;set cape interaction disable + scenery to fool sprite thing
  918. .Loop
  919. LDA #$01
  920. STA $1FE2,x
  921. LDA $7FAB10,x ;test if it's a custom sprite
  922. BIT #$08
  923. BNE .Custom
  924.  
  925. ;standard
  926. LDY $9E,x ;load sprite #
  927. LDA MarioSprInteract,y
  928. EOR #$01 ;invert
  929. BRA .Store
  930. .Custom
  931. LDA $7FAB9E,x ;load sprite # custom
  932. TAY
  933. LDA MarioSprInteractCustom,y
  934. EOR #$01 ;invert
  935. .Store
  936. ASL A ;it's a counter, so x2
  937. STA $154C,x ;store to disbale interaction flag
  938.  
  939. INX ;next sprite
  940. CPX #$0C ;all 12
  941. BNE .Loop
  942.  
  943. LDX $15E9 ;restore sprite
  944.  
  945. RTS
  946. ;=====
  947.  
  948. CopyPositions:
  949. LDA $94
  950. STA $E4,x
  951. LDA $95
  952. STA $14E0,x
  953. LDA $96
  954. CLC
  955. ADC #$10 ;16px below
  956. STA $D8,x
  957. LDA $97
  958. ADC #$00 ;carry
  959. STA $14D4,x
  960.  
  961. RTS
  962. ;=====
  963.  
  964. GFXSetup:
  965. LDA #$FF ;hide all mario
  966. STA $78
  967.  
  968. LDA !STATE,x ;check for cape or flower power up
  969. BIT #!M_CAPED ;cape?
  970. BNE .Caped
  971. BIT #!M_FIRE ;fire?
  972. BNE .Fire
  973.  
  974. LDA $19 ;neither, load normal powerup
  975. BRA .SetPal
  976.  
  977. .Caped
  978. LDA #$02 ;cape power
  979. BRA .SetPal
  980. .Fire
  981. LDA #$03 ;fire power
  982. .SetPal
  983. ASL A ;as it was in all.log
  984. ORA $0DB3 ;player
  985. ASL A
  986. PHX
  987. TAX
  988. REP #$20
  989. LDA.l $00E2A2,x
  990. PLX
  991. STA $0D82 ;set palette address
  992. SEP #$20
  993.  
  994.  
  995. LDA #!MARIOHEADBLANK ;value to store if ducking
  996. LDY $73 ;load ducking flag
  997. BNE .Store
  998.  
  999. LDY #!MARIOHEADSMALL
  1000. LDA $19 ;test powerup
  1001. BEQ .SmallMario
  1002. LDY #!MARIOHEADBIG
  1003. .SmallMario
  1004. TYA
  1005. .Store
  1006. STA !MARIOTILE,x ;store head tile
  1007.  
  1008.  
  1009. LDA $15 ;load pad data
  1010. BIT #$01 ;right?
  1011. BNE Right
  1012. BIT #$02
  1013. BEQ NeitherLR
  1014. LDA #$01 ;set direction
  1015. STA $157C,x
  1016. RTS
  1017.  
  1018. Right:
  1019. STZ $157C,x ;set direction
  1020.  
  1021. NeitherLR:
  1022. RTS
  1023.  
  1024. ;=====
  1025.  
  1026. !YSPDBOUNCE = $24
  1027.  
  1028. MarioMotion:
  1029. LDA $77 ;test if mario is on ground
  1030. BIT #$04
  1031. BEQ InAir
  1032. BRA NoBoost ;go to ground section
  1033.  
  1034. InAir:
  1035. LDA !STATE,x ;has air boost already been spent?
  1036. BIT #!M_AIRBOOST
  1037. BNE NoBounce
  1038.  
  1039. LDA $16 ;test A and B
  1040. ORA $18
  1041. BIT #$80
  1042. BEQ NoBounce
  1043. Boost:
  1044. JSL $01AA33 ;boost speed
  1045. LDA !STATE,x
  1046. ORA #!M_AIRBOOST
  1047. STA !STATE,x
  1048. RTS
  1049.  
  1050. NoBoost:
  1051. LDA $16 ;test B and A
  1052. ORA $18
  1053. BIT #$80
  1054. BNE Boost
  1055.  
  1056. LDA $15 ;test L or R
  1057. BIT #$03
  1058. BEQ NoBounce
  1059.  
  1060. ;bounce it
  1061. LDA #!YSPDBOUNCE
  1062. EOR #$FF
  1063. INC A
  1064. STA $7D ;mario yspd
  1065.  
  1066. LDA #!M_AIRBOOST
  1067. EOR #$FF
  1068. AND !STATE,x
  1069. STA !STATE,x
  1070.  
  1071.  
  1072. NoBounce:
  1073. RTS
  1074.  
  1075. ;=====
  1076.  
  1077. SpriteInteract:
  1078. LDX #$00 ;reset loop index
  1079. .Loop
  1080. CPX $15E9 ;skip self
  1081. BEQ .NextSprite
  1082.  
  1083. LDA $14C8,x ;only if sprite isn't dead
  1084. BEQ .NextSprite
  1085. CMP #$04 ;and not dieing
  1086. BEQ .NextSprite
  1087.  
  1088. LDA $7FAB10,x ;standard or custom?
  1089. BIT #$08
  1090. BNE .Custom
  1091.  
  1092. ;standard
  1093. LDY $9E,x ;load sprite #
  1094. LDA MarioSprInteract,y
  1095. BRA .Test
  1096. .Custom
  1097. LDA $7FAB9E,x ;load sprite # custom
  1098. CMP #!SHOEGEN ;compare to shoe that generated (possibly)
  1099. BNE .NotShoe
  1100.  
  1101. LDA $14C8,x ;is falling?
  1102. CMP #$02
  1103. BEQ .NextSprite ;ignore dieing generator sprite
  1104.  
  1105. .NotShoe
  1106. TAY ;to Y index
  1107. LDA MarioSprInteractCustom,y
  1108. .Test
  1109. BNE .NextSprite ;01 means don't try clipping test for hurt / kill
  1110.  
  1111. TXY ;sprite X->Y
  1112. PHX
  1113. LDX $15E9 ;sprite index in X
  1114. JSR ClipTest ;do clipping
  1115. PLX
  1116. BCS .Return ;clipped = return
  1117.  
  1118. .NextSprite
  1119. INX ;next sprite
  1120. CPX #$0C ;12 sprites
  1121. BNE .Loop
  1122.  
  1123. .Return
  1124. LDX $15E9 ;restore sprite index
  1125. RTS
  1126.  
  1127. ;=====
  1128.  
  1129. ClipTest:
  1130. JSL $03B69F ;clipA
  1131. PHX
  1132. TYX
  1133. JSL $03B6E5 ;clipB
  1134. PLX
  1135. JSL $03B72B ;check contact between A and B
  1136. BCC .ClippingReturn ;no contact = don't set
  1137.  
  1138. REP #$20 ;adjust Y position
  1139. LDA $96
  1140. PHA
  1141. CLC
  1142. ADC.w #$0010 ;16px adjust, BROKEN, DOES NOTHING OR KILLS UNWANTEDLY
  1143. STA $96
  1144. SEP #$20
  1145.  
  1146. PHX
  1147. PHY
  1148. TYX
  1149. JSR SUB_VERT_POS
  1150. PLY
  1151. PLX
  1152.  
  1153. REP #$20 ;restore Yposition
  1154. PLA
  1155. STA $96
  1156. SEP #$20
  1157.  
  1158. ;BCC .ClippingReturn
  1159.  
  1160. LDA $14C8,y ;stunned = kill
  1161. CMP #$09
  1162. BEQ .Kill
  1163.  
  1164. LDA $7D ;test mario's Yspd
  1165. BMI .Lose
  1166. BEQ .Lose
  1167. CMP #$10 ;even on ground, there's a slight yspeed downward
  1168. BCC .Lose
  1169. BPL .Kill ;kill if falling
  1170.  
  1171. .Lose
  1172. PHX
  1173. LDX $15E9
  1174. LDA #!M_ACTIVE ;clear active mask
  1175. EOR #$FF
  1176. AND !STATE,x
  1177. ORA #!M_LOST ;set shoe lost
  1178. STA !STATE,x
  1179. PLX
  1180.  
  1181. LDA #!SHOELOSTSFX ;play shoe lost sound
  1182. STA !SHOELOSTSFXPORT
  1183.  
  1184. CLC
  1185.  
  1186. RTS
  1187.  
  1188. .Kill
  1189. JSR SUB_STOMP_PTS ;give points
  1190. LDA $1656,y ;set cloud of smoke dissappear
  1191. ORA #$80
  1192. STA $1656,y
  1193.  
  1194. LDA #$02 ;falling
  1195. STA $14C8,y
  1196.  
  1197. JSL $01AA33 ;boost speed
  1198.  
  1199. SEC ;set carry = processed
  1200.  
  1201. .ClippingReturn
  1202. RTS
  1203.  
  1204. ;=====
  1205.  
  1206. MaskSound:
  1207. LDA $1DFA ;test for mario jump
  1208. CMP #$01
  1209. BNE TryN1
  1210. STZ $1DFA ;wipe jump
  1211.  
  1212. TryN1:
  1213. LDA $1DF9 ;test for cape swipe
  1214. CMP #$0F
  1215. BNE TryN2
  1216. STZ $1DF9
  1217. TryN2:
  1218. LDA $1DFC ;test for spin jump
  1219. CMP #$04
  1220. BNE TryN3
  1221. STZ $1DFC
  1222.  
  1223. TryN3:
  1224. RTS
  1225.  
  1226. ;=====
  1227.  
  1228. SHOEFRAME:
  1229. db $4E, $60
  1230.  
  1231. GFX:
  1232. LDA $15F6,x ;properties...
  1233. STA !PROPRAM
  1234.  
  1235. LDA $157C,x ;direction...
  1236. BNE NoFlip
  1237.  
  1238. LDA #$40 ;set mirror
  1239. TSB !PROPRAM
  1240.  
  1241. NoFlip:
  1242. LDA $00 ;xpos
  1243. STA $0300,y
  1244. LDA $01 ;ypos
  1245. STA $0301,y
  1246. LDA $14 ;frame count to figure out shoe frame
  1247. LSR A
  1248. LSR A
  1249. LSR A
  1250. AND #$01
  1251. TAX
  1252. LDA SHOEFRAME,x
  1253. STA $0302,y
  1254. LDA !PROPRAM ;properties
  1255. ORA $64
  1256. STA $0303,y
  1257.  
  1258. LDX $15E9 ;restore sprite
  1259.  
  1260. ;draw mario head
  1261. LDA $00 ;same xpos
  1262. STA $0304,y
  1263.  
  1264. LDA $01 ;sub 16px from ypos
  1265. SEC
  1266. SBC #$10
  1267. STA $0305,y
  1268.  
  1269. LDA !MARIOTILE,x ;set tile to mario's head / cap
  1270. STA $0306,y
  1271.  
  1272. LDA $0313 ;grab palette
  1273. AND #$0E
  1274. ORA #$01 ;set page bit
  1275. PHY
  1276. LDY $157C,x ;test directions
  1277. BNE DrawLeft
  1278. ORA #$40 ;set flip
  1279. DrawLeft:
  1280. ORA $64
  1281. PLY
  1282. STA $0307,y ;copy to sprite properties
  1283.  
  1284. LDX $15E9 ;restore sprite index
  1285.  
  1286. LDY #$02 ;16x16
  1287. LDA #$01 ;2 tiles
  1288. JSL $01B7B3 ;reserve
  1289.  
  1290. RTS
  1291.  
  1292. ;=================
  1293. ;BORROWED ROUTINES
  1294. ;=================
  1295.  
  1296. STAR_SOUNDS:
  1297. db $00,$13,$14,$15,$16,$17,$18,$19
  1298.  
  1299. ;POINTS
  1300. ;======
  1301.  
  1302. SUB_STOMP_PTS: PHY ;
  1303. LDA $1697 ; \
  1304. CLC ; }
  1305. ADC $1626,x ; / some enemies give higher pts/1ups quicker??
  1306. INC $1697 ; increase consecutive enemies stomped
  1307. TAY ;
  1308. INY ;
  1309. CPY #$08 ; \ if consecutive enemies stomped >= 8 ...
  1310. BCS NO_SOUND ; / ... don't play sound
  1311. LDA STAR_SOUNDS,y ; \ play sound effect
  1312. STA $1DF9 ; /
  1313. NO_SOUND: TYA ; \
  1314. CMP #$08 ; | if consecutive enemies stomped >= 8, reset to 8
  1315. BCC NO_RESET ; |
  1316. LDA #$08 ; /
  1317. NO_RESET: JSL $02ACE5 ; give mario points
  1318. PLY ;
  1319. RTS ; return
  1320.  
  1321. ;GET_DRAW_INFO
  1322. ;==============
  1323.  
  1324. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1325. ; $B760 - graphics routine helper - shared
  1326. ; sets off screen flags and sets index to OAM
  1327. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1328.  
  1329. SPR_T1: db $0C,$1C
  1330. SPR_T2: db $01,$02
  1331.  
  1332. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  1333. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  1334. LDA $E4,x ; \
  1335. CMP $1A ; | set horizontal offscreen if necessary
  1336. LDA $14E0,x ; |
  1337. SBC $1B ; |
  1338. BEQ ON_SCREEN_X ; |
  1339. INC $15A0,x ; /
  1340.  
  1341. ON_SCREEN_X: LDA $14E0,x ; \
  1342. XBA ; |
  1343. LDA $E4,x ; |
  1344. REP #$20 ; |
  1345. SEC ; |
  1346. SBC $1A ; | mark sprite invalid if far enough off screen
  1347. CLC ; |
  1348. ADC.w #$0040 ; |
  1349. CMP.w #$0180 ; |
  1350. SEP #$20 ; |
  1351. ROL A ; |
  1352. AND #$01 ; |
  1353. STA $15C4,x ; /
  1354. BNE INVALID ;
  1355.  
  1356. LDY #$00 ; \ set up loop:
  1357. LDA $1662,x ; |
  1358. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  1359. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  1360. INY ; /
  1361. ON_SCREEN_LOOP: LDA $D8,x ; \
  1362. CLC ; | set vertical offscreen if necessary
  1363. ADC SPR_T1,y ; |
  1364. PHP ; |
  1365. CMP $1C ; | (vert screen boundry)
  1366. ROL $00 ; |
  1367. PLP ; |
  1368. LDA $14D4,x ; |
  1369. ADC #$00 ; |
  1370. LSR $00 ; |
  1371. SBC $1D ; |
  1372. BEQ ON_SCREEN_Y ; |
  1373. LDA $186C,x ; | (vert offscreen)
  1374. ORA SPR_T2,y ; |
  1375. STA $186C,x ; |
  1376. ON_SCREEN_Y: DEY ; |
  1377. BPL ON_SCREEN_LOOP ; /
  1378.  
  1379. LDY $15EA,x ; get offset to sprite OAM
  1380. LDA $E4,x ; \
  1381. SEC ; |
  1382. SBC $1A ; | $00 = sprite x position relative to screen boarder
  1383. STA $00 ; /
  1384. LDA $D8,x ; \
  1385. SEC ; |
  1386. SBC $1C ; | $01 = sprite y position relative to screen boarder
  1387. STA $01 ; /
  1388. RTS ; return
  1389.  
  1390. INVALID: PLA ; \ return from *main gfx routine* subroutine...
  1391. PLA ; | ...(not just this subroutine)
  1392. RTS ; /
  1393.  
  1394.  
  1395. ;SUBVERTPOS
  1396. ;==========
  1397.  
  1398. 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
  1399. LDA $96 ;A:25A1 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdiZCHC:0146 VC:085 00 FL:924
  1400. SEC ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0170 VC:085 00 FL:924
  1401. SBC $D8,x ;A:2546 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizCHC:0184 VC:085 00 FL:924
  1402. STA $0F ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0214 VC:085 00 FL:924
  1403. LDA $97 ;A:25D6 X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0238 VC:085 00 FL:924
  1404. SBC $14D4,x ;A:2501 X:0007 Y:0000 D:0000 DB:03 S:01EA P:envMXdizcHC:0262 VC:085 00 FL:924
  1405. BPL LABEL11 ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0294 VC:085 00 FL:924
  1406. INY ;A:25FF X:0007 Y:0000 D:0000 DB:03 S:01EA P:eNvMXdizcHC:0310 VC:085 00 FL:924
  1407. LABEL11: RTS ;A:25FF X:0007 Y:0001 D:0000 DB:03 S:01EA P:envMXdizcHC:0324 VC:085 00 FL:924
  1408.  
  1409.  
  1410. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1411. ; SUB_OFF_SCREEN
  1412. ; This subroutine deals with sprites that have moved off screen
  1413. ; It is adapted from the subroutine at $01AC0D
  1414. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1415.  
  1416. SPR_T12: db $40,$B0
  1417. SPR_T13: db $01,$FF
  1418. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  1419. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  1420. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  1421. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  1422.  
  1423. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  1424. BRA STORE_03 ; | (table entry to use on horizontal levels)
  1425. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  1426. BRA STORE_03 ; |
  1427. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  1428. BRA STORE_03 ; |
  1429. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  1430. BRA STORE_03 ; |
  1431. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  1432. BRA STORE_03 ; |
  1433. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  1434. BRA STORE_03 ; |
  1435. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  1436. STORE_03: STA $03 ; |
  1437. BRA START_SUB ; |
  1438. SUB_OFF_SCREEN_X0: STZ $03 ; /
  1439.  
  1440. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  1441. BEQ RETURN_35 ; /
  1442. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  1443. AND #$01 ; |
  1444. BNE VERTICAL_LEVEL ; /
  1445. LDA $D8,x ; \
  1446. CLC ; |
  1447. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  1448. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  1449. ADC #$00 ; |
  1450. CMP #$02 ; |
  1451. BPL ERASE_SPRITE ; / ...erase the sprite
  1452. LDA $167A,x ; \ if "process offscreen" flag is set, return
  1453. AND #$04 ; |
  1454. BNE RETURN_35 ; /
  1455. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  1456. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  1457. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  1458. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  1459. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  1460. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  1461. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  1462. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  1463. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  1464. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  1465. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  1466. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  1467. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  1468. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  1469. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  1470. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  1471. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  1472. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  1473. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  1474. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  1475. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  1476. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  1477. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  1478. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  1479. CMP #$08 ; |
  1480. BCC KILL_SPRITE ; /
  1481. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  1482. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  1483. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  1484. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  1485. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  1486. KILL_SPRITE: STZ $14C8,x ; erase sprite
  1487. RETURN_35: RTS ; return
  1488.  
  1489. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, return
  1490. AND #$04 ; |
  1491. BNE RETURN_35 ; /
  1492. LDA $13 ; \
  1493. LSR A ; |
  1494. BCS RETURN_35 ; /
  1495. LDA $E4,x ; \
  1496. CMP #$00 ; | if the sprite has gone off the side of the level...
  1497. LDA $14E0,x ; |
  1498. SBC #$00 ; |
  1499. CMP #$02 ; |
  1500. BCS ERASE_SPRITE ; / ...erase the sprite
  1501. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  1502. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  1503. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  1504. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  1505. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  1506. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  1507. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  1508. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  1509. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  1510. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  1511. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  1512. LDA.w $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  1513. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  1514. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  1515. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  1516. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  1517. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  1518. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  1519. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  1520. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  1521. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  1522. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  1523. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  1524. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  1525.  
  1526. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  1527. ORA $186C,x ; |
  1528. RTS ; / return
Advertisement
Add Comment
Please, Sign In to add comment