TRACKERS MB SRC EN MOONBLAS

From MSX MUSIC WIKI
Jump to: navigation, search
*u+,q-
	db	0feh
	dw	08000h
	dw	einde+04000h
	dw	08000h
	org	04000h


;Dos program?

dosprog	equ	1 = 0	;false

;Graphic program?

grpprog	equ	1 = 1	;true

	include mybios.gen

xpos	equ 08000h	;->in song only 200 long!
xleng	equ xpos+200	;->last position.
xuser1	equ xleng+1	;->user code # 1.
xmmvoc	equ xuser1+2	;->module instruments.
xmmsti	equ xmmvoc+16*9	;->instrument module.
xpasti	equ xmmsti+16	;->instruments / volumes pac.
xstpr	equ xpasti+32	;->stereo settings.
xtempo	equ xstpr+10	;->starting pace.
xsust	equ xtempo+1	;->modulation depth.
xnaam	equ xsust+1	;->song name.
xchip	equ xnaam+40	;->preferred chip.
xbegvm	equ xchip+1	;->initial instrument module.
xbegvp	equ xbegvm+9	;->initial instruments pac.
xorgp1	equ xbegvp+9	;->data from software voices pac.
xorgnr	equ xorgp1+6*8	;->numbers of software voices.
xsmpkt	equ xorgnr+6	;->sample kit name.
xdrblk	equ xsmpkt+8	;->pac drum blocks.
xdrvol	equ xdrblk+15	;->volumes drum pac.
xdrfrq	equ xdrvol+3	;->frequencies drum pac.
xuser2	equ xdrfrq+3*6	;->user code # 2 (= 1 on with other codes).
xrever	equ xuser2+2	;->reverb settings.
xloop	equ xrever+9	;->loop position.

xbegmd	equ 08240h
ownvdt	equ 0c400h+176*25
smpnr	equ 0f975h
loaded	equ 0f976h
notvcm	equ 0f977h
notvcp	equ 0f977h+9
smpadr	equ notvcp+9
smknam	equ smpadr+56
vcenr	equ smknam+8
fkndat	equ vcenr+1
keybdt	equ fkndat+1
midint	equ keybdt+1	;0=musmod   1=turbo-r   2=vak
usrdat	equ midint+1
us2dat	equ usrdat+2
naudat	equ us2dat+2
scandt	equ naudat+1

sngpag	equ	1
edtpag	equ	2
dskpag	equ	3
em1pag	equ	4
em2pag	equ	5
vocpag	equ	6
smppag	equ	7
subs	equ	0d900h
subs2	equ	0d914h
subs3	equ	0d928h
decdat	equ	0c000h

prive	equ	1=0
msx2sim	equ	1=0


start:

	call	init	;initialization
stmb:	call	setset

main:	call	mainl
	ld	ix,(jpadr)
	jp	(ix)

mainl:
	call	getkey

	IF	PRIVE

	ld	b,44		;aantal keuzes
	ELSE
	ld	b,42
	ENDIF

	ld	ix,maindt
mainl3:	cp	(ix+0)
	jr	z,mainl2
	inc	ix
	inc	ix
	inc	ix
	djnz	mainl3
	jp	inpnot

mainl2:	ld	e,(ix+1)
	ld	d,(ix+2)
	push	de
	pop	ix
	jp	(ix)

main2:	call	main2l
	ld	ix,(jpadr)
	jp	(ix)

main2l:	call	getkey

	IF	PRIVE
	ld	b,40		;number of choices
	ELSE
	ld	b,38
	ENDIF

	ld	ix,maind2
main23:	cp	(ix+0)
	jr	z,mainl2
	inc	ix
	inc	ix
	inc	ix
	djnz	main23
	jp	pronot



;--- initialisatie van programma ---

init:	ld	hl,nontxt	;drumkit name NONE
	ld	de,smknam
	ld	bc,8
	ldir
	in	a,(0aah)
	and	01000000b
	ld	(lasaa),a

	ld	hl,edtvoc	;data for note audition instruments
	ld	de,notvcm
	ld	bc,18
	ldir
	ld	hl,smpadd	;default sample adress
	ld	de,smpadr
	ld	bc,56
	ldir
	ld	hl,1
	ld	(loaded-1),hl
	call	setfkeys	;set function keys
	call	ramsv3	;write settings to ramdisk-2
	call	resall	;empty music and set positions
	call	ramsv2	;write to ramdisk
	call	pospat	;position 0 in pattern 0

	IF	PRIVE
	ld	a,1
	ld	(scandt),a
	ENDIF

	ld	a,(02dh)	;turbo?
	cp	3
	IF	MSX2SIM
	ret
	ELSE
	ret	c
	ENDIF

	ld	hl,03d3dh
	ld	(trbpsg),hl
	ld	hl,parout	;turbo-r outs, otherwise too fast!
	ld	de,mmrout
	ld	bc,parout
	ld	ix,mmrout
	ld	(pacout+1),hl
	ld	(fpcout+1),bc
	ld	(mmout+1),de
	ld	(fmmout+1),ix
	jp	 r800d



;--- set settings

setset:	call	setint
	ld	a,0f0h
	ld	c,16
	call	fmmout
	ld	a,051h
	inc	c
	call	fmmout
	ld	a,255
	inc	c
	call	fmmout

	ld	a,(loaded)
	rra
	call	c,resadd
	call	makscr
	ld	a,(lasaa)
	or	a
	call	z,prtoct
	ld	hl,0506h
	ld	(0f3dch),hl
	jp	pospax


;--- octave up / down for pro-editing

eoctu:	ld	a,(octave)
	inc	a
	cp	7
	ret	z
	ld	(octave),a
	jp	prtoct

eoctd:	ld	a,(octave)
	or	a
	ret	z
	dec	a
	ld	(octave),a
	jp	prtoct

pronot:	ex	af,af'            ;enter protracker note
	ld	a,(0f3ddh)
	cp	41
	jr	nc,proend
	ex	af,af'
	ld	ix,prodat
	ld	b,24
pronol:	cp	(ix+0)
	jr	z,prono2
	inc	ix
	djnz	pronol
	ret
proend:	ex	af,af'
	ret
prono2:	ld	a,25
	sub	b
	cp	10
	jp	z,prono4
	cp	13
	jp	z,prono5
prono6:	sub	12
	ex	af,af'
	ld	a,(octave)
	ld	b,a
	inc	b
	ex	af,af'
prono3:	add	a,12
	djnz	prono3	;good note value
	ld	(tnot),a
	ex	af,af'
	ld	a,16
	ld	(notval),a
	ex	af,af'
	ld	(hl),a
	call	makpat
	jp	curdow
prono4:	ld	b,a
	ld	a,(02ch)
	and	01111b
	cp	4
	ld	a,b
	jp	nz,prono6
	ld	a,13
	jp	prono6
prono5:	ld	b,a
	ld	a,(02ch)
	and	01111b
	cp	4
	ld	a,b
	jp	nz,prono6
	ld	a,10
	jp	prono6


resadd:	xor	a
	ld	(loaded),a
	ld	(pos),a
	jp	pospat


;*** input last input ***

lasinp:	call	ctrl
	jp	z,mod_depth
	ld	a,(0f3ddh)
	cp	38
	jr	nc,lasin2
	ld	a,(lasnot)
	cp	97
	call	c,lasin6
lasinn:	ld	(hl),a
	jp	curmakpts

lasin6:	or	a
	ret	z
	ld	(tnot),a
	ex	af,af'
	ld	a,16
	ld	(notval),a
	ex	af,af'
	ret

lasin2:	cp	41
	jr	nz,lasin3
	ld	a,(lasno2)
	jr	lasinn

lasin3:	cp	45
	jr	nz,lasin4
	ld	a,(lasno3)
	jr	lasinn

lasin4:	cp	49
	jr	nz,lasin5
	ld	a,(lasno4)
	jp	inpdr5

lasin5:	cp	53
	jr	nz,lasin7
	ld	a,(lasno5)
	jp	inpdr6
lasin7:	cp	57
	ret	nz
	ld	a,(lasno6)
	jp	inpeo2





;--------------------------------------
;-            Blok functions          -
;--------------------------------------



;**** name block ****

remblk:	ld	de,0
	ld	(begblp),de
	ld	(begblx),de
	ld	(begbly),de
	jp	makpat

inblk:	ld	a,(pat)
	inc	a
	ld	b,a
	ld	a,(begblp)
	cp	b
	jp	nc,noinbl	;falls outside of pattern
	ld	a,(endblp)
	dec	b
	cp	b
	jp	c,noinbl	;falls outside of pattern
	ld	a,(0f3dch)
	sub	5
	ld	e,a	;y
	call	srlf3dd
	ld	d,a	;x

	ld	a,(begblp)
	cp	b
	jr	z,inblk1	;within startpattern
	ld	a,(endblp)
	cp	b
	jr	z,inblk2	;within endpattern
	jr	inblk4

inblk1:	ld	a,(endblp)
	cp	b
	jr	z,inblk3
	ld	a,(begbly)
	dec	a
	cp	e
	jr	nc,noinbl
inblk4:	ld	a,(begblx)
	dec	a
	cp	d
	jr	nc,noinbl
	ld	a,(endblx)
	cp	d
	jr	c,noinbl
	xor	a
	ret

inblk2:	ld	a,(endbly)
	cp	e
	jr	c,noinbl
	jr	inblk4

inblk3:	ld	a,(begbly)
	dec	a
	cp	e
	jr	nc,noinbl
	ld	a,(endbly)
	cp	e
	jr	c,noinbl
	jr	inblk4

noinbl:	xor	a
	dec	a
	ret


srlf3dd:	ld	a,(0f3ddh)
	dec	a
	srl	a
	srl	a
	ret


begblk:	ld	de,0
	ld	(begblp),de
	ld	(begblx),de
	ld	(begbly),de
	push	hl
	ld	a,(pat)
	ld	(begblp),a
	ld	(endblp),a
	ld	a,(0f3dch)
	sub	5
	ld	(begbly),a
	ld	(endbly),a
	call	srlf3dd
	ld	(begblx),a
	ld	(endblx),a
	call	makpat
	pop	hl
	ret

endblk:	ld	a,(begblp)
	or	a
	ret	z
	ld	b,a
	ld	a,(pat)
	cp	b
	ret	c
	jr	nz,endbl2
	ld	a,(begbly)
	ld	b,a
	ld	a,(0f3dch)
	sub	5
	cp	b
	ret	c
endbl2:	ld	a,(begblx)
	ld	b,a
	call	srlf3dd
	cp	b
	ret	c
	push	hl
	ld	a,(pat)
	ld	(endblp),a
	ld	a,(0f3dch)
	sub	5
	ld	(endbly),a
	call	srlf3dd
	ld	(endblx),a
	call	makpat
delble:	pop	hl
	ret


;---- delete a block ----

delblk:	push	hl
	ld	hl,delwrd
	call	printt
	ld	hl,surtxt
	call	decrc
	call	getkey
	push	af
	call	clrlin
	pop	af
	res	5,a
	cp	"Y"
	jr	nz,delble
	call	ybllen

	ld	a,(txco)
	ld	(txco2),a
delbl3:	push	de
	push	hl
	push	bc
delbl2:	ld	a,(txco)
	cp	12
	jr	z,delbl4
	cp	13
	jr	z,delbl5
	ld	(hl),0
delbl7:	inc	hl
delbl6:	inc	a
	ld	(txco),a
	djnz	delbl2
	pop	bc
	pop	hl
	ld	de,13
	add	hl,de
	pop	de
	ld	a,(txco2)
	ld	(txco),a
	dec	de
	ld	a,e
	or	d
	jr	nz,delbl3
	pop	hl
	jp	makpat

delbl4:	ld	a,(hl)
	and	01111b
	ld	(hl),a
	jr	delbl6
delbl5:	ld	a,(hl)
	and	011110000b
	ld	(hl),a
	jr	delbl7

;---- copying a block ----

copblk:	push	hl
	push	hl
	pop	ix
	ld	hl,copwrd
	call	printt
	ld	hl,surtxt
	call	decrc
	call	getkey
	push	af
	call	clrlin
	pop	af
	res	5,a
	cp	"Y"
	jp	nz,delble

chkrng:	call	ybllen	      ;check range!!
	push	de
	ld	a,(pat)
	ld	b,a
	ld	hl,-16-1
	ld	de,16
chkrn2:	add	hl,de
	djnz	chkrn2
	ld	a,(0f3dch)
	sub	6
	ld	e,a
	ld	d,0
	add	hl,de
	pop	de

	add	hl,de
	ld	de,1216
	rst	020h
	jp	nc,copblr	;error -> too far!

	ld	a,(begblx)
	ld	b,a
	ld	a,(endblx)
	cp	10
	jr	nc,copbl_3
	sub	b
	ld	b,a
	call	srlf3dd
	add	a,b
	cp	10
	jp	c,copbl_1	;error
	sub	b
copbl_2:
	ld	b,a
	ld	a,(begblx)
	cp	b
	jp	nz,copblr
	jr	copbl_1

copbl_3:	call	srlf3dd
	jr	copbl_2

copbl_1:
	ld	a,(begblp)	;copy forwards or backwards
	ld	b,a
	ld	a,(pat)
	cp	b
	jp	nc,copblx

copblw:	call	ybllen

	ld	a,(txco)
	ld	(txco2),a
copbl3:	push	de
	push	ix
	push	hl
	push	bc
copbl2:	ld	a,(txco)
	push	af
	cp	12
	jr	z,copbl4
	cp	13
	jr	z,copbl5
	ld	a,(hl)
	ld	(ix+0),a
copbl7:	inc	hl
	inc	ix
copbl6:	pop	af
	inc	a
	ld	(txco),a
	djnz	copbl2
	pop	bc
	pop	hl
	ld	de,13
	add	hl,de
	pop	ix
	add	ix,de
	pop	de
	ld	a,(txco2)
	ld	(txco),a
	dec	de
	ld	a,e
	or	d
	jr	nz,copbl3
	pop	hl
	jp	makpat

copbl4:	ld	a,(hl)
	and	011110000b
	ld	e,a
	ld	a,(ix+0)
	and	01111b
	or	e
	ld	(ix+0),a
	jr	copbl6
copbl5:	ld	a,(hl)
	and	01111b
	ld	e,a
	ld	a,(ix+0)
	and	011110000b
	or	e
	ld	(ix+0),a
	jr	copbl7


copblx:	jp	nz,copbly
	ld	a,(begbly)
	ld	b,a
	ld	a,(0f3dch)
	sub	5
	cp	b
	jp	c,copblw
	jr	nz,copbly
	ld	a,(begblx)
	ld	b,a
	call	srlf3dd
	cp	b
	jp	c,copblw

copbly:	call	ybllen

	push	bc
	push	de
	ld	a,(begblx)
	cp	13
	jr	nc,copblm
	ld	a,(endblx)
	cp	13	;was 14!
	jr	c,copblm
	dec	b
copblm:	dec	b
	ld	e,b
	ld	d,0
	add	ix,de
	add	hl,de
	pop	bc
	push	bc
	dec	bc
	ld	de,13
copblz:	add	ix,de
	add	hl,de
	dec	bc
	ld	a,b
	or	c
	jr	nz,copblz

	pop	de
	pop	bc

	ld	a,(endblx)
	ld	(txco),a
	ld	a,(txco)
	ld	(txco2),a
copblc:	push	de
	push	ix
	push	hl
	push	bc
copblb:	ld	a,(txco)
	push	af
	cp	12
	jr	z,copbld
	cp	13
	jr	z,copble
	ld	a,(hl)
	ld	(ix+0),a
copblf:	dec	hl
	dec	ix
copblg:	pop	af
	dec	a
	ld	(txco),a
	djnz	copblb
	pop	bc
	pop	hl
	ld	de,-13
	add	hl,de
	pop	ix
	add	ix,de
	pop	de
	ld	a,(txco2)
	ld	(txco),a
	dec	de
	ld	a,e
	or	d
	jr	nz,copblc
	pop	hl
	jp	makpat

copbld:	ld	a,(hl)
	and	011110000b
	ld	e,a
	ld	a,(ix+0)
	and	01111b
	or	e
	ld	(ix+0),a
	jr	copblf
copble:	ld	a,(hl)
	and	01111b
	ld	e,a
	ld	a,(ix+0)
	and	011110000b
	or	e
	ld	(ix+0),a
	jr	copblg

copblr:
	ld	hl,nptxt
	call	prtgetkey
	call	clrlin
	pop	hl
	ret





;---- exchange block ----

chnblk:	push	hl
	ld	hl,excwrd
	call	printt
	ld	hl,surtxt
	call	decrc
	call	getkey
	push	af
	call	clrlin
	pop	af
	res	5,a
	cp	"Y"
	jp	nz,delble
	ld	a,(begblx)
	ld	b,a
	ld	a,(endblx)
	cp	b
	jp	nz,copblr
	ld	a,(begblx)
	cp	10
	jp	nc,copblr
	ld	a,(0f3ddh)
	cp	41
	jp	nc,copblr

	call	ybllen

	push	hl
	push	de
	ld	a,(txco)
	neg
	ld	e,a
	ld	d,0ffh
	add	hl,de
	call	srlf3dd
	ld	e,a
	ld	d,0
	add	hl,de
	push	hl
	pop	ix
	pop	de
	pop	hl

chnbl3:	push	de
	push	ix
	push	hl
	push	bc
chnbl2:	ld	d,(hl)
	ld	a,(ix+0)
	ld	(ix+0),d
	ld	(hl),a
chnbl7:	inc	hl
	inc	ix
	djnz	chnbl2
	pop	bc
	pop	hl
	pop	ix
	ld	de,13
	add	hl,de
	add	ix,de
	pop	de
	dec	de
	ld	a,e
	or	d
	jr	nz,chnbl3
	pop	hl
	jp	makpat




ybllen:	ld	a,(begblp)	;de= number of y rows
	ld	b,a	;b = number of x rows
	ld	a,(endblp)	;hl= begin adress blok
	sub	b
	inc	a
	ld	b,a
	ld	de,16
	ld	hl,-16
yblle2:	add	hl,de
	djnz	yblle2
	ld	a,(begbly)
	ld	b,a
	ld	a,(endbly)
	sub	b
	ld	e,a
	ld	d,0
	bit	7,e
	jr	z,yblle3
	ld	d,0ffh
yblle3:	add	hl,de
	ex	de,hl
	push	de

	ld	hl,xbegmd-16*13-13-1
	ld	de,16*13
	ld	a,(begblp)
	ld	b,a
yblle4:	add	hl,de
	djnz	yblle4
	ld	de,13
	ld	a,(begbly)
	ld	b,a
yblle5:	add	hl,de
	djnz	yblle5
	ld	a,(begblx)
	cp	13
	jr	c,yblle6
	dec	a
yblle6:	ld	e,a
	add	hl,de
	pop	de
	inc	de

	ld	a,(begblx)
	ld	(txco),a
	ld	b,a
	ld	a,(endblx)
	sub	b
	inc	a
	ld	b,a
	ret


ndblk:	push	hl
	ld	a,2
	ld	(bchkvl),a
	ld	a,97
	ld	(bchkv2),a
	call	blkchh
	jp	c,copblr
	ld	a,-1
	ld	(bchkvl),a
	jr	ndbl_4
	ret

odblk:	push	hl
	ld	a,13
	ld	(bchkvl),a
	ld	a,97
	ld	(bchkv2),a
	call	blkchh
	jp	c,copblr
	ld	a,-12
	ld	(bchkvl),a
	jr	ndbl_4

nublk:	push	hl
	ld	a,1
	ld	(bchkvl),a
	ld	a,96
	ld	(bchkv2),a
	call	blkchh
	jp	c,copblr
	ld	a,1
	ld	(bchkvl),a
	jr	ndbl_4

oublk:	push	hl
	ld	a,1
	ld	(bchkvl),a
	ld	a,85
	ld	(bchkv2),a
	call	blkchh
	jp	c,copblr
	ld	a,12
	ld	(bchkvl),a

ndbl_4:	call	ybllen
ndbl_3:	push	de
	push	hl
	push	bc
ndbl_2:	ld	a,(bchkvl)
	ld	e,a
	ld	a,(hl)
	or	a
	jr	z,ndbl_5
	cp	97
	jr	nc,ndbl_5
	add	a,e
	ld	(hl),a
ndbl_5:	inc	hl
	djnz	ndbl_2
	pop	bc
	pop	hl
	ld	de,13
	add	hl,de
	pop	de
	dec	de
	ld	a,e
	or	d
	jr	nz,ndbl_3
	pop	hl
	jp	makpat

blkchh:
	ld	a,(endblx)
	cp	10
	jr	nc,blkch9
	call	ybllen
blkch1:	push	de
	push	hl
	push	bc
blkch2:	ld	a,(bchkvl)
	ld	e,a
	ld	a,(bchkv2)
	ld	d,a
	ld	a,(hl)
	or	a
	jr	z,blkch7
	cp	97
	jr	nc,blkch7
	cp	e
	jr	c,blkch3
	cp	d
	jr	nc,blkch3
blkch7:	inc	hl
	djnz	blkch2
	pop	bc
	pop	hl
	ld	de,13
	add	hl,de
	pop	de
	dec	de
	ld	a,e
	or	d
	jr	nz,blkch1
	xor	a
	ret
blkch3:	pop	bc
	pop	hl
	pop	de
	scf
	ret
blkch9:	scf
	ret





;-----------------------------------
;-         cursor control          -
;-----------------------------------



;*** cursor right ***

curri:	call	tabtoets
	jp	z,posri
	call	ctrl
	jp	z,patri
	call	shift
	jp	z,lenri
	ld	a,(0f3ddh)
	cp	49
	jr	z,curri3
	inc	hl
curri3:	add	a,4
	cp	61
	jr	nz,curri2
	ld	a,5
	ld	bc,-13
	add	hl,bc
curri2:	ld	(0f3ddh),a
	ret

;*** cursor left ***

curlef:	call	tabtoets
	jp	z,poslef
	call	ctrl
	jp	z,patlef
	call	shift
	jp	z,lenlef
	ld	a,(0f3ddh)
	cp	53
	jr	z,curle3
	dec	hl
curle3:	sub	4
	cp	1
	jr	nz,curle2
	ld	bc,13
	add	hl,bc
	ld	a,57
curle2:	ld	(0f3ddh),a
	ret

;*** cursor up ***

curup:	call	tabtoets
	jp	z,posup
	call	ctrl
	jp	z,patup
	call	shift
	jp	z,lenup
	ld	a,(0f3dch)
	ld	bc,-13
	add	hl,bc
	dec	a
	cp	5
	jr	nz,curup2
	ld	bc,16*13
	add	hl,bc
	ld	a,21
curup2:	ld	(0f3dch),a
	ret

;*** cursor down ***

curmakpts:	call	makpts
curdow:	call	tabtoets
	jp	z,posdow
	call	ctrl
	jp	z,patdow
	call	shift
	jp	z,lendow
	ld	a,(0f3dch)
	ld	bc,13
	add	hl,bc
	inc	a
	cp	22
	jr	nz,curdo2
	ld	bc,-13*16
	add	hl,bc
	ld	a,6
curdo2:	ld	(0f3dch),a
	ret

; *** tab key ***

curtab:	call	tabtoets
	jp	nz,info
	call	clef
	jp	z,poslef
	call	cri
	jp	z,posri
	call	cup
	jp	z,posup
	call	cdow
	jp	z,posdow
	ret

; *** pattern further ***

patri:	ld	a,(pat)
	cp	76
	ret	z
	inc	a
	ld	(pat),a
	ld	bc,208
	add	hl,bc
	call	makpat
	jp	prtpat

; *** pattern back ***

patlef:	ld	a,(pat)
	cp	1
	ret	z
	dec	a
	ld	(pat),a
	ld	bc,-208
	add	hl,bc
	call	makpat
	jp	prtpat

; *** 4 patterns further ***

patup:	ld	a,(pat)
	cp	76
	jr	z,patup2
	cp	73
	jr	nc,maxpat
	add	a,4
	ld	(pat),a
	ld	bc,4*208
	add	hl,bc
patup2:	call	makpat
	jp	prtpat

maxpat:	ld	b,a
	ld	a,76
	ld	(pat),a
	sub	b
	ld	b,a
	ld	de,208
maxpl:	add	hl,de
	djnz	maxpl
	jr	patup2

; *** 4 patterns back ***

patdow:	ld	a,(pat)
	cp	1
	jr	z,patdo2
	cp	5
	jr	c,minpat
	sub	4
	ld	(pat),a
	ld	bc,-4*208
	add	hl,bc
patdo2:	call	makpat
	jp	prtpat

minpat:	dec	a
	ld	b,a
	ld	a,1
	ld	(pat),a
	ld	de,-208
minpl:	add	hl,de
	djnz	minpl
	jr	patdo2


; *** position further ***

posri:	ld	a,(pos)
	cp	199
	jr	z,posri2
	inc	a
	ld	(pos),a
posri2:	call	prtpos
	jp	pospat



; *** position back ***

poslef:	ld	a,(pos)
	or	a
	jr	z,posle2
	dec	a
	ld	(pos),a
posle2:	call	prtpos
	jp	pospat

; *** 4 positions further ***

posup:	ld	a,(pos)
	cp	195
	call	nc,maxpos
	add	a,4
	ld	(pos),a
	call	prtpos
	jp	pospat
maxpos:	ld	a,195
	ret

; *** 4 positions back ***

posdow:	ld	a,(pos)
	cp	4
	call	c,minpos
	sub	4
	ld	(pos),a
	call	prtpos
	jp	pospat
minpos:	ld	a,4
	ret


; *** insert position ***

inspos:	push	hl
	ld	a,(pos)
	ld	c,a
	ld	a,(xleng)
	inc	a
	cp	c
	jr	c,inspoe
	ld	hl,08000h
	ld	b,0
	add	hl,bc
	push	hl

	ld	a,199
	sub	c

	ld	c,a
	ld	hl,08000h+198
	ld	de,08000h+199
	lddr
	pop	hl
	ld	a,(pat)
	ld	(hl),a
	ld	a,(xleng)
	cp	199
	jr	z,inspo2
	inc	a
	ld	(xleng),a

inspo2:	call	prtlen
	call	prtpos
	call	pospat
	ld	a,(posmen)
	or	a
	jr	nz,inspoe
	ld	hl,paintx
	call	prtgetkey
	call	clrlin
inspoe:	pop	hl
	ret

; *** delete position ***

delpos:	push	hl
	ld	a,(pos)
	ld	c,a
	ld	a,(xleng)
	cp	c
	jr	c,inspoe
	ld	hl,08000h
	ld	b,0
	add	hl,bc
	push	hl

	ld	a,200
	sub	c

	ld	c,a
	pop	de
	inc	hl
	ldir
	ld	a,1
	ld	(08000h+199),a
	ld	a,(xleng)
	dec	a
	cp	255
	jr	z,delpo2
	ld	(xleng),a

delpo2:	call	prtlen
	call	prtpos
	call	pospat
	ld	a,(posmen)
	or	a
	jr	nz,delpo3
	ld	hl,padltx
	call	prtgetkey
	call	clrlin
delpo3:	pop	hl
	ret

addpos:	push	hl
	ld	a,(xleng)
	cp	199
	jr	z,addps2
	inc	a
	ld	e,a
	ld	d,0
	ld	(xleng),a
	ld	hl,xpos
	add	hl,de
	ld	a,(pat)
	ld	(hl),a
	call	prtlen
addps2:	pop	hl
	ret


;--- find the correct pattern for the position ---

pospat:	ld	a,(posmen)
	or	a
	ld	hl,0506h
	call	z,0c6h
	ld	a,(pos)
	ld	c,a
	ld	b,0
	ld	hl,xpos
	add	hl,bc
	ld	a,(hl)
	ld	(pat),a
	ld	a,(posmen)
	or	a
	call	z,makpat
	call	prtpat

pospax:	ld	hl,xbegmd-208
	ld	de,208
	ld	a,(pat)
	ld	b,a
pospa2:	add	hl,de
	djnz	pospa2
	ret

; *** lengte verder ***

lenri:	ld	a,(xleng)
	cp	199
	ret	z
	inc	a
	ld	(xleng),a
	jp	prtlen

; *** length further ***

lenlef:	ld	a,(xleng)
	or	a
	ret	z
	dec	a
	ld	(xleng),a
	jp	prtlen

; *** 4 lengths further ***

lenup:	ld	a,(xleng)
	cp	195
	call	nc,maxlen
	add	a,4
	ld	(xleng),a
	jp	prtlen
maxlen:	ld	a,195
	ret

; *** 4 lengths back ***

lendow:	ld	a,(xleng)
	cp	4
	call	c,minlen
	sub	4
	ld	(xleng),a
	jp	prtlen
minlen:	ld	a,4
	ret


; *** set position ***

setpos:	call	ctrl
	ret	nz
	push	hl
	ld	a,(pos)
	ld	c,a
	ld	b,0
	ld	hl,xpos
	add	hl,bc
	ld	a,(pat)
	ld	(hl),a
	ld	a,(pos)
	ld	b,a
	ld	a,(xleng)
	cp	b
	jr	nc,setpo2
	ld	a,b
	ld	(xleng),a
	call	prtlen
setpo2:	ld	hl,papotx
	call	prtgetkey
	call	clrlin
	pop	hl
	ret




; *****  home  *****

mbhome:	call	ctrl
	jp	z,nausw
	call	tabtoets
	ret	z
	xor	a
	ld	(pos),a
	call	prtpos
	call	pospat
	jp	prtpat

clrlin:	push	hl
	ld	hl,emptx
	call	printt
	pop	hl
	ret



; *** input no event ***

inpemp:	call	tabtoets
	jp	z,delpos
	call	ctrl
	jp	z,clrpat
	call	shift
	jp	z,clrchn
	call	inblk
	jp	z,delblk

	ld	a,(0f3ddh)
	cp	41
	jr	z,inpem4
	cp	44
	jr	z,inpem5
	cp	49
	jr	z,inpem2
	cp	53
	jr	z,inpem3
	cp	57
	jr	z,inpem6
	xor	a
	ld	(hl),a
	ld	(lasnot),a
inpeme:	jp	curmakpts

inpem2:	ld	a,(hl)
	and	01111b
	ld	(hl),a
	ld	(lasno4),a
	jr	inpeme
inpem3:	ld	a,(hl)
	and	011110000b
	ld	(hl),a
	ld	(lasno5),a
	jr	inpeme
inpem4:	xor	a
	ld	(hl),a
	ld	(lasno2),a
	jr	inpeme
inpem5:	xor	a
	ld	(hl),a
	ld	(lasno3),a
	jr	inpeme
inpem6:	xor	a
	ld	(hl),a
	ld	(lasno6),a
	jr	inpeme


;**** erase all music data ****

clrsng:	push	hl
	ld	hl,clrsnt
	call	prtgetkey
	res	5,a
	cp	"Y"
	jr	nz,clrsn2
	call	resall
	call	makscr
	call	clrlin
	pop	hl
	call	mbhome
	jp	remblk
clrsn2:	pop	hl
	jp	clrlin

resall:
	ld	hl,xbegmd
	ld	de,xbegmd+1
	ld	bc,0c000h-xbegmd-1
	ld	(hl),0
	ldir
	ld	hl,(usrdat)
	ld	a,h
	xor	22
	ld	h,a
	ld	(us2dat),hl
	jp	ramld5


;**** erase pattern ****

clrpat:	push	hl
	ld	hl,xbegmd-13*16
	ld	a,(pat)
	ld	b,a
	ld	de,13*16
clrpa2:	add	hl,de
	djnz	clrpa2
	push	hl
	pop	de
	inc	de
	ld	bc,13*16-1
	ld	(hl),0
	ldir
	call	makpts
	pop	hl
	ret

;**** erase channel ****

clrchn:	push	hl
	call	chnadr
	cp	11
	jr	z,clrch3
	cp	12
	jr	z,clrch4
	cp	13
	jr	nz,clrch5
	dec	hl
clrch5:	ld	b,16
	ld	de,13
clrch2:	ld	(hl),0
	add	hl,de
	djnz	clrch2
clrch7:	call	makpts
	pop	hl
	ret
clrch3:	ld	b,16
	ld	de,13
clrch6:	ld	a,(hl)
	and	01111b
	ld	(hl),a
	add	hl,de
	djnz	clrch6
	jr	clrch7
clrch4:	dec	hl
	ld	b,16
	ld	de,13
clrch8:	ld	a,(hl)
	and	011110000b
	ld	(hl),a
	add	hl,de
	djnz	clrch8
	jr	clrch7


;**** raise / lower channel octave ****


octup:
	call	inblk
	jp	z,oublk
	ld	a,(0f3ddh)
	cp	41
	ret	nc
	push	hl
	call	chnadr
	push	hl
	ld	b,16
	ld	de,13
octup2:	ld	a,(hl)
	cp	97
	jr	nc,octup4
	cp	85
	jp	nc,octerr
octup4:	add	hl,de
	djnz	octup2
	pop	hl
	ld	b,16
octup3:	ld	a,(hl)
	or	a
	jr	z,octup5
	cp	97
	jr	nc,octup5
	add	a,12
octup5:	ld	(hl),a
	add	hl,de
	djnz	octup3
	call	makpts
	call	clrlin
	pop	hl
	ret

octdow:
	call	inblk
	jp	z,odblk
	ld	a,(0f3ddh)
	cp	41
	ret	nc
	push	hl
	call	chnadr
	push	hl
	ld	b,16
	ld	de,13
octdo2:	ld	a,(hl)
	or	a
	jr	z,octdo4
	cp	13
	jp	c,octerr
octdo4:	add	hl,de
	djnz	octdo2
	pop	hl
	ld	b,16
octdo3:	ld	a,(hl)
	or	a
	jr	z,octdo5
	cp	97
	jr	nc,octdo5
	sub	12
octdo5:	ld	(hl),a
	add	hl,de
	djnz	octdo3
	call	makpts
	call	clrlin
	pop	hl
	ret


;**** raise / lower channel note ****


notup:
	call	ctrl
	jp	z,octup
notp2:	call	inblk
	jp	z,nublk
	ld	a,(0f3ddh)
	cp	41
	ret	nc
	push	hl
	call	chnadr
	push	hl
	ld	b,16
	ld	de,13
notup2:	ld	a,(hl)
	cp	97
	jr	nc,notup4
	cp	96
	jp	z,noterr
notup4:	add	hl,de
	djnz	notup2
	pop	hl
	ld	b,16
notup3:	ld	a,(hl)
	or	a
	jr	z,notup5
	cp	97
	jr	nc,notup5
	inc	a
notup5:	ld	(hl),a
	add	hl,de
	djnz	notup3
notup6:	call	makpts
	call	clrlin
	pop	hl
	ret

notdow:
	call	ctrl
	jp	z,octdow
notdw2:	call	inblk
	jp	z,ndblk
	ld	a,(0f3ddh)
	cp	41
	ret	nc
	push	hl
	call	chnadr
	push	hl
	ld	b,16
	ld	de,13
notdo2:	ld	a,(hl)
	or	a
	jr	z,notdo4
	cp	2
	jp	c,noterr
notdo4:	add	hl,de
	djnz	notdo2
	pop	hl
	ld	b,16
notdo3:	ld	a,(hl)
	or	a
	jr	z,notdo5
	cp	97
	jr	nc,notdo5
	dec	a
notdo5:	ld	(hl),a
	add	hl,de
	djnz	notdo3
	jr	notup6

noterr:	ld	hl,nptxt	;note change error
	jr	octer2
octerr:	ld	hl,nptxt	;octave change error
octer2:	call	prtgetkey
	call	clrlin
	pop	hl
	pop	hl
	ret


;*** turn channel on / off ***

chonof:	push	hl
	call	srlf3dd
	cp	14
	jr	z,chono3
	cp	10
	call	nc,chono2
	ld	hl,chofdt-1
	ld	e,a
	ld	d,0
	add	hl,de
	ld	a,(hl)
	xor	1
	ld	(hl),a
	LOCVDP 3,4
	ld	hl,blddt2+4
	ld	b,13*4
	otir
	call	profdt
chono3:	pop	hl
	ret
chono2:	ld	a,10
	ret



;*** find out which address is first note of current channel ***

chnadr:	ld	a,(pat)
	ld	b,a
	ld	hl,08240h-208
	ld	de,208
chnad2:	add	hl,de
	djnz	chnad2
	push	hl
	call	srlf3dd
	dec	a
	ld	e,a
	ld	d,0
	pop	hl
	add	hl,de
	ret

chnad3:	push	af
	ld	a,(pat)
	ld	b,a
	ld	hl,08240h-208
	ld	de,208
chnad4:	add	hl,de
	djnz	chnad4
	pop	af
	dec	a
	ld	e,a
	ld	d,0
	add	hl,de
	ret




; **** copy channel within pattern ****


echcop:	ld	a,(begblp)
	or	a
	jp	nz,copblk
	push	hl
	ld	hl,schntx
	call	printt
echcp7:	ld	a,31
	call	entcyf
	or	a
	jr	z,echcp7
	cp	255
	jr	z,echcp8
	ld	(schbuf),a

	ld	hl,dchntx
	call	printt
echcp2:	ld	a,36
	call	entcyf
	or	a
	jr	z,echcp2
	cp	255
	jr	z,echcp8
	push	af

	call	clrlin
	ld	hl,echntx
	call	printt
echcp3:	ld	a,37
	call	entcyf
	cp	255
	jr	z,echcp9
	cp	5
	jr	nc,echcp3
	ex	af,af'

	ld	a,(schbuf)
	call	chnad3
	pop	af
	push	hl
	call	chnad3
	ex	af,af'
	or	a
	jr	z,echcp4
	ld	b,a
	ld	de,13
echcp5:	add	hl,de
	djnz	echcp5
echcp4:	push	hl
	pop	de
	pop	hl

	ld	b,16
echcp6:	ld	a,(hl)
	ld	(de),a

	push	de
	ld	de,13
	add	hl,de
	pop	de

	push	hl
	ex	de,hl
	ld	de,13
	add	hl,de
	ex	de,hl
	pop	hl
	djnz	echcp6
	call	makpts
echcp8:	call	clrlin
	pop	hl
	ret
echcp9:	pop	af
	jr	echcp8



; **** exchange channels ****


chexch:	ld	a,(begblp)
	or	a
	jp	nz,chnblk	;exchange bloks
	push	hl
	ld	hl,cchntx
	call	printt
chexc2:	ld	a,29
	call	entcyf
	or	a
	jr	z,chexc2
	cp	255
	jr	z,echcp8
	ld	(schbuf),a

	ld	hl,cch2tx
	call	printt
chexc3:	ld	a,31
	call	entcyf
	or	a
	jr	z,chexc3
	cp	255
	jr	z,echcp8
	push	af
	call	clrlin

	ld	a,(schbuf)
	call	chnad3
	pop	af
	push	hl
	call	chnad3
	push	hl
	pop	de
	pop	hl

	ld	b,16
chexc4:	ld	c,(hl)
	ld	a,(de)
	ld	(hl),a
	ld	a,c
	ld	(de),a

	push	de
	ld	de,13
	add	hl,de
	pop	de

	push	hl
	ex	de,hl
	ld	de,13
	add	hl,de
	ex	de,hl
	pop	hl
	djnz	chexc4
	call	makpts
	jp	echcp8





;---------------------------------------------------
;-	 entering events		  -
;---------------------------------------------------


;--- input off event ---

offevn:	ld	a,97
offev2:	ld	(hl),a
	ld	(lasnot),a
	call	makpat
	jp	curdow


;--- input sus event ---

susevn:	ld	a,237
	jr	offev2
modevn:	ld	a,238
	jr	offev2

;--- enter note ---

inpnot:	ex	af,af'
	ld	a,(0f3ddh)
	cp	57
	jp	z,inpcmd
	cp	41
	jp	nc,inpfrq
	ex	af,af'
	res	5,a
	cp	"O"
	jr	z,offevn
	cp	"M"
	jr	z,modevn
	cp	"U"
	jr	z,susevn
	cp	"V"
	jp	z,inpnvl
	cp	"I"
	jp	z,inpins
	cp	"S"
	jp	z,inpste
	cp	"T"
	jp	z,inprev
	cp	"L"
	jp	z,inplnk
	cp	"X"
	jp	z,inpbright
	cp	"P"
	jp	z,inppit
	cp	"A"
	ret	c
	cp	"H"
	ret	nc

	bios	chput
	sub	64
	ld	de,notdt2-1
	ld	b,a
inpnol:	inc	de
	djnz	inpnol
	ld	a,(de)
	push	af

inpnox:	call	getkey
	cp	"#"
	jp	z,inpcro
	cp	"+"
	jp	z,inpcro

inpno2:	cp	ESC
	jp	z,inpesc
	cp	"1"
	jr	c,inpnox
	cp	"9"
	jr	nc,inpnox
	push	af

	ld	a,(0f3ddh)
	bit	0,a
	jr	nz,inpno7
	ld	a,SPACE
	bios	chput

inpno7:	pop	af
	bios	chput

	sub	48
	ld	b,a
	pop	af
inpno3:	add	a,12
	djnz	inpno3
inpno6:	ld	(hl),a
	ld	(lasnot),a
	ld	(tnot),a
	ld	a,16
	ld	(notval),a
	call	makpts
	ld	a,(0f3ddh)
	sub	3
	ld	(0f3ddh),a
	jp	curdow

inpno5:	ld	a,(0f3ddh)
	sub	3
	ld	(0f3ddh),a
	jp	makpts

inpcro:	pop	af
	push	af
	cp	5-12
	jr	z,inpno4
	cp	12-12
	jr	z,inpno4
	ld	a,"#"
	bios	chput
	pop	af
	inc	a
	push	af
inpno4:	call	getkey
	jp	inpno2

inpesc:	pop	af
	push	hl
	ld	hl,0f3ddh
	dec	(hl)
	ld	a,(hl)
	bit	0,a
	jr	nz,inpes2
	dec	(hl)
inpes2:	call	makpts
	pop	hl
	ret

;	   a     b     c    d	 e    f    g

notdt2:	db 10-12,12-12,1-12,3-12,5-12,6-12,8-12



;--- enter frequency ---

inpfrq:	ex	af,af'
	cp	"0"
	ret	c
	cp	"9"+1
	ret	nc
	ex	af,af'
	ld	a,(0f3ddh)
	cp	45
	jp	z,inpvol
	cp	49
	jp	z,inpdr1
	cp	53
	jp	z,inpdr2

	ld	a,61
	ld	(maxget),a
	ex	af,af'
	push	hl
	ld	hl,(0f3dch)
	inc	h
	call	entget
	pop	hl
	jp	c,makpts
	ld	(lasno2),a
inpvl3:	ld	(hl),a
	jp	curmakpts

inpes3:	ld	hl,0f3ddh
	dec	(hl)
	ld	a,(hl)
	bit	0,a
	jr	nz,inpes4
	dec	(hl)
inpes4:	pop	af
	pop	hl
	jp	makpts


;--- enter volume samples ---

inpvol:	ex	af,af'
	push	hl
	call	inpnum
	ld	de,128
	rst	020h
	jp	nc,aganum
	ld	a,l
	ld	(lasno3),a
	pop	hl
	ld	(hl),a
	call	makpts
	ld	a,(0f3ddh)
	sub	3
	ld	(0f3ddh),a
	jp	curdow


;--- enter drum 1 ---

inpdr1:	ld	a,15
	ld	(maxget),a
	ex	af,af'
inpdr3:	push	hl
	ld	hl,(0f3dch)
	inc	h
	call	entget
	pop	hl
	jp	c,makpts
	ld	(lasno4),a
inpdr5:	sla	a
	sla	a
	sla	a
	sla	a
	push	af
	ld	a,(hl)
	and	01111b
	pop	bc
	or	b
	ld	(hl),a
	jp	curmakpts


;--- enter drum 2 ---

inpdr2:	ld	a,16
	ld	(maxget),a
	ex	af,af'
inpdr4:	push	hl
	ld	hl,(0f3dch)
	inc	h
	call	entget
	pop	hl
	jp	c,makpts
	ld	(lasno5),a
inpdr6:	push	af
	ld	a,(hl)
	and	011110000b
	pop	bc
	or	b
	ld	(hl),a
	jp	curmakpts

aganum:	ld	a,(0f3ddh)
	sub	3
	ld	(0f3ddh),a
	pop	hl
	jp	makpts


;--- enter number ---

inpnum:	ld	hl,0
	ld	(temnum),hl
	bios	chput
	sub	"0"
	ld	hl,temnum+2
	ld	(hl),a
	dec	hl

	ld	b,2

inpnu2:	call	getkey
	cp	013
	jp	z,inprt2
	cp	ESC
	jp	z,inpes3
	cp	"0"
	jp	c,inpnu2
	cp	":"
	jp	nc,inpnu2
	bios	chput
	sub	"0"
	ld	(hl),a
	dec	hl

	djnz	inpnu2

cnvert:	ld	de,temnum
	ld	hl,0
	ld	a,1
	call	cnver2
	ld	a,10
	call	cnver2
	ld	a,100

cnver2:	ld	(addat),a
	ld	a,(de)
	inc	de
	or	a
	ret	z
	push	de
	ld	b,a
	ld	de,(addat)
cnver3:	add	hl,de
	djnz	cnver3
	pop	de
	ret

inprt2:	ld	a,b
	cp	2
	jr	nz,inprt3
	ld	a,(temnum+2)
	ld	(temnum),a
	xor	a
	ld	(temnum+2),a
	ld	hl,0f3ddh
	inc	(hl)
	inc	(hl)
	jp	cnvert

inprt3:	ld	hl,(temnum+1)
	ld	(temnum),hl
	xor	a
	ld	(temnum+2),a
	ld	hl,0f3ddh
	inc	(hl)
	jp	cnvert

inpnvl:	bios	chput
	push	hl
	call	inp2nm
	or	a
	jr	z,inpnv2
	cp	64
	jp	nc,inpnv2
	ld	b,a
	ld	a,63
	sub	b
	add	a,114

inpnv3:	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	pop	hl
	ld	(hl),a
	ld	(lasnot),a
	jp	curmakpts


inpnv2:	call	makpts
	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	ld	a,"V"
	pop	hl
	jr	inpnvl

;--- input instrument change ---

inpins:	bios	chput
	push	hl
	call	inp2nm
	or	a
	jr	z,inpin2
	cp	17
	jp	nc,inpin2
	add	a,97
	jp	inpnv3

inpin2:	call	makpts
	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	ld	a,"I"
	pop	hl
	jr	inpins


;--- input stereo change ---

inpste:	push	hl
	bios	chput
inpst1:	call	getkey
	cp	ESC
	jp	z,inpst2
	cp	"0"
	jr	c,inpst1
	cp	"3"
	jr	nc,inpst1
	add	a,177 - "0"
	ld	hl,0f3ddh
	dec	(hl)
	pop	hl
	ld	(hl),a
	ld	(lasnot),a
	jp	curmakpts

inpst2:	ld	hl,0f3ddh
	dec	(hl)
	pop	hl
	jp	makpts


;--- input detune change ---

inprev:	push	hl
	bios	chput
inprv1:	call	getkey
	cp	ESC
	jp	z,inpst2
	cp	"+"
	jr	z,inprv2
	cp	"-"
	jr	nz,inprv1

inprv2:	bios	chput
	push	af
inprv3:	call	getkey
	cp	ESC
	jp	z,inprv4
	cp	"0"
	jr	c,inprv3
	cp	"4"
	jr	nc,inprv3
	ld	b,a
	pop	af
	cp	"-"
	ld	a,b
	call	z,inprv5

	add	a,227 - "0"             ;positief
	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	pop	hl
	ld	(hl),a
	ld	(lasnot),a
	jp	curmakpts

inprv5:	cp	"0"
	ret	z
	sub	"0"
	ld	b,a
	ld	a,9
	sub	b
	sub	9	;negatief
	add	a,"0"
	ret

inprv4:	pop	hl
inprv6:	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	pop	hl
	jp	makpts


;--- input link event ---

inplnk:	push	hl	;voer koppelen noten in
	bios	chput
inplk1:	call	getkey
	cp	ESC
	jp	z,inpst2
	cp	"-"
	jr	z,inplk4
	cp	"+"
	jr	nz,inplk1

inplk2:	bios	chput
inplk3:	call	getkey
	cp	ESC
	jp	z,inprv6
	cp	"0"
	jr	c,inplk3
	cp	":"
	jr	nc,inplk3

	add	a,189-"0"         ;positief
inplk6:	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	pop	hl
	ld	(hl),a
	ld	(lasnot),a
	jp	curmakpts

inplk4:	bios	chput
inplk5:	call	getkey
	cp	ESC
	jp	z,inprv6
	cp	"0"
	jr	c,inplk5
	cp	":"
	jr	nc,inplk5
	sub	"0"
	ld	b,a
	ld	a,9
	sub	b
	add	a,180	;negatief
	jp	inplk6


;--- input brightness control ---

inpbright:	push	hl
	call	chput
inpbr1:	call	getkey
	cp	ESC
	jp	z,inpst2
	cp	"-"
	jr	z,inpbr4
	cp	"+"
	jr	nz,inpbr1

inpbr2:	bios	chput
inpbr2lus:	call	getkey
	cp	ESC
	jr	z,inprv6
	cp	"1"
	jr	c,inpbr2lus
	cp	"6"+1
	jr	nc,inpbr2lus
	sub	"1"
	ld	b,a
	ld	a,223
	sub	b
	jp	inppt6
inpbr4:	bios	chput
inpbr4lus:	call	getkey
	cp	ESC
	jp	z,inprv6
	cp	"1"
	jr	c,inpbr4lus
	cp	"6"+1
	jr	nc,inpbr4lus
	add	a,231-"1"
	jp	inppt6



;--- input pitch bend event ---

inppit:	push	hl	;voer pitch bending in
	bios	chput
inppt1:	call	getkey
	cp	ESC
	jp	z,inpst2
	cp	"-"
	jr	z,inppt4
	cp	"+"
	jr	nz,inppt1

inppt2:	bios	chput
inppt3:	call	getkey
	cp	ESC
	jp	z,inprv6
	cp	"0"
	jr	c,inppt3
	cp	":"
	jr	nc,inppt3
	add	a,208- "0"         ;positief
inppt6:	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	pop	hl
	ld	(hl),a
	ld	(lasnot),a
	jp	curmakpts

inppt4:	bios	chput
inppt5:	call	getkey
	cp	ESC
	jp	z,inprv6
	cp	"0"
	jr	c,inppt5
	cp	":"
	jr	nc,inppt5
	sub	"0"
	ld	b,a
	ld	a,9
	sub	b
	add	a,199	;negatief
	jp	inppt6


;--- input command channel ---

inpcmd:	ex	af,af'
	res	5,a
	cp	"E"
	jp	z,inpeop
	cp	"D"
	jp	z,inpdrs
	cp	"S"
	jp	z,inpstatevt
	cp	"R"
	jp	z,inptrs
	cp	"T"
	ret	nz


;--- input tempo change ---

inptmp:	push	hl
	ld	hl,-80+56
	ld	de,80
	ld	a,(0f3dch)
	ld	b,a
inptm3:	add	hl,de
	djnz	inptm3
	call	setwrt
	ld	hl,tmpevt2_txt
	ld	b,5
	otir
	ld	a,(0f3ddh)
	add	a,3
	ld	(0f3ddh),a
	call	inp2nm
	or	a
	jr	z,inptm2
	cp	24
	jp	nc,inptm2
	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	dec	(hl)
	dec	(hl)
	pop	hl
inpeo2:	ld	(hl),a
	ld	(lasno6),a
	jp	curmakpts

inptm2:	call	makpts
	ld	a,(0f3ddh)
	sub	4
	ld	(0f3ddh),a
	pop	hl
	jr	inptmp
inpeop:	ld	a,24
	jr	inpeo2



;--- input transpose change ---

inptrs:	push	hl
	ld	hl,-80+56
	ld	de,80
	ld	a,(0f3dch)
	ld	b,a
inptr3:	add	hl,de
	djnz	inptr3
	call	setwrt
	ld	hl,trsevt_txt2
	ld	b,5
	otir
	ld	a,(0f3ddh)
	add	a,2
	ld	(0f3ddh),a
inptr4:	call	getkey
	cp	"+"
	jr	z,inptr5
	cp	"-"
	jr	z,inptr5
	cp	ESC
	jr	z,inptr9
	jr	inptr4

inptr5:	ld	(trsopslag),a
	bios	chput
	call	inp2nm
	cp	24+1
	jp	nc,inptr2
	ld	b,a
	ld	a,(trsopslag)
	cp	"-"
	jr	nz,inptr6
	ld	a,55
	sub	b
	jr	inptr8
inptr6:	ld	a,b
	add	a,55
inptr8:	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
inptr7:	dec	(hl)
	dec	(hl)
	pop	hl
	jr	inpeo2
inptr9:	ld	hl,0f3ddh
	dec	(hl)
	dec	(hl)
	pop	hl
	jp	makpts

inptr2:	call	makpts
	ld	a,(0f3ddh)
	sub	4
	ld	(0f3ddh),a
	pop	hl
	jr	inptrs


;--- input drumset change ---

inpdrs:	push	hl
	ld	hl,-80+56
	ld	de,80
	ld	a,(0f3dch)
	ld	b,a
inpds3:	add	hl,de
	djnz	inpds3
	call	setwrt
	ld	hl,dsetevt2_txt
	ld	b,5
	otir
	ld	a,(0f3ddh)
	add	a,4
	ld	(0f3ddh),a
inpds2:	call	getkey
	cp	ESC
	jr	z,inpds4
	cp	"1"
	jr	c,inpds2
	cp	"4"
	jr	nc,inpds2
	sub	"1"
	add	a,25
	ex	af,af'
	ld	a,(0f3ddh)
	sub	4
	ld	(0f3ddh),a
	ex	af,af'
	pop	hl
	jp	inpeo2
inpds4:	ld	a,(0f3ddh)
	sub	4
	ld	(0f3ddh),a
	pop	hl
	jp	makpts


;--- input statusbyte ---

inpstatevt:	push	hl
	ld	hl,-80+56
	ld	de,80
	ld	a,(0f3dch)
	ld	b,a
inpstat3:	add	hl,de
	djnz	inpstat3
	call	setwrt
	ld	hl,statevt2_txt
	ld	b,5
	otir
	ld	a,(0f3ddh)
	add	a,4
	ld	(0f3ddh),a
inpstat2:	call	getkey
	cp	ESC
	jr	z,inpstat4
	cp	"1"
	jr	c,inpstat2
	cp	"4"
	jr	nc,inpstat2
	sub	"1" - 28
	ex	af,af'
	ld	a,(0f3ddh)
	sub	4
	ld	(0f3ddh),a
	ex	af,af'
	pop	hl
	jp	inpeo2
inpstat4:	ld	a,(0f3ddh)
	sub	4
	ld	(0f3ddh),a
	pop	hl
	jp	makpts


;--- input of number consisting of 2 digits ---

inp2nm:	call	getkey
	cp	ESC
	jr	z,inp2ne
	cp	"0"
	jr	c,inp2nm
	cp	":"
	jr	nc,inp2nm
	bios	chput
	sub	030h
	ld	b,a
inp2n2:	call	getkey
	cp	ESC
	jr	z,inp2nf
	cp	RETURN
	jr	z,inp2nr
	cp	"0"
	jr	c,inp2n2
	cp	":"
	jr	nc,inp2n2
	sub	030h
	ld	c,a
	inc	b
inp2n4:	ld	a,-10
inp2n3:	add	a,10
	djnz	inp2n3
	add	a,c
	ret

inp2nr:	ld	c,b
	ld	b,1
	jr	inp2n4

inp2ne:	pop	af
	ld	a,(0f3ddh)
	cp	60
	jr	nz,inp2nx
	sub	2
inp2nx:	dec	a
inp2ng:	ld	(0f3ddh),a
	call	makpts
	pop	hl
	ret

inp2nf:	pop	af
	ld	a,(0f3ddh)
	cp	61
	jr	nz,inp2ny
	sub	2
inp2ny:	sub	2
	jr	inp2ng





;-----------------------------------
;-         build pattern           -
;-----------------------------------


makpts:	ld	a,0ffh
	ld	(busply),a
	call	makpat
	xor	a
	ld	(busply),a
	ret
makpat:	push	hl

	ld	hl,324
	ld	(temreg),hl
	call	setwrt
	call	beppat
	ld	b,16	;number of rules
prtreg:	push	bc

	push	hl
	ld	hl,(temreg)
	ld	de,80
	add	hl,de
	ld	(temreg),hl
	call	setwrt
	pop	hl

	ld	b,9	;number of columns
prtkol:	push	bc
	push	hl
	ld	a,(hl)
	or	a
	jp	z,emppdt
	cp	97
	jp	z,offdat
	cp	98
	jp	nc,insdat
	ld	l,a
	ld	h,0
	push	hl
	pop	de
	add	hl,hl
	add	hl,de
	ld	de,notdat-3
	add	hl,de

cnmakp:	ld	b,3
	otir
	ld	a,22
	di
	out	(c),a
	pop	hl
	inc	hl
	pop	bc
	djnz	prtkol

	ld	b,2
prtkl2:	push	bc
	ld	a,(hl)
	push	hl
	or	a
	jp	z,empdt2
	call	prtdc2
prtkl3:	ld	a,22
	di
	out	(c),a
	pop	hl
	inc	hl
	pop	bc
	djnz	prtkl2

	call	prtkl5

	ld	a,22
	out	(c),a
	inc	hl
	push	hl
	ld	a,(hl)
	or	a
	jr	z,cmdmk2
	cp	24
	jp	c,temdat
	jp	z,eopdat
	cp	28
	jp	c,drsdat
	cp	31
	jp	c,statdat
	jp	transdat

cmdmk2:	ld	hl,empevt2_txt
cmdmak:	ld	b,5
	otir
	pop	hl
	inc	hl

	pop	bc
	djnz	prtreg
	pop	hl
	ld	a,(busply)
	or	a
	ret	nz
	jp	makblk
prtkl5:	ld	a,(hl)
	and	011110000b
	srl	a
	srl	a
	srl	a
	srl	a
	or	a
	jp	z,empdt3
	push	hl
	call	prtdc2
	pop	hl
prtkl4:	ld	a,22
	out	(c),a
	ld	a,(hl)
	and	01111b
	or	a
	jp	z,empdt4
	push	hl
	call	prtdc2
	pop	hl
	ret

emppdt:	ld	hl,empevt_txt
	jp	cnmakp
empdt2:	ld	hl,empevt_txt
	ld	b,3
	otir
	jp	prtkl3
empdt3:	push	hl
	ld	hl,empevt_txt
	ld	b,3
	otir
	pop	hl
	jp	prtkl4
empdt4:	push	hl
	ld	hl,empevt_txt
	ld	b,3
	otir
	pop	hl
	ret

offdat:	ld	hl,offevt_txt
	jp	cnmakp

beppat:	ld	a,(pat)
	ld	c,a
	ld	e,208
	call	multip
	ld	de,08240h-208
	add	hl,de
	ret


insdat:	cp	114
	jp	nc,voldat
	sub	97

	call	bepdc2
	ld	de,insevt_txt+1
	inc	hl
	ld	a,(hl)
	ld	(de),a
	inc	hl
	inc	de
	ld	a,(hl)
	ld	(de),a

	ld	hl,insevt_txt
	jp	cnmakp

voldat:	cp	177
	jp	nc,stedat
	sub	114
	cpl		;vol 63 -> 0
	and	00111111b

	call	bepdc2
	ld	de,volevt_txt+1
	inc	hl
	ld	a,(hl)
	ld	(de),a
	inc	hl
	inc	de
	ld	a,(hl)
	ld	(de),a
	ld	hl,volevt_txt
	jp	cnmakp

stedat:	cp	180
	jr	nc,lnkdat
	sub	177 - "0"
	ld	(stereoevt_txt+2),a
	ld	hl,stereoevt_txt
	jp	cnmakp

lnkdat:	cp	199
	jr	nc,pitdat
	sub	189
	jr	nc,lnkdt2
	neg
	add	a,"0"
	ld	(lnkevtm_txt+2),a
	ld	hl,lnkevtm_txt
	jp	cnmakp

lnkdt2:	add	a,"0"
	ld	(lnkevtp_txt+2),a
	ld	hl,lnkevtp_txt
	jp	cnmakp

pitdat:	cp	218
	jr	nc,brnegdat
	sub	208
	jr	nc,pitdt2
	neg
	add	a,"0"
	ld	(pitevtm_txt+2),a
	ld	hl,pitevtm_txt
	jp	cnmakp

pitdt2:	add	a,"0"
	ld	(pitevtp_txt+2),a
	ld	hl,pitevtp_txt
	jp	cnmakp

brnegdat:	cp	224
	jr	nc,revzat
	sub	224
	neg
	add	a,"0"
	ld	(brgevtm_txt+2),a
	ld	hl,brgevtm_txt
	jp	cnmakp

revzat:	cp	227
	jr	nc,revzt2
	sub	227
	neg
	add	a,"0"
	ld	(dtnevtm_txt+2),a
	ld	hl,dtnevtm_txt
	jp	cnmakp

revzt2:	cp	231
	jr	nc,brposdat
	sub	227 - "0"
	ld	(dtnevtp_txt+2),a
	ld	hl,dtnevtp_txt
	jp	cnmakp

brposdat:	cp	237
	jr	nc,susdat
	sub	230 - "0"
	ld	(brgevtp_txt+2),a
	ld	hl,brgevtp_txt
	jp	cnmakp


susdat:	cp	238
	jp	nc,moddat
	ld	hl,susevt_txt
	jp	cnmakp

moddat:	ld	hl,modevt_txt
	jp	cnmakp

temdat:	call	bepdc2
	ld	de,tmpevt_txt+3
	inc	hl
	ld	a,(hl)
	ld	(de),a
	inc	hl
	inc	de
	ld	a,(hl)
	ld	(de),a
	ld	hl,tmpevt_txt
	jp	cmdmak

drsdat:	ld	de,dsetevt_txt+4
	sub	25 - "1"
	ld	(de),a
	ld	hl,dsetevt_txt
	jp	cmdmak

statdat:	ld	de,statevt_txt+4
	sub	28 - "1"
	ld	(de),a
	ld	hl,statevt_txt
	jp	cmdmak

eopdat:	ld	hl,endopevt_txt
	jp	cmdmak

transdat:	sub	55
	jr	nc,trsdat2
	ld	b,a
	xor	a
	sub	b
	call	bepdc2
	ld	de,trsevtn_txt+3
trsdat3:	inc	hl
	ld	a,(hl)
	ld	(de),a
	inc	hl
	inc	de
	ld	a,(hl)
	ld	(de),a
	ld	hl,-4
	add	hl,de
	jp	cmdmak
trsdat2:	call	bepdc2
	ld	de,trsevtp_txt+3
	jr	trsdat3



;---



makblk:	push	hl
	call	wiscol
	pop	hl
	ld	a,(pat)
	ld	b,a
	ld	a,(begblp)
	dec	a
	cp	b
	ret	nc	;smaller than begpat, ret
	ld	a,(endblp)
	cp	b
	ret	c	;greater than endpat, ret
	push	hl
	ld	hl,0800h+5*10
	ld	b,16

	ld	a,(pat)
	ld	c,a
	ld	a,(begblp)
	cp	c
	call	z,makbl7	;block in initial pattern

	ld	a,(endblp)
	cp	c
	call	z,makbl8	;block in end pattern

makbl5:	push	bc
	push	hl
	call	makbls
	pop	hl
	ld	de,10
	add	hl,de
	pop	bc
	djnz	makbl5

	pop	hl
	ei
	ret

makbls:	ld	a,(begblx)	      ;build a scooter
	ld	(curxco),a
	ld	b,a
	ld	a,(endblx)
	sub	b
	inc	a
	ld	b,a
makbl1:	push	hl
	push	bc
	ld	a,(curxco)
	cp	14
	jr	z,makbl3
	srl	a
	ld	e,a
	ld	d,0
	add	hl,de
	call	setrd
	in	a,(c)
	ld	d,a
	ld	e,011110000b
	ld	a,(curxco)
	rrca
	jr	nc,makbl2
	ld	e,01111b
makbl2:	ld	a,e
	or	d
	ex	af,af'
	call	setwrt
	ex	af,af'
	out	(c),a
makbl6:	pop	bc
	ld	hl,curxco
	inc	(hl)
	pop	hl
	djnz	makbl1
	ret

makbl3:	ld	a,(curxco)
	srl	a
	ld	e,a
	ld	d,0
	add	hl,de
	call	setwrt
	ld	a,011111000b
	out	(c),a
	jr	makbl6

makbl7:	ld	a,(endblp)	      ;block in initial pattern
	cp	c
	jr	z,makbl9
	ld	a,(begbly)
	ld	b,a
	push	bc
	ld	hl,0800h+5*10-10
	ld	de,10
makb7l:	add	hl,de
	djnz	makb7l
	pop	bc
	ld	a,17
	sub	b
	ld	b,a
	ld	c,255
	ret

makbl8:	ld	a,(endbly)	      ;block in end pattern
	ld	b,a
	ret

makbl9:	ld	a,(begbly)
	ld	b,a
	push	bc
	ld	hl,0800h+5*10-10
	ld	de,10
makb9l:	add	hl,de
	djnz	makb9l
	pop	bc
	ld	a,(endbly)
	sub	b
	inc	a
	ld	b,a
	ld	c,255
	ret

;*** bouw hele edit-beeld op ***

makscr:	ld	hl,0
	call	setwrt
	ld	hl,blddt1
	call	decrc			 ;build image
	call	profdt
	call	prtnam

	ld	hl,xchip	;chip
	dec	(hl)
	call	chipp
	call	prtspd
	call	prtpos
	call	prtpat
	call	prtlen
	call	prtchn
	call	prtres
	jp	makpat

profdt:	ld	b,9
	ld	hl,3*80+4
	ld	de,chofdt
profd1:	push	bc
	push	hl
	call	setwrt
	ld	a,(de)
	or	a
	jr	nz,profd2
	ld	hl,msxotx
	ld	b,3
	otir
profd2:	inc	de
	pop	hl
	pop	bc
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	djnz	profd1

	ld	a,(de)
	or	a
	ret	nz
	LOCVDP 3,9*4+4
	ld	b,4
profd4:	push	bc
	ld	b,4
	ld	hl,msxotx
	otir
	pop	bc
	djnz	profd4
	ret


prtdec:	call	bepdec
	otir
	ret

bepdec:	ld	hl,decdat
	or	a
	jr	z,bepdc1
	ld	l,a
	ld	h,0
	push	hl
	pop	de
	add	hl,hl
	add	hl,de
	ld	de,decdat
	add	hl,de
bepdc1:	ld	b,3
	ld	a,(hl)
	cp	SPACE
	ret	nz
	dec	b
	inc	hl
	ld	a,(hl)
	cp	SPACE
	ret	nz
	inc	hl
	ret

prtdc2:	call	bepdc2
	ld	b,3
	otir
	ret

bepdc2:	ld	hl,decdat
	or	a
	ret	z
	ld	l,a
	ld	h,0
	add	hl,hl
	ld	e,a
	ld	d,0
	add	hl,de
	ld	de,decdat
	add	hl,de
	ret

prtnam:	LOCVDP 1,13
	ld	hl,xnaam
	ld	b,40
	otir
	ret

prtpos:	push	hl
	LOCVDP 1,73
	ld	a,(pos)
	call	prtdec	;position
	ld	a,SPACE
	out	(c),a
	pop	hl
	ret

prtres:	push	hl
	LOCVDP 20,73
	ld	a,(xloop)
	cp	255
	jr	z,prtrs2
	call	prtdec	;position
	ld	a,SPACE
	out	(c),a
	pop	hl
	ret
prtrs2:	ld	hl,offevt_txt
	ld	b,3
	otir
	pop	hl
	ret

prtpat:	push	hl
	LOCVDP 2,73
	ld	a,(pat)
	push	af
	call	prtdec			 ;pattern
	ld	a,(posmen)
	or	a
	jr	nz,prtpa2
	LOCVDP 3,1
	pop	af
	call	prtdec
	pop	hl
	ret
prtpa2:	pop	af
	pop	hl
	ret

prtlen:	push	hl
	LOCVDP 3,73
	ld	a,(xleng)
	call	prtdec			 ;length
	ld	a,SPACE
	out	(c),a
	pop	hl
	ret

prtlop:	push	hl
	LOCVDP 20,63
	ld	hl,loptx3
	ld	b,16
	otir
	pop	hl
	jp	prtres

prtoct:	di
	push	hl
	LOCVDP 20,63
	ld	hl,coctxt
	ld	b,13
	otir
	ld	a,(octave)
	add	a,"1"
	out	(c),a
	ex	af,af'
	ld	a,"-"
	out	(c),a
	ex	af,af'
	inc	a
	out	(c),a
	pop	hl
	ei
	ret

prtspd:	LOCVDP 6,70
	ld	a,(xtempo)
	ld	b,a
	ld	a,25
	sub	b
	jp	prtdec	;print speed




prtchn:	LOCVDP 7,78
	ld	a,(xsust)
	ld	b,a
	ld	a,"6"
	bit	5,b
	jr	nz,prtch2
	ld	a,"9"
prtch2:	out	(c),a
	ret

prtste:	ld	hl,tempst
	ld	de,chnwc1
	ld	bc,10
	ldir
prtst3:	ld	hl,788
	ld	b,10
	ld	de,chnwc1
prtstl:	push	bc
	call	setwrt
	push	hl
	ld	a,(de)
	or	a
	jr	z,prtoff
	cp	1
	jr	z,prtaud
	cp	2
	jr	z,prtmus
	ld	hl,msxbtx
prtst2:	call	decrc
	inc	de
	pop	hl
	ld	bc,80
	add	hl,bc
	pop	bc
	djnz	prtstl
	ret
prtaud:	ld	hl,msxatx
	jr	prtst2
prtmus:	dec	b
	jr	z,prtpdr
	ld	hl,msxmtx
	jr	prtst2
prtoff:	ld	hl,msxotx
	jr	prtst2
prtpdr:	ld	hl,msxptx
	ld	a,(xsust)
	and	0100000b
	jr	z,prtst2,
	ld	hl,msxdtx
	jr	prtst2

chip:	call	ctrl
	jp	z,chexch	;exchange channels
chipp:	push	hl
	ld	a,(xchip)
	or	a
	jr	z,chpac
	cp	1
	jr	z,chste
chmod:	xor	a
	ld	(xchip),a
	inc	a
	ld	hl,tempst
	ld	de,tempst+1
	ld	bc,9
	ld	(hl),a
	ldir
chip2:	call	prtste
	call	prtchp
	pop	hl
	ret

chpac:	ld	a,1
	ld	(xchip),a
	ld	a,(xsust)
	bit	5,a
	jr	z,chpac2
	ld	hl,tempst
	ld	de,tempst+1
	ld	bc,5
	ld	(hl),2
	ldir
	ld	a,2
	ld	(tempst+9),a
	ld	hl,0
	ld	(tempst+6),hl
	ld	(tempst+7),hl
	jr	chip2
chpac2:	ld	hl,tempst
	ld	de,tempst+1
	ld	bc,9
	ld	(hl),2
	ldir
	jr	chip2

chste:	ld	a,2
	ld	(xchip),a
	ld	hl,xstpr
	ld	de,tempst
	ld	bc,10
	ldir
	jp	chip2

prtchp:	LOCVDP 5,70
	ld	a,(xchip)
	or	a
	jr	z,prtau2
	cp	1
	jr	z,prtmu2
	ld	hl,msxstx
	jp	decrc

prtau2:	ld	hl,msxatx
	jp	decrc

prtmu2:	ld	hl,msxmtx
	jp	decrc

ctrl:	KEYSCAN 6,1
	ret
tabtoets:	KEYSCAN 7,3
	ret
shift:	KEYSCAN 6,0
	ret
clef:	KEYSCAN 8,4
	ret
cri:	KEYSCAN 8,7
	ret
cup:	KEYSCAN 8,5
	ret
cdow:	KEYSCAN 8,6
	ret

printt:	push	hl
	LOCVDP 22,2
	pop	hl
	call	decrc
	ei
	ret


;*** decrunch and print in image ***

decrc:
drclus:	ld	a,(hl)	;read data on hl
	cp	0ffh
	call	z,linfed
	cp	0fdh
	call	z,linfd2
	cp	0feh
	jr	z,drc2
	or	a
	ret	z
	out	(c),a
	inc	hl
	jr	drclus

drc2:	inc	hl
	ld	a,(hl)	;number *
	ld	b,a
	inc	hl
	ld	a,(hl)
drc3:	out	(c),a
	djnz	drc3
	inc	hl
	jr	drclus

linfed:	ld	a,SPACE
	out	(c),a
	call	linfd2
	ex	af,af'
	ld	a,SPACE
	out	(c),a
	ex	af,af'
	ret

linfd2:	inc	hl
	ld	a,(hl)
	or	a
	ret	z
	push	hl
	ld	hl,(stvrm)
	ld	de,80
	add	hl,de
	ld	(stvrm),hl
	call	setwrt
	pop	hl
	ld	a,(hl)
	ret



setwrt:	di
	ld	c,098h
	ld	a,h
	and	0c0h
	rlca
	rlca
	out	(099h),a
	ld	a,08eh
	out	(099h),a
	ld	a,l
	out	(099h),a
	ld	a,h
	and	03fh
	or	040h
	out	(099h),a
                ret


setrd:	di
	ld	c,098h
	ld	a,h
	and	0c0h
	rlca
	rlca
	out	(099h),a
	ld	a,08eh
	out	(099h),a
	ld	a,l
	out	(099h),a
	ld	a,h
	and	03fh
	out	(099h),a
	ret




;**** tempo ****

tempo:	push	hl
	ld	hl,(0f3dch)
	push	hl
	call	wiscol
	ld	hl,0800h + 6 * 10 + 7	;put the beam down
	call	setwrt
	ld	hl,blkdt3
	ld	b,3
	otir
	ld	hl,temptx		;put text at the bottom
	call	printt
	LOCVDP 22,16		;old tempo
	ld	a,(xtempo)
	ld	b,a
	ld	a,25
	sub	b
	call	prtdec
templ2:	ld	l,7
	ld	h,71
	ld	a,24
	ld	(maxget),a
	xor	a
	call	entget	;voer getal in
	jr	c,endtm3	;escape
	or	a
	jp	z,templ2
	ld	b,a
	ld	a,25
	sub	b
	ld	(xtempo),a
endtm3:	call	prtspd
endtm2:	call	clrlin
	call	makpat
	pop	hl
	ld	(0f3dch),hl
	pop	hl
	ret


; *** enter 2 digit number ***
;
; in: l=yco, h=xco, a=0 -> also enter the first digit
;     (maxget)=maximum value
; uit: a=getal carry=reset of:carry=set-> pressed on escape


entgt3:	xor	a
	jr	entgt4
entget:	ld	de,(0f3dch)
	push	de
entgt4:	push	hl
	ld	(0f3dch),hl
	push	af
	ld	a,SPACE
	bios	chput
	bios	chput
	ld	a,h
	ld	(0f3ddh),a
	pop	af
	or	a
	jr	nz,entgt2
temped:	call	getkey
entgt2:	cp	ESC              ;escape
	jr	z,endget
	cp	RETURN
	jr	z,endget
	cp	"0"
	jr	c,temped
	cp	":"
	jr	nc,temped
	bios	chput
	sub	"0"
	ld	l,a

tempe2:	call	getkey
	cp	RETURN
	jr	z,retget
	cp	ESC
	jr	z,endget
	cp	"0"
	jr	c,tempe2
	cp	":"
	jr	nc,tempe2
	bios	chput
	sub	"0"
	ld	h,a
	ld	b,l
	inc	b
	ld	l,10
	ld	a,-10
templs:	add	a,l
	djnz	templs
	add	a,h
	pop	hl
	ld	(0f3dch),hl
	ld	e,a
	ld	a,(maxget)
	dec	a
	cp	e
	jp	c,entgt3
	pop	hl
	ld	(0f3dch),hl
	ld	a,e
	scf
	ccf
	ret

retget:	ld	a,l
	scf
	ccf
	pop	hl
	pop	hl
	ld	(0f3dch),hl
	ret

endget:	pop	hl	;pressed on esc
	pop	hl
	ld	(0f3dch),hl
	scf
	ret




;**** loop position ****

chloop:	push	hl
	call	getint
	ld	hl,(0f3dch)
	push	hl
	call	wiscol
	ld	a,(xloop)
	push	af

	ld	hl,0800h + 20 * 10 + 7	;put the beam down
	call	setwrt
	ld	hl,blkdt3
	ld	b,3
	otir
loplu6:	ld	hl,looptx		;put text at the bottom
	call	printt

loplus:	call	prtres
loplu2:	call	getkey
	res	5,a
	cp	"O"
	jr	z,loopo
	cp	CR
	jr	z,loopri
	cp	CL
	jr	z,loople
	cp	RETURN
	jr	z,loplu4
	cp	SPACE
	jr	z,loplu4
	cp	ESC
	jr	nz,loplu2

loplu4:	ld	a,(xloop)
	cp	255
	jr	z,loplu3
	ld	b,a
	ld	a,(xleng)
	cp	b
	jr	c,loplu5
loplu3:	call	clrlin
	call	wiscol
	pop	hl
	pop	hl
	ld	(0f3dch),hl
	call	setint
	pop	hl
	ret

loopri:	ld	hl,xloop
	ld	a,(hl)
	cp	199
	jr	z,loopr2
	inc	(hl)
	jr	loplus
loopr2:	ld	a,255
	ld	(hl),a
	jr	loplus

loople:	ld	hl,xloop
	ld	a,(hl)
	cp	255
	jr	z,loopl2
	dec	(hl)
	jr	loplus
loopl2:	ld	a,199
	ld	(hl),a
	jr	loplus

loopo:	ld	a,255
	ld	(xloop),a
	jr	loplus

loplu5:	ld	hl,loptx2	;put text at the bottom
	call	prtgetkey
	call	clrlin
	jp	loplu6


;**** number of msx-music channels ****

numchn:	push	hl
	ld	a,(xsust)
	xor	0100000b
	ld	(xsust),a
	bit	5,a
	jr	z,numch4

	ld	b,3
	ld	hl,xstpr+6
numcl2:	ld	(hl),1
	inc	hl
	djnz	numcl2

	ld	a,(xchip)
	cp	1
	jr	nz,numch2
	ld	b,3
	ld	hl,tempst+6
numchl:	ld	(hl),0
	inc	hl
	djnz	numchl
numch2:	cp	2
	jr	nz,numch5
	ld	b,3
	ld	hl,tempst+6
numch6:	ld	(hl),1
	inc	hl
	djnz	numch6

numch5:	call	prtste
	call	prtchn
	pop	hl
	ret
numch4:	ld	a,(xchip)
	cp	1
	jr	nz,numch2
	ld	b,3
	ld	hl,tempst+6
numcl3:	ld	(hl),2
	inc	hl
	djnz	numcl3
	call	prtste
	jr	numch2



;**** scan for instruments e.g. ****

scan:
	push	hl
	call	setup
	ld	a,(pos)
	push	af
	ld	a,(pat)
	push	af
	ld	a,(xleng)
	push	af
	ld	a,(xloop)
	push	af
	ld	a,(posmen)
	push	af

	ld	hl,scntxt	;print text
	ld	a,(posmen)
	or	a
	call	z,printt

	ld	a,(pospld)
	or	a
	jp	nz,scan4	;nz at play

	ld	a,(xleng)
	ld	c,a
	ld	b,0
	ld	hl,xpos
	add	hl,bc	;hl = highest address
	ld	b,c
	inc	b	;xleng +1
	ld	a,(pat)	;search pattern
	ld	c,a
scanl:	ld	a,(hl)
	cp	c	;current pattern is the same as pattern
	jr	z,scan2	;at current position?
	dec	hl
	djnz	scanl

	ld	a,b	;--- pattern not found in song
	dec	a	;xleng
	jp	z,scanl5	;0? then no scan required...
	ld	a,(xleng)
	inc	a
	inc	a
	ld	b,a

scan2:	;push  bc
	;call  getkey
	;pop	 bc

	dec	b
	dec	b
	ld	a,b
	ld	(xleng),a	;xleng -1
scan3:	ld	a,15
	ld	(step),a
	ld	a,255
	ld	(pos),a
	ld	(posmen),a
	ld	(xloop),a
	xor	a
	ld	(plkbuf),a

scanl4:	ld	a,(step)
	inc	a
	and	01111b
	ld	(step),a
	call	z,posri3
	ld	a,(plkbuf)
	or	a
	jp	nz,scanl5

	ld	hl,(sngadr)
	ld	de,chnwc1
	ld	iy,laspl1
	ld	b,9
scanl2:	push	bc
	push	hl
	ld	a,(de)
	or	a
	jr	z,scanl3
	ld	a,(hl)
	cp	98
	jr	c,scanl3
	cp	114
	jp	c,scani
	cp	177
	jp	c,scanv
	cp	180
	jp	c,scans
	cp	218
	jr	c,scanl3
	cp	224
	jp	c,scanbr1
	cp	231
	jp	c,scanr
	cp	237
	jp	c,scanbr2

scanl3:	pop	hl
	inc	hl
	inc	de
	ld	bc,22
	add	iy,bc
	pop	bc
	djnz	scanl2
	ld	a,(hl)	;smpfreq
	or	a
	push	hl
	call	nz,scanfq
	pop	hl
	inc	hl
	ld	a,(hl)	;smpvol
	or	a
	call	nz,scanvl
	inc	hl
	inc	hl
	ld	a,(hl)	;command channel
	or	a
	jr	z,scanrm
	cp	24
	jp	c,scantp
	jp	z,scaneo
	cp	28
	jp	c,scandrs
	call	chgtrs
scanrm:	inc	hl
	ld	(sngadr),hl
	jp	scanl4

scan4:	ld	a,(pos)
	or	a
	jp	z,scanl5
	dec	a
	ld	(xleng),a
	jp	scan3
scaneo:	ld	a,15
	ld	(step),a
	jp	scanrm

scandrs:	call	chgdrs2
	jp	scanrm

scani:	push	de
	sub	97
	ld	c,a
	ld	a,(de)
	push	af
	push	bc
	and	010b
	call	nz,chpaci
	pop	bc
	pop	af
	and	01b
	call	nz,chmodi
	pop	de
	jp	scanl3

scanv:	push	de
	sub	114
	ld	c,a
	ld	a,(de)
	push	af
	push	bc
	and	010b
	call	nz,chpacv
	pop	bc
	pop	af
	and	01b
	call	nz,chmodv
	pop	de
	jp	scanl3

scans:	ld	c,a
	ld	a,(xchip)
	cp	2
	jp	nz,scanl3
	call	chstdp
	exx
	call	prtst3
	exx
	jp	scanl3
scanr:	sub	227
	ld	(iy+9),a
	jp	scanl3

scanbr1:	sub	224
	jr	scanbr3
scanbr2:	sub	230
scanbr3:	push	de
	ld	c,a
	ld	a,(de)
	push	af
	push	bc
	and	010b
	call	nz,chpacbrg
	pop	bc
	pop	af
	and	01b
	call	nz,chmodbrg
	pop	de
	jp	scanl3


scanl5:	pop	af
	ld	(posmen),a
	or	a
	call	z,clrlin
	pop	af
	ld	(xloop),a
	pop	af
	ld	(xleng),a
	pop	af
	ld	(pat),a
	pop	af
	ld	(pos),a
	pop	hl
	ret

scanfq:	ld	hl,mmpdt1-2	;frequency
	add	a,a
	ld	c,a
	ld	b,0
	rl	b
	add	hl,bc
	ld	a,(hl)
	ld	c,11h
	call	fmmout
	inc	hl
	ld	a,(hl)
	dec	c
	jp	fmmout
scanvl:	scf
	rla
	ld	c,012h
	jp	fmmout
scantp:	push	hl
	and	00011111b
	ld	b,a
	ld	a,25
	sub	b
	ld	(speed),a
	ld	hl,550
	call	setwrt
	ld	a,(speed)
	ld	b,a
	ld	a,25
	sub	b
	call	prtdec	;print speed
	pop	hl
	jp	scanrm


;*** play song ***

play:	ld	a,0ffh
	ld	(pospld),a
	ld	a,(scandt)	;scan?
	or	a
	call	nz,scan	;yep!
	ld	a,(pos)
	push	af
	ld	a,(posmen)	;if not in patpos editor, then text
	or	a
	ld	hl,playt2
	call	z,printt
	xor	a
	ld	(plkbuf),a
	ld	(debugd),a
	call	pospat	;search initial address of current music data
	call	strmus	;start music
pllus:	ld	a,(plkbuf)
	or	a
	jr	z,pllus
	call	stpmus
	pop	af
	ld	(pos),a
	ld	a,(posmen)
	or	a
	ret	nz
	call	clrlin
	ld	a,(debugd)
	or	a
	jr	z,play2
	ld	a,(debgd2)
	ld	(pos),a
play2:	call	prtpos
	call	prtspd
	call	wiscol
	call	pospat
	xor	a
	ld	(pospld),a
	ret


;*** play pattern ***

patpl:	ld	a,(scandt)
	or	a
	call	nz,scan
	ld	a,(pos)
	push	af	;positie
	ld	b,a
	ld	a,(xleng)
	push	af	;lengte
	ld	a,b
	ld	(xleng),a	;last pos equal to pos
	ld	a,(pat)
	push	af	;pattern
	xor	a
	ld	(plkbuf),a
	ld	a,(xloop)
	push	af	;walk out
	ld	a,255
	ld	(xloop),a
	push	hl
	ld	hl,(0f3dch)
	push	hl
	bios	0156h
	ld	a,(posmen)
	or	a
	ld	hl,playt3
	call	z,printt
	ld	a,(pos)
	ld	hl,xpos
	ld	e,a
	ld	d,0
	add	hl,de
	push	hl
	ld	a,(hl)
	push	af
	ld	a,(pat)
	ld	(hl),a	;equally current pattern at current pos
	call	wiscol
	call	strmus
pplus:	ld	a,(plkbuf)
	or	a
	jr	z,pplus
	call	stpmus
	ld	a,(posmen)
	or	a
	call	z,clrlin
	call	prtspd
	call	makblk
	pop	af
	pop	hl
	ld	(hl),a
	pop	hl
	ld	(0f3dch),hl
	pop	hl
	pop	af
	ld	(xloop),a
	pop	af
	ld	(pat),a
	pop	af
	ld	(xleng),a
	pop	af
	ld	(pos),a
	ret





wiscol:	push	af
	ld	hl,0800h
	call	setwrt
	ld	b,0
wiscl2:	xor	a
	out	(c),a
	djnz	wiscl2
	pop	af
	ret

wiscl3:	push	af
	ld	hl,0800h
	ld	b,25
wiscl5:	push	bc
	push	hl
	call	setwrt
	ld	b,7
wiscl4:	xor	a
	out	(c),a
	inc	hl
	djnz	wiscl4
	call	setrd
	in	a,(c)
	and	011b
	ex	af,af'
	call	setwrt
	ex	af,af'
	out	(c),a
	pop	hl
	pop	bc
	ld	de,10
	add	hl,de
	djnz	wiscl5

	pop	af
	ret



;**** stereo settings ****

stereo:	ld	a,(xchip)
	cp	2
	ret	nz
	push	hl
	ld	hl,(0f3dch)
	push	hl
	call	wiscol
	ld	a,1
	ld	(stbcnt),a
	ld	hl,0800h + 9 * 10 + 7	;put the beam down
	call	setwrt
	ld	hl,blkdt3
	ld	b,3
	otir
	ld	hl,stertx		;put text at the bottom
	call	printt
stblus:	call	getkey
	cp	CU
	jp	z,stbup
	cp	CD
	jp	z,stbdow
	cp	CR
	jp	z,stblef
	cp	CL
	jp	z,stbri
	cp	ESC
	jp	z,stbesc
	jr	stblus

stbesc:	call	makpat
	call	clrlin
	ld	de,xstpr
	ld	hl,tempst
	ld	bc,10
	ldir
	pop	hl
	ld	(0f3dch),hl
	pop	hl
	ret

stbdow:	ld	a,(stbcnt)
	cp	10
	jp	z,stblus
	inc	a
	cp	7
	jr	nz,stbdo2
	ld	b,a
	ld	a,(xsust)
	bit	5,a
	jr	z,stbdo3
	ld	b,10
stbdo3:	ld	a,b
stbdo2:	ld	(stbcnt),a
	call	wiscol
	add	a,a
	ld	hl,stblkd-2
	ld	b,0
	ld	c,a
	add	hl,bc
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	call	setwrt
	ld	hl,blkdt3
	ld	b,3
	otir
	jp	stblus

stbup:	ld	a,(stbcnt)
	cp	1
	jp	z,stblus
	dec	a
	cp	9
	jr	nz,stbdo2
	ld	b,a
	ld	a,(xsust)
	bit	5,a
	jr	z,stbdo3
	ld	b,6
	jp	stbdo3

stblef:	ld	a,(stbcnt)
	ld	b,0
	ld	c,a
	ld	hl,tempst-1
	add	hl,bc
	ld	a,(hl)
	inc	a
	cp	4
	jr	nz,stble3
	ld	a,1
stble3:	ld	(hl),a
	call	prtste
	jp	stblus

stbri:	ld	a,(stbcnt)
	ld	b,0
	ld	c,a
	ld	hl,tempst-1
	add	hl,bc
	ld	a,(hl)
	dec	a
	jr	nz,stble3
	ld	a,3
	jr	stble3


;**** edit songname ****

edname:	push	hl
	call	getint
	ld	hl,(0f3dch)
	push	hl
	ld	hl,xnaam
	ld	de,nambuf
	ld	bc,40
	ldir
	ld	hl,0800h + 1 * 10 + 1	   ;zet balk neer
	call	setwrt
	ld	hl,nablkd
	ld	b,6
	otir
	ld	hl,xnaam
	ld	de,xnaam+1
	ld	bc,39
	ld	(hl),020h
	ldir
	call	prtnam
	ld	hl,nametx	          ;put text at the bottom
	call	printt
	ld	h,14
	ld	l,2
	ld	(0f3dch),hl
	ld	b,1
	ld	hl,xnaam-1
ednaml:	call	getkey
	cp	BS
	jr	z,ednamb
	cp	RETURN
	jr	z,endedn
	cp	ESC
	jr	z,ednesc
	cp	SPACE
	jr	c,ednaml
	cp	"{"
	jr	nc,ednaml
	bios	chput
	inc	hl
	ld	(hl),a
	inc	b
	ld	a,b
	cp	41
	jr	nz,ednaml
ednml2:	bios	chget
	cp	BS
	jr	z,ednamb
	cp	ESC
	jr	z,ednesc
	cp	RETURN
	jr	nz,ednml2

endedn:	call	prtnam
	call	clrlin
	call	makpat
	pop	hl
	ld	(0f3dch),hl
	call	setint
	pop	hl
	ret
ednesc:	ld	hl,nambuf
	ld	de,xnaam
	ld	bc,40
	ldir
	jr	endedn

ednamb:	ld	a,b
	cp	1
	jp	z,ednaml
	dec	b
	ld	(hl),020h
	dec	hl
	ld	a,(0f3ddh)
	dec	a
	ld	(0f3ddh),a
	exx
	call	prtnam
	exx
	jp	ednaml



;**** copy patterns ****

coppat:	push	hl
coppt6:	call	clrlin
	ld	hl,spatxt
	call	printt
	ld	a,32
	call	entnum
	or	a
	jr	z,coppt6
	cp	255	;escape
	jp	z,coppt5
	cp	77
	jr	nc,coppt6
	ld	(srcpat),a

coppt7:	call	clrlin
	ld	hl,dpatxt
	call	printt
	ld	a,37
	call	entnum
	or	a
	jr	z,coppt7
	cp	77
	jr	nc,coppt7
	ld	(despat),a

coppt8:	call	clrlin
	ld	hl,npatxt
	call	printt
	ld	a,29
	call	entnum
	or	a
	jr	z,coppt8
	cp	77
	jr	nc,coppt8
	ld	(numpat),a
	call	clrlin
	ld	hl,surtxt
	call	prtgetkey
	res	5,a
	cp	"Y"
	jp	nz,coppt5

	ld	a,(numpat)
	ld	b,a
	ld	a,(srcpat)
	add	a,b
	cp	78
	jp	nc,coppt9
	ld	a,(despat)
	add	a,b
	cp	78
	jp	nc,coppt9

	ld	a,(srcpat)
	ld	b,a

	ld	hl,08240h-208
	ld	de,208
coppt2:	add	hl,de
	djnz	coppt2
	push	hl

	ld	a,(despat)
	ld	b,a
	ld	hl,08240h-208
	ld	de,208
coppt3:	add	hl,de
	djnz	coppt3
	push	hl

	ld	a,(numpat)
	ld	b,a
	ld	hl,0
	ld	de,208
coppt4:	add	hl,de
	djnz	coppt4
	push	hl

	pop	bc
	pop	de
	pop	hl
	push	de
	push	bc

copptb:	ld	a,sngpag	;copy to empty page
	out	(0feh),a
	ld	a,(hl)
	ex	af,af'
	ld	a,em1pag
	out	(0feh),a
	ex	af,af'
	ld	(de),a
	inc	hl
	inc	de
	dec	bc
	ld	a,b
	or	c
	jr	nz,copptb

	pop	bc
	pop	hl

coppta:	ld	a,em1pag	  ;copy back to song page
	out	(0feh),a
	ld	a,(hl)
	ex	af,af'
	ld	a,sngpag
	out	(0feh),a
	ex	af,af'
	ld	(hl),a
	inc	hl
	dec	bc
	ld	a,b
	or	c
	jr	nz,coppta

	call	clrlin
	ld	hl,suctxt
	call	prtgetkey
	call	makpat
coppt5:	call	clrlin
	pop	hl
	ret

coppt9:	call	clrlin
	ld	hl,imptxt
	call	prtgetkey
	jr	coppt5




entnum:	ld	hl,(0f3dch)
	push	hl
	ld	l,23
	ld	h,a
	ld	(0f3dch),hl
entned:	call	getkey
	cp	ESC	;escape
	jp	z,endent
	cp	"0"
	jr	c,entned
	cp	":"
	jr	nc,entned
	bios	chput
	sub	"0"
	ld	l,a
entne2:	call	getkey
	cp	RETURN
	jr	z,retent
	cp	"0"
	jr	c,entne2
	cp	":"
	jr	nc,entne2
	bios	chput
	sub	"0"
	ld	h,a
	ld	b,l
	inc	b
	ld	l,10
	ld	a,-10
entnls:	add	a,l
	djnz	entnls
	add	a,h

reten2:	pop	hl
	ld	(0f3dch),hl
	ret

retent:	ld	a,l
	jr	reten2

endent:	ld	a,255
	jr	reten2


entcyf:	ld	hl,(0f3dch)
	push	hl
	ld	l,23
	ld	h,a
	ld	(0f3dch),hl
entcyd:	ld	a,SPACE
	bios	chput
	ld	a,8
	bios	chput
	call	getkey
	cp	ESC	  ;escape
	jp	z,entcye
	cp	"0"
	jr	c,entcyd
	cp	":"
	jr	nc,entcyd
	bios	chput
	sub	"0"
entcyg:	pop	hl
	ld	(0f3dch),hl
	ret
entcye:	ld	a,255
	jr	entcyg







;***** pattern/position editor *****


posedt:	call	getint
	xor	a
	ld	(0f3dch),a
	call	savscr
	ld	a,0ffh
	ld	(posmen),a

	ld	hl,0
	ld	(stvrm),hl
	call	setwrt
	ld	hl,posscr
	call	decrc

	call	bepco
	call	prteps
	call	posblk

posedl:	ld	ix,ppedat
	call	keyhan
	jr	posedl

bepco:	ld	c,0
	ld	a,(pos)
posed2:	inc	c
	sub	10
	jr	nc,posed2
	ld	a,c
	ld	(posyco),a
	ld	a,-10
	ld	b,c
posed3:	add	a,10
	djnz	posed3
	ld	b,a
	ld	a,(pos)
	sub	b
	inc	a
	ld	(posxco),a
	ret

ppesc:	pop	af
	xor	a
	ld	(posmen),a
	call	resscr
	call	prtpos
	call	prtpat
	call	prtspd
	call	prtlen
	call	prtst3
	ld	hl,0506h
	ld	(0f3dch),hl
	call	wiscol
	call	makpat
	call	pospat
	push	hl
	call	setint
	pop	hl
	ret

ppedat:	MENU	F1,posply	;song playback
	MENU	F2,ppply	;play pattern
	MENU	CR,ppri	;right
	MENU	CL,pplef	;left
	MENU	CU,ppup	;up
	MENU	CD,ppdow	;down
	MENU	ESC,ppesc	;escape
	MENU	SPACE,ppsetx	;space
	MENU	18,ppins	;insert
	MENU	DEL,ppdel	;delete
	MENU	HOME,pphom	;home
	ENDMENU

pphom:	xor	a
	ld	(pos),a
	call	bepco
	jp	posblk

posply:
	call	play
pospl4:	call	wiscol
pospl2:	ROWSCAN 7
	cp	0ffh
	jr	nz,pospl2
pospl3:	ROWSCAN 8
	cp	0ffh
	jr	nz,pospl3
	xor	a
	ld	(0f3dch),a
	call	bepco
	jp	posblk
ppply:	call	patpl
	jr	pospl4

ppins:	call	inspos
	call	prteps
	call	ppset
	ld	(0f3dch),hl
	jp	nc,prteps
ppdel:	call	delpos
	jp	prteps

ppsetx:	call	ppset
	ld	(0f3dch),hl
	jp	prteps

ppset:	ld	hl,(0f3dch)
	push	hl
ppset2:	ld	b,3
	ld	a,(posyco)
	add	a,b
	ld	l,a
	ld	b,18
	ld	a,(posxco)
	add	a,a
	add	a,a
	add	a,b
	ld	h,a
	ld	a,77
	ld	(maxget),a
	xor	a
	call	entget
	jr	c,ppset3	;escape
	or	a
	jr	z,ppset2
	call	beppad
	ld	(hl),a
	ld	(pat),a
	pop	hl
	ld	(0f3dch),hl
	jp	prteps
ppset3:	pop	hl
	ret

beppad:	push	af
	ld	hl,08000h-10-1
	ld	a,(posyco)
	ld	b,a
	ld	de,10
beppa2:	add	hl,de
	djnz	beppa2
	ld	a,(posxco)
	ld	e,a
	ld	d,0
	add	hl,de
	pop	af
	ret

ppri:	call	shift
	jp	z,lenri
	ld	a,(posxco)
	cp	10
	ret	z
	inc	a
	ld	(posxco),a
	ld	hl,pos
	inc	(hl)
	jp	posblk

pplef:	call	shift
	jp	z,lenlef
	ld	a,(posxco)
	dec	a
	ret	z
	ld	(posxco),a
	ld	hl,pos
	dec	(hl)
	jp	posblk

ppup:	ld	a,(posyco)
	dec	a
	ret	z
	ld	(posyco),a
	ld	a,(pos)
	sub	10
	ld	(pos),a
	jp	posblk

ppdow:	ld	a,(posyco)
	cp	20
	ret	z
	inc	a
	ld	(posyco),a
	ld	a,(pos)
	add	a,10
	ld	(pos),a
	jp	posblk

prteps:	ld	de,xpos
	ld	hl,3*80+20       ;*** print positions
	ld	b,20
prtepl:	push	bc
	push	hl
	call	setwrt
	ld	b,10
prtep2:	push	bc
	ld	a,(de)
	push	de
	call	prtep3
	pop	de
prtep7:	pop	bc
	inc	de
	djnz	prtep2
	pop	hl
	ld	bc,80
	add	hl,bc
	pop	bc
	djnz	prtepl
	ret

prtep3:	ex	af,af'
	ld	a,SPACE
	out	(c),a
	ex	af,af'
	ld	l,a
	ld	h,0
	push	hl
	pop	de

	add	hl,hl
	add	hl,de
	ex	de,hl
	ld	hl,decdat
	add	hl,de
	inc	hl
	ld	b,2
	otir
	nop
	ld	a,SPACE
	out	(c),a
	ret


posblk:	call	wiscl3
	ld	hl,0800h+2*10+2
	ld	de,10
	ld	a,(posyco)
	ld	b,a
posbl2:	add	hl,de
	djnz	posbl2
	ld	a,(posxco)
	rra
	push	af
	ld	e,a
	add	hl,de
	call	setwrt
	ld	hl,posdat
	pop	af
	call	c,posbl3
	ld	a,(hl)
	out	(c),a
	ld	a,(pos)
	ld	c,a
	ld	b,0
	ld	hl,xpos
	add	hl,bc
	ld	a,(hl)
	ld	(pat),a
	call	prtpat
	jp	prtpos
posbl3:	inc	hl
	ret


;***** scanning on / off *****

scansw:	push	hl
	ld	hl,scntx2
	call	printt
	ld	hl,22*80+28
	call	setwrt
	ld	hl,ontxt
	ld	b,2
	ld	a,(scandt)
	xor	1
	ld	(scandt),a
	jr	nz,nausw2
	inc	b
	ld	hl,offevt_txt
	jp	nausw2



;***** note audition on / off *****

nausw:	push	hl
	xor	a
	ld	(notval),a
	ld	hl,nautxt
	call	printt
	ld	hl,22*80+25
	call	setwrt
	ld	hl,ontxt
	ld	b,2
	ld	a,(naudat)
	xor	1
	ld	(naudat),a
	jr	nz,nausw2
	inc	b
	ld	hl,offevt_txt
nausw2:	otir
	ld	a,"."
	out	(c),a
	call	getkey
	call	clrlin
	pop	hl
	ret

;***** equalizer on/off *****

sweql:	push	hl
	ld	hl,eqltxt
	call	printt
	ld	hl,22*80+28
	call	setwrt
	ld	hl,ontxt
	ld	b,2
	ld	a,(equals)
	xor	1
	ld	(equals),a
	jr	nz,nausw2
	inc	b
	ld	hl,offevt_txt
	jp	nausw2



;***** ramdisk load/save *****

ramdsk:	call	tabtoets
	jp	z,inspos	;insert positie

	push	hl
	call	clrlin
	ld	hl,ramtxt
	call	printt
ramdsl:	call	getkey
	res	5,a
	cp	"L"
	jr	z,ramlod
	cp	"S"
	jr	z,ramsav
	cp	ESC
	jr	nz,ramdsl
	call	clrlin
	pop	hl
	ret

ramlod:	call	ramld2	;load from ramdisk
ramld3:	call	makscr
	in	a,(0aah)
	and	01000000b
	call	z,prtoct
	call	makpat
	call	clrlin
	pop	hl
	ret
ramld2:	ld	hl,04000h
	call	setrd
	ld	b,64
	ld	hl,08000h
ramldl:	push	bc
	ld	b,0
	inir
	pop	bc
	djnz	ramldl
	ret

ramsav:	call	ramsv2	 ;write to ramdisk
	jr	ramld3
ramsv2:	ld	hl,04000h
	call	setwrt
	ld	b,64
	ld	hl,08000h
ramsvl:	push	bc
	ld	b,0
	otir
	pop	bc
	djnz	ramsvl
	ret

ramsv3:	ld	hl,0c000h
	call	setwrt
	ld	de,0240h
	ld	hl,08000h
ramsv4:	ld	a,(hl)
	out	(c),a
	inc	hl
	dec	de
	ld	a,d
	or	e
	jr	nz,ramsv4
	ret

ramld5:	ld	hl,0c000h
	call	setrd
	ld	de,0240h
	ld	hl,08000h
ramld6:	in	a,(c)
	ld	(hl),a
	inc	hl
	dec	de
	ld	a,d
	or	e
	jr	nz,ramld6
	ret

;*** save screen ***

savscr:	ld	a,em2pag
	out	(0feh),a
	ld	hl,0
	ld	de,08000h
	ld	bc,0900h
	bios	059h
	ld	a,sngpag
	out	(0feh),a
	ret


;*** restore screen ***

resscr:	di
	ld	a,em2pag
	out	(0feh),a
	ld	hl,08000h
	ld	de,0
	ld	bc,0900h
	bios	05ch
	ld	a,sngpag
	out	(0feh),a
	ei
	ret

;*** multiply ***

multip:	ld	b,8
	ld	hl,0
	ld	d,l
labela:	srl	c
	jp	nc,labelb
	add	hl,de
labelb:	sla	e
	rl	d
	djnz	labela
	ret

;*** get key ***

