*	MIDI-Keyboard
*	(c) Dieter Bruns
*	Lilienweg 131
*	W-2725 Hemsbünde
*       E-Mail: DBRUNS@BDB.ZER

*	Sprache: Assembler (z.B. A68k)

*	include hardware/custom.i
serdatr		equ	$018
serdat		equ	$030
serper		equ	$032
intena		equ	$09A
intreq		equ	$09C
*

*	include intuition/intuition.i
GADGHCOMP	equ	$0000
GADGHIMAGE	EQU	$0002
RELVERIFY	equ	$0001
STRINGRIGHT	equ	$0400
LONGINT		equ	$0800
BOOLGADGET	equ	$0001
STRGADGET	equ	$0004
MOUSEBUTTONS	equ	$00000008
GADGETUP	equ	$00000040
CLOSEWINDOW	equ	$00000200
RAWKEY		equ	$00000400
WINDOWDRAG	equ	$0002
WINDOWDEPTH	equ	$0004
WINDOWCLOSE	equ	$0008
ACTIVATE	equ	$1000
RMBTRAP		equ	$00010000
NOCAREREFRESH	equ	$00020000
WBENCHSCREEN	equ	$0001
wd_RPort	equ	$32
wd_UserPort	equ	$56
im_Class	equ	$14
im_Code		equ	$18
im_IAddress	equ	$1c
RP_JAM1		equ	0
RP_JAM2		equ	1

MENUUP		equ	$E9
MENUDOWN	equ     $69
SELECTUP	equ	$E8
SELECTDOWN	equ	$68
*

custom  	equ	$dff000
NULL		equ	0
blau		equ	0
orange		equ	3
AMax		equ	10
KOX1		equ	180
XO		equ	5
XOG		equ	XO
XOH		equ	XO+7
FX		equ	5
YO		equ	27
YOA		equ	YO+1
XU		equ	XO+57*11
YU		equ	YO+25
YUA		equ	YU-1
LOW		equ	12		;unterste Midi Notennr.
GY1		equ	14
TMPRASSIZE	equ	4480
KSC		equ	0+XO
KSCIS		equ	8+XO
KSD		equ	16+XO
KSDIS		equ	19+XO
KSE		equ	26+XO
KSF		equ	33+XO
KSFIS		equ	41+XO
KSG		equ	49+XO
KSGIS		equ	52+XO
KSA		equ	60+XO
KSAIS		equ	63+XO
KSH		equ	71+XO
KSOFF		equ	77
YUH		equ	YO+14
YUG		equ	YUH+2

;2.0 Border für Stringgadgets max. 999
STRBOX20	MACRO
        dc.w	-4,-2
	dc.b	0,blau,RP_JAM1,9
	dc.l    W_STR_Vectors\@,S_STR_Border\@
W_STR_Vectors\@
	dc.w    \1-1,0,0,0,0,\2,\1-2,\2,\1-2,1,1,1,1,\2-1,\1-3,\2-1,\1-3,1
S_STR_Border\@
	dc.w	-4,-2
	dc.b	0,blau,RP_JAM1,10
	dc.l	S_STR_Vectors\@,NULL
S_STR_Vectors\@
	dc.w    \1,\2,\1,0,\1-1,1,\1-1,\2,1,\2,2,\2,2,1,\1-3,1,3,1,3,\2-2
		ENDM

;2.0 Border für Boolgadgets max. 999
BOOLBOX20	MACRO
calc\@	dc.w	-1,\2-1
	dc.b	0,blau,RP_JAM1,5
	dc.l    W_BOOL_Vectors\@,S_BOOL_Border\@
W_BOOL_Vectors\@
	dc.w	0,0,0,0-\2,\1-1,0-\2,-1,0-\2,-1,0
S_BOOL_Border\@
	dc.w	-1,\2-1
	dc.b	0,blau,RP_JAM1,5
	dc.l    S_BOOL_Vectors\@,NULL
S_BOOL_Vectors\@
	dc.w	0,0,\1,0,\1,0-\2,\1-1,1-\2,\1-1,-1
	IFND	BOOL_SEL
BOOL_SEL	equ	*-calc\@
	ENDC

S_BOOL_SEL_Border\@
	dc.w	-1,\2-1
	dc.b	0,blau,RP_JAM1,5
	dc.l    W_BOOL_Vectors\@,W_BOOL_SEL_Border\@
W_BOOL_SEL_Border\@
	dc.w	-1,\2-1
	dc.b	0,blau,RP_JAM1,5
	dc.l    S_BOOL_Vectors\@,NULL
	ENDM


	SECTION code,CODE
	movem.l	d0/a0,-(sp)		;save Para
	sub.l	a1,a1
	move.l	4,a6
	jsr	-294(a6)		;FindTask
	move.l	d0,a2
	tst.l	$ac(a2)			;Process.pr_CLI
	beq.s	Workbench
; CLI
	movem.l	(sp)+,d0/a0		;CLI-Para
	bra	start
