Сообщение
Mickle » 04.04.2018,10:53
Не за что!
Поскольку программа писалась 20 лет назад и никакого readme к ней я сделать так и не удосужился, исправлюсь сейчас:
SET переменная для обнаружения не используется. Наличие на шине SB и Adlib/OPL устройств определяется независимо друг от друга.
Базовый порт SB ищется по стандартной процедуре в диапазоне от 210h до 280h с шагом 10h, для Adlib/OPL используется список [228h, 388h, 318h, 288h, 218h], после чего производится проверка на наличие отклика стерео синтезатора - порт 220h.
Если базовый порт SB найден, читается версия DSP и текстовая строка ID string (при наличии).
Номера каналов IRQ и DMA определяются тремя независимыми способами:
1) Самый опасный. Сохраняется состояние регистров масок контроллеров прерываний, затем маскируются все источники. Далее во вложенном цикле перебираются комбинации возможных IRQ [5,7,9,10,11,12,15,2,3] и DMA [1,3,0,2], временно снимается маска с выбранного канала IRQ и устанавливается обработчик-заглушка. Инициализируется блочная DMA пересылка длиной 2 сэмпла DSP командой 014h (DMA DAC, 8-bit) и в течении 10000 I/O циклов шины ожидается прерывание по завершении пересылки. Вне зависимости от того, пришло прерывание или нет, снимается обработчик IRQ, производится сброс регистров и инициализация SB. Если прерывание получено и счётчик DMA обнулён, восстанавливаются регистры масок контроллеров прерываний и возвращается флаг успеха поиска IRQ/DMA.
2) Позволяет получить только номер канала IRQ. Для этого воспроизводится такая же последовательность, как в п.1, только вместо инициализации DMA и запуска пересылки используются команды DSP 0F2h (IRQ Request, 8-bit) и 0F3h (IRQ Request, 16-bit), соответственно из подмножества команд SB1.0 и SB16.
3) Работает только на SB16-совместимых картах. Номера каналов IRQ/HiDMA/LoDMA читаются из регистра микшера по индексу 80h.
После этого этапа снова производится тест/инициализация регистров SB, проверяется наличие микшера и выводятся уставки первых трёх регуляторов.
В завершении работы программа сбрасывает флаг стерео-режима SBPro в регистре микшера 0Eh. Делать это конечно совсем не обязательно, но я постоянно сталкивался с ситуацией, когда изначально монофонический звук в некоторых играх "портился" из-за установленного флага чередования сэмплов между стерео каналами SBPro.
P.S. Не могу сказать точно, но припоминаю, что FM синтезатор затихал после запуска SBTEST, в случае, если игра его не де-инициализировала.