***********************************************************
* This little program shows how to use the BPLCON1 register
* to produce a neat "wavy" effect.
* 1992 Epsilon
***********************************************************

WaitVblank	MACRO
.\@		move.l	4(a5),d0
		andi.l	#$3ff00,d0
		cmpi.l	#$0f400,d0
		bne.b	.\@
		ENDM

***********************************************************

		bsr.w	TakeSystem
MouseWait:	WaitVblank

		bsr.b	Waves

		btst	#6,$bfe001
		bne.s	MouseWait

		bsr.w	RestoreSystem
		rts				; Done!

***********************************************************	

Waves:		lea	list+6,a0		; addr. of copper list in a0
		lea	sine_wave,a1		; sine_wave table +
		add.l	wave_offset,a1		;   offset in a1
		moveq	#14,d0			; loop counter
wave_top:	move.w	(a1)+,(a0)+		; move new scroll value
		addq.l	#6,a0			; next spot in copper
		dbra	d0,wave_top		; loop

		addq.l	#2,wave_offset		; next position in sine table
		cmpi.l	#16,wave_offset		; end of list?
		bne.s	no_w
		clr.l	wave_offset		; set back to start of list
no_w:		rts

***********************************************************	

TakeSystem:	move.l	#$dff000,a5		; Custom chip base

		bsr.w	InstallBmap
		bsr.w	InstallSprites
		move.l	#Copper,$80(a5)		; install copper
		rts				; Done

***********************************************************

RestoreSystem:	move.l	#$dff000,a5		; Custom chip base

		movea.l	4.w,a6			; ExecBase
		lea	GraphicsName,a1		; "graphics.library"
		jsr	-$198(a6)		; OldOpenLibrary()
		move.l	d0,a1			; Copy ptr to GfxBase
		move.l	$26(a1),$80(a5)		; Install old system copperlist
		jsr	-$19e(a6)		; CloseLibrary()
		jsr	-$8a(a6)		; Permit() multitasking
		rts				; Done

***********************************************************	

InstallBmap:	lea	bmapptrs+2,a0
		move.l	#Bmap,d0	; say our bmap address is $12345678
		move.w	d0,4(a0)	;   write $5678 to $e2 reg in clist
		swap	d0
		move.w	d0,(a0)		;   write $1234 to $e0
		rts

***********************************************************	

InstallSprites:	lea	sprptrs+2,a0
		move.l	#NullSprite,d0
		move.w	d0,4(a0)
		move.w	d0,12(a0)
		move.w	d0,20(a0)
		move.w	d0,28(a0)
		move.w	d0,36(a0)
		move.w	d0,44(a0)
		move.w	d0,52(a0)
		move.w	d0,60(a0)
		swap	d0
		move.w	d0,(a0)	
		move.w	d0,8(a0)
		move.w	d0,16(a0)
		move.w	d0,24(a0)
		move.w	d0,32(a0)
		move.w	d0,40(a0)
		move.w	d0,48(a0)
		move.w	d0,56(a0)
		rts

***********************************************************

		section amazin_fruit,data

GraphicsName:	dc.b	'graphics.library',0
		EVEN

sine_wave:	dc.w	$0000,$0011,$0022,$0033,$0022,$0011,$0000
		dc.w	$0000,$0011,$0022,$0033,$0022,$0011,$0000
		dc.w	$0000,$0011,$0022,$0033,$0022,$0011,$0000
		dc.w	$0000,$0011,$0022,$0033,$0022,$0011,$0000
		dc.w	$0000,$0011,$0022,$0033,$0022,$0011,$0000

Wave_Ptr:	dc.l	sine_wave		; address of wave table
wave_offset:	dc.l	0
	
***********************************************************

		section	squid,data_c

Copper:	dc.w	$0100,$1200		; bit plane control reg.0
	dc.w	$0102,$0000		; scroll value
	dc.w	$0104,$0000		; blp/sprite priority reg.
	dc.w	$0108,$0000		; odd bitplane modulo value
	dc.w	$010a,$0000		; even bitplane modulo value
	dc.w	$0180,$0000		; color00 = black
	dc.w	$0182,$0fff		; color01 = white
	dc.w	$008e,$2c81		; upper left corner of disp. window
	dc.w	$0090,$f4c1		; lower right corner of disp. window
	dc.w	$0092,$0038		; start of bpl. (horizontal)
	dc.w	$0094,$00d0		; endo of bpl. (horizontal)
bmapptrs:dc.w	$00e0,$0000		; adr of bplane 1 (long - 2 words)
	dc.w	$00e2,$0000		; low word of bplane 1 adr
sprptrs:dc.w	$0120,$0000,$0122,$0000,$0124,$0000,$0126,$0000
	dc.w	$0128,$0000,$012a,$0000,$012c,$0000,$012e,$0000
	dc.w	$0130,$0000,$0132,$0000,$0134,$0000,$0136,$0000
	dc.w	$0138,$0000,$013a,$0000,$013c,$0000,$013e,$0000

	dc.w	$500f,$fffe
list:	dc.w	$510f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$520f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$530f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$540f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$550f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$560f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$570f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$580f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$590f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$5a0f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$5b0f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$5c0f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$5d0f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$5e0f,$fffe,$0102,$0000		; odd bitplane modulo value
	dc.w	$810f,$fffe,$0182,$0000
	dc.l	-2,-2

NullSprite:	dc.l	0,0,0	; 2 controll words,2 data words,2 blank word

Bmap:	incbin	"fun.raw"
