Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория. Архитектура компьютеров.doc
Скачиваний:
3
Добавлен:
28.10.2018
Размер:
479.74 Кб
Скачать

5. Особенности программирования

5.1. На языке Турбо-Паскаль.

5.1.1. Для чтения вектора прерывания и для изменения таблицы

векторов прерываний используйте предопределенный массив MemW. Нап-

ример, для чтения смещения вектора 9 можно применить выражение

ofs_:= MemW[0000:4*9];

а для записи сегмента адреса обработчика прерываний в $60-й

вектор прерываний -

Memw[0000:4*$60+2]:=Seg(Int9d);

где: ofs_:word - переменная для временного хранения значения

смещения;

Int9d - имя процедуры обработки (коррекции) прерывания 9.

5.1.2. Для запрещения и разрешения прерываний используйте ли-

бо команды на ассемблере:

begin

. . . . .

asm

Cli {прерывания запрещены}

end

. . . . .

asm

Sti {прерывания разрешены}

end

. . . . . .

либо операторы Inline с машинными командами:

begin

. . . . .

Inline($fa) { Cli }

. . . . . .

Inline($fb) { Sti }

. . . . . .

Inlin

5.1.3. Для вызова программ обработки заданного прерывания ис-

пользуется процедура Intr.

Процедура Intr имеет следующую форму:

Intr(IntNo : byte; var Reg : Registers),

где:IntNo - номер прерывания (0...255),

Reg - запись типа Registers, определенного в модуле DOS, со-

держащая значения регистров процессора. Надо указать в программе

модуль DOS после uses или включить в программу следующее описание

типа записи:

type

Registers = record

case integer of

0:(AX, BX, CX, DX, BP, SI, DI, DS, ES,

Flags : word);

1:(AL, AH, BL, BH, CL, CH, DL, DH : byte);

end;

где: AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags,AL,AH,BL,BH,CL, CH,DL,DH

- переменные, соответствующие одноименным регистрам процессора.

При выполнении программного прерывания (выполнении процедуры

Intr) процедура Intr загружает регистры AX, BX, CX, DX, BP, SI,

DI, DS и ES процессора значениями из записи Regs (задаются пользо-

вателем). Когда обработка прерывания завершается, содержимое ре-

гистров AX, BX, CX, DX, BP, SI, DI, DS, ES и Flags возвращается в

запись Regs.

Ограничения: Программные прерывания, которые зависят от опре-

деленных значений в SP или SS на входе или изменяют значения SP

или SS на выходе, не могут быть выполнены с помощью этой процеду-

ры.

5.1.4. Собственная процедура обработки прерываний имеет сле-

дующий вид:

procedure NewIntr(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS,

ES, BP : Word); Interrupt;

begin

...

end.

Примечание:

-имя процедуры задается пользователем;

-любое число параметров (в том числе и все) в процедуре можно

опускать, но только подряд начиная с начала.

Вызов пользовательской процедуры обработки прерывания осу-

ществляется с помощью процедуры Intr (см. п. 5.1.2). Предваритель-

но адрес процедуры пользователя должен быть занесен в таблицу век-

торов прерывания в соответствии с выбранным номером прерывания

либо путем прямой записи (см. п. 5.1.1), либо с помощью процедуры

SetIntVec (см. п. 5.1.5), а адрес системной процедуры обработки

данного прерывания сохранен либо в переменной (см. п. 5.1.1), либо

с помощью процедуры GetIntVec (см. п. 5.1.4).

5.1.5. Процедура GetIntVec возвращает адрес заданного вектора

прерывания и имеет следующий вид:

GetIntVec(IntNo:byte; var Vector:pointer),

где:IntNo задает номер прерывания (0...255) и адрес возвраща-

ется в параметре Vector).

5.1.6. Процедура SetIntVec устанавливает заданный вектор пре-

рывания по заданному адресу и имеет следующий вид:

SetIntVec(IntNo:byte; Vector:pointer),

где:IntNo задает номер прерывания (0...255) и Vector задает

адрес (при задании адреса можно воспользоваться оператором @ или

функцией Addr).

5.1.7. Чтобы сделать программу резидентной, т.е. такой, кото-

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

работки прерывания должны быть такие), необходимо использовать в

конце программы процедуру Keep(0), которая завершает программу и

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

да возврата).

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

ных, сегмент стека и "кучу", необходимо перед программой указать

директиву компилятора, минимизирующую резидентную область памяти:

{$m $800,0,0}.

5.2. На языке Турбо-Си.

5.2.1. Для чтения вектора прерывания и для изменения таблицы

векторов прерываний используйте дальние указатели(сhar far *). Нап-

ример, для установки указателей на вектора 9 и 60 можно применить

выражение

char far * adr_p,int9_p;

adr_p= (char far *)(4*9);

int9_p= (char far *)(4*60);

а для записи адреса обработчика 9 прерываний в 60-й

вектор прерываний -

* int9_p=* adr_p;

5.2.2. Для вызова программ обработки заданного прерывания ис-

пользуется процедура geninterrupt(IntNo),

где:IntNo - номер прерывания (0...255).

