;use ASM-One to assemble this code
;enable CPU 68020 and FPU



	incdir	hd1:scope_xt4/
	include	os_macros.i
	include	hardware-registers.i



	section	code,code
;---DOSLIBRARY-----------------------------------
	move.l	(4).w,a6
	move.l	(378,a6),a0	;LibList
	lea	(dosname,pc),a1
	CALL	FindName
	move.l	d0,(dosbase)
	move.l	d0,a6
	move.l	#titletxt,d1
	CALL	PutStr
;---CPU FPU CHECK--------------------------------
	move.l	(4).w,a6
	btst	#4,(297,a6)	;ATTN_Flags(+1)  68881
	beq.b	.nofpu
	btst	#3,(297,a6)	;ATTN_Flags(+1)  68040
	beq.b	.fpuok
.nofpu
	move.l	#nofputxt,d1
	CALLDOS	PutStr
	subq	#1,(nofpu)
	bra.b	.go
.fpuok
	move.l	#fpuoktxt,d1
	CALLDOS	PutStr

.go	moveq	#77,d1
	CALL	Delay

	include	startup_nocheck.i	;jumps to 'main'
	include	dummysprites.i

**************************************************************
dosname	dc.b	"dos.library",0
dosbase	dc.l	0
titletxt
	dc.b	27,"[1mSCOPE_XT4 by Smack/Infect! (Mon 03-Aug-98)",27,"[0m",10,0
nofputxt
	dc.b	"no FPU or 040/060 found -- dynamic gamma calculation disabled",10,0
fpuoktxt
	dc.b	"68881/882 FPU found -- dynamic gamma calculation enabled",10,0
**************************************************************
	even

main
;---INIT COPPERLISTS-----------------------------
	lea	(cl1),a0
	bsr	dummysprites
	lea	(cl2),a0
	bsr	dummysprites
	lea	(cl3),a0
	bsr	dummysprites
	lea	(cl4),a0
	bsr	dummysprites
	lea	(cl5),a0
	bsr	dummysprites
	bsr	init_scr8

	lea	(cl3pt+2),a0
	move.l	#scr8,d0
	moveq	#7,d1
.clloop	move	d0,(4,a0)
	swap	d0
	move	d0,(a0)
	addq.l	#8,a0
	swap	d0
	add.l	#320/8*256,d0
	dbf	d1,.clloop

	lea	(cl2pt+8+2),a0
	move.l	#scale_fft,d0
	move	d0,(4,a0)
	swap	d0
	move	d0,(a0)

;---INIT AUDIO TIMING----------------------------
	lea	($dff000),a5
	move	#1,(aud0per,a5)
	move	#1,(aud1per,a5)
	move	#140/2,(aud2per,a5)	;period 140 = 25334
	move	#1,(aud2len,a5)		;(we want 504*50 = 25200)
	move	#64,(aud0vol,a5)
	move	#64,(aud1vol,a5)
	move	#0,(aud2vol,a5)
	move	#0,(aud3vol,a5)

;---INIT PARALLEL PORT---------------------------
	lea	($bfd000),a1
	move.b	#6,($200,a1)		*DDRA SEL and POUT output
	move.b	#0,($1301,a1)		*DDRB PRB input
	move.b	#2,(a1)			*PRA  POUT signal
	or.b	#2,($1001,a1)		*FILTER OFF

;---INIT IRQ & DMA-------------------------------
	move.l	(smppt0,pc),a6
	move.l	(mainvbr,pc),a0
	move.l	($70,a0),(oldlevel4)
	move.l	#sample_interrupt,($70,a0)
	move.l	#frame_interrupt,($6c,a0)
	move.l	#key_interrupt,($68,a0)
	move	#$7fff,(adkcon,a5)
	move.l	#cl1,(cop1lch,a5)
	move	#1,(copjmp1,a5)
	move	#$83a4,(dmacon,a5)	;bpl+cop+spr+aud2
	move	#$c228,(intena,a5)	;audio2+vblank+level2
	move	#0,(bplcon3,a5)

main_loop
	bsr.b	check_keyboard
	cmp.b	#$59,(keytaste)		** F10 down
	beq.b	.dont

	;-------do the real stuff-------
	bsr	swap_screen_buffers
	bsr	prepare_sample
	move	(plot_mode,pc),d0
	bne.b	.not_wave
	bsr	plot_wave
	bra.b	.dont
.not_wave
	bmi.b	.not_freq
	bsr	plot_freq
	bra.b	.dont
.not_freq
	bsr	plot_fft8


.dont	clr	(ready)
	cmp.b	#$58,(keytaste)		** F9 down
	bne.b	.ww0
.ww1	move	($dff006),($dff180)
	tst	(ready)
	beq.b	.ww1
	bra.b	main_loop
.ww0	tst	(ready)
	beq.b	.ww0
	cmp.b	#$c5,(keytaste)		** ESC up
	bne.b	main_loop

	move	#$7fff,($dff000+intena)
	move.l	(mainvbr,pc),a0
	move.l	(oldlevel4,pc),($70,a0)
	rts
plot_mode	dc	0

*********************************************************
***** A6 register forbidden to use (sample pointer) *****
*********************************************************

;-------------------------------
check_keyboard
	move.b	(keytaste,pc),d0
	cmp.b	#$50,d0			** F1 down
	bne.b	.not_f1
	clr	(plot_mode)
	move.l	#cl1,($dff000+cop1lch)
	rts
.not_f1

	cmp.b	#$51,d0			** F2 down
	bne.b	.not_f2
	move	#1,(plot_mode)
	move.l	#cl2,($dff000+cop1lch)
	rts
.not_f2

	cmp.b	#$52,d0			** F3 down
	bne.b	.not_f3
	move	#-1,(plot_mode)
	move.l	#cl3,($dff000+cop1lch)
	bra	init_gray_palette
.not_f3

	cmp.b	#$53,d0			** F4 down
	bne.b	.not_f4
	move	#-2,(plot_mode)
	move.l	#cl4,($dff000+cop1lch)
	bra	init_gray_palette
.not_f4

	cmp.b	#$54,d0			** F5 down
	bne.b	.not_f5
	clr.b	(keytaste)
	move	#2,(plot_mode)
	move.l	#cl5,($dff000+cop1lch)
	rts
.not_f5

	cmp.b	#$46,d0			** Del down
	bne.b	.not_del
	move.l	(mainvbr,pc),a0
	move.l	#sample_interrupt_nosound,($70,a0)
.not_del

	cmp.b	#$5f,d0			** Help down
	bne.b	.not_help
	move.l	(mainvbr,pc),a0
	move.l	#sample_interrupt,($70,a0)
.not_help
	rts


;-------------------------------


swap_screen_buffers
	lea	(wave_pt0,pc),a0	;double buf prev. frame
	movem.l	(a0)+,d0/d1
	exg	d0,d1
	movem.l	d0/d1,-(a0)
	lea	(cl1pt+2),a0
	lea	(cl2pt+2),a1
	lea	(cl5pt+2),a2
	move	d1,(4,a0)
	move	d1,(4,a1)
	move	d1,(4,a2)
	swap	d1
	move	d1,(a0)
	move	d1,(a1)
	move	d1,(a2)
	rts


;-------------------------------


prepare_sample
	move.l	(smppt0,pc),a0
	move.l	(fftpt0,pc),a2
	move	#504-1,d7
.loop	move.b	(a0)+,d0
	add.b	#$80,d0
	ext	d0
	move	d0,(a2)+
	dbf	d7,.loop
	rts


;-------------------------------


plot_wave
	lea	(fastscr+129*64),a5	;clear fast ram image
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
	moveq	#0,d5
	moveq	#0,d6
	moveq	#0,d7
	sub.l	a0,a0
	sub.l	a1,a1
	sub.l	a2,a2
	sub.l	a3,a3
	sub.l	a4,a4
	moveq	#129/3-1,d0	;43 loops
.clloop	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	dbf	d0,.clloop	;48*4=192 bytes = 3 rows (64 bytes)

	move.l	(fftpt0,pc),a0		;plot to fast ram image
	lea	(fastscr+64*64),a2
	move	(a0),d1
	neg	d1
	asr	#1,d1
	moveq	#63-1,d7
.ploop0	moveq	#-$80,d5
.ploop1	move	(a0)+,d0
	moveq	#64,d4
	neg	d0
	asr	#1,d0
	move	d0,d6
	lsl	#6,d6
	sub	d0,d1
	beq.b	.ploop2
	subq	#1,d1
	bge.b	.ploop2
	not	d1
	neg	d4
	subq	#1,d1
.ploop2	or.b	d5,(a2,d6)
	add	d4,d6
	dbf	d1,.ploop2
	move	d0,d1
	lsr.b	#1,d5
	bne.b	.ploop1
	addq.l	#1,a2
	dbf	d7,.ploop0

	lea	(fastscr),a4		;copy to video ram
	move.l	(wave_pt0,pc),a5
	move	#129-1,d0
.coloop	REPT	16
	move.l	(a4)+,(a5)+
	ENDR
	dbf	d0,.coloop
	rts


;-------------------------------

plot_monoscope
	lea	(mono_delay,pc),a0
	move	(a0),d1
	lea	(keytaste,pc),a1
	move.b	(a1),d0

	cmp.b	#$4c,d0			** Cursor_Up down
	bne.b	.not_up
	clr.b	(a1)
	addq	#1,d1
	cmp	#503,d1
	bmi.b	.up_
	subq	#1,d1
.up_	move	d1,(a0)
.not_up
	cmp.b	#$4d,d0			** Cursor_Down down
	bne.b	.not_down
	clr.b	(a1)
	subq	#1,d1
	bpl.b	.down_
	moveq	#0,d1
.down_	move	d1,(a0)	
.not_down
	cmp.b	#$4e,d0			** Cursor_Right down
	bne.b	.not_right
	clr.b	(a1)
	addq	#8,d1
	cmp	#503,d1
	bmi.b	.right_
	subq	#8,d1
.right_	move	d1,(a0)
.not_right
	cmp.b	#$4f,d0			** Cursor_Left down
	bne.b	.not_left
	clr.b	(a1)
	subq	#8,d1
	bpl.b	.left_
	moveq	#0,d1
.left_	move	d1,(a0)	
.not_left


	lea	(fastscr+256*32),a5	;clear fast ram image
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
	moveq	#0,d5
	moveq	#0,d6
	moveq	#0,d7
	sub.l	a0,a0
	sub.l	a1,a1
	sub.l	a2,a2
	sub.l	a3,a3
	sub.l	a4,a4
	move	#170-1,d0
.clloop	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	dbf	d0,.clloop	;170*48=8160
	movem.l	d1-a0,-(a5)	;+32 bytes = 256*32 = 8192 bytes



;-------dot version of the "Spacescope"
;	move.l	(fftpt0,pc),a0		;plot to fast ram image
;	lea	(40*2,a0),a1
;	lea	(504*2,a0),a3
;	lea	(fastscr+127*32+16),a2
;	move	#504-1,d7
;.ploop1	move	(a0)+,d0
;	move	(a1)+,d1
;	move	d0,d2
;	asr	#3,d0
;	not	d2
;	lsl	#5,d1
;	add	d0,d1
;	bset	d2,(a2,d1)
;	cmp.l	a3,a1
;	blt.b	.lt
;	move.l	(fftpt0,pc),a1
;.lt	dbf	d7,.ploop1




	move.l	(fftpt0,pc),a0		;plot to fast ram image
	move	(mono_delay,pc),d0
	lea	(a0,d0*2),a1
	lea	(503*2,a0),a3
	lea	(fastscr),a2
	move	#503-1,d7
	move	#128,a4

	move	(a0)+,d2
	move	(a1)+,d3
	add	a4,d2
	add	a4,d3

.ploop	move	(a0)+,d0
	move	(a1)+,d1
	add	a4,d0
	add	a4,d1

	movem.l	d0/d1/d7/a1,-(a7)
	cmp	d3,d1
	ble.b	.noswap
	exg	d0,d2		; swap points if y1>y2
	exg	d1,d3
.noswap	move	d1,d4
	lsl	#5,d4
	lea	(a2,d4),a1
	move	d0,d4
	lsr	#3,d4
	add	d4,a1		; add X offset
	moveq	#1,d4
	move	d2,d6
	sub	d0,d6		; ax=abs(x2-x1)
	bge.b	.noABSx
	neg	d6
	neg	d4		; sx=sign(x2-x1) = x-stepsize
