Advertisement
MolSno

wiz.asm

Jan 15th, 2015
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.79 KB | None | 0 0
  1. !mario_color = $5C
  2. !MarioPalette = $7F9E00
  3.  
  4. !ptile_sprnum = $02
  5.  
  6. ; Internal defines.
  7. ; Used to make code readable, nothing else: don't fiddle with them.
  8.  
  9. !state = $C2
  10. !pose = $1510
  11. !ptile_count = $157C
  12. !gfxframe = $151C
  13. !waittime = $1540
  14. !vislvl = $1504
  15. !yposl = $D8
  16. !xposl = $E4
  17. !xposh = $14E0
  18. !yposh = $14dD4
  19. !xspd = $B6
  20. !yspd = $AA
  21. !hp = $1528
  22. !hit_timer = $154C
  23.  
  24. print "INIT ", pc
  25. Init:
  26. LDA #$00 : STA !mario_color
  27. LDA #$05 : STA !hp,x
  28. LDA #$07 : STA !vislvl,x
  29. LDA #$01 : STA !state,x
  30. STA !pose,x
  31. RTL
  32.  
  33. print "MAIN ", pc
  34. PHB
  35. PHK : PLB
  36. JSR Main
  37. PLB
  38. RTL
  39.  
  40. mario_ctable:
  41. dw $7FFF, $7FFF, $7FFF, $7FFF ; unused
  42. dw $03E0, $1745, $2EAB, $4210 ; green
  43. dw $01FF, $14BA, $2D75, $4210 ; red
  44. dw $7C00, $68A5, $556B, $4210 ; blue
  45.  
  46. Main:
  47. LDA !mario_color : ASL : TAY : REP #$20 : LDA mario_ctable,y : STA !MarioPalette : SEP #$20
  48. LDA !hit_timer,x : AND #$02 : BEQ .nohit
  49. .hit
  50. LDA !vislvl,x : PHA : ORA #$04 : STA !vislvl,x : BRA .dur
  51. .nohit
  52. LDA !vislvl,x : PHA
  53. .dur
  54. ; horrible, hacky shit to fake jsr (addr,x) without using x
  55. STZ $08
  56. LDA !pose,x
  57. REP #$20
  58. PEA.w .retpgfx-1
  59. ASL : TAY : LDA gfxrtnptr,y
  60. PHA : SEP #$20 : RTS
  61. .retpgfx
  62. PLA : STA !vislvl,x
  63. LDA $9D : BNE .endmain
  64. LDA !state,x
  65. REP #$20
  66. PEA.w .retpmain-1
  67. ASL : TAY : LDA mainrtnptr,y
  68. PHA : SEP #$20 : RTS
  69. .retpmain
  70. .endmain
  71. RTS
  72.  
  73. gfxrtnptr:
  74. dw dead_gfx-1
  75. dw float_gfx-1
  76. dw attack_gfx-1
  77.  
  78. mainrtnptr:
  79. dw dead-1
  80. dw fadein-1
  81. dw floatinit-1
  82. dw float-1
  83. dw fadeout-1
  84. dw teleport-1
  85. dw wait-1
  86. dw fadein-1
  87. dw attack_init-1
  88. dw attack-1
  89. dw floatinit-1
  90. dw float-1
  91. dw fadeout-1
  92. dw teleport-1
  93. dw wait-1
  94. dw restart-1
  95.  
  96.  
  97. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  98. ;; MAIN ROUTINES
  99. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  100.  
  101. dead:
  102. STZ !hit_timer,x ;\
  103. LDA #$08 : STA $18BD ; | Boss dead routine.
  104. LDA !hp,x ; | Basically:
  105. CMP #$0F : BCC .bigcircle ; | -Generate rainbow circle
  106. CMP #$40 : BEQ .tport ; | -Teleport
  107. BCS .reallydone ;/ -Done
  108. .whitescreen
  109. LDA #$10 : TRB $0D9F
  110. INC !hp,x
  111. RTS
  112.  
  113. .tport
  114. LDA #$06 : STA $71
  115. STZ $88
  116. STZ $89
  117. .reallydone
  118. RTS
  119.  
  120. .bigcircle
  121. REP #$10
  122. LDY #$3202 : STY $4340
  123. LDY.w #rainbow_table : STY $4342
  124. LDA.b #rainbow_table>>16 : STA $4344
  125. SEP #$10
  126. LDA #$10 : TSB $0D9F
  127.  
  128. LDA #$40 : STA $212E
  129. LDA #$23 : STA $40
  130. LDA #$22 : STA $41 : STA $42 : STA $43
  131. LDA #$10 : STA $44
  132.  
  133. LDA $1433 : LSR #4 : STA.l $7FC070
  134. STA !hp,x
  135. INC $1433 : INC $1433
  136.  
  137. LDA !xposl,x : CLC : ADC #$10 : STA $00
  138.  
  139. LDA $FFFFFF
  140. LDA !yposl,x : CLC : ADC #$10
  141. CMP #$70 : BCS .turd : LDA #$70
  142. .turd
  143. STA $01
  144.  
  145. LDA $14 : LSR : BCC .ret
  146. REP #$30 : PHX
  147. LDA #$CB12 : STA $04 : STA $06 : SEP #$30
  148. PHB : LDA #$80 : PHA : PLB
  149. PHK : PEA.w .retp-1
  150. PEA.w $974F-1 ; set up long return for short subroutine
  151. LDA $01
  152. JML $00CA88|$800000
  153. .retp
  154. PLB : REP #$10 : PLX
  155. SEP #$30
  156. .ret
  157. RTS
  158.  
  159. restart:
  160. LDA #$07 : STA !vislvl,x
  161. LDA #$01 : STA !state,x
  162. RTS
  163.  
  164. floatinit:
  165. LDA #$60 : STA !waittime,x
  166. INC !state,x
  167. float:
  168. LDA #$01 : STA !pose,x
  169. LDA !waittime,x : BNE + : INC !state,x : +
  170. JSR collision
  171. RTS
  172.  
  173. attack_init:
  174. ; get a random number between $01-$06
  175. ; and use it as a projectile count
  176. JSL $01ACF9
  177. STZ $4204 : LDA $148D : STA $4205
  178. LDA #$05 : STA $4206
  179. JSR divwait
  180. LDA $4216 : INC
  181. STA !ptile_count,x
  182. LDA #15 : STA !waittime,x
  183. INC !state,x
  184. RTS
  185.  
  186. attack:
  187. LDA #$02 : STA !pose,x
  188. LDA !waittime,x : BNE .no_ptile
  189. .prep_ptile
  190. ; find free sprite slot
  191. LDY #$09
  192. - LDA $14C8,y : BEQ .make_ptile ; find a free sprite slot...
  193. DEY : BPL - : BMI .state_handle ; if there isn't one, don't fire
  194. .make_ptile
  195. JSL $01ACF9 ; random
  196. LDA #$20 : JSR Magikoopa_Aim
  197. PHX
  198. TYX : JSL $07F7D2 : JSL $0187A7
  199. LDA #$01 : STA $14C8,y
  200. LDA #!ptile_sprnum : STA $7FAB9E,x
  201. LDA #$88 : STA $7FAB10,x : STA $7FAB1C,x
  202. PLX
  203. LDA !xposl,x : STA.w !xposl,y
  204. LDA !xposh,x : STA !xposh,y
  205. LDA !yposl,x : STA.w !yposl,y
  206. LDA !yposh,x : STA !yposh,y
  207. LDA $148D : AND #$07 : CMP #$04 : BCS .color
  208. .gray
  209. LDA #$00 : STA $1510,y
  210. .color
  211. AND #$03 : STA $1510,y
  212. .state_handle
  213. DEC !ptile_count,x : BEQ .changestate
  214. LDA #15 : STA !waittime,x
  215. BRA .ret
  216. .changestate
  217. LDA #60 : STA !waittime,x
  218. INC !state,x
  219. BRA .ret
  220. .no_ptile
  221. .ret
  222. JSR collision
  223. RTS
  224.  
  225. collision: ; Collide and interact with Mario.
  226. ; preserve x and y pos before moving to float
  227. LDA !hit_timer,x : BNE .ret
  228. LDA !xposh,x : PHA : XBA : LDA !xposl,x : PHA
  229. ; $00=xpos
  230. REP #$20 : STA $00 : SEP #$20
  231. LDA !yposh,x : PHA : XBA : LDA !yposl,x : PHA
  232. ; offset the y pos to match the floating
  233. JSR framesine : LSR #4 : STA $02 : STZ $03
  234. LDA !yposh,x : XBA : LDA !yposl,x
  235. ; $02=ypos
  236. REP #$20 : CLC : ADC $02 : STA $02 : SEP #$20
  237. STA !yposl,x : XBA : STA !yposh,x
  238. JSL $01A7DC
  239. BCC .notouch
  240. .touch
  241. LDA $0E : CMP #$E6 : BPL .spritewins
  242. .playerwins
  243. JSL $01AA33
  244. JSL $01AB99
  245. LDA #$13 : STA $1DF9
  246. LDA #30 : STA !hit_timer,x
  247. DEC !hp,x : BNE .notouch
  248. STZ !hp,x : STZ !state,x : STZ !pose,x
  249. BRA .notouch
  250. .spritewins
  251. JSL $00F5B7
  252. .notouch
  253. ; restore x and y pos
  254. PLA : STA !yposl,x : PLA : STA !yposh,x
  255. PLA : STA !xposl,x : PLA : STA !xposh,x
  256. .ret
  257. RTS
  258.  
  259. teleport:
  260. LDA #$02 : STA !pose,x
  261. ; get a random number between $10-$E0
  262. JSL $01ACF9
  263. STZ $4204 : LDA $148D : STA $4205
  264. LDA #$D0 : STA $4206
  265. JSR divwait
  266. LDA #$10 : CLC : ADC $4216
  267. ; use it as our xpos
  268. STA !xposl,x
  269. ; get a random number between $10-$D0
  270. JSL $01ACF9
  271. STZ $4204 : LDA $148D : STA $4205
  272. LDA #$C0 : STA $4206
  273. JSR divwait
  274. LDA #$10 : CLC : ADC $4216
  275. ; use it as our ypos
  276. STA !yposl,x
  277. ; then we're done with this!
  278. LDA #60 : STA !waittime,x
  279. INC !state,x
  280. RTS
  281.  
  282. fadeout:
  283. LDA $14 : AND #$03 : BNE .ret
  284. INC !vislvl,x : LDA !vislvl,x : CMP #$07 : BNE .noend
  285. ; if that puts visiblity at full, this state is done
  286. INC !state,x
  287. .noend
  288. LDA !vislvl,x : CMP #$04 : BCS .nocollide ; collide if he's visible enough
  289. JSR collision
  290. .nocollide
  291. .ret
  292. RTS
  293.  
  294. fadein:
  295. LDA #$01 : STA !pose,x
  296. LDA $14 : AND #$03 : BNE .ret
  297. DEC !vislvl,x : LDA !vislvl,x : BNE .noend
  298. ; if that puts visiblity at 0, this state is done
  299. INC !state,x
  300. .noend
  301. LDA !vislvl,x : CMP #$04 : BCS .nocollide ; collide if he's visible enough
  302. JSR collision
  303. .nocollide
  304. .ret
  305. RTS
  306.  
  307. wait:
  308. LDA !waittime,x : BNE .time
  309. .timeup
  310. INC !state,x
  311. .time
  312. RTS
  313.  
  314. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  315. ;; GRAPHICS ROUTINES
  316. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  317. ; Throughout these routines, $08 is used as a tile counter.
  318. ; $07 is used as a loop counter when x is not available.
  319.  
  320. body_xoffsets:
  321. db $00,$10,$00,$10
  322. body_xoffsets_l:
  323. db $00,$10,$00,$10
  324. body_yoffsets:
  325. db $00,$00,$10,$10
  326. hand_xoffsets_r:
  327. db $00,$10
  328. hand_xoffsets_l:
  329. db $00,$10
  330.  
  331. attack_gfx:
  332.  
  333.  
  334. float_gfx:
  335. LDA $9D : BNE +
  336. INC !gfxframe,x
  337. +
  338. dead_gfx:
  339. JSR GET_DRAW_INFO
  340. LDA #$06 : STA $04
  341. JSR body_draw
  342.  
  343. LDY #$02 : LDA $08 : JSL $01B7B3
  344. no_gfx:
  345. RTS
  346.  
  347. body_draw:
  348. PHX
  349. LDX #$03
  350. .loop
  351. LDA $04 : STA $0302,y
  352. LDA #$29 : STA $0303,y
  353. LDA $00 : CLC : ADC body_xoffsets,x : STA $0300,y
  354. JSR framesine : LSR #5
  355. CLC : ADC $01 : CLC : ADC body_yoffsets,x : STA $0301,y
  356. DEC $04 : DEC $04
  357. INC $08 : INY #4
  358. DEX : BPL .loop
  359. PLX
  360. JSR feet_draw
  361. JSR hand_draw
  362. JSR overlay
  363. RTS
  364.  
  365. feet_draw:
  366. LDA $00 : STA $0300,y
  367. CLC : ADC #$0D : STA $0304,y
  368. LDA #$46 : STA $0302,y : STA $0306,y
  369. LDA #$29 : STA $0303,y : STA $0307,y
  370.  
  371. ; move them vertically on a sine thing
  372. JSR framesine : LSR #4
  373. CLC : ADC $01
  374. CLC : ADC #$20
  375. STA $0301,y : STA $0305,y
  376.  
  377. INC $08 : INC $08
  378. TYA : CLC : ADC #$08 : TAY
  379. RTS
  380.  
  381. hand_draw:
  382. JSR framesine : LSR #5 : EOR #$FF : SEC : SBC #$06 : SEC : ADC $00 : STA $0300,y ; lhand xpos = body xpos - #$08 - framesine
  383. JSR framesine : LSR #5 : CLC : ADC $00 : CLC : ADC #$18 : STA $0304,y ; rhand xpos = body xpos + #$30 + framesine
  384. LDA #$08 : STA $0302,y ; lhand
  385. LDA #$0A : STA $0306,y ; rhand
  386. LDA #$23 : STA $0303,y : STA $0307,y
  387.  
  388. ; move them vertically on a sine thing
  389. JSR framesine : LSR #4
  390. CLC : ADC $01
  391. CLC : ADC #$18
  392. STA $0301,y : STA $0305,y
  393.  
  394. INC $08 : INC $08
  395. TYA : CLC : ADC #$08 : TAY
  396. RTS
  397.  
  398. overlay: ; Used once all the other graphics are done to (partially) hide the boss.
  399.  
  400. ; select overlay tile/whether to even draw overlay
  401. LDA !vislvl,x : BEQ .ret
  402. ASL : CLC : ADC #$60 : STA $0F
  403. PHX
  404.  
  405. ; draw overlay
  406. LDA $08 : STA $09 : INC : ASL #2 : STA $0A
  407. TYA : SEC : SBC $0A : TAX
  408. .loop
  409. LDA $0300,x : STA $0300,y
  410. LDA $0301,x : STA $0301,y
  411. LDA $0302,x : STA $0302,y
  412. LDA $0303,x : STA $0303,y
  413. LDA $0F : STA $0302,x
  414. LDA $0303,x : AND #$CF : STA $0303,x
  415. INX #4 : INY #4
  416. DEC $09 : BPL .loop
  417. .end
  418. ASL $08
  419. PLX
  420. .ret
  421. RTS
  422.  
  423. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  424. ;; MISC ROUTINES
  425. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  426.  
  427. divwait:
  428. NOP #4 ; waste time
  429. RTS
  430.  
  431. framesine: ; Fetch the sine of the current frame number>>1. Used for floating.
  432. PHX : REP #$30
  433. LDA !gfxframe,x : AND #$00FF : ASL : TAX : LDA $07F7DB,x
  434. LSR
  435. SEP #$30 : PLX
  436. RTS
  437.  
  438. ; Note here the totally different coding style. :P
  439. Magikoopa_Aim:
  440. CODE_01BF6A: STA $01
  441. PHX ;\ preserve sprite indexes of Magikoopa and magic
  442. PHY ;/
  443. JSR CODE_01AD42 ; $0E = vertical distance to Mario
  444. STY $02 ; $02 = vertical direction to Mario
  445. LDA $0E ;\ $0C = vertical distance to Mario, positive
  446. BPL CODE_01BF7C ; |
  447. EOR #$FF ; |
  448. CLC ; |
  449. ADC #$01 ; |
  450. CODE_01BF7C: STA $0C ;/
  451. JSR SUB_HORZ_POS ; $0F = horizontal distance to Mario
  452. STY $03 ; $03 = horizontal direction to Mario
  453. LDA $0F ;\ $0D = horizontal distance to Mario, positive
  454. BPL CODE_01BF8C ; |
  455. EOR #$FF ; |
  456. CLC ; |
  457. ADC #$01 ; |
  458. CODE_01BF8C: STA $0D ;/
  459. LDY #$00
  460. LDA $0D ;\ if vertical distance less than horizontal distance,
  461. CMP $0C ; |
  462. BCS CODE_01BF9F ;/ branch
  463. INY ; set y register
  464. PHA ;\ switch $0C and $0D
  465. LDA $0C ; |
  466. STA $0D ; |
  467. PLA ; |
  468. STA $0C ;/
  469. CODE_01BF9F: LDA #$00 ;\ zero out $00 and $0B
  470. STA $0B ; | ...what's wrong with STZ?
  471. STA $00 ;/
  472. LDX $01 ;\ divide $0C by $0D?
  473. CODE_01BFA7: LDA $0B ; |\ if $0C + loop counter is less than $0D,
  474. CLC ; | |
  475. ADC $0C ; | |
  476. CMP $0D ; | |
  477. BCC CODE_01BFB4 ; |/ branch
  478. SBC $0D ; | else, subtract $0D
  479. INC $00 ; | and increase $00
  480. CODE_01BFB4: STA $0B ; |
  481. DEX ; |\ if still cycles left to run,
  482. BNE CODE_01BFA7 ;/ / go to start of loop
  483. TYA ;\ if $0C and $0D was not switched,
  484. BEQ CODE_01BFC6 ;/ branch
  485. LDA $00 ;\ else, switch $00 and $01
  486. PHA ; |
  487. LDA $01 ; |
  488. STA $00 ; |
  489. PLA ; |
  490. STA $01 ;/
  491. CODE_01BFC6: LDA $00 ;\ if horizontal distance was inverted,
  492. LDY $02 ; | invert $00
  493. BEQ CODE_01BFD3 ; |
  494. EOR #$FF ; |
  495. CLC ; |
  496. ADC #$01 ; |
  497. STA $00 ;/
  498. CODE_01BFD3: LDA $01 ;\ if vertical distance was inverted,
  499. LDY $03 ; | invert $01
  500. BEQ CODE_01BFE0 ; |
  501. EOR #$FF ; |
  502. CLC ; |
  503. ADC #$01 ; |
  504. STA $01 ;/
  505. CODE_01BFE0: PLY ;\ retrieve Magikoopa and magic sprite indexes
  506. PLX ;/
  507. RTS ; return
  508.  
  509. SUB_HORZ_POS: LDY #$00
  510. LDA $94
  511. SEC
  512. SBC $E4,x
  513. STA $0F
  514. LDA $95
  515. SBC $14E0,x
  516. BPL LABEL16
  517. INY
  518. LABEL16: RTS
  519.  
  520. CODE_01AD42: LDY #$00
  521. LDA $D3
  522. SEC
  523. SBC !yposl,x
  524. STA $0E
  525. LDA $D4
  526. SBC !yposh,x
  527. BPL Return01AD53
  528. INY
  529. Return01AD53: RTS ; return
  530.  
  531. SPR_T1: db $0C,$1C
  532. SPR_T2: db $01,$02
  533.  
  534. GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
  535. STZ $15A0,x ; reset sprite offscreen flag, horizontal
  536. LDA $E4,x ; \
  537. CMP $1A ; | set horizontal offscreen if necessary
  538. LDA $14E0,x ; |
  539. SBC $1B ; |
  540. BEQ ON_SCREEN_X ; |
  541. INC $15A0,x ; /
  542.  
  543. ON_SCREEN_X: LDA $14E0,x ; \
  544. XBA ; |
  545. LDA $E4,x ; |
  546. REP #$20 ; |
  547. SEC ; |
  548. SBC $1A ; | mark sprite invalid if far enough off screen
  549. CLC ; |
  550. ADC #$0040 ; |
  551. CMP #$0180 ; |
  552. SEP #$20 ; |
  553. ROL A ; |
  554. AND #$01 ; |
  555. STA $15C4,x ; /
  556. BNE INVALID ;
  557.  
  558. LDY #$00 ; \ set up loop:
  559. LDA $1662,x ; |
  560. AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
  561. BEQ ON_SCREEN_LOOP ; | else, go through loop once
  562. INY ; /
  563. ON_SCREEN_LOOP: LDA $D8,x ; \
  564. CLC ; | set vertical offscreen if necessary
  565. ADC SPR_T1,y ; |
  566. PHP ; |
  567. CMP $1C ; | (vert screen boundry)
  568. ROL $00 ; |
  569. PLP ; |
  570. LDA $14D4,x ; |
  571. ADC #$00 ; |
  572. LSR $00 ; |
  573. SBC $1D ; |
  574. BEQ ON_SCREEN_Y ; |
  575. LDA $186C,x ; | (vert offscreen)
  576. ORA SPR_T2,y ; |
  577. STA $186C,x ; |
  578. ON_SCREEN_Y: DEY ; |
  579. BPL ON_SCREEN_LOOP ; /
  580.  
  581. LDY $15EA,x ; get offset to sprite OAM
  582. LDA $E4,x ; \
  583. SEC ; |
  584. SBC $1A ; | $00 = sprite x position relative to screen boarder
  585. STA $00 ; /
  586. LDA $D8,x ; \
  587. SEC ; |
  588. SBC $1C ; | $01 = sprite y position relative to screen boarder
  589. STA $01 ; /
  590. RTS ; return
  591.  
  592. INVALID: PLA ; \ return from *main gfx routine* subroutine...
  593. PLA ; | ...(not just this subroutine)
  594. RTS ; /
  595. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  596. ; SUB_OFF_SCREEN
  597. ; This subroutine deals with sprites that have moved off screen
  598. ; It is adapted from the subroutine at $01AC0D
  599. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  600.  
  601. SPR_T12: db $40,$B0
  602. SPR_T13: db $01,$FF
  603. SPR_T14: db $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
  604. db $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
  605. SPR_T15: db $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
  606. db $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes
  607.  
  608. SUB_OFF_SCREEN_X1: LDA #$02 ; \ entry point of routine determines value of $03
  609. BRA STORE_03 ; | (table entry to use on horizontal levels)
  610. SUB_OFF_SCREEN_X2: LDA #$04 ; |
  611. BRA STORE_03 ; |
  612. SUB_OFF_SCREEN_X3: LDA #$06 ; |
  613. BRA STORE_03 ; |
  614. SUB_OFF_SCREEN_X4: LDA #$08 ; |
  615. BRA STORE_03 ; |
  616. SUB_OFF_SCREEN_X5: LDA #$0A ; |
  617. BRA STORE_03 ; |
  618. SUB_OFF_SCREEN_X6: LDA #$0C ; |
  619. BRA STORE_03 ; | OMG YOU FOUND THIS HIDDEN z0mg place!111 you win a cookie!
  620. SUB_OFF_SCREEN_X7: LDA #$0E ; |
  621. STORE_03: STA $03 ; |
  622. BRA START_SUB ; |
  623. SUB_OFF_SCREEN_X0: STZ $03 ; /
  624.  
  625. START_SUB: JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
  626. BEQ RETURN_35 ; /
  627. LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
  628. AND #$01 ; |
  629. BNE VERTICAL_LEVEL ; /
  630. LDA $D8,x ; \
  631. CLC ; |
  632. ADC #$50 ; | if the sprite has gone off the bottom of the level...
  633. LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
  634. ADC #$00 ; |
  635. CMP #$02 ; |
  636. BPL ERASE_SPRITE ; / ...erase the sprite
  637. LDA $167A,x ; \ if "process offscreen" flag is set, return
  638. AND #$04 ; |
  639. BNE RETURN_35 ; /
  640. LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
  641. AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
  642. ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
  643. STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
  644. TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
  645. LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
  646. CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
  647. ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
  648. ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
  649. CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
  650. PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
  651. LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
  652. LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
  653. ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
  654. PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
  655. SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
  656. STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
  657. LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
  658. BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
  659. EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
  660. STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
  661. SPR_L31: LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
  662. BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
  663. ERASE_SPRITE: LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
  664. CMP #$08 ; |
  665. BCC KILL_SPRITE ; /
  666. LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
  667. CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
  668. BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
  669. LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
  670. STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
  671. KILL_SPRITE: STZ $14C8,x ; erase sprite
  672. RETURN_35: RTS ; return
  673.  
  674. VERTICAL_LEVEL: LDA $167A,x ; \ if "process offscreen" flag is set, return
  675. AND #$04 ; |
  676. BNE RETURN_35 ; /
  677. LDA $13 ; \
  678. LSR A ; |
  679. BCS RETURN_35 ; /
  680. LDA $E4,x ; \
  681. CMP #$00 ; | if the sprite has gone off the side of the level...
  682. LDA $14E0,x ; |
  683. SBC #$00 ; |
  684. CMP #$02 ; |
  685. BCS ERASE_SPRITE ; / ...erase the sprite
  686. LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
  687. LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
  688. AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
  689. STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
  690. TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
  691. LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
  692. CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
  693. ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
  694. ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
  695. CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
  696. PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
  697. LDA $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
  698. LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
  699. ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
  700. PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
  701. SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
  702. STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
  703. LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
  704. BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
  705. EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
  706. STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
  707. SPR_L38: LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
  708. BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
  709. BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490
  710.  
  711. SUB_IS_OFF_SCREEN: LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
  712. ORA $186C,x ; |
  713. RTS ; / return
  714.  
  715.  
  716. rainbow_table:
  717. db $01, $3f, $c0
  718. db $01, $40, $00
  719. db $01, $41, $00
  720. db $01, $42, $00
  721. db $01, $43, $00
  722. db $01, $43, $00
  723. db $01, $44, $00
  724. db $01, $45, $00
  725. db $01, $46, $00
  726. db $01, $46, $00
  727. db $01, $47, $00
  728. db $01, $48, $00
  729. db $01, $49, $00
  730. db $01, $49, $00
  731. db $01, $4a, $00
  732. db $01, $4b, $00
  733. db $01, $4c, $00
  734. db $01, $4c, $00
  735. db $01, $4d, $00
  736. db $01, $4e, $00
  737. db $01, $4f, $00
  738. db $01, $4f, $00
  739. db $01, $50, $00
  740. db $01, $51, $00
  741. db $01, $52, $00
  742. db $01, $52, $00
  743. db $01, $53, $00
  744. db $01, $54, $00
  745. db $01, $55, $00
  746. db $01, $55, $00
  747. db $01, $56, $00
  748. db $01, $57, $00
  749. db $01, $57, $00
  750. db $01, $58, $00
  751. db $01, $59, $00
  752. db $01, $5a, $00
  753. db $01, $5b, $00
  754. db $01, $5b, $00
  755. db $01, $5c, $00
  756. db $01, $5d, $00
  757. db $01, $5e, $00
  758. db $01, $5e, $00
  759. db $01, $5f, $00
  760. db $01, $3f, $5f
  761. db $01, $3e, $00
  762. db $01, $3e, $00
  763. db $01, $3d, $00
  764. db $01, $3c, $00
  765. db $01, $3b, $00
  766. db $01, $3a, $00
  767. db $01, $3a, $00
  768. db $01, $39, $00
  769. db $01, $38, $00
  770. db $01, $38, $00
  771. db $01, $37, $00
  772. db $01, $36, $00
  773. db $01, $35, $00
  774. db $01, $35, $00
  775. db $01, $34, $00
  776. db $01, $33, $00
  777. db $01, $32, $00
  778. db $01, $32, $00
  779. db $01, $31, $00
  780. db $01, $30, $00
  781. db $01, $2f, $00
  782. db $01, $2f, $00
  783. db $01, $2e, $00
  784. db $01, $2d, $00
  785. db $01, $2c, $00
  786. db $01, $2c, $00
  787. db $01, $2b, $00
  788. db $01, $2a, $00
  789. db $01, $29, $00
  790. db $01, $29, $00
  791. db $01, $28, $00
  792. db $01, $27, $00
  793. db $01, $26, $00
  794. db $01, $26, $00
  795. db $01, $25, $00
  796. db $01, $24, $00
  797. db $01, $23, $00
  798. db $01, $23, $00
  799. db $01, $22, $00
  800. db $01, $21, $00
  801. db $01, $20, $00
  802. db $01, $20, $00
  803. db $01, $80, $00
  804. db $01, $81, $00
  805. db $01, $82, $00
  806. db $01, $83, $00
  807. db $01, $83, $00
  808. db $01, $84, $00
  809. db $01, $85, $00
  810. db $01, $85, $00
  811. db $01, $86, $00
  812. db $01, $87, $00
  813. db $01, $88, $00
  814. db $01, $88, $00
  815. db $01, $89, $00
  816. db $01, $8a, $00
  817. db $01, $8b, $00
  818. db $01, $8c, $00
  819. db $01, $8c, $00
  820. db $01, $8d, $00
  821. db $01, $8e, $00
  822. db $01, $8e, $00
  823. db $01, $8f, $00
  824. db $01, $90, $00
  825. db $01, $91, $00
  826. db $01, $91, $00
  827. db $01, $92, $00
  828. db $01, $93, $00
  829. db $01, $94, $00
  830. db $01, $94, $00
  831. db $01, $95, $00
  832. db $01, $96, $00
  833. db $01, $97, $00
  834. db $01, $97, $00
  835. db $01, $98, $00
  836. db $01, $99, $00
  837. db $01, $9a, $00
  838. db $01, $9a, $00
  839. db $01, $9b, $00
  840. db $01, $9c, $00
  841. db $01, $9d, $00
  842. db $01, $9d, $00
  843. db $01, $9e, $00
  844. db $01, $9f, $00
  845. db $01, $5f, $9f
  846. db $01, $5e, $00
  847. db $01, $5e, $00
  848. db $01, $5d, $00
  849. db $01, $5c, $00
  850. db $01, $5b, $00
  851. db $01, $5a, $00
  852. db $01, $5a, $00
  853. db $01, $59, $00
  854. db $01, $58, $00
  855. db $01, $58, $00
  856. db $01, $57, $00
  857. db $01, $56, $00
  858. db $01, $55, $00
  859. db $01, $54, $00
  860. db $01, $54, $00
  861. db $01, $53, $00
  862. db $01, $52, $00
  863. db $01, $52, $00
  864. db $01, $51, $00
  865. db $01, $50, $00
  866. db $01, $4f, $00
  867. db $01, $4e, $00
  868. db $01, $4e, $00
  869. db $01, $4d, $00
  870. db $01, $4c, $00
  871. db $01, $4c, $00
  872. db $01, $4b, $00
  873. db $01, $4a, $00
  874. db $01, $49, $00
  875. db $01, $48, $00
  876. db $01, $48, $00
  877. db $01, $47, $00
  878. db $01, $46, $00
  879. db $01, $46, $00
  880. db $01, $45, $00
  881. db $01, $44, $00
  882. db $01, $43, $00
  883. db $01, $42, $00
  884. db $01, $42, $00
  885. db $01, $41, $00
  886. db $01, $40, $00
  887. db $01, $40, $00
  888. db $01, $20, $00
  889. db $01, $21, $00
  890. db $01, $22, $00
  891. db $01, $23, $00
  892. db $01, $23, $00
  893. db $01, $24, $00
  894. db $01, $25, $00
  895. db $01, $26, $00
  896. db $01, $26, $00
  897. db $01, $27, $00
  898. db $01, $28, $00
  899. db $01, $28, $00
  900. db $01, $29, $00
  901. db $01, $2a, $00
  902. db $01, $2b, $00
  903. db $01, $2b, $00
  904. db $01, $2c, $00
  905. db $01, $2d, $00
  906. db $01, $2e, $00
  907. db $01, $2f, $00
  908. db $01, $2f, $00
  909. db $01, $30, $00
  910. db $01, $31, $00
  911. db $01, $31, $00
  912. db $01, $32, $00
  913. db $01, $33, $00
  914. db $01, $34, $00
  915. db $01, $35, $00
  916. db $01, $35, $00
  917. db $01, $36, $00
  918. db $01, $37, $00
  919. db $01, $38, $00
  920. db $01, $38, $00
  921. db $01, $39, $00
  922. db $01, $3a, $00
  923. db $01, $3a, $00
  924. db $01, $3b, $00
  925. db $01, $3c, $00
  926. db $01, $3d, $00
  927. db $01, $3d, $00
  928. db $01, $3e, $00
  929. db $01, $3f, $00
  930. db $01, $3f, $9f
  931. db $01, $9e, $00
  932. db $01, $9e, $00
  933. db $01, $9d, $00
  934. db $01, $9c, $00
  935. db $01, $9b, $00
  936. db $01, $9b, $00
  937. db $01, $9a, $00
  938. db $01, $99, $00
  939. db $01, $98, $00
  940. db $01, $98, $00
  941. db $01, $97, $00
  942. db $01, $96, $00
  943. db $01, $95, $00
  944. db $01, $95, $00
  945. db $01, $94, $00
  946. db $01, $93, $00
  947. db $01, $92, $00
  948. db $01, $91, $00
  949. db $01, $91, $00
  950. db $01, $90, $00
  951. db $01, $8f, $00
  952. db $01, $8f, $00
  953. db $01, $8e, $00
  954. db $01, $8d, $00
  955. db $01, $8c, $00
  956. db $01, $8b, $00
  957. db $01, $8b, $00
  958. db $01, $8a, $00
  959. db $01, $89, $00
  960. db $01, $88, $00
  961. db $01, $88, $00
  962. db $01, $87, $00
  963. db $01, $86, $00
  964. db $01, $86, $00
  965. db $01, $85, $00
  966. db $01, $84, $00
  967. db $01, $83, $00
  968. db $01, $83, $00
  969. db $01, $82, $00
  970. db $01, $81, $00
  971. db $01, $80, $00
  972. db $01, $80, $00
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement