
;
;
;-------------------------------
;
; scope_xt4 by Smack/Infect!
;
;-------------------------------
;
;use ASM-One to assemble this code
;enable CPU 68020 and FPU
;
;


	incdir	hd2:scope_xt4/src/

	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
	CALL	OutPut
	move.l	d0,a5
	move.l	a5,d1
	move.l	#titletxt,d2
	moveq	#titletxt_end-titletxt,d3
	CALL	Write
;---CPU FPU CHECK--------------------------------
	move.l	(4).w,a0
	btst	#4,(297,a0)	;ATTN_Flags(+1)  68881
	bne.b	.fpuok

	move.l	a5,d1
	move.l	#nofputxt,d2
	move.l	#nofputxt_end-nofputxt,d3
	CALL	Write
	moveq	#10,d0
	rts
.fpuok
	move.l	a5,d1
	move.l	#precalctxt1,d2
	move.l	#precalctxt1_end-precalctxt1,d3
	CALL	Write

	bsr	fft_init

	move.l	a5,d1
	move.l	#precalctxt2,d2
	move.l	#precalctxt2_end-precalctxt2,d3
	CALL	Write

	moveq	#50,d1
	CALL	Delay

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


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

dosname	dc.b	"dos.library",0
dosbase	dc.l	0
	dc.b	"$VER: SCOPE_XT4 1.00 (Sat 01-May-99)",10,0
titletxt
	dc.b	27,"[1mSCOPE_XT4 by Smack/Infect! (Sat 01-May-99)",27,"[0m",10,0
titletxt_end
nofputxt
	dc.b	"no FPU found - sorry.",10,0
nofputxt_end
precalctxt1
	dc.b	"precalculating table ...",0
precalctxt1_end
precalctxt2
	dc.b	" ready.",10,0
precalctxt2_end
	even




main
;---INIT COPPERLISTS-----------------------------
	lea	(cl1),a0
	bsr	dummysprites
	lea	(cl3),a0
	bsr	dummysprites

	lea	(cl1pt+8+2),a0
	move.l	#wave_screen,d0
	move	d0,(4,a0)
	swap	d0
	move	d0,(a0)

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

	lea	(cl3pt2+2),a0
	move.l	#spectrum_screen_tb1,d0
	move	d0,(4,a0)
	swap	d0
	move	d0,(a0)

	lea	(cl1+2),a0
	lea	(cl3+2),a1
	move.l	#function_panel,d0
	move.l	d0,a5
	move	d0,(4,a0)
	move	d0,(4,a1)
	swap	d0
	move	d0,(a0)
	move	d0,(a1)
	move	#(48<<8)+$bf,(a5)
	move	#((48-16)<<8)+$02,(64/8,a5)

;---INIT AUDIO TIMING----------------------------
	lea	($dff000),a5
	move	#1,(aud0per,a5)
	move	#1,(aud1per,a5)
	move	#140/2,(aud2per,a5)
	move	#1,(aud2len,a5)
	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_nosound,($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	prepare_sample
	move	(plot_mode,pc),d0
	bne.b	.not_wave
	bsr	plot_wave_spectrum
	bra.b	.dont
.not_wave
	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

;	tst.b	(keytaste)
;	beq.b	main_loop


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




*********************************************************
***** 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)
	bra	panel_screenmode
.not_f1
	cmp.b	#$51,d0			** F2 down
	bne.b	.not_f2
	move	#-1,(plot_mode)
	move.l	#cl3,($dff000+cop1lch)
	bsr	init_gray_palette
	bra	panel_screenmode
.not_f2
	cmp.b	#$53,d0			** F4 down
	bne.b	.not_f4
	clr.b	(keytaste)
	not	(wave_off)
	bne.b	.f4
	rts
.f4	move.l	(wave_pt0,pc),a5
	bsr	clear_wave
	move.l	(wave_pt1,pc),a5
	bra	clear_wave
.not_f4
	cmp.b	#$54,d0			** F5 down
	bne.b	.not_f5
	clr.b	(keytaste)
	not	(spec_off)
	bne.b	.f5
	rts
