
	SECTION	Shadows_Code,CODE_C
	
*************************************************
*						*
*	Mini-Intro				*
*						*
*	By the one and only Shadow		*
*						*
*	All code/grafix by Marcus Lynn		*
*						*
*	(c)1989 Amiga Computing			*
*						*
*	All good programmers,			*
*	Please excuse the use of library	*
*	routines but this is old code and	*
*	I couldn't be bothered to change it.	*
*						*
*************************************************

*************************************************
*	First A few Equates			*
*************************************************

FORBID		=	-132
OPENLIBRARY	=	-552
ALLOCRASTER	=	-492
INITBITMAP	=	-390
INITRASTPORT	=	-198
FREERASTER	=	-498
MOVE		=	-240
TEXT		=	-60
BLTBITMAP	=	-30
BLTCLEAR	=	-300
SETAPEN		=	-342
DRAW		=	-246

*************************************************
*	Forbid System and get GraphicsBase	*
*************************************************

	MOVE.L 	$4.W,A6	
	JSR 	FORBID(A6)

	MOVE.L 	$4.W,A6		
	MOVE.L 	#GRAPHICSNAME,A1
	CLR 	D0
	JSR 	OPENLIBRARY(A6)
	TST.L	D0
	BEQ	ERROR
	MOVE.L 	D0,GRAPHICSBASE

*************************************************
*	Allocate Space for Screens		*
*************************************************

	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#320,D0
	MOVE.L 	#500,D1
	JSR 	ALLOCRASTER(A6)
	TST.L	D0
	BEQ 	ERROR
	MOVE.L 	D0,SCREEN

	ADD.L 	#(320*250)/8,D0

	MOVE.L 	D0,SCREEN1

*************************************************
*	Initialise Bitmaps And Rastports	*
*************************************************

	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#BITMAP2,A0
	MOVE.W 	#1,D0
	MOVE.W 	#320,D1
	MOVE.W 	#250,D2
	JSR 	INITBITMAP(A6)
	MOVE.L 	SCREEN,BM2_PL1
	
	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#RASTPORT2,A1
	JSR 	INITRASTPORT(A6)
	MOVE.L 	#BITMAP2,RPORT2_BITMAP

	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#BITMAP3,A0
	MOVE 	#1,D0
	MOVE 	#640,D1
	MOVE 	#20,D2
	JSR 	INITBITMAP(a6)
	
	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#640,D0
	MOVE.L 	#20,D1
	JSR 	ALLOCRASTER(A6)
	TST 	D0
	BEQ 	ERROR
	MOVE.L 	D0,BM3_PL1

	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#RASTPORT3,A1
	JSR 	INITRASTPORT(A6)
	MOVE.L 	#BITMAP3,RPORT3_BITMAP
	
*************************************************
*	Insert Bitplanes Into Copper List	*
*************************************************

	MOVE.L	BM3_PL1,D0
	MOVE.L	#TXTSCRN,A0
	MOVE.W	D0,6(A0)
	SWAP 	D0
	MOVE.W	D0,2(A0)

	MOVE.L	BM3_PL1,D0
	MOVE.L	#TXTSCRN1,A0
	MOVE.W	D0,6(A0)
	SWAP 	D0
	MOVE.W	D0,2(A0)

*************************************************
*		Clear Screens			*
*************************************************

	MOVE.L	BM3_PL1,A0
	MOVE.W	#((640/8)*19)/4,D0
CLRIT:	CLR.L	(A0)+
	DBRA	D0,CLRIT

	MOVE.L 	SCREEN,A1
	JSR 	CLR
	MOVE.L 	SCREEN1,A1
	JSR 	CLR

*************************************************
*	Save Old Copper and Insert Ours		*
*************************************************

	MOVE.L 	GRAPHICSBASE,A0
	MOVE.L 	$32(A0),OLDCOPPER
	MOVE.L 	#NEWCOPPER,$32(A0)

	JSR	SWITCH_ON_MUSIC		;Obvious !!!
	JSR	INITCOPPER	
	
*************************************************
*	Main Loop				*
*************************************************

WAIT:	
	JSR 	SWAP		;Swap Screen
	ADD 	#3,ZANGLE
	ADD 	#1,YANGLE
	ADD 	#3,XANGLE
	JSR 	ROTATE		;Rotate 3d Image
	JSR 	PERS		;Calculate Perspective
	JSR 	DISPLAY		;Draw Image
	JSR 	SCROLL		;Do scrolly
	JSR 	STARS		;Update Stars

WAITPOS:CMP.B 	#$FF,$DFF006	;Wait for beam
	BNE 	WAITPOS	

	JSR	CLRCOPPER	;Clear Copper Background
	JSR	DOBARS		;Setup Copper Bars
	JSR	PLAYSOUND	;Uhhmmm???
	
	ANDI.B 	#$40,$BFE001	;Wait for Mouse Button
	BNE 	WAIT
	
*************************************************
*	Turn Off music and Restore Copper	*
*************************************************

	JSR	SWITCH_OFF_MUSIC

	MOVE.L 	GRAPHICSBASE,A0
	MOVE.L 	OLDCOPPER,$32(A0)

*************************************************
*	Give Memory Back to System		*
*************************************************

	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	SCREEN,A0
	MOVE 	#320,D0
	MOVE 	#500,D1
	JSR 	FREERASTER(A6)

	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	BM3_PL1,A0
	MOVE 	#640,D0
	MOVE 	#20,D1
	JSR 	FREERASTER(A6)
	CLR 	D0		
ERROR:	RTS

*************************************************
*	Data Section (Yeuch! COBOL) and		*
*		Routines......			*
*************************************************

SCREEN:	DC.L 0
SCREEN1:
	DC.L 0
GRAPHICSNAME:
	DC.B 'graphics.library',0
	EVEN
GRAPHICSBASE:
	DC.L 0
OLDCOPPER:	
	DC.L 0
NEWCOPPER:
	DC.W $120,0
	DC.W $122,0
	DC.W $008e,$2C81
	DC.W $0090,$20C1
	DC.W $0092,$0038
	DC.W $0094,$00d0
	DC.W $0108,0
	DC.W $010a,0
	DC.W $0102,0
	DC.W $100,%0001001000000000
	DC.W $180,0,$182,$FFFF,$184,$ffff
BOT:	DC.W $E0,0,$E2,0
barcopper:
	ds.w 400

	DC.W $ffe1,$fffe
	DC.W $100,%0010001000000000
	DC.W $0501,$fffe,$180,$444
	DC.W $0901,$fffe,$180,$777
	DC.W $0B01,$fffe
