home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / ST_USER / 1989 / USER1189.MSA / LISTINGS.ARC / ASTEROID.BSC next >
Text File  |  1989-09-04  |  9KB  |  368 lines

  1. REM Space Mania
  2. REM Programming - Mark Smiddy
  3. REM Special Sound & Zitty Pix - Guilder
  4. REM (C) Atari ST User
  5. RESERVESCREEN 0,0,320,200
  6. TXTRECT 0,0,320,200:CLS
  7. SETCOL 0,1,1,1
  8. a=ALERT("[1][|** SPACE MANIA **| By Mark Smiddy|(c) Atari ST User][Play!]",1)
  9. IF SCREENMODE THEN a=ALERT("[2][|Requires 16 glorious|Atari colours|Reboot in LOW rez][Will.do.bub]",1):END
  10. PROCassemble
  11. bse=PHYSBASE
  12. PROCobjects
  13. REPEAT
  14. hits%=0:{code%+role%}&=0:lev%=0:B%=0
  15. PROClvl
  16. REPEAT
  17. t%=0
  18. FOR D%=4 TO 31:D1=D%:D0=0:D5=0
  19. CALL  code%+collide%
  20. IF D5>2 THEN DOSOUND ex%+40:hits%=hits%+1
  21. NEXT
  22. CALL code%+ckend%:t%=D1
  23. CALL code%+wipescreen%
  24. IF t%=0 THEN PROClevel
  25. IF hits%>8 THEN SETCOL 15,RND(6)+1,RND(6)+1,RND(6)+1
  26. MOUSE x%,y%,a%,b%:{code%+XS%}&=0
  27. IF(b% AND 2) THEN{code%+XS%}&=-7
  28. IF(b% AND 1) THEN{code%+XS%}&=7
  29. IF(b% AND 8) THEN CALL code%+fire%:F%=0
  30. IF fird%?code%=0 THEN DOSOUND ex%+18:fird%?code%=1
  31. IF hitf%?code%=0 THEN DOSOUND ex%:hitf%?code%=1
  32. CALL code%+aster%
  33. CALL code%+exscreen%
  34. UNTIL hits%>10
  35. PHYSBASE=bse:LOGBASE=PHYSBASE
  36. CLS:SETCOL 15,7,7,7
  37. S%={role%+code%}&
  38. a=ALERT("[1][|Final score:"+STR$(S%)+"|Press Return|to play again!][Ok]",1)
  39. RUN
  40. UNTIL 0
  41.  
  42. DEFPROClevel
  43. SETCOL 15,7,7,7
  44. lev%=lev%+1:B%=lev%*100:{role%+code%}&={role%+code%}&+B%
  45. PHYSBASE=LOGBASE:PROClvl
  46. IF {bits+code%+6}&<10 THEN {bits+code%+6}&={bits+code%+6}&+1
  47. IF {bits+code%+6}&>3 AND {bits+code%+8}&<10 THEN {bits+code%+8}&={bits+code%+8}&+1
  48. FOR n%=10 TO 16 STEP 2:{des+code%+n%}&=0:NEXT
  49. hits%=0
  50. ENDPROC
  51.  
  52. DEFPROClvl
  53. CLS:a=ALERT("[1][|Level:"+STR$(lev%)+"|Bonus:"+STR$(B%)+"][Begin]",1)
  54. ENDPROC
  55.  
  56. DEF PROCassemble
  57. RESERVE screen,32512
  58. screen=(screen AND $FFFFFE00)+256
  59. old_screen=PHYSBASE
  60. RESERVE code%,8000
  61. DEFPROCasm
  62. FOR pass=1 TO 2  
  63.  
  64. [OPT pass,"L-M+"
  65.         ORG 0,code%
  66. ckend%
  67.     MOVE #31,D7
  68.     MOVEQ #0,D1
  69.     LEA des(PC),A0
  70. cad    MOVE D7,D6
  71.     LSL #1,D6
  72.     MOVE (A0,D6),D0
  73.     BMI ntinuse
  74.     ADDQ #1,D1
  75. ntinuse    CMP #5,D7    \slots 0-4 reserved
  76.     DBEQ D7,cad
  77.     RTS
  78.     
  79. newroid MOVE #31,D7    \* Bits left, find some free slots *
  80.     MOVEQ #0,D6    \number of slots allocated
  81.     LEA XC(PC),A0    \X,Y access
  82.     LEA des(PC),A1    \designs
  83.     LEA XS%(PC),A2    \vector access
  84.     LEA bits(PC),A3    \housekeeping
  85.     LEA vex(PC),A4
  86.     LSL #1,D2    \correct d2 for word offset
  87.     MOVE 0(A3,D2),D3    \D3=type of bubble
  88.     MOVE 6(A3,D2),D4    \D4=number to create
  89.     BEQ stiff
  90. nloop    LSL #1,D7    \slot counter
  91.     TST 0(A1,D7)     \slot free if -ve
  92.     BPL sused
  93.     ADDQ #1,D0    \how many stored
  94.     MOVE D3,0(A1,D7)    \store new object in slot
  95.     MOVE 0(A0,D1),0(A0,D7)    \the x coordinate
  96.     MOVE 64(A0,D1),64(A0,D7)    \and the y
  97.     MOVE 0(A4,D7),0(A2,D7)    \XS% store
  98.     MOVE 32(A4,D7),64(A2,D7)    \YS store
  99.     SUBQ #1,D4:TST D4    \less one to store
  100.     BEQ stiff    \all done if =0
  101. sused    LSR #1,D7
  102.     CMP #5,D7    \slots 0-4 reserved
  103.     DBEQ D7,nloop
  104. stiff    LEA hitf%(PC),A0
  105.     MOVE.B #0,(A0)
  106.     RTS
  107.     
  108. ckhit    LEA des(PC),A1    \* test for bullet hit bubble *
  109.     MOVE D6,D0:LSR #1,D0
  110.     TST 0(A1,D6)
  111.     BMI ntuse
  112.     MOVEQ #31,D1
  113. hloop    MOVEM.L D0-D1/A1,-(SP)
  114.     BSR collide%
  115.     MOVEM.L (SP)+,D0-D1/A1
  116.     TST D5:BPL ntded
  117.     MOVE #-1,0(A1,D6)
  118.     LSL #1,D1
  119.     MOVE 0(A1,D1),D2    \get design
  120.     LEA role%(PC),A5
  121.     MOVE #25,D5
  122.     LSL D2,D5    \score*design
  123.     ADD D5,(A5)    \add on score
  124.     MOVE #-1,0(A1,D1)    \kill it
  125.     MOVEM.L D0-D7/A0-A6,-(SP)
  126.     BSR newroid
  127.     MOVEM.L (SP)+,D0-D7/A0-A6
  128.     LSR #1,D1
  129. ntded    CMP #5,D1
  130.     DBEQ D1,hloop
  131. ntuse    
  132.     RTS
  133. fire%    LEA XC(PC),A0    \* Fire a shot *
  134.     LEA des(PC),A1
  135.     MOVE (A0),D0    \get X of player
  136.     ADD #3,D0
  137.     MOVE #140,D1
  138.     MOVE #3,D2    \up to 4 bullets
  139. floop    MOVE D2,D3
  140.     LSL #1,D3
  141.     TST 2(A1,D3)    \check for a slot
  142.     BPL used
  143.     MOVE D0,2(A0,D3)
  144.     MOVE D1,66(A0,D3)
  145.     MOVE #4,2(A1,D3)
  146.     LEA fird%(PC),A0
  147.     MOVE.B #0,(A0)    \fire sound effect trig
  148.     RTS
  149. used    DBF D2,floop    
  150.     RTS
  151.     
  152. collide%    \check for collision (rectangles)
  153.     LEA XC(PC),A0    \x coordinate
  154.     LEA rwth(PC),A1    \width factor
  155.     LEA des(PC),A2    \designs
  156.     LSL #1,D0:LSL #1,D1
  157.     TST (A2,D1):BPL live
  158.     RTS
  159. live    MOVEQ #1,D5    \do this twice
  160. colp    MOVE 0(A0,D0),D2    \get X1 ofset by d0*2 to d2
  161.     MOVE 0(A0,D1),D3    \get X2 ofset by d1*2 to d3
  162.     CMP D2,D3    \is x1>x2?
  163.     BLT x2    \x2 is greater
  164. x1    MOVE 0(A2,D0),D4    \design type
  165.     LSL #1,D4
  166.     ADD 0(A1,D4),D2    \add x1's width to x1
  167.     CMP D2,D3    \if x2 (d3) still higher then exit
  168.     BLT bang    \if x2 (d3)< x1 (d2) then x collide
  169.     RTS
  170. x2    MOVE 0(A2,D1),D4    \design type
  171.     LSL #1,D4
  172.     ADD 0(A1,D4),D3    \add x2's width to x2
  173.     CMP D3,D2    \if x1 (d2) still higher then exit
  174.     BLT bang    \if x1 (d2)< x2 (d3) then x collide
  175.     RTS
  176. bang    ADDA.L #64,A0    \start of YC's from XC's
  177.     ADDA.L #10,A1    \start of heights from widths
  178.     DBF D5,colp
  179.     RTS
  180. aster%        \* Animate ALL objects *
  181.     MOVE #31,D7
  182. aloop    MOVE D7,D6
  183.     LSL #1,D6
  184.     LEA des(PC),A2    \design
  185.     MOVE 0(A2,D6),D4    \get current design 
  186.     BMI inactive
  187.     LEA XS%(PC),A0
  188.     MOVE 0(A0,D6),D0    \XS%
  189.     MOVE 64(A0,D6),D1    \YS
  190.     LEA XC(PC),A1
  191.     MOVE 0(A1,D6),D2    \X
  192.     MOVE 64(A1,D6),D3    \Y
  193.     ADD D0,D2    \new X
  194.     BPL ntminx
  195.     ADD #320,D2
  196. ntminx    CMP #320,D2
  197.     BLS ntmaxx
  198.     SUB #320,D2
  199. ntmaxx    MOVE D2,0(A1,D6)
  200.     ADD D1,D3    \new Y
  201.     BPL ntminy
  202.     ADD #200,D3
  203. ntminy    CMP #200,D3
  204.     BLS ntmaxy
  205.     SUB #200,D3
  206. ntmaxy    MOVE D3,64(A1,D6)
  207.     CMP #4,D4
  208.     BNE ntbul
  209.     MOVEM.L D0-D7/A0-A6,-(SP)
  210.     BSR ckhit
  211.     MOVEM.L (SP)+,D0-D7/A0-A6
  212.     CMP #10,D3
  213.     BGT ntbul
  214.     MOVE #-1,(A2,D6)
  215. ntbul    MOVE D4,D0    \Design
  216.     MOVE D2,D5    \X
  217.     MOVE D3,D6    \Y
  218.     LEA ptab(PC),A1
  219.     MOVE.L (A1),A1
  220.     MOVEM D0-D7/A0-A6,-(SP)
  221.     BSR draw
  222.     MOVEM (SP)+,D0-D7/A0-A6     
  223. inactive
  224.     DBRA D7,aloop
  225. exit    RTS
  226. draw    MOVEQ #0,D1    \* Super sprite routine *
  227.     LSL #1,D0
  228.     LEA hght(PC),A0
  229.     MOVE 0(A0,D0),D7    \get height
  230.     LEA wdth(PC),A0
  231.     MOVE 0(A0,D0),D3    \get width
  232.     LEA ofset(PC),A0
  233.     MOVE 0(A0,D0),D1    \calculate offset
  234.     ADD.L D1,A1
  235.         MOVEQ #0,D0
  236.         MOVE D5,D2
  237.     MOVE D5,D0
  238.     MOVE D6,D1
  239.     ANDI #15,D2             \ get bit shift in word to D2  
  240.         ANDI #$FFF0,D0             
  241.         LSR  #1,D0              \ get byte offset of x (x div 16)*8 
  242.         LSL  #1,D1              \ y * 2                
  243.         LEA mult(PC),A2         \ start of mult table          
  244.         MOVE 0(A2,D1),D1        \ start row for Y (y * 160)    
  245.         ADD  D1,D0              \ add row to column            
  246.         LEA screen_A(PC),A0     \ address of screen ram        
  247.         MOVE.L (A0),A0
  248.         ADDA.L D0,A0            \ final screen address in A0   
  249.     LEA screen_A(PC),A2
  250.     MOVE.L (A2),A2
  251.     ADDA.L #32000,A2    
  252. height    MOVE D3,D4
  253.     MOVE #160,D5
  254. width    MOVEQ #3,D6
  255. planes  MOVEQ #0,D0
  256.         MOVE (A1)+,D0
  257.     SWAP D0
  258.         LSR.L D2,D0
  259.         OR D0,8(A0)
  260.     SWAP D0
  261.     OR D0,(A0)+
  262.     SUBQ #2,D5
  263.         DBF D6,planes
  264.     DBF D4,width
  265.         ADDA.L D5,A0
  266.     ADDA.L D5,A1
  267.     CMP.L A0,A2
  268.     BHI ntover
  269.     SUB.L #32000,A0
  270. ntover  DBF D7,height
  271.     RTS        
  272. exscreen%    \* Swap the screens over *
  273.         LEA screen_A(PC),A0
  274.         LEA screen_B(PC),A1
  275.         MOVE.L (A0),D0
  276.         MOVE.L (A1),D1
  277.         EXG.L D0,D1
  278.         MOVE.L D0,(A0)
  279.         MOVE.L D1,(A1)
  280.         MOVE #-1,-(SP)
  281.         MOVE.L screen_B(PC),-(SP)
  282.         MOVE.L #-1,-(SP)
  283.         MOVE #5,-(SP)
  284.         TRAP #14
  285.         ADDA #12,SP
  286.         MOVE #37,-(SP)
  287.         TRAP #14
  288.         ADDA #2,SP
  289.         RTS
  290. wipescreen%        \* Clear drawing screen *
  291.         MOVE #8000,D0
  292.         MOVE.L screen_A(PC),A0
  293. cllp    MOVE.L #0,(A0)+
  294.         DBF D0,cllp
  295.         RTS
  296.  
  297. mult DS.W 202,0
  298. screen_A DC.L $AAAA
  299. screen_B DC.L $BBBB
  300. ptab DC.L $CCCC
  301. ofset DC.W 0,32,5632,72,146
  302. hght DC.W 50,25,14,39,8
  303. wdth DC.W 3,1,1,0,0
  304. rwth DC.W 56,29,16,16,8
  305. rhgt DC.W 50,22,14,39,4
  306. XC DC.W 160,0,0,0,0,100,0,230,70
  307.   DS.W 23,0
  308. YC DC.W 138,0,0,0,0,0,0,0,0
  309.   DS.W 23,0
  310. XS% DC.W -1,0,0,0,0,0,0,0,0
  311.   DS.W 23,0
  312. YS DC.W 0,-4,-5,-6,-7,1,2,4,3
  313.   DS.W 23,0
  314. des DC.W 3,-1,-1,-1,-1,0,0,0,0
  315.   DS.W 23,-1
  316. bits DC.W 1,2,0,1,1,0
  317. vex DS.W 255,0
  318. hitf% DC.B 0
  319. fird% DC.B 0
  320. role% DC.W 0
  321. ]
  322. NEXT
  323. !(screen_A+code%)=screen:!(screen_B+code%)=old_screen
  324. FOR N%=0 TO 199:B&=N%*160:{mult+code%+N%*2}&=B&:NEXT
  325. FOR N%=0 TO 95:REPEAT:b&=RND(5)-RND(5):UNTILb&:{vex+code%+N%*2}&=b&:NEXT
  326. ENDPROC
  327.  
  328. DEF PROCobjects
  329. PROCsound:HIDEMOUSE
  330. DIM X&(4),Y&(4)
  331. RESERVE pxtab,16000:LOGBASE=pxtab
  332. !(ptab+code%)=pxtab
  333. GRAFRECT 0,0,320,100:CLG0
  334. FOR N=2 TO 15:C=N-1
  335. FILLCOL N:FILLSTYLE 1,0
  336. IF N<10 THEN PALETTE N,C*125,0,0 ELSE PALETTE N,1000,(C-5)*125,(C-10)*125
  337. CIRCLE 80,13-N/2,16-N
  338. CIRCLE 33-N,27-N,32-N*2
  339. CIRCLE 75,42,12-N/1.5
  340. FILLCOL 16-N:FILLSTYLE 2,6
  341. ELLPIE 152,27,8-n/2,30-N*1.5,0,3600
  342. CIRCLE 292,3,5-N/10
  343. NEXT
  344. SETCOL 15,7,7,7
  345. LOGBASE=PHYSBASE
  346. ENDPROC
  347.  
  348. DEFPROCsound
  349. RESERVE ex%,70
  350. FOR i=0 TO 57:READ ex%?i:NEXT
  351. ENDPROC
  352.  
  353. REM explosion
  354. DATA 6,1,7,63-8,8,16
  355. DATA 11,0,12,70,13,1
  356. DATA $82,200,7,63,$FF,0
  357. REM shooting
  358. DATA 7,63-8,8,15
  359. DATA 11,200,12,5,13,13
  360. DATA $80,0,$81,6,5,30
  361. DATA $82,1,7,63,$FF,0
  362. REM explosion 2
  363. DATA 6,31,7,63-8,8,16
  364. DATA 11,0,12,70,13,1
  365. DATA $82,200,7,63,$FF,0
  366.  
  367.  
  368.