2. Ход работы
2.2. Исследование генерации звука способом 1
2.2.1.
Прочитаем и запишем содержание порта 61h. Для этого воспользуемся командой

CMD>> i61
которая возвращает результат 20h = 00100000b.
2.2.2.
Программа отсутствует в каталоге, поэтому была набрана согласно методическим указаниям
2.2.4.
К сожалению, поскольку программа выполнялась на современном ноутбуке, звук не удалось услышать
2.2.5.
2.2.6.
Увеличить частоту звука в два раза можно уменьшив значение 2000 в регистре CX
в два раза.
2.3.Изучение программирования канала таймера на примере канала 0 - канала системных часов
2.3.1.
Введем в AFD программу установки канала 0 на генерацию меандра, приведенную в методических указаниях (Рис. 2.1), изменив значение счетчика на 1FFFh.
2.3.3.
Сохраним программу, выполнив команду
4
Рис. 2.1. Установка канала 0 на генерацию меандра.

CMD>> W timer.bin, DS:0200, 1000
2.3.4.
Выполним приведенную программу
2.3.5.
Выйдя из AFD в NORTON, измерили по секундомеру длительность одной минуты по временному табло NORTON: 1mnorton ≈ 7.5s, значит k = 60/7.5 = 8
При этом теоретически должны были получить
1FFFh = 8191
f = 1.1931812 Мгц, Fi = 1193182/8191 = 145.7
t = 145.7/18.2 ≈ 8 что совпадает с результатами.
2.4. Выполнение генерации звука согласно способу 2
2.4.1.
Запрограммируем второй канал на генерацию при начальном значении счетчика
FFFFh.
5
|
|
|
|
Рис. 2.2. Способ 2. |
|
|
|
|
|
|
0100: MOV |
AL, |
B6 |
|
|
0101: OUT |
[43], |
AL |
|
|
0104: MOV |
AX, |
FFFF |
; начальное значение счетчика |
|
0107: OUT |
[42], |
AL |
|
|
0109: MOV |
AL, |
AH |
|
|
010A: OUT |
[42], |
AL |
|
|
010C: IN |
AL, |
[61] |
|
|
010E: OR |
AL, |
03 |
|
|
0110: OUT |
[61], |
AL |
; включение звука |
|
0112: IN |
AL, |
[61] |
|
|
0114: AND |
AL, |
FC |
|
|
0116: OUT |
[61], |
AL |
; выключение звука |
|
|
|
|
|
|
|
|
|
|
2.4.2.
Определим максимальную частоту генерации звука, последовательно уменьшая в два раза начальное значение счетчика. Звук становится неразличим при значении счетчика
20h, то есть максимальная частота составляет (20h ·2 = 40h = 64) fmax = 1193182/64 = 18643.47 Гц.
6
2.5. Генерация звука согласно способу 3
Программа не найдена, поэтому введена вручную.
2.5.1.
|
|
|
|
|
|
0100: MOV |
AX, |
0 |
|
|
0103: MOV |
ES, |
AX |
|
|
0105: MOV |
AX, |
12D |
|
|
0108: CLI |
|
|
|
|
0109: MOV |
ES:[70], AX |
|
|
|
010D: MOV |
AX, |
CS |
|
|
010F: MOV |
ES:[72], AX |
|
|
|
0113: STI |
|
|
; установка флага прерывания |
|
; генерация звука |
|
|
|
|
0114: MOV |
BX, |
FFFF ; в ВХ начальное значение счетчика 7FFFF |
|
|
0117: CALL |
11E |
|
; установка нового значения счетчика |
|
0118: SHR |
BX, |
1 |
|
|
0119: JMP |
117 |
|
|
|
011E: MOV |
AL, |
36 |
; Подпрограмма устанавливает начальное значение |
|
канала счетчика 0 таймера |
|||
|
0120: CLI |
|
|
|
|
0121: OUT |
[43], |
AL |
; устанавливаемое значение в регистре ВХ |
|
0123: MOV |
AX, |
BX |
|
|
0125: OUT |
[40], |
AL |
|
|
0127: MOV |
AL, |
AH |
|
|
0129: OUT |
[40], |
AL |
|
|
012B: STI |
|
|
|
|
012C: RET |
|
|
|
|
; блок кода обработчика |
|
||
|
012D: IN |
AL, |
[61] |
; Пользовательская подпрограмма обработки |
|
012F: XOR |
AL, |
02 |
; прерываний системных часов |
|
0131: OUT |
[61], |
AL |
|
|
0133: IRET |
|
|
|
|
|
|
|
|
7
Благодаря помощи со стороны было выяснено, что приведенный код не отрабатывает корректно, если оставить в обработчике строку IN AL, [61]. Таким образом, установив точку перехода в программе на следующую за проблемной строкой позицию звук по-
явился:
|
0105: MOV |
AX, 12F |
|
||
|
|
|
2.5.2.
Программа запускалась пошагово для более тонкого контроля за изменением часто-
ты.
2.5.4.
Программа не зависала ни в одной из версий.
2.5.5.
Последнее значение счетчика, которое содержится в регистре BX = 0000h.
Причем частота при BX = 0000h вернулась к примерно той же, что и при BX = FFFFh.
Рис. 2.3. Конечное значение BX.
8
