MOV CX, n
spkr: LOOP spkr
В приведенном фрагменте n — число, при котором цикл исполняется требуемое время. Методика расчета приведена в [1]. Для генерации паузы в микросекундах и выше этот метод не пригоден и лучше использовать системный таймер, как будет показано дальше.
freq DB 1000 ;Частота в Гц
cycles DW 100 ;Длительность
. . .
MOV BX,cycles
MOV DI,freq
MOV AL,0B6H ;Записать в регистр режим таймера
OUT 43H,AL
MOV DX,12H ;Делитель времени =
MOV AX,2870H ;1190000/частота
DIV DI
OUT 42H,AL ;Записать младший байт счетчика таймера 2
MOV AL,AH
OUT 42H,AL ;Записать старший байт счетчика таймера 2
IN AL,61H ;Считать текущую установку порта 61Н
MOV AH,AL ;и сохранить ее в регистре AH
OR AL,3 ;Включить динамик
OUT 61H,AL
expect: MOV CX,2801 ;Выждать
spkr: LOOP spkr
DEC BX ;Счетчик длительности исчерпан ?
JNZ expect ;НЕТ - продолжить звучание
MOV AL,AH ;ДА - восстановить исходную
OUT 61H,AL ;установку порта
Рисунок 4.4
Комбинируя два метода управления динамиком, можно добиться различных звуковых эффектов.
Далее рассматриваются методы организации и подсчета временных интервалов для различных прикладных целей. Как отмечено выше, канал 0 таймера используется для генерирования аппаратных прерываний по таймеру с вектором INT 8h. С помощью прерывания BIOS 1Ah можно прочитать или изменить содержимое счетчика (табл. 4.2). Номер функции передается через регистр AH.
Для определения времени выполнения какой-либо операции или программы берется начальное показание счетчика времени, который сравнивается с показанием счетчика после завершения операции. На рисунке 4.5 показан пример измерения промежутка времени в пределах часа. При этом используются только 2 младших байта счетчика. При этом необходимо учитывать возможность перехода через границу (начальное значение счетчика превысит конечное).
Таблица 4.2 ¾ Использование прерывания 1Ah
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.