TXTSCRN1:
	DC.W $E4,0,$E6,0
	DC.W $0c01,$fffe
TXTSCRN:DC.W $E0,0,$E2,0
	DC.W $182,0,$102,$2
	DC.W $2501,$fffe,$180,$333
	DC.W $2901,$fffe,$180,$0
	DC.W $FFFF,$FFFE

*************************************************
*	Star Routine				*
*************************************************

STARS:	MOVE.W	#19,D7		;Number of Stars
	MOVE.L	#STARDAT,A0	;Address of StarTable
STARLOOP:
	MOVE.W	(A0),D0		;Get Increment Value
	MOVE.W	2(A0),D1	;Get X Value
	ADD.W	D0,D1		;Add Increment to X
	MOVE.W	D1,2(A0)	;Write back
	TST.W	D1		;Make sure still on screen
	BPL	STAROK		;Ok then branch
	MOVE.W	#319,2(A0)	;Else reset to right
STAROK	MOVE.W	2(A0),D0	;X Value
	MOVE.W	4(A0),D1	;Y Value
	MOVE.W	#1,D4		;1 = Plot
	JSR	PLOT		;Jump to my Plot Routine
	ADD.L	#6,A0		;Increment to next star
	DBRA	D7,STARLOOP	;Until no stars left
	RTS			;Finito
STARDAT:
	DC.W -1,3,10		;increment,Xval,Yval
	DC.W -2,10,40
	DC.W -2,11,130
	DC.W -6,45,199
	DC.W -3,23,20
	DC.W -4,140,56
	DC.W -3,260,176
	DC.W -4,170,87
	DC.W -3,80,69
	DC.W -6,290,120
	DC.W -5,20,180
	DC.W -2,300,150
	DC.W -5,73,120
	DC.W -3,160,176
	DC.W -4,70,127
	DC.W -3,280,169
	DC.W -6,310,190
	DC.W -5,120,180
	DC.W -2,300,150
	DC.W -5,173,120

PLOT:	MOVE.L 	BM2_PL1,A1	;Custom Plot Routine 
	MOVE.L 	D1,D3 
	MULU 	#40,D3  
	ADD.L 	D3,A1
	MOVE.L 	D0,D2
	DIVU 	#8,D2
	ADD 	D2,A1
	SWAP	D2
	SUB	#7,D2
	NEG 	D2
	TST	D4
	BEQ	CLRPOINT
	BSET	D2,(A1)
	RTS
CLRPOINT:
	BCLR 	D2,(A1)
	RTS

*************************************************
*	Scrolling Text				*
*************************************************

SCROLL:	ADDI.B	#1,CHARNOW	;Increment Charcounter
	CMPI.B	#3,CHARNOW	;New Character ?
	BNE.S 	SCROLLONLY	;No then branch
	CLR.B	CHARNOW		;else charcounter = 0

	ADDI.L	#1,PTXT		;Increment text pointer
	MOVE.L	PTXT,A0		
	TST.B 	(A0)		;Get New Character
	BNE.S	NOTZERO		;Branch if not at end 
	MOVE.L	#TXT,PTXT	;Else reset pointer
	MOVE.L	PTXT,A0
NOTZERO:
	MOVE.B	(A0),CCHAR	;Move char value to byte
	MOVE.L	GRAPHICSBASE,A6
	MOVE.L	#RASTPORT3,A1
	MOVE.W 	#313,D0
	MOVE.W	#8,D1
	JSR	MOVE(A6)	;Position Graphics Cursor

	MOVE.L	GRAPHICSBASE,A6
	MOVE.L	#RASTPORT3,A1
	MOVE.L 	#CCHAR,A0
	MOVE.W	#1,D0
	JSR	TEXT(A6)	;Print Text

SCROLLONLY:
	MOVE.L 	GRAPHICSBASE,A6
	MOVE.L 	#BITMAP3,A0 
	MOVE 	#4,D0
	MOVE 	#0,D1
	MOVE.L 	#BITMAP3,A1
	MOVE 	#0,D2
	MOVE 	#0,D3
	MOVE 	#323,D4
	MOVE 	#19,D5
	MOVE 	#$0c0,D6
	MOVE 	#$ff,D7
	JSR	BLTBITMAP(a6)	;Scroll Bitmap
	rts
CHARNOW:	
	DC.B 0,0
PTXT:	DC.L TXT-1
TXT:	DC.B 'Welcome to CD005.'
	DC.B '                          '
	DC.B 'This is Mini-Intro, written by Marcus '
	DC.B 'Lynn.'
	DC.B '     Copyright (c)1989 Amiga Computing.'
	DC.B '                          '
	DC.B 'Bouncing copper bars, parallax scrolling '
	DC.B 'starfields, plus 3D vector graphics - '
	DC.B 'all packed into less than 9k.'
	DC.B '     Study the source code to see how '
	DC.B 'it is done.'
	DC.B '     Click the left mouse button to finish.'
	DC.B '                          '
CCHAR:	DC.B 0,0


*************************************************
*	Data Structures				*
*************************************************

BITMAP2:DS.W 4
BM2_PL1:DC.L 1

RASTPORT2:	
	DC.L 1
RPORT2_BITMAP:	
	DS.L 1
	DS.B 2+4+4+4+8
	DS.B 4
	DS.W 1
	DS.W 1
   	DS.B 8+22+(7*2)+(2*4)+8
	DS.W 6

BITMAP3:DS.W 4
BM3_PL1:DC.L 1

RASTPORT3:	
	DC.L 1
RPORT3_BITMAP:	
	DS.L 1
	DS.B 2+4+4+4+8
	DS.B 4
CP_X3:	DS.W 1
CP_Y3:	DS.W 1
   	DS.B 8+22+(7*2)+(2*4)+8
	DS.W 6

*************************************************
*	Blitter Clear routine			*
*	A1	=	Address to clear	*
*************************************************

CLR:	MOVE.L 	GRAPHICSBASE,A6	
	MOVE.L 	#(320*250)/8,D0
	CLR.L 	D1
	JSR 	BLTCLEAR(A6)
	RTS

*************************************************
*	Swap Logical and Physical Screens	*
*************************************************

SWAP:	MOVE.L 	SCREEN,D0	
	CMP.L 	BM2_PL1,D0	;Is current screen=screen1
	BNE 	SWAPIT		;No then branch
	MOVE.L 	SCREEN,D0	;Display Screen1
	JSR 	INSSCRN		;Insert it Into Copper
	MOVE.L 	SCREEN1,BM2_PL1	;Screen2 = Logical 
	MOVE.L 	SCREEN1,A1	;Address to Clear
	JSR 	CLR		;Do it !!!
  	RTS
  	