Workbench
	lea	$5c(a2),a0		;Process.pr_MsgPort
	jsr	-384(a6)		;WaitPort
	lea	$5c(a2),a0		;Process.pr_MsgPort
	jsr	-372(a6)		;GetMsg
	lea	WBmsg(pc),a0
	move.l	d0,(a0)			;save WBmsg
	movem.l	(sp)+,d0/a0
start
	bsr.s	_main			;Hauptprog.
	move.l	d0,-(sp)
	move.l	WBmsg(pc),d0
	beq.s	ende			;CLI-Start
	jsr	-132(a6)		;Forbid
	move.l	WBmsg(pc),a1
	jsr	-378(a6)		;ReplyMsg
ende
	move.l	(sp)+,d0
	rts

; Startup WB Variable
WBmsg	dc.l	0
MidiVar	dc.b	"MIDI-Kanal",0
		cnop 0,2

_main
	move.l	a0,a2			;CLI-Parastring
	move.l	d0,d4			;len

****	midiinit
	move.w	#114,custom+serper	;MIDI-Baud
	move.l	#custom,a4
	move.w	#$100,d5		;StopBit
****
	move.l	4,a6
	lea	intname(pc),a1
	moveq	#0,d0
	jsr	-552(a6)		;OpenLibrary
	tst.l	d0
	beq	fail
	lea	_IntuitionBase(pc),a0
	move.l	d0,(a0)

	lea	dosname(pc),a1
	moveq	#0,d0
	jsr	-552(a6)		;OpenLibrary
	tst.l	d0
	beq	closeint
	lea	_DOSBase(pc),a0
	move.l	d0,(a0)

	lea	gfxname(pc),a1
	moveq	#0,d0
	jsr	-552(a6)		;OpenLibrary
	tst.l	d0
	beq	closeDOS
	lea	_GfxBase(pc),a0
	move.l	d0,(a0)

	move.l	d0,a0
	move.w  20(a0),d1		;lib_version
	cmp.w	#37,d1
	bge	set20colors             ;WB2.0

	lea	weiss(pc),a0
	move.b	#1,(a0)
	lea	schwarz(pc),a0
	move.b	#2,(a0)
	bra     do_color
set20colors
	lea	weiss(pc),a0
	move.b	#2,(a0)
	lea	schwarz(pc),a0
	move.b	#1,(a0)
do_color
	moveq	#0,d0
	moveq	#0,d1
	lea	weiss(pc),a0
	move.b	(a0),d0
	lea	schwarz(pc),a0
	move.b	(a0),d1

	lea	colortab(pc),a0
        move.w	d0,(a0)+		;weiss
	move.w	d1,(a0)+                ;schwarz
        move.w	d0,(a0)+		;weiss
	move.w	d1,(a0)+                ;schwarz
        move.w	d0,(a0)+		;weiss
        move.w	d0,(a0)+		;weiss
	move.w	d1,(a0)+                ;schwarz
        move.w	d0,(a0)+		;weiss
	move.w	d1,(a0)+                ;schwarz
        move.w	d0,(a0)+		;weiss
	move.w	d1,(a0)+                ;schwarz
        move.w	d0,(a0)+		;weiss

	lea	GText1(pc),a0
	move.b	d1,(a0)
	lea	GText2(pc),a0
	move.b	d1,(a0)
	lea	GText3(pc),a0
	move.b	d1,(a0)
	lea	IText2(pc),a0
	move.b	d1,(a0)
	lea	IText3(pc),a0
	move.b	d1,(a0)
	lea     NewWindowStructure1(pc),a0
	move.b	d0,9(a0)
	lea	IText5(pc),a0
	move.b	d0,(a0)

	lea	Border1(pc),a0
	lea	BOOL_SEL(a0),a1		;SELECT_Border
	move.b	d0,4(a0)
	move.l	12(a0),a0		;next Border
	move.b	d1,4(a0)

	move.b	d1,4(a1)
	move.l	12(a1),a0		;next Border
	move.b	d0,4(a0)

	lea	Border2(pc),a0
	lea	BOOL_SEL(a0),a1		;SELECT_Border
	move.b	d0,4(a0)
	move.l	12(a0),a0		;next Border
	move.b	d1,4(a0)

	move.b	d1,4(a1)
	move.l	12(a1),a0		;next Border
	move.b	d0,4(a0)

	lea	Border3(pc),a0
	move.b	d0,4(a0)
	move.l	12(a0),a0		;next Border
	move.b	d1,4(a0)

	lea	_GfxBase(pc),a0
	move.l	(a0),a6
	moveq	#0,d0
	lea	NewWindowStructure1(pc),a0
	move.w	216(a6),d0		;Window
	sub.w	#56,d0			;am unteren
	move.w	d0,2(a0)		;Bildschirm
	move.l	WBmsg(pc),d0
	beq	cli

	move.l	4,a6
 	lea	iconname(pc),a1
	moveq	#0,d0
	jsr	-552(a6)		;OpenLibrary
	move.l	d0,a5			;IconBase->a5
	tst.l	d0
	beq	CLIWB

	move.l	WBmsg(pc),a2
	move.l	$24(a2),d0		;Lock
	beq	nolock
	move.l	d0,a0

	move.l	_DOSBase(pc),a6
	move.l	(a0),d1
	jsr	-126(a6)		;CurrentDir

	move.l	$24(a2),a0
	move.l	4(a0),a0
	move.l	a5,a6
	jsr	-78(a6)  		;GetDiskObject
	move.l	d0,a3			;store
	move.l	$36(a3),a0		;Tool_Types

	lea	MidiVar(pc),a1
	jsr	-96(a6)			;FindToolType
	tst.l	d0
	beq	noMIDI
	move.l	d0,a0
	bsr	str2midi
noMIDI
	move.l	a3,a0
	move.l	a5,a6
	jsr	-90(a6)			;FreeDiskObject
nolock
	move.l	4,a6
	move.l	a5,a1			;IconBase
	jsr	-414(a6)		;CloseLibrary
	bra	CLIWB

cli
	move.l	a2,a0			;CLI-Parastring
	move.l	d4,d2			;len
parse
	sub.l	#1,d2
	beq	CLIWB
	bsr	str2midi
CLIWB
	lea	NewWindowStructure1(pc),a0
	move.l	_IntuitionBase(pc),a6
	jsr	-204(a6)		;OpenWindow
	tst.l	d0
	bne	ok1
	lea	Alertstringwin(pc),a0
	bsr	showalert
	bra	winfail
ok1
	lea	KeyboardWindow(pc),a0
	move.l	d0,(a0)
	move.l	d0,a0
	lea	Port(pc),a1
	move.l	wd_UserPort(a0),(a1)
	move.l	KeyboardWindow(pc),a0
	move.l	wd_RPort(a0),a0
	lea	rastport(pc),a1
	move.l	a0,(a1)

	lea	midichanKB(pc),a0
	move.b	3(a0),d0
	bsr	dosetmidi

	move.w	#0,d0
	move.w	#0,d1
	move.l	rastport(pc),a0
	lea	IText1(pc),a1
	jsr	-216(a6)		;PrintIText

	move.l	4,a6
	move.l	#TMPRASSIZE,d0
	move.l	#$10002,d1
	jsr	-198(a6)		;AllocMem
	tst.l	d0
	bne	ok2
	lea	Alertstringmem(pc),a0
	bsr	showalert
	bra	quitkb
ok2
	lea	MemPtr(pc),a0
	move.l	d0,(a0)
	bsr	initTMP
	bsr	drawkeyb
event
	move.l	4,a6
	move.l	Port(pc),d2
	move.l	d2,a0
	jsr	-384(a6)		;WaitPort
	move.l	d2,a0
	jsr	-372(a6)		;GetMsg
	move.l	d0,a1			;fuer ReplyMsg
	move.l	im_Class(a1),d4		;event
	move.l	im_IAddress(a1),a2	;Gadgetzeiger
	move.w	im_Code(a1),d3		;RAWcode
	jsr	-378(a6)		;ReplyMsg
whatevent
	cmpi.l	#CLOSEWINDOW,d4
	beq	quitkb
	cmpi.l	#GADGETUP,d4
	beq	dogadget
	cmpi.l	#RAWKEY,d4
	beq	doRAW
	cmpi.l	#MOUSEBUTTONS,d4
	beq	whatkey
	bra	event

dogadget
	move.l	40(a2),a0
	jmp	(a0)

Midiminus
	lea	midichanKB(pc),a0
	move.b	3(a0),d0
	sub.b	#1,d0
	cmp.b	#0,d0
	bmi	set15
	bra	setmidi
Midiplus
	lea	midichanKB(pc),a0
	move.b	3(a0),d0
	add.b	#1,d0
	cmp.b	#15,d0
	bgt	setnull
	bra	setmidi
Midistr
	lea	midichanKB(pc),a0
	move.b	3(a0),d0
	sub.b	#1,d0			;Offset Display
	cmp.b	#15,d0
	bgt	setnull
	cmp.b	#0,d0
	bmi	set15
	bra	setmidi
setnull
	move.b	#0,d0
	bra	setmidi
set15
	move.b	#15,d0
setmidi
	bsr	dosetmidi
	bra	event

dosetmidi
	lea	noteon(pc),a0		;MIDI-Kanal eintragen
	and.b	#$f0,(a0)
	add.b	d0,(a0)
	lea	noteoff(pc),a0
	and.b	#$f0,(a0)
	add.b	d0,(a0)
	lea	AllNotesOff(pc),a0
	and.b	#$f0,(a0)
	add.b	d0,(a0)
	lea	midichanKB(pc),a0
	move.b	d0,3(a0)

	lea	Gadget4SIBuff(pc),a1	;MIDI-Kanal ausgeben
	add.b	#1,d0
	cmp.b	#10,d0
	blt	1$
	move.b	#"1",(a1)+		;Kanal 10-16
	sub.b	#10,d0
	bra	einer