.f5	move.l	(spec_pt0,pc),a5
	bsr	clear_spectrum
	move.l	(spec_pt1,pc),a5
	bra	clear_spectrum
.not_f5
	cmp.b	#8,d0			** 8 down
	bne.b	.not_8
	clr.b	(keytaste)
	move.l	#smpbuf0,a0
	move.l	a0,a6
	move.l	a0,(smppt0)
	move.l	#smpbuf1,(smppt1)
	move.l	(mainvbr,pc),a0
	move.l	#sample_interrupt,($70,a0)
	bra	panel_audio
.not_8
	cmp.b	#9,d0			** 9 down
	bne.b	.not_9
	clr.b	(keytaste)
	move.l	#smpbuf0,a0
	move.l	a0,a6
	move.l	a0,(smppt0)
	move.l	#smpbuf1,(smppt1)
	move.l	(mainvbr,pc),a0
	move.l	#sample_interrupt_nosound,($70,a0)
	bra	panel_audio
.not_9
	cmp.b	#$46,d0			** Del down
	bne.b	.not_del
	clr.b	(keytaste)
	move.l	(smpmode_pt,pc),a1
	move.l	(a1)+,d0
	move.l	(a1)+,a0
	move.l	a0,a6
	move.l	a0,(smppt0)
	move.l	(a1)+,(smppt1)
	move.l	(mainvbr,pc),a0
	move.l	d0,($70,a0)
	cmp.l	#smpmode_end,a1
	bne.b	.del_ok
	lea	(smpmode_1,pc),a1
.del_ok	move.l	a1,(smpmode_pt)
	bra	panel_audio
.not_del
	cmp.b	#1,d0			** 1 down
	bne.b	.not_1
	move	#1,(subsampling)
	move.l	#spectrum_screen_full1,d1
	move	d1,(cl2pt+10+4)
	swap	d1
	move	d1,(cl2pt+10)
	move.l	#spectrum_screen_tb1,d1
	move	d1,(cl3pt2+6)
	swap	d1
	move	d1,(cl3pt2+2)
	bra	panel_freq
.not_1
	cmp.b	#2,d0			** 2 down
	bne.b	.not_2
	move	#2,(subsampling)
	move.l	#spectrum_screen_full2,d1
	move	d1,(cl2pt+10+4)
	swap	d1
	move	d1,(cl2pt+10)
	move.l	#spectrum_screen_tb2,d1
	move	d1,(cl3pt2+6)
	swap	d1
	move	d1,(cl3pt2+2)
	bra	panel_freq
.not_2
	cmp.b	#3,d0			** 3 down
	bne.b	.not_3
	move	#3,(subsampling)
	move.l	#spectrum_screen_full3,d1
	move	d1,(cl2pt+10+4)
	swap	d1
	move	d1,(cl2pt+10)
	move.l	#spectrum_screen_tb3,d1
	move	d1,(cl3pt2+6)
	swap	d1
	move	d1,(cl3pt2+2)
	bra	panel_freq
.not_3
	cmp.b	#$10,d0			** q down
	bne.b	.not_q
	move.l	#window_rectangle,(fft_window_pt)
	bra	panel_window
.not_q
	cmp.b	#$11,d0			** w down
	bne.b	.not_w
	move.l	#window_hamming,(fft_window_pt)
	bra	panel_window
.not_w
	cmp.b	#$12,d0			** e down
	bne.b	.not_e
	move.l	#window_hanning,(fft_window_pt)
	bra	panel_window
.not_e
	cmp.b	#$13,d0			** r down
	bne.b	.not_r
	move.l	#window_triangle,(fft_window_pt)
	bra	panel_window
.not_r
	cmp.b	#$14,d0			** t down
	bne.b	.not_t
	move.l	#window_blackman,(fft_window_pt)
	bra	panel_window
.not_t
	cmp.b	#$20,d0			** a down
	bne.b	.not_a
	subq.l	#1,(fft_logscale)
	bra	panel_intensity
.not_a
	cmp.b	#$21,d0			** s down
	bne.b	.not_s
	clr.l	(fft_logscale)
	bra	panel_intensity
.not_s
	rts






;-------------------------------
panel_screenmode
	lea	(.hilighted,pc),a5
	move.l	(a5),a0
	moveq	#7-1,d7
.loop1	not.l	(a0)+
	not.l	(a0)+
	addq.l	#8,a0
	dbf	d7,.loop1
	lea	(function_panel),a0
	move	(plot_mode,pc),d0
	bne.b	.not_osc
	add	#128/8*(1+13),a0
	bra.b	.new
.not_osc
	add	#128/8*(1+34),a0
.new
	move.l	a0,(a5)
	moveq	#7-1,d7
.loop2	not.l	(a0)+
	not.l	(a0)+
	addq.l	#8,a0
	dbf	d7,.loop2
	rts
.hilighted	dc.l	function_panel+128/8*(1+13)


;-------------------------------
panel_window
	lea	(.hilighted,pc),a5
	moveq	#10,d6
	move.l	(a5),a0
	moveq	#7-1,d7
.loop1	not	(a0)+
	not.l	(a0)+
	add.l	d6,a0		;#10
	dbf	d7,.loop1

	lea	(function_panel),a0
	move.l	(fft_window_pt,pc),d0
	cmp.l	#window_rectangle,d0
	bne.b	.not_rect
	add	#128/8*(1+53)+2,a0
	bra.b	.new
.not_rect
	cmp.l	#window_hamming,d0
	bne.b	.not_hamm
	add	#128/8*(1+64)+2,a0
	bra.b	.new
.not_hamm
	cmp.l	#window_hanning,d0
	bne.b	.not_hann
	add	#128/8*(1+75)+2,a0
	bra.b	.new
.not_hann
	cmp.l	#window_triangle,d0
	bne.b	.not_tria
	add	#128/8*(1+86)+2,a0
	bra.b	.new
.not_tria
	add	#128/8*(1+97)+2,a0

.new
	move.l	a0,(a5)
	moveq	#7-1,d7
.loop2	not	(a0)+
	not.l	(a0)+
	add.l	d6,a0		;#10
	dbf	d7,.loop2
	rts
.hilighted	dc.l	function_panel+128/8*(1+75)+2


;-------------------------------
panel_freq
	lea	(.hilighted,pc),a5
	moveq	#10,d6
	move.l	(a5),a0
	moveq	#7-1,d7
.loop1	not	(a0)+
	not.l	(a0)+
	add.l	d6,a0		;#10
	dbf	d7,.loop1

	lea	(function_panel),a0
	move	(subsampling,pc),d0
	subq	#1,d0
	bne.b	.not_1
	add	#128/8*(1+117)+2,a0
	bra.b	.new
.not_1
	subq	#1,d0
	bne.b	.not_2
	add	#128/8*(1+128)+2,a0
	bra.b	.new
.not_2
	add	#128/8*(1+139)+2,a0

.new
	move.l	a0,(a5)
	moveq	#7-1,d7
.loop2	not	(a0)+
	not.l	(a0)+
	add.l	d6,a0		;#10
	dbf	d7,.loop2
	rts
.hilighted	dc.l	function_panel+128/8*(1+117)+2


;-------------------------------
panel_intensity
	lea	(.hilighted,pc),a5
	moveq	#10,d6
	move.l	(a5),a0
	moveq	#7-1,d7
.loop1	not	(a0)+
	not.l	(a0)+
	add.l	d6,a0		;#10
	dbf	d7,.loop1

	lea	(function_panel),a0
	move.l	(fft_logscale,pc),d0
	beq.b	.not_log
	add	#128/8*(1+159)+2,a0
	bra.b	.new
.not_log
	add	#128/8*(1+170)+2,a0

.new
	move.l	a0,(a5)
	moveq	#7-1,d7
.loop2	not	(a0)+
	not.l	(a0)+
	add.l	d6,a0		;#10
	dbf	d7,.loop2
	rts
.hilighted	dc.l	function_panel+128/8*(1+159)+2


;-------------------------------
panel_audio
	lea	(.hilighted,pc),a5
	moveq	#16,d6
	move.l	(a5),a0
	moveq	#7-1,d7
.loop1	not	(a0)
	add.l	d6,a0		;#16
	dbf	d7,.loop1

	lea	(function_panel),a0
	move.l	(mainvbr,pc),a1
	move.l	($70,a1),d0
	cmp.l	#sample_interrupt,d0
	bne.b	.nosound
	add	#128/8*(1+190)+2,a0
	bra.b	.new
.nosound
	add	#128/8*(1+190)+2+4,a0

.new
	move.l	a0,(a5)
	moveq	#7-1,d7
.loop2	not	(a0)
	add.l	d6,a0		;#16
	dbf	d7,.loop2
	rts
.hilighted	dc.l	function_panel+128/8*(1+190)+2+4


;-------------------------------
prepare_sample
	move.l	(smppt0,pc),a0
	move.l	(fftpt0,pc),a2
	move.l	(fft_window_pt,pc),a3
	move	#$80,d2

	move	(subsampling,pc),d0
	cmp.b	#3,d0
	bne.b	.not_x4

;subsampling x 4
	move	#189-1,d7
.x4_1	clr	(a2)+
	dbf	d7,.x4_1
	moveq	#14+2,d6
	move	#126-1,d7
.x4_2	move.b	(a0)+,d0	;1
	add.b	d2,d0
	ext	d0
	move.b	(a0)+,d1	;2
	add.b	d2,d1
	ext	d1
	add	d1,d0
	move.b	(a0)+,d1	;3
	add.b	d2,d1
	ext	d1
	add	d1,d0
	move.b	(a0)+,d1	;4
	add.b	d2,d1
	ext	d1
	add	d1,d0
	muls	(a3),d0
	asr.l	d6,d0
	move	d0,(a2)+
	addq.l	#4*2,a3
	dbf	d7,.x4_2
	move	#189-1,d7
.x4_3	clr	(a2)+
	dbf	d7,.x4_3
	rts

.not_x4	cmp.b	#2,d0
	bne.b	.not_x2

;subsampling x 2
	moveq	#126-1,d7
.half1	clr	(a2)+
	dbf	d7,.half1
	moveq	#14+1,d6
	move	#252-1,d7
.half2	move.b	(a0)+,d0	;1
	add.b	d2,d0
	ext	d0
	move.b	(a0)+,d1	;2
	add.b	d2,d1
	ext	d1
	add	d1,d0
	muls	(a3),d0
	asr.l	d6,d0
	move	d0,(a2)+
	addq.l	#2*2,a3
	dbf	d7,.half2
	moveq	#126-1,d7
.half3	clr	(a2)+
	dbf	d7,.half3
	rts

.not_x2

;full frequency
	moveq	#14,d6
	move	#504-1,d7
.full	move.b	(a0)+,d0	;1
	add.b	d2,d0
	ext	d0
	muls	(a3)+,d0
	asr.l	d6,d0
	move	d0,(a2)+
	dbf	d7,.full
	rts


;-------------------------------
; a5 - screen pointer
clear_wave
	add.l	#512/8*129,a5
	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)
	rts


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

plot_wave_spectrum
	lea	(wave_pt0,pc),a0
	movem.l	(a0)+,d0/d1
	exg	d0,d1
	movem.l	d0/d1,-(a0)
	lea	(cl1pt+2),a0
	move	d1,(4,a0)
	swap	d1
	move	d1,(a0)

	lea	(spec_pt0,pc),a0
	movem.l	(a0)+,d0/d1
	exg	d0,d1
	movem.l	d0/d1,-(a0)
	lea	(cl2pt+2),a0
	move	d1,(4,a0)
	swap	d1
	move	d1,(a0)


	move	(wave_off,pc),d0
	bne.w	plot_spectrum

	lea	(fastscr),a5		;clear fast ram image
	bsr.b	clear_wave

	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
	bra.b	plot_spectrum


;-------------------------------
; a5 - screen pointer
clear_spectrum
	add.l	#256/8*129,a5
	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)
	rts

plot_spectrum
	move	(spec_off,pc),d0
	beq.b	.doit
	rts

.doit	lea	(fastscr),a5		;clear fast ram image
	bsr.b	clear_spectrum

	move.l	(fftpt0,pc),a0
	move.l	(fft_logscale,pc),d0
	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	#$40,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	(spec_pt0,pc),a5
	move	#129-1,d0
.coloop	REPT	8
	move.l	(a4)+,(a5)+
	ENDR
	dbf	d0,.coloop
	rts



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

init_gray_palette
	lea	($dff000+bplcon3),a2
	move	#$2000,d5	;color bank +1
	move	#$0c00,d4	;color hi
	move	#$0e00,d3	;color lo
	moveq	#8-1,d7		;8 color banks
	sub.l	a4,a4

.loop0	lea	($dff000+color00),a1
	moveq	#32-1,d6	;32 entries per bank
.loop1	move.l	a4,d0
	addq.l	#1,a4
	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






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

plot_fft8
	move.l	(fftpt0,pc),a0
	move.l	(fft_logscale,pc),d0
	bsr	deli_fft

	move.l	(fftpt0,pc),a0
	move.l	a0,a1
	addq.l	#2,a0
	clr.b	(a1)+
	move	#250-1,d1
.prepare_loop
	move	(a0)+,d0
	lsr	#8,d0
	addq.b	#1,d0
	bne.b	.prepare_ok
	moveq	#-1,d0
.prepare_ok
	move.b	d0,(a1)+
	dbf	d1,.prepare_loop
	clr.b	(a1)+
	clr.l	(a1)+

	move.l	(fftpt0,pc),a0
	move.l	(.scr_pt,pc),a1
	bsr.b	c2p

	move.l	(fftpt0,pc),a0
	move.l	(.scr_pt,pc),a1
	add	#256/8*240,a1
	bsr.b	c2p

	lea	(cl3pt+2),a0
	move.l	(.scr_pt,pc),d0
	moveq	#7,d1
.clloop	move	d0,(4,a0)
	swap	d0
	move	d0,(a0)
	addq.l	#8,a0
	swap	d0
	add.l	#bplsize,d0
	dbf	d1,.clloop

	move.l	(.scr_pt,pc),d0
	sub.l	#256/8,d0
	move.l	(.scr8pt,pc),d1
	cmp.l	d1,d0
	bge.b	.pt_ok
	move.l	(.scr8pt,pc),d0
	add.l	#256/8*239,d0
.pt_ok	lea	(.scr_pt,pc),a0
	move.l	d0,(a0)
	rts

.scr8pt	dc.l	scr8
.scr_pt	dc.l	scr8+10*256/8




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

;**** chunky2planar routine
;****
;**** a0 - chunky input,  a1 - planar output
;**** 256 input pixels are converted (one row on the screen)
;**** bitplane size: 256*480 pixels (256*240 visible)
bplsize = 256/8*480

c2p	movem.l	a0/a1,-(a7)	;push input/output pointers
	move.l	#$33333333,d5
	move.l	#$55555555,d6
	lea	(256,a0),a2	;chunky input end
	lea	(2*bplsize,a1),a1	;bitplane 2
;loop 1 - bitplanes 0,1,2,3
	move.l	(a0)+,d0
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	#$0f0f0f0f,d4
	and.l	d4,d0
	and.l	d4,d2
	lsl.l	#4,d0
	or.l	d2,d0
	and.l	d4,d1
	and.l	d4,d3
	lsl.l	#4,d1
	or.l	d3,d1
	move.l	d1,a3
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	(a0)+,d7
	and.l	d4,d1
	and.l	d4,d2
	lsl.l	#4,d2
	or.l	d1,d2
	and.l	d4,d3
	and.l	d4,d7
	lsl.l	#4,d3
	or.l	d7,d3
	move.l	a3,d1
	swap	d2
	move	d0,d7
	move	d2,d0
	move	d7,d2
	swap	d2
	swap	d3
	move	d1,d7
	move	d3,d1
	move	d7,d3
	swap	d3
	bra.b	.entry1