prtgetkey:	call	printt
getkey:	push	hl
	bios	0156h
	pop	hl
	jp	chget



;***********************************************
;*                                             *
;*        moonblaster v1.0  playroutine        *
;*                                             *
;***********************************************

chips:	db	1

;*** start music ***

strmus:
	ld	(sngadr),hl
	ld	hl,0fd9fh
	ld	de,oldint
	ld	bc,5
	ldir
	ld	a,0ffh
	ld	(busply),a
	ld	a,(scandt)
	or	a
	call	z,setup

	xor	a
	ld	(plbuf2),a
	ld	a,(speed)
	sub	2
	ld	(spdcnt),a
	ld	a,15
	ld	(step),a
	ld	hl,pos
	dec	(hl)
	di
	ld	hl,musint
	ld	(0fda0h),hl
	ld	a,0c3h
	ld	(0fd9fh),a
	ei
	ret

setup:	ld	hl,tempst
	ld	de,chnwc1
	ld	bc,10
	ldir

	ld	b,10
	ld	hl,chofdt
	ld	de,chnwc1
strmu2:	ld	a,(hl)
	or	a
	jr	nz,strmu3
	ld	(de),a
strmu3:	inc	hl
	inc	de
	djnz	strmu2

	ld	b,9	;move start instruments and reverb
	ld	iy,xbegvm+8
	ld	ix,xrever
	ld	hl,laspl1+176+6	;8*22+9
	ld	de,-27	;22+5?
mrlus:	ld	(hl),0	;pitch bend on
	inc	hl
	inc	hl
	inc	hl
	ld	a,(ix+0)
	ld	(hl),a	;detune
	inc	hl
	ld	a,(iy+0)
	ld	(hl),a	;initial instrument module
	inc	hl
	ld	a,(iy+9)
	ld	(hl),a	;initial instrument pac
	inc	ix
	dec	iy
	add	hl,de
	djnz	mrlus

	call	sinsmm          ;set intrumenten module
	call	sinspa
	ld	a,(xtempo)
	ld	(speed),a
	ld	a,48
	ld	(tpval),a
	ret

;*** set (initial) instruments of the module ***

sinsmm:	ld	de,mmrgad
	ld	hl,xbegvm
	ld	iy,laspl1+20

	ld	b,9
sinsm4:	push	bc
	push	hl
	push	de
	ld	b,(hl)
	ld	hl,xmmvoc-9
	ld	de,9
sinsm3:	add	hl,de
	djnz	sinsm3
	pop	de

	push	hl	;set start brightness
	inc	hl
	inc	hl
	ld	a,(hl)
	ld	(iy+0),a
	pop	hl

	ld	b,9	;move instrument itself
sinsm2:	ld	a,(de)
	ld	c,a
	ld	a,(hl)
	inc	de
	inc	hl
	call	mmout
	djnz	sinsm2
	pop	hl
	inc	hl
	ld	bc,22
	add	iy,bc
	pop	bc
	djnz	sinsm4

	ld	a,0f0h	;initial setting samples
	ld	c,16
	call	fmmout
	ld	a,051h
	inc	c
	call	fmmout
	ld	a,255
	inc	c
	call	fmmout

	ld	a,(xsust)
	and	011000000b
	ld	c,0bdh
	call	mmout
	ld	a,8
	ld	c,18h
	call	mmout
	ld	a,8
	ld	c,19h
	call	mmout
	ret


;*** set initial instruments of the pac ***

sinspa:	ld	hl,xbegvp
	ld	iy,laspl1+21

	ld	b,6
	ld	a,(xsust)
	bit	5,a
	push	af
	jr	nz,sinsp2

	ld	b,9
sinsp2:	ld	c,30h
sinspi:	push	bc
	push	hl
	ld	a,(hl)
	ld	hl,xpasti-2
	add	a,a
	ld	c,a
	ld	b,0
	add	hl,bc
	ld	a,(hl)
	cp	16
	call	nc,sinspo	;original
	rlca
	rlca
	rlca
	rlca
	inc	hl
	ld	b,(hl)
	add	a,b
	ld	bc,22	;counter for brightness
	add	iy,bc
	pop	hl
	pop	bc
	call	pacout	;put instrument data
	inc	hl
	inc	c
	djnz	sinspi
	xor	a	;drums on
	ld	c,0eh
	call	fpcout

	pop	af
	ret	z

	ld	de,xdrvol	;put drumdata
	ld	hl,drmreg
	ld	b,9
setdrm:	ld	c,(hl)
	ld	a,(de)
	call	pacout
	inc	hl
	inc	de
	djnz	setdrm
	ret

sinspo:	push	hl              ;put original fm-pac
	sub	15
	ld	b,a
	ld	hl,xorgp1-8
	ld	de,8
sinpo2:	add	hl,de
	djnz	sinpo2

	push	hl
	inc	hl
	inc	hl
	ld	a,(hl)
	ld	(iy+0),a
	pop	hl

	ld	bc,0800h
sinpo3:	ld	a,(hl)
	call	pacout
	inc	c
	inc	hl
	djnz	sinpo3
	pop	hl
	xor	a
	ret




cntmus:
	di
	ld	hl,0fd9fh
	ld	de,oldint
	ld	bc,5
	ldir
	ld	hl,musint
	ld	(0fda0h),hl
	ld	a,0c3h
	ld	(0fd9fh),a
	ei
	ret


notint:	ld	a,(lasaa)
	ld	b,a
	in	a,(0aah)
	and	01000000b
	cp	b
	jr	z,notin2
	bit	6,a
	jp	nz,notin3
	ld	(lasaa),a
	call	prtoct
	call	filbuf
	ld	hl,main2
	ld	(jpadr),hl
notin2:	ld	a,(naudat)
	or	a
	ret	z
	ld	a,(notval)
	or	a
	ret	z
	dec	a
	ld	(notval),a
	cp	15
	jp	z,plynot
	or	a
	ret	nz
plyno2:	ld	a,(xchip)
	inc	a
	push	af
	bit	0,a
	call	nz,plyomm
	pop	af
	bit	1,a
	call	nz,plyopc
	ret

notin3:
	ld	(lasaa),a
	call	prtlop
	call	filbuf
	ld	hl,main
	ld	(jpadr),hl
	jr	notin2
plyopc:	ld	a,(tfrq)
	ld	c,010h
	call	pacout
	ld	a,(tfrq+1)
	ld	c,020h
	jp	fpcout

filbuf:	ld	hl,0fbf0h
	ld	(0f3fah),hl
	inc	hl
	ld	(0f3f8h),hl
	ld	a,"@"
	ld	(0fbf0h),a
	ret

plyomm:	ld	a,(tfrq+2)
	ld	c,0a0h
	call	mmout
	ld	a,(tfrq+3)
	ld	c,0b0h
	jp	fmmout

plynot:	ld	a,(xchip)
	inc	a
	push	af
	bit	0,a
	call	nz,plynmm
	pop	af
	bit	1,a
	call	nz,plynpc
	ret

plynmm:	call	plyomm
	ld	b,9
	ld	hl,mmrgad
	ld	de,notvcm
plynm2:	ld	a,(de)
	ld	c,(hl)
	call	mmout
	inc	hl
	inc	de
	djnz	plynm2

	ld	a,(tnot)
	ld	hl,pafreq-2
	add	a,a
	ld	e,a
	ld	d,0
	add	hl,de
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	add	hl,hl
	dec	hl
	ld	a,l
	ld	(tfrq+2),a
	ld	c,0a0h
	call	mmout
	ld	a,h
	ld	(tfrq+3),a
	ld	c,0b0h
	set	5,a
	jp	mmout

plynpc:	call	plyopc
	ld	c,030h
	ld	a,(notvcp)
	sla	a
	sla	a
	sla	a
	sla	a
	call	pacout
	ld	b,8
	ld	c,0
	ld	de,notvcp+1
plynp2:	ld	a,(de)
	call	pacout
	inc	de
	inc	c
	djnz	plynp2
	ld	a,(tnot)
	ld	hl,pafreq-2
	add	a,a
	ld	e,a
	ld	d,0
	add	hl,de
	ld	a,(hl)
	ld	(tfrq),a
	ld	c,010h
	call	pacout
	inc	hl
	ld	a,(hl)
	ld	(tfrq+1),a
	ld	c,020h
	set	4,a
	jp	pacout



;*** music interrupt routine ***

musint:	di

	KEYSCAN 7,2
	call	z,setkbf	;aborted with esc

	KEYSCAN 8,0
	call	z,setkbf	;aborted with space?

	call	dopsg
	call	dopit
	call	doeql

	ld	a,(speed)	;speed
	ld	hl,spdcnt
	inc	(hl)
	cp	(hl)
	jp	nz,secint	;maybe almost?
	ld	(hl),0

	ld	a,(equals)
	or	a
	jp	z,eql4	;skip equalizer as off

	ld	hl,(sngadr)
	ld	de,chnwc1
	ld	b,9
eql1:	push	bc
	push	hl
	push	de
	ld	a,(hl)
	or	a
	jr	z,eql2
	cp	97
	jr	nc,eql2
	ld	a,(de)
	or	a
	jr	z,eql2

eql7:	ld	hl,eqldat-2
	ld	a,b
	push	af
	add	a,a
	ld	e,a
	ld	d,0
	add	hl,de
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	call	setrd
	in	a,(c)
	ex	af,af'
	call	setwrt
	ex	af,af'
	ld	hl,blkdt3
	ld	b,(hl)
	or	b
	out	(c),a
	inc	hl
	ld	b,2
	otir
	ld	hl,eqch9-1
	pop	af
	ld	e,a
	ld	d,0
	add	hl,de
	ld	(hl),10

eql2:	pop	de
	pop	hl
	pop	bc
	inc	hl
	inc	de
	djnz	eql1
	ld	a,(de)
	or	a
	jr	z,eql4
	inc	hl
	inc	hl
	ld	a,(hl)
	and	011110000b
	exx
	or	a
	call	nz,eql6
	exx
	ld	a,(hl)
	and	01111b
	or	a
	jr	z,eql4
	ld	a,(chnwcd)
	dec	a
	call	nz,eql8
	jr	eql4

eql6:	ld	a,(chnwcd)
	cp	2
	ret	z

eql5:	ld	hl,0800h + 18 * 10 + 7
	call	setrd
	in	a,(c)
	ex	af,af'
	call	setwrt
	ex	af,af'
	ld	hl,blkdt3
	ld	b,(hl)
	or	b
	out	(c),a
	inc	hl
	ld	b,2
	otir
	ld	a,10
	ld	(eqchd),a
	ret

eql8:	ld	a,(hl)
	and	01111b
	ld	e,a
	ld	d,0
	ld	hl,xdrblk-1
	add	hl,de
	ld	a,(hl)
	or	a
	ret	z
	cp	0100000b
	jp	nc,eql5
	ld	e,a
	ld	a,(xsust)
	bit	5,a
	ret	z
	jp	eql5


eql4:	ld	iy,laspl1	;last played note
	ld	hl,(sngadr)	;songdata adress
	ld	b,9	;number of channels
	ld	de,chnwc1	;stereo settings
intl1:	push	bc
	ld	a,(de)
	or	a
	jp	z,intl3	;channel on...
	ld	a,(hl)
	or	a
	jp	z,intl3	;empty event

	push	de
	push	hl
	cp	97
	jp	c,onevn	;on event
	jp	z,offevt	;off event
	cp	114
	jp	c,chgins	;instrument change
	cp	177
	jp	c,chgvol	;volume change
	cp	180
	jp	c,chgste	;stereo-preset change
	cp	199
	jp	c,lnkevn	;couple notes
	cp	218
	jp	c,chgpit	;pitch bending
	cp	224
	jp	c,chgbrg1	;brightness #1
	cp	231
	jp	c,chgrev	;reverberation
	cp	237
	jp	c,chgbrg2	;brightness #2
	cp	238
	jp	c,susevt
	jp	chgmod

intl2:	pop	hl
	pop	de
intl3:	ld	bc,22
	add	iy,bc

	inc	de
	inc	hl
	pop	bc
	djnz	intl1

	call	mmdrum

	ld	a,(de)
	bit	1,a
	call	nz,pacdrm
	inc	hl
	ld	a,(hl)	;command
	or	a
	jr	z,cmdint
	cp	24
	jp	c,chgtmp
	jp	z,endop2
	cp	28
	jp	c,chgdrs
	call	chgtrs

cmdint:	inc	hl
	ld	(sngadr),hl
endint:
	KEYSCAN 7,4
	call	z,debug          ;aborted with 'stop' 'stop'-> debug
oldint:	ret
	ret
	ret
	ret
	ret

secint:	dec	a
	cp	(hl)
	jr	nz,endint
	ld	a,(step)
	inc	a
	and	01111b
	ld	(step),a
	jr	nz,secin3
	call	posri3

	ld	a,(posmen)
	or	a
	jp	nz,posshw	;put the bar in the patpos menu

secin3:	ld	a,(posmen)
	or	a
	jp	nz,secin2
	ld	a,(step)
	call	wiscl3	;put the beam down
	ld	hl,blkdat
	add	a,a
	ld	c,a
	ld	b,0
	add	hl,bc
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	push	hl
	call	setwrt
	ld	hl,blkdt2
	ld	b,7
	otir
	ld	b,(hl)
	pop	hl
	ld	de,7
	add	hl,de
	call	setrd
	in	a,(c)
	ex	af,af'
	call	setwrt
	ex	af,af'
	or	b
	out	(c),a

secin2:	ld	iy,laspl1	;last played note table
	ld	hl,(sngadr)	;songdata adress
	ld	b,9	;number of channels
	ld	de,chnwc1	;stereo settings
intl4:	push	bc
	ld	a,(hl)
	or	a
	jp	z,intl5
	cp	97
	jp	nc,intl5

	push	hl

	ld	(iy+6),0
	ld	c,a
	push	bc
	ld	a,(de)
	push	af
	and	010b
	call	nz,pacple
	pop	af
	pop	bc
	and	01b
	call	nz,mmple

	pop	hl
intl5:	ld	bc,22
	add	iy,bc

	inc	de
	inc	hl
	pop	bc
	djnz	intl4
	jp	endint
posshw:	call	bepco
	call	posblk
	jp	secin2


mmple:
	ld	a,(tpval)	;transpose value
	add	a,c
	cp	96+48+1
	jr	c,mmpl4
	sub	96	;> 96? then minus 96 (97 -> 1)
	jr	mmpl3
mmpl4:	cp	1+48
	jr	nc,mmpl3
	add	a,96	;< 1? then add 96 (-2 -> 95)
mmpl3:	sub	48
	ld	(iy+0),a	;save note
	ld	hl,pafreq-1
	add	a,a
	add	a,l
	ld	l,a
	jr	nc,mmpl2
	inc	h
mmpl2:	push	de
	ld	d,(hl)
	dec	hl
	ld	e,(hl)
	ex	de,hl
	add	hl,hl
	ld	e,(iy+9)
	ld	a,l
	add	a,e
	add	a,e
	ld	l,a
	dec	hl
	ld	(iy+16),h
	ld	(iy+17),l
	pop	de
	ret

pacple:	ld	a,(tpval)	;transpose value
	add	a,c
	cp	96+48+1
	jr	c,pacpl4
	sub	96	;> 96? then minus 96 (97 -> 1)
	jr	pacpl3
pacpl4:	cp	1+48
	jr	nc,pacpl3
	add	a,96	;< 1? then add 96 (-2 -> 95)
pacpl3:	sub	48
	ld	(iy+5),a	;last played note
	ld	hl,pafreq-1
	add	a,a
	add	a,l
	ld	l,a
	jr	nc,pacpl2
	inc	h
pacpl2:	ld	a,(hl)
	ld	(iy+18),a	;freq rough
	dec	hl
	ld	a,(hl)
	add	a,(iy+9)	;reverb
	ld	(iy+19),a
	ret



onevn:	ld	a,(de)
	push	af
	and	010b
	call	nz,pacpl
	pop	af
	and	01b
	call	nz,mmpl
	jp	intl2

offevt:	ld	(iy+6),0
	ld	a,(de)
	push	af
	and	010b
	call	nz,offpap
offet2:	pop	af
	and	01b
	call	nz,offmmp
	jp	intl2

susevt:	ld	(iy+6),0
	ld	a,(de)
	push	af
	and	010b
	call	nz,suspap
	jr	offet2

chgins:	push	de
	ld	(iy+6),0
	sub	97
	ld	c,a
	ld	a,(de)
	push	af
	push	bc
	and	010b
	call	nz,chpaci
	pop	bc
	pop	af
	and	01b
	call	nz,chmodi
	pop	de
	jp	intl2

chgvol:	push	de
	sub	114
	ld	c,a
	ld	a,(de)
	push	af
	push	bc
	and	010b
	call	nz,chpacv
	pop	bc
	pop	af
	and	01b
	call	nz,chmodv
	pop	de
	jp	intl2

chgbrg1:	sub	224
	jr	chgbrg3
chgbrg2:	sub	230
chgbrg3:	push	de
	ld	c,a
	ld	a,(de)
	push	af
	push	bc
	and	010b
	call	nz,chpacbrg
	pop	bc
	pop	af
	and	01b
	call	nz,chmodbrg
	pop	de
	jp	intl2


chgste:	ld	c,a
	ld	a,(xchip)
	cp	2
	jp	nz,intl2
	call	chstdp
	exx
	call	prtst3
	exx
	jp	intl2

lnkevn:	sub	189
	ld	c,a
	push	bc
	ld	a,(de)
	push	af
	and	010b
	call	nz,chlkpa
	pop	af
	pop	bc
	and	01b
	call	nz,chlkmm
	jp	intl2


chgpit:	sub	208
	ld	(iy+6),1
	ld	(iy+14),a
	rlca		;bit 7,a
	jr	c,chgpi2
	ld	(iy+15),0
	jp	intl2
chgpi2:	ld	(iy+15),0ffh
	ld	a,(de)
	push	af
	and	010b
	call	nz,chpidp
	pop	af
	and	01b
	call	nz,chpidm
	jp	intl2

;-- change reverberation settings --

chgrev:	sub	227
	ld	(iy+9),a
	jp	intl2
chgmod:	ld	a,2
	ld	(iy+6),a
	jp	intl2


; *** position further 2 ***

posri3:	push	af
	ld	a,(xleng)
	inc	a
	ld	b,a
	ld	a,(pos)
	inc	a
	cp	b
	jp	c,posri5
posri4:	ld	a,(xloop)
	cp	255
	jp	z,setkb2
	ld	(pos),a
	jp	pospa3
posri5:	ld	(pos),a

pospa3:	ld	c,a
	ld	b,0
	ld	hl,xpos
	add	hl,bc
	ld	a,(hl)
	ld	(pat),a
	ld	c,a
	ld	e,208
	call	multip
	ld	de,xbegmd-208
	add	hl,de
	ld	(sngadr),hl
	call	prtpat	;beeldopbouw
	call	prtpos
	ld	a,(posmen)
	or	a
	call	z,makpat
	pop	af
	ret


;----- music module routines -----


;-- play note --

mmpl:	ld	a,(iy+17)	;freq fine
	ld	c,(iy+7)	;register
	call	fmmout

	ld	(iy+1),a	;last played freq. fine
	set	4,c	;calculate register
	ld	a,(iy+16)	;frequency rough
	call	fmmout
	set	5,a
	ld	(iy+2),a	;last played frq rough
	jp	fmmout



;-- set note on --

offmmp:	ld	c,(iy+7)
	ld	a,(iy+1)
	call	fmmout
	ld	a,(iy+2)
	set	4,c	;calculate register (8 t-states!)
	and	011011111b	;res 5,a
	ld	(iy+2),a	;last played frq rough
	jp	fmmout

;-- change instrument --

chmodi:	ld	a,c
	push	bc	;change instrument module
	ld	(iy+10),a	;last select instrument number
	ld	b,a
	ld	hl,xmmvoc-9
	ld	de,9
chmoi2:	add	hl,de
	djnz	chmoi2
	pop	bc
	push	hl

	inc	hl	;move brightness
	inc	hl
	ld	a,(hl)
	ld	(iy+20),a

	ld	a,10
	sub	b
	ld	b,a
	ld	hl,mmrgad-9
	ld	de,9
chmoi3:	add	hl,de
	djnz	chmoi3
	pop	de

	ld	b,9	;throw instrument data to audio
chmoi4:	ld	c,(hl)
	ld	a,(de)
	call	fmmout
	inc	hl
	inc	de
	djnz	chmoi4
	ret


;-- change volume --

chmodv:	ld	a,c
	ex	af,af'
	ld	b,(iy+10)
	ld	hl,xmmvoc-6
	ld	de,9
chmov2:	add	hl,de
	djnz	chmov2
	ld	a,(hl)
	and	11000000b
	ld	b,a
	ld	c,(iy+13)
	ex	af,af'
	add	a,b
	jp	fmmout


;-- verander brightness --

chmodbrg:	ld	a,(iy+20)	;required register value
	and	11000000b	;only key scale level
	ld	e,a

	ld	a,(iy+20)
	and	00111111b	;only brightness
	ld	b,a
	ld	a,c	;brightness value
	add	a,b	;add to current brightness

	add	a,e	;add key scale level again
	ld	(iy+20),a
	ld	c,(iy+13)
	dec	c
	dec	c
	dec	c
	jp	fmmout	;and send to msx-audio