SWAPIT:	MOVE.L 	SCREEN1,D0	;Use screen2
	JSR 	INSSCRN		;Insert screen
	MOVE.L 	SCREEN,BM2_PL1	;screen1=logical
	MOVE.L 	SCREEN,A1	;address to clear
	JSR 	CLR
	RTS
	
INSSCRN:MOVE.L 	#BOT,A0		;Insert Screen into Copper
	MOVE 	D0,6(A0)
	SWAP 	D0
	MOVE 	D0,2(A0)
	RTS

*************************************************
*	Draw the 3d Image			*
*************************************************

DISPLAY:MOVE.L 	GRAPHICSBASE,A6	;Set a pen (What!!)
	MOVE 	#1,D0
	MOVE.L 	#RASTPORT2,A1
	JSR 	SETAPEN(A6)

	MOVE.L 	#LINES,A3	;Lines to draw
	MOVE 	NUMLINES,D3	;Number of lines
DLOOP:	
	MOVE.L 	#INTX1,A4	;Intermediate x vals
	MOVE.L 	#INTY1,A5	;Intermediate y vals
	CLR.L 	D0
	MOVE.B 	(A3)+,D0	;First point
	LSL 	#1,D0		;Multiply by 2
	ADD.L 	D0,A4		;Add to X vals
	ADD.L 	D0,A5		;Add to Y vals

	MOVE.L 	GRAPHICSBASE,A6
	MOVE.L 	#RASTPORT2,A1
	MOVE 	(A4),D0
	ADD 	XORG,D0
	MOVE 	(A5),D1
	ADD.W 	YORG,D1
	JSR 	MOVE(A6)

	MOVE.L 	#INTX1,A4
	MOVE.L 	#INTY1,A5
	CLR.L 	D0
	MOVE.B 	(A3)+,D0
	LSL 	#1,D0
	ADD.L 	D0,A4
	ADD.L 	D0,A5	

	MOVE.L 	GRAPHICSBASE,A6
	MOVE.L 	#RASTPORT2,A1
	MOVE 	(A4),D0
	ADD	XORG,D0
	MOVE 	(A5),D1
	ADD 	YORG,D1
	JSR 	DRAW(A6)
	
	DBRA D3,DLOOP
	RTS

*************************************************
*	Calculate Perspective for Image		*
*************************************************

PERS:
	MOVE.L 	#INTX,A1
	MOVE.L 	#INTY,A2
	MOVE.L 	#INTZ,A3
	MOVE.L 	#INTX1,A4
	MOVE.L 	#INTY1,A5
	MOVE 	NUMPOINTS,D0
	EXT.L 	D0	
PERLOP:	MOVE 	(A3)+,D5
	MOVE 	D5,D6
	MOVE 	DIST,D4
	SUB 	D5,D4
	EXT.L 	D4
	LSL.L 	#8,D4
	MOVE 	ZOBS,D3
	EXT.L 	D3
	SUB.L 	D6,D3
	BNE	PERS1
	MOVE 	#0,D1
	ADDQ.L 	#2,A1
	ADDQ.L	#2,A2
	MOVE 	D1,(A4)+
	MOVE 	D1,(A5)+	
	BRA 	PEREND1
PERS1:	DIVS 	D3,D4
	MOVE 	D4,D3
	MOVE 	(A1)+,D1
	MOVE 	D1,D2
	NEG 	D1
	MULS 	D1,D3
	LSR.L	#8,D3
	ADD 	D3,D2
	MOVE 	D2,(A4)+
	MOVE	(A2)+,D1
	MOVE	D1,D2
	NEG 	D1
	MULS	D1,D4
	LSR.L	#8,D4
	ADD	D4,D2
	NEG	D2
	MOVE	D2,(A5)+
PEREND1:DBRA 	D0,PERLOP
	RTS
	
*************************************************
*	Rotate Image by X,Y and Z angles	*
*	The following routine first gets	*
*	the sin and cos values for each angle	*
*	(X,Y,Z) and then Performs the 		*
*	calculation:-				*
*						*
*	X rotation X1,Y1 Becomes		*
*						*
*	X2 = X1 COS(THETA) - Y1 SIN(THETA)	*
*	Y2 = Y1 COS(THETA) + X1 SIN(THETA)	*
*						*
*	Y rotation X2,Y2 Becomes		*
*						*
*	X3 = X2 COS(THETA) - Y2 SIN(THETA)	*
*	Y3 = Y2 COS(THETA) + X2 SIN(THETA)	*
*						*
*	Z rotation X3,Y3 Becomes		*
*						*
*	X4 = X3 COS(THETA) - Y3 SIN(THETA)	*
*	Y4 = Y3 COS(THETA) + X3 SIN(THETA)	*
*						*
*	Where THETA is angle to rotate by.	*
*************************************************

ROTATE:
	CMP 	#360,ZANGLE
	BLT 	ZOK
	CLR 	ZANGLE
ZOK:	CMP 	#-360,ZANGLE
	BGT 	Z1OK
	CLR 	ZANGLE
Z1OK:	MOVE 	ZANGLE,D0
	JSR 	SINCOS
	MOVE 	D1,ZSIN
	MOVE	D2,ZCOS
	CMP 	#360,YANGLE
	BLT 	YOK
	CLR 	YANGLE
YOK:	CMP 	#-360,YANGLE
	BGT 	Y1OK
	CLR 	YANGLE
Y1OK:	MOVE 	YANGLE,D0
	JSR 	SINCOS
	MOVE 	D1,YSIN
	MOVE 	D2,YCOS
	CMP 	#360,XANGLE
	BLT 	XOK
	CLR 	XANGLE
XOK:	CMP 	#-360,XANGLE
	BGT 	X1OK
	CLR 	XANGLE
X1OK:	MOVE 	XANGLE,D0
	JSR 	SINCOS
	MOVE 	D1,XSIN
	MOVE 	D2,XCOS
	MOVE.L 	#WX,A0
	MOVE.L 	#WY,A1
	MOVE.L 	#WZ,A2
	MOVE.L 	#INTX,A3
	MOVE.L 	#INTY,A4
	MOVE.L 	#INTZ,A5
	MOVE 	NUMPOINTS,D0
RLOOP:	
ZROTATE:MOVE 	ZSIN,D1
	MOVE 	ZCOS,D2
	MOVE 	(A0),D3
	MULS 	D3,D2
	MOVE 	(A1),D3
	MULS 	D3,D1
	SUB.L 	D1,D2
	LSR.L 	#8,D2
	LSR.L 	#6,D2
	MOVE 	D2,D5
	MOVE 	ZSIN,D1
	MOVE 	ZCOS,D2
	MOVE 	(A0)+,D3
	MULS 	D3,D1
	MOVE 	(A1)+,D3
	MULS 	D3,D2
	ADD.L 	D1,D2
	LSR.L 	#8,D2
	LSR.L 	#6,D2
	MOVE 	D2,D6
YROTATE:MOVE 	YSIN,D1
	MOVE 	YCOS,D2
	MOVE 	(A2),D3
	MULS 	D3,D2
	MOVE 	D5,D3
	MULS 	D3,D1
	SUB.L 	D1,D2
	LSR.L 	#8,D2
	LSR.L 	#6,D2
	MOVE 	D2,D7
	MOVE 	YSIN,D1
	MOVE 	YCOS,D2
	MOVE 	(A2)+,D3
	MULS 	D3,D1
	MOVE 	D5,D3
	MULS 	D3,D2
	ADD.L 	D1,D2
	LSR.L 	#8,D2
	LSR.L 	#6,D2
	MOVE 	D2,D5
XROTATE:MOVE 	XSIN,D1
	MOVE 	XCOS,D2
	MOVE 	D6,D4	
	MOVE 	D6,D3
	MULS 	D3,D2
	MOVE 	D7,D3
	MULS 	D3,D1
	SUB.L 	D1,D2
	LSR.L 	#8,D2
	LSR.L 	#6,D2
	MOVE 	D2,D6
	MOVE 	XSIN,D1
	MOVE 	XCOS,D2
	MOVE 	D4,D3
	MULS 	D3,D1
	MOVE 	D7,D3
	MULS 	D3,D2
	ADD.L 	D1,D2
	LSR.L 	#8,D2
	LSR.L 	#6,D2
	MOVE 	D2,D7
	MOVE 	D5,(A3)+
	MOVE 	D6,(A4)+
	MOVE 	D7,(A5)+
	DBRA 	D0,RLOOP
	RTS

*************************************************
*	Data points for disk			*
*************************************************

WX:	DC.W -50,-50,-40,50,50,-45,45,45,-45,-25,25,25,-25
	DC.W -50,-50,-40,50,50,-45,45,45,-45,-25,25,25,-25

WY:	DC.W 50,-40,-50,-50,50,45,45,20,20,-15,-15,-50,-50 
	DC.W 50,-40,-50,-50,50,45,45,20,20,-15,-15,-50,-50 

WZ:	DC.W 50,50,50,50,50,50,50,50,50,50,50,50,50
	DC.W 45,45,45,45,45,45,45,45,45,45,45,45,45

LINES:	DC.B 0,1,1,2,2,3,3,4,4,0,5,6,6,7,7,8,8,5
	DC.B 9,10,10,11,11,12,12,9
	DC.B 13,14,14,15,15,16,16,17,17,13,18,19
	DC.B 19,20,20,21,21,18,22,23,23,24,24,25,25,22
	DC.B 0,13,1,14,2,15,3,16,4,17

NPOINTS	= 26
NLINES = 31

ZOBS:	DC.W 150
DIST:	DC.W 10
XORG:	DC.W 160
YORG:	DC.W 100
YORG1:	DC.W 200
ZANGLE:	DC.W 0
XANGLE:	DC.W 0
YANGLE:	DC.W 0

ZSIN:	DC.W 0
ZCOS:	DC.W 0
YSIN:	DC.W 0
YCOS:	DC.W 0
XSIN:	DC.W 0
XCOS:	DC.W 0
NUMLINES:
	DC.W NLINES-1
NUMPOINTS:
	DC.W NPOINTS-1
INTX:	DS.W NPOINTS	
INTY:	DS.W NPOINTS	
INTZ:	DS.W NPOINTS	
INTX1:	DS.W NPOINTS	
INTY1:	DS.W NPOINTS	
INTZ1:	DS.W NPOINTS	

*************************************************
*	Get Sin/Cos Value for Angle in d0	*
*************************************************

SINCOS:	TST	D0
	BPL	NOADDI
	ADD	#360,D0
NOADDI:	MOVE.L 	#SINTAB,A1
	MOVE.L 	D0,D2
	LSL 	#1,D0
	MOVE 	(A1,D0),D1
	CMP 	#270,D2
	BLT 	PLUS9
	SUB 	#270,D2
	BRA 	SENDSIN
PLUS9:	ADD 	#90,D2
SENDSIN:LSL 	#1,D2
	MOVE	(A1,D2),D2
	RTS
	
SIN:	MOVE.L 	#SINTAB,A1
	TST 	D0
	BPL 	SIN1
	ADD 	#360,D0
SIN1:	LSL 	#1,D0	
	MOVE 	(A1,D0),D1
	RTS

*************************************************
*	Data for Sintable			*
*						*
*	As using Floating Point Numbers would	*
*	Be Tooooo Slow for the Computer to	*
*	attain a suitable frame rate the values	*
*	are first all multiplied by 16384	*
*	which just happens to be 14 shifts	*
*	left  (very helpfull) which gets	*
*	rid of the decimal point and then	*
*	when multiplied with X or Y are then	*
*	Divided by 16384 (14 shifts right)	*
*		Using this technique fast	*
*	3d graphics are be possible.		*
*						*
*************************************************

SINTAB:	DC.W 0,286,572,857,1143,1428,1713,1997,2280
	DC.W 2563,2845,3126,3406,3686,3964,4240,4516
	DC.W 4790,5063,5334,5604,5872,6138,6402,6664
	DC.W 6924,7182,7438,7692,7943,8192,8438,8682	
	DC.W 8923,9162,9397,9630,9860,10087,10311,10531
	DC.W 10749,10963,11174,11381,11585,11786,11982,12176
	DC.W 12365,12551,12733,12911,13085,13255,13421,13583
	DC.W 13741,13894,14044,14189,14330,14466,14598,14726
	DC.W 14849,14968,15082,15191,15296,15396,15491,15582
	DC.W 15668,15749,15826,15897,15964,16026,16083,16135
	DC.W 16182,16225,16262,16294,16322,16344,16362,16374
	DC.W 16382,16384
	DC.W 16382
	DC.W 16374,16362,16344,16322,16294,16262,16225,16182
	DC.W 16135,16083,16026,15964,15897,15826,15749,15668	
	DC.W 15582,15491,15396,15296,15191,15082,14967,14849
	DC.W 14726,14598,14466,14330,14189,14044,13894,13741	
	DC.W 13583,13421,13255,13085,12911,12733,12551,12365
	DC.W 12176,11982,11786,11585,11381,11174,10963,10749
	DC.W 10531,10311,10087,9860,9630,9397,9162,8923
	DC.W 8682,8438,8192,7943,7692,7438,7182,6924
	DC.W 6664,6402,6138,5872,5604,5334,5063,4790
	DC.W 4516,4240,3964,3686,3406,3126,2845,2563
	DC.W 2280,1997,1713,1428,1143,857,572,286,0
	DC.W -286,-572,-857,-1143,-1428,-1713,-1997,-2280
	DC.W -2563,-2845,-3126,-3406,-3686,-3964,-4240,-4516
	DC.W -4790,-5063,-5334,-5604,-5872,-6138,-6402,-6664
	DC.W -6924,-7182,-7438,-7692,-7943,-8192,-8438,-8682	
	DC.W -8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531
	DC.W -10749,-10963,-11174,-11381,-11585,-11786,-11982,-12176
	DC.W -12365,-12551,-12733,-12911,-13085,-13255,-13421,-13583
	DC.W -13741,-13894,-14044,-14189,-14330,-14466,-14598,-14726
	DC.W -14849,-14968,-15082,-15191,-15296,-15396,-15491,-15582
	DC.W -15668,-15749,-15826,-15897,-15964,-16026,-16083,-16135
	DC.W -16182,-16225,-16262,-16294,-16322,-16344,-16362,-16374
	DC.W -16382,-16384
	DC.W -16382
	DC.W -16374,-16362,-16344,-16322,-16294,-16262,-16225,-16182
	DC.W -16135,-16083,-16026,-15964,-15897,-15826,-15749,-15668	
	DC.W -15582,-15491,-15396,-15296,-15191,-15082,-14967,-14849
	DC.W -14726,-14598,-14466,-14330,-14189,-14044,-13894,-13741	
	DC.W -13583,-13421,-13255,-13085,-12911,-12733,-12551,-12365
	DC.W -12176,-11982,-11786,-11585,-11381,-11174,-10963,-10749
	DC.W -10531,-10311,-10087,-9860,-9630,-9397,-9162,-8923
	DC.W -8682,-8438,-8192,-7943,-7692,-7438,-7182,-6924
	DC.W -6664,-6402,-6138,-5872,-5604,-5334,-5063,-4790
	DC.W -4516,-4240,-3964,-3686,-3406,-3126,-2845,-2563
	DC.W -2280,-1997,-1713,-1428,-1143,-857,-572,-286,0

*************************************************
*	COPPER ROUTINES:-			*
*						*
*	INITCOPPER				*
*	----------				*
*	SETS UP COPPER CODE IN COPPER LIST	*
*						*
*	CLRCOPPER				*	
*	---------				*
*	SETS COPPER BACKGROUND TO BLACK		*
*						*
*	DOBARS					*
*	------					*
*	PROGRAM TO CALL PUTBAR FOR ALL BARS	*
*						*
*	PUTBARS					*
*	-------					*
*	PUTS THE COPPER BARS IN COPPER LISTS	*
*	UPDATES POINTERS			*
*						*
*************************************************

coplines = 99	;100 - 1

INITCOPPER:
	move.l	#barcopper,a0
	move.l	#$3001fffe,d1
	move.l	#$01800000,d2
	move.w  #coplines,d0
initloop:move.l	d1,(a0)+
	move.l	d2,(a0)+
	add.l	#$02000000,d1
	dbra	d0,initloop
	rts

CLRCOPPER:
	move.l	#barcopper,a0
	move.w	#coplines,d0
clrloop:clr.w	6(a0)
	add.l	#8,a0
	dbra 	d0,clrloop
	rts

DOBARS:
	move.l	#bar1,a0
	move.l	barpos1,d0
	bsr	putbar
	move.l 	d0,barpos1
	move.l	#bar2,a0
	move.l	barpos2,d0
	bsr	putbar
	move.l 	d0,barpos2
	move.l	#bar3,a0
	move.l	barpos3,d0
	bsr	putbar
	move.l 	d0,barpos3
	move.l	#bar4,a0
	move.l	barpos4,d0
	bsr	putbar
	move.l 	d0,barpos4
	move.l	#bar5,a0
	move.l	barpos5,d0
	bsr	putbar
	move.l 	d0,barpos5
	move.l	#bar6,a0
	move.l	barpos6,d0
	bsr	putbar
	move.l 	d0,barpos6
	move.l	#bar7,a0
	move.l	barpos7,d0
	bsr.s	putbar
	move.l 	d0,barpos7
	move.l	#bar8,a0
	move.l	barpos8,d0
	bsr.s	putbar
	move.l 	d0,barpos8
	rts
	
putbar:	
	lsl.l	#1,d0
	move.l 	#poslist,a1
	add.l	d0,a1
	cmp.w	#$ffff,(a1)
	bne.s	putbar1
	clr.l	d0
	move.l	#poslist,a1
putbar1:clr.l	d2
	move.w	(a1),d2
	lsl.l	#3,d2
	move.l	#barcopper,a2
	add.l	d2,a2
	move.w	#12,d4
putloop:move.w	(a0)+,6(a2)
	add.l	#8,a2
	dbra	d4,putloop
	lsr.l	#1,d0
	addi.l	#1,d0
	rts

barpos1:	dc.l 0
barpos2:	dc.l 4
barpos3:	dc.l 8
barpos4:	dc.l 12
barpos5:	dc.l 16
barpos6:	dc.l 20
barpos7:	dc.l 24
barpos8:	dc.l 28
bar1:		DC.W $2,$4,6,8,$a,$c,$f,$c,$a,8,6,4,$2
bar2:		DC.W $222,$444,$666,$888,$aaa,$ccc,$fff,$ccc,$aaa,$888,$666,$444,$222
bar3:		DC.W $200,$400,$600,$800,$a00,$c00,$f00,$c00,$a00,$800,$600,$400,$200
bar4:		DC.W $20,$40,$60,$80,$a0,$c0,$f0,$c0,$a0,$80,$60,$40,$20
bar5:		DC.W $12,$24,$36,$48,$5a,$6c,$7f,$6c,$5a,$48,$36,$24,$12
bar6:		DC.W $202,$404,$606,$808,$a0a,$c0c,$f0f,$c0c,$a0a,$808,$606,$404,$202
bar7:		DC.W $210,$420,$630,$840,$a50,$c60,$f70,$c80,$a70,$860,$650,$440,$230
bar8:		DC.W $220,$440,$660,$880,$aa0,$cc0,$ff0,$cc0,$aa0,$880,$660,$440,$220