.loop1	move.l	(a0)+,d0
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	d7,(a1)+	;bitplane 2
	move.l	#$f0f0f0f,d4
	and.l	d4,d0
	and.l	d4,d2
	lsl.l	#4,d0
	or.l	d2,d0
	and.l	d4,d1
	and.l	d4,d3
	lsl.l	#4,d1
	or.l	d3,d1
	move.l	d1,a3
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	(a0)+,d7
	move.l	a4,(-bplsize-4,a1)	;bitplane 1
	and.l	d4,d1
	and.l	d4,d2
	lsl.l	#4,d2
	or.l	d1,d2
	and.l	d4,d3
	and.l	d4,d7
	lsl.l	#4,d3
	or.l	d7,d3
	move.l	a3,d1
	swap	d2
	move	d0,d7
	move	d2,d0
	move	d7,d2
	swap	d2
	swap	d3
	move	d1,d7
	move	d3,d1
	move	d7,d3
	swap	d3
	move.l	a5,(-bplsize*2-4,a1)	;bitplane 0
.entry1	move.l	#$00ff00ff,d4
	move.l	d2,d7
	lsr.l	#2,d7
	eor.l	d0,d7
	and.l	d5,d7
	eor.l	d7,d0
	lsl.l	#2,d7
	eor.l	d7,d2
	move.l	d3,d7
	lsr.l	#2,d7
	eor.l	d1,d7
	and.l	d5,d7
	eor.l	d7,d1
	lsl.l	#2,d7
	eor.l	d7,d3
	move.l	d1,d7
	lsr.l	#8,d7
	eor.l	d0,d7
	and.l	d4,d7
	eor.l	d7,d0
	lsl.l	#8,d7
	eor.l	d7,d1
	move.l	d1,d7
	lsr.l	#1,d7
	eor.l	d0,d7
	and.l	d6,d7
	eor.l	d7,d0
	move.l	d0,(bplsize,a1)	;bitplane 3
	add.l	d7,d7
	eor.l	d1,d7
	move.l	d3,d1
	lsr.l	#8,d1
	eor.l	d2,d1
	and.l	d4,d1
	eor.l	d1,d2
	lsl.l	#8,d1
	eor.l	d1,d3
	move.l	d3,d1
	lsr.l	#1,d1
	eor.l	d2,d1
	and.l	d6,d1
	eor.l	d1,d2
	add.l	d1,d1
	eor.l	d1,d3
	move.l	d2,a4
	move.l	d3,a5
	cmp.l	a0,a2
	bgt	.loop1
	move.l	d7,(a1)		;bitplane 2
	move.l	a4,(-bplsize,a1)	;bitplane 1
	move.l	a5,(-bplsize*2,a1)	;bitplane 0

	movem.l	(a7)+,a0/a1	;pop input/output pointers
	add.l	#bplsize*6,a1	;pointer to bitplane 6
;loop 2 - bitplanes 4,5,6,7
	move.l	(a0)+,d0
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	#$f0f0f0f0,d4
	and.l	d4,d0
	and.l	d4,d2
	lsr.l	#4,d2
	or.l	d2,d0
	and.l	d4,d1
	and.l	d4,d3
	lsr.l	#4,d3
	or.l	d3,d1
	move.l	d1,a3
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	(a0)+,d7
	and.l	d4,d1
	and.l	d4,d2
	lsr.l	#4,d1
	or.l	d1,d2
	and.l	d4,d3
	and.l	d4,d7
	lsr.l	#4,d7
	or.l	d7,d3
	move.l	a3,d1
	swap	d2
	move	d0,d7
	move	d2,d0
	move	d7,d2
	swap	d2
	swap	d3
	move	d1,d7
	move	d3,d1
	move	d7,d3
	swap	d3
	bra.b	.entry2
.loop2	move.l	(a0)+,d0
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	d7,(a1)+	;bitplane 6
	move.l	#$f0f0f0f0,d4
	and.l	d4,d0
	and.l	d4,d2
	lsr.l	#4,d2
	or.l	d2,d0
	and.l	d4,d1
	and.l	d4,d3
	lsr.l	#4,d3
	or.l	d3,d1
	move.l	d1,a3
	move.l	(a0)+,d2
	move.l	(a0)+,d1
	move.l	(a0)+,d3
	move.l	(a0)+,d7
	move.l	a4,(-bplsize-4,a1)	;bitplane 5
	and.l	d4,d1
	and.l	d4,d2
	lsr.l	#4,d1
	or.l	d1,d2
	and.l	d4,d3
	and.l	d4,d7
	lsr.l	#4,d7
	or.l	d7,d3
	move.l	a3,d1
	swap	d2
	move	d0,d7
	move	d2,d0
	move	d7,d2
	swap	d2
	swap	d3
	move	d1,d7
	move	d3,d1
	move	d7,d3
	swap	d3
	move.l	a5,(-bplsize*2-4,a1)	;bitplane 4
.entry2	move.l	#$00ff00ff,d4
	move.l	d2,d7
	lsr.l	#2,d7
	eor.l	d0,d7
	and.l	d5,d7
	eor.l	d7,d0
	lsl.l	#2,d7
	eor.l	d7,d2
	move.l	d3,d7
	lsr.l	#2,d7
	eor.l	d1,d7
	and.l	d5,d7
	eor.l	d7,d1
	lsl.l	#2,d7
	eor.l	d7,d3
	move.l	d1,d7
	lsr.l	#8,d7
	eor.l	d0,d7
	and.l	d4,d7
	eor.l	d7,d0
	lsl.l	#8,d7
	eor.l	d7,d1
	move.l	d1,d7
	lsr.l	#1,d7
	eor.l	d0,d7
	and.l	d6,d7
	eor.l	d7,d0
	move.l	d0,(bplsize,a1)	;bitplane 7
	add.l	d7,d7
	eor.l	d1,d7
	move.l	d3,d1
	lsr.l	#8,d1
	eor.l	d2,d1
	and.l	d4,d1
	eor.l	d1,d2
	lsl.l	#8,d1
	eor.l	d1,d3
	move.l	d3,d1
	lsr.l	#1,d1
	eor.l	d2,d1
	and.l	d6,d1
	eor.l	d1,d2
	add.l	d1,d1
	eor.l	d1,d3
	move.l	d2,a4
	move.l	d3,a5
	cmp.l	a0,a2
	bgt	.loop2
	move.l	d7,(a1)		;bitplane 6
	move.l	a4,(-bplsize,a1)	;bitplane 5
	move.l	a5,(-bplsize*2,a1)	;bitplane 4
	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
playback_lookup
i	set	$80
	REPT	256
	dc.b	i,i
i	set	(i+1)&$ff
	ENDR

sample_interrupt_nosound
	move	#$0780,($dff000+intreq)
	move.b	($bfe101),(a6)+		*PRB CIA-A
	move	d0,($dff000+aud2dat)
	rte
dummy_sample_interrupt
	move	#$0780,($dff000+intreq)
	move	d0,($dff000+aud2dat)
	rte


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

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


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

plot_mode	dc	0
oldlevel4	dc.l	0
wave_pt0	dc.l	scrwav0
wave_pt1	dc.l	scrwav1
wave_off	dc	0
spec_pt0	dc.l	scrfft0
spec_pt1	dc.l	scrfft1
spec_off	dc	0
ready		dc	0
smppt0		dc.l	smpbuf0
smppt1		dc.l	smpbuf1
fftpt0		dc.l	fftbuf0
keytaste	dc.b	0,0
subsampling	dc	1
fft_window_pt	dc.l	window_hanning
fft_logscale	dc.l	-1

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

window_rectangle
	blk	504,2^14
window_hanning
	incbin	bin/window_hanning.bin
window_hamming
	incbin	bin/window_hamming.bin
window_triangle
i set 0
	REPT	253
	dc	(i*2^14)/252
i set i+1
	ENDR
i set 251
	REPT	251
	dc	(i*2^14)/252
i set i-1
	ENDR
window_blackman
	incbin	bin/window_blackman.bin



smpmode_pt	dc.l	smpmode_1
smpmode_1	dc.l	dummy_sample_interrupt,smp_1,smp_1
		dc.l	dummy_sample_interrupt,smp_2,smp_2
		dc.l	sample_interrupt_nosound,smpbuf0,smpbuf1
smpmode_end

smp_1	REPT	4
	blk.b	63,2
	blk.b	63,255-2
	ENDR

smp_2	REPT	32
i set 8
	REPT 16
	dc.b	i
i set i+16
	ENDR
	ENDR

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

	include	deli_fft.i




*******************************************************
	section	buff,bss

	ds.b	1024
fastscr	ds.b	128*129
	ds.b	1024
smpbuf0	ds.b	1024*4
smpbuf1	ds.b	1024*4
fftbuf0	ds.b	1024*2
fftbuf1	ds.b	1024*2


*******************************************************
	section	screen,bss_c

	ds.b	1024
scrwav0	ds.b	512/8*129
	ds.b	1024
scrwav1	ds.b	512/8*129
	ds.b	1024
scrfft0	ds.b	256/8*129
	ds.b	1024
scrfft1	ds.b	256/8*129
	ds.b	1024
scr8	ds.b	256*480
	ds.b	1024


*******************************************************
	section	chip,data_c

spectrum_screen_full1
	incbin	bin/spectrum_screen_full.raw
spectrum_screen_full2 = spectrum_screen_full1+1*256/8*129
spectrum_screen_full3 = spectrum_screen_full1+2*256/8*129

spectrum_screen_tb1
	incbin	bin/spectrum_screen_topbottom.raw
spectrum_screen_tb2 = spectrum_screen_tb1+1*256/8*22
spectrum_screen_tb3 = spectrum_screen_tb1+2*256/8*22

function_panel
	incbin	bin/function_panel.sprite

wave_screen
	incbin	bin/wave_screen.raw

dummy_sprite	dc.l	0,0,0,0



backcol	set	$0131



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

;**** oscilloscope + spectrum analyzer
plot_top set 33
cl2
cl1	ds	32
	dc	(15<<8)+5,-2
	dc	bpl1mod,0,bpl2mod,0,bplcon1,0
	dc	diwstrt,$1a6a,diwstop,$3ae0
	dc	ddfstrt,$3c,ddfstop,$3c+(512-32)/4
	dc	fmode,$000c,bplcon4,$0010,color17,$888
	dc	color00,backcol,color01,$0ad6
	dc	color02,backcol+$0222,color03,$0ad6-$0222

cl1pt	dc	bpl0pth,0,bpl0ptl,0
	dc	bpl1pth,0,bpl1ptl,0
	dc	((plot_top)<<8)+5,-2
	dc	bplcon0,$a001
	dc	((plot_top+129)<<8)+5,-2
	dc	bplcon0,1

	dc	ddfstrt,$38,ddfstop,$38+(256-16)/2
cl2pt	dc	bpl0pth,0,bpl0ptl,0
	dc	bpl1pth,0,bpl1ptl,0
	dc	((plot_top+129+4)<<8)+5,-2
	dc	bplcon0,$2001
	dc	$ffe1,-2
	dc	((plot_top+129+4+129-256)<<8)+5,-2
	dc	bplcon0,1,bplcon3,$0002
	dc	-1,-2


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

water_top 	set 48
;**** waterfall plot
cl3	ds	32
	dc	(15<<8)+5,-2
	dc	color00,backcol
	dc	bpl1mod,0,bpl2mod,0,bplcon1,0
	dc	diwstrt,$1a6a,diwstop,$3ae0
	dc	ddfstrt,$30,ddfstop,$30+(256-64)/2
	dc	fmode,$000f,bplcon4,$0080
	dc	((water_top-15)<<8)+5,-2,bplcon0,$1001
	dc	color00,backcol,color01,backcol+$0222
	dc	((water_top-1)<<8)+$bb,-2,bplcon0,1
	dc	color01,0
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	bplcon0,$0011
	dc	$ffe1,-2
	dc	((water_top-256+239)<<8)+5,-2,bplcon0,$1001
	dc	color01,backcol+$0222
cl3pt2	dc	bpl0pth,0,bpl0ptl,0
	dc	((water_top+7-256+239)<<8)+5,-2,bplcon0,1,bplcon3,$0002
	dc	-1,-2

