Advertisement
Romano338

Piranha sideways

Jul 30th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.33 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Sideways Piranha Plant, by mikeyk
  3. ;;
  4. ;; Description: A piranha plant that comes out of horizontal pipes.
  5. ;;
  6. ;; Uses first extra bit: YES
  7. ;; It's direction depends on the first extra bit. If it is set it will travel to the
  8. ;; right to come out of the pipe. Otherwise it will travel left to come out of the pipe.
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10.  
  11.  
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13. ; venus fire trap - initialization JSL
  14. ; align sprite to middle of pipe
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16.  
  17. print "INIT ",pc
  18. LDA !extra_bits,x
  19. AND #$04
  20. BNE +
  21. INC !E4,x
  22. INC !E4,x
  23. RTL
  24.  
  25. + DEC !E4,x
  26. DEC !E4,x
  27. RTL
  28.  
  29.  
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. ; venus fire trap - main JSL
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33.  
  34. print "MAIN ",pc
  35. PHB ; \
  36. PHK ; | main sprite function, just calls local subroutine
  37. PLB ; |
  38. JSR VENUS_CODE_START ; |
  39. PLB ; |
  40. RTL ; /
  41.  
  42.  
  43. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  44. ; venus fire trap main routine
  45. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  46.  
  47. X_SPEED: db $00,$F0,$00,$10 ;rest at bottom, moving up, rest at top, moving down
  48. TIME_IN_POS: db $22,$30,$22,$30 ;moving up, rest at top, moving down, rest at bottom
  49.  
  50.  
  51. VENUS_CODE_START: LDA !1594,x ;A:8E76 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0918 VC:051 00 FL:24235
  52. BNE LABEL24 ;A:8E00 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0950 VC:051 00 FL:24235
  53. LDA $64 ;A:8E00 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0966 VC:051 00 FL:24235
  54. PHA ;A:8E20 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdizcHC:0990 VC:051 00 FL:24235
  55. LDA !15D0,x ;A:8E20 X:0007 Y:0000 D:0000 DB:01 S:01F4 P:envMXdizcHC:1012 VC:051 00 FL:24235
  56. BNE LABEL23 ;A:8E00 X:0007 Y:0000 D:0000 DB:01 S:01F4 P:envMXdiZcHC:1044 VC:051 00 FL:24235
  57. LDA #$10 ;A:8E00 X:0007 Y:0000 D:0000 DB:01 S:01F4 P:envMXdiZcHC:1060 VC:051 00 FL:24235
  58. STA $64 ;A:8E10 X:0007 Y:0000 D:0000 DB:01 S:01F4 P:envMXdizcHC:1076 VC:051 00 FL:24235
  59. LABEL23: JSR SUB_GFX
  60. PLA ;A:003B X:0007 Y:00EC D:0000 DB:01 S:01F4 P:envMXdizcHC:1152 VC:054 00 FL:24235
  61. STA $64 ;A:0020 X:0007 Y:00EC D:0000 DB:01 S:01F5 P:envMXdizcHC:1180 VC:054 00 FL:24235
  62. LDA #$00
  63. LABEL24: %SubOffScreen() ; off screen routine
  64. LDA $9D ; \ if sprites locked, return
  65. BNE RETURN27 ; /
  66. LDA !1594,x ;A:0000 X:0007 Y:00EC D:0000 DB:01 S:01F5 P:envMXdiZcHC:0538 VC:055 00 FL:24235
  67. BNE LABEL25 ;A:0000 X:0007 Y:00EC D:0000 DB:01 S:01F5 P:envMXdiZcHC:0570 VC:055 00 FL:24235
  68. JSL $01803A ; 8FC1 wrapper - A:0000 X:0007 Y:00EC D:0000 DB:01 S:01F5 P:envMXdiZcHC:0586 VC:055 00 FL:24235 calls A40D then A7E4
  69.  
  70. LABEL25: LDA !C2,x ;A:0001 X:0007 Y:0007 D:0000 DB:01 S:01F5 P:envMXdizcHC:1270 VC:056 00 FL:24235
  71. AND #$03 ;A:0000 X:0007 Y:0007 D:0000 DB:01 S:01F5 P:envMXdiZcHC:1300 VC:056 00 FL:24235
  72. TAY ;A:0000 X:0007 Y:0007 D:0000 DB:01 S:01F5 P:envMXdiZcHC:1316 VC:056 00 FL:24235
  73. LDA !1540,x ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:1330 VC:056 00 FL:24235
  74. BEQ LABEL28 ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:1362 VC:056 00 FL:24235
  75.  
  76. LDA X_SPEED,y ; \ set x speed
  77. STA !B6,x ; /
  78.  
  79. LDA !extra_bits,x ; invert x speed if extra bits set
  80. AND #$04
  81. BEQ NO_FLIP2
  82. LDA !B6,x
  83. EOR #$FF
  84. INC A
  85. STA !B6,x
  86.  
  87. NO_FLIP2: STZ !AA,x
  88.  
  89.  
  90. ;JSL $01801A ; ABD8 wrapper - A:00F0 X:0007 Y:001A D:0000 DB:01 S:01F5 P:eNvMXdizcHC:0824 VC:097 00 FL:24268 stays in pipe w/o, has long
  91. JSL $01802A
  92. LDA !D8,x
  93. AND #$F0
  94. ORA #$08
  95. STA !D8,x
  96. RETURN27: RTS ;A:00FF X:0007 Y:00FF D:0000 DB:01 S:01F5 P:eNvMXdizcHC:0488 VC:098 00 FL:24268
  97.  
  98. LABEL28: LDA !C2,x ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0016 VC:057 00 FL:24235
  99. AND #$03 ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0046 VC:057 00 FL:24235
  100. STA $00 ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0062 VC:057 00 FL:24235
  101. BNE LABEL29 ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0086 VC:057 00 FL:24235
  102. %SubHorzPos() ;A:0000 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZcHC:0102 VC:057 00 FL:24235 nothing w/o
  103. LDA $0F ;A:00FF X:0007 Y:0001 D:0000 DB:01 S:01F5 P:envMXdizcHC:0464 VC:057 00 FL:24235
  104. CLC ;A:00B8 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:eNvMXdizcHC:0488 VC:057 00 FL:24235
  105. ADC #$1B ;A:00B8 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:eNvMXdizcHC:0502 VC:057 00 FL:24235
  106. CMP #$37 ;A:00D3 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:eNvMXdizcHC:0518 VC:057 00 FL:24235
  107. LDA #$01 ;A:00D3 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:eNvMXdizCHC:0534 VC:057 00 FL:24235
  108. STA !1594,x ;A:0001 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:envMXdizCHC:0550 VC:057 00 FL:24235
  109. ;BCC LABEL30 ;A:0001 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:envMXdizCHC:0582 VC:057 00 FL:24235
  110. LABEL29: STZ !1594,x ;A:0001 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:envMXdizCHC:0598 VC:057 00 FL:24235
  111. LDY $00 ;A:0001 X:0007 Y:0001 D:0000 DB:01 S:01F5 P:envMXdizCHC:0630 VC:057 00 FL:24235
  112. LDA TIME_IN_POS,y ;A:0001 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdiZCHC:0654 VC:057 00 FL:24235
  113. STA !1540,x ;A:0020 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdizCHC:0686 VC:057 00 FL:24235
  114. INC !C2,x ;A:0020 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdizCHC:0718 VC:057 00 FL:24235
  115. LABEL30: RTS ;A:0020 X:0007 Y:0000 D:0000 DB:01 S:01F5 P:envMXdizCHC:0762 VC:057 00 FL:24235
  116.  
  117.  
  118. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  119. ; graphics routine
  120. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  121.  
  122. TILEMAP: db $A4,$A0,$A4,$A2,$A4,$A0,$A4,$A2
  123. HORIZ_DISP: db $00,$10,$00,$10,$10,$00,$10,$00
  124. PROPERTIES: db $4B,$49,$4B,$49,$0B,$09,$0B,$09 ;xyppccct format
  125.  
  126. SUB_GFX: %GetDrawInfo() ; after: Y = index to sprite tile map ($300)
  127. ; $00 = sprite x position relative to screen boarder
  128. ; $01 = sprite y position relative to screen boarder
  129. LDA !1540,x ; \
  130. LSR A
  131. LSR A
  132. LSR A
  133. AND #$01
  134. ASL A
  135. STA $03 ; /
  136. LDA !157C,x ; \ $02 = sprite direction
  137. AND #$01 ; |
  138. STA $02 ; /
  139. PHX ; push sprite index
  140.  
  141. LDA !extra_bits,x
  142. AND #$04
  143. BNE NOT_EXTRA
  144. LDA $03
  145. CLC
  146. ADC #$04
  147. STA $03
  148. NOT_EXTRA:
  149.  
  150. LDX #$01 ; loop counter = (number of tiles per frame) - 1
  151. LOOP_START: PHX ; push current tile number
  152. TXA ; \ X = index to horizontal displacement
  153. ORA $03 ; / get index of tile (index to first tile of frame + current tile number)
  154. TAX
  155.  
  156. LDA $00 ; \ tile x position = sprite x location ($00)
  157. CLC ; |
  158. ADC HORIZ_DISP,x ; |
  159. STA $0300|!Base2,y ; /
  160.  
  161. LDA $01 ; | tile y position = sprite y location ($01) + tile displacement
  162. STA $0301|!Base2,y ; /
  163.  
  164. LDA TILEMAP,x ; \ store tile
  165. STA $0302|!Base2,y ; /
  166.  
  167. LDA PROPERTIES,x ; \ get tile PROPERTIES
  168. ORA $64 ; |
  169. STA $0303|!Base2,y ; / store tile PROPERTIES
  170.  
  171. TYA ; \ get index to sprite property map ($460)...
  172. LSR A ; | ...we use the sprite OAM index...
  173. LSR A ; | ...and divide by 4 because a 16x16 tile is 4 8x8 tiles
  174. TAX ; |
  175. LDA #$02 ; | else show a full 16 x 16 tile
  176. STA $0460|!Base2,x ; /
  177.  
  178. PLX ; \ pull, X = current tile of the frame we're drawing
  179. INY ; | increase index to sprite tile map ($300)...
  180. INY ; | ...we wrote 1 16x16 tile...
  181. INY ; | ...sprite OAM is 8x8...
  182. INY ; | ...so increment 4 times
  183. DEX ; | go to next tile of frame and loop
  184. BPL LOOP_START ; /
  185.  
  186. PLX ; pull, X = sprite index
  187. LDY #$FF ; \ why FF? (460 &= 2) 8x8 tiles maintained
  188. LDA #$01 ; | A = number of tiles drawn - 1
  189. JSL $01B7B3 ; / don't draw if offscreen
  190. RTS ; return
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement