;	MED - music editor by Teijo Kinnunen 1989, 1990
;	V2.00 screen updating assembler-routines
	xref	_soittimennum
	xref	_PaivitaSoittimennimi
	xref	_piirtorp
	xref	_wrp
	xref	_tmpA
	xref	_piirtobm
	xref	_GfxBase
	xref	_klevx
	xref	_nykyinenosio
	xref	_screen
	xref	_soittorivi
	xref	_soittolohko
	xref	_TulostaLohkoJaSoitin
	xref	_TulostaSoittoLohkot
	xref	_kursorix
	xref	_lohko
	xref	_topaz8		;fontti
	xref	_plane0ptr	;bittikartta
	xref	_firstdisptrk
	xref	_specialupd
	xref	_SpecialUpdate
	xref	_currtrk
	xref	_currpos
	xref	_editline
	xdef	_SeurSoitin
	xdef	_EdSoitin
	xdef	_Korosta
	xdef	_PaivitaNaytto
	xdef	_NaytaKursori
	code
_SeurSoitin:	;next instrument (by the way, this was my first useful
	move.w	_soittimennum,d0	;assembler routine!!!)
	cmp.w	#31,d0
	beq.b	poisss
	addq.w	#1,_soittimennum
paivss:	jsr	_PaivitaSoittimennimi(pc)
poisss:	rts
_EdSoitin:	;previous one
	move.w	_soittimennum,d0
	cmp.w	#1,d0
	beq.b	poisss
	subq.w	#1,_soittimennum
	bra.b	paivss
_NaytaKursori:	;show the cursor
	movem.l	d3-d4/a3/a6,-(sp)
	clr.l	d3
	move.w	_kursorix,d3		;d3 = kx
	clr.l	d4
	lea	_klevx,a0
	move.b	0(a0,d3.w),d4		;d4 = klevx[kx]
	lsl.w	#3,d3			;d3 = kx * 8
	addq.w	#4,d3			;d3 = absx = kx * 8 + 4
	add.w	d3,d4			;d4 = klevx[kx]+absx
	movea.l	_wrp,a1			;a1 = wrp
	movea.l	a1,a3			;a3 = wrp
	move.b	#4,24(a3)		;wrp->Mask = 4
	movea.l	_GfxBase,a6
	moveq.l	#2,d0
	jsr	-$162(a6)	; SetDrMd(wrp,COMPLEMENT);
	move.l	d3,d0
	movea.l	a3,a1
	move.l	#141,d1
	jsr	-$f0(a6)	; Move()
	movea.l	a3,a1
	move.l	d4,d0
	move.l	#141,d1
	jsr	-$f6(a6)	; Draw()
	movea.l	a3,a1
	move.l	d4,d0
	move.l	#131,d1
	jsr	-$f6(a6)	; Draw()
	movea.l	a3,a1
	move.l	d3,d0
	move.l	#131,d1
	jsr	-$f6(a6)	; Draw()
	movea.l a3,a1
	move.l	d3,d0
	move.l	#140,d1
	jsr	-$f6(a6)	; Draw()
	movea.l	a3,a1
	moveq.l	#1,d0
	jsr	-$162(a6)	; SetDrMd(wrp,JAM2);
	move.b	#$ff,24(a3)	; wrp->Mask = 0xff
	movem.l	(sp)+,d3-d4/a3/a6
	rts
_Korosta:	; a0 = gadgptr, d0 = tila *** Highlight gadgets!!!
	movem.l	d2-d4/a2/a6,-(sp)
	movea.l	a0,a2			;save Gadgptr
	move.w	d0,d4			;save state
	move.w	$26(a2),d1		;gg_GadgetID
	andi.w	#$0f00,d1
	lsr.w	#8,d1
	cmp.w	_nykyinenosio,d1
	bne.s	kloppu
	clr.b	d3
	move.w	$26(a2),d1		;gg_GadgetID
	btst	#12,d1			;already highlighted?
	beq.s	tstv2			;no..
	tst.w	d0			;is lighted, should I highlight??
	bne.s	kloppu			;yes, yes, it is highlighted
	bra.s	rev			;remove highlighting
tstv2:	tst.w	d0			;not highlighted, should I??
	beq.s	kloppu			;no..
rev:	movea.l	_wrp,a1
	move.b	#3,24(a1)		;wrp->Mask = 3 (no red!!!!!)
	movea.l	_GfxBase,a6
	moveq.l	#2,d0
	jsr	-$162(a6)		;SetDrMd(wrp,COMPLEMENT)
	move.w	4(a2),d0			;LeftEdge
	ext.l	d0
	move.w	6(a2),d1			;TopEdge
	ext.l	d1
	move.l	d0,d2
	move.l	d1,d3
	add.w	8(a2),d2			;Width
	subq.w	#1,d2
	add.w	10(a2),d3			;Height
	subq.w	#1,d3
	movea.l	_wrp,a1
	jsr	-$132(a6)		;RectFill()
	movea.l	_wrp,a1
	move.b	#$ff,24(a1)		;normal mask again
	moveq.l	#1,d0
	jsr	-$162(a6)		;SetDrMd(wrp,JAM2)
kloppu:	
	tst.w	d4
	beq.s	gfalse
	ori.w	#$1000,$26(a2)			;GadgetID
	bra.s	exitk
gfalse:
	andi.w	#$0fff,$26(a2)
exitk:	movem.l	(sp)+,d2-d4/a2/a6
	rts

_PaivitaNaytto:		;update screen
	movem.l	d2-d7/a2/a6,-(sp)
	move.w	_soittorivi,d7
	move.w	_soittolohko,d4		;don't bother with these cryptic
	movea.l	_GfxBase,a6		;comments below
	cmp.w	#63,d7			;if(srivi > 63) srivi = 63
	ble.s	lt64
	move.w	#63,d7
lt64:	move.w	d7,d3
	subq.w	#7,d3			;nykylin = srivi - 7
	move.w	d3,d5			;mennytylospain = nykylin - entylin
	sub.w	entylin(pc),d5
	move.w	d3,entylin
	cmp.w	entsolo(pc),d4
	bne.s	pruus
	cmp.w	#1,d0			;piirrauusi = TRUE
	beq.s	pruus
	cmp.w	#6,d5
	bgt.s	pruus
	cmp.w	#-6,d5
	bge.s	eipruus
pruus:	
	lea	_lohko,a0
	move.w	d4,d0
	lsl.w	#2,d0
	movea.l	0(a0,d0.w),a0
	clr.w	d0
	move.b	_firstdisptrk,d0
	cmp.b	(a0),d0			;firstdisptrk > lohko[xx].numtracks
	blt.s	no0fdt
	clr.b	_firstdisptrk
	move.w	_currpos,_currtrk
no0fdt:	moveq.l	#14,d6			;for(rivilaskin=0...
prl1:	move.l	d6,d0
	move.w	d7,d1
	move.w	d4,d2
	bsr	_PaivitaRivi
	dbf	d6,prl1
	jsr	_TulostaLohkoJaSoitin(pc)
	jsr	_TulostaSoittoLohkot(pc)
	bra	endpfl
eipruus:
	cmp.w	#1234,d0
	bne.s	eipk0
	move.b	#1,updedit
eipk0:	movem.l	a2/d2-d7,-(sp)
	lea	_piirtobm,a0
	moveq.l	#0,d0
	movea.l	a0,a1
	moveq.l	#0,d2
	move.l	#312,d4
	move.l	#$c0,d6
	moveq.l	#1,d7
	lea	_tmpA,a2
	tst.w	d5			;if(mennytylospain > 0)...
	ble.s	oktst2
	clr.l	d1
	move.w	d5,d1
	lsl.w	#3,d1
	moveq.l	#0,d3
	moveq.l	#120,d5		;siirretään 120 - 8 * mennytylöspäin pix.
	sub.w	d1,d5
	jsr	-$1e(a6)		;BltBitMap()
	bra.s	rf2
oktst2:	tst.w	d5			;if(mennytylospain < 0)...
	bge.s	rf2
	moveq.l	#0,d1
	neg.w	d5
	lsl.w	#3,d5
	move.w	d5,d3
	ext.l	d3
	moveq.l	#120,d5		;siirretään 120 - 8 * (-mennytylöspäin) pix
	sub.w	d3,d5
	jsr	-$1e(a6)
rf2:	movem.l	(sp)+,a2/d2-d7
	tst.b	updedit
	beq.s	eipk
	clr.b	updedit
	move.w	d4,d2
	move.w	d7,d1
	move.w	_editline,d0
	sub.w	d7,d0
	addq.w	#7,d0
	bmi.s	eipk
	cmp.b	#14,d0
	bgt.s	eipk
	bsr.s	_PaivitaRivi