.noABSx	moveq	#256/8,d5 	; sy is always positive
	move	d3,d7
	sub	d1,d7		; ay=abs(y2-y1) , is always >=0
	moveq	#7,d3		;!!!!
	cmp	d6,d7
	bgt.b	.ydomi		; if(ax>ay) then .ydomi
; X dominant part:
.xdomi	move	d6,d1		; d1=counter=length of line=ax
	move	d6,d2
	lsr	#1,d2		; D=ax/2
	not.b	d0		; X = bitnr(X)
	and	d3,d0		; X &= 7
	bset.b	d0,(a1)		; change bit on x,y
	dbf	d1,.xloop
	bra.b	.line_end
.xloop	sub	d7,d2		; D=D-ay
	bgt.b	.x_no_e		; if(D<0)
	add	d6,d2		; 	D=D+ax
	add.l	d5,a1		; 	offset=offset+sy (next row)
.x_no_e	sub	d4,d0		; X=X-sx (next bitnr)
	btst	#3,d0		; bit 3 clear = X between 0 and 7 ?
	beq.b	.xjump		; if(X & 8)
	and	d3,d0		;	X=X AND 7
	add	d4,a1		; 	offset=offset+sx (next byte)
.xjump	bset.b	d0,(a1)		; change bit on x,y
	dbf	d1,.xloop	; next row (y)
	bra.b	.line_end
; Y dominant part:
.ydomi	move	d7,d1		; d1=counter=length of line=ay
	move	d7,d2
	lsr	#1,d2		; D = ay/2
	not.b	d0		; X = bitnr(X)
	and	d3,d0		; X &= 7
	bset.b	d0,(a1)		; change bit on x,y
	dbf	d1,.yloop
	bra.b	.line_end
.yloop	add.l	d5,a1		; offset=offset+sy
	sub	d6,d2		; D=D-ax
	bgt.b	.y_no_e		; if(D<0)
	add	d7,d2		; 	D=D+ay
	sub	d4,d0		; 	X=X-sx	(next bitnr)
	btst	#3,d0		; bit 3 clear = X between 0 and 7 ?
	beq.b	.y_no_e		; if(X & 8)
	and	d3,d0		; 	X=X AND 7
	add	d4,a1		; 	offset=offset+sx (next byte)
.y_no_e	bset.b	d0,(a1)		; change bit on x,y
	dbf	d1,.yloop	; next row (y)
.line_end
	movem.l	(a7)+,d0/d1/d7/a1

	move	d0,d2
	move	d1,d3
	cmp.l	a3,a1
	blt.b	.lt
	move.l	(fftpt0,pc),a1
.lt	dbf	d7,.ploop


	lea	(fastscr),a4		;copy to video ram
	move.l	(wave_pt0,pc),a5
	move	#256-1,d0
.coloop	REPT	8
	move.l	(a4)+,(a5)+
	ENDR
	dbf	d0,.coloop
	rts
mono_delay	dc	126



;-------------------------------



plot_freq
	move	(plot_mode,pc),d0
	subq	#1,d0
	bne	plot_monoscope

	lea	(fastscr+129*32),a5	;clear fast ram image
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
	moveq	#0,d5
	moveq	#0,d6
	moveq	#0,d7
	sub.l	a0,a0
	sub.l	a1,a1
	sub.l	a2,a2
	sub.l	a3,a3
	sub.l	a4,a4
	moveq	#129/3-1,d0	;43 loops
.clloop	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	movem.l	d1-a4,-(a5)	;12*4=48 bytes
	dbf	d0,.clloop	;48*2=96 bytes = 3 rows (32 bytes)

	move.l	(fftpt0,pc),a0
	bsr	deli_fft

	lea	(fastscr+128*32),a1
	move.l	(fftpt0,pc),a0
	lea	(fftbuf1),a2
	lea	(fft_peak,pc),a3
	addq.l	#2,a0
	moveq	#9,d4
	moveq	#32,d5
	moveq	#$10,d6
	move	#250-1,d7	;250
.plot_loop
	moveq	#0,d0
	moveq	#0,d1
	move	(a0)+,d0
	lsr	d4,d0		;#9
	move	(a2),d1
	move	(2,a2),d2
	cmp	d0,d1
	bgt.b	.peak_greater
	move	d0,(a2)+
	clr	(a2)+
	bra.b	.peak_new
.peak_greater
	lsl	#5,d1
	neg.l	d1
	or.b	d6,(a1,d1.l)
	move	(a3,d2*2),d1
	sub	d1,(a2)+
	addq	#1,(a2)+	
.peak_new
	lsl	#5,d0
	neg.l	d0
.plot_bar
	or.b	d6,(a1,d0.l)
	add.l	d5,d0
	ble.b	.plot_bar
	lsr.b	#1,d6
	bne.b	.bitok
	moveq	#-$80,d6
	addq.l	#1,a1
.bitok	dbf	d7,.plot_loop

	lea	(fastscr),a4		;copy to video ram
	move.l	(wave_pt0,pc),a5
	move	#129-1,d0
.coloop	REPT	8
	move.l	(a4)+,(a5)+
	ENDR
	dbf	d0,.coloop
	rts


;-------------------------------


check_keys_fft8
	move	(nofpu,pc),d0
	beq.b	.fpu_ok
	rts
.fpu_ok
	lea	(gamma_value,pc),a0
	fmove.s	(a0),fp0
	lea	(keytaste,pc),a1
	move.b	(a1),d0

	cmp.b	#$4c,d0			** Cursor_Up down
	bne.b	.not_up
	clr.b	(a1)
	fadd.s	#0.05,fp0
	fmove.s	fp0,(a0)
	bra	init_gray_palette
.not_up
	cmp.b	#$4d,d0			** Cursor_Down down
	bne.b	.not_down
	clr.b	(a1)
	fsub.s	#0.05,fp0
	fcmp.b	#1,fp0
	fbge	.downok
	fmove.b	#1,fp0
.downok	fmove.s	fp0,(a0)
	bra	init_gray_palette
.not_down
	cmp.b	#$4e,d0			** Cursor_Right down
	bne.b	.not_right
	clr.b	(a1)
	fadd.s	#0.2,fp0
	fmove.s	fp0,(a0)
	bra	init_gray_palette
.not_right
	cmp.b	#$4f,d0			** Cursor_Left down
	bne.b	.not_left
	clr.b	(a1)
	fsub.s	#0.2,fp0
	fcmp.b	#1,fp0
	fbge	.leftok
	fmove.b	#1,fp0
.leftok	fmove.s	fp0,(a0)
	bra	init_gray_palette
.not_left
	rts


;-------------------------------


plot_fft8
	bsr	check_keys_fft8

	move	(plot_mode,pc),d0
	addq	#1,d0
	bmi.b	plot_fft8_scroll

	move.l	(fftpt0,pc),a0
	bsr	deli_fft
	move.l	(fftpt0,pc),a0
	addq.l	#2,a0
	lea	(scr8+320/8*256*7),a1
	lea	(.pos,pc),a2
	move	(a2),d0
	move	d0,d6
	addq	#1,d0
	cmp	#320-4,d0
	blt.b	.lt
	moveq	#4,d0
.lt	move	d0,(a2)
	move	d6,d0
	lsr	#3,d0
	add	d0,a1
	and	#7,d6
	moveq	#-128,d0
	lsr.b	d6,d0
	move.b	d0,d6
	move.b	d0,d5
	not.b	d5
	move.l	#320/8*256,d3
	moveq	#40,d4
	move	#250-1,d7
.plot_loop
	move	(a0)+,d0
	moveq	#7,d2
	move.l	a1,a2
.point	add	d0,d0
	bcs.b	.cs
	and.b	d5,(a2)
	bra.b	.ok
.cs	or.b	d6,(a2)
.ok	sub.l	d3,a2
	dbf	d2,.point
	add.l	d4,a1
	dbf	d7,.plot_loop
	rts
.pos	dc	4


;-------------------------------


plot_fft8_scroll
	lea	(.scroll,pc),a0
	move	(a0),d0
	bge.b	.scroll_it
	moveq	#63,d0
	lea	(.scr8pt,pc),a1
	movem.l	(a1)+,d2/d3
	exg	d2,d3
	movem.l	d2/d3,-(a1)
	lea	(cl4pt+2),a1
	moveq	#7,d7
.bplloo	move	d2,(4,a1)
	swap	d2
	move	d2,(a1)
	swap	d2
	add.l	#384*256/8,d2
	addq.l	#8,a1
	dbf	d7,.bplloo
.scroll_it
	move	d0,d1
	subq	#1,d1
	move	d1,(a0)
	move	d0,d1
	and	#$0030,d1
	eor	d1,d0
	lsl	#6,d1
	or.b	d0,d1
	move	d1,d0
	lsl	#4,d1
	or	d1,d0
	move	d0,(cl4con1+2)

	move.l	(fftpt0,pc),a0
	bsr	deli_fft

	move.l	(fftpt0,pc),a0
	addq.l	#2,a0
	move.l	(.scr8pt,pc),a1
	add.l	#384/8*256*7+320/8,a1
	moveq	#63,d0
	sub	(.scroll,pc),d0
	move	d0,d1
	lsr	#3,d1
	add	d1,a1
	and	#7,d0
	moveq	#-$80,d6
	lsr.b	d0,d6
	move.b	d6,d5
	not.b	d5
	move.l	#384/8*256,d3
	moveq	#384/8,d4	;!!
	move	#250-1,d7
.plot_loop
	move	(a0)+,d0
	moveq	#7,d2
	move.l	a1,a2
.point	add	d0,d0
	bcs	.cs
	and.b	d5,(a2)
	bra.b	.ok
.cs	or.b	d6,(a2)
.ok	sub.l	d3,a2
	dbf	d2,.point
	add.l	d4,a1		;!!
	dbf	d7,.plot_loop


	moveq	#320/32-1,d0
	sub	(.scroll,pc),d0
	bmi.b	.nocopy
	lsl	#2,d0
	movem.l	(.scr8pt,pc),a0/a1
	addq.l	#64/8,a0
	add	d0,a0
	add	d0,a1
	move	#256*8-1,d7
.copy_loop
	move.l	(a0),(a1)
	add.l	d4,a0		;!!
	add.l	d4,a1		;!!
	dbf	d7,.copy_loop
.nocopy
	rts
.scroll		dc	-1
.scr8pt		dc.l	scr8_1,scr8_2


;-------------------------------


init_gray_palette
	lea	(gamma,pc),a0
	move.l	a0,a1
	move	(nofpu,pc),d0
	bne.b	.nofpu
	move	#255,d6
	moveq	#0,d1
	fmove.b	#1,fp2
	fmove.s	(gamma_value,pc),fp4
	fdiv	fp4,fp2		;1/gamma
	move	d6,d7
.loop	fmove.w	d1,fp0
	fdiv.w	d6,fp0
	flogn	fp0
	fmul	fp2,fp0
	fetox	fp0		;x^gamma = e^(ln(x)*gamma)
	fmul.w	d6,fp0
	fint	fp0
	fmove.w	fp0,d0
	cmp	d6,d0
	ble.b	.ok
	move	d6,d0
.ok	move.b	d0,(a1)+
	addq	#1,d1
	dbf	d7,.loop
.nofpu
	lea	($dff000+bplcon3),a2
	move	#$2000,d5	;color bank +1
	move	#$0c00,d4	;color hi
	move	#$0e00,d3	;color lo
	moveq	#7,d7		;8 color banks
.loop0	lea	($dff000+color00),a1
	moveq	#31,d6		;32 entries per bank
.loop1	move.b	(a0)+,d0
	move.b	d0,d1
	lsr.b	#4,d0
	move.b	d0,d2
	lsl	#4,d0
	or.b	d2,d0
	lsl	#4,d0
	or.b	d2,d0
	move	d4,(a2)
	move	d0,(a1)		;color hi
	and.b	#$0f,d1
	move.b	d1,d2
	lsl	#4,d1
	or.b	d2,d1
	lsl	#4,d1
	or.b	d2,d1
	move	d3,(a2)
	move	d1,(a1)+	;color lo
	dbf	d6,.loop1
	add	d5,d4
	add	d5,d3
	dbf	d7,.loop0
	move	#0,(a2)
	rts
gamma_value	dc.s	1.6


;-------------------------------


init_scr8
	lea	(scr8+320/8*256*7),a1
	lea	(320/8*249,a1),a4
	move.b	#$f0,d5
	move.b	#$0f,d6
	move.l	#320/8*256,d3
	moveq	#320/8,d4
	move	#250-1,d7
