
; VERY UNOPTIMISED CODE !!! AND NOT 100% WORKING .... SO CODE AN OWN ONE !

	section "SAMPLESHOW",code_c

wblit	macro
\@1	btst	#14,2(a6)
	bne.b	\@1
	endm

start	movem.l	d0-a6,-(a7)			;save regs.

	moveq	#0,d0				;use level 6
	bsr.w	mt_data+0			;init replay routine

	move	#1,d0				;play song 1
	bsr.w	mt_data+2			;init song routine

	lea	sound_struct(pc),a0
	bsr.w	mt_data+14			;fill struct

	bsr.w	init_drawsample			;init drawsample

; GET OLD COPPERLIST

	move.l	4.w,a6
	lea	gfxname(pc),a1
	jsr	-408(a6)
	move.l	d0,a1
	move.l	38(a1),oldcopper
	jsr	-414(a6)
	
; SAVE SYSTEM

	lea	$dff000,a6
	move.w	$1c(a6),d0
	or.w	#$8000,d0		;set 'setbit'
	move.w	d0,oldintar
	move.l	$6c.w,oldvblanc		;save system vblanc
	move.w	#$7fff,$9a(a6)		;stop all system-things

; INIT LEERSPRITES

	lea	spritecopper(pc),a0
	move.l	#leersprite,d0
	moveq	#7,d7
.sloop	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	swap	d0
	addq.l	#8,a0
	dbf	d7,.sloop

	move.l	#newcopper,$80(a6)		;start copper
	move.w	#$83f0,$96(a6)
	move.l	#newint,$6c.w
	move.w	#$c020,$9a(a6)			;start vblanc

buttwait
	bsr.b	drawsample
	
	btst	#6,$bfe001
	bne.b	buttwait


	move.w	#$7fff,$9a(a6)
	move.l	oldvblanc(pc),$6c.w
	move.w	oldintar(pc),$9a(a6)		;start system vblanc
	move.w	#$400,$96(a6)			;clr blitternasty bit
	move.l	oldcopper(pc),$80(a6)		;save systemcopper

	bsr.w	mt_data+10
	
	movem.l	(a7)+,d0-a6			;get regs.
	moveq	#0,d0				;no error return
	rts					;say bye bye !!!!

;------------------------------------------------------------------------------
;--- INTERUPT HANDLER ---------------------------------------------------------
;------------------------------------------------------------------------------

newint
	movem.l	d0-a6,-(a7)
	lea	$dff000,a6
	move.w	#$20,$9c(a6)			;intreq löschen
	moveq	#64,d0
	bsr.w	mt_data+6
	bsr.w	checksound
	movem.l	(a7)+,d0-a6
	rte

;------------------------------------------------------------------------------
;--- DRAW SAMPLE --------------------------------------------------------------
;------------------------------------------------------------------------------
; WRITTEN IN 1991/92 BY MC68000/TECH ------------------------------------------
;------------------------------------------------------------------------------

viewlength=160/2		;no. of samples/voice
dots=0				;1=using dots ... 0=using lines
xyswap=0			;1=swapping x & y
xadd=2
screenbreite=40			;bytes
shifter=3			;shifter for ysize (lsr.w) 

x1=20
y1=0
x2=60
y2=64
x3=100
y3=128
x4=140
y4=192

;--------------------------- INIT SHOWSAMPLE ----------------------------------

init_drawsample
	lea	multab(pc),a0
	moveq	#0,d0
	move.w	#255,d7
.wloop	move.w	d0,(a0)+
	add.w	#screenbreite,d0
	dbf	d7,.wloop			;create multab
	rts

;--------------------------- DRAW SHOWSAMPLE ----------------------------------

drawsample
	moveq	#-1,d0
wb
	cmp.b	6(a6),d0
	bne.b	wb

; DOUBLE BUFFERING

	lea	screen(pc),a0
	movem.l	(a0),d0-d1
	exg	d0,d1
	movem.l	d0-d1,(a0)

; SHOW 1.SCREEN 

	lea	planecopper(pc),a0
	move.w	d1,6(a0)
	swap	d1
	move.w	d1,2(a0)

; CLEAR 2.SCREEN

	wblit
	move.l	d0,$54(a6)
	move.l	#$01000000,$40(a6)
	clr.w	$66(a6)
	move.w	#256*64+[screenbreite/2],$58(a6)
	