1$
	move.b	#32,(a1)+		;Zehner Leerzeichen
einer
	add.b	#48,d0			;Einerstelle eintragen
	move.b  d0,(a1)

	move.l	_IntuitionBase(pc),a6
	lea	Gadget4(pc),a0
	move.l	KeyboardWindow(pc),a1
	sub.l	a2,a2
	moveq	#1,d0
	jsr	-432(a6)		;RefreshGList
	rts

doRAW
	move.w	d3,d0			;Tastencode
	cmp.b	#$5F,d0			;Help gedrueckt
	beq	alloff
	cmp.b	#$46,d0			;Del gedrückt
	beq	RAWhold
	btst	#7,d0
	bne	RAWoff			;Taste losgelassen
RAWon
	lea	RAWtable(pc),a0
	move.b	0(a0,d0.w),d0		;passende MIDI-Note
	bmi	event			;keine Ausgabe
	cmp.b	d0,d6			;keine neue Taste
	beq	event
	move.b	d0,d6			;Taste speichern
	bsr	on			;Note ausgeben
	bra	event
RAWoff
	bclr	#7,d0			;up-down Flag loeschen
	lea	RAWtable(pc),a0
	move.b	0(a0,d0.w),d0		;passende MIDI-Note
	bmi	event
	move.b	holdRAW(pc),d1
	btst	#0,d1			;Note halten ?
	beq	1$			;ja
	bsr	off			;Note aus
1$
	move.b	#0,d6			;Note wurde ausgeschaltet
	bra	event			;oder halten
RAWhold
	lea	holdRAW(pc),a1
	bchg	#0,(a1)
	lea	ITextText5(pc),a0
	btst	#0,holdRAW(pc)
	bne	aus
	move.l	#'EIN ',(a0)
	bra	print
aus
	move.l	#'AUS ',(a0)

print
	move.l	_IntuitionBase(pc),a6
	move.l	KeyboardWindow(pc),a1
	moveq	#0,d0
	moveq	#0,d1
	move.l	wd_RPort(a1),a0
	lea	IText5(pc),a1
	jsr	-216(a6)		;PrintIText
	bra	event

whatkey
	cmp.w	#MENUUP,d3
	beq	event
	cmp.w	#SELECTUP,d3
	beq	event

	bsr	getnotenr
	move.b	d0,d6			;save on
	bsr	on
loop1
	bsr	getnotenr
	cmp.b	d0,d6			;neue Note
	bne	newnote			;ja
back
	btst	#6,$BFE001
	beq	doleft			;Note nicht halten
	btst	#10,$dff016
	beq	doright			;Note halten
	move.b	hold(pc),d1
	btst	#0,d1
	beq	event			;halte Note
	move.b	d6,d0
	bsr	off			;Note off
	bra	event
doleft
	lea	hold(pc),a0
	bset	#0,(a0)
	bra	test
doright
	lea	hold(pc),a0
	bclr	#0,(a0)
test
	move.l	4,a6
	move.l  Port(pc),a0
	jsr	-372(a6)		;GetMsg
	tst.l	d0
	beq	loop1
	move.l	d0,a1			;fuer ReplyMsg
	move.l	im_Class(a1),d4		;event
	move.l	im_IAddress(a1),a2	;Gadgetzeiger
	move.w	im_Code(a1),d3		;RAWcode
	jsr	-378(a6)		;ReplyMsg
	cmpi.l	#MOUSEBUTTONS,d4
	bne	whatevent
	bra	loop1

newnote
	move.b	d0,d3                   ;neue Note speichern
	move.b	d6,d0			;alte Note aus
	bsr	off			;Note off
	move.b	d3,d0                   ;neue Note
	move.b	d0,d6			;Note speichern
	bsr	on			;Note on
	bra	back			;Mausauswertung

on
	cmp.b	#LOW,d0
	blt	setlowon
	cmp.b	#LOW+96,d0
	bgt	sethighon
	bra	doon
sethighon
	move.b	#LOW+96,d0
	bra	doon
setlowon
	move.b	#LOW,d0
doon
	lea	noteon(pc),a0
	move.b	d0,1(a0)
	moveq	#2,d1
	bsr	_put
	move.l	rastport(pc),a3
	moveq	#0,d2
	move.b	d0,d2
	move.l	_GfxBase(pc),a6
	move.l	a3,a1
	moveq	#orange,d0
	jsr	-342(a6)		;SetAPen
	bra	drawkey

off
	move.b	#0,d6
	cmp.b	#LOW,d0
	blt	setlowoff
	cmp.b	#LOW+96,d0
	bgt	sethighoff
	bra	dooff
sethighoff
	move.b	#LOW+96,d0
	bra	dooff
setlowoff
	move.b	#LOW,d0
dooff
	lea	noteoff(pc),a0
	move.b	d0,1(a0)
	moveq	#2,d1
	bsr	_put
drawonly
	move.l	rastport(pc),a3
	moveq	#0,d2
	move.b	d0,d2
	move.l	_GfxBase(pc),a6
	move.l	a3,a1
	lea	colortab(pc),a0
	move.l	d2,d0
	divu	#12,d0			;Oktave
	swap	d0			;Note in Oktave
	lsl.w	#1,d0			;auf Wortgrenze
	add.w	d0,a0
	move.w	(a0),d0			;Farbe aus Tabelle
	jsr	-342(a6)		;SetAPen
drawkey
	moveq	#KSOFF,d7		;X-Abstand Okt.
	sub.w	#LOW,d2			;unterste Note
	divu	#12,d2			;Oktave
	move.b	d2,d0
	mulu	d2,d7
	swap	d2			;Note in Oktave
	mulu	#34,d2
	cmp.b	#8,d0
	bne	nor
	lea	c8(pc),a2
	bra	cont
nor
	lea	xtable(pc),a2
cont
	add.w	d2,a2			;Tab. einstellen
	move.w	(a2)+,d0		;Start-X
	add.w	d7,d0
	move.w	(a2)+,d1		;Start-Y
	move.l	a3,a1
	jsr	-252(a6)		;AreaMove
	tst.b	d0
	bmi	initTMP			;Fehler ?
	move.w	(a2)+,d2		;Anzahl der Koord.
1$
	move.w	(a2)+,d0		;X-Koord. Note
	add.w	d7,d0			;in Oktave
	move.w	(a2)+,d1		;Y-Koord. Note
	move.l	a3,a1
	jsr	-258(a6)		;AreaDraw
	tst.b	d0
	bmi	initTMP
	dbra	d2,1$
	move.l	a3,a1
	jsr	-264(a6)		;AreaEnd
	rts

initTMP
	move.l	_GfxBase(pc),a6
	lea	TmpRaster(pc),a0
	move.l	MemPtr(pc),a1
	move.l	#TMPRASSIZE,d0
	jsr	-468(a6)		;ITempRas
	move.l	rastport(pc),a0
	move.l	d0,12(a0)

	lea	Ainfo(pc),a0
	lea	Abuffer(pc),a1
	moveq	#9,d0
	jsr	-282(a6)		;InitArea
	move.l	rastport(pc),a0
	lea	Ainfo(pc),a1
	move.l	a1,16(a0)
	rts

alloff
	moveq	#127,d2			;Note off Nr 0-127
1$					;da spez. Note off Befehl
	lea	noteoff(pc),a0		;nicht von allen Synth.
	move.b	d2,1(a0)		;unterstützt wird
	moveq	#2,d1
	bsr	_put
	dbra	d2,1$			;Off-Loop

	lea	AllNotesOff(pc),a0	;Falls mehrere
	moveq	#2,d1			;Stimmen an
	bsr	_put			;und AllNotesOff
					;implementiert
	moveq	#96,d3
        moveq	#LOW-1,d4
2$
	add.b	#1,d4
	move.b	d4,d0
	bsr	drawonly
	dbra	d3,2$

	move.b	#0,d6			;Notesave loeschen
	bra	event

getnotenr
	move.l	KeyboardWindow(pc),a2
	cmp.w	#XO,14(a2)  		;Maus im X-Bereich
	blt	setmin
	cmp.w	#XU,14(a2)
	bgt	setmax
	cmp.w	#YO+16,12(a2)		;Maus im Halb-
	blt	halbton			;o. Ganztonbereich
ganzton
	lea	gtable(pc),a0		;Ganztontab.
	moveq	#XO,d2
	bra	auswerten
halbton
	lea	htable(pc),a0		;Halbtontab.
	moveq	#XO+7,d2
auswerten
	moveq	#0,d0
	moveq	#0,d1
	move.w	14(a2),d1		;Mausposition
	sub.w	d2,d1			;Keyboard X-Start sub.
	bmi	ganzton
	divu	#11,d1			;welche Note
	move.b	0(a0,d1.w),d0		;passende Notenr
	beq	ganzton
	rts
setmin
	move.b	#LOW,d0
	rts
setmax
	move.b	#96+LOW,d0
	rts

*
*	a0 = Datenzeiger
*	d1 = len-1
*
_put
	move.w	#$4000,intena(a4)	;Disable
lo2
	move.b	(a0)+,d5		;Datenbyte nach d5
	move.w	d5,serdat(a4)
lo1
	btst	#12,serdatr(a4)		;TSRE set ?
	beq	lo1			;no
	dbra	d1,lo2
	move.w	#$1,intreq(a4)		;TBF clear
	move.w	#$c000,intena(a4)	;Enable
	rts

quitkb
	move.l	KeyboardWindow(pc),a0
	move.l	_IntuitionBase(pc),a6
	jsr	-72(a6)			;CloseWindow
winfail
	move.l	4,a6
	move.l	_GfxBase(pc),a1
	jsr	-414(a6)		;CloseLibrary
closeDOS
	move.l	4,a6
	move.l	_DOSBase(pc),a1
	jsr	-414(a6)		;CloseLibrary
