Мелодия из «Призрака оперы» через системный динамик — классическая учебная задача на MASM: программа напрямую программирует канал 2 таймера Intel 8253/8254 через порты 42h и 43h, а звук включается установкой битов порта 61h. Если ваша программа молчит, чаще всего причина в том, что забыт стробирующий бит в порте 61h либо делитель частоты записан в неверном порядке — сначала младший байт, затем старший.
В этой статье разберём принцип генерации тона, структуру таблицы нот для фразы из «Призрака оперы», типовой каркас программы на MASM и типичные ошибки, из-за которых спикер молчит или играет «мимо» нот. Материал ориентирован на DOS-окружение (реальное или в DOSBox), поскольку прямой доступ к портам в современных Windows приложениям запрещён.
Как PC-спикер превращает числа в звук
Системный динамик подключён к каналу 2 программируемого интервального таймера. Таймер получает базовую частоту примерно 1,193 МГц (точное значение — 1193180 Гц), и вы задаёте делитель: частота ноты равна 1193180, делённому на этот делитель. Например, для ноты Ля первой октавы (440 Гц) делитель будет примерно 2712.
Последовательность действий строго фиксирована. Сначала в порт 43h записывается управляющее слово, выбирающее канал 2 и режим генератора прямоугольных импульсов. Затем в порт 42h дважды выводится делитель — младший байт, потом старший. Наконец, в порт 61h записывается значение с установленными двумя младшими битами, которые подключают выход таймера к динамику.
💡Частота ноты = 1193180 / делитель. Делитель всегда пишется в порт 42h двумя байтами: сначала младший, затем старший.