.plot_loop
	move.b	d7,d0
	moveq	#7,d2
	move.l	a1,a2
	move.l	a4,a3
.point	add.b	d0,d0
	bcs.b	.cs
	and.b	d5,(39,a2)
	and.b	d6,(a3)
	bra.b	.ok
.cs	or.b	d6,(39,a2)
	or.b	d5,(a3)
.ok	sub.l	d3,a2
	sub.l	d3,a3
	dbf	d2,.point
	add.l	d4,a1
	sub.l	d4,a4
	dbf	d7,.plot_loop
	rts



************************************
sample_interrupt
	move.l	d0,-(a7)
	move	#$0780,($dff000+intreq)
	moveq	#0,d0
	move.b	($bfe101),d0	*PRB CIA-A
	move.b	d0,(a6)+
	move	(playback_lookup,pc,d0.l*2),d0
	move	d0,($dff000+aud0dat)
	move	d0,($dff000+aud1dat)
	move	d0,($dff000+aud2dat)
	move.l	(a7)+,d0
	rte
sample_interrupt_nosound
	move	#$0780,($dff000+intreq)
	move.b	($bfe101),(a6)+	*PRB CIA-A
	move	d0,($dff000+aud2dat)
	rte
playback_lookup
i	set	$80
	REPT	256
	dc.b	i,i
i	set	(i+1)&$ff
	ENDR
************************************
frame_interrupt
	movem.l	d0/d1/a0,-(a7)
	move	#$0020,($dff000+intreq)
	st	(ready)
	lea	(smppt0,pc),a0
	movem.l	(a0)+,d0/d1
	exg	d0,d1
	movem.l	d0/d1,-(a0)
	move.l	d1,a6
	movem.l	(a7)+,d0/d1/a0
	rte
************************************
key_interrupt
	movem.l	d0-d2,-(a7)
	btst	#3,($bfed01)	*ICR
	beq.b	.nokey
	move.b	($bfec01),d0	**get key
	not.b	d0
	ror.b	#1,d0
	move.b	d0,(keytaste)
	moveq	#3,d2
.rwait0	move.b	($dff006),d0
.rwait1	move.b	($dff006),d1
	cmp.b	d0,d1
	beq.b	.rwait1
	dbf	d2,.rwait0
	bset	#6,($bfee01)	**INMODE
	move.b	#0,($bfec01)	**Handshake
	bclr	#6,($bfee01)	**OUTMODE
.nokey	nop
	move	#8,($dff000+intreq)
	movem.l	(a7)+,d0-d2
	rte
************************************

oldlevel4	dc.l	0
wave_pt0	dc.l	scr0
wave_pt1	dc.l	scr1
ready		dc	0
smppt0		dc.l	smpbuf0
smppt1		dc.l	smpbuf1
fftpt0		dc.l	fftbuf0
keytaste	dc.b	0,0
nofpu		dc	0

fft_peak
	dc	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc	1,1,1,1,1,1,1,1,1
	dc	2,2,2,2,2,2,2,2,2
	dc	3,3,3,3,3,3
	dc	4,4,4,4
	dc	5,5,5
	dc	6,6,6
	dc	7,7,7
	dc	8,8,8
	dc	9,9,9,9,9,9,9,9

gamma	include	gamma_1.6.i

************************************
	include	deli_fft.i


*******************************************************
	section	buff,bss
	ds.b	1024
fastscr	ds.b	128*129
	ds.b	1024
smpbuf0	ds.b	1024*2
smpbuf1	ds.b	1024*2
fftbuf0	ds.b	1024*2
fftbuf1	ds.b	1024*2


*******************************************************
	section	screen,bss_c
	ds.b	1024
scr0	ds.b	92*129
scr1	ds.b	92*129
	ds.b	1024
scr8	ds.b	320*256
	ds.b	1024
scr8_1	ds.b	384*256
	ds.b	1024
scr8_2	ds.b	384*256
	ds.b	1024
*******************************************************
	section	chip,data_c
dummy_sprite	dc.l	0,0,0,0