eipk:	tst.w	d5
	ble.s	alle0			;if(mennytylospain > 0):
	move.w	d5,d6
	subq.w	#1,d6
	move.w	d4,d2
loop2:	moveq.l	#14,d0
	sub.w	d6,d0
	move.w	d7,d1
	bsr.s	_PaivitaRivi
	dbf	d6,loop2
	bra.s	endpfl
alle0:	tst.w	d5
	bge.s	endpfl
	clr.l	d0
	move.w	d5,d6
	not.w	d6	;sama kuin neg.w d6, subq.w #1,d6
	move.w	d4,d2
loop3:	move.w	d6,d0
	move.w	d7,d1
	bsr.s	_PaivitaRivi
	dbf	d6,loop3
endpfl:	move.w	d4,entsolo
	lea	_piirtobm,a0
	clr.l	d0
	clr.l	d1
	movea.l	_screen,a1
	lea	$b8(a1),a1
	moveq.l	#4,d2
	moveq.l	#77,d3
	move.l	#312,d4
	moveq.l	#120,d5
	move.l	#$c0,d6
	moveq.l	#1,d7
	movea.l	#0,a2
	jsr	-$1e(a6)			;BltBitMap()
	tst.b	_specialupd
	beq.s	noupd
	jsr	_SpecialUpdate(pc)
noupd:	movem.l	(sp)+,d2-d7/a2/a6
	rts
entylin:	dc.w 0
entsolo:	dc.w 0
updedit:	dc.w 0
_PaivitaRivi:	;d0 = rivin numero (0-14), d1 = soit. rivi ja d2 = lohko
	movem.l	d2-d7/a2-a3,-(sp)	;update line
	moveq.l	#0,d7	;I was so lazy that I didn't translate the comments
	move.w	d0,d7
	subq.w	#7,d7
	add.w	d1,d7	;relsr(d7) = srivi + (num - 7)
	tst.w	d7
	blt.s	blnk
	cmp.w	#63,d7
	ble.s	noblnk
blnk:	move.w	d0,d6
	jsr	-$e4(a6)	;WaitBlit() tehdään vasta nyt
	movea.l	_plane0ptr,a0
	mulu.w	#320,d6		;alkuosoite
	adda.l	d6,a0
	moveq.l	#79,d0		;80 pitkää sanaa = 320 tavua
clrlp:	clr.l	(a0)+
	dbf	d0,clrlp
	movem.l	(sp)+,d2-d7/a2-a3	;ja pois....
	rts
noblnk:	move.l	d7,d5
	divu	#10,d5
	add.b	#'0',d5
	move.b	d5,txt40
	swap	d5
	add.b	#'0',d5
	move.b	d5,txt40+1	;kokoa numero
	lea	_lohko,a2	;a2 = 1. lohkon osoite
	lsl.w	#2,d2
	movea.l	0(a2,d2.w),a2	;lohkon osoite taulukosta
	clr.w	d4
	move.b	(a2),d4		;otetaan raitojen määrä
	addq.l	#4,a2		;ohitetaan tulevaisuus....a2 = nyk.lohko
	mulu	#3,d4		;yhden rivin pituus
	mulu	d4,d7		;kerrottuna nykyisellä rivinumerolla
	adda.l	d7,a2		;a2 = nyk. rivin alkuosoite
	clr.w	d4
	move.b	_firstdisptrk,d4
	mulu	#3,d4
	adda.l	d4,a2		;vihdoin a2 = nyk. nuotin alkuosoite
	clr.b	d6		;raitacnt
	lea	txt40+4,a3	;mihin seur. mrk.
rloop:	clr.b	d1		;ei ylempi soitin (vielä)
	move.b	(a2)+,d4	;d4 = numero
	move.b	(a2)+,d3	;d3 = extra (1. tavu)
	lsl.w	#8,d3
	move.b	(a2)+,d3	;(2. tavu)
	tst.b	d4
	beq.s	noper		;jos periodi = 0...
	btst	#7,d4
	beq.s	eiyls		;ei soitin G-V
	bclr	#7,d4
	move.b	#16,d1		;ylempi soitin
	tst.b	d4		;jos nuottia ei jääkään jäljelle
	beq.s	noper
eiyls:	clr.l	d5
	move.b	d4,d5
	subq.b	#1,d5
	lea	namet(pc),a1
	lsl.l	#2,d5
	adda.l	d5,a1		;nimen osoite
	move.b	(a1),(a3)
	move.b	1(a1),1(a3)
	move.b	2(a1),2(a3)	;kopsataan nimi
	bra.s	dspxtr
noper:	move.b	#'-',(a3)	;ei nimeä
	move.b	#'-',1(a3)
	move.b	#'-',2(a3)	;3 viivaa
dspxtr:	lea	hexat(pc),a1
	move.w	d3,d5		;d5:een käsiteltäväksi
	lsr.w	#8,d5
	lsr.w	#4,d5
	add.b	d1,d5
	move.b	0(a1,d5.w),4(a3)	;1. luku - lisätään koska ylsoitin on jo.
	move.w	d3,d5
	lsr.w	#8,d5
	andi.w	#$000f,d5
	move.b	0(a1,d5.w),5(a3)	;2. luku
	move.w	d3,d5
	lsr.w	#4,d5
	andi.w	#$000f,d5
	move.b	0(a1,d5.w),6(a3)	;3. luku
	andi.w	#$000f,d3	;extraa ei enää tartte
	move.b	0(a1,d3.w),7(a3)
	adda.l	#9,a3
	addq.b	#1,d6
	cmp.b	#4,d6		;joka raita!!!
	blt	rloop
	lea	txt40(pc),a2	;a2 = tekstin alku
	move.w	d0,d6		;rivin numero dkuuteen
	jsr	-$e4(a6)	;WaitBlit() tehdään vasta nyt
dsptxt:	;****************************************************************
	;****  This is the super-fast text rendering routine !!!!!!  ****
	;****************************************************************
		mulu.w	#320,d6		;alkuosoite
		movea.l	_plane0ptr,a0	;bitmapin alku
		adda.l	d6,a0
		clr.w	d2
		clr.l	d7
		movea.l	_topaz8,a1
		move.w	38(a1),d7	;Modulo -> d7
		move.b	32(a1),d0	;tf_LoChar -> d0
		moveq.l	#38,d1
charloop:	move.b	(a2)+,d2
		cmp.b	#' ',d2
		beq.s	nextchar
		sub.b	d0,d2		;tf_LoChar pois
		movea.l	34(a1),a3	;tf_CharData
		moveq.l	#7,d5
		move.b	0(a3,d2.w),(a0)
		adda.l	d7,a3		;tf_Modulo lisätään
		move.b	0(a3,d2.w),40(a0)
		adda.l	d7,a3
		move.b	0(a3,d2.w),80(a0)
		adda.l	d7,a3
		move.b	0(a3,d2.w),120(a0)
		adda.l	d7,a3
		move.b	0(a3,d2.w),160(a0)
		adda.l	d7,a3
		move.b	0(a3,d2.w),200(a0)
		adda.l	d7,a3
		move.b	0(a3,d2.w),240(a0)
		adda.l	d7,a3
		move.b	0(a3,d2.w),280(a0)
nextchar:	addq.l	#1,a0
		dbf	d1,charloop
	;****  Ends here...quite short, isn't it?? **********************
	movem.l	(sp)+,d2-d7/a2-a3
	rts			; huh huh !!!
txt40:	dc.b	'                                        '
spc40:	dc.b	'                                        '
hexat:	dc.b	'0123456789ABCDEFGHIJKLMNOPQRSTUV'
namet:	dc.b	'C-1 C#1 D-1 D#1 E-1 F-1 F#1 G-1 G#1 A-1 A#1 H-1 '
	dc.b	'C-2 C#2 D-2 D#2 E-2 F-2 F#2 G-2 G#2 A-2 A#2 H-2 '
	dc.b	'C-3 C#3 D-3 D#3 E-3 F-3 F#3 G-3 G#3 A-3 A#3 H-3 '
	dc.b	'C-4 C#4 D-4 D#4 E-4 F-4 F#4 G-4 G#4 A-4 A#4 H-4 '
	dc.b	'C-5 C#5 D-5 D#5 E-5 F-5 F#5 G-5 G#5 A-5 A#5 H-5 '
	dc.b	'C-6 C#6 D-6 '
	end
