;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
|
|