; MAKE COORDSLIST

	lea	coords(pc),a1

	move.l	sound_struct+0(pc),a2		;adresse st-structur
	lea	ss_sample1(pc),a4		;adresse showsample
	move.w	#y1,d5				;y adder
	move.w	#x1,d3				;x start
	bsr.w	createcoords

	move.l	sound_struct+4(pc),a2		;adresse st-structur
	lea	30(a4),a4			;adresse showsample
	move.w	#y2,d5
	move.w	#x2,d3				;x start
	bsr.w	createcoords

	move.l	sound_struct+8(pc),a2		;adresse st-structur
	lea	30(a4),a4			;adresse showsample
	move.w	#y3,d5
	move.w	#x3,d3				;x start
	bsr.w	createcoords

	move.l	sound_struct+12(pc),a2		;adresse st-structur
	lea	30(a4),a4			;adresse showsample
	move.w	#y4,d5
	move.w	#x4,d3				;x start
	bsr.w	createcoords


; DRAW IT - WITH DOTS

	if dots=1

	wblit
	lea	coords(pc),a5
	lea	multab(pc),a4
	move.l	screen(pc),a0
	moveq	#3,d7
voiceloop
	move.w	#viewlength-1,d6
dotloop
	movem.w	(a5)+,d0-d1
	move.w	d0,d2
	lsr.w	#3,d0
	add.w	d1,d1
	add.w	(a4,d1.w),d0
	not.w	d2
	bset	d2,(a0,d0.w)
	dbf	d6,dotloop
	dbf	d7,voiceloop	
	rts
	
	else

; DRAW IT - WITH LINES

	moveq	#screenbreite,d0
	moveq	#-1,d1
	wblit
	move.w	d1,$44(a6)
	move.w	d1,$72(a6)
	move.w	#$8000,$74(a6)
	move.w	d0,$60(a6)
	move.w	d0,$66(a6)

	lea	coords(pc),a5
	lea	multab(pc),a4
	move.l	screen(pc),a0
	moveq	#3,d7
voiceloop
	move.w	#viewlength-2,d6
	movem.w	(a5)+,d0-d1
lineloop
	movem.w	(a5)+,d2-d3
	movem.w	d2-d3,-(a7)			;end xy sichern

	cmp.w	d1,d3
	bge.s	line3
	exg	d0,d2
	exg	d1,d3
line3	sub.w	d1,d3
	add.w	d1,d1
	move.w	(a4,d1.w),d1
	lea	(a0,d1.w),a2
	moveq	#0,d1
	sub.w	d0,d2
	bge.s	line4
	addq.w	#2,d1
	neg.w	d2
line4	moveq	#$f,d4
	and.w	d0,d4
	lsr.w	#3,d0
	add.w	d0,a2
	ror.w	#4,d4			
	or.w	#$bca,d4
	swap	d4
	cmp.w	d2,d3
	bge.s	line5
	addq.w	#1,d1
	exg	d2,d3
line5	add.w	d2,d2
	move.w	d2,d0
	sub.w	d3,d0
	addx.w	d1,d1
	move.b	line2(pc,d1.w),d4
	swap	d2
	move.w	d0,d2
	sub.w	d3,d2
	moveq	#6,d1
	lsl.w	d1,d3
	add.w	#$42,d3
	lea	$52(a6),a1
	wblit
	move.l	d4,$40(a6)
	move.l	d2,$62(a6)
	move.l	a2,$48(a6)
	move.w	d0,(a1)+
	move.l	a2,(a1)+	
	move.w	d3,(a1)

	movem.w	(a7)+,d0-d1			;end xy -> start xy
	dbf	d6,lineloop
	dbf	d7,voiceloop
	rts

line2	dc.b	1,1+$40,17,17+$40,9,9+$40,21,21+$40
	endc

;----------------------------- CREATE COORDSTABLE -----------------------------

createcoords
	moveq	#0,d0
	tst.w	10(a4)				;neuer ausschlag ???
	beq.b	.nonewaus

	move.l	14(a4),(a4)			;sample adress
	clr.w	4(a4)				;showadder
	move.w	18(a4),6(a4)			;period
	move.w	20(a4),8(a4)			;samplelenght
	clr.w	10(a4)				;clr anschlag
.nonewaus
	move.w	4(a4),d0			;showadder
	add.w	6(a4),d0			;add period
	move.w	d0,4(a4)			;new showadder sichern
	cmp.w	8(a4),d0			;showadder > samplelenght
	blo.b	.nolenght

	cmp.b	#2,29(a4)			;check replenght
	blo.b	.noloop				;<=2 (=kein loop) ???
	move.l	24(a4),(a4)			;set loopstart	
	move.w	28(a4),d1			;looplenght
	sub.w	#viewlength,d1
	move.w	d1,8(a4)			;=new samplelenght
	move.l	(a4),a3
	clr.w	4(a4)				;show adder = 0
	bra.b	.nolenght	
.noloop
	lea	leersample(pc),a3
	move.l	a3,(a4)				;sampleadress = leersample
	clr.l	4(a4)				;showadder & viewadder = 0
	clr.w	8(a4)				;samplelenght = 0
	bra.b	.newlenght
