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 >
Wrap
Text File
|
1989-09-04
|
9KB
|
368 lines
REM Space Mania
REM Programming - Mark Smiddy
REM Special Sound & Zitty Pix - Guilder
REM (C) Atari ST User
RESERVESCREEN 0,0,320,200
TXTRECT 0,0,320,200:CLS
SETCOL 0,1,1,1
a=ALERT("[1][|** SPACE MANIA **| By Mark Smiddy|(c) Atari ST User][Play!]",1)
IF SCREENMODE THEN a=ALERT("[2][|Requires 16 glorious|Atari colours|Reboot in LOW rez][Will.do.bub]",1):END
PROCassemble
bse=PHYSBASE
PROCobjects
REPEAT
hits%=0:{code%+role%}&=0:lev%=0:B%=0
PROClvl
REPEAT
t%=0
FOR D%=4 TO 31:D1=D%:D0=0:D5=0
CALL code%+collide%
IF D5>2 THEN DOSOUND ex%+40:hits%=hits%+1
NEXT
CALL code%+ckend%:t%=D1
CALL code%+wipescreen%
IF t%=0 THEN PROClevel
IF hits%>8 THEN SETCOL 15,RND(6)+1,RND(6)+1,RND(6)+1
MOUSE x%,y%,a%,b%:{code%+XS%}&=0
IF(b% AND 2) THEN{code%+XS%}&=-7
IF(b% AND 1) THEN{code%+XS%}&=7
IF(b% AND 8) THEN CALL code%+fire%:F%=0
IF fird%?code%=0 THEN DOSOUND ex%+18:fird%?code%=1
IF hitf%?code%=0 THEN DOSOUND ex%:hitf%?code%=1
CALL code%+aster%
CALL code%+exscreen%
UNTIL hits%>10
PHYSBASE=bse:LOGBASE=PHYSBASE
CLS:SETCOL 15,7,7,7
S%={role%+code%}&
a=ALERT("[1][|Final score:"+STR$(S%)+"|Press Return|to play again!][Ok]",1)
RUN
UNTIL 0
DEFPROClevel
SETCOL 15,7,7,7
lev%=lev%+1:B%=lev%*100:{role%+code%}&={role%+code%}&+B%
PHYSBASE=LOGBASE:PROClvl
IF {bits+code%+6}&<10 THEN {bits+code%+6}&={bits+code%+6}&+1
IF {bits+code%+6}&>3 AND {bits+code%+8}&<10 THEN {bits+code%+8}&={bits+code%+8}&+1
FOR n%=10 TO 16 STEP 2:{des+code%+n%}&=0:NEXT
hits%=0
ENDPROC
DEFPROClvl
CLS:a=ALERT("[1][|Level:"+STR$(lev%)+"|Bonus:"+STR$(B%)+"][Begin]",1)
ENDPROC
DEF PROCassemble
RESERVE screen,32512
screen=(screen AND $FFFFFE00)+256
old_screen=PHYSBASE
RESERVE code%,8000
DEFPROCasm
FOR pass=1 TO 2
[OPT pass,"L-M+"
ORG 0,code%
ckend%
MOVE #31,D7
MOVEQ #0,D1
LEA des(PC),A0
cad MOVE D7,D6
LSL #1,D6
MOVE (A0,D6),D0
BMI ntinuse
ADDQ #1,D1
ntinuse CMP #5,D7 \slots 0-4 reserved
DBEQ D7,cad
RTS
newroid MOVE #31,D7 \* Bits left, find some free slots *
MOVEQ #0,D6 \number of slots allocated
LEA XC(PC),A0 \X,Y access
LEA des(PC),A1 \designs
LEA XS%(PC),A2 \vector access
LEA bits(PC),A3 \housekeeping
LEA vex(PC),A4
LSL #1,D2 \correct d2 for word offset
MOVE 0(A3,D2),D3 \D3=type of bubble
MOVE 6(A3,D2),D4 \D4=number to create
BEQ stiff
nloop LSL #1,D7 \slot counter
TST 0(A1,D7) \slot free if -ve
BPL sused
ADDQ #1,D0 \how many stored
MOVE D3,0(A1,D7) \store new object in slot
MOVE 0(A0,D1),0(A0,D7) \the x coordinate
MOVE 64(A0,D1),64(A0,D7) \and the y
MOVE 0(A4,D7),0(A2,D7) \XS% store
MOVE 32(A4,D7),64(A2,D7) \YS store
SUBQ #1,D4:TST D4 \less one to store
BEQ stiff \all done if =0
sused LSR #1,D7
CMP #5,D7 \slots 0-4 reserved
DBEQ D7,nloop
stiff LEA hitf%(PC),A0
MOVE.B #0,(A0)
RTS
ckhit LEA des(PC),A1 \* test for bullet hit bubble *
MOVE D6,D0:LSR #1,D0
TST 0(A1,D6)
BMI ntuse
MOVEQ #31,D1
hloop MOVEM.L D0-D1/A1,-(SP)
BSR collide%
MOVEM.L (SP)+,D0-D1/A1
TST D5:BPL ntded
MOVE #-1,0(A1,D6)
LSL #1,D1
MOVE 0(A1,D1),D2 \get design
LEA role%(PC),A5
MOVE #25,D5
LSL D2,D5 \score*design
ADD D5,(A5) \add on score
MOVE #-1,0(A1,D1) \kill it
MOVEM.L D0-D7/A0-A6,-(SP)
BSR newroid
MOVEM.L (SP)+,D0-D7/A0-A6
LSR #1,D1
ntded CMP #5,D1
DBEQ D1,hloop
ntuse
RTS
fire% LEA XC(PC),A0 \* Fire a shot *
LEA des(PC),A1
MOVE (A0),D0 \get X of player
ADD #3,D0
MOVE #140,D1
MOVE #3,D2 \up to 4 bullets
floop MOVE D2,D3
LSL #1,D3
TST 2(A1,D3) \check for a slot
BPL used
MOVE D0,2(A0,D3)
MOVE D1,66(A0,D3)
MOVE #4,2(A1,D3)
LEA fird%(PC),A0
MOVE.B #0,(A0) \fire sound effect trig
RTS
used DBF D2,floop
RTS
collide% \check for collision (rectangles)
LEA XC(PC),A0 \x coordinate
LEA rwth(PC),A1 \width factor
LEA des(PC),A2 \designs
LSL #1,D0:LSL #1,D1
TST (A2,D1):BPL live
RTS
live MOVEQ #1,D5 \do this twice
colp MOVE 0(A0,D0),D2 \get X1 ofset by d0*2 to d2
MOVE 0(A0,D1),D3 \get X2 ofset by d1*2 to d3
CMP D2,D3 \is x1>x2?
BLT x2 \x2 is greater
x1 MOVE 0(A2,D0),D4 \design type
LSL #1,D4
ADD 0(A1,D4),D2 \add x1's width to x1
CMP D2,D3 \if x2 (d3) still higher then exit
BLT bang \if x2 (d3)< x1 (d2) then x collide
RTS
x2 MOVE 0(A2,D1),D4 \design type
LSL #1,D4
ADD 0(A1,D4),D3 \add x2's width to x2
CMP D3,D2 \if x1 (d2) still higher then exit
BLT bang \if x1 (d2)< x2 (d3) then x collide
RTS
bang ADDA.L #64,A0 \start of YC's from XC's
ADDA.L #10,A1 \start of heights from widths
DBF D5,colp
RTS
aster% \* Animate ALL objects *
MOVE #31,D7
aloop MOVE D7,D6
LSL #1,D6
LEA des(PC),A2 \design
MOVE 0(A2,D6),D4 \get current design
BMI inactive
LEA XS%(PC),A0
MOVE 0(A0,D6),D0 \XS%
MOVE 64(A0,D6),D1 \YS
LEA XC(PC),A1
MOVE 0(A1,D6),D2 \X
MOVE 64(A1,D6),D3 \Y
ADD D0,D2 \new X
BPL ntminx
ADD #320,D2
ntminx CMP #320,D2
BLS ntmaxx
SUB #320,D2
ntmaxx MOVE D2,0(A1,D6)
ADD D1,D3 \new Y
BPL ntminy
ADD #200,D3
ntminy CMP #200,D3
BLS ntmaxy
SUB #200,D3
ntmaxy MOVE D3,64(A1,D6)
CMP #4,D4
BNE ntbul
MOVEM.L D0-D7/A0-A6,-(SP)
BSR ckhit
MOVEM.L (SP)+,D0-D7/A0-A6
CMP #10,D3
BGT ntbul
MOVE #-1,(A2,D6)
ntbul MOVE D4,D0 \Design
MOVE D2,D5 \X
MOVE D3,D6 \Y
LEA ptab(PC),A1
MOVE.L (A1),A1
MOVEM D0-D7/A0-A6,-(SP)
BSR draw
MOVEM (SP)+,D0-D7/A0-A6
inactive
DBRA D7,aloop
exit RTS
draw MOVEQ #0,D1 \* Super sprite routine *
LSL #1,D0
LEA hght(PC),A0
MOVE 0(A0,D0),D7 \get height
LEA wdth(PC),A0
MOVE 0(A0,D0),D3 \get width
LEA ofset(PC),A0
MOVE 0(A0,D0),D1 \calculate offset
ADD.L D1,A1
MOVEQ #0,D0
MOVE D5,D2
MOVE D5,D0
MOVE D6,D1
ANDI #15,D2 \ get bit shift in word to D2
ANDI #$FFF0,D0
LSR #1,D0 \ get byte offset of x (x div 16)*8
LSL #1,D1 \ y * 2
LEA mult(PC),A2 \ start of mult table
MOVE 0(A2,D1),D1 \ start row for Y (y * 160)
ADD D1,D0 \ add row to column
LEA screen_A(PC),A0 \ address of screen ram
MOVE.L (A0),A0
ADDA.L D0,A0 \ final screen address in A0
LEA screen_A(PC),A2
MOVE.L (A2),A2
ADDA.L #32000,A2
height MOVE D3,D4
MOVE #160,D5
width MOVEQ #3,D6
planes MOVEQ #0,D0
MOVE (A1)+,D0
SWAP D0
LSR.L D2,D0
OR D0,8(A0)
SWAP D0
OR D0,(A0)+
SUBQ #2,D5
DBF D6,planes
DBF D4,width
ADDA.L D5,A0
ADDA.L D5,A1
CMP.L A0,A2
BHI ntover
SUB.L #32000,A0
ntover DBF D7,height
RTS
exscreen% \* Swap the screens over *
LEA screen_A(PC),A0
LEA screen_B(PC),A1
MOVE.L (A0),D0
MOVE.L (A1),D1
EXG.L D0,D1
MOVE.L D0,(A0)
MOVE.L D1,(A1)
MOVE #-1,-(SP)
MOVE.L screen_B(PC),-(SP)
MOVE.L #-1,-(SP)
MOVE #5,-(SP)
TRAP #14
ADDA #12,SP
MOVE #37,-(SP)
TRAP #14
ADDA #2,SP
RTS
wipescreen% \* Clear drawing screen *
MOVE #8000,D0
MOVE.L screen_A(PC),A0
cllp MOVE.L #0,(A0)+
DBF D0,cllp
RTS
mult DS.W 202,0
screen_A DC.L $AAAA
screen_B DC.L $BBBB
ptab DC.L $CCCC
ofset DC.W 0,32,5632,72,146
hght DC.W 50,25,14,39,8
wdth DC.W 3,1,1,0,0
rwth DC.W 56,29,16,16,8
rhgt DC.W 50,22,14,39,4
XC DC.W 160,0,0,0,0,100,0,230,70
DS.W 23,0
YC DC.W 138,0,0,0,0,0,0,0,0
DS.W 23,0
XS% DC.W -1,0,0,0,0,0,0,0,0
DS.W 23,0
YS DC.W 0,-4,-5,-6,-7,1,2,4,3
DS.W 23,0
des DC.W 3,-1,-1,-1,-1,0,0,0,0
DS.W 23,-1
bits DC.W 1,2,0,1,1,0
vex DS.W 255,0
hitf% DC.B 0
fird% DC.B 0
role% DC.W 0
]
NEXT
!(screen_A+code%)=screen:!(screen_B+code%)=old_screen
FOR N%=0 TO 199:B&=N%*160:{mult+code%+N%*2}&=B&:NEXT
FOR N%=0 TO 95:REPEAT:b&=RND(5)-RND(5):UNTILb&:{vex+code%+N%*2}&=b&:NEXT
ENDPROC
DEF PROCobjects
PROCsound:HIDEMOUSE
DIM X&(4),Y&(4)
RESERVE pxtab,16000:LOGBASE=pxtab
!(ptab+code%)=pxtab
GRAFRECT 0,0,320,100:CLG0
FOR N=2 TO 15:C=N-1
FILLCOL N:FILLSTYLE 1,0
IF N<10 THEN PALETTE N,C*125,0,0 ELSE PALETTE N,1000,(C-5)*125,(C-10)*125
CIRCLE 80,13-N/2,16-N
CIRCLE 33-N,27-N,32-N*2
CIRCLE 75,42,12-N/1.5
FILLCOL 16-N:FILLSTYLE 2,6
ELLPIE 152,27,8-n/2,30-N*1.5,0,3600
CIRCLE 292,3,5-N/10
NEXT
SETCOL 15,7,7,7
LOGBASE=PHYSBASE
ENDPROC
DEFPROCsound
RESERVE ex%,70
FOR i=0 TO 57:READ ex%?i:NEXT
ENDPROC
REM explosion
DATA 6,1,7,63-8,8,16
DATA 11,0,12,70,13,1
DATA $82,200,7,63,$FF,0
REM shooting
DATA 7,63-8,8,15
DATA 11,200,12,5,13,13
DATA $80,0,$81,6,5,30
DATA $82,1,7,63,$FF,0
REM explosion 2
DATA 6,31,7,63-8,8,16
DATA 11,0,12,70,13,1
DATA $82,200,7,63,$FF,0