
; This program shows how to reuse a sprite channel. A total of ten sprites
;are displayed ( 1 blank and 9 letters ).

; The program is multi-tasking friendly, the sprite channel is requested and
;initialised by the graphics library, no custom copperlists here. To see the
;beauty of this method of programming run the final version a few times, do
;not click the mouse in between. You will end up with LOADS OF SPRITES.

; To make the sprite go away, press both mouse buttons.

; In case you do not know, AMIGANUTS UNITED are one of the oldest PD Libraries
;in the UK. They can be contacted on Southampton ( 0703 ) 785680.

; The COPYRIGHT of this program is mine, M.Meany 1990.
		


CALLEXEC	MACRO
	MOVE.L	$4,A6
	JSR	\1(A6)
	ENDM

CALLGRAF	MACRO
	MOVE.L	GFXBASE,A6
	JSR	\1(A6)
	ENDM

CIAAPRA		EQU		$BFE001

; Exec lib offsets

OPENLIBRARY	EQU		-552
CLOSELIBRARY	EQU		-414

; Graphics Lib offsets

WAITTOF		EQU		-270 
SETRGB4		EQU		-288 
GETSPRITE	EQU		-408 
FREESPRITE	EQU		-414 
CHANGESPRITE	EQU		-420 
MOVESPRITE	EQU		-426 
GB_ACTIVIEW	EQU		$22
V_VIEWPORT	EQU		$0
SS_HEIGHT	EQU		$4
SS_X		EQU		$6
SS_Y		EQU		$8


START		BSR		MOVE_SPRITE	INIT SPRITE DATA

; Open graphics library

		MOVEQ.L		#0,D0
		LEA		GFXNAME,A1
		CALLEXEC	OPENLIBRARY
		MOVE.L		D0,GFXBASE
		BEQ		QUIT_FAST

; Find the viewport for the current view

		MOVE.L		D0,A0
		MOVE.L		GB_ACTIVIEW(A0),A0
		MOVE.L		V_VIEWPORT(A0),A0
		MOVE.L		A0,VIEWPORT
		
; Get a sprite to use
		
		LEA		SPRITE,A0
		MOVE.L		#-1,D0
		CALLGRAF	GETSPRITE
		MOVE.L		D0,SPRITE_NUM
		ADDQ.L		#1,D0
		BEQ		QUIT
		SUBQ.L		#1,D0
		
; Set colour registers ( the hard way !!! )

		MOVE.L		SPRITE_NUM,D7
		ANDI.L		#6,D7
		ASL.L		#1,D7
		ADDI.L		#17,D7
		
		MOVE.L		VIEWPORT,A0
		MOVE.L		D7,D0
		MOVE.L		#$F,D1
		MOVE.L		#$8,D2
		MOVE.L		#$0,D3
		CALLGRAF	SETRGB4
		ADDQ.L		#1,D7
		MOVE.L		VIEWPORT,A0
		MOVE.L		D7,D0
		MOVE.L		#$F,D1
		MOVE.L		#$F,D2
		MOVE.L		#$0,D3
		CALLGRAF	SETRGB4
		ADDQ.L		#1,D7
		MOVE.L		VIEWPORT,A0
		MOVE.L		D7,D0
		MOVE.L		#$F,D1
		MOVE.L		#$A,D2
		MOVE.L		#$C,D3
		CALLGRAF	SETRGB4
		
; Set the sprites x,y and height details
		
		MOVE.L		#0,A0
		LEA		SPRITE,A1
here1		MOVE.W		#$140,SS_X(A1)
		MOVE.W		#150,SS_Y(A1)
		MOVE.W		#8,SS_HEIGHT(A1)

; Display the sprite

		LEA		SPRITE_DATA,A2
		CALLGRAF	CHANGESPRITE
	
		MOVE.L		#$80A08800,SPRITE_DATA

; Move it
	
MOUSE		CALLGRAF	WAITTOF
		BSR		MOVE_SPRITE

; Wait for mouse

		BTST		#6,CIAAPRA
		BNE		MOUSE
		BTST		#$0A,$DFF016
		BNE		MOUSE
		
; Wait for blanking gap
		
		CALLGRAF	WAITTOF

; Give sprite back to system

		MOVE.L		SPRITE_NUM,D0
		CALLGRAF	FREESPRITE

; Close graphics library

QUIT		MOVE.L		GFXBASE,A1
		CALLEXEC	CLOSELIBRARY
QUIT_FAST	RTS

*****************************************************************************	
	
MOVE_SPRITE	LEA		SPRITE_DATA,A2
		LEA		SPRITE_POS,A0	GET POINTER TO X-OFFSET
		MOVEQ.L		#9,D1		D1= COUNTER ( 10 IMAGES )
		MOVEQ.L		#1,D0		INIT DISPLACEMENT
MOVE_LOOP	MOVE.L		(A0),A1		A1= ADDR OF X-OFFSET
		TST.B		(A1)		END OF TABLE ?
		BNE.S		LEGAL_POS	IF NOT DON't worry
		LEA		TABLE,A1	else go back to start
LEGAL_POS	MOVE.B		(A1)+,0(A2,D0)	update x position of sprite
		ADD.L		#36,D0		d0=offset to next sprites x-pos
		MOVE.L		A1,(A0)+	save ptr to this sprites x-pos
		DBRA		D1,MOVE_LOOP	repeat for all 9 images
		RTS


*****************************************************************************	
; Variables

GFXNAME		dc.b		'graphics.library',0
		even
GFXBASE		dc.l		0
VIEWPORT	dc.l		0
SPRITE_NUM	dc.l		0

SPRITE		ds.b		20		more than enough ( 12 )
		even
		
		

SPRITE_POS	dc.l		pos1		holds pts to each images 
		dc.l		pos2		place in the x-sp table
		dc.l		pos3
		dc.l		pos4
		dc.l		pos5
		dc.l		pos6
		dc.l		pos7
		dc.l		pos8
		dc.l		pos9
		dc.l		posa


TABLE		dc.b	57+6,57+6,57+6,57+6,57+6,57+6,57+6,57+6,57+6
		dc.b	58+6,58+6,58+6,58+6,58+6,59+6,59+6,59+6,60+6,60+6
		dc.b	61+6,61+6,62+6,62+6,63+6,64+6,65+6,66+6,67+6,68+6
		dc.b	69+6,70+6,71+6,73+6,75+6,77+6,79+6,82+6,85+6
posa		dc.b	88+6
pos9		dc.b	92+6
pos8		dc.b	96+6
pos7		dc.b	100+6
pos6		dc.b	105+6
pos5		dc.b	111+6
pos4		dc.b	117+6
pos3		dc.b	124+6
pos2		dc.b	131+6
pos1		dc.b	138+6,145+6,151+6,157+6,162+6,166+6,170+6,174+6
		dc.b	177+6,180+6,183+6,185+6,187+6,189+6,191+6,192+6
		dc.b	193+6,194+6,195+6,196+6,197+6,198+6,199+6,200+6
		dc.b	200+6,201+6,201+6,202+6,202+6,203+6,203+6,203+6
		dc.b	204+6,204+6,204+6,204+6,204+6,205+6,205+6,205+6
		dc.b	205+6,205+6,205+6,205+6,205+6,205+6
		dc.b	204+6,204+6,204+6,204+6,204+6
		dc.b	203+6,203+6,203+6,202+6,202+6,201+6,201+6,200+6
		dc.b	200+6,199+6,198+6,197+6,196+6,195+6,194+6,193+6
		dc.b	192+6,191+6,189+6,187+6,185+6,183+6,180+6,177+6
		dc.b	174+6,170+6,166+6,162+6,157+6,151+6,145+6,138+6
		dc.b	131+6,124+6,117+6,111+6,105+6,100+6,96+6,92+6
		dc.b	88+6,85+6,82+6,79+6,77+6,75+6,73+6,71+6,70+6,69+6,68+6
		dc.b	67+6,66+6,65+6,64+6,63+6,62+6,62+6,61+6,61+6,60+6,60+6
		dc.b	59+6,59+6,59+6,58+6,58+6,58+6,58+6,58+6,0

		even
		
section		data marks,chip

SPRITE_DATA	dc.w	$80a0,$8800
		dc.l	0,0,0,0,0,0,0,0	
SP1		dc.w	$96a0,$9e00
		dc.l	0,56,68,68,68,124,68,68		a
SP2		dc.w	$a095,$a800
		dc.l	0,68,108,84,68,68,68,68		m
SP3		dc.w	$aa9e,$b200
		dc.l	0,108,16,16,16,16,16,108	i
SP4		dc.w	$b49d,$bc00
		dc.l	0,60,64,64,64,92,68,56		g
SP5		dc.w	$be9a,$c600
		dc.l	0,56,68,68,68,124,68,68		a
SP6		dc.w	$c898,$d000
		dc.l	0,68,100,84,84,84,76,68		n
SP7		dc.w	$d294,$da00
		dc.l	0,68,68,68,68,68,68,58		u
SP8		dc.w	$dc90,$e400
		dc.l	0,124,16,16,16,16,16,16		t
SP9		dc.w	$e68c,$ee00
		dc.l	0,60,64,64,56,4,4,120		s
		dc.w	0,0

		end