closeint
	move.l	4,a6
	move.l	_IntuitionBase(pc),a1
	jsr	-414(a6)		;CloseLibrary

	move.l	MemPtr(pc),d0
	beq	fail
	move.l	d0,a1
	move.l	#TMPRASSIZE,d0
	jsr	-210(a6)		;FreeMem
	moveq	#0,d0
fail
	rts

drawkeyb
	move.l	_GfxBase(pc),a6
	move.l	rastport(pc),a1
	moveq	#0,d0			;JAM1
	jsr	-354(a6)		;SetDrMd

	move.l	rastport(pc),a1
	lea     weiss(pc),a0
	move.b	(a0),d0
	jsr	-342(a6)		;SetAPen

	move.l	rastport(pc),a1
	lea	schwarz(pc),a0
	move.b	(a0),27(a1)		;OPen
	bset	#3,33(a1)		;AREAOUTLINE

	moveq	#XO,d4
	moveq	#YU,d3
	moveq	#56,d6			;57 weisse Tasten
weisseT
	move.w	d4,d0			;X Taste
	move.w	d0,d2
	add.w	#11,d2			;Tastenbreite
	moveq	#YO,d1
	move.l	rastport(pc),a1
	jsr	-306(a6)		;RectFill
	add.w	#11,d4
	dbra	d6,weisseT		;naechste Taste

	move.l	rastport(pc),a1
	lea     schwarz(pc),a0
	move.b	(a0),d0
	jsr	-342(a6)		;SetAPen

	move.l	rastport(pc),a1
	move.b	#blau,27(a1)		;OPen
	bclr	#3,33(a1)		;NOAREAOUTLINE

	moveq	#7,d7			;8 Oktaven
	moveq	#XO+7,d4		;X-Start schwarze Tasten
	moveq	#YO+15,d3		;Tastenlaenge
schwarzloop
	lea	schwarztab(pc),a2	;Abstaende der Tasten
	moveq	#4,d6			;5 schw. Halbtoene/Oktave
schwarzeT
	move.w	d4,d0			;X-Start
	move.w	d0,d2
	add.w	#8,d2			;Tastenbreite
	moveq	#YO,d1
	move.l	rastport(pc),a1
	jsr	-306(a6)		;RectFill
	add.w	(a2)+,d4
	dbra	d6,schwarzeT		;naechste Taste
	dbra	d7,schwarzloop		;naechste Oktave
	rts

showalert
	moveq	#0,d0
	moveq	#80,d1
	move.l	_IntuitionBase(pc),a6
	jsr	-90(a6)			;DisplayAlert
	rts

str2midi
	move.l	a0,a1
	lea	Gadget4SIBuff(pc),a2
	moveq	#1,d1
1$
	move.b	(a1)+,(a2)+
	dbra	d1,1$

	moveq	#0,d0
	lea	Gadget4SIBuff(pc),a0
	cmp.b	#48,1(a0)
	blt	one
	move.b	(a0),d0
	sub.b	#48,d0
	mulu	#10,d0
	move.b	1(a0),d1
	sub.b	#48,d1
	add.b	d1,d0
	bra	done
one
	move.b	(a0),d1
	sub.b	#48,d1
	add.b	d1,d0
done
	subq	#1,d0
	lea	midichanKB(pc),a0
	move.b	d0,3(a0)
	rts

_DOSBase	dc.l	0
_GfxBase	dc.l	0
_IntuitionBase	dc.l	0
MemPtr		dc.l	0
KeyboardWindow	dc.l	0
Port		dc.l	0
rastport	dc.l	0
hold		dc.b	1
holdRAW		dc.b	1
weiss		dc.b	1
schwarz		dc.b	1
		cnop 0,2
TmpRaster
 dc.l	0	;RasPtr
 dc.l	0	;Size
Ainfo
 dc.l	0	;Vectortable
 dc.l	0	;Vectorptr
 dc.l	0	;Flagtable
 dc.l	0	;Flagptr
 dc.w	0	;Counter
 dc.w	0	;Maxcount
 dc.w	0	;FirstX
 dc.w	0	;FirstY
Abuffer
 ds.b	AMax*5
 cnop 0,2
intname		dc.b	'intuition.library',0
		cnop 0,2
dosname		dc.b	'dos.library',0
		cnop 0,2
gfxname		dc.b	'graphics.library',0
		cnop 0,2
iconname	dc.b	'icon.library',0
		cnop 0,2
noteon		dc.b	$90,$00,$7f
		cnop 0,2
noteoff		dc.b	$80,$00,$7f
		cnop 0,2
AllNotesOff	dc.b	$b0,$7b,$00
		cnop 0,2
colortab
 ds.w   12
schwarztab
 dc.w	11,22,11,11,22