Надо указать в программе подключение библиотеки директивой

#include <dos.h>

5.2.3. Собственная процедура обработки прерываний должна быть

обработана специальным модификатором Турбо-Си interrupt,который ав-

томатически сохраняет значения всех регистров и восстанавливает их

перед возвратом управления вызывающей программе.При этом использу-

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

RET.

Собственная процедура обработки прерываний должна быть описана

как:

void interrupt New_intr();

Тогда при вызове автоматически определяется ее начальный адрес,

которому присваивается значение указателя

* adr_p=(char far *)New_intr;

5.2.4. Чтобы сделать программу резидентной, т.е. такой, которая

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

ки прерывания должны быть такие), необходимо использовать в конце

программы функцию 31H прерывания 21H,кототорая завершает программу

и оставляет ее в памяти резидентной.

union REGS in,out;

in.h.ah=0x31;/*задание 31H функции завершить и оставить резидентной

в регистер ah*/

in.h.al=0;/*код возврата*/

in.x.dx=size;/*обьем выделенной памяти в 16_байтных параграфах */

int86(0x21,&in,&out);/*обрашение к 21 прерыванию с параметрами*/

6. Индивидуальные задания

6.1. Осуществить коррекцию прерывания Int 9 (от клавиатуры)

так, чтобы:

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

прерывания;

б) при нажатии одной из клавиш-переключателей вывести на эк-

ран название этой клавиши.

6.2. Клавишу-переключатель выбрать по следующему правилу:

нк := нс mod 8,

где:нк - номер клавиши-переключателя в табл. 1;

нс - номер студента в журнале.

7. Содержание отчета

7.1. Тема лабораторной работы.

7.2. Цель работы.

7.3. Индивидуальное задание.

7.4. Текст программы.

7.5. Результаты работы программы.

Лабораторная работа 4 ОРГАНИЗАЦИЯ РАБОТЫ КЛАВИАТУРЫ ПЭВМ

1. Цель работы

Изучение организации и принципов работы клавиатуры и приобре-

тение практических навыков управления микропроцессором клавиатуры.

2. Темы для предварительной проработки

2.1. Организация и принцип работы клавиатуры ПЭВМ.

3. Описание работы

3.1. Принципы работы клавиатуры. На рис. 1 представлена упро-

щенная схема клавиатуры.

┌───┬───┬──── +5B

Переключатели клавиатуры

│ │ │ │ │ │ ┌──┬────┬──┐

─────┼────────┼────────┼────┴───┴───┴────┤X0│CPU │ │

─────┼────────┼────────┼─────────────────┤X1│ │ │

─────┼────────┼────────┼─────────────────┤X2│ │ │

│ │ │ . . . │X3│ │ │

│ │ │ │..│ │Z ├──────>

│ │ │ │ │ │ │К систем-

│ │ │ ├──┤ │ │ному бло-

─────┼────────┼────────┴─────────────────┤Y0│ │ │ ку ПЭВМ

─────┼────────┴──────────────────────────┤Y1│ │ │

─────┴───────────────────────────────────┤Y2│ │ │

│Y3│ │ │

│..│ │ │

└──┴────┴──┘

Рис.1.

Схема клавиатуры

В качестве контроллера клавиатуры используется специализирован-

ный микропроцессор Intel 8042, имеющий два порта - входной и выход-

ной. Входной порт (X) подключен к горизонтальным линиям матрицы, а

выходной (Y) - к вертикальным. Все горизонтальные линии подключены

также через резисторы к источнику питания +5B.

Устанавливая по очереди на каждой из вертикальных линий уро-

вень напряжения, соответствующий логическому нулю, клавиатурный

контроллер опрашивает состояние горизонтальных линий. Если нажатых

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

ветствует логической 1 (т. к. все эти линии подключены к источнику

питания +5B через резисторы).

Если оператор нажмет на какую-то клавишу, то соответствующие

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

этой вертикальной линии процессор установит значение логического

нуля, то уровень напряжения на горизонтальной линии также будет

соответствовать логическому нулю.

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

логического нуля, клавиатурный процессор фиксирует нажатие на кла-

вишу. Он посылает в центральный процессор запрос на прерывание

(Int 09H) и восьмиразрядный номер клавиши в матрице записывает в

порт 60H. Аналогичные действия выполняются, когда оператор отпус-

кает нажатую ранее клавишу.

Номер клавиши, посылаемый клавиатурным процессором, однознач-

но связан с распайкой клавиатурной матрицы и не зависит напрямую

от обозначений, нанесенных на поверхность клавиш. Этот номер назы-

вается скан-кодом (Scan Code). Отметим, что скан-код отжатой кла-

виши отличается от скан-кода нажатой клавиши единицей в старшем

бите (т.е. больше на 128).

Слово scan ("сканирование") подчеркивает, что клавиатурный

процессор сканирует клавиатуру для поиска нажатой клавиши.

Если нажать на клавишу и не отпускать ее, клавиатура перейдет

в режим автоповтора. В этом режиме в центральный процессор автома-

тически через некоторый промежуток времени, называемый периодом

авповтора, посылается код нажатой клавиши.

