datalen	EQU	$8000			; min: $15a , max $1fffe

	INCDIR	"include:"
	INCLUDE	"exec/types.i"
	INCLUDE	"exec/exec_lib.i"
	INCLUDE	"exec/libraries.i"
	INCLUDE	"exec/strings.i"
	INCLUDE	"libraries/dos.i"
	INCLUDE	"libraries/dos_lib.i"
	INCLUDE	"libraries/dosextens.i"
	INCLUDE	"intuition/intuition.i"
	INCLUDE	"intuition/intuitionbase.i"
	INCLUDE	"intuition/intuition_lib.i"
	INCLUDE	"intuition/screens.i"
	INCLUDE	"graphics/graphics_lib.i"
	INCLUDE "hardware/custom.i" 
	INCLUDE "hardware/dmabits.i"

custom	EQU	$dff000

***************************************** FAST WB STARTUP CODE

	movea.l	a0,a3
	suba.l	a1,a1
	movea.l	4.w,a6
	jsr	_LVOFindTask(a6)
	movea.l	d0,a2
	tst.l	pr_CLI(a2)
	bne.s	defchan

	lea	pr_MsgPort(a2),a0	; wb message
	jsr	_LVOWaitPort(a6)
	lea	pr_MsgPort(a2),a0
	jsr	_LVOGetMsg(a6)

	movea.l	d0,a4
	jsr	defchan
	movea.l	a4,a1

	movea.l	4.w,a6
	jsr	_LVOReplyMsg(a6)
	moveq	#RETURN_OK,d0
	rts				; back to wb

***************************************** GET FIRST 0-3 OCCURRENCE IN CMDLINE

defchan	move.l	#$00030000+DMAF_AUD3,d3	; default channel
getcmd	move.b	(a3)+,d0
	cmpi.b	#"?",d0
	beq	help
	cmpi.b	#LF,d0
	ble.s	kickver
	cmpi.b	#"0",d0
	blt.s	getcmd
	cmpi.b	#"2",d0
	bgt.s	getcmd
	andi.w	#%11,d0			; channels 0,1, or 2
	moveq	#0,d3
	move.w	d0,d3
	swap	d3
	bset	d0,d3

***************************************** NEW WINDOW'S dY, dH IF KS 2.0+

kickver	cmpi.w	#34,LIB_VERSION(a6)	; ks 1.3
	ble.s	openint
	addi.w	#1,nwindow+nw_TopEdge
	addi.w	#1,nwindow+nw_Height

openint	moveq	#RETURN_FAIL+1,d7	; returncode = 21 - no int.lib
	lea	intname,a1
	moveq	#33,d0			; ks 1.2+
	jsr	_LVOOpenLibrary(a6)
	beq	fault
	move.l	d0,a6

***************************************** GET WB STRUCTURE

	addq.l	#1,d7			; returncode = 22 - wb is closed
	lea	auddata,a0
	move.l	#sc_SIZEOF,d0
	moveq	#WBENCHSCREEN,d1
	jsr	_LVOGetScreenData(a6)
	beq	clsint

***************************************** SET WINDOW'S TOP EDGE AND HEIGHT

	moveq	#0,d0
	move.b	auddata+sc_BarHeight,d0
	add.w	d0,nwindow+nw_TopEdge
	add.w	d0,nwindow+nw_Height

;	move.l	auddata+sc_Width,nwindow+nw_MaxWidth

***************************************** SET WINDOW'S WIDTH

	addq.l	#1,d7			; returncode = 23 - no gfx.lib
	movea.l	a6,a5
	movea.l	4.w,a6
	lea	gfxname,a1
	moveq	#33,d0			; ks 1.2+
	jsr	_LVOOpenLibrary(a6)
	beq	clsint

	move.l	d0,a6
	move.l	wtitle,a0
	lea	auddata+sc_RastPort,a1
	moveq	#endwtit-eotitle-1,d0
	jsr	_LVOTextLength(a6)
	add.w	d0,nwindow+nw_Width

***************************************** CHECK IF WINDOW'S WIDTH IS OK

	move.w	nwindow+nw_Width,d0
	cmp.w	auddata+sc_Width,d0
	ble.s	minwid
	move.w	auddata+sc_Width,nwindow+nw_Width
minwid	cmpi.w	#83,nwindow+nw_Width
	bgt.s	clsgfx
	move.w	#83,nwindow+nw_Width

clsgfx	movea.l	a6,a1
	movea.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
	exg.l	a5,a6

***************************************** BUILD PINK-NOISE SAMPLE

	lea	auddata,a0
	move.w	#datalen-1,d0
filldat	move.b	custom+vhposr,d2
	eor.b	d2,d1
	move.b	custom+vhposr+1,d2
	eor.b	d2,d1
	move.b	-1(a0),d2
	eor.b	d2,d1
	add.b	-2(a0),d1
	move.b	d1,d2
	andi.w	#%1111,d2
delay	dbf	d2,delay
	move.b	d1,(a0)+
	dbf	d0,filldat

***************************************** PREPARE PAULA'S REGISTERS

	lea	custom+aud,a0
	swap	d3
	move.w	d3,d0
	mulu	#$10,d0
	swap	d3
setcust	move.l	#auddata,ac_ptr(a0,d0.w)
	move.w	#(datalen/2),ac_len(a0,d0.w)
	move.w	#200,ac_per(a0,d0.w)
	move.w	#64,ac_vol(a0,d0.w)

***************************************** OPEN THE WINDOW

	addq.l	#1,d7			; returncode = 24 - no window
	lea	nwindow,a0
	jsr	_LVOOpenWindow(a6)
	beq.s	clsint
	movea.l	d0,a2

**************************************** PLAY THE SAMPLE

	bset	#DMAB_SETCLR,d3
	move.w	d3,custom+dmacon

**************************************** WAIT THE USER HITS THE CLS_GAD

	exg.l	a5,a6
	move.l	wd_UserPort(a2),a0
	jsr	_LVOWaitPort(a6)
	move.l	wd_UserPort(a2),a0
	jsr	_LVOGetMsg(a6)
	movea.l	d0,a1
	jsr	_LVOReplyMsg(a6)
	exg.l	a5,a6

**************************************** STOP THE SAMPLE

	bclr	#DMAB_SETCLR,d3
	move.w	d3,custom+dmacon

**************************************** FREE ALL RESOURCES

	movea.l	a2,a0
	jsr	_LVOCloseWindow(a6)

	moveq	#RETURN_OK,d7
clsint	movea.l	a6,a1
	movea.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)

**************************************** CLEAR BSS (PURE PGM)

fault	lea	auddata,a0
	move.l	#(datalen/4)-1,d0
pure	move.l	#0,(a0)+
	dbf	d0,pure

	lea	purepos,a0
	lea	nwindow,a1
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+

	move.l	d7,d0
	rts

**************************************** FREE ALL RESOURCES

help	moveq	#RETURN_FAIL+5,d7	; returncode = 25 - no dos.lib
	lea	dosname,a1
	moveq	#33,d0			; ks 1.2+
	jsr	_LVOOpenLibrary(a6)
	beq.s	fault
	move.l	d0,a6

	moveq	#RETURN_OK,d7
	jsr	_LVOOutput(a6)
	beq.s	clsdos

	move.l	d0,d1
	move.l	#wtitle,d2
	move.l	#endhelp-wtitle,d3
	move.b	#" ",eotitle
	jsr	_LVOWrite(a6)
	move.b	#EOS,eotitle

clsdos	movea.l	a6,a1
	movea.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)

	bra.s	fault


	SECTION	pinksample,bss_c


	DS.B	2
auddata	DS.B	datalen


	SECTION	strings,data

purepos	DC.W	0,1,84,0
nwindow	DC.W	0,1
	DC.W	84,0
	DC.B	0,1
	DC.L	CLOSEWINDOW
	DC.L	WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE
	DC.L	0
	DC.L	0
	DC.L	wtitle
	DC.L	0
	DC.L	0
	DC.W	0,0,0,0
	DC.W	WBENCHSCREEN

	DC.B	"$VER: "
wtitle	DC.B	"PINKnoise V1.00"
eotitle	DC.B	EOS,"- by /\/ / /-<",LF
endwtit	;	dummy

	DC.B	"args: [0|1|2|3]/S - default channel is 3",LF
;	DC.B	"the parser will scan first occurrence of one of the args",LF
endhelp	;	dummy

intname	INTNAME
gfxname	GRAFNAME
dosname	DOSNAME

	EVEN
	END