xtable
 dc.w	KSC+1,YOA	;C
 dc.w	4,KSC+1,YUA,KSC+10,YUA,KSC+10,YUG,KSC+6,YUG,KSC+6,YOA,0,0,0,0
 dc.w	KSCIS,YOA	;CIS
 dc.w	2,KSCIS,YUH,KSCIS+6,YUH,KSCIS+6,YOA,0,0,0,0,0,0,0,0
 dc.w	KSD,YOA		;D
 dc.w	6,KSD,YUG,KSD-4,YUG,KSD-4,YUA,KSD+5,YUA,KSD+5,YUG,KSD+1,YUG,KSD+1,YOA
 dc.w	KSDIS,YOA	;DIS
 dc.w	2,KSDIS,YUH,KSDIS+6,YUH,KSDIS+6,YOA,0,0,0,0,0,0,0,0
 dc.w	KSE+1,YOA	;E
 dc.w	4,KSE+1,YUG,KSE-3,YUG,KSE-3,YUA,KSE+6,YUA,KSE+6,YOA,0,0,0,0
 dc.w	KSF+1,YOA	;F
 dc.w	4,KSF+1,YUA,KSF+10,YUA,KSF+10,YUG,KSF+6,YUG,KSF+6,YOA,0,0,0,0
 dc.w	KSFIS,YOA	;FIS
 dc.w	2,KSFIS,YUH,KSFIS+6,YUH,KSFIS+6,YOA,0,0,0,0,0,0,0,0
 dc.w	KSG,YOA	;G
 dc.w	6,KSG,YUG,KSG-4,YUG,KSG-4,YUA,KSG+5,YUA,KSG+5,YUG,KSG+1,YUG,KSG+1,YOA
 dc.w	KSGIS,YOA	;GIS
 dc.w	2,KSGIS,YUH,KSGIS+6,YUH,KSGIS+6,YOA,0,0,0,0,0,0,0,0
 dc.w	KSA,YOA		;A
 dc.w	6,KSA,YUG,KSA-4,YUG,KSA-4,YUA,KSA+5,YUA,KSA+5,YUG,KSA+1,YUG,KSA+1,YOA
 dc.w	KSAIS,YOA	;AIS
 dc.w	2,KSAIS,YUH,KSAIS+6,YUH,KSAIS+6,YOA,0,0,0,0,0,0,0,0
 dc.w	KSH,YOA		;H
 dc.w	4,KSH,YUG,KSH-4,YUG,KSH-4,YUA,KSH+5,YUA,KSH+5,YOA,0,0,0,0
c8
 dc.w	KSC+1,YOA	;C
 dc.w	2,KSC+1,YUA,KSC+11,YUA,KSC+11,YOA,0,0,0,0,0,0,0,0
RAWtable
 dc.b	-1,37,39,-1,42,44,46,-1,49,51	;0-9
 dc.b	-1,54,56,58,-1,-1,38,40,41,43	;10-19
 dc.b	45,47,48,50,52,53,55,57,-1,-1	;20-29
 dc.b	-1,-1,63,-1,66,68,70,-1,73,75	;30-39
 dc.b	-1,78,80,82,-1,-1,-1,-1,62,64	;40-49
 dc.b	65,67,69,71,72,74,76,77,79,-1	;50-59
 dc.b	-1,-1,-1,-1,-1,-1,36,-1,59,-1	;60-69
 dc.b	-1,-1,-1,-1,-1,-1,83,-1,-1,-1	;70-79
 dc.b	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1	;80-89
 dc.b	-1,-1,-1,-1,-1,-1,60,81,-1,61	;90-99
 dc.b	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1	;100-109
 cnop 0,2
gtable
 dc.b	0+LOW,2+LOW,4+LOW,5+LOW,7+LOW,9+LOW,11+LOW
 dc.b	12+LOW,14+LOW,16+LOW,17+LOW,19+LOW,21+LOW,23+LOW
 dc.b	24+LOW,26+LOW,28+LOW,29+LOW,31+LOW,33+LOW,35+LOW
 dc.b	36+LOW,38+LOW,40+LOW,41+LOW,43+LOW,45+LOW,47+LOW
 dc.b	48+LOW,50+LOW,52+LOW,53+LOW,55+LOW,57+LOW,59+LOW
 dc.b	60+LOW,62+LOW,64+LOW,65+LOW,67+LOW,69+LOW,71+LOW
 dc.b	72+LOW,74+LOW,76+LOW,77+LOW,79+LOW,81+LOW,83+LOW
 dc.b	84+LOW,86+LOW,88+LOW,89+LOW,91+LOW,93+LOW,95+LOW
 dc.b	96+LOW
 cnop 0,2
htable
 dc.b	1+LOW,3+LOW,0,6+LOW,8+LOW,10+LOW,0
 dc.b	13+LOW,15+LOW,0,18+LOW,20+LOW,22+LOW,0
 dc.b	25+LOW,27+LOW,0,30+LOW,32+LOW,34+LOW,0
 dc.b	37+LOW,39+LOW,0,42+LOW,44+LOW,46+LOW,0
 dc.b	49+LOW,51+LOW,0,54+LOW,56+LOW,58+LOW,0
 dc.b	61+LOW,63+LOW,0,66+LOW,68+LOW,70+LOW,0
 dc.b	73+LOW,75+LOW,0,78+LOW,80+LOW,82+LOW,0
 dc.b	85+LOW,87+LOW,0,90+LOW,92+LOW,94+LOW,0
 cnop 0,2