;-- change stereo setting --

chstdp:	ld	(iy+6),0
	ld	a,c
	sub	176
	ld	(de),a
	push	af
	and	1
	call	z,moduit
	pop	af
	and	010b
	call	z,msxuit
	ret

;-- linking notes --

chlkmm:	ld	a,(iy+0)	;last played note number.
	add	a,c	;c=link value
	ld	(iy+0),a

	ld	hl,pafreq-1
	add	a,a
	add	a,l
	ld	l,a
	jr	nc,chlkm2
	inc	h
chlkm2:	push	de
	ld	d,(hl)
	dec	hl
	ld	e,(hl)
	ex	de,hl
	add	hl,hl
	dec	hl
	pop	de
	ld	a,h
	ld	(mmfrqs),a
	ld	a,l
	ld	h,(iy+9)
	add	a,h
	add	a,h
	ld	(iy+1),a	;last played freq. fine
	ld	c,(iy+7)	;register
	call	fmmout

	set	4,c	;calculate register (8 t-states!)
	ld	a,(mmfrqs)	;frequency rough
	or	0100000b	;set 5,a
	ld	(iy+2),a	;last played frq rough
	ld	(iy+6),0	;pitch bending on
	jp	fmmout


;-- turn on pitch bending --

chpidm:	ld	h,(iy+2)
	bit	1,h
	ret	nz
	ld	a,h
	and	11111100b
	sub	4
	ld	l,(iy+1)
	res	5,h
	add	hl,hl
	ld	(iy+1),l
	ex	af,af'
	ld	a,h
	and	00000011b
	ld	h,a
	ex	af,af'
	or	h
	ld	(iy+2),a
	ret





;--- drumsamples ---

mmdrum:	ld	a,(de)
	rrca
	jr	nc,nommdr
	ld	a,(hl)
	or	a
	jp	z,mmdru2
	exx
	call	scanfq
	exx

mmdru2:	inc	hl
	ld	a,(hl)
	or	a
	jp	z,mmdru3
	scf
	rla
	ld	c,012h
	call	fmmout
mmdru3:	inc	hl
	ld	a,(hl)
	and	011110000b
	or	a
	ret	z
	srl	a
	srl	a
	srl	a
	srl	a
	exx
	call	mdrblk
	exx
	ld	c,7
	ld	a,1
	call	fmmout
	ld	a,0a0h
	jp	fmmout

nommdr:	inc	hl
	inc	hl
	ret


mdrblk:	add	a,a
	add	a,a
	ld	hl,smpadr-4
	ld	c,a
	ld	b,0
	add	hl,bc

	ld	c,9	;initial adress
	ld	a,(hl)
	call	fmmout
	inc	hl
	ld	a,(hl)
	inc	c
	call	fmmout
	inc	hl
	ld	a,(hl)	;end adress
	inc	c
	call	fmmout
	inc	hl
	ld	a,(hl)
	inc	c
	jp	fmmout





;----- fm-pac routines -----

pacpl:
;-- play note --

	ld	a,(iy+19)	;freq fine
	ld	c,(iy+8)
	call	fpcout

	ld	(iy+3),a	;last played freq. fine
	ld	a,c	;acalculate register
	add	a,010h
	ld	c,a
	ld	a,(iy+18)	;frequency rough
	call	fpcout
	set	4,a
	ld	(iy+4),a	;last played frq rough
	jp	fpcout

;--- turn note on with sustain ---

suspap:	ld	l,0100000b
	jr	offpa2
;--- set note on ---

offpap:	ld	l,0
offpa2:	ld	c,(iy+8)	;register
	ld	a,(iy+3)
	call	fpcout
	ld	a,c	;calculate register
	add	a,010h
	ld	c,a
	ld	a,(iy+4)
	and	011101111b	;res 4,a
	or	l
	ld	(iy+4),a	;last played frq rough
	jp	fpcout


;-- number of instrument --

chpaci:	ld	a,c
	ld	(iy+11),a	;last selected instrument
	dec	a
	add	a,a
	ld	c,a
	ld	b,0
	ld	hl,xpasti
	add	hl,bc
	ld	a,(hl)
	cp	16
	jp	nc,chpaco
	rlca
	rlca
	rlca
	rlca
chpai2:	inc	hl
	ld	c,(hl)
	add	a,c
	ld	c,(iy+12)	;register
	jp	fpcout

chpaco:	exx		;put original fm-pac
	sub	15
	rlca
	rlca
	rlca		;* 8
	ld	b,0
	ld	c,a	;b is nog 0
	ld	hl,xorgp1-8
	add	hl,bc

	push	hl	;move brightness
	inc	hl
	inc	hl
	ld	a,(hl)
	ld	(iy+21),a
	pop	hl

	ld	bc,0800h
chpao3:	ld	a,(hl)
	call	fpcout
	inc	c
	inc	hl
	djnz	chpao3
	exx
	xor	a
	jp	chpai2


;-- number of volumes --

chpacv:	ld	a,c
	srl	a
	srl	a	;devide by 4
	ex	af,af'
	ld	hl,xbegvp
	ld	a,(iy+11)	;instrumentnr

	ld	b,0
	add	a,a
	ld	c,a
	ld	hl,xpasti-2
	add	hl,bc
	ld	a,(hl)
	cp	16
	jr	c,chpcv2
	xor	a	;ld b,0
chpcv2:	rlca
	rlca
	rlca
	rlca
	ld	b,a	;current intrument
	ld	c,(iy+12)	;register
	ex	af,af'
	xor	b
	jp	fpcout

;-- linking nots --

chlkpa:	ld	a,(iy+5)	;last played note njumber
	add	a,c	;c=link change
	ld	(iy+5),a

	ld	hl,pafreq-1	;calculate freq
	add	a,a
	add	a,l
	ld	l,a
	jr	nc,chlkp2
	inc	h
chlkp2:	ld	a,(hl)
	ld	(mmfrqs),a
	dec	hl
	ld	a,(hl)
	add	a,(iy+9)	;reverb
	ld	(iy+3),a	;last played freq. fine
	ld	c,(iy+8)
	call	fpcout

	ld	a,c	;calculate register
	add	a,010h
	ld	c,a
	ld	a,(mmfrqs)	;frequency rough
	or	010000b	;set 4,a
	ld	(iy+4),a	;last played frq rough
	ld	(iy+6),0
	jp	fpcout


;--- change brightness ---

chpacbrg:	ld	a,(iy+11)
	dec	a
	add	a,a
	ld	e,a
	ld	d,0
	ld	hl,xpasti
	add	hl,de
	ld	a,(hl)
	cp	16
	ret	c	;No original? No brightness either!!

	ld	a,(iy+21)	;required register value
	and	11000000b	;only key scale level
	ld	e,a

	ld	a,(iy+21)
	and	00111111b	;only brightness
	ld	b,a
	ld	a,c	;brightness value
	add	a,b	;add to current brightness

	add	a,e	;add key scale level again
	ld	(iy+21),a
	ld	c,2
	jp	fpcout	;and send to msx-audio





;-- change pitch bending --

chpidp:	ld	a,(iy+4)

	bit	0,a
	ret	nz
	dec	a

	ld	(iy+4),a
	ld	a,(iy+3)
	add	a,a
	ld	(iy+3),a
	ret

;-- fm-pac drum --

pacdrm:	ld	a,(hl)
	and	01111b
	or	a
	ret	z
	ld	e,a
	ld	d,0
	push	hl
	ld	hl,xdrblk-1
	add	hl,de
	ld	a,(hl)
	cp	0100000b
	ld	c,a
	call	nc,psgdrm
	pop	hl
	ld	a,(xsust)
	and	0100000b
	ret	z
	ld	a,c
	and	011111b
	ld	c,0eh
	call	fpcout
	set	5,a
	jp	fpcout

psgdrm:	rlca
	rlca
	rlca
	and	0111b
	add	a,a
	ld	e,a
	ld	hl,psgadr-2
	add	hl,de
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	ld	a,(hl)
	ld	(psgcnt),a
	inc	hl
	ld	b,(hl)
	inc	hl
psgl1:	ld	a,(hl)
	out	(0a0h),a
	inc	hl
	ld	a,(hl)
	out	(0a1h),a
	inc	hl
	djnz	psgl1
	ld	a,(hl)
	ld	(psgvol),a
	jp	dopsg2


;-- change tempo --

chgtmp:	push	hl
	and	00011111b
	ld	b,a
	ld	a,25
	sub	b
	ld	(speed),a
	ld	hl,550
	call	setwrt
	ld	a,(speed)
	ld	b,a
	ld	a,25
	sub	b
	call	prtdec	;print speed
	pop	hl
	jp	cmdint


;-- end of a pattern --


endop2:	ld	a,15
	ld	(step),a
	jp	cmdint


;-- change drumset --

chgdrs:	call	chgdrs2
	jp	cmdint

chgdrs2:	push	hl
	sub	25
	add	a,a
	ld	b,a
	add	a,a
	add	a,b	;x 6
	ld	e,a
	ld	d,0
	ld	hl,xdrfrq
	add	hl,de
	ex	de,hl
	ld	hl,drmreg+3
	ld	b,6
chgdrl:	ld	c,(hl)
	ld	a,(de)
	call	fpcout
	inc	hl
	inc	de
	djnz	chgdrl
	pop	hl
	ret

;--- change transpose ---

chgtrs:	cp	31
	ret	c	;status bytes...
	sub	55-48
	ld	(tpval),a
	ret


;----- psg drums -----

dopsg:	ld	a,(psgcnt)
	or	a
	ret	z
	dec	a
	ld	(psgcnt),a
	jr	z,endpsg
dopsg2:	ld	a,8
	out	(0a0h),a
	ld	a,(psgvol)
	sub	2
	ld	(psgvol),a
trbpsg:	nop
	nop
	out	(0a1h),a
	ret
endpsg:	ld	a,7
	out	(0a0h),a
	ld	a,255
	out	(0a1h),a
	ld	a,8
	out	(0a0h),a
	xor	a
	out	(0a1h),a
	ret



;----- pitch bending -----


dopit:	ld	iy,laspl1
	ld	de,chnwc1
	exx
	ld	b,9
	ld	de,22
dopitl:	exx
	ld	a,(iy+6)
	ld	h,a
	or	a
	jp	z,dopit2
	ld	a,(de)
	and	01b
	call	nz,pitmm
	ld	a,(de)
	and	010b
	call	nz,pitpa
dopit2:	inc	de
	exx
	add	iy,de
	djnz	dopitl
	ret



;--- pitch bend module ---

pitmm:	push	hl
	dec	h
	jr	nz,modmm	;modulation
	ld	l,(iy+14)	;pitch bend size
	ld	h,(iy+15)
	ld	c,(iy+1)
	ld	b,(iy+2)	;last played freq
	bit	7,h	;pitch bend down
	jr	nz,pitmm2
	add	hl,hl
	add	hl,bc
	ld	a,b
	and	00000010b
	ld	b,a
pitmm4:	ld	(iy+1),l
	ld	c,(iy+7)	;register
	ld	a,l
	call	fmmout
	ld	a,h
	or	b
	ld	(iy+2),a
	set	4,c	;calculate register (8 t-states!)
	pop	hl
	jp	fmmout

pitmm2:	add	hl,hl
	add	hl,bc
	bit	1,h
	jr	nz,pitmm3
	dec	h
	dec	h
pitmm3:	ld	b,0
	jp	pitmm4


;--- pitch bend fm-pac ---

pitpa:	dec	h
	jr	nz,modpa	;modulation pac
	ld	l,(iy+14)	;pitch bend size
	ld	h,(iy+15)
	ld	c,(iy+3)
	ld	b,(iy+4)	;last played freq
	bit	7,h
	jr	nz,pitpa2
	add	hl,bc
	ld	a,b
	and	00000001b
	ld	b,a
pitpa4:	ld	(iy+3),l
	ld	c,(iy+8)	;register
	ld	a,l
	call	fpcout
	ld	a,c
	add	a,010h
	ld	c,a

	ld	a,h
	or	b
	ld	(iy+4),a
	jp	fpcout

pitpa2:	add	hl,bc
	bit	0,h
	jr	nz,pitpa3
	dec	h
pitpa3:	ld	b,0
	jp	pitpa4

;---- modulation module ----

modmm:	ld	a,h
	add	a,2
	cp	12
	jr	nz,modmm3
	ld	a,2
modmm3:	ld	(iy+6),a
	ld	a,h
	add	a,a
	ld	c,a
	ld	b,0
	ld	hl,modval-2
	add	hl,bc
	ld	c,(hl)
	sla	c
	inc	hl
	ld	b,(hl)
	ld	l,(iy+1)
	ld	h,(iy+2)	;last played freq
	add	hl,bc
	ld	b,0
	jp	pitmm4

;---- modulation pac ----

modpa:	ld	a,(de)
	cp	2
	jr	nz,modpa2
	ld	a,h
	add	a,2
	cp	12
	jr	nz,modpa3
	ld	a,2
modpa3:	ld	(iy+6),a
modpa2:	ld	a,h
	add	a,a
	ld	c,a
	ld	b,0
	ld	hl,modval-2
	add	hl,bc
	ld	c,(hl)
	inc	hl
	ld	b,(hl)
	ld	l,(iy+3)
	ld	h,(iy+4)	;last played freq
	add	hl,bc
	ld	b,0
	jp	pitpa4



;**** stop music ****


stpmus:
	di
	ld	hl,oldint	;put down the old interrupt
	ld	de,0fd9fh
	ld	bc,5
	ldir

	xor	a
	ld	(busply),a
	ld	hl,tempst
	ld	de,chnwc1
	ld	bc,10
	ldir
	call	hltms2	;turn off all channels
	di

	ld	iy,laspl1
	ld	de,22
	ld	b,9
stpms2:	ld	(iy+6),0
	add	iy,de
	djnz	stpms2
	call	prtst3
	call	endpsg
	ei
	ret

hltmus:
	di
	ld	hl,oldint	;put down the old interrupt
	ld	de,0fd9fh
	ld	bc,5
	ldir
hltms2:	ld	de,22
	ld	iy,laspl1
	ld	b,9
hltmsl	call	msxuit	;turn off all channels
	call	moduit
	add	iy,de
	djnz	hltmsl
	call	endpsg
	ei
	ret

msxuit:	ld	c,(iy+8)
	xor	a
	call	pacout
	ld	a,c
	add	a,10h
	ld	c,a
	xor	a
	jp	fpcout

moduit:	ld	c,(iy+7)
	xor	a
	call	mmout
	set	4,c
	jp	fmmout

setkb2:	ld	a,(busply)
	or	a
	jr	z,setkb3
	pop	af
setkb3:	pop	af
setkbf:	ld	a,1
	ld	(plkbuf),a
	ret
debug:	ld	a,0ffh
	ld	(debugd),a
	ld	a,(pos)
	ld	(debgd2),a
	jr	setkbf

doeql:	ld	a,(equals)
	or	a
	ret	z
	ld	hl,eqchd+9
	ld	b,10
doeql1:	push	bc
	push	hl
	ld	a,(hl)
	or	a
	jr	z,doeql2
	dec	a
	ld	(hl),a
	push	af
	ld	hl,eqldat-4
	ld	a,b
	add	a,a
	ld	e,a
	ld	d,0
	add	hl,de
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	call	setrd
	in	a,(c)
	ex	af,af'
	call	setwrt
	pop	af
	ld	b,a
	add	a,a
	add	a,b
	ld	e,a
	ld	d,0
	ld	hl,eqlblk
	add	hl,de
	ld	b,(hl)
	ex	af,af'
	and	011111000b
	or	b
	out	(c),a
	inc	hl
	ld	b,2
	otir
doeql2:	pop	hl
	pop	bc
	dec	hl
	djnz	doeql1
	ret

mmout:	jp	mm2out
fmmout:	jp	mm3out
pacout:	jp	pc2out
fpcout:	jp	pc3out

;--- music module out with waiting time ---

mm2out:	ex	af,af'
	ld	a,c
	out	(0c0h),a
	ex	af,af'
	out	(0c1h),a
	ex	(sp),hl
	ex	(sp),hl
	ret

;--- fm pac out with waiting time ---

pc2out:	ex	af,af'
	ld	a,c
	out	(7ch),a
	ex	af,af'
	out	(7dh),a
	ex	(sp),hl
	ex	(sp),hl
	ret

;--- fast music module out -> make sure data is not send too fast! ---

mm3out:	ex	af,af'
	ld	a,c
	out	(0c0h),a
	ex	af,af'
	out	(0c1h),a
	ret

;--- fast fm-pac out -> make sure data is not send too fast! ---

pc3out:	ex	af,af'
	ld	a,c
	out	(7ch),a
	ex	af,af'
	out	(7dh),a
	ret

;--- music module out turbo-r ---

mmrout:	ex	af,af'
	call	trbwt	;wait time for turbo-r
	ld	a,c
	out	(0c0h),a
	in	a,(0e6h)	;save counter
	ld	(rtel),a
	ex	af,af'
	out	(0c1h),a
	ret

;--- fm-pac out turbo-r ---

parout:	ex	af,af'
	call	trbwt	;wait time for turbo-r
	ld	a,c
	out	(7ch),a
	in	a,(0e6h)	;save counter
	ld	(rtel),a
	ex	af,af'
	out	(7dh),a
	ret
trbwt:	push	bc
	ld	a,(rtel)	;wait time for turbo-r
	ld	b,a
trbwl:	in	a,(0e6h)
	sub	b
	cp	7
	jr	c,trbwl
	pop	bc
	ret


voices:	push	hl
	call	getint
	call	savscr
	call	z80
	ld	a,1
	call	subs2
	call	r800d
	call	resscr
	call	makpat
	call	setint
	pop	hl
	ret

disk:	call	getint
	call	savscr
	call	z80
	ld	a,1
	call	subs3
	call	r800d
	call	resscr
	jp	setset


drmset:	ld	a,3
	jr	subjmp
setrev:	ld	a,4
	jr	subjmp

	IF	PRIVE
usertest:	ld	a,5
	jr	subjmp
sptest:	ld	a,6
	jr	subjmp
	ENDIF
mod_depth:	ld	a,7
	jr	subjmp
chghertz:	ld	a,8
	jr	subjmp


samplr:	ld	a,1
	jr	subjmp

info:	call	tabtoets
	ret	z

	ld	a,2
subjmp:	push	hl
	push	af
	call	wiscol
	call	getint
	call	savscr
	pop	af	;jump value
	call	subs
	call	resscr
	call	makpat
	call	setint
	pop	hl
	ret


;--- function key settings ---

setfkeys:	ld	hl,0f87fh
	ld	c,F1
	ld	b,10	;number of keys
setfkeyslus:	push	bc
	ld	(hl),c
	inc	hl
	ld	b,15
setfkeyslp:	ld	(hl),0
	inc	hl
	djnz	setfkeyslp
	pop	bc
	inc	c
	djnz	setfkeyslus
	ret



;*** key handler ***

keyhan:	call	getkey
keyhn2:	ld	c,a
keyhnl:	ld	a,(ix+0)
	or	a
	ret	z
	ld	l,(ix+1)
	ld	h,(ix+2)
	cp	c
	jr	z,keyhne
	inc	ix
	inc	ix
	inc	ix
	jr	keyhnl
keyhne:	jp	(hl)

z80:	ld	a,(02dh)
	cp	3
	IF	MSX2SIM
	ret
	ELSE
	ret	c
	ENDIF
	ld	a,0h	;do not turn off the light!
	jp	0180h

r800d:	ld	a,(02dh)
	cp	3
	IF	MSX2SIM
	ret
	ELSE
	ret	c
	ENDIF
	ld	a,082h
	bios	0180h
	push	bc
	ld	bc,02000h
r800l:	dec	bc
	ld	a,b
	or	c
	jr	nz,r800l
	pop	bc
	ret
setint:	di
	ld	hl,0fd9fh
	ld	de,savint
	ld	bc,5
	ldir
	ld	hl,notint
	ld	a,0c3h
	ld	(0fd9fh),a
	ld	(0fda0h),hl
	ei
	ret

getint:	di
	ld	hl,savint
	ld	de,0fd9fh
	ld	bc,5
	ldir
	ei
	ret


maind2:	MENU	44,eoctd	;"," edit octave down
	MENU	".",eoctu         ;edit octave up
	MENU	"-",eoctd         ;edit octave down
	MENU	"+",eoctu         ;edit octave up

