Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
19
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

Iret ;Вернуться

COLORS ENDP

; Подпрограмма инициализации:

; --------------------------

Initze proc near ;Выполнять только один раз

ASSUME DS:INTTAB

PUSH DS ;Обеспечить возврат в DOS

MOV AX,INTTAB ;Установить сегмент данных

MOV DS,AX

CLI ;Запретить прерывания

;Замена адреса обработчика:

MOV AX,WORD PTR KBADDR ;Сохранить адрес

MOV WORD PTR KBSAVE,AX ; BIOS

MOV AX,WORD PTR BADDR+2

MOV WORD PTR KBSAVE+2,AX

MOV WORD PTR KBADDR,OFFSET COLORS ;Заменить

MOV WORD PTR KBADDR+2,CS ; адрес BIOS

STI ;Разрешить прерывания

MOV DX,OFFSET INITZE ;Размер программы

Int 27h ;Завершить и остаться

Initze endp ; резидентом

CSEG ENDS

END BEGIN

__________________________________________________________________________

Рис.23.2 Резидентная программа

Пример на рис.23.2 иллюстрирует резидентную программу, которая

устанавливает цвет экрана при одновременном нажатии клавиш Alt и Left

Shift. Основные моменты, представляющие интерес:

Сегмент INTTAB определяет таблицу векторов прерываний, начинающуюся

по адресу 0, а точнее - адрес элемента для прерывания 9 (ввод с

клавиатуры), названный в программе KBADDR.

Имя ROMAREA определяет сегмент, начинающийся по адресу 400Н, и в нем

флаговый байт клавиатуры (KBFLAG), который отражает состояние клавиатуры.

Бит 3 в этом байте регистрирует нажатие клавиши Alt, а бит 1 - нажатие

клавиши Left Shift.

Сегмент CSEG начинает сегмент обычной COM-программы. Первая

выполняемая команда JMP INITZE обходит резидентную часть и передает

управление в процедуру инициализации (INITZE) в конце программы. Эта

процедура устанавливает в регистре DS адрес таблицы векторов прерывания

(INTTAB) и передает адрес элемента таблицы для INT 9 (KBADDR) в поле

KBSAVE в резидентной процедуре. Следующим шагом в таблице в KBADDR

утанавливается адрес резидентной процедуры (COLORS) (первое слово) и

содержимое регистра CS (второе слово). Таким образом, KBADDR содержит

теперь два измененных слова: смещение и значение адреса из регистра CS,

которые вместе определяют адрес процедуры COLORS в памяти, куда будут

направляться теперь все символы, поступающие с клавиатуры. Затем процедура

инициализации заносит в регистр DX размер процедуры COLORS (адрес INITZE

на один байт больше, чем адрес конца процедуры COLORS) и прекращает

работу, используя INT 27H.

Процедура COLORS является резидентной, и она получает управление при

нажатии любой клавиши на клавиатуре. Так как это происходит при работе

других программ (например, DOS или текстового редактора), то процедура

должна сохранить все регистры, которые она использует (а также несколько

других на всякий случай). Затем происходит вызов по адресу KBSAVE, т.е.

вызов подпрограммы обработки прерывания, после чего процедура проверяет

флаг клавиатуры для определения нажатия клавиш Alt и Left Shift. Если эти

клавиши были нажаты, то процедура устанавливает необходимые цвета.

Завершающие команды включают восстановление всех запомненных вначале

регистров (в обратной последовательности) и выход из обработки прерывания

по команде IRET.

Поскольку приведенная программа носит иллюстративный характер, ее

можно модифицировать или расширить для собственных целей. Некоторые

фирменные программы, также изменяющие адрес в векторной таблице для

прерывания 9, не разрешают конкурентное использование резидентных

программ, аналогичных рассмотренной в данной главе.

ПОРТЫ

________________________________________________________________

Порт представляет собой устройство, которое соединяет процессор с

внешним миром. Через порт процессор получает сигналы с устройств ввода и

посылает сигналы на устройство вывода. Теоретически процессор может

управлять до 65 536 портами, начиная с нулевого порта. Для управления

вводом-выводом непосредственно на уровне порта используются команды IN и

OUT:

- Команда IN передает данные из входного порта в регистр AL

(байт) или в регистр АХ (слово). Формат команды:

IN регистр,порт

- Команда OUT передает данные в порт из регистра AL (байт) или

