Quelltext /~heha/hs/dos/dosmisc.zip/SRC/SOUND.ASM

;Include-Datei SOUND.ASM
;IDEAL-Modus erforderlich!
;Folgende Makros sind implementiert:
;Beep <frequenz>,<pause>
;		Ausgabe eines Tones mit Frequenz und Dauer in Ticks
;		Erfordert _WAIT und _SOUND!
;_WAIT8		Warteprozedur für AL Ticks
;_WAIT16	Mehr als 13 Sekunden warten mit AX Ticks
;_SOUND		enthält Prozedur "Sound" (PE:AH) und "NoSound"
;_TSOUND	realisiert wartefreien Sound via Timer-Tick
;		benötigt globale Variablen:
;		TSPTR:word=0	;Zeiger auf Sound-String ASCIIZ
;		TSDLY:byte=1	;Zeit zwischen 2 Aufrufen von TSound
;		;Bei unregelmäßigem Ruf im DATA?-Segment möglich
;		TSFLG:byte=1	;Bit0: Sound ein/aus (nicht verwendet)
;				;Bit1: Neuer Sound-String
;				;Bit2: Ton/Pause-Flag
;		TSCNT:byte	;Zeitzähler
;	Aufbau des Sound-Strings:
;		Tonhöhe,Tondauer[,Pausendauer,Tonhöhe,Tondauer]*,0
;	Sound-Start wie folgt:
;	mov	[TSPTR],ofs Melodie
;	or	[TSFLG],6

;Später mal gibt's Routinen für Covox und SoundBlaster

macro Beep Frequenz,Pause	;bitte nur Direktwerte angeben
	mov	al,1
	call	Wait
	mov	ax,65000/Frequenz
	call	Sound
	mov	al,Pause
	call	Wait
	call	NoSound
	endm

macro _WAIT8
proc Wait8	;wartet AL Timer-Ticks lang; verklemmt sich in MP-Shell
		;maximal ca. 250 Ticks = 13 Sekunden
	push	ds dx
	XLD	ds,dx,40h
	mov	dl,[6ch]
@@1:	mov	dh,[6ch]
	sub	dh,dl
	cmp	dh,al
	jc	@@1
	pop	dx ds
	ret
	endp
	endm

macro _WAIT16
proc Wait16	;wartet AX Timer-Ticks lang; verklemmt sich in MP-Shell
	push	ds dx cx
	LOAD	ds,dx,40h
	mov	dx,[6ch]
@@1:	mov	cx,[6ch]
	sub	cx,dx
	cmp	cx,ax
	jc	@@1
	pop	cx dx ds
	ret
	endp
	endm

macro _SOUND
proc Sound	;PE:AX=Notenwert, VR:AX
	cli
	push	ax
	 in	al,61h
	 or	al,3
	 out	61h,al
	 mov	al,0b6h
	 out	43h,al
	pop	ax
	out	42h,al
	xchg	al,ah
	out	42h,al
	xchg	al,ah
	sti
	ret
	endp
proc NoSound	;PE:-, VR:AL
	cli
	in	al,61h		;Lautsprecher wieder ausschalten
	and	al,not 3
	out	61h,al
	sti
	ret
	endp
	endm

macro _TSOUND
	_SOUND			;die Subroutinen sind eh erforderlich!
proc TSound	;VR:AX,Flags
	push	si
	mov	ah,[TSFLG]
	mov	si,[TSPTR]
	cld			;Geordnete Verhältnisse
	test	ah,2		;Neuer Ton?
	jnz	@@1
	test	[by si],0ffh	;zeigt auf Null?
	jz	@@e
	mov	al,[TSDLY]
	sub	[TSCNT],al
	ja	@@e		;Nichts tun
@@1:	call	NoSound		;Erst mal aus, dann weitersehen
	test	ah,4		;Ton fällig?
	jz	@@2
	push	ax
	 lodsb
	 xchg	ah,al
	 call	Sound
	pop	ax
@@2:	xor	ah,4		;Ton/Pause umschalten
	lodsb
	mov	[TSCNT],al
	or	al,al		;Ende-Null?
	jnz	@@3
	dec	si		;auf die Null zeigen lassen
@@3:	and	ah,not 2	;"Neuer Ton" ausschalten
	mov	[TSFLG],ah
	mov	[TSPTR],si
@@e:	pop	si
	ret
	endp
	endm
Vorgefundene Kodierung: OEM (CP437)1
Umlaute falsch? - Datei sei ANSI-kodiert (CP1252)