FRUIT.S 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. * FRUIT.S ROUTINES FOR THE FRUIT
  2. * MOVE THE FRUIT
  3. MOVEFRT JSR SETFRT ;SET NEXT FRUIT MOVE
  4. LDA FENABLE
  5. BEQ MFOUT
  6. LDA FSCORE
  7. BNE MFSCORE
  8. JSR FRTSOUND ;DO THE FRUIT SOUND, IF NEEDED
  9. JMP FRTDIR ;SET THE DIRECTION
  10. MFSCORE DEC FSCORE
  11. BNE MFOUT
  12. JMP CLEARFRT
  13. MFOUT RTS
  14. * SET THE NEXT FRUIT MOVE
  15. SETFRT LDA RTLOCAL+1
  16. CLC
  17. ADC #WAITFRT
  18. STA FRTWAIT
  19. RTS
  20. * THIS ROUTINE DOES THE BOUNCING SOUND FOR THE FRUIT
  21. FRTSOUND DEC FSOUND ;SEE IF TIME FOR SOUND YET
  22. BPL FSOUT
  23. LDA #$03 ;SET UP NEXT SOUND
  24. STA FSOUND
  25. LDA #$0B ;MAKE FRUIT BOUNCE NOISE
  26. JSR DOTUNE
  27. FSOUT RTS
  28. * THIS ROUTINE FINDS OUT WHAT DIRECTION TO MOVE
  29. FRTDIR LDA FCOUNT ;SEE IF IN 'CENTER' OF CHAR
  30. AND #$03
  31. BNE FDEND
  32. LDA FTUNNEL ;SEE IF FRUIT IN TUNNEL
  33. BNE FDEND
  34. LDA FZONE ;SEE IF WE HAVE REACHED THE GOAL
  35. CMP FGZONE
  36. BNE FDIRCONT
  37. LDA FCOL
  38. CMP FGCOL
  39. BNE FDIRCONT
  40. JSR FRTGOAL ;GET THE NEXT GOAL
  41. FDIRCONT LDX FZONE ;SET UP FOR CALL ON WHCHWAY
  42. STX TEMP4
  43. LDA FCOL
  44. STA TEMP5
  45. LDA FDIR
  46. STA TEMP6
  47. JSR CHECKDIR
  48. LDX FGZONE
  49. STX TEMP7
  50. LDA FGCOL
  51. STA TEMP8
  52. JSR WHCHWAY ;FIND OUT WHICH WAY TO GO
  53. STA FDIR ;NEW DIRECTION
  54. FDEND JMP FRTMOVE
  55. FDCLEAR JMP CLEARFRT
  56. * MOVE THE FRUIT
  57. FRTMOVE LDY FDIR
  58. LDX FOFF
  59. LDA FHPOS ;MOVE HORIZONTALLY
  60. JSR HPOSADJ
  61. STA FHPOS
  62. LDA FVPOS ;MOVE VERTICALLY
  63. JSR VPOSADJ
  64. STA FVPOS
  65. LDY FCOUNT
  66. LDA FVPOS ;MOVING VERTICALLY
  67. CLC
  68. ADC BOUNCTB,Y ;ADJUST FOR BOUNCE
  69. STA FVPOS
  70. DEY ;ADJUST COUNT
  71. BPL FMJMP0
  72. LDY #$03
  73. FMJMP0 STY FCOUNT
  74. LDA FHPOS ;SEE IF IN TUNNEL OR OFF SCREEN
  75. CMP #LEFTEDGE
  76. BCS FMCHKRGT
  77. CMP #LEFTWRAP
  78. BCS FMTUNNEL
  79. JMP CLEARFRT ;OFF SCREEN - KILL IT
  80. FMCHKRGT CMP #RGHTEDGE
  81. BCC FMNORMAL
  82. CMP #RGHTWRAP
  83. BCC FMTUNNEL
  84. JMP CLEARFRT ;OFF SCREEN - KILL IT
  85. FMTUNNEL LDA #$01 ;MOVING THROUGH TUNNEL
  86. STA FTUNNEL
  87. JMP FMZONE ;ADJUST ZONE, BUT NOT COLUMN, COL BOGUS
  88. FMNORMAL LDA #$00 ;MOVING AROUND MAZE
  89. STA FTUNNEL
  90. LDA FHPOS ;SET COLUMN
  91. JSR HTOC
  92. STA FCOL
  93. FMZONE LDA FVPOS ;SET ZONE
  94. JSR VTOZO
  95. INY
  96. STY FZONE
  97. STA FOFF
  98. JMP WRITEFRT
  99. * INITIALIZE THE FRUIT STATE
  100. INITFRT LDA FENABLE ;MAKE SURE FRUIT IS NOT ON YET
  101. BNE IFOUT
  102. LDA #$01
  103. STA FENABLE ;ENABLE
  104. STA FTUNNEL ;STARTING IN TUNNEL
  105. LDA #$00
  106. STA FGCOUNT
  107. STA FSCORE
  108. STA FSOUND
  109. LDA #$02
  110. STA FCOUNT
  111. LDA LEVEL ;SET FRUIT TYPE
  112. CMP #$08
  113. BMI IFCONT
  114. IFRAND JSR RAND ;RANDOM FRUIT
  115. AND #$07
  116. CMP STLEVEL
  117. BMI IFRAND ;NO RANDOM FRUIT BELOW WHAT YOU STARTED
  118. IFCONT STA FFRUIT
  119. JSR RAND ;RANDOM TUNNEL TO COME THROUGH
  120. AND #$01 ;SET STARTING ZONE
  121. STA TEMP0
  122. LDA RACK
  123. ASL A
  124. ORA TEMP0 ;A = 2*RACK + [0..1], INDEX TO TUNNEL
  125. TAX
  126. LDA #$02 ;SET OFFSET
  127. STA FOFF
  128. LDA TNLZONE,X ;SET ZONE
  129. STA FZONE
  130. JSR ZTOV
  131. SEC
  132. SBC #$04 ;SET VPOS
  133. STA FVPOS
  134. JSR RAND ;SET STARTING COLUMN/DIRECTION
  135. AND #$02 ;EITHER 0 (RIGHT) OR 2 (LEFT)
  136. STA FDIR ;SET DIR
  137. LSR A ;EITHER 0 (LEFT COL) OR 1 (RIGHT COL)
  138. TAX
  139. LDA TNLCOL,X
  140. STA FCOL ;SET COL
  141. LDA TNLHPOS,X
  142. STA FHPOS ;SET HPOS
  143. JSR FRTGOAL ;GET A GOAL
  144. JSR FRTSTAMP ;SET THE STAMP
  145. JSR WRITEFRT ;WRITE IT
  146. IFOUT LDA #$70
  147. STA FDOTS ;SET UP THE NEXT FRUIT
  148. RTS
  149. * THIS ROUTINE FINDS THE NEXT GOAL FOR THE FRUIT
  150. * RETURN VALUE IS BOTH 0 IN X AND THE EQ BIT SET WHEN NO MORE GOALS TO BE HAD
  151. FRTGOAL LDX FGCOUNT
  152. CPX #$04
  153. BPL FGOUT
  154. CPX #$03
  155. BPL FGLEAVE
  156. LDA GOALZONE,X ;GET NEXT GOAL
  157. STA FGZONE
  158. LDA GOALCOL,X
  159. STA FGCOL
  160. INX
  161. STX FGCOUNT
  162. RTS
  163. FGLEAVE JSR RAND ;GET A RANDOM TUNNEL TO LEAVE
  164. AND #$03 ; GET THE COLUMN FIRST
  165. STA TEMP0
  166. LDA RACK
  167. ASL A
  168. ASL A
  169. ORA TEMP0 ;A = 3*RACK + [0..3], INDEX TO TUNNEL
  170. TAY
  171. LDA TNLCOLG,Y
  172. STA FGCOL
  173. TYA ;GET THE ZONE
  174. LSR A
  175. TAY
  176. LDA TNLZONE,Y
  177. STA FGZONE
  178. INX
  179. STX FGCOUNT
  180. FGOUT RTS
  181. * CLEAR FRUIT
  182. CLEARFRT LDA #$00
  183. STA FENABLE
  184. * ERASE THE FRUIT
  185. ERASEFRT LDA #OFFSCRN ;SET HPOS AND DOLIST
  186. STA HPLIST+1
  187. STA DOLIST+1
  188. RTS
  189. * WRITE A FRUIT ON THE SCREEN
  190. WRITEFRT LDA FHPOS ;SET HPOS AND DOLIST
  191. SEC
  192. SBC #$03
  193. STA HPLIST+1
  194. LDX FZONE
  195. DEX
  196. STX VZLIST+1
  197. STA DOLIST+1
  198. RTS
  199. * PUT THE RIGHT FRUIT STAMPS INTO STAMPS
  200. FRTSTAMP LDX FFRUIT ;WHICH ONE IT IS
  201. LDA FLSTAMP,X ;SET STAMP
  202. STA SLLIST+1
  203. LDA FHSTAMP,X
  204. STA SHLIST+1
  205. LDY FPALETTE,X
  206. LDA FCOLOR1,Y ;SET PALETTE FOR FRUIT
  207. STA P2C1
  208. LDA FCOLOR2,Y
  209. STA P2C2
  210. LDA FCOLOR3,Y
  211. STA P2C3
  212. RTS
  213. * EAT THE FRUIT - MAKE IT GO AWAY
  214. EATFRT LDX FFRUIT
  215. LDA NLSTAMP,X ;SET STAMP
  216. STA SLLIST+1
  217. LDA NHSTAMP,X
  218. STA SHLIST+1
  219. STA DOLIST+1
  220. LDA #LTGREEN
  221. STA P2C3
  222. LDA #$10 ;SET TIME FOR IT TO STAY
  223. STA FSCORE
  224. LDA #$12 ;MAKE FRUIT EAT SOUND
  225. JSR DOTUNE
  226. RTS
  227. * TABLE TO CONTROL FRUIT BOUNCING
  228. BOUNCTB DB $FF,$FF,$01,$01
  229. * TABLES TO SET FRUIT STAMPS AND FRUIT NUMBER STAMPS
  230. FLSTAMP DB L(FRUITCHR),L(FRUITCHR+$18),L(FRUITCHR+$30)
  231. DB L(FRUITCHR+$48),L(FRUITCHR+$60),L(FRUITCHR+$78)
  232. DB L(FRUITCHR+$90),L(FRUITCHR+$A8)
  233. FHSTAMP DB H(FRUITCHR),H(FRUITCHR+$18),H(FRUITCHR+$30)
  234. DB H(FRUITCHR+$48),H(FRUITCHR+$60),H(FRUITCHR+$78)
  235. DB H(FRUITCHR+$90),H(FRUITCHR+$A8)
  236. NLSTAMP DB L(FRUITNUM),L(FRUITNUM+$18),L(FRUITNUM+$30)
  237. DB L(FRUITNUM+$48),L(FRUITNUM+$60),L(FRUITNUM+$78)
  238. DB L(FRUITNUM+$90),L(FRUITNUM+$A8)
  239. NHSTAMP DB H(FRUITNUM),H(FRUITNUM+$18),H(FRUITNUM+$30)
  240. DB H(FRUITNUM+$48),H(FRUITNUM+$60),H(FRUITNUM+$78)
  241. DB H(FRUITNUM+$90),H(FRUITNUM+$A8)
  242. * TABLES TO SET FRUIT COLORS
  243. FPALETTE DB 0,0,1,2,0,0,3,4
  244. FCOLOR1 DB RED,RED,ORANGE,GREEN,YELLOW
  245. FCOLOR2 DB WHITE,WHITE,BROWN,WHITE,BLACK
  246. FCOLOR3 DB BROWN,GREEN,GREEN,BROWN,BLACK
  247. * TABLES TO SET TUNNEL ENTRANCES
  248. TNLZONE DB $07,$10,$01,$16
  249. DB $08,$08,$0C,$0F
  250. TNLCOL DB $00,$1B
  251. TNLHPOS DB LEFTWRAP,RGHTWRAP
  252. TNLCOLG DB $02,$19,$02,$19,$05,$16,$02,$19
  253. DB $00,$1B,$00,$1B,$03,$18,$03,$18
  254. * TABLES FOR FRUIT GOALS
  255. GOALZONE DB $10,$0A,$10
  256. GOALCOL DB $0F,$10,$0F