Alertstringwin
 dc.w 200
 dc.b 24,"    Can't open Window        ",0,$01
 dc.w 200
 dc.b 44,"    Might be memoryproblem   ",0,$01
 dc.w 200
 dc.b 64,"=== Press any MOUSEBUTTON ===",0,$00
 cnop 0,2
Alertstringmem
 dc.w 200
 dc.b 44,"    Can't allocate Memory    ",0,$01
 dc.w 200
 dc.b 64,"=== Press any MOUSEBUTTON ===",0,$00
 cnop 0,2
TOPAZ80
 dc.l TOPAZ80name
 dc.w 8
 dc.b 0,0
TOPAZ80name
 dc.b  "topaz.font",0
 cnop 0,2
NewWindowStructure1
 dc.w	0,0,640,56
 dc.b	blau,0
 dc.l	CLOSEWINDOW+GADGETUP+MOUSEBUTTONS+RAWKEY
 dc.l	RMBTRAP+WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH
 dc.l	Gadget1,NULL,NewWindowName1,NULL,NULL
 dc.w	0,0,0,0,WBENCHSCREEN
NewWindowName1
 dc.b	'MIDI-Keyboard © 1991 Dieter Bruns   LMB=Normal RMB=Halte Note',0
 cnop 0,2


Gadget1:
 dc.l	Gadget2
 dc.w	142+XO,GY1,19,9,GADGHIMAGE,RELVERIFY,BOOLGADGET
 dc.l   Border1,Border1+BOOL_SEL,GText1,NULL,NULL
 dc.w	NULL
 dc.l	Midiminus
Border1
	BOOLBOX20 21,11

GText1:
 dc.b	0,blau,RP_JAM2,0
 dc.w	5,1
 dc.l	TOPAZ80,GTextText1,NULL
GTextText1:
 dc.b	'-',0
 cnop 0,2
Gadget2:
 dc.l	Gadget3
 dc.w	166+XO,GY1,19,9,GADGHIMAGE,RELVERIFY,BOOLGADGET
 dc.l   Border1,Border1+BOOL_SEL,GText2,NULL,NULL
 dc.w	NULL
 dc.l	Midiplus
GText2:
 dc.b	0,blau,RP_JAM2,0
 dc.w	5,1
 dc.l	TOPAZ80,GTextText2,NULL
GTextText2:
 dc.b	'+',0
 cnop 0,2
Gadget3:
 dc.l	Gadget4
 dc.w	435+XO,GY1,112,9,GADGHIMAGE,RELVERIFY,BOOLGADGET
 dc.l   Border2,Border2+BOOL_SEL,GText3,NULL,NULL
 dc.w	NULL
 dc.l	alloff
Border2
	BOOLBOX20 114,11
GText3:
 dc.b	0,blau,RP_JAM2,0
 dc.w	5,1
 dc.l	TOPAZ80,GTextText3,NULL
GTextText3:
 dc.b	'All Notes off',0
 cnop 0,2
Gadget4
 dc.l   NULL
 dc.w	100+XO,GY1+1,34,9,GADGHCOMP,RELVERIFY+STRINGRIGHT+LONGINT,STRGADGET
 dc.l	Border3,NULL,NULL,NULL,Gadget4SInfo
 dc.w	NULL
 dc.l	Midistr
Border3
 	STRBOX20 41,11
Gadget4SInfo:
 dc.l	Gadget4SIBuff
 dc.l	NULL
 dc.w	0,3,0,0,0,0,0,0
 dc.l	0
midichanKB dc.l	0
 dc.l	NULL
Gadget4SIBuff:
 dc.b	'01',0
 cnop 0,2

IText1:
 dc.b	orange,blau,RP_JAM2,0
 dc.w	XO+5,15
 dc.l	TOPAZ80,ITextText1,IText2
ITextText1:
 dc.b	'MIDI-Kanal',0
 cnop 0,2
IText2:
 dc.b	0,blau,RP_JAM2,0
 dc.w	206+XO+KOX1,15
 dc.l	TOPAZ80,ITextText2,IText3
ITextText2:
 dc.b	'Help:',0
 cnop 0,2
IText3:
 dc.b	0,blau,RP_JAM2,0
 dc.w	18+XO+KOX1,15
 dc.l	TOPAZ80,ITextText3,IText4
ITextText3:
 dc.b	'Del: Halte Note',0
 cnop 0,2
IText4:
 dc.b	orange,blau,RP_JAM2,0
 dc.w	361+XO,19
 dc.l	TOPAZ80,ITextText4,IText5
ITextText4:
 dc.b	'A4',0
 cnop 0,2
IText5:
 dc.b	0,blau,RP_JAM2,0
 dc.w	146+XO+KOX1,15
 dc.l	TOPAZ80,ITextText5,NULL
ITextText5:
 dc.b	'AUS ',0
 cnop 0,2
	END
