*****************************************************************
*								*
*		BeatMaster V0.1 -- BPM Zähler			*
*								*
*****************************************************************
*
*	Von  Richard Körber  am   8. 9.1994
*
*****************************************************************

		INCDIR	"Include:"
		INCLUDE	exec.i
		INCLUDE	intuition.i

		SECTION	text,CODE
		
*---------------------------------------------------------------*
*	EQUates definieren					*
*								*
	;-- Farben -----------------------------;
GREY		EQU	0			;Standard-2.0-Farben
BLACK		EQU	1
WHITE		EQU	2
BLUE		EQU	3
	;-- Tag-Nummern ------------------------;
TAG_USER	EQU	$80000000
TAG_DONE	EQU	$00000000
	;-- New-Window-Equates -----------------;
nw_Screen	EQU	30
wd_UserPort	EQU	$56
CLOSEWINDOW	EQU	$0200
RAWKEY		EQU	$0400
WINDOWSIZING	EQU	1
WINDOWDRAG	EQU	2
WINDOWDEPTH	EQU	4
WINDOWCLOSE	EQU	8
SIZEBBOTTOM	EQU	$20
ACTIVATE	EQU	$1000
WBENCHSCREEN	EQU	$1

*---------------------------------------------------------------*
*	== Start von WB ==					*
*								*
start		sub.l	a1,a1
		exec	FindTask		;Task suchen
		move.l	d0,a4			;Task in A4
		tst.l	172(a4)		;pr_CLI  prüfen
		bne.b	.nomessage
		lea	92(a4),a0		;^Port
		move.l	a0,-(sp)
		exec	WaitPort		;Auf Message warten
		move.l	(sp)+,a0
		exec	GetMsg			; und abholen
		move.l	d0,wbmessage
.nomessage	bsr	s
		move.l	wbmessage(PC),d7	;Gab es eine?
		beq.b	.nowbm
		exec	Forbid
		move.l	d7,a1			;Beantworten
		exec	ReplyMsg
	;-- Alles klar -------------------------;
.nowbm		moveq	#0,d0			;Kein Error
		rts

*---------------------------------------------------------------*
*  Los geht das Programm					*
*								*
s	;-- Lib öffnen -------------------------;
		lea	intuiname(PC),a1	;Intuition öffnen
		moveq	#33,d0			;ab Kick 1.2 erlaubt!!!
		exec	OpenLibrary
		move.l	d0,intuibase
	;-- Window öffnen ----------------------;
		lea	newwindow(PC),a0
		intui	OpenWindow
		move.l	d0,window
		move.l	window(PC),a0		;Nachricht
		lea	itxtmsg(PC),a1
		moveq	#0,d0			;Offset X
		moveq	#0,d1			;Offset Y
		move.b	$36(a0),d0
		move.b	$37(a0),d1
		move.l	$32(a0),a0		;^RastPort
		intui	PrintIText
	;-- Warte auf Message ------------------;
.nxtmsg		move.l	window,a0
		move.l	wd_UserPort(a0),a0	;Port holen
		move.l	a0,-(sp)
		exec	WaitPort		;Warten
		move.l	(sp)+,a0
		exec	GetMsg			;Nachricht lesen
		move.l	d0,a1			; kann nur Close sein
		move.l	$14(a1),d7		;IDCMP merken
		move.l	$24(a1),d6		; Seconds,
		move.l	$28(a1),d5		; Micros natürlich auch
		move	$18(a1),d4		;Key
		swap	d4
		move	$1a(a1),d4		;Qualifier
		exec	ReplyMsg		;Message beantworten
	;-- Message dekodieren -----------------;
		cmp.l	#CLOSEWINDOW,d7
		beq.b	exit
		btst	#23,d4			;Keycode für KeyUp?
		bne.b	.nxtmsg			; dann nächstes Event
		cmp	#$0200,d4		;Repeat?
		beq.b	.nxtmsg			; dann nächstes Event
		move.l	seconds(PC),d0		;Delta berechnen
		move.l	micros(PC),d1
		move.l	d6,seconds
		move.l	d5,micros
		sub.l	d0,d6
		sub.l	d1,d5
		bcc.b	.isok
		subq.l	#1,d6			;Sek -1
		add.l	#1000000,d5		;µ + 1M
.isok		divu	#1000,d5		;D5 kürzen auf 1000stel
		swap	d5			;Rest interessiert nicht
		clr	d5
		swap	d5
		mulu	#1000,d6		;Sek *100
		add.l	d5,d6			;D6: 1000tel Sekunden
		beq.b	.flash
		move.l	#1000*60,d0
		divu	d6,d0			;(100/100tel) * 60 = BPM
		lea	buffer(PC),a0		;Wandeln
		bsr	bin2asc
		move.l	window(PC),a0
		lea	itxtbuff(PC),a1
		moveq	#0,d0			;Offset X
		moveq	#0,d1			;Offset Y
		move.b	$36(a0),d0
		move.b	$37(a0),d1
		move.l	$32(a0),a0		;^RastPort
		intui	PrintIText
.flash		move	#$0800,$dff180		;Screen kurz flashen
		bra.w	.nxtmsg
	;-- Window schließen -------------------;
exit		move.l	window(PC),a0
		intui	CloseWindow
	;-- Lib schließen ----------------------;
		move.l	intuibase(PC),a1
		exec	CloseLibrary
	;-- Fertig -----------------------------;
		moveq	#0,d0			;Alles OK
		rts

*-------------------------------------------------------*
* bin2asc	Wandelt Binär -> Ascii			*
*	-» A0.l	^Buffer (6 Bytes)			*
*	-» D0.w	Zahl					*
*							*
bin2asc		move.l	#"    ",(a0)+
		move	#"  ",(a0)+
		and.l	#$ffff,d0		;bereich einschränken
.loop		divu	#10,d0
		swap	d0
		add.b	#"0",d0
		move.b	d0,-(a0)
		clr	d0
		swap	d0
		bne.b	.loop
		rts

*-------------------------------------------------------*
*	Datenstrukturen, Variablen, Texte		*
*							*
wbmessage	dc.l	0			;^WB-Msg oder 0
intuibase	dc.l	0			;^Intuibase
window		dc.l	0			;^Window
seconds		dc.l	0			;letzte Seconds
micros		dc.l	0			;letzte Micros
buffer		ds.b	6			;EVEN
		dc.b	" BPM (Beats Per Minute)",0
		even
	;-- Intui Text -------------------------;
itxtbuff	dc.b	BLACK,GREY,1,0
		dc.w	10,3
		dc.l	0,buffer,0
itxtmsg		dc.b	BLUE,GREY,1,0
		dc.w	25,14
		dc.l	0,.txt,0
.txt		dc.b	"hit any key at every beat...",0
		even
	;-- NewWindow-Struktur -----------------;
newwindow	dc.w	50			; nw_LeftEdge
		dc.w	25			; nw_TopEdge
		dc.w	300			; nw_Width
		dc.w	40			; nw_Height
		dc.b	GREY			; nw_DetailPen
		dc.b	BLACK			; nw_BlockPen
		dc.l	CLOSEWINDOW!RAWKEY	; nw_IDCMPFlags
		dc.l	WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!ACTIVATE
		dc.l	0			; nw_FirstGadget
		dc.l	0			; nw_CheckMark
		dc.l	wndtitle		; nw_Title
		dc.l	0			; nw_Screen (nachgetragen)
		dc.l	0			; nw_BitMap
		dc.w	0,0			; nw_MinWidth Height
		dc.w	0,0			; nw_MaxWidth Height
		dc.w	WBENCHSCREEN		; nw_Type
	;-- Texte ------------------------------;
wndtitle	dc.b	'BeatMaster V0.1 by R.Körber',0
intuiname	dc.b	'intuition.library',0

*---------------------------------------------------------------*
*  Fertig							*
*								*
		END