maindt:	MENU	RETURN,lasinp	;return
	MENU	DEL,inpemp	;delete
	MENU	CR,curri	;cursor right
	MENU	CL,curlef	;cursor left
	MENU	CU,curup	;cursor up
	MENU	CD,curdow	;cursor down
	MENU	TAB,curtab	;tab key
	MENU	24,chip	;chip change
	MENU	HOME,mbhome	;to pos 0
	MENU	SPACE,setpos	;set pattern on position
	MENU	F1,play	;play song
	MENU	F2,patpl	;play pattern
	MENU	F3,samplr	;to sampler
	MENU	F4,voices	;to voicemenu
	MENU	F5,disk	;to diskmenu
	MENU	F6,posedt	;position editor
	MENU	F7,clrsng	;delete song
	MENU	F8,drmset	;fm-drumsetmenu
	MENU	F9,stereo	;stereo settings
	MENU	F10,setrev	;detune settings
	MENU	"N"-64,edname     ;edit songname
	MENU	"A"-64,addpos     ;put pattern on 1st free position
	MENU	"Z"-64,chghertz   ;change hertz mode
	MENU	"O"-64,sweql      ;switch output indicator
	MENU	"P"-64,coppat     ;copy pattern
	MENU	"R"-64,ramdsk     ;ramdisk
	MENU	"B"-64,begblk     ;marke begin block
	MENU	"E"-64,endblk     ;marke end block
	MENU	"D"-64,remblk     ;remove blockmarks
	MENU	"C"-64,echcop     ;copy channel within pattern
	MENU	"F"-64,numchn     ;number of msx music channels
	MENU	"S"-64,scansw     ;scanning on/off
	MENU	"T"-64,tempo      ;set tempo
	MENU	"W"-64,chonof     ;channel on/off
	MENU	"I"-64,info       ;song info

	IF	PRIVE
	MENU	"!",sptest        ;stack pointer test
	MENU	"?",usertest      ;user test
	ENDIF

	MENU	"L"-64,chloop     ;set loop position
	MENU	44,notdw2	;"," note/octave down
	MENU	".",notp2         ;note/octave up
	MENU	"-",notdow        ;note down
	MENU	"+",notup         ;note up
	MENU	"<",octdow        ;octave odown
	MENU	">",octup         ;octave up


prodat:	db	"Q2W3ER5T6Y7U"       ;"toetsen"
	db	"ZSXDCVGBHNJM"

blddt1:	db	24,0feh,60,23,18,0feh,17,23,25
	db	22,"  Songname:",0feh,49,32,22," Position:",0feh,7,32,22
	db	20,23,23,18,0feh,57,23,19," Pattern :",0feh,7,32,22
blddt2:	db	22,"  ",22,"CH1 CH2 CH3 CH4 CH5 CH6 CH7 CH8 CH9 FRQ VLM SAM DRM  CMD "
	db	22," Last pos:       ",22
	db	20,23,23,21,0feh,57,23,21,0feh,17,23,19
	db	22,"01",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" Chip :",0feh,10,32,22
	db	22,"02",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" Tempo:",0feh,10,32,22
	db	22,"03",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" MSX-MUSIC chn:",0feh,2,32,22
	db	22,"04",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",20
	db	0feh,17,23,19
	db	22,"05",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH1:",0feh,12,32,22
	db	22,"06",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH2:",0feh,12,32,22
	db	22,"07",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH3:",0feh,12,32,22
	db	22,"08",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH4:",0feh,12,32,22
	db	22,"09",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH5:",0feh,12,32,22
	db	22,"10",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH6:",0feh,12,32,22
	db	22,"11",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH7:",0feh,12,32,22
	db	22,"12",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH8:",0feh,12,32,22
	db	22,"13",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" CH9:",0feh,12,32,22
	db	22,"14",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" DRM:",0feh,12,32,22
	db	22,"15",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",20
	db	0feh,17,23,19
	db	22,"16",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   "
	db	22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"   ",22,"     ",22
	db	" Loop pos:       ",22
	db	20,23,23,17,0feh,57,23,17,0feh,17,23,19
	db	22,0feh,78,32,22
	db	26,0feh,78,23,27
	db	0


posscr:	db	24,0feh,11,23,18,0feh,5,23,18,0feh,42,23,18,0fdh
	db	22,0feh,11,32,22," POS ",22,"   0   1   2   3   4   5   6   7   8   9  ",22,0fdh
	db	22,0feh,11,32,20,0feh,5,23,21,0feh,42,23,19,0fdh
	db	22,0feh,11,32,22," 000 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 010 ",22,0feh,42,32,20,0fdh
	db	22,0feh,11,32,22," 020 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 030 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 040 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 050 ",22,0feh,42,32,20,0fdh
	db	22,0feh,11,32,22," 060 ",22,0feh,42,32,22,0fdh
	db	22,"  PATTERN/ ",22," 070 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 080 ",22,0feh,42,32,22,0fdh
	db	22,"  POSITION ",22," 090 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 100 ",22,0feh,42,32,22,0fdh
	db	22,"   EDITOR  ",22," 110 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 120 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 130 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 140 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 150 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 160 ",22,0feh,42,32,20,0fdh
	db	22,0feh,11,32,22," 170 ",22,0feh,42,32,22,0fdh
	db	22,0feh,11,32,22," 180 ",22,0feh,42,32,20,0fdh
	db	22,0feh,11,32,22," 190 ",22,0feh,42,32,22,0fdh
	db	26,0feh,11,23,17,0feh,5,23,17,0feh,42,23,17,0fdh,0


notdat:	db	"C 1","C#1","D 1","D#1","E 1","F 1","F#1","G 1","G#1","A 1","A#1","B 1"
	db	"C 2","C#2","D 2","D#2","E 2","F 2","F#2","G 2","G#2","A 2","A#2","B 2"
	db	"C 3","C#3","D 3","D#3","E 3","F 3","F#3","G 3","G#3","A 3","A#3","B 3"
	db	"C 4","C#4","D 4","D#4","E 4","F 4","F#4","G 4","G#4","A 4","A#4","B 4"
	db	"C 5","C#5","D 5","D#5","E 5","F 5","F#5","G 5","G#5","A 5","A#5","B 5"
	db	"C 6","C#6","D 6","D#6","E 6","F 6","F#6","G 6","G#6","A 6","A#6","B 6"
	db	"C 7","C#7","D 7","D#7","E 7","F 7","F#7","G 7","G#7","A 7","A#7","B 7"
	db	"C 8","C#8","D 8","D#8","E 8","F 8","F#8","G 8","G#8","A 8","A#8","B 8"
empevt_txt:	db	" - "
offevt_txt:	db	"OFF"
susevt_txt:	db	"SUS"
modevt_txt:	db	"MOD"
ontxt:	db	"ON "
volevt_txt:	db	"V  "
insevt_txt:	db	"I  "
stereoevt_txt:	db	"S  "
dtnevtp_txt:	db	"T+ "
dtnevtm_txt:	db	"T- "
lnkevtp_txt:	db	"L+ "
lnkevtm_txt:	db	"L- "
pitevtp_txt:	db	"P+ "
pitevtm_txt:	db	"P- "
brgevtp_txt:	db	"X- "
brgevtm_txt:	db	"X+ "
tmpevt_txt:	db	"TMP  "
tmpevt2_txt:	db	"TMP  "
dsetevt_txt:	db	"DSET "
dsetevt2_txt:	db	"DSET "
statevt_txt:	db	"STAT "
statevt2_txt:	db	"STAT "
trsevtp_txt:	db	"TR+  "
trsevtn_txt:	db	"TR-  "
trsevt_txt2:	db	"TR   "
empevt2_txt:	db	"  -  "
endopevt_txt:	db	"ENDOP"

savint:	db	0c9h,0c9h,0c9h,0c9h,0c9h

;psg drums

pbddat:	db	5,3,0,179,1,6,7,0feh,17
ps1dat:	db	6,2,6,013h,7,0f7h,15
ps2dat:	db	6,2,6,009h,7,0f7h,15
pb1dat:	db	4,3,0,173,1,1,7,0feh,15
pb2dat:	db	4,3,0,72,1,0,7,0feh,15
ph1dat:	db	5,2,6,006h,7,0f7h,15
ph2dat:	db	5,2,6,001h,7,0f7h,14

;psg adress

psgadr:	dw	pbddat,ps1dat,ps2dat,pb1dat,pb2dat,ph1dat,ph2dat
psgvol:	db	0

;frequencies for samples

mmpdt1:	db	005h,022h,005h,06ah,005h,0bah,006h,012h,006h,073h,006h,0d3h,007h,03bh,007h,0abh
	db	008h,01bh,008h,09ch,009h,024h,009h,0ach,00ah,03dh,00ah,0d5h,00bh,07dh,00ch,02dh
	db	00ch,0e6h,00dh,0a6h,00eh,07fh,00fh,057h,010h,03fh,011h,038h,012h,040h,013h,051h
	db	014h,07ah,015h,0aah,016h,0fbh,018h,05bh,019h,0c4h,01bh,04dh,01ch,0feh,01eh,0b6h
	db	020h,077h,022h,070h,024h,081h,026h,0aah,028h,0fch,02bh,05dh,02dh,0f6h,030h,0afh
	db	033h,089h,036h,0a2h,039h,0f4h,03dh,066h,040h,0f7h,044h,0e1h,049h,00bh,04dh,04dh
	db	051h,0f0h,056h,0b2h,05bh,0ech,061h,05fh,067h,01ah,06dh,045h,073h,0e8h,07ah,0cbh
	db	081h,0f0h,089h,0c4h,092h,018h,09ah,0a4h


;		r(1) r(2) r(3) r(4) r(5) r(6) r(7) r(8) r(11)

mmrgad:	db	020h,023h,040h,043h,060h,063h,080h,083h,0c0h ;k1
	db	021h,024h,041h,044h,061h,064h,081h,084h,0c1h ;k2
	db	022h,025h,042h,045h,062h,065h,082h,085h,0c2h ;k3
	db	028h,02bh,048h,04bh,068h,06bh,088h,08bh,0c3h ;k4
	db	029h,02ch,049h,04ch,069h,06ch,089h,08ch,0c4h ;k5
	db	02ah,02dh,04ah,04dh,06ah,06dh,08ah,08dh,0c5h ;k6
	db	030h,033h,050h,053h,070h,073h,090h,093h,0c6h ;k7
	db	031h,034h,051h,054h,071h,074h,091h,094h,0c7h ;k8
	db	032h,035h,052h,055h,072h,075h,092h,095h,0c8h ;k9


drmreg:
parga2:	db	036h,037h,038h,016h,026h,017h,027h,018h,028h

	;	c 1       c#1	  d 1       d#1	     e 1       f 1       f#1
	;	g 1       g#1	  a 1       a#1	     b 1

pafreq:	db	0adh,000h,0b7h,000h,0c2h,000h,0cdh,000h,0d9h,000h,0e6h,000h,0f4h,000h
	db	003h,001h,012h,001h,022h,001h,034h,001h,046h,001h
	db	0adh,002h,0b7h,002h,0c2h,002h,0cdh,002h,0d9h,002h,0e6h,002h,0f4h,002h
	db	003h,003h,012h,003h,022h,003h,034h,003h,046h,003h
	db	0adh,004h,0b7h,004h,0c2h,004h,0cdh,004h,0d9h,004h,0e6h,004h,0f4h,004h
	db	003h,005h,012h,005h,022h,005h,034h,005h,046h,005h
	db	0adh,006h,0b7h,006h,0c2h,006h,0cdh,006h,0d9h,006h,0e6h,006h,0f4h,006h
	db	003h,007h,012h,007h,022h,007h,034h,007h,046h,007h
	db	0adh,008h,0b7h,008h,0c2h,008h,0cdh,008h,0d9h,008h,0e6h,008h,0f4h,008h
	db	003h,009h,012h,009h,022h,009h,034h,009h,046h,009h
	db	0adh,00ah,0b7h,00ah,0c2h,00ah,0cdh,00ah,0d9h,00ah,0e6h,00ah,0f4h,00ah
	db	003h,00bh,012h,00bh,022h,00bh,034h,00bh,046h,00bh
	db	0adh,00ch,0b7h,00ch,0c2h,00ch,0cdh,00ch,0d9h,00ch,0e6h,00ch,0f4h,00ch
	db	003h,00dh,012h,00dh,022h,00dh,034h,00dh,046h,00dh
	db	0adh,00eh,0b7h,00eh,0c2h,00eh,0cdh,00eh,0d9h,00eh,0e6h,00eh,0f4h,00eh
	db	003h,00fh,012h,00fh,022h,00fh,034h,00fh,046h,00fh

;--- Smart data table structured as follows: --

;    - last played note module		01
;    - last played frequency module	02
;    - last played frequency fm-pac	02
;    - last played note fm-pac		01
;    - pitch bending on/off		01
;    - frequency register module		01
;    - frequency register fm-pac		01
;    - start reverbs			01
;    - last selected instrument module 	01
;    - last selected instrument fm-pac 	01
;    - instr/vol register fm-pac		01
;    - vol register module		01
;    - pitch bending grootte		02
;    - next note freq module		02
;    - next note freq fm-pac		02
;    - current brightness msx-audio		01
;    - current brightness msx-music		01
;				--
;    Total:				22

laspl1:	db	0,0,0,0,0,0,0,0a0h,10h,0,0,0,030h,043h,0,0,0,0,0,0,0,0;ch1
	db	0,0,0,0,0,0,0,0a1h,11h,0,0,0,031h,044h,0,0,0,0,0,0,0,0;ch2
	db	0,0,0,0,0,0,0,0a2h,12h,0,0,0,032h,045h,0,0,0,0,0,0,0,0;ch3
	db	0,0,0,0,0,0,0,0a3h,13h,0,0,0,033h,04bh,0,0,0,0,0,0,0,0;ch4
	db	0,0,0,0,0,0,0,0a4h,14h,0,0,0,034h,04ch,0,0,0,0,0,0,0,0;ch5
	db	0,0,0,0,0,0,0,0a5h,15h,0,0,0,035h,04dh,0,0,0,0,0,0,0,0;ch6
	db	0,0,0,0,0,0,0,0a6h,16h,0,0,0,036h,053h,0,0,0,0,0,0,0,0;ch7
	db	0,0,0,0,0,0,0,0a7h,17h,0,0,0,037h,054h,0,0,0,0,0,0,0,0;ch8
	db	0,0,0,0,0,0,0,0a8h,18h,0,0,0,038h,055h,0,0,0,0,0,0,0,0;ch9

tpval:	db	48
rtel:	db	0
modval:	dw	1,2,2,-2,-2,-1,-2,-2,2,2

msxptx:	db	"MSX-PSG  ",0
msxdtx:	db	"MUSIC+PSG",0
msxmtx:	db	"MSX-MUSIC",0
msxatx:	db	"MSX-AUDIO",0
msxbtx:	db	"BOTH     ",0
msxstx:	db	"STEREO   ",0
msxotx:	db	"OFF      ",0
nontxt:	db	"NONE    ",0

papotx:	db	"Pattern set on position.",0
paintx:	db	"Position inserted.",0
padltx:	db	"Position deleted.",0
playt2:	db	"Playing song.",0
playt3:	db	"Playing pattern.",0
temptx:	db	"Current tempo:    Enter new tempo (1-23).",0

	IF	PRIVE
looptx:	db	"Set loop",0
loptx2:	db	"Error!",0
	ELSE
looptx:	db	"Set loop position.",0
loptx2:	db	"Loop pos. cannot be higher than last pos.!",0
	ENDIF

stertx:	db	"Modify stereo presets.",0
nametx:	db	"Enter songname.",0
clrsnt:	db	"Are you sure you want to clear all songdatas (y/n)?",0
spatxt:	db	"Enter source pattern (1-76):",0
dpatxt:	db	"Enter destination pattern (1-76):",0
npatxt:	db	"Enter number of patterns:",0
surtxt:	db	"Are you sure (y/n)?",0
suctxt:	db	"Copy succeeded.",0
imptxt:	db	"Copy impossible!",0
nptxt:	db	"Not possible!",0
schntx:	db	"Enter source channel (1-9):",0
dchntx:	db	"Enter destination channel (1-9):",0
echntx:	db	"Enter number of echo steps (0-4):",0
cchntx:	db	"Enter first channel (1-9):",0
cch2tx:	db	"Enter second channel (1-9):",0
eqltxt:	db	"Output indicator switched",0
nautxt:	db	"Note audition switched",0
ramtxt:	db	"RAM Load or Save (L/S)?",0
scntxt:	db	"Scanning songdata for settings...",0
scntx2:	db	"Settings scan is switched",0
coctxt:	db	"Edit octaves:"
loptx3:	db	"Loop pos:        "
emptx:	db	0feh,74," ",0
insbuf:	ds	15
copwrd:	db	"Copy block. ",0
delwrd:	db	"Delete block. ",0
excwrd:	db	"Exhange channels. ",0

temreg:	dw	0
chnwc1:	db	0
chnwc2:	db	0
chnwc3:	db	0
chnwc4:	db	0
chnwc5:	db	0
chnwc6:	db	0
chnwc7:	db	0
chnwc8:	db	0
chnwc9:	db	0
chnwcd:	db	0
tempst:	db	3,3,3,3,3,3,3,3,3,3
trever:	db	0,0,0,0,0,0,0,0,0
chofdt:	db	1,1,1,1,1,1,1,1,1,1

pos:	db	0
pat:	db	1
lasno2:	db	0
lasno3:	db	0
lasno4:	db	0
lasno5:	db	0
lasno6:	db	0
lasnot:	db	0
temnum:	db	0,0,0
addat:	dw	1
sngadr:	dw	xbegmd
mmfrqs:	dw	0
speed:	db	0
spdcnt:	db	0

eqchd:	db	0
eqch9:	db	0
eqch8:	db	0
eqch7:	db	0
eqch6:	db	0
eqch5:	db	0
eqch4:	db	0
eqch3:	db	0
eqch2:	db	0
eqch1:	db	0

step:	db	0
blkdat:	dw	0800h + 5*10
	dw	0800h + 6*10
	dw	0800h + 7*10
	dw	0800h + 8*10
	dw	0800h + 9*10
	dw	0800h + 10*10
	dw	0800h + 11*10
	dw	0800h + 12*10
	dw	0800h + 13*10
	dw	0800h + 14*10
	dw	0800h + 15*10
	dw	0800h + 16*10
	dw	0800h + 17*10
	dw	0800h + 18*10
	dw	0800h + 19*10
	dw	0800h + 20*10

blkdt2:	db	127,255,255,255,255,255,255,011111000b

eqlblk:	db	0,0,0
	db	0,010b,0
	db	0,0111b,0
	db	0,01111b,010000000b
	db	0,011111b,011000000b
	db	0,0111111b,011100000b
	db	0,01111111b,011110000b
	db	0,255,011111000b
	db	01b,255,011111100b
blkdt3:	db	3,255,254

stblkd:	dw	0800h+ 9*10+7
	dw	0800h+10*10+7
	dw	0800h+11*10+7
	dw	0800h+12*10+7
	dw	0800h+13*10+7
	dw	0800h+14*10+7
	dw	0800h+15*10+7
	dw	0800h+16*10+7
	dw	0800h+17*10+7
	dw	0800h+18*10+7
nablkd:	db	0111b,255,255,255,255,011111000b
plkbuf:	db	0
plbuf2:	db	0
stbcnt:	db	0
mmbuf:	dw	0
pacbuf:	dw	0

srcpat:	db	0
despat:	db	0
numpat:	db	0
schbuf:	db	0

	dw	0800h + 18 * 10 + 7
eqldat:	dw	0800h + 17 * 10 + 7
	dw	0800h + 16 * 10 + 7
	dw	0800h + 15 * 10 + 7
	dw	0800h + 14 * 10 + 7
	dw	0800h + 13 * 10 + 7
	dw	0800h + 12 * 10 + 7
	dw	0800h + 11 * 10 + 7
	dw	0800h + 10 * 10 + 7
	dw	0800h + 9 * 10 + 7
equals:	db	1
spbuf:	dw	0
stvrm:	dw	0
posxco:	db	1
posyco:	db	1
pospag:	db	0
posdat:	db	011110000b,00001111b
debugd:	db	0
debgd2:	db	0
posmen:	db	0
maxget:	db	0
edtvoc:	db	001h,001h,04fh,000h,0b3h,0d3h,07ch,077h,008h
edtvc2:	db	3,001h,001h,04fh,004h,0b3h,0d3h,07ch,077h
user:	dw	668
tfrq:	db	0,0,0,0
tnot:	db	0
notval:	db	0
busply:	db	0
pospld:	db	0
nambuf	ds	40,32
lasaa:	db	0
jpadr:	dw	main
octave:	db	0
begblp:	db	0
endblp:	db	0
begblx:	db	0
endblx:	db	0
begbly:	db	0
endbly:	db	0
curxco:	db	0
txco:	db	0
txco2:	db	0
bchkvl:	db	0
bchkv2:	db	0
psgcnt:	db	0
psgpnt:	dw	0
trsopslag:	db	0

;	samples adressen

smpadd:	dw	00000h,003ffh	;1
	dw	00400h,007ffh	;2
	dw	00800h,00bffh	;3
	dw	00c00h,00fffh	;4
	dw	01000h,013ffh	;5
	dw	01400h,017ffh	;6
	dw	01800h,01bffh	;7
	dw	01c00h,01fffh	;8
	dw	00000h,007ffh	;9
	dw	00800h,00fffh	;10
	dw	01000h,017ffh	;11
	dw	01800h,01fffh	;12
	dw	00000h,00fffh	;13
	dw	01000h,01fffh	;14

einde:
	end