poslist:	DC.W 1,1,1,2,2,3,4,5,6,8,10,12,15
		DC.W 18,21,23,26,29,32,35,38,41,45
		DC.W 50,55,60,65,70,75,80,85,80,75
		DC.W 70,65,60,55,50,45
		DC.W 41,38,35,32,29,26,23,21,18,15
		DC.W 12,10,8,6,5,4,3,2,2,1,1,1,$ffff

dmacon       = $dff096
aud0lch      = $a0
aud0lcl      = $a2
aud0len      = $a4
aud0per      = $a6
aud0vol      = $a8
s_wavedco    = 0
s_envelope   = 32       
s_sus        = 48
s_end        = 49
s_wavelfo    = 50
s_spdlfo     = 66+16
s_slctlfo    = 68+16
s_typelfo    = 68+16
s_phase      = 69+16
s_arp        = 70+16
s_spdport    = 78+16
s_spdbend    = 80+16
s_egfreq     = 82+16
v_sactive    = 0
v_envpoint   = 4
v_lfowpoint  = 8
v_phmark     = 12
v_notetim    = 14
v_lfotim     = 16
v_arpoint    = 18
v_actnote    = 22
v_wntnote    = 24
v_hardw      = 26
v_trkstp     = 30
v_crnot      = 34
v_trkbck     = 38
v_actfrq     = 42
v_trnspse    = 46
v_savnote    = 50
v_add        = 52
v_pauspnt    = 54
v_actloud    = 56

sound1:
	dc.b -128,-120,-112,-104,-96,-88,-80,-72,-64,-56,-48,-40,-32
	dc.b -24,-16,-8,0,8,16,24,32,40,48,56,64,72,80,88,96,104,112
	dc.b 120

	dc.b 255,255,14,0,0,0,0,0,0,0,0,0,0,0,0,0  ; Envelope (Rate/Level)
	dc.b 0,2  ; No SUS, END is step #2

	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2
	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2

	dc.b 0  ; Speed LFO
	dc.b 0
	dc.b 1  ; LFO: on

	dc.b 0  ; Depth of Phasing, 0=none

	dc.b 0,0,0,0,0,0,0,0  ; Arpeggio

	DC.W 0  ; Speed Portamento (0=none)

	DC.W 0  ; BendRate

	DC.W 0  ; EG frequency off


sound2:
	dc.b 0,-16,-32,-48,-64,-80,-96,-112,-128,-112,-96,-80,-64,-48,-32,-16
	dc.b 0,16,32,48,64,80,96,112,127,112,96,80,64,48,32,16

	dc.b 150,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0  ; Envelope (Rate/Level)
	dc.b 0,1  ; No SUS, END is step #2

	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2
	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2

	dc.b 0  ; Speed LFO
	dc.b 0
	dc.b 0  ; LFO: on

	dc.b 0  ; Depth of Phasing, 0=none

	dc.b 0,0,0,0,0,0,0,0  ; Arpeggio

	DC.W 0  ; Speed Portamento (0=none)

	DC.W 0  ; BendRate

	DC.W 0  ; EG frequency off


sound3:
	dc.b 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
	dc.b 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127

	dc.b 255,255,30,0,0,0,0,0,0,0,0,0,0,0,0,0  ; Envelope (Rate/Level)
	dc.b 0,2  ; No SUS, END is step #2

	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2
	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2

	dc.b 0  ; Speed LFO
	dc.b 0
	dc.b 0  ; LFO: on

	dc.b 0  ; Depth of Phasing, 0=none

	dc.b 0,0,0,0,0,0,0,0  ; Arpeggio

	DC.W 0  ; Speed Portamento (0=none)

	DC.W -30  ; BendRate

	DC.W 0  ; EG frequency off


sound4:
	dc.b 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
	dc.b 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127

	dc.b 40,175,10,100,6,0,0,0,0,0,0,0,0,0,0,0  ; Envelope (Rate/Level)
	dc.b 2,3  ; No SUS, END is step #2

	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2
	dc.b 0,2,4,6,8,6,4,2,0,-2,-4,-6,-8,-6,-4,-2

	dc.b 0  ; Speed LFO
	dc.b 0
	dc.b 0  ; LFO: on

	dc.b 0  ; Depth of Phasing, 0=none

	dc.b 0,0,0,0,0,0,0,0  ; Arpeggio

	DC.W 0  ; Speed Portamento (0=none)

	DC.W 0  ; BendRate

	DC.W 0  ; EG frequency off


	even
freqtab:
	DC.W 6848,6464,6096,5760,5424,5120,4832,4560,4304,4064,3840,3616
	DC.W 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1808
	DC.W 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,0960,0904
	DC.W 0856,0808,0762,0720,0678,0640,0604,0570,0538,0508,0480,0452
	DC.W 0428,0404,0381,0360,0339,0320,0302,0285,0269,0254,0240,0226
	DC.W 0214,0202,0190,0180,0170,0160,0151,0143,0135,0127

voice1:
	dc.l sound1  ; Active Sound
	dc.l 0       ; Pointer to Envelope
	dc.l 0       ; Pointer to LFO-Waveform
	DC.W 0       ; Phaser
	DC.W 0       ; Timer of Note
	DC.W 0       ; Timer of LFO-Speed
	dc.l 0       ; Pointer to Arpeggio
	DC.W 0       ; Actual Frequency
	DC.W 0       ; Wanted Frequency
	dc.l $dff0a0 ; Pointer to Hardware registers
	dc.l 0       ; Current step of track
	dc.l 0       ; Current note
	dc.l track1  ; reset track #
	dc.l 0       ; Actual frequency
	dc.l 0       ; Transpose
	DC.W 0       ; Savenote
	DC.W 0       ; Value to add
	DC.W 0       ; PausePoint
	DC.W 0       ; ActLoud

voice2:
	dc.l sound1  ; Active Sound
	dc.l 0       ; Pointer to Envelope
	dc.l 0       ; Pointer to LFO-Waveform
	DC.W 0       ; Phaser
	DC.W 0       ; Timer of Note
	DC.W 0       ; Timer of LFO-Speed
	dc.l 0       ; Pointer to Arpeggio
	DC.W 0       ; Actual Frequency
	DC.W 0       ; Wanted Frequency
	dc.l $dff0b0 ; Pointer to Hardware registers
	dc.l 0       ; Current step of track
	dc.l 0       ; Current note
	dc.l track2  ; reset track #
	dc.l 0       ; Actual frequency
	dc.l 0       ; Transpose
	DC.W 0       ; Savenote
	DC.W 0       ; Value to add
	DC.W 0       ; PausePoint
	DC.W 0       ; ActLoud

voice3:
	dc.l sound1  ; Active Sound
	dc.l 0       ; Pointer to Envelope
	dc.l 0       ; Pointer to LFO-Waveform
	DC.W 0       ; Phaser
	DC.W 0       ; Timer of Note
	DC.W 0       ; Timer of LFO-Speed
	dc.l 0       ; Pointer to Arpeggio
	DC.W 0       ; Actual Frequency
	DC.W 0       ; Wanted Frequency
	dc.l $dff0c0 ; Pointer to Hardware registers
	dc.l 0       ; Current step of track
	dc.l 0       ; Current note
	dc.l track3  ; reset track #
	dc.l 0       ; Actual frequency
	dc.l 0       ; Transpose
	DC.W 0       ; Savenote
	DC.W 0       ; Value to add
	DC.W 0       ; PausePoint
	DC.W 0       ; ActLoud

voice4:
	dc.l sound1  ; Active Sound
	dc.l 0       ; Pointer to Envelope
	dc.l 0       ; Pointer to LFO-Waveform
	DC.W 0       ; Phaser
	DC.W 0       ; Timer of Note
	DC.W 0       ; Timer of LFO-Speed
	dc.l 0       ; Pointer to Arpeggio
	DC.W 0       ; Actual Frequency
	DC.W 0       ; Wanted Frequency
	dc.l $dff0d0 ; Pointer to Hardware registers
	dc.l 0       ; Current step of track
	dc.l 0       ; Current note
	dc.l track4  ; reset track #
	dc.l 0       ; Actual frequency
	dc.l 0       ; Transpose
	DC.W 0       ; Savenote
	DC.W 0       ; Value to add
	DC.W 0       ; PausePoint
	DC.W 0       ; ActLoud

track1:
	dc.l score1,1,score1,-3,score1,-8,score2,-1
	dc.l 0,0
track2:
	dc.l score3,1
	dc.l 0,0
track3:
	dc.l score4,0
	dc.l 0,0
track4:
	dc.l score8,1,score5,1,score5,1,score7,1,score7,1,score6,1,score6,1
	dc.l 0,0


SWITCH_ON_MUSIC:
	jsr setback
	jsr setup
	move.w #$800f,dmacon
	rts
	
SWITCH_OFF_MUSIC:
	move.w #$000f,dmacon
	rts
	
setback:
	lea $dff000,a0
	jsr reset
	lea $dff010,a0
	jsr reset
	lea $dff020,a0
	jsr reset
	lea $dff030,a0
	jsr reset
	rts
reset:
	clr.l aud0lch(a0)
	clr.w aud0len(a0)
	clr.w aud0per(a0)
	clr.w aud0vol(a0)
	rts

setup:
	move.l #track1,v_trkstp+voice1
	move.l #track2,v_trkstp+voice2
	move.l #track3,v_trkstp+voice3
	move.l #track4,v_trkstp+voice4
	clr.l v_lfowpoint+voice1
	clr.l v_lfowpoint+voice2
	clr.l v_lfowpoint+voice3
	clr.l v_lfowpoint+voice4
	clr.l v_notetim+voice1
	clr.l v_notetim+voice2
	clr.l v_notetim+voice3
	clr.l v_notetim+voice4
	move.l track1,v_crnot+voice1
	move.l track2,v_crnot+voice2
	move.l track3,v_crnot+voice3
	move.l track4,v_crnot+voice4
	move.l track1+4,v_trnspse+voice1
	move.l track2+4,v_trnspse+voice2
	move.l track3+4,v_trnspse+voice3
	move.l track4+4,v_trnspse+voice4
	clr.l v_lfotim+voice1
	clr.l v_lfotim+voice2
	clr.l v_lfotim+voice3
	clr.l v_lfotim+voice4

	move.l #s_wavedco+sound1,aud0lch+$dff000
	move.l #s_wavedco+sound1,aud0lch+$dff010
	move.l #s_wavedco+sound1,aud0lch+$dff020
	move.l #s_wavedco+sound1,aud0lch+$dff030
	move.w #$10,aud0len+$dff000
	move.w #$10,aud0len+$dff010
	move.w #$10,aud0len+$dff020
	move.w #$10,aud0len+$dff030
	rts


PLAYSOUND:
	lea voice1,a0
	jsr playvoice
	lea voice2,a0
	jsr playvoice
	lea voice3,a0
	jsr playvoice
	lea voice4,a0
	jsr playvoice
	rts

playvoice:
	subq.w #1,v_notetim(a0)
	bpl notyet1
	clr.w v_add(a0)
	clr.w v_pauspnt(a0)
musl1:
	move.l v_crnot(a0),a1
	move.l v_trnspse(a0),d3
	clr.l d4
	move.w (a1),d4
	cmp.w #128,d4          ;change snd?
	bne testarp
	clr.l v_lfowpoint(a0)
	move.l 2(a1),v_sactive(a0)
	addi.l #6,v_crnot(a0)
	move.l 2(a1),d5
	move.l v_hardw(a0),a3
	move.l d5,(a3)
	bra musl1 
testarp:
	cmp.w #129,d4          ;change arp?
	bne chpause
	move.l v_sactive(a0),a3
	move.l 2(a1),s_arp(a3)
	move.l 6(a1),s_arp+4(a3)
	addi.l #10,v_crnot(a0)
	bra musl1
chpause:
	cmp.w #130,d4          ;pause?
	bne chweiter
	move.w #1,v_pauspnt(a0)
	bra gut1
chweiter:
	add.w d4,d3
	cmpi.l #$00,d4
	bne gut1
	addi.l #8,v_trkstp(a0)
	move.l v_trkstp(a0),a2
	move.l 4(a2),v_trnspse(a0)
	move.l (a2),v_crnot(a0)
	bne musl1
	move.l v_trkbck(a0),v_trkstp(a0)
	move.l v_trkstp(a0),a2
	move.l 4(a2),v_trnspse(a0)
	move.l (a2),v_crnot(a0)
	bra musl1
gut1:
	tst.w v_pauspnt(a0)
	bne notset
	clr.l v_envpoint(a0)
	clr.w v_actloud(a0)
	move.w d3,v_savnote(a0)
notset:
	move.w 2(a1),v_notetim(a0)
	subq.w #1,v_notetim(a0)
	adda.l #4,a1
	move.l a1,v_crnot(a0)
notyet1:
	move.l v_hardw(a0),a2
	move.l v_sactive(a0),a3
	move.w v_wntnote(a0),d0
	subq.w #1,d0
	mulu #2,d0
	lea freqtab,a4
	move.w (a4,d0.w),d1
	move.w s_spdport(a3),d0
	beq noport
	cmp.w v_actfrq(a0),d1
	blo portdown
	add.w d0,v_actfrq(a0)
	cmp.w v_actfrq(a0),d1
	bhi nochklei
	move.w d1,v_actfrq(a0)
nochklei:
	bra portaend
portdown:
	sub.w d0,v_actfrq(a0)
	cmp.w v_actfrq(a0),d1
	blo nochgroe
	move.w d1,v_actfrq(a0)
nochgroe:
	bra portaend
noport:
	add.w v_add(a0),d1
	move.w d1,v_actfrq(a0)
portaend:
	move.l v_sactive(a0),a3
	adda.l #s_arp,a3
	move.l v_arpoint(a0),d1
	clr.l d2
	move.b (a3,d1.l),d2
	bpl positiv
	neg.b d2
	clr.l d3
	move.w v_savnote(a0),d3
	sub.w d2,d3
	move.w d3,d2
	bra negativ
positiv:
	add.w v_savnote(a0),d2
negativ:
	move.w d2,v_wntnote(a0)
	addq.l #1,v_arpoint(a0)
	cmp.l #8,v_arpoint(a0)
	bne notnull
	clr.l v_arpoint(a0)
notnull:
	move.l v_sactive(a0),a3
	tst.w v_phmark(a0)
	beq ffff
	clr.w v_phmark(a0)
	clr.l d2
	move.b s_phase(a3),d2
	move.w v_actfrq(a0),d1
	add.w d2,d1
	move.w d1,v_actfrq(a0)
	bra wasffff
ffff:
	move.w #$ffff,v_phmark(a0)
	clr.l d2
	move.b s_phase(a3),d2
	move.w v_actfrq(a0),d1
	sub.w d2,d1
	move.w d1,v_actfrq(a0)
wasffff:
	clr.l d2
	move.w s_spdbend(a3),d2
	sub.w d2,v_add(a0)
	clr.l d0
	move.w v_actfrq(a0),d0
	move.w s_egfreq(a3),d1
	beq noteg
	bmi dazu
	sub.w v_actloud(a0),d0
	bra noteg
dazu:
	add.w v_actloud(a0),d0
noteg:
	move.l v_lfowpoint(a0),d1
	subq.b #1,v_lfotim(a0)
	bpl notyet2
	addq.l #1,d1
	cmp.l #$20,d1
	bne nichtnull
	clr.l d1
nichtnull:
	move.l d1,v_lfowpoint(a0)
	move.b s_spdlfo(a3),v_lfotim(a0)
notyet2:
	lea s_wavelfo(a3),a4
	clr.l d2
	move.b (a4,d1.l),d2
	ext.w d2
	tst.b s_slctlfo(a3)
	beq nonelfo
	add.w d2,d0
nonelfo:
	move.w d0,$06(a2)
	clr.l d2
	move.l v_sactive(a0),a2
	clr.l d0
	clr.l d1
	move.b s_sus(a2),d0
	move.b s_end(a2),d1
	cmp.l v_envpoint(a0),d1
	beq envelopend
	cmp.l #$00,d0
	beq notsustep
	cmp.l v_envpoint(a0),d0
	bne notsustep
	cmpi.w #$00,v_pauspnt(a0)
	beq envelopend
notsustep:
	move.l v_envpoint(a0),d2
	mulu #2,d2
	lea s_envelope(a2),a3
	clr.l d3
	clr.l d4
	move.b (a3,d2.w),d3
	move.b 1(a3,d2.w),d4
	cmp.w v_actloud(a0),d4
	bhi loudup
	sub.w d3,v_actloud(a0)
	cmp.w v_actloud(a0),d4
	ble nichtunt
	move.w d4,v_actloud(a0)
	addq.l #$1,v_envpoint(a0)
nichtunt:
	bra envelopend
loudup:
	add.w d3,v_actloud(a0)
	cmp.w v_actloud(a0),d4
	bhi envelopend
	move.w d4,v_actloud(a0)
	addq.l #$1,v_envpoint(a0)
envelopend:
	clr.l d1
	move.w v_actloud(a0),d1
	divu #4,d1
	move.l v_hardw(a0),a1
	move.w d1,$08(a1)
	rts

score1:
	DC.W 128
	dc.l sound1
	DC.W 129
	dc.l 0,0
	DC.W 25,12,25,24,25,6,37,6,25,12,25,36
	DC.W 0,0

score2:
	DC.W 128
	dc.l sound1
	DC.W 129
	dc.l 0,0
	DC.W 25,12,25,24,25,6,23,6,25,12,25,36
	DC.W 0,0

score3:
	DC.W 128
	dc.l sound2
	DC.W 129
	dc.l $00030700,$00030700
	DC.W 61,96
	DC.W 129
	dc.l $00030800,$00030800
	DC.W 61,96
	DC.W 129
	dc.l $fe0307fe,$fe0307fe
	DC.W 61,96
	DC.W 129
	dc.l $fe0205fe,$fe0205fe
	DC.W 61,96
	DC.W 0,0

score4:
	DC.W 128
	dc.l sound3
	DC.W 129
	dc.l 0,0
	DC.W 130,24,45,12,130,36,45,12,45,6,45,6
	DC.W 130,24,45,12,130,36,45,8,44,8,43,8
	DC.W 0,0

score5:
	DC.W 128
	dc.l sound4
	DC.W 129
	dc.l 0,0
	DC.W 49,48,52,12,51,12,49,12,47,12,45,48
	DC.W 52,12,51,12,49,12,47,12,52,48
	DC.W 52,12,51,12,49,12,47,12
	DC.W 54,24,51,24,49,24,47,24
	DC.W 0,0

score6:
	DC.W 128
	dc.l sound4
	DC.W 129
	dc.l 0,0
	DC.W 49,48,56,12,56,12,56,12,54,24,56,108
	DC.W 52,12,52,24,52,24,52,12
	DC.W 54,24,51,24,49,24,47,24
	DC.W 0,0

score7:
	DC.W 128
	dc.l sound4
	DC.W 129
	dc.l 0,0
	DC.W 49,72,56,24,54,12,52,12,49,96
	DC.W 52,12,52,24,52,24,52,12
	DC.W 54,24,51,24,49,24,47,24
	DC.W 0,0

score8:
	DC.W 130,384
	DC.W 0,0