.nolenght
	move.l	(a4),a3				;sampleadress
	add.l	d0,a3				;add showadder
.newlenght
	moveq	#64,d4				;max volume
	sub.b	19(a2),d4			;act.vol. - max vol.
	add.w	d4,d4

	if viewlength<=128
	moveq	#viewlength-1,d7		;anzahl samples
	else
	move.w	#viewlength-1,d7
	endc
	
	move.w	#128,d6				;sample + screenadder 
.drawloop
	moveq	#0,d1				
	move.b	(a3)+,d1			;sample
	ext.w	d1				;sample byte auf wordsize
	beq.b	.addready			;= 0 ???
	bpl.b	.ispos				;ist positiv

	add.w	d4,d1				;add volume
	ble.b	.addready
	moveq	#0,d1
	bra.b	.addready
.ispos
	sub.w	d4,d1				;sub volume
	bge.b	.addready
	moveq	#0,d1

.addready
	add.w	d6,d1

	if shifter>0
	lsr.w	#shifter,d1
	endc

	move.w	d3,d0				;x
	addq.w	#xadd,d3			;x + 1
	add.w	d5,d1				;y adder

	if xyswap=1
	exg	d0,d1
	endc

	movem.w	d0-d1,(a1)
	addq.l	#4,a1
.nodraw
	dbf	d7,.drawloop
	rts

;--------------- CHECK SOUND (VBLANC -> AFTER SOUNDREPLAYER) ------------------

checksound
	move.l	sound_struct+20(pc),a0
	tst.b	(a0)				;mt_counter
	bne.b	.nochange			;mt_counter = 0 -> new note

	lea	sound_struct(pc),a4
	lea	ss_sample1(pc),a1		;adresse showsample
	move.l	24(a4),a2			;periodtable
	lea	sample_rate(pc),a3
	moveq	#35*2,d4
	move.w	#viewlength,d5
	moveq	#3,d7
.checkit
	move.l	(a4)+,a0
	tst.w	(a0)
	beq.b	.nomodify
	move.w	(a0),10(a1)			;save anschlag
	move.l	4(a0),14(a1)			;sampleadress
	move.w	16(a0),d3			;period
	moveq	#0,d2
.checkloop
	cmp.w	(a2,d2.w),d3
	bge.b	.leavecheckloop
	addq.w	#2,d2
	cmp.w	d4,d2
	bne.b	.checkloop
.leavecheckloop
	move.w	(a3,d2.w),18(a1)		;sample rate
	move.w	8(a0),d3			;samplelenght
	sub.w	d5,d3				;- viewsize
	bpl.b	.notolittle
	move.w	d5,d3
.notolittle
	move.w	d3,20(a1)			;samplelenght
	move.l	10(a0),24(a1)			;loopstart
	move.w	14(a0),d3
	sub.w	d5,d3
	bmi.b	.noloop
	move.w	14(a0),d3
.noloop
	move.w	d3,28(a1)			;looplenght
.nomodify
	lea	30(a1),a1
	dbf	d7,.checkit
.nochange
	rts

; DATEN BUFFER ----------------------------------------------------------------

sample_rate	dc.w	83,88,94,99,106,112,119,126,133,141,150,158,167,177
		dc.w	188,199,211,224,237,251,266,282,298,317,335,354,377
		dc.w	398,421,447,474,501,530,563,597,634
leersample	dcb.b	viewlength
		even
ss_sample1	dcb.b	30*4
multab		dcb.w	256
screen		dc.l	screen1,screen2

oldvblanc	dc.l	0
oldintar	dc.w	0
oldcopper	dc.l	0
gfxname		dc.b	'graphics.library',0,0
coords		dcb.w	viewlength*2*4

sound_struct	dcb.b	28

;------------------------------------------------------------------------------
;--- COPPERLISTE --------------------------------------------------------------
;------------------------------------------------------------------------------


newcopper	

spritecopper	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

bplcon0		dc.w	$0100,$1200

planecopper	dc.w	$00e0,$0000,$00e2,$0000

modulo		dc.w	$0108,$0000,$010a,$0000
		dc.w	$0102,$0000,$0104,$0064
		dc.w	$0182,$07aa,$0180,$0000

		dc.w	$008e,$296b,$0090,$29db,$0092,$0038,$0094,$00d0
		dc.w	$ffff,$fffe

;------------------------------------------------------------------------------
;--- GRAFIK/SOUND BUFFER ------------------------------------------------------
;------------------------------------------------------------------------------

leersprite	dcb.l	3
screen1		dcb.b	screenbreite*256
screen2		dcb.b	screenbreite*256


mt_data		
	incdir	dh0:
	incbin	mod.test
ende
