home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
speaker
/
speaker.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-31
|
3KB
|
74 lines
uses crt,dos;
const voclast:Byte=0; {dernière valeur}
trigger=5; {sensibilité}
Fini:Boolean=false; {prêt ?}
var oldint8:Pointer; {ancien Handler IRQ 0}
Voc:Pointer; {pointe sur données Sample dans la mémoire}
VocFile:File; {fichier Voc}
timwert, {valeur pour chim timer}
vocpos, {Offset en cours dans fichier Voc}
voclen, {longueur du fichier VOC}
Hz:Word; {fréquence Sample}
Procedure Play;interrupt;assembler;
{joue Voc dans l'interruption}
asm
mov dx,61h {lire contenu du port de contrôle}
in al,dx
mov cl,al {sauver dans cl}
les di,voc {es:di charger avec pointeur sur les données Sample}
inc vocpos {avancer position d'un point}
mov ax,vocpos {charger dans ax}
add di,ax {ajouter à la mémoire offset}
cmp ax,voclen {déjà arrivé à la fin de Sample ?}
jne @ok {oui,}
mov Fini,1 {alors positionner flag}
@ok:
mov al,es:[di] {chercher valeur}
mov bl,al {sauver dans bl}
sub al,voclast {calculer différence par rapport à la dernière valeur}
mov voclast,bl {et répertorier valeur comme dernière valeur}
cmp al,trigger {distance plus grande que seuil de tolérance ?}
jg @set {alors règler speaker sur high}
cmp al,-trigger {distance plus pétite que seuil de tolérance négatif ?}
jg @Fin {non, alors prêt}
mov al,cl
and al,not 2 {effacer Bit 1}
out dx,al {et écrire}
jmp @Fin {prêt}
@set:
mov al,cl {ancien contenu du port de contrôle}
or al,2 {positionner bit 1}
out dx,al {et écrire}
@Fin:
pushf {appel de l'ancien Handler}
call [oldint8]
End;
begin
Assign(VocFile,'thirty.voc'); {Ouvrir fichier}
Reset(VocFile,1); {Faire marche en arrière}
Voclen:=FileSize(VocFile); {Détermine la taille du fichier}
GetMem(Voc,Voclen); {allocation de mémoire correspondante}
BlockRead(VocFile,Voc^,FileSize(VocFile));
{lecture du fichier Voc (max. 64kB)}
Close(VocFile); {et fermer}
Hz:=1000000 div {détermine la fréquence sample du fichier}
(256-Byte(Ptr(Seg(Voc^),Ofs(Voc^)+$1f)^));
GetIntVec($8,OldInt8); {sauver vecteur IRQ 0}
SetIntVec($8,@Play); {rédiriger IRQ 0 sur Handler}
timwert := 1193180 DIV Hz; {calculer timer-start à partir de la fréquence sampling}
Port[$43]:=$36; {le programmer sur le compteur 0}
Port[$40]:=Lo(timwert);
Port[$40]:=Hi(timwert);
Repeat Until KeyPressed or Fini; {attendre, jusqu'à la fin de la touche}
SetIntVec($8,OldInt8); {rétablir vecteur}
Port[$43]:=$36; {marche arrièrre du Timer}
Port[$40]:=0; {(18,2 Hz)}
Port[$40]:=0;
End.