- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Программирование портов. Звук.
Управление аппаратурой компьютера осуществляется через управляющие регистры этой аппаратуры. Каждый из регистров имеет свой адрес от 0000h до FFFFh . Этот адрес или номер называется портом и программирование аппаратуры путем непосредственного обращения к портам называется программирование через порты. Обращение к портам осуществляется с помощью 2-х команд.
In - ввод из порта
Out - вывод в порт
Рассмотрим программирование через порты на примере управления динамиком компьютера.
П
1
61h
Таким образом, программа должна непосредственно переключать этот бит, что исключает выполнение другой программы. Для того чтобы получить звуковое сопровождение одновременно с выполнением другой программы необходимо воспользоваться методом описанным ниже.
Пример простейшей программы, генерирующий одиночный звуковой сигнал заданной высоты.
Cli ; запрет асинхронного прерыванмя
in AL,61h ; ввод содержимого порта 61h
mov CX,4000 ; длительность звукового сигнала
begin:
push CX ; сохранить служебный цикл
or AL,2 ; установим бит 1
out 61h,AL ; выведем в порт , включив динамик
mov CX,1000 ; пауза, в течении которой через
loop $ ; динамик течёт ток
and AL,11111101B ; сбросим бит 1
out 61h,AL ; выведем в порт, выключив динамик
mov CX,1000 ; организуем паузу, в течении которой
loop $ ; через динамик не течёт ток
pop CX ; восстановим служебный цикл
loop begin ; выводим
sti ; разрешим прерывание
cli – в действительности просто запретить прерывание только от таймера, который прерывая 18 раз в сек будут прерывать генерацию тока и искажённость звука . Для выборочного запр. прерывания надо программировать контролер, запрещающий все прерывания. Поместить данные из порта можно только в регистр AL или AX. Номер порта задаётся в команде в виде числа, если номер не превышает FFh или поместить в регистр DX. В последнем случае используется команда in AL,DX .
Чтение из порта необходимо, т.к. нельзя изменять отдельные биты.
Команда loop $ передаёт управление сама на себя, т.е.label1: loop label1.
Команда and сбрасывает бит. Ток в динамике выключается, образуя второй полупериод звукового колебания. Частота и длительность звукового тока в этом случае зависит от скорости работы процессора. Для того чтобы не зависеть от CPU используется следующая история.
Программирование звукового канала таймера.
В прграммирование звука указывают 2 микросхемы - таймер и ЛПА, управляющей клавиатурой и динамиком.
Таймер
Микросхема таймера работает независимо от процессора (и параллельно с ним) от собственного генератора, вырабатывающего сигналы с частотой 1,19318 Мгц. Таймер имеет 3 независимых канала. Для управления режимом каналов используется регистр команд ( порт 43h). Каждый канал включает счётчик передающий импульы от ГТИ в регистр-фиксатор, в которой программно заносится число, определяющее коэффициент пересчета. Фиксаторы каналов таймера адресуются через порты 40h, 41h, 42h.
При включении компьютера в фиксатор канала 0 записывается число 65535(FFFFh)(максимально возможное число), в результате чего сигналы на входе канала 0 имеют частоту 18.2 1/с. Эти сигналы возбуждают прерывания с вектором 08h, который определяется программой,осуществляя отсчёт текущего времени.
Канал 2 связан с динамиком и используется для генерации звука. Изменяя содержимое фиксатора этого канала можно изменять частоту сигналов, поступающих на динамик от 18,2Гц до 1,19Мгц.
Реально для возбуждения звука можно использовать частоты приблизительно до 10Кгц.
ППА имеет следующие порты 60h-порт А
61h-порт В
62h-порт С
Порт А используется для приёма кодов, нажимаемых на клавиатуре, порты В и С для управления клавиатурой и таймером и для хранения информации о конфигурации компьютера. Микросхемы ППА используются в IBM PC и CP/XT. В PC/AT и PS/2 такой микросхемы нет, однако приём с клавиатуры и управление таймером осуществляется через порты с теми же адресами.
Бит 0 порта 61 управляет включением и выклячением канала 2 таймера. Если бит 0 в 1 , то на выходе канала действует сигнал заданой частоты, при сбросе бита 0- сигналы отсутствуют. Бит 1 управляет током, текущим через динамик. Т.е. прекратить работу динамика можно либо сбросив в 0 бит 0 либо бит 1.
Программирование любого канала таймера осуществляется путём пересылки кода в регистр команд(43h).
Формат 7 6 5 4 3 2 1 0
канал код режим 0 – дв. сч.
операции 1 –дв. дес.
Режим - разовый и периодический с различной скважностью.
Для возбуждения звука используется режим 011- периодическая генерация прямоугольных сигналов со скважностью 2. В битах 4 и 5 записывается способ загрузки в фиксатор константы. Обычно используется код 11, что позволяет загрузить в фиксатор 16-ти разрядную константу пересчёта 2-мя последовательными командами. Сначала младшие байты, потом старший. Т.о. управляющее слово оказывается равным 10110110В или В6h.
mov AL,0B6h ;управляющее слово
out 43h,AL ;в регистр команд
;установим частоту канала 2 таймера
mov AX, 11930 ;1193000Гц 11930=100Гц
out 42h,AL ;младший байт константы в порт
movAL,Ah
out 42h,AL ;старший байт константы в порт
;включим динамик и разрешим разрешим работу таймера
in AL,61h ;
or AL,3 ;установим биты 0 и 1
out 61h,AL ;
;После загрузки выключим динамик и запретим таймер звука
and AL, 11111100B ;сбросим биты 0 и1
out 61h,AL
На любом этапе вывода звука можно изменять его частоту (эффект летящей бомбы)
;режим таймера
mov AL,0B6h
out 43h,AL
;вкл. динамик
in AL,61h
or AL,3
out 61h,AL
;изменяем частоту в процессе звучания
mov CX,200 ;число шагов
music: mov AX,tone
out 42h,AL
mov AL,AH
out 42h,AL
snb tone,30 ;изменим константу пересчёта задержки
loop music
;выключить динамик
in AL,61h
and AL,0FCh
out 61h,AL
tone dw 5000
Таймер допускает повторную загрузку фиксатора после того, как однозначно установлен режим его работы.
Загр.
2б. знак (int и другие) AX
4б (long, float, ..) AX, BX
8б (double) AX, BX, CX, DX