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

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

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

		bsr.w	TakeSystem
MouseWait:	WaitVblank		; wait for two or it goes too fast.
		WaitVblank

		bsr.s	DoWaves	

		btst.b	#6,$bfe001
		bne.s	MouseWait

		bsr.w	RestoreSystem
		rts			; Done!

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

DoWaves:	lea	wavestart+6,a1	; first line to wave in copper
		moveq	#13,d0		; number of times to loop
		move.l	Wave_Ptr,a0	; move ptr. to table to a0
		cmpi.w	#$ffff,(a0)	; end of list?
		bne.s	wave_it		; no
		lea	Wave_Table,a0	; start of list

wave_it:	move.w	(a0)+,(a1)+	; move new modulo value to copper
		addq.l	#6,a1		; get next line in copper
		cmpi.w	#$ffff,(a0)	; end of list?
		bne.s	wave_ok		; no
		lea	Wave_Table,a0	; back to start of wave table
wave_ok:	dbra	d0,wave_it	; loop

		move.l	a0,Wave_Ptr	; new position in table
		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

Wave_Table:
	dc.w	40,0,0,0,0,0,0		; each raster line if 40 bytes
	dc.w	0,0,0,0,0,0,0		;   wide, so it is best to skip
	dc.w	40,0,0,0,0,0,0		;   a multipe of 40
	dc.w	0,0,0,0,0,0,0		; a value of 40 skips on line
	dc.w	40,0,40,0,0,0,0		;   and a value of -40 does the
	dc.w	0,0,0,0,0,0,0		;   same line twice
	dc.w	40,0,40,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,40,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,40,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,40,0,40

	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,40,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,40,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,40,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	40,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,40
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,40,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,40,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	40,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0

	dc.w	-40,0,0,0,0,0,0		
	dc.w	0,0,0,0,0,0,0		
	dc.w	-40,40,0,0,0,0,0		
	dc.w	0,0,0,0,0,0,0		
	dc.w	-40,40,-40,0,0,0,0	
	dc.w	0,0,0,0,0,0,0		
	dc.w	-40,40,-40,40,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,-40,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,-40,40,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,-40,40,-40

	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,-40,40,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,-40,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,40,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,-40,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,40,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	-40,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,-40
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,40,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,-40,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,40,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,-40,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,40,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	-40,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	0,0,0,0,0,0,0
	dc.w	$ffff			; end of list

Wave_Ptr:	dc.l	Wave_Table		; address of wave table

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

		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
	dc.w	$0122,$0000
	dc.w	$0124,$0000
	dc.w	$0126,$0000
	dc.w	$0128,$0000
	dc.w	$012a,$0000
	dc.w	$012c,$0000
	dc.w	$012e,$0000
	dc.w	$0130,$0000
	dc.w	$0132,$0000
	dc.w	$0134,$0000
	dc.w	$0136,$0000
	dc.w	$0138,$0000
	dc.w	$013a,$0000
	dc.w	$013c,$0000
	dc.w	$013e,$0000
wavestart:
	dc.w	$510f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$520f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$530f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$540f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$550f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$560f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$570f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$580f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$590f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$5a0f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$5b0f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$5c0f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$5d0f,$fffe,$0108,$0000		; odd bitplane modulo value
	dc.w	$5e0f,$fffe,$0108,$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 words

Bmap:	incbin	"fun.raw"
	
