Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Работа с ситемным динамиком   Найти похожие ветки 

 
Babay ©   (2005-02-14 07:55) [0]

Подскажите как реализовать работу с системным динамиком под Windows NT/XP. Т.е. нужно что -то вроде процедур Sound, NoSound в TurboPascal-е. Нашел пару примеров (сделано через ассемблер),но они все работают только в 95/98/Me. Подскажите где копать то? а мож у кого пример есть?


 
WondeRu ©   (2005-02-14 09:13) [1]

на асме, но в ХР работает)

procedure Sound(Frequency, Duration: Integer);
asm
  push edx
  push eax
  mov eax, Win32Platform
  cmp eax, VER_PLATFORM_WIN32_NT
  jne @@9X
  call Windows.Beep
  ret
@@9X:
  pop eax
  pop edx
  push ebx
  push edx
  mov bx, ax
  mov ax, 34DDh
  mov dx, 0012h
  cmp dx, bx
  jnc @@2
  div bx
  mov bx, ax
  in al, 61h
  test al, 3
  jnz @@1
  or al, 3
  out 61h, al
  mov al, 0B6h
  out 43h, al
@@1:
  mov al, bl
  out 42h, al
  mov al, bh
  out 42h, al
  call Windows.Sleep
  in al, 61h
  and al, 0FCh
  out 61h, al
  jmp @@3
@@2:
  pop edx
@@3:
  pop ebx
end;


 
Babay ©   (2005-02-14 10:24) [2]

Спасибо действительно работает.
Но мне всетаки надо как ТР, что бы включался по одной команде, а выключался по другой. К сожалению несилен в асме, подскажите можно ли эту процедуру как то разбить на две. Если можно то как?


 
WondeRu ©   (2005-02-14 11:03) [3]

Babay ©   (14.02.05 10:24) [2]
разве что отдельный поток создавать... а асм знать не нада, в этой функции если у тя ВинХР, то будет выполняться стандартная функция Windows.Beep


 
Babay ©   (2005-02-14 11:11) [4]

> то будет выполняться стандартная функция Windows.Beep

вот это как раз и неустраивает. Нашел вот такой пример, в описании говорится что вроде как версия винды проверяется. На самом деле не пашет. Может можно как то заставить?

procedure SetPort(address, Value:Word);
var
 bValue: byte;
begin
 bValue := trunc(Value and 255);
 asm
   mov dx, address
   mov al, bValue
   out dx, al
 end;
end;

function GetPort(address:word):word;
var
 bValue: byte;
begin
 asm
   mov dx, address
   in al, dx   // <- здесь дает ошибку говорит нет привелегий
   mov bValue, al
 end;
 GetPort := bValue;
end;

procedure Sound(Freq : Word);
var
 B : Byte;
begin
 if Freq > 18 then
 begin
   Freq := Word(1193181 div LongInt(Freq));
   B := Byte(GetPort($61));
   if (B and 3) = 0 then
   begin
     SetPort($61, Word(B or 3));
     SetPort($43, $B6);
   end;
   SetPort($42, Freq);
   SetPort($42, Freq shr 8);
 end;
end;

procedure NoSound;
var
 Value: Word;
begin
 Value := GetPort($61) and $FC;
 SetPort($61, Value);
end;


 
Babay ©   (2005-02-14 11:18) [5]

>разве что отдельный поток создавать...

а поподробнее можно. В смысле как с потоками работать я в курсе. А чего туда засунуть? постоянный повтор бипа? так это будет не то.


 
WondeRu ©   (2005-02-14 13:30) [6]

Babay ©   (14.02.05 11:11) [4]
в описании говорится что вроде как версия винды проверяется.


где там проверяется? мура это!!!!

если хочешь в точности сделать такой же код, то используй GiveIO.sys

Google  в помощь!


 
grom   (2005-02-14 19:23) [7]

>отдельный поток
Будильник v 1.2
http://i-s-v.org.ua/



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
3-1109149293
DelphiN!
2005-02-23 12:01
2005.03.27
Помогите написать SQL запрос


6-1106577869
Urvin
2005-01-24 17:44
2005.03.27
Клиент-сервер


1-1110874872
Petukhov
2005-03-15 11:21
2005.03.27
Internal error L594


4-1108563010
Fuzzy
2005-02-16 17:10
2005.03.27
Как узнать обьем ж. диска и свободное место на нем? Pascal.


14-1110024414
fc
2005-03-05 15:06
2005.03.27
Эксперемент[1]. Кривые зеркалА.