home *** CD-ROM | disk | FTP | other *** search
/ Ahoy 1985 November / Ahoy_Magazine_85-11_1985_Double_L.d64 / starship (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  18KB  |  451 lines

  1. 1 rem      ***  starship  ***
  2. 2 rem machine language sprite movement
  3. 4 rem ** move top of memory to make room for video block at 32768
  4. 5 poke 55,255:poke 56,127:poke 643,255:poke 644,127:print "[147]"
  5. 6 rem ** declare primary variables
  6. 7 f$=" ":c0%=0:c1%=0:c2%=0:c3%=0:c4%=0:c5%=0:c6%=0:sp%=0
  7. 8 def fn pg(x)=int(x/256):def fn lo(x)=x-256*(int(x/256))
  8. 9 rem      *** set-up subroutines ***
  9. 10 gosub 90:gosub 600:rem (video memory)
  10. 12 print "[147]";:gosub 95:gosub 700:gosub 2000:rem (machine language and sprites)
  11. 13 gosub 900:rem (sprite positions and game screen)
  12. 14 sys 38067:rem (start interrupt!)
  13. 15 rem ** enable sprites
  14. 16 for i=0 to 29:next:poke es,31:rem (sprites 0-4)
  15. 17 goto 100
  16. 19 rem ** load subroutine
  17. 20 for i=xb to xe:read a:poke i,a:next:print ".[146]";:return
  18. 89 rem turn off screen
  19. 90 poke 53265,0:return
  20. 94 rem turn on screen (and extended background color text mode)
  21. 95 poke 53265,91:return
  22. 98 rem      *** action loop ***
  23. 100 k=peek(653):if k=7 then 300
  24. 110 for i=1 to 4:sp%=i:sys 38336:next
  25. 115 print "                      "
  26. 120 on c0% gosub 200:c0%=0:c4%=0:c5%=0:c6%=0
  27. 125 for i=1 to 4:sp%=i:sys 38336:next
  28. 130 if c1%>0 then gosub 220:c1%=0
  29. 135 if c2%>0 then gosub 240:c2%=0
  30. 140 if c3%>0 then gosub 260:c3%=0
  31. 196 goto 100
  32. 199 rem ** firebutton routine goes here
  33. 200 print "f"
  34. 201 if c4%=1 then print "!"
  35. 202 if c5%>1 then print "s"
  36. 203 if c6%=1 then print "f"
  37. 205 return
  38. 220 print "ew"str$(c1%):return
  39. 239 rem ** spr/spr collision routine
  40. 240 print "cs"str$(c2%):return
  41. 259 rem ** spr/fore collision routine
  42. 260 print "cf"str$(c3%):return
  43. 296 return
  44. 298 rem    *** end handling ***
  45. 299 rem ** put video memory back to first block, and screen memory to 1024
  46. 300 gosub 90:poke es,0:rem disable sprites
  47. 304 rem restore video/screen memory
  48. 305 poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 3
  49. 306 i=peek(53272):poke 53272,20:k=peek(648):poke 648,4
  50. 310 gosub 95:print "[147]quit? ([217][146] or [206][146])":print:print
  51. 315 get a$:if a$="" then 315
  52. 320 if a$="y" then print "so long, star pilot!":goto 370
  53. 325 gosub 90:poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 1
  54. 330 poke 53272,i:poke 648,k:poke es,31:gosub 95:goto 100
  55. 370 for i=0 to 599:next
  56. 379 rem ** reenable shift/commodore and run-stop/restore
  57. 380 poke 657,0:poke 792,71:poke 808,237
  58. 390 sys 65126
  59. 598 rem    *** arrange memory ***
  60. 599 rem use third video block (32768 to 49151), so rom character set is usable.
  61. 600 vb=32768:poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 1
  62. 601 rem ** tell vic-2 where screen is without changing character set location
  63. 602 sb=0:poke 53272,(sb*16)+4:sb=vb+1024*sb
  64. 603 rem ** tell basic where screen is
  65. 604 bb=sb/256:poke 648,bb
  66. 608 rem    *** register addresses ***
  67. 611 rem ** sprite color table
  68. 612 ct(0)=53287:for i=1 to 7:ct(i)=ct(i-1)+1:next
  69. 613 rem ** sprite horizontal position table (low bytes)
  70. 614 ht(0)=53248:for i=1 to 7:ht(i)=ht(i-1)+2:next
  71. 615 rem ** sprite vertical position table
  72. 616 vt(0)=53249:for i=1 to 7:vt(i)=vt(i-1)+2:next
  73. 617 rem ** sprite horizontal high-bit register
  74. 618 hr=53264
  75. 619 rem ** sprite enable register
  76. 620 es=53269
  77. 621 rem ** vertical expansion register (1=double height)
  78. 622 ve=53271
  79. 623 rem ** horizontal expansion register (1=double width)
  80. 624 he=53277
  81. 625 rem ** sprite priority register (1=sprite is in front of foreground)
  82. 626 pr=53275
  83. 627 rem ** multicolor enable register (1=multi-color enabled)
  84. 628 em=53276
  85. 629 rem ** sprite multicolor color registers
  86. 630 mr=53285:rem ('01' register: add 1 to mr for '11' register)
  87. 633 rem ** set-bit and clear-bit values
  88. 634 bs(0)=1:for i=1 to 7:bs(i)=2*bs(i-1):next
  89. 635 for i=0 to 7:bc(i)=255-bs(i):next
  90. 638 rem     *** initialize values ***
  91. 639 rem ** foreground color
  92. 640 poke 53281,0:print "[147][154]";:rem (light blue)
  93. 641 rem ** background color
  94. 642 poke 53281,0 :rem (black)
  95. 643 rem ** border color
  96. 644 poke 53280,0:rem (black)
  97. 645 rem ** sprite colors (defaults: whi,red,l-grn,pur,grn,blu,yel,m-gray)
  98. 646 poke ct(0),7:poke ct(1),5:poke ct(2),2:poke ct(3),6:poke ct(4),12
  99. 647 rem ** set priority
  100. 648 poke pr,0:rem (all in front)
  101. 649 rem ** set horizontal sizes
  102. 650 poke he,0:rem (all small)
  103. 651 rem ** set vertical sizes
  104. 652 poke ve,0:rem (all small)
  105. 653 rem ** enable sprites
  106. 654 poke es,0:rem (leave them off for now)
  107. 655 rem ** enabl multicolor for spr 1-4
  108. 656 poke em,30
  109. 657 rem ** set multi-colors 1 and 3 (1=light grey, 3=yellow)
  110. 658 poke mr,15:poke mr+1,7
  111. 659 rem       *** ml table setup ***
  112. 660 rem ** animation timer (1=fastest)
  113. 661 poke 37920,4:poke 37921,4
  114. 662 rem ** animation counter (always 1)
  115. 663 poke 37922,1
  116. 664 rem ** animate sprite 0?  (1=yes)
  117. 665 poke 37923,0
  118. 666 rem ** movement timer (number of interrupts between moves [1=fastest])
  119. 667 poke 37924,1:poke 37925,1
  120. 668 rem ** all sprites wrap at screen edge? (1=yes)
  121. 669 poke 37936,1
  122. 670 rem ** sprite 0 bounce off sprites? (1=yes)
  123. 671 poke 37940,1
  124. 672 rem ** sprite 0 bounce off foreground? (1=yes)
  125. 673 poke 37941,0
  126. 674 rem ** go-speed timer (number of sprite 0 moves per interrupt [1=slowest])
  127. 675 poke 37926,3:poke 37928,3
  128. 676 rem clear flags
  129. 677 poke 37927,0:poke 37935,0:poke 37943,0
  130. 678 rem ** extended background colors
  131. 679 poke 53282,1:poke 53283,7:poke 53284,9
  132. 683 rem ** sprite 0-7 bit table
  133. 684 x=1:for i=37962 to 37969:poke i,x:x=x*2:next
  134. 693 rem     *** safety procedures ***
  135. 694 poke 657,128:rem disable shift/commodore character set switch
  136. 695 rem poke 808,234:poke 792,193:rem disable stop and stop/restore
  137. 696 return
  138. 699 rem *** intro screen ***
  139. 700 print "[147]"tab(12)"[211][212][193][210][211][200][201][208][160][195][193][208][212][193][201][206]"
  140. 710 print:print tab(6)"[217][207][213][210][160][195][210][193][198][212][160][201][211][160][194][197][201][206][199][160][208][210][197][208][193][210][197][196][146]":print:print
  141. 796 return
  142. 898 rem     *** sprite positions ***
  143. 899 rem ** possible positions dim'ed
  144. 900 for i=1 to 4:poke ht(i),20+int(rnd(9)*220)
  145. 901 poke vt(i),50+int(rnd(9)*190):next
  146. 902 poke hr,0
  147. 909 rem ** put stars on the screen
  148. 910 print "[147]";:for i=0 to 49:poke vb+int(rnd(9)*1024),46:next
  149. 915 for i=0 to 8:poke vb+int(rnd(9)*1024),42:next
  150. 919 rem ** starship position
  151. 920 poke 53248,175:poke 53249,150
  152. 921 rem ** starship direction
  153. 922 poke vb+1016,16
  154. 946 return
  155. 1998 rem    ***  machine language  ***
  156. 1999 rem ** startup sys routine
  157. 2000 poke 37888,peek(788):poke 37889,peek(789)
  158. 2002 xb=38067:xe=38079:gosub 20
  159. 2003 rem block interr, set vector to animation shell,enable interr
  160. 2004 rem sei lda #0 sta 788 lda #149 sta 789 cli rts
  161. 2005 data 120,169,0,141,20,3,169,149,141,21,3,88,96
  162. 2019 rem   ***  animation shell  ***
  163. 2020 xb=38144:xe=38176:gosub 20
  164. 2021 rem see if timer calls for animation or movement
  165. 2022 rem dec 37920 beq+3 jmp(37898)
  166. 2023 data 206,32,148,240,3,108,10,148
  167. 2024 rem reset animation timer
  168. 2025 rem lda 37921 sta 37920
  169. 2026 data 173,33,148,141,32,148
  170. 2027 rem get next step in animation sequence
  171. 2028 rem dec 37922 bne+5 lda#8 sta 37922 ldx 37922 dex
  172. 2029 data 206,34,148,208,5,169,8,141,34,148,174,34,148,202
  173. 2030 rem if called for, animate #0
  174. 2031 rem lda 37923 beq+6
  175. 2032 data 173,35,148,240,6
  176. 2033 rem animate all sprites
  177. 2034 rem lda anim.seq.tab,x sta sprite.shape.tab
  178. 2035 a=192:b=248:for i=38177 to 38219 step 6:poke i,189:poke i+1,a:poke i+2,148
  179. 2036 poke i+3,141:poke i+4,b:poke i+5,131:a=a+8:b=b+1:next
  180. 2037 rem exit through movement handler
  181. 2038 rem jmp (37898)
  182. 2039 poke 38225,108:poke 38226,10:poke 38227,148
  183. 2049 rem   *** movement counter ***
  184. 2050 xb=38272:xe=38288:gosub 20
  185. 2051 x=38272:poke 37896,fn lo(x):poke 37897,fn pg(x):rem set counter address
  186. 2052 poke 37898,fn lo(x):poke 37899,fn pg(x):rem move.vect.=joydir
  187. 2053 rem decrement timer; if not 0, go finish up
  188. 2054 rem dec 37924 beq+3 jmp(37900)
  189. 2055 data 206,36,148,240,3,108,12,148
  190. 2056 rem reset timer and jump to read routine through vector set from basic
  191. 2057 rem lda 37925 sta 37924 jmp(37890)
  192. 2058 data 173,37,148,141,36,148,108,2,148
  193. 2059 rem ** bitset subroutine **
  194. 2060 xb=38314:xe=38323:gosub 20
  195. 2061 rem get bitmask and put it in horizontal hi-bit register
  196. 2062 rem lda 37962,y ora 53264 sta 53264 rts
  197. 2063 data 185,74,148,13,16,208,141,16,208,96
  198. 2069 rem ** bitclear subroutine **
  199. 2070 xb=38324:xe=38335:gosub 20
  200. 2071 rem get bitmask, reverse it, and put it in horizontal hi-bit register
  201. 2072 rem lda 37962,y eor#255 and 53264 sta 53264 rts
  202. 2073 data 185,74,148,73,255,45,16,208,141,16,208,96
  203. 2099 rem      *** xmove ***
  204. 2100 xb=38400:xe=38467:gosub 20
  205. 2101 rem test for upmove
  206. 2102 rem lda#1 and 37963,y beq+3 jsr 38528
  207. 2103 data 169,1,57,75,148,240,3,32,128,150
  208. 2107 rem test for downmove
  209. 2108 rem lda#2 and 37963,y beq+3 jsr 38592
  210. 2109 data 169,2,57,75,148,240,3,32,192,150
  211. 2117 rem test for leftmove and hi-bit
  212. 2118 rem lda#4 and 37963,y beq+17 lda 37962,y and 53264 beq+6
  213. 2119 data 169,4,57,75,148,240,17,185,74,148,45,16,208,240,6
  214. 2120 rem do either leftset or leftclear
  215. 2121 rem jsr 38656 jmp 38444 jsr 38720
  216. 2122 data 32,0,151,76,44,150,32,64,151
  217. 2126 rem test for rightmove and hi-bit
  218. 2127 rem lda#8 and 37963,y bne+1 rts lda 37962,y and 53264 beq+4
  219. 2128 data 169,8,57,75,148,208,1,96,185,74,148,45,16,208,240,4
  220. 2129 rem do either rightset or rightclear
  221. 2130 rem jsr 38784 jmp 38515 jsr 38848 rts
  222. 2131 data 32,128,151,96,32,192,151,96
  223. 2139 rem   *** upmove subroutine ***
  224. 2140 xb=38528:xe=38561:gosub 20
  225. 2141 rem get vert.loc.,decrement,check edge,store new vert.loc.
  226. 2142 rem ldx 53249,y dex txa cmp 37978,y bne+3 jsr 38546 txa sta 53249,y rts
  227. 2143 data 190,1,208,202,138,217,90,148,208,3,32,146,150,138,153,1,208,96
  228. 2144 rem * topcheck
  229. 2145 rem lda 37936 bne+4 inx jmp 38391 ldx 37979,y dex jmp 38391
  230. 2146 data 173,48,148,208,4,232,76,247,149,190,91,148,202,76,247,149
  231. 2159 rem   *** downmove subroutine ***
  232. 2160 xb=38592:xe=38625:gosub 20
  233. 2161 rem get vert.loc.,increment,check edge,store new vert.loc.
  234. 2162 rem ldx 53249,y inx txa cmp 37979,y bne+3 jsr 38610 txa sta 53249,y rts
  235. 2163 data 190,1,208,232,138,217,91,148,208,3,32,210,150,138,153,1,208,96
  236. 2164 rem * bottomcheck
  237. 2165 rem lda 37936 bne+4 dex jmp 38391 ldx 37978,y inx jmp 38391
  238. 2166 data 173,48,148,208,4,202,76,247,149,190,90,148,232,76,247,149
  239. 2179 rem *** leftmove (hi bit set) ***
  240. 2180 xb=38656:xe=38669:gosub 20
  241. 2181 rem get horiz loc, decrement, check crossover, store and return
  242. 2182 rem ldx 53248,y dex bpl+3 jsr 38324 txa sta 53248,7 rts
  243. 2183 data 190,0,208,202,16,3,32,180,149,138,153,0,208,96
  244. 2199 rem *** leftmove (hi bit clr) ***
  245. 2200 xb=38720:xe=38756:gosub 20
  246. 2201 rem get horizontal position, decrement; if edge, move and leave
  247. 2202 rem ldx 53248,y dex txa cmp 37994,y bne+3 jsr 38738 txa sta 53248,y rts
  248. 2203 data 190,0,208,202,138,217,106,148,208,3,32,82,151,138,153,0,208,96
  249. 2204 rem *** left check
  250. 2205 rem lda 37936 bne+4 inx jmp 38391 ldx 37995,y dex jsr 38314 jmp 38391
  251. 2206 data 173,48,148,208,4,232,76,247,149,190,107,148,202,32,170,149,76,247,149
  252. 2219 rem *** rightmve (hi bit set) ***
  253. 2220 xb=38784:xe=38820:gosub 20
  254. 2221 rem get horizontal position, increment; if edge, move and leave
  255. 2222 rem ldx 53248,y inx txa cmp 37932,y bne+3 jsr 38802 txa sta 53248,y rts
  256. 2223 data 190,0,208,232,138,217,107,148,208,3,32,146,151,138,153,0,208,96
  257. 2224 rem *** right check
  258. 2225 rem lda 37936 bne+4 dex jmp 38391 ldx 37994,y inx jsr 38324 jmp 38391
  259. 2226 data 173,48,148,208,4,202,76,247,149,190,106,148,232,32,180,149,76,247,149
  260. 2239 rem *** rightmve (hi bit clr) ***
  261. 2240 xb=38848:xe=38861:gosub 20
  262. 2241 rem get horiz loc, increment, check crossover, store and return
  263. 2242 rem ldx 53248,y inx bne+3 jsr 38314 txa sta 53248,y rts
  264. 2243 data 190,0,208,232,208,3,32,170,149,138,153,0,208,96
  265. 2399 rem *** basic movement handler ***
  266. 2400 xb=38336:xe=38346:gosub 20
  267. 2401 rem set y to offset of selected sprite
  268. 2402 rem ldy#59 lda(45)y tax ldy 37944,x jmp 38400
  269. 2403 data 160,59,177,45,170,188,56,148,76,0,150
  270. 2469 rem ** report non-sprite-0 wraps and edges to basic
  271. 2470 xb=38391:xe=38399:gosub 20
  272. 2471 rem was it sprite 0? if not, report wrap
  273. 2472 rem cpy#0 bne+1 rts sty 37943 rts
  274. 2473 data 192,0,208,1,96,140,55,148,96
  275. 2499 rem   *** read joystick ***
  276. 2500 xb=38912:xe=38972:gosub 20
  277. 2501 rem set read vector to point to joystick routine
  278. 2502 x=38912:poke 37890,fn lo(x):poke 37891,fn pg(x):rem (rem this to use keyb.)
  279. 2506 rem get joystick 2; store it, check for firebutton, report if pressed
  280. 2507 rem lda 56320 sta 37933 and#16 bne+8 lda#1 sta 37927 jsr 39168
  281. 2508 data 173,0,220,141,45,148,41,16,208,8,169,1,141,39,148,32,0,153
  282. 2509 rem is movement called for? if so, set joydir, set shape 0
  283. 2510 rem lda 37933 and#15 cmp#15 bne+3 jmp(37900) eor#15 sta 37963 jsr 39040
  284. 2511 data 173,45,148,41,15,201,15,208,3,108,12,148,73,15,141,75,148,32,128,152
  285. 2512 rem move once, then point move.vect.to movement handler
  286. 2513 rem ldy#0 jsr 38400 jsr 39072 lda 37892 sta 37898
  287. 2514 data 160,0,32,0,150,32,160,152,173,4,148,141,10,148
  288. 2515 rem lda 37893 sta 37899 jmp(37900)
  289. 2516 data 173,5,148,141,11,148,108,12,148
  290. 2529 rem *** interr.move.handler ***
  291. 2530 xb=38976:xe=39009:gosub 20
  292. 2531 poke 37892,fn lo(xb):poke 37893,fn pg(xb)
  293. 2532 rem set up for sprite 0, go move, check collisions, redo if necessary
  294. 2533 rem ldy#0 jsr 38400 jsr 39072
  295. 2534 data 160,0,32,0,150,32,160,152
  296. 2535 rem do it again? if not, reset timer
  297. 2536 rem dec 37928 bne-13 lda 37926 sta 37928
  298. 2537 data 206,40,148,208,243,173,38,148,141,40,148
  299. 2538 rem reset movement vector, quit
  300. 2539 rem lda 37896 sta 37898 lda 37897 sta 37899 jmp(37900)
  301. 2540 data 173,8,148,141,10,148,173,9,148,141,11,148,108,12,148
  302. 2549 rem *** set shape 0 ***
  303. 2550 xb=39040:xe=39057:gosub 20
  304. 2551 rem using joydir as index, get sprite shape code from sprite 0 direc.table
  305. 2552 rem lda 37923 bne+9 ldy 37963 lda 37951,y sta 33784 jsr 39232 rts
  306. 2553 data 173,35,148,208,9,172,75,148,185,63,148,141,248,131,32,64,153,96
  307. 2569 rem ** sprite 0 collision routine
  308. 2570 xb=39072:xe=39111:gosub 20
  309. 2571 rem do we bounce off sprites? if so, do it
  310. 2572 rem lda 37940 beq+16 lda 53278 sta 37929 and#1 beq+6
  311. 2573 data 173,52,148,240,16,173,30,208,141,41,148,41,1,240,6
  312. 2574 rem jsr 39248 jmp unmove
  313. 2575 data 32,80,153,76,208,152
  314. 2576 rem do we bounce off foreground? if so, do it and return
  315. 2577 rem lda 37941 beq+13 lda 53279 and#1 beq+6 jsr 39280 jmp unmove rts
  316. 2578 data 173,53,148,240,13,173,31,208,41,1,240,3,32,112,153,76,208,152,96
  317. 2579 rem ** unmove **
  318. 2580 xb=39120:xe=39148:gosub 20
  319. 2581 rem stop gospeed, reverse joydir and store it
  320. 2582 rem lda#1 sta 37928 ldy 37963 lda 38009,y sta 37963
  321. 2583 data 169,1,141,40,148,172,75,148,185,121,148,141,75,148
  322. 2584 rem go move, reverse joydir and restore it, quit
  323. 2585 rem ldy#0 jsr 38400 ldy 37963 lda 38009,y sta 37963 rts
  324. 2586 data 160,0,32,0,150,172,75,148,185,121,148,141,75,148,96
  325. 2599 rem   *** read keyboard ***
  326. 2600 rem xb=00000:xe=00000:gosub 20
  327. 2601 rem set read vector to point to keyboard routine (remove rem to use)
  328. 2602 rem x=38912:poke 37890,fn lo(x):poke 37891,fn pg(x):rem (not in force)
  329. 2699 rem ** basic variable subroutines
  330. 2700 xb=39168:xe=39174:gosub 20
  331. 2701 rem ** report firebutton - c0%
  332. 2702 rem ldy#10 lda#1 sta(45),y rts
  333. 2703 data 160,10,169,1,145,45,96
  334. 2709 rem ** report sprites to basic
  335. 2710 xb=39184:xe=39222:gosub 20
  336. 2711 rem c1%=edgewrap, c2%=s/s collis.
  337. 2712 rem ldy#17 lda 37943 beq+2 sta(45)y ldy#24 lda 37937 beq+2 sta(45)y
  338. 2713 data 160,17,173,55,148,240,2,145,45,160,24,173,49,148,240,2,145,45
  339. 2714 rem c3%=s/foreg.collis.,erase,ret.
  340. 2715 rem  ldy#31 lda 37938 beq+2 sta(45)y
  341. 2716 data  160,31,173,50,148,240,2,145,45
  342. 2717 rem lda#0 sta 37937 sta 37938 sta 37943 rts
  343. 2718 data 169,0,141,49,148,141,50,148,141,55,148,96
  344. 2719 rem ** report movement
  345. 2720 xb=39232:xe=39241:gosub 20
  346. 2721 rem c4%=player has tried to move
  347. 2722 rem ldy#38 lda#1 sta(45)y sta 37935 rts
  348. 2723 data 160,38,169,1,145,45,141,47,148,96
  349. 2729 rem ** report sprite 0 bounce/s
  350. 2730 xb=39248:xe=39257:gosub 20
  351. 2731 rem c5%=sprite 0 bounced/sprite:
  352. 2732 rem ldy#45 lda 37929 and#254 sta(45)y rts
  353. 2733 data 160,45,173,41,148,41,254,145,45,96
  354. 2739 rem ** report sprite 0 bounce/f
  355. 2740 xb=39280:xe=39289:gosub 20
  356. 2741 rem c6%=sprite 0 bounced foregrou.
  357. 2742 rem ldy#52 lda#1 sta(45)y sta 37930 rts
  358. 2743 data 160,52,169,1,145,45,141,42,148,96
  359. 2898 rem   *** wrapup ***
  360. 2899 rem all routines exit through here
  361. 2900 xb=40704:xe=40721:gosub 20
  362. 2901 rem ** set collision vector
  363. 2902 x=40704:poke 37900,fn lo(x):poke 37901,fn pg(x)
  364. 2906 rem get collision data and report it to basic variables
  365. 2907 rem lda 53278 sta 37937 lda 53279 sta 37938 jsr 39184
  366. 2908 data 173,30,208,141,49,148,173,31,208,141,50,148,32,16,153
  367. 2915 rem return to housekeeping
  368. 2916 rem jmp(37888)
  369. 2917 data 108,0,148
  370. 2989 rem routines added before final jmp() will execute every interr.
  371. 2998 rem  *** set up sprite shapes ***
  372. 2999 rem ** planets
  373. 3000 for i=34304 to 34816 step 512:for j=0 to 448 step 64:for k=0 to 20
  374. 3001 read a:poke i+j+k,a:next
  375. 3002 for k=21 to 63:poke i+j+k,0:next:next:gosub 3985:next
  376. 3009 rem ** planet 1 shape data
  377. 3010 data 0,40,0,0,175,0,82,191,192,82,175,128,2,191,128,0,171,0,0,40,0
  378. 3011 data 0,40,0,0,190,0,2,255,128,5,190,128,5,254,128,0,175,0,0,40,0
  379. 3012 data 0,40,0,0,250,0,3,254,128,2,90,128,3,90,128,0,190,0,0,40,0
  380. 3013 data 0,40,0,0,234,0,3,250,128,3,229,128,3,229,128,0,250,0,0,40,0
  381. 3014 data 0,40,0,0,170,0,3,234,80,3,170,80,3,170,128,0,234,0,0,40,0
  382. 3015 data 0,40,0,0,170,20,3,170,212,2,170,128,2,170,192,0,170,0,0,40,0
  383. 3016 data 0,40,0,0,170,64,2,171,192,2,170,192,2,171,192,0,170,0,0,40,0
  384. 3017 data 0,40,0,5,171,0,6,175,192,2,171,192,2,175,192,0,170,0,0,40,0
  385. 3019 rem ** planet 2 shape data
  386. 3020 data 0,40,0,3,170,192,62,170,148,162,170,143,42,255,252,2,255,192,0,40,0
  387. 3021 data 0,40,0,3,106,192,61,106,188,241,106,143,62,171,252,2,171,192,0,40,0
  388. 3022 data 0,24,0,3,90,192,61,90,188,81,90,143,63,234,188,3,234,128,0,24,0
  389. 3023 data 0,20,0,3,86,192,61,86,188,241,86,138,61,255,168,1,255,128,0,20,0
  390. 3024 data 0,20,0,3,85,128,61,85,104,241,85,74,63,223,252,3,223,192,0,20,0
  391. 3025 data 0,20,0,3,149,192,62,149,124,242,149,79,63,253,252,3,253,192,0,20,0
  392. 3026 data 0,40,0,2,169,192,62,169,124,242,169,79,63,255,252,3,255,192,0,40,0
  393. 3027 data 0,40,0,2,170,0,42,170,188,162,170,143,63,255,212,3,255,192,0,40,0
  394. 3058 gosub 3985
  395. 3059 rem ** sprite animation tables
  396. 3060 for i=38088 to 38112 step 8:for j=0 to 7:read a:poke i+j,a:next:next
  397. 3061 rem ** animation table data
  398. 3062 data 24,25,26,27,28,29,30,31
  399. 3063 data 32,33,34,35,36,37,38,39
  400. 3064 data 27,26,25,24,31,30,29,28
  401. 3065 data 37,36,35,34,33,32,39,38
  402. 3098 rem    ***   sprite 0 shapes   ***
  403. 3099 rem ** sprite 0 direction table
  404. 3100 for i=37952 to 37961:read a:poke i,a:next:gosub 3985
  405. 3101 data 16,20,0,22,23,21,0,18,17,19
  406. 3102 rem ** sprite 0 animation table
  407. 3103 for i=0 to 7:poke 38080+i,16+i:next
  408. 3104 rem ** sprite 0 shapes
  409. 3105 for i=33792 to 34240 step 64:for j=0 to 18 step 3
  410. 3106 read a:poke i+j,a:poke i+j+1,0:poke i+j+2,0:next
  411. 3107 for j=21 to 63:poke i+j,0:next:next:gosub 3985
  412. 3109 rem ** sprite 0 data
  413. 3110 data 8,28,28,28,54,34,0
  414. 3111 data 6,14,28,120,240,48,32
  415. 3112 data 0,224,62,31,62,224,0
  416. 3113 data 32,48,240,120,28,14,6
  417. 3114 data 0,34,54,28,28,28,8
  418. 3115 data 4,12,15,30,56,112,96
  419. 3116 data 0,7,124,248,124,7,0
  420. 3117 data 96,112,56,30,15,12,4
  421. 3298 rem ** sprite movement data
  422. 3299 rem ** location register offset table
  423. 3300 x=0:for i=37944 to 37951:poke i,x:x=x+2:next
  424. 3304 rem ** sprite bitmask table
  425. 3305 x=1:for i=37962 to 37976 step 2:poke i,x:x=x*2:next
  426. 3307 rem ** sprite joydir table
  427. 3308 rem sprite directions: 1=up 2=dn 4=lf 8=rt  add for diagonals
  428. 3309 rem 0=no movement (can be changed from basic)
  429. 3310 for i=37963 to 37977 step 2:read a:poke i,a:next
  430. 3311 data 0,5,6,10,9,0,0,0
  431. 3312 rem ** sprite borders table **
  432. 3313 rem each sprite's screen margins are individually set
  433. 3314 rem sprites are considered in numerical order
  434. 3315 rem ** top edges (0-7)
  435. 3316 for i=37978 to 37992 step 2:read a:poke i,a:next
  436. 3317 data 50,43,43,43,43,43,43,43
  437. 3318 rem ** bottom edges (0-7)
  438. 3319 for i=37979 to 37993 step 2:read a:poke i,a:next
  439. 3320 data 243,250,250,250,250,250,250,250
  440. 3321 rem ** left edges (0-7)
  441. 3322 for i=37994 to 38008 step 2:read a:poke i,a:next
  442. 3323 data 23,0,0,0,0,0,0,0
  443. 3324 rem ** right edges (0-7)
  444. 3325 for i=37995 to 38009 step 2:read a:poke i,a:next
  445. 3326 data 80,87,87,87,87,87,87,87
  446. 3327 rem ** joystick reversal table
  447. 3328 for i=38010 to 38019:read a:poke i,a:next
  448. 3329 data 2,1,0,8,10,9,0,4,6,5
  449. 3985 print "![146]";
  450. 3990 return
  451.