Как следующий код издает звуковой сигнал для ПК? - PullRequest
1 голос
/ 13 мая 2011
void Sound(int f)
{  
    USHORT   B=1193180/f; 

    UCHAR temp = In_8(0x61);
    temp = temp | 3; 
    Out_8(0x61,temp);

    Out_8(0x43,0xB6);
    Out_8(0x42,B&0xF);
    Out_8(0x42,(B>>8)&0xF);
}

In_8 / Out_8 читает / записывает 8 бит в / из указанного порта (подробности реализации опущены).

Как издает звуковой сигнал ПК?

ОБНОВЛЕНИЕ

Почему здесь используется &0xF?Разве это не должно быть 0xFF?

1 Ответ

5 голосов
/ 13 мая 2011

ПК имеет микросхему таймера 8255, управление которой осуществляется через порты 0x61, 0x43 и 0x42.

Когда порт 0x61 бит 0 установлен на 1, это означает «включить таймер, который подключен к динамику». Когда порт 0x61 бит 1 установлен на 1, это означает «включить динамик».

Это делается в первом абзаце вашего кода.

Вторая часть помещает «магическое значение» 0xB6 на порт 0x43, что означает, что следующие два байта, поступающие на порт 0x42, будут интерпретироваться как делитель для частоты таймера. Результирующая частота деления (1193180 / делитель) будет отправлена ​​на динамик.

http://gd.tuwien.ac.at/languages/c/programming-bbrown/advcw3.htm#sound

...