backcol	set	$0241
cl1	ds	32
	dc	(15<<8)+5,-2
	dc	bpl1mod,0,bpl2mod,0,bplcon1,$ccff
	dc	diwstrt,$1a6a,diwstop,$3ae0
	dc	ddfstrt,$48,ddfstop,$48+(512-32)/4
	dc	fmode,0
	dc	color00,$0000,color01,$0cf8
cl1pt	dc	bpl0pth,0,bpl0ptl,0
	dc	(100<<8)+5,-2,bplcon0,$9000,color00,backcol
	dc	((100+64)<<8)+9,-2,color00,backcol+$0121
	dc	((100+65)<<8)+9,-2,color00,backcol
	dc	((100+129)<<8)+5,-2,bplcon0,0,color00,$0000
	dc	-1,-2


cl2	ds	32
	dc	15<<8+5,-2
	dc	bpl1mod,0,bpl2mod,0,bplcon1,$88ff
	dc	diwstrt,$1a6a,diwstop,$3ae0
	dc	ddfstrt,$40,ddfstop,$40+(256-16)/2
	dc	fmode,0
	dc	color00,$0000,color01,$0cf8
	dc	color02,backcol+$0111,color03,$0cf8-$0222
cl2pt	dc	bpl0pth,0,bpl0ptl,0
	dc	bpl1pth,0,bpl1ptl,0
	dc	(100<<8)+5,-2,bplcon0,$2000,color00,backcol
	dc	((100+129)<<8)+5,-2,bplcon0,0,color00,$0000
	dc	-1,-2


cl3	ds	32
	dc	bpl1mod,0,bpl2mod,0
	dc	bplcon1,0
	dc	diwstrt,$1a81,diwstop,$3ac1
	dc	ddfstrt,$28,ddfstop,$28+(320-64)/2
	dc	fmode,3
	dc	20<<8+5,-2
	dc	color00,backcol
cl3pt	dc	bpl0pth,0,bpl0ptl,0
	dc	bpl1pth,0,bpl1ptl,0
	dc	bpl2pth,0,bpl2ptl,0
	dc	bpl3pth,0,bpl3ptl,0
	dc	bpl4pth,0,bpl4ptl,0
	dc	bpl5pth,0,bpl5ptl,0
	dc	bpl6pth,0,bpl6ptl,0
	dc	bpl7pth,0,bpl7ptl,0
	dc	(42<<8)+5,-2,bplcon0,$0010,color00,0
	dc	$ffe1,-2
	dc	((42-6)<<8)+5,-2,bplcon0,0,color00,backcol
	dc	-1,-2



cl4	ds	32
	dc	bpl1mod,0,bpl2mod,0
cl4con1	dc	bplcon1,0
	dc	diwstrt,$1a81,diwstop,$3ac1
	dc	ddfstrt,$18,ddfstop,$18+(384-64)/2
	dc	fmode,3
cl4pt	dc	bpl0pth,0,bpl0ptl,0
	dc	bpl1pth,0,bpl1ptl,0
	dc	bpl2pth,0,bpl2ptl,0
	dc	bpl3pth,0,bpl3ptl,0
	dc	bpl4pth,0,bpl4ptl,0
	dc	bpl5pth,0,bpl5ptl,0
	dc	bpl6pth,0,bpl6ptl,0
	dc	bpl7pth,0,bpl7ptl,0
	dc	20<<8+5,-2
	dc	color00,backcol
	dc	(42<<8)+5,-2,bplcon0,$0010,color00,0
	dc	$ffe1,-2
	dc	((42-6)<<8)+5,-2,bplcon0,0,color00,backcol
	dc	-1,-2


cl5	ds	32
	dc	15<<8+5,-2
	dc	bpl1mod,0,bpl2mod,0,bplcon1,$88ff
	dc	diwstrt,$1a6a,diwstop,$3ae0
	dc	ddfstrt,$40,ddfstop,$40+(256-16)/2
	dc	fmode,0
	dc	color00,$0000,color01,$0cf8
cl5pt	dc	bpl0pth,0,bpl0ptl,0
	dc	(38<<8)+5,-2,bplcon0,$1000,color00,backcol
	dc	$ffe1,-2
	dc	(38<<8)+5,-2,bplcon0,0,color00,$0000
	dc	-1,-2


scale_fft
	incbin	scale_fft.raw