3.2. Порты для работы с клавиатурой.

Для работы с клавиатурой ПЭВМ типа XT и AT использует порты с

адресами 60H и 61H.

Порт 60H при чтении содержит скан-код последней нажатой кла-

виши. Он также участвует в управлении клавиатурного процессора.

Порт 61H управляет не только клавиатурой, но и другии уст-

ройствама компьютера, например, работой встроенного динамика. Этот

порт доступен как для чтения, так и для записи. Если старший бит

порта равен 1, то клавиатура будет заблокирована, если 0 - разбло-

кирована. Нужно отметить, что поскольку порт 61H управляет не

только клавиатурой, то при сбросе старшего бита необходимо осталь-

ные разряды порта оставить без изменения.

3.3. Команды контроллера клавиатуры.

Процессор 8042 обслуживает не только клавиатуру, но и другие

системы компьютера (например, с его помощью выполняется возврат

процессора 80286 из защищенного режима работы в реальный). Все

свои действия процессор осуществляет, выполняя соответвующие ко-

манды.

Для посылки команды необходимо вначале убедиться в том, что

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

кольких байтов, проверка осуществляется для каждого байта). Это

можно сделать, прочитав слово состояния 8042 из порта с адресом 64

h. Бит с номером 1 должен быть равен нулю (биты нумеруются с 0).

После того как программа дождется готовности процессора 8042, она

может послать ему команду, записав ее в порт с адресом 60h (это

делается для каждого байта команды).

Для управления клавиатурой процессор 8042 использует следую-

щие команды:

3.3.1. Команда установки характеристик режима автоповтора.

Команда состоит из двух байтов. Первый байт: код команды - 03

Fh; второй байт определяет характеристики режима. Его формат

представлен в таблице 1:

Таблица 1

────────────────────────────────────────────────────────────────

Биты Значение

────────────────────────────────────────────────────────────────

0-4 Период автоповтора:

0 - 30.0; 0Ah - 10.0;

1 - 26.7; 0Dh - 9.2;

2 - 24.0; 10h - 7.5;

4 - 20.0; 14h - 5.0;

8 - 15.0; 1Fh - 2.0.

Период автоповтора определяет количество посылок

скан-кода, генерируемых процессором клавиатуры в

одну секунду. Можно использовать не только те зна-

чения, которые приведены выше, но и промежуточные,

например, 9 или 15h.

5-6 Задержка включения режима автоповтора:

00 - 250 мс;

01 - 500 мс;

10 - 750 мс;

11 - 1000 мс.

7 Зарезервировано, должно быть 0.

──────────────────────────────────────────────────────────────────

Первоначально при инициализации системы период задержки для

включения режима автоповтора устанавливается модулями BIOS равным

500 мс при периоде автоповтора, равным 10 повторам в секунду.

3.3.2. Команда управления светодиодами клавиатуры.

Команда состоит из двух байтов. Первый байт: код команды -

0Dh; формат второго байта представлен в таблице 2:

Таблица 2

───────────────────────────────────────────────

Биты Значение

───────────────────────────────────────────────

0 1 - включить светодиод ScrollLock

1 1 - включить светодиод NumLock

2 1 - включить светодиод CapsLock

3-7 Не используется

───────────────────────────────────────────────

3.3.3. Команда возврата к значениям, задаваемым BIOS.

Код команды - 0F6h.

4. Порядок выполнения

4.1. В соответствии с индивидуальным заданием:

-установить соответствующие период и задержку автоповтора;

-осуществить мигание соответствующего светодиода.

4.2. Путем чтения из порта 60h скан-кода определить клавишу,

скан-код нажатия которой совпадает с номером студента в журнале.

Определить скан-код отжатия этой клавиши. При определении скан-ко-

дов можно воспользоваться алгоритмом, приведенным на рис.2.

── 1 ──────────────

Начало

─────────┬─────────

│ ┌

┌── 2 ────┴─────────┐ │Для предотвращения чтения

│ Задержка 100 мс │ │скан-кодов отжатия клавиш

└─────────┬─────────┘ │Ctrl и F9 при запуске

│ │программы

─ 3 ────┴───────

┌─── I = 1, 2 ─────────────────┐

│ ────────┬─────── │

│ │ │

│ ┌── 4 ────┴─────────┐ ─ 8 ────┴────────

│ │Чтение из порта 60H│ Конец

│ │ скан-кода │ ─────────────────

│ └─────────┬─────────┘

│ │

│ ┌───────────>

│ │ ┌── 4 ────┴─────────┐

│ │ │Чтение из порта 60H│

│ │ │ скан-кода │

│ │ └─────────┬─────────┘

│ │ │

│ │ да 5

│ └── скан-коды

│ совпадают?

│ │нет

│ │

│ ─ 6 ────┴────────

│ "новый" скан-код

│ ────────┬────────

│ │

│ ┌── 7 ────┴─────────┐

│ │"старый" скан-код │

│ │ = "новому" │

│ └─────────┬─────────┘

└──────────────┘

Рис.2

4.3. После выполнения пп. 3.1 и 3.2 восстановить характерис-

тики клавиатуры в исходное состояние.