из регистра АХ (слово). Формат команды:

OUT порт,регистр

Номер порта можно указывать статически или динамически:

1. Статическое указание порта возможно при непосредственном

использовании значения от 0 до 255:

Ввод: IN AL.порт# ;Ввод одного байта

Вывод: OUT порт#,АХ ;Вывод одного слова

2. Динамическое указание порта устанавливается в регистре DX от

0 до 65535. Этот метод удобен для последовательной обработки

нескольких портов. Значение в регистре DX в этом случае увеличивается

в цикле на 1. Пример ввода байта из порта 60Н:

MOV DX,60H ;Порт 60Н (клавиатура)

IN AL,DX ;Ввод байта

Ниже приведен список некоторых портов (номера в шестнадцатиричном

представлении):

21 Регистры маски прерывании.

40...42 Таймер/счетчик

60 Ввод с клавиатуры

61 Звуковой порт (биты 0 и 1)

201 Управление играми

3B0...3BF Монохромный дисплей и параллельный адаптер печати

3D0...3DF Цветной/графический адаптер

3F0...3F7 Дисковый контроллер

Если, например, программа запрашивает ввод с клавиатуры, то она

выдает команду прерывания INT 16H. В этом случае система устанавливает

связь с BIOS, которая с помощью команды IN вводит байт с порта 60Н.

На практике рекомендуется пользоваться прерываниями DOS и BIOS.

Однако можно также успешно обойтись без BIOS при работе с портами 21,

40...42, 60 и 201. Листинги BIOS в техническом руководстве по IBM PC

содержат различные примеры команд IN и OUT.

ГЕНЕРАЦИЯ ЗВУКА

________________________________________________________________

Компьютер имеет возможность генерировать звук посредством встроенного

динамика с постоянным магнитом. Можно выбрать один из двух способов

управления динамиком или использовать оба в комбинации: 1) использование

бита 1 порта 21 Н для активизации микросхемы Intel 8255A-5

(программируемый периферийный интерфейс) (РР1); 2) использование триггера

программируемого интервального таймера Intel 8353-5 (PIT). Часовой

генератор выдает сигнал с частотой 1,19318 МГц. Таймер PPI управляет

триггером 2 через бит 0 порта 61 Н.

Программа на рис.23.3 генерирует серию звуковых нот с возрастающей

частотой. Значение в поле DURTION формирует продолжительность звучания

каждой ноты, а значение в поле TONE определяет частоту звучания. В начале

работы программа считывает содержимое порта 61 Н и сохраняет полученное

значение. Команда CLI сбрасывает флаг прерываний, обеспечивая равномерное

звучание. Интервальный таймер генерирует 18,2 такта в секунду, что (при

отсутствии CLI) прерывает выполнение программы и вызывает появление звука.

Значение поля TONE определяет частоту звука: большие значения дают

низкую частоту, а малые - высокую. После того, как подпрограмма BIOSPKR

исполнит очередную ноту, она увеличивает частоту звука посредством сдвига

вправо на 1 бит значения в поле TONE (т.е. делит значение поля TONE на 2).

Так как уменьшение TONE в данном примере приводит к сокращению

продолжительности звучания, то подпрограмма также увеличивает DURTION

посредством сдвига его значения на один бит влево, т.е. удваивает это

значение.

Программа завершается, когда содержимое поля TONE уменьшится до нуля.

Начальные значения в полях DURTION и TONE не имеют принципиального

значения. Можно поэкспериментировать с другими значениями, а также

испытать выполнение без команды CLI. Можно изменить программу для

генерации звуков с уменьшающейся частотой, установив для этого в поле TONE

значение 01, а в поле DURTION - некоторое большее значение. В каждом цикле

при этом необходимо увеличивать значение в поле TONE и уменьшать значение

в поле. DURTION. При достижении нуля в DURTION программу можно завершить.

Можно использовать любые варианты исполнения последовательности нот,

например, для привлечения внимания пользователя.

__________________________________________________________________________

TITLE SOUND (COM) Процедура для генерации звука

SOUNSG SEGMENT PARA 'Code'

ASSUME CS:SOUNG,DS:SOUNG,SS:SOUNG

ORG 100H

BEGIN: JMP SHORT MAIN

; -------------------------------------------------------

DURTION DW 1000 ;Время звучания

TONE DW 256H ;Высота (частота) звука

; -------------------------------------------------------

MAIN PROC NEAR