Приложение 9. Работа с портами ввода-вывода.

Несколько замечаний по работе с портами.

В микропроцессорах Intel изначально определены две команды для работы с портами: IN (для вывода из порта) и OUT (для ввода в порт). Начиная с 286-го процессора, появились также команды строковой пересылки INS и OUTS (см. гла­ву 26), их мы здесь не рассматриваем. Есть две разновидности команд IN и OUT. Если номер порта не превышает FFH, то используется прямая адресация: IN AL,port, IN AX,port, OUTport,AL, OUTport,AX. Если номер порта превышает FFH, то ис­пользуется косвенная адресация через регистр DX: IN AL,DX, IN AX,DX, OUT DX,AL,OUTDX,AX.

После выполнения каждой команды IN/OUT, вообще говоря, требуется некоторая задержка, т.к. внешнее устройство может не успеть среагировать, а последующая ко­манда выполнится не вовремя. Известно также, что такой задержки не требует видео­система. Рекомендуется делать задержку вида:

JMP МЕТ

МЕТ:

или просто JMP SHORT $+2. В некоторых ситуациях реакция оборудования про­веряется по содержимому, какого-либо порта. При программировании некоторых уст­ройств следует учесть и задержки, связанные с работой этих устройств. Это, в частно­сти, касается и работы с гибким диском. Довольно часто в задержке нет необходимос­ти, но познается это на практике.

Работа с клавиатурой.

Управление клавиатурой в машинах класса AT построено на основе микроконт­роллера Intel 8042. Контроллер клавиатуры выполняет следующие действия: прием данных от клавиатуры; проверка четности поступившего байта;

- трансляция (кодирование) полученной информации;

помещение байта данных в вьгходной буфер и извещение процессора;

- передача байта во входной буфер клавиатуры.

Для каждой клавиши клавиатурой вырабатывается два кода: код нажатия и код прерывания (клавишу отпустили). Коду прерывания предшествует код FOh. Контрол­лер преобразует коды от клавиатуры в scan-коды. Код FOh (при отпускании) преобра­зуется в 7-й бит scan-кода. Некоторые клавиши, однако, могут быть запрограммирова­ны только на посылку клавиши нажатия. Кроме того, при длительном удержании кла­виши начинают посылать повторные коды нажатия.

Регистр состояния контроллера клавиатуры. Доступен по чтению по адресу 64Н. Биты регистра:

0 - равен 0, если выходной буфер клавиатуры пуст.

1 - состояние входного контроллера клавиатуры. Равен нулю, если буфер пуст.

2 - отражаеттот факт, что тестирование клавиатуры прошло.

3 - указывает контроллеру, как интерпретировать полученный байт. Если бит 1, то байт считается данным, если 0 - байтсчитается командой.

4- если бит, равен 0, то клавиатура заблокирована.

5 - устанавливается в 1, если передача байта в клавиатуру не была завершена.

6 - устанавливается в 1, если прием байта от клавиатуры не был закончен в задан­ный промежуток времени.

7 - если значение равно 1, то последний принятый байт содержал четное число единиц, т.е. произошла ошибка.

Входной буфер контроллера. Доступен по записи: б0п - запись данных, б4Н -запись команды.

Выходной буфер контроллера. Доступен по чтению по адресу б0Н. Входной порт контроллера клавиатуры. Доступен по чтению по команде СОН. Биты:

0-3 - резерв.

4 - указывает количество RAM на системной плате.

5 -значениепереключателя фирмы-изготовителя.

6 - определяет тип видеоадаптера.

7 - указывает, заблокирована или нет клавиатура. Данный порт устарел и данные, возможно, недостоверны.

Выходной порт контроллера клавиатуры. Доступен по чтению (команда DOH) и по записи (команда D1H). Биты:

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

1 - определяет состояние дополнительной адресной линии А20. 2-3 - значениянеопределены.

4 - содержит 1, если выходной буфер полон.

5 - равен 1, если входной буфер пуст.

6 - определяет значение линии часов при передаче данных в клавиатуру.

7 - определяет значение линии данных при передаче их в клавиатуру.

Порт состояния входных линий. Значение может быть считано по команде ЕОН.

0 - состояниевходнойлиниичасов.

1 - состояние входнойлинии данных. 2-7 не определены.

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

Как уже упоминалось, команды передаются через порт 64Н, Если у команды су­ществует параметр, то он помещается сразу за посылкой команды в порт 60Н.

Команда 20Н. После этой команды контроллер записывает значение управляю­щего байта в выходной буфер.

Команда 60Н. Запись управляющего байта контроллера (поместить в порт 60Н). Значение битов:

0 - значение 1 приводиткгенерированию прерывания от контроллера клавиатуры, если выходной буфер содержит данные.

1 - обычно 0.

2 - заменяет собой соответствующий бит управляющего регистра контроллера.

3 - при установке в 1, переключатель замка клавиатуры перестает действовать. 4-при установке в 1 клавиатура отключается.

5 - режим интерфейса. При установке в I не выполняется проверка четности, и не преобразуются scan-коды.

6 - бит совместимости. 7-0.

Команда ААН. Внутренний тест контроллера. Если ошибок нет, то в выходной буфер посылается 55h. После данной команды следует восстановить управляющий байт (см. команды 20h и 60h).

Команда АВН. По команде выполняется тест интерфейса между контроллером и клавиатурой. Результат помещается в выходной буфер:

00-ошибок нет,

01 - сигнал линии часов завис в нижнем положении,

02 - сигнал линии часов завис в верхнем положении,

03 - сигнал линииданныхзависвнижнемположении,

04 - сигнал линии данных завис в верхнем положении.

Команда АСН. Выполняетсядиагностическийдамп 16-байтнойпамяти контрол­лера, текущего состояния входного и выходного порта, а также слова состояния кон­троллера. Дамп выдается в виде последовательности scan-кодов. В конце выдается символьная строка, идентифицирующая фирму-изготовитель.

Команда ADH. Блокировка клавиатуры.

Команда АЕН. Разблокировка клавиатуры.

Команда СОН. Чтение входного порта. Значение порта помещается в выходной

буфер.

Команда D0H. Чтение выходного порта. Значение порта помещается в выходной

буфер.

Команда D1H. Помещает байт в выходной порт контроллера клавиатуры. Команда Е0Н. Команда предназначена для помещения информации о состоянии входныхлинийТОиН из порта состояния входных линий в выходной буфер. Команды F0H-FFH - сброс выходного порта.

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

Команды передаются через входной буфер 60Н. Если необходим параметр, то он передается после подтверждения получения команды. Подтверждением того, что кла­виатура приняла команду, является чтение процессором из порта 60h байта ответа кла­виатуры. Ответ посылается на все команды, кроме ЕЕН и FEH.

Команда EDH. Установка и сброс индикатора состояния. Следующий за ко­мандой параметр представляет собой байт, первые 3 бита которого определяют состо­яние индикаторов, а остальные равны 0:0 - Scrol Lock, 1 - Num Lock, 2 - Caps Lock.

Команда ЕЕН. На данную команду клавиатура откликается такой же командой (эхо). Используется для диагностики.

Команды EFH, F1H. Недействительные команды.

Команда FOH. Установка или запрос таблицы скан-кодов. Входной параметр: 0 -получить номер таблицы, 1 - установить таблицу 1,2 - установить таблицу 2,3 - уста­новить таблицу 3.

Команда F2H. Прочитать идентификатор. Вначале посылается подтверждение, а затем идентификатор - 83АВН.

Команда F3H. Задание частоты повтора кода клавиш и начальной задержки. Ис­пользуются биты 0-6:

частота

повтор = 4.17*(8+4*Ь2+2*Ь1+Ь0)*2*(2*Ь4+ЬЗ).

Команда F4H. Включение клавиатуры. После этой команды клавиатура посылает подтверждение, чистит свой внутренний буфер и переходит в состояние ожидания.

Команда F5. По этой команде все характеристики устанавливаются в исходные, затем клавиатура блокируется и ждет дальнейших команд.

Команда F6h. Аналогична предыдущей, но клавиатура не блокируется.

Команды F7h-FAh. Характер реакции клавиш:

F7h - все клавиши повторяемые,

F8h - все клавиши посылают код нажатия и код прерывания, F9h - все клавиши посылают только код нажатия,

FAh - все клавиши повторяемые и посылают коды нажатия и прерывания. Команды FBh-FDh. Определение действия отдельных клавиш.

- клавиша повторяемая, FCh - клавиша посылает код нажатия и прерывания, FDh - клавиша посылает только код нажатия.

При посылке такой команды следует послать scan-код клавиши (таблица 3).

Команда FEh. Повторить передачу - клавиатура повторяет передачу.

Команда FFh. Сброс клавиатуры. Выполняется внутренний тест и посылает AAh если все удачно, FCh - ошибка.

В качестве примера работы с клавиатурой ниже мы приводим программу которая несколько раз периодически зажигает и тушит индикато­ры клавиатуры. Еще один пример использования изложенного выше материала Вы можете найти в главе 23, где приводится простая программа тестирования клавиатуры.

CODE SEGMENT

ASSUME CS:CODE,   DS:DATA, SS:STAK

BEGIN:

MOV    AX, DATA MOV DS,AX MOV    _CL, 0 MOV    COUNT,0 mov     AL, о

/ отключить   прерывания   клавиатуры   на   уровне контроллера /прерываний,  другие прерывания работают исправно MOV    AL,00000010В

OUT 21H,AL

LOO:

/ждать,   когда освободится  входной буфер

CALL WAIT_IN_BUF /послать команду

MOV AL,0EDH

OUT 60H,AL /ждать подтверждение

CALL WAIT_0UT

IN    AL,60H /правильное ли подтверждение?

CMP AL,OFAH

JNZ ERR1

/теперь ждем,   когда можно посылать параметр CALL WAIT_IN_BUF MOV   AL,00000001В MOV CL,_CL

/переход к   следующему индикатору

SHL AL,CL

OR _AL,AL

MOV AL,_AL

OUT 60H,AL / небольшая задержка

CALL DELAY

INC _CL ли  индикаторы зажгли?

CMP   _CL, 3

JNZ LOO

MOV _CL,0

MOV   _AL, 0

CALL WAIT_IN_BUF

погасим  все индикаторы

MOV AL,OEDH

OUT 60H,AL

CALL WAIT_OUT

IN    AL,60H

CMP AL,0FAH

JNZ ERR1

CALL WAIT_IN_BUF

MOV    AL, 0

OUT 60H,AL

INC COUNT

;не пора ли заканчивать? CMP   COUNT,20 JZ END CALL DELAY JMP LOO

ERR:

POP AX

ERR1:

MOV  AL, 0 OUT 21H,AL LEA DX,MES INT 2Ш MOV AX,4C01H INT 21H

END:

MOV  AL, 0

OUT 21H,AL

MOV AX,4C00H

INT 21H

;ждать,   когда  освободится  входной буфер WAIT_IN_BUF PROC XOR CX,CX

Tl:

IN AL,64H TEST AL,2 LOOPNZ Tl JNZ ERR RETN

WAIT_IN_BUF ENDP

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

WAIT_OUT PROC

ТЗ:

IN AL,64H

TEST AL,1

JZ T3

RETN WAIT_OUT ENDP DELAY PROC

XOR CX,CX

LL1:

PUSH CX MOV CX,50

LL2 :

LOOP LL2 POP CX

LOOP LL1 RETN

DELAY ENDP CODE ENDS DATA SEGMENT _CL      DB ? _AL      DB ? COUNT DW ?

MES    DB       'Произошла ошибка клавиатурыI'jl^lO,^*

DATA ENDS

STAK SEGMENT STACK

DB  50 DUP(?)

STAK ENDS

END BEGIN

Рис. PI2,1, Пример простой программы программирования клавиатуры.

Порты для работы с параллельным интерфейсом.

В главе 7 мы довольно полно осветили вопрос работы с параллельным портом (с принтером). Здесь мы ограничимся кратким справочным материалом.

BIOS поддерживает до 3-х параллельных портов. При обнаружении порта адрес его регистра данных записывается, начиная с адреса 0:408h, и ему присваивается имя LPTn, гдеп= 1,2,3. Ниже представлена адресация регистров параллельных портов.

Порт

Регистр данных

Регистр состояния

Региструправления

LPT1

звсн

3BDH

ЗВЕН

LPT2

378Н

379Н

37АН

LPT3

278Н

279Н

27АН

Описание регистров. Регистр данных.

Биты 0-7 - значение передаваемого или считанного байта. Регистр состояния.

Биты:

0-1-резерв,

2-0 если устройство подтвердило прием предыгдущего байта.

3 - 0 при выработке принтером сигнала ошибки.

4 -1 если данное устройство выбрано.

5 - 1 если получен сигнал конец бумаги.

6 - 0 - устройство готово к приему.

7 - 0 - устройство занято.

800 % i А88БМВЬЕЦ.Уче6пыйкурс

Регистр управления. :

Биты:

0 - сигнал строба, когда принимает значение 1, данные могут считываться с линий данных.

1 - если 1, то после печати каждой строки принтер автоматически будет перехо­дить на следующую строку.

2 - 0 - инициализация принтера.

3 - 1 - устройство считается выбранным.

4 -1 - параллельный порт посылает сигнал прерывания.

5 - 0 - операция записи, 1 - операция считывания.

Если на Вашем компьютере к параллельному порту подключен принтер, то Вам вполне достаточно прерывания 17Н для полного управления принтером. Описание регистров, представленное нами, может Вам понадобиться, если Вы решили исполь­зовать параллельный порт для других целей (например, обмен информацией между компьютерами). Программа работы с принтером - см. главу 7 (Рис. 7.8).

Работа с DMA.

Контроллер DMA играет роль канала ввода-вывода, который позволяет разгру­зить микропроцессор. Посредством этого контроллера данные из периферийного уст­ройства передаются непосредственно в память (или наоборот).

В машинах класса AT установлено два контроллера DMA, каждый из которых имеет 4 канала. Каждый канал может обслуживать свое устройство. Поскольку один кон­троллер подключен к одному каналу другого контроллера, то всего получается 7 свободных каналов. Каждый канал имеет свой приоритет, наибольшим приоритетом обладает канал с номером 0.

В контроллере DMA используются 8- и 16-разрядные регистры. Запись в 16-раз­рядный регистр осуществляется по 8 бит. Вначале пишется младший байт, затем стар­ший. Перед записью следует обнулить специальный указатель (указатель последова­тельности байт).

В состав контроллера DMA входит 7 регистров:

1. Регистр команд. Адрес 08Н. Режим доступа - для записи. Число разрядов - 8. Управляет работой контроллера. Содержимое регистра устанавливается во время ини­циализации компьютера. Значение битов:

0 - 0 - обмен запрещен, 1 - обмен разрешен.

1 - 0 - фиксация адреса запрещена, 1 - фиксация адреса разрешена.

2 - 0 - контроллер доступен, 1 - контроллер недоступен.

3 - 0 - нормальная передача, 1 - ускоренная передача.

4 - 0 - фиксированные приоритеты, 1 - циклические приоритеты. ■ 5-0 -задержкапри записи, 1 -расширенная запись.       v ' ■■ " ■ •■■

6 - 0 * запрос активен при высоком уровне сигнала, 1 - запрос активен при низком уровнесигнала.

2. Регистр состояния. Адрес 08Н. Для чтения. Число разрядов - 8. Указывает состояние линий каналов.

Биты 0-3 - указывают состояние завершения для каналов 0-3.0 - обмен не завер­шен, 1 - обмен завершен. Биты 4-7 - определяют состояние линий запроса на обмен для каналов 0-3.0-нет запроса, 1 -запрос активен.

3. Регистр запросов. Адрес 09Н. Для записи. Число разрядов - 8. Предназначен для программного указания запроса на работу канала.

Биты 0-1 служат для указания канала:

00- каналО,

01- каналі, 10-канал 2,

- канал

Бит 2 - устанавливает запрос: 0 - сбросить запрос, 1 - установить запрос. Остальные биты зарезервированы и могут принимать любое значение.

4. Регистр индивидуальных масок. Адрес 0АН. Для записи. Число разрядов - 8. Предназначендлямаскирования каналов.

Биты 0-1 служат для указания каналов (аналогично регистру запросов).

Бит2 - команда маскировки: 0 - размаскировать канал, 1 - замаскировать канал.

Остальные биты, зарезервированы и могут принимать любое значение.

5. Регистр режима. Адрес ОВН. Для записи. Число разрядов - 8. Служит для установки режима работы канала.

Биты 0-1 указывают канал (см, пред.). Биты 2-3 - тип передачи данных:

00 - блокировка записи в память,

01 - запись в память,

- чтение из памяти,

11 - недопустимое значение.

Бит 4 - режим автоинициализации: 0 - автоинициализация выключена, 1 - авто­инициализация включена.

Бит 5 - направление изменения адреса при обмене: 0 - увеличение адреса, 1 - умень­шение адреса.

Биты 6-7 - режим передачи данных:

00 - передача по требованию,

01 - передача байта, 10-передача блока,

- каскадирование.

6. Вспомогательный регистр. Адрес ОСН. Для записи. Число разрядов - 8. При записи туда любого числа очищается регистр защелки. Это делается перед установкой

режима работы.

7. Регистр масок. Адрес ОБН. Для записи. Число разрядов - 8. Предназначендля управления масками каналов.

Биты 0-3 - определяют каналы: 0 - размаскировать канал, 1 - замаскировать канал. Остальные биты зарезервированы и могут принимать любое значение.

8, Временный регистр. Адрес ООН. Для чтения. Число разрядов - 8. Хранит байт для передачи и используется контроллером.

Кроме того, каждый канал имеет по пять регистров:

1. Регистр базового адреса. Разрядность -16. Для записи, каналы адрес

0 ООЬ

1 02І1

2 0411

3 06І1

2. Регистр текущего адреса. Разрядность

Для

каналы адрес

0 00h

1 . 02h

2 04h

3 06h

3. Регистр базового счетчика. Разрядность

Для

каналы адрес

0 Olh

1 03h

2 05h

3 07h

4. Регистр текущего счетчика. Разрядность 16. Для чтения.

каналы адрес

0 Olh

1 03h

2 05h

3 07h

5. Регистр страницы. Разрядность 8. Для записи.

0 87h

1 83h

2 81h

3 82h

Адрес памяти для обмена между DMAh периферийными устройствами задается для каждого канала через два регистра: регистр адреса и регистр страницы. В резуль­тате имеем 24-разрядный адрес памяти. Границы страницы расположены по адресам 10000Н, 20000Н и т.д. Поскольку адрес не должен пересекать границу страницы, то передача т.о. может производиться блоками размером не более 64К Для некоторых современных контроллеров такого ограничения не существует.

При программировании DMA записываются регистры базового адреса, регистр страницы и базовый счетчик.

Режимы работы:

- передача байта по каждому запросу от периферийного устройства;

- передача блока, шина захватывается на время передачи блока;

S03

- передача по требованию, периферийное устройство в любой момент может пре­рвать передачу, а затем возобновить с этого же места;

- каскадирование, позволяет подключать несколько контроллеров DMA Одиниз каналов ведущего контроллера используется для подключения ведомого.

Типы передачи:

автоинициализация, после окончания передачи контроллер приходит в исход­ное состояние;

- циклический сдвиг приоритетов каналов после каждой передачи; ускоренная передача, передача без цикла ожидания.

Дополнительные команды.

Установка начального значения указателя последовательности байт. Для это­го записывается произвольное значение в регистр по адресу ОСН.

Общий сброс. Записывается произвольное значение в регистр по адресу 0DH.

Размаскирование каналов. Записывается произвольное значение в регистр по адресу ОЕН.

Во всех приведенных случаях должно записываться 16-битноечисло.

Расширение для машин AT.

Адресация общих регистров каналов 4-7:

Регистр команд -D0H,

Регистр состояния - D0H,

Регистр запросов - D2H,

Регистр индивидуальных масок - D4H,

Регистр режима - D6H,

Временный регистр - DAH,

Регистр масок-DEH,

Указатель последовательности байт- D8H,

Общий сброс-DAH,

Размаскирование каналов - DCH.

Адресация регистров каналов 4-7:

1. Регистр базового адреса. Разрядность -16. Для записи, каналы адрес

4 COh

5 C4h

6 C8h

7 CCh

2. Регистр текущего адреса. Разрядность -16. Для чтения, каналы адрес

4 COh

5 C4h

6 C8h

7 CCh

3. Регистр базового счетчика. Разрядности6. Для записи, каналы адрес

4 C2h

5 Сбп

6 CAh

7 CEh

4. Регистр текущего счетчика. Разрядность И б. Для чтения, каналы адрес

4 C2h

' 5 " C6h

6 CAh

7 CEh

5. Регистр страницы. Разрядность - 8. Для записи.

каналы адрес

4 8Fh

5 8Bh

6 89h

7 8Ah

Программирование DMA. ЕЗамаскироватьканал.

2. Загрузить регистры адреса, страницы и счетчика.

3. Установить режим работы канала в регистре режима.

4. Размаскировать канал.

Адреса всех указанных регистров совпадают с адресами портов. Так, например, для маскирования канала 3 необходима следующая последовательность команд:

MOVAL, 00000111В OUT 0АН, АІі

Приведем еще несколько полезных фрагментов. Сбросить запрос для канала 1:

> MOV AL,00000001В

OUT

Для второго канала установить режим автоинициализации с блокированием запи­си в памяти. Режим - передача блока, направление изменения адреса - уменьшение.

mov al,0111d010b

OUT OBH,AL

80S

Назначение каналов.

О-свободен,

1 - свободен,

2 - контроллер гибких дисков,

3 - контроллер винчестера, каскадирование,

5 - свободен,

6- свободен,

7- свободен.

Пример программирования DMA приведен ниже (см. контроллер гибких дисков).

Работа с гибкими дисками.

Накопители на гибкихдисках соединены с контроллером линиями. Состояние сле­дующих линий отображается в регистрах контроллера:

сигнал обнаружение индекса,

сигнал положения головок на дорожке,

сигнал защиты записи,

сигнал смены дискеты. Способ записи на гибкий диск MFM - модифицированная фазовая модуляция. Для дискет IBM PC существует стандартный формат дорожки. Дорожка состоит из записей следующих типов:

начало дорожки,

сектор на дорожке,

конец дорожки.

Начало дорожки:

- GAP4A- промежуток, записываемый контроллером при форматировании до­рожки. 80 байт, заполненных значением 4ЕН.

- SYNC- промежуток, записываемый контроллером при форматировании дорож­ки. Содержит    байт, заполненных значением

- IAM - адресный маркер, записываемый при форматировании. Содержит 3 бай­та С2Н со специальньгм нарушением последовательности бит синхронизации и байт со значением FCH.

- GAP 1 - промежуток, записываемый при форматировании дорожки. Содержит 50 байтов, заполненных значением 4ЕН.

Сектор:

- SYNC-содержит 12 байтов, заполненных значением OOh.

- IDAM - адресный маркер идентификатора сектора. Содержит 3 байта А1Н со специальным нарушением последовательности бит синхронизации, а также зна­чение FEh - признак маркера идентификатора.

- CYL - номер цилиндра (один байт).

- HEAD-номер головки. Занимает один байт.

- SEC - номер сектора, один байт.

- N0 - код размера сектора, один байт. Длина сектора равна 128*2ANO.

- CRC1 - контрольная сумма идентификатора сектора-два байта.

- GAP2 - промежуток в 22 байта, заполненный 4ЕН.

- DATA AM - адресный маркер данных. Записывается при форматировании и при записи. Содержит 3 байта А1Н со специальным нарушением последовательнос­ти бит синхронизации и значение FBH (обычныеданные), F8H (стертыеданные), поле данных.

- CRC2 - контрольная сумма данных (2 байта).

- GAP3 - промежуток, записываемый при форматировании. Длина промежутка задается в команде форматирования. Значения:

5.25/360 - 80, 5.25/1.2 - 84, 3.5/720  - 80,

3.5/1.4   -   108. . ■ ■

Конец дорожки:

- GAP4B - промежуток, записываемый контроллером при форматировании до­рожки. Содержит4ЕН.

Регистры контроллера гибких дисков.

Базовый адрес портов регистров контроллера гибких дисков равен 3FOH.

Регистр состояния. Относительный адрес 4. Предназначен для определения раз­решения и направления передачи данных между микропроцессором и контроллером. Доступен по чтению.

БитыО-1 - устанавливаются в 1 для накопителей 0 и 1 соответственно, когданако-питель находится в режиме установки головки.

Биты 2-3 - резерв.

Бит 4 - устанавливается в 1 сразу после передачи в контроллер байта команды. Сбрасывается после завершения фазы чтения результата.

Бит 5 - устанавливается в 1 во время фазы выполнения команды. Действителен когда в команду SPECIFY указан режим работы без DMA.

Бит 6 - 0 - данные передаются от микропроцессора к контроллеру, 1 - наоборот.

Бит 7 - 0 - передача данных разрешена, 1 - передача данных запрещена.

Регистр данных. Относительный адрес 5. Через этот регистр передается байт дан­ных между микропроцессором и контроллером. Доступен по чтению и записи.

Регистр сигналов входов. Относительный адрес 7. Определяет смену дискеты в

накопителе. Доступен по чтению.

Бит 7 (единичное значение) указывает, что дискета была сменена.

9. Работа с портами ввода-вывода

Регистр конфигурации. Относительный адрес 7. Определяет скорость передачи данных между контроллером и накопителем. Доступен по записи. Биты 0-1: 00 - 500 Кб/сек 01-300 Кб/сек 10-250Кб/сек П - резерв.

Регистр управления. Относительный адрес 2. Предназначен для управления на­копителем. Доступен по записи.

Биты 0 - выбор накопителя для работы. Бит 1=1.

Бит 2 - 0 - выполнить сброс, 1 - контроллер доступен. Бит 3 - 0 - работа с DMA и прерываниями запрещена, 1 - разрешена. Бит 4 - 0 выключить мотор накопителя 0,1 - включить мотор. Бит 5-0 выключить мотор накопителя 1,1- включить мотор. Биты 6-7 - резерв.

Регистры состояния. Существуют четыре регистра состояния. Байты из этих ре­гистров можно получить после выполнения команд. Регистр состояния 0. Биты 0-1: 00 - накопитель О, 01-накопитель 1, 10-накопитель2,

- накопитель 3.

Бит2 - номер головки (стороны), для которой выполнялась операция. Бит 3-резерв.

Бит4 - устанавливается в 1, если при выполнения команды «рекалибровка», после 77 сигналов управления перемещением головок не получен сигнал "Дорожка О". Бит 5 - определяет завершение команды установки (1). Бит 6-7:

00 - нормальное завершение команды,

01 - ненормальное завершение команды,

10 - недействительная команда,

11 - аварийное завершение. Регистр состояния 1.

БитО -1 - не найден адресный маркер.

Бит 1 -1 - если активен сигнал защита записи.

Бит2 -1 - не найден сектор или адресный маркер не может быть прочитан. БитЗ-зарезервирован.

Бит4 -1 - если запрос контроллера не обслужен со стороны процессора или DMA. Бит 5 - указывает на ошибку контрольной суммы. Бит 6 - резерв.

Бит 7 - устанавливается в 1 при попытке получить доступ сектору за последним сектором на цилиндре.

Регистр состояния 2.

Бит 0 -1, если во время операции чтения не найден адресный маркер. Бит 1 -1, если внутренний номер цилиндра контроллера не совпал с номером ци­линдра из идентификатора сектора и равен FFH. Бит 2 - резерв. Бит 3 - резерв.

Бит 4-1, если внутренний номер цилиндра контроллера не совпал с номером ци­линдра из идентификатора сектора.

Бит 5 -1 при фиксации ошибки контрольной суммы в поле данных.

Бит 6 -1 при Попытке получить доступ к сектору с отметкой "стертый".:'

Бит 7-резерв.

Регистр состояния 3.

Бит 0 - номер выбранного накопителя.

Бит 1 - резерв.

Бит 2 - номер выбранной головки (стороны). Бит 3 - резерв.

Бит 4 -1 когда головки находятся на дорожке 0. Бит 5 - резерв.

Бит 6- 1 - установлена защита записи. Бит 7-резерв.

Описание команд контроллера.

В общем случае команды контроллера гибких дисков состоят из трех фаз: команд­ная фаза (1), фаза выполнения (2), фаза получения результата (3). Для описания ко­манд введем следующие обозначения, широко используемые в технической литерату­ре по контроллерам гибких дисков.

С - номер цилиндра,

головки, R - номер сектора, N - код длины сектора,

- номер последнего сектора на дорожке,

- длина межсекторного промежутка

DTL - длина передаваемых данных (0 для 128 байтного сектора и FFH в осталь­ных случаях),

STO-регистр состояния О, ST1 - регистр состояния 1, ST2 - регистр состояния 2, ST3 - регистр состояния 3, HDS - выбор номера головки, DS - выбор номера накопителя, HLT - время загрузки головок,

- время разгрузки головок, МТ- многодорожечная операция,

ЖЛЧ - новый номер цилиндра,

РСТЧ - текущий номер цилиндра,

8К - признак пропуска стертых данных,

8РчТ - время между последовательными сигналами на перемещение головок, ТС - конец счетчика,

- секторов на дорожке, Б - заполнитель,

ЗБЕЬ- скорость передачи данных между накопителем и контроллером. Команда чтения данных.

фазы данные

1

mt 1

sk 0

0 1 10

 

0 0

0 0

0 HDS 0 D S

 

С

 

 

 

н

 

 

 

R

 

 

 

N

 

 

 

EOT

 

 

 

GPL

 

 

 

DTL

 

 

2

ST0

 

 

3

ST1

ST2 с H R

N

 

 

Команда чтения стертых данных.

фазы данные_

1 МТ 1 SK 0 1 1      0 0

0    0 0    0 0 HDS 0 DS

С

Н

R

N

EOT GPL DTL

2

3

STO

 

 

ST1

 

 

' ST2

 

-

с

 

 

н

 

 

R

 

 

n

 

Команда записи данных.

фазы

Данные

 

1

■      МТ 10 0 0 1

0 1

 

0   0  0  0  0 HDS

0 DS

 

С

 

 

Н

 

 

R

 

 

N

 

 

EOT

 

 

GPL

 

 

DTL ■

 

2

 

 

3

STO

 

 

ST1

 

 

ST2

 

 

С

 

 

Н

 

 

R

 

 

N

 

Команда записи стертых данных.

фазы

данные

 

1

МТ10 0 1 0

0 1

 

0    0 0 0 0 HDS

0 DS

 

с -

 

 

Н

 

 

R

 

 

n

 

 

EOT

 

 

GPL

 

 

DTL

 

2

з sto st1

ST2

С

н

R

n

Команда чтения дорожки.

фазы данные

0 10 0 0 0 10 0 0 0 0 0HDSODS

С

н R

n

EOT GPL DTL

2

з sto st1 st2 с н

R

n

1

Команда форматирования дорожки.

фазы данные

1 010011 01

0 0 0 0 0 hds 0 ds

n sc GPL d

С

н

R

n

2

З STO STl

ST2

байт неопределен байт неопределен байт неопределен байт неопределен

Команда чтения идентификатора. По этой команде считывается первый обнару­женный на дорожке идентификатор сектора.

фазы данные"

l

0 1

0

0

1

0

1

0

 

0 0

0

0

Q

HDS

Q

DS

2

 

 

 

 

 

 

 

3

STO

STl

ST2 с н R

n

 

 

 

 

 

 

Команда рекалибровки. Предназначена для установки начального' положения головок на нулевой цилиндр.

фазы Данные

l G1GGG111

QQQQQQQ DS

Команда установки. Предназначена для установки головок на требуемый цилиндр.

Фазы данные

1 0 0 0 0 1 1       1 1

0 0 0 0 0ЬГО8ОО8

Получить результат прерывания.

фазы данные

1 0000 1 000

З STO

PCN

Получить состояние устройства.

фазы данные

1 0 0 0 0 0 1 0~0

0 0 0 0 0HDSODS 3 ST3

Команда "определить". Предназначена для программирования внутренних тай­меров контроллера.

фазы Данные .     - -. -

1 0 0 0 0 0 0 1 1

-— SKT—    - - HUT---

---HLT——-----ND

Значения SRT.

Скорость 500К

Скорость 300К

Скорость 250К

0

16

26.7

32

1

15

25

30

0ЕН

2

3.33

4

0FH

1

1.67 .

2

Значения

Скорость 500К

Скорость

Скорость 250К

0

256

426

512

1

16

26.7

32

ОЕН

224

373 '

448

0FH

240

400

480

Значения HLT.

Скорость 500К

Скорость300К

Скорость 250К

0

256

426

512

1

2

3.3

4

2

4

6.7

8 .

ОЕН

252

420

504

0FH

254

423

508

Рекомендуемые параметры команд.

Тип носит.

Тип

НЕТ SSEL

GPLRAV|F

5.25/360

360К DFH

02Н 02Н

2АН|50Н

5.25/1.2

360К DFH

02Н 01Н

2АН|50Н

5.25/1.2

1.2М

DFH

G2H

OOH

1BH|54H

 

3.5/720

72GК

DFH

G2H

G2H

2AH|50H

 

3.5/1.44

72GК

DFH

G2H

G2H

2AH|50H

 

3.5/1.44

1.44М

AFH

G2H

OOH

1BH|6CH

 

Ниже приведена программа работы с контроллером гибких дисков. Программа читает загрузочный сектор дискеты 1.4. В программе приведены все основные опера­ции, кроме записи и форматирования. Попробуйте осуществить эти операции само­стоятельно. Обращаю Ваше внимание на процедуру задержки, которая используется в данной программе, она взята из программы Р12.5.

; чтение данных из нулевого сектора дисковода 1.4

CODE SEGMENT

ASSUME CS:CODE, DS:CODE

ORG 1GGH

BEG:

/координаты для DMA

CALL   " SETCOORD прерывания XOR AX, AX MOV ES,AX

MOV AX,ES:[OEHM+2] MOV CS:OLDINTSE,AX MOV AX,ES: [OEHM] MOV  CS:OLDINTOF,AX MOV AX,OFFSET NEWINT CLI

MOV

MOV AX,CS

MOVES: {0EH*4+2],AX STI

контроллера ;скорость передачи данных

MOV DX,03F7H /адрес регистра скорости передачи данных MOV AL,0 /максимальная скорость  500 килобит/сек.

OUT DX, AL JMP   SHORT $+2 контроллера

CLI

DMA,   сброс    контроллера,   выключить мотор /выключить мотор устройства О MOV AL,00011000В

MOV DX,03F2H

OUT DX,AL JMP   SHORT $+2 ,-задержка приблизительно  29 мкс MOV DX, 35 CALL TIMERM

/разрешить DMA, работа контроллера, включить   мотор, устройство О MOVAL, 00011100В

MOV DX,03F2H ' OUT DX,AL JMP   SHORT $+2

CALL WAITINT ;ждем прерывания от контроллера

CMP   ERROR, 0 JZ DAL1 JMP _ERR

DALl:

/снимем прерывание для 4 устройств

/четырехкратное снятие необходимо только после команды "СБРОС" MOV СХ, 4

MOV        DL,11000000В

RES:

CALL   SENS I

■ CMP   ERROR, 1 JNZ DAL2 JMP _ERR

DAL 2 :

MOV AH,ST0 TEST AH,DL JZ DAL3

JMP _ERR

DAL3 :

INC     DL   /следующее устройство LOOP RES /ждем раскрутки мотора   (0.5 сек)

/возможно, что для некоторых устройств это время придется увеличить

MOV СХ,500 _WAIT1:

MOV  DX,1190 ';1 "J\l

CALL TIMERM

LOOP _WAIT1

/выполним  команду SPECIFY /необходима для определения внутренних /временных интервалов контроллера MOV AL,3

CALL OUTFP

■ CMP    ERROR, 1

JNZ JMP

DAL4 ERR

DAL 4:

DAL5:

MOV AL,OAFH

CALL OUTFP

CMP ERROR, 1

JNZ DAL5

JMP _ERR

MOV AL,2H ■

CALL OUTFP ■ CMP JNZ JMP

;ДЛЯ 1.4

;для всех

ERROR,1

DAL6

_ERR

DAL6:

RECALIBRATE /установка начального положения головок /команда выполняется дважды,   т.к.   для 80 /одной может не хватить MOV   CX, 2

RECAL:

CLI

MOV AL,7

CALL OUTFP

дорожек

CMP

JNZ

JMP

ERROR, 1

DAL7 _ERR

DAL7:

MOV   AL, 0

CALL OUTFP

^устройство 0

DAL 8:

CMP

JNZ

JMP

CALL CMP JNZ JMP

ERROR, 1

DAL8

_ERR ■ ■

WAITINT ERROR,1

DAL9 _ERR

DAL 9:

/Снять прерывание

CALL CMP JNZ JMP

SENS I ERROR, 1

DAL1O

_ERR

DAL10:

Я, Работа с портами ввода-вывода

;проверим

MOV AND JZ

ESHE:

результат AH,ST0

АН,11000000B

COMPL

LOOP RECAL JMP _ERR

COMPL:

MOV DX,18750

CALL

;читать один сектор /команда seek /переместить головку CLI

Время успокоения   головок   15 мс

начале дискеты

MOV

CALL

CMP

JNZ JMP

AL,0FH

OUTFP ERROR,

DAL23

_ERR 1

DAL23:

MOV AL, 0 CALL OUTFP

CMP ERROR,1

JNZ DAL231

JMP _ERR DAL231:

MOV AL,0

CALL OUTFP

CMP ERROR,1 JNZ DAL232

JMP _ERR DAL232:

CALL CMP

JNZ DAL589

JMP _ERR

DAL589:

CALL SENS1 CMP    ERROR, 1 JNZ DAL345 JMP _ERR

DAL345: ■

MOV DX,18750 CALL TIMERM

нужной дорожке

;нулевая дорожка

г ждем прерывания от контроллера

снять прерывание

/время успокоения  головок  15 мс

к

/установим DMA на передачу данных /память (команда 46Н)

MOV СХ,512

MOV AL,046H

CALL SETDMA ;команда чтения

CLI

MOVAL,046H CALL OUTFP CMP    ERROR,1

JNZ    DAL 11

JMP ERR

из контроллера

DAL11;

MOV AL,0

CALL OUTFP CMP    ERROR,1 JNZ DAL111

JMP _ERR DAL111:

чтения

/накопитель О,  поверхность О

MOV   AL, 0

CALL OUTFP

CMP    ERROR,1

JNZ DAL1112 JMP _ERR DAL1112: /цилиндр 0

MOV AL,0

CALL OUTFP . CMP    ERROR,1

JZ  _ERR •

MOV    AL, 1

CALL OUTFP

CMP    ERROR, 1

JZ _ERR

MOV AL,2

CALL OUTFP

CMP ERROR, 1 JZ _ERR

MOV AL,18

CALL OUTFP

О

1

/код длины 2

/количество секторов на дорожке

CMP    ERROR,1

jz ERR

MOV CALL

CMP   ERROR, 1

JZ ERR

;длина межзонного промежутка

MOV

CALL OUTFP CMP

JZ _ERR /длина данных

CALL

CMP ERROR,1 JZ _ERR ;ждем'прерывания от контроллера

/результат

CALL менять прерывание

CMP ERROR,1

JZ ERR

MOV AH,ST0

AND AH,11000000B

JNZ ERR

CALL WSE /         вывести результат

LEA

MOV AH,9

INT 21H

/в нулевом   (загрузочном)    секторе  по  смещению 36Н /находится слово   (8  символов),   определяющее тип /носителя.  Обычно это FAT12. MOV SI,OFSSECT

ADD

MOV СХ, 8

L002 :

LODSB

MOV DL,AL MOV АН, 2

INT 21H

LOOP L002

JMP SHORT _END

/конец работы

ERR:'

гт

;вывод содержимого регистра MOV DL,STO MOV АН,2 INT 21H MOV АН,9 LEA DX,TEXT1

STO  (как символа)

_END:

INT 21H

WSE

CALL RET

процедур установить DMA на

- код операции

- длина данных

SETDMA PROC

PUSH АХ

PUSH СХ

PUSH АХ

;маскируем второй CLI MOV

OUT

передачу данных

(10)

AL,00000110B 0AH,AL

JMP $+2 POP AX

OUT OCH,AL регистра защелки

JMP $+2 регистр режима  помещаем код операции нашем примере  это = 01000110В

канал 2 чтение в память (01)

выключена адрес увеличивается

; передача байта (01)

OUT OBH,AL JMP $+2

количество   передаваемых байт

PUSH СХ

адрес  памяти в DMA

(0),

MOV

AX,OFSDMA

,; смещение

out

4,AL

младший байт

JMP

$+2

 

MOV

AL, AH

 

OUT

4,AL

і г старший байт

JMP

$+2

 

MOV

AL,SEGDMA

; номер страницы

OUT

81H,AL

 

JMP

$+2

 

канал

Приложение.9. Работа с портами ввода-вывода

теперь установим счетчик

;он должен содержать 512-1

POP AX

DEC АХ.

OUT 5,AL

JMP $+2

MOV AL,AH

OUT 5, AL

JMP $+2 байт

старший байт

второй канал

MOV AL,00000010B

OUT 0AH,AL

JMP $+2 STI

POP CX

POP AX

RET

SETDMA

ENDP

; процедура  получения   данных   от контроллера INFP PROC

PUSH AX

PUSH ВХ

PUSH CX

PUSH DX

PUSH DI

MOV    Dl,OFFSET ST0 MOV    ERROR,0

MOV    DX,3F4H /регистр состояния

MOV    BH, 7

L0:

MOV BL,2

MOV CX, 0

;проверка разрешения   передачи данных IN AL,DX

TEST AL,10000000B

JNZ L2 LOOP Ll DEC BL jnz Ll MOV    ERROR, 1

JMP     SHORT   ER ■ '

Ll :

L2:

inc dx

IN AL, DX

регистра данных

STOSB /байт в ячейку STO

DEC DX /адрес регистра состояния

PUSH DX / небольшая задержка MOV DX,35 ■ CALL TIMERM POP DX

/проверка конца фазы чтения результата IN     AL,DX TEST AL,00010000В

JZ ER DEC BH

JNZ    LO повторить чтение

MOV   ERROR, 1

ER:

POP. DI POP DX ■ POP CX POP BX POP AX RET

INFP ENDP

/процедура передачи данных  в контроллер /AL - байт данных OUTFP PR0C

MOV ERROR, 0  " .

PUSH АХ

PUSH ВХ ' PUSH DX PUSH CX

MOV   DX,3F4H      /регистр состояния MOV BL,2 XOR CX,CX MOV AH,AL

LOOl:

/проверка,   разрешена ли передача данных

IN AL,DX /основной регистр состояния контроллера

TEST AL,10000000В

JNZ _OUT LOOP L001 DEC BL JNZ L001 MOV ERROR,1 JMP  SHORT _END_OUT OUT: ■

INC DX ; адрес регистра передачи данных

MOV AL, АН

OUT DX,AL ;передали байт

JMP  SHORT $+2 /задержка 2 9 мк и выход MOV DX, 35 CALL TIMERM _END_OUT:

POP CX POP DX POP BX POP AX RET OUTFP ENDP

N

; N/(0.840336)=M

задержки ; параметр в DX (M)

TIMERM PROC

PUSH AX PUSH DX

/отключаем работу канала  2   . ■

Ш     AL, 61Н

AND AL,11111100В OUT   61H, AL

JMP SHORT $+2 /управляющий байт:

формат

/режим 2

/чтение и запись /канал 2

MOV AL,10110100В

OUT 43H,AL MOV AL,0FFH OUT 42H,AL

JMP  SHORT $+2 OUT 42H,AL

JMP SHORT $+2

IN AL,61H OR AL,01H /включить счетчик' OUT 61H,AL

-'-"!---IV V.   .'"'.v-1-

/получить значение   счетчика, когда ;следует остановиться NEG DX

WAITING:

/•управляющий байт ;режим 2

счетчик MOV AL,10000100В

OUT 43H,AL JMP   SHORT $+2 IN AL,42H XCHG AH, AL IN AL,42H XCHG AH,AL CMP DX,AX JB WAITING ,    POP DX POP AX RETN ■TIMERM ENDP ; процедура прерывания  от контроллера NEWINT PROC

PUSH AX

MOV FLAG,1     ;установили флаг ; стандартная команда   завершения прерывания

MOV AL,20H

OUT 20H,AL

POP AX

I RET NEWINT ENDP ,-команда SENSI -SENS I PROC

PUSH AX

MOV   AL, 8

CALL OUTFP CMP JZ

CALL

гибких дисков

снять прерывание

код команды

ERROR,1

_ENDS

INFP

STO

ENDS:

POP AX RET

SENSI ENDP

;процедура ожидания прерывания 'WAITINT   PROC '

PUSH CX PUSH DX

MOV

MOV ERROR,О

STI

две секунды

WAIT:

MOV CX,2000

MOV DX,1190 CALL TIMERM CMP FLAG,1

JZ _RET LOOP _WAIT. MOV    ERROR, 1

взведен

_RET:

pop dx POP CX RET

WAITINT ENDP

определения координат для DMA

SETCOORD PROC

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

AX,SECTOR BX,CS CL, 4

BX,CL

BX,AX    /суммарное смещение DAL DX,BX

ли    через  границу полезная часть ВХ,512

DAL

LEA MOV MOV SHL ADD JC MOV

перешла

ADD JNC

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

странице

буфера

SUB

DAL:

MOV

/определить

MOV MOV MOV

АХ, DX

данных

адреса для DMA DX,AX

AX,CS ■ CL, 4

отделения адреса страницы от смещения в ROL AX,CL

MOV        CH,AL для адреса страницы странице

AND

ADD АХ,DX

ADC CH,О

MOV OFSDMA,АХ

AND CH, OFH-'

MOV SEGDMA,CH

ret

SETCOORD ENDP

завершения

WSE PROC

/выключаем мотор    • . uv

;оставим только смещение от ;смещение в странице

/учет перехода через ' границу

сегмента

только старшие 4 бита

-•:.

/разрешить DMA, работа контроллера, выключить мотор, устройство О MOV AL,00001000В М 0V DX,03F2H OUT DX,AL

JMP  SHORT $+2.

вектор MOV AX,OLDINTOF

•  .     -  CLI .

MOV ES:[0EH*4],AX

MOV AX,OLDINTSE ;

MOV ES:[0EH*4+2],AX STI

RET WSE ENDP

/размер буфера  512   байт на  случай,   если буфер перейдет /через  границу страницы DMA SECTOR ; смещение

OFSSECT OFSDMA

SEGDMA

ERROR OLDINTOF OLDINTSE

FLAG DB 0        /флаг выполнения команд контроллера

/область для получения данных контроллера

STO   DB 0 /здесь будем помещать содержимое регистра

ТЕХТ1      DB   'Ошибка',13,10, '$*

ТЕХТ2       DB   'Тип носителя ','$''

CODE   ENDS.................-.        .        .        . . '

END BEG

БВ 2*512 оиР(0)  /буфер для чтения сектора

в  сегменте  прочитанных данных из сектора

DW

DW

DB

DB DW ? DW ?

/признак ошибки

Работа с видеосистемой.

Справочный материал помещен в главу 27.

Порты для работы с жесткими дисками.

Жесткие диски разных марок и разных выпускающих фирм в значительной сте­пени отличаются друг от друга. Поэтому нет смысла рассматривать здесь програм­мирование ЖД на низком уровне. На практике для этой цели всегда используются средства BIOS.

Работа с часами реального времени.

Часы появились в компьютерахAT, дабы ликвидировать неудобства, связанные с тем, что при выключении компьютера обнулялись и системные часы. Теперь при за­пуске операционная система считывает время с часов реального времени.

Часыпозволяютгенерироватьтритипапрерываний:

- периодическое прерывание с интервалом 976.562мкс;

прерывание от будильника;

- прерываниепоокончаниюобновленияэначениячасов.

Прерывание происходит по линии 0 второго контроллера прерываний (IRQ 8).

Часы используют Нбайт полупостоянной памяти. Доступ к этой памяти осуще­ствляется через порты 70Н, 71Н(см. главу 23). Ниже мы приводим назначение Мбайт часов реального времени (RTC):

Байт

Назначение

ООН

Секунды

01Н

Секунды для будильника

02Н

Минуты

ОЗН

Минуты для будильника

04Н

Часы

05Н

Часы для будильника

06H

День недели

07Н

Дата

08Н

Месяц

09Н

Год

ОАН

Регистр состояния 1

ОВН

Регистр состояния 2

ОСИ

Регистр состояния 3

ODH

Регистр состояния 4

32Н

Столетие

Более подробные сведения о содержимом CMOS Вы можете найти в главе 23, здесь же сконцентрируемся на программировании самихчасов.

\. Установка-чтение времени. Чтение часов можно производить, только если 7-й бит регистра состояния 2 равен 0. Установку же времени и даты следует производить, запретив работу часов (установить в 1 7-бит регистра состояния 3).

2. Для получения прерываний от будильника следует разрешить это прерывание (регистр состояния 2, бит 5). При установке будильника следует ждать, когда бит 7 регистра состояния 2 равен 0.

3. Для разрешения периодического прерывания через 976.562 мкс. необходимо установить бит 6 регистра состояния 2.

4. Чтобы разрешить его, следует установить бит 4 в регистре состояния 2.

Ниже приводится пример простой программы (Рис. Р12.3) на прерывание от ча­сов реального времени. Программа устанавливает вектор прерывания 70Н на свою процедуру. В процедуре, в свою очередь, стоит команда инкремента счетчика. Как только счетчик достигает определенного значения, происходит выход из программы. Хочу заметить, что процедура будет выполняться не 1024раза в секунду (1/0.000976562 = 1024), а много меньше. И связано это с тем, что команды, стоящие в процедуре обра­ботки прерывания, выполняютсядовольно медленно.

CODE SEGMENT

ASSUME CSrCODE, DS:CODE ORG 10 O.H.

BEGIN: . .

MOV WORD PTR PRIZN,0    /обнулить счетчик /установить  вектор прерывания

MOV АХ, 0

MOV ES,AX /сохранить   старый вектор

MOV АХ, ES : [70Н]

MOV OFF__70,AX

MOV AX,ES:[70Н+2]

MOV SEG_70,AX /установить новый

CLI

LEA AX,INT_70 MOV ES:[70H],AX

PUSH DS POP AX

MOV    ES: [70H+2] ,AX

/разрешить   прерывание   каждые   976,562 мкс.

MOV AL,OBH

OUT  70H,AL ' ...

JMP   SHORT   $+2 v ■

IN AL,71H

OR AL,01000000B

MOV AH, AL

MOV AL,0ВН

OUT 7GH,AL MOV AL,AH JMP  SHORT $+2 OUT 71H,AL STI

ожидания

LOO:

CMP WORD PTR

JB LOO

прерывание MOV AL,OBH OUT 7GH,AL JMP   SHORT $+2 IN AL,71H AND AL,101111UB MOV AH,AL MOV AL,OBH OUT 70H,AL MOV AL, AH JMP   SHORT $+2 OUT 71H,AL ;восстановить старый вектор MOV AX,OFFJ7 О MOV ES: [70H] ,AX MOV AX,SEG_70 MOV ES: [70H+2],AX

RET

прерывания

INT_70 PROC

счетчик

INC  WORD   PTR  CS:PRIZN   ;нєльзя DS:PRIZN

следующее прерывание

MOV AL,OCH

OUT 70H,AL

JMP SHORT $+2

. IN AL,71H I RET

INT_70 ENDP

данные PRIZN DW ?

OFF_70 DW ?

SEG_70  DW ?

CODE ENDS

END BEGIN

Рис. PI2.3.

Прерывание 6т часов реального времени.

Обращаю Ваше внимание на следующую команду: INC WORD PTR CS:PRIZN. Нельзя писать INCWORD PTRDS:PRIZN,t.k. DS во время прерывания может указы­вать куда угодно (см. также главу 9). .

Работа с последовательным интерфейсом.

Контроллер последовательного интерфейса предназначен для обеспечения связи по протоколу RS232C. Состав контроллера:

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

Адреса портов последовательного интерфейса отсчитываются относительно ба-зовыхадресов. Базовые же адресахранятся: СОМ1-0040Н:0000 СОМ2-0040Н:0002 СОМЗ-0040Н:0004 СОМ4-0040Н:0006

Регистры: :

Регистр управления линией. Адрес 3 относительно базового адреса. Доступен по чтению и записи.

БитыО-1 -длина слова обмена: 00-5 битов, 01 -6 битов,

10- 7битов, ■

11- 8 битов.

Бит2 - определяет количество стоп-битов, 0 -1 стоп-бит, 1 - 2 -стоп-бита (1.5 при длине слова 5 бит).

Бит 3 - 1 - генерируется бит контроля четности между последним битом и битом.

Бит4 - режим контроля четности (0 - четное, 1 - нечетное). Бит 5 - режим неизменности бита контроля четности.

Бит 6 -1 - устанавливается состояние "пауза", которое может быть изменено толь­ко переустановкой этого бита.

Бит 7 - определяет доступ к некоторым другим регистрам (см. ниже).

Регистр буфера передатчика. Имеет адрес 0 относительно базового адреса. Дос­тупен по записи. Бит разрешения должен быть равен 0. ,

Регистр буфера приемника. Имеет адрес 0 относительно базового адреса. Дос­тупен по чтению. Бит разрешения должен быть равен 0.

Регистр буфера младшего байта делителя. Имеет адрес 0 относительно базово­го адреса контроллера. Доступен по чтению и записи. Бит разрешения должен быть равен 1.

Регистр буфера старшего байта делителя. Имеет адрес 1 относительно базового адресаконтроллера. Доступен по чтению и записи. Битразрешениядолжен бытьравен 1. Ниже приведена таблица делителей и соответствующих им частот.

Делитель

Частота

090(21

50

ОбООп

75

0600І1

■ 150

0180г.

300

ООСОЬ

600

0060І1

1200

0040І1

1800   .    ; ■

оозоь

2400

0020І1

3600

0018п

4800

00101г

7200 .

ОООСп

9600

00061

19200

0003І1

"  38400 '

0002x1

57600 ■

ОООНі

115200    '                              "         "" "

Регистр разрешения прерываний. Имеет адрес 1 относительно базового. Досту­пен по чтению и записи. Битразрешениядолжен бытьравен 0. Формат регистра:

битО- прерывание по доступности принимаемых данных, 1 - прерывание выраба­тывается, 0 - запрещено,

бит 1 - прерывание при освобождении регистра буфера принимаемых данных, 1 -прерывание вырабатывается, 0 - запрещено,

бит2 - прерывание при изменении состояния линии приемника, 1 - вырабатывает­ся, 0 - запрещено,

битЗ -прерывание при изменении состоянии модема, 1 -прерывание вырабатыва­ется, 0 - запрещено,

4-7 - равны нулю. .

Регистр идентификации прерывания. Имеет адрес 2 относительно базового ад­реса. Доступен только по чтению. Формат регистра:

битО -1 - нет ждущих прерываний, 0 - есть ждущее прерывание,. ■ биты 1-2:

11 - изменилосьсостояние линии приемника, ошибка переполнения, четности или пауза, условие сброса - читать регистр состояния линии, ' '

10 - принимаемыеданныедоступны, условиесброса - чтение буфера приемника,

01 - освобожден регистр буфера, условие сброса - чтение регистра прерываний или запись в буфер передатчика,

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

Остальные биты должны быть равны 0.

Регистр управления модемом. Имеет адрес 4 относительно базового адреса. Доступен по чтению и записи.

Бит 0 -1 - сигнал "готовность терминала" устанавливается равным 1,0 - в против­ном случае,

бит 1 -1 - сигнал "запрос на передачу" устанавливается равным 1, бит 2-1 - сигнал Outl равен 1, бит 3 -1 - сигнал Out2 равен 1,

бит4 - задаетрежим шлейфадля диагностических целей.

Регистр состояния линии. Имеет адрес 5 относительно базового адреса. Досту­пен только по чтению.

битО -1 - приемникполностью принял символ,

бит 1 -1 - ошибка переполнения - символ помещается в буфер приема, из которого еще не взят символ,

бит 2 - индикатор ошибки четности,

бит 3 - индикатор ошибки стоп-бита,

бит4 - индикатор состояния "пауза",

бит 5 - индикатор освобождения буфера передатчика,

битб - индикаторосвобожденияпередатчика.

Биты ошибоксбрасываются причтениирегистрасостояниялинии.

Регистр состояния модема. Имеет адрес 6 относительно базового адреса. Досту­пен только по чтению.

битО - индикатор изменениясигналаСТ8,

бит 1 -индикаторизменениясигналаБЗК,

бит2-индикаторзаднегофронтасигнала,

битЗ - индикатор изменения сигналаБСБ,

бит4 - инвертированныйсигнал CTS,

бит5-инвертированныйсигнал DSR,

битб - инвертированныйсигнал PJ,

бит7 - инвертированныйсигнал DCD.

Примеры программы взаимодействия с СОМ портом приведен в главе 9 (Рис. 9.4).

Управление таймером. Схема работы таймера.

Интервальный счетчик работает независимо от процессора. Он содержит три не­зависимых счетчика, служащих для отсчета времени и называемых каналами.

Программная модель работы таймера.

Регистр управляющего байта. Работает на запись. Адрес порта 43Н. В него заг­ружается управляющий байт (команда).

Регистр счетчика канала таймера. Содержит 16 бит. Адреса: канал 0 - 40Н, 1 -41Н, 2 - 42Н. Загрузка осуществляется побайтно (вначале в старший).

Выходной регистр счетчика. Служит для хранения текущего значения счетчика. Считывание происходит побайтно (вначале младший). Адреса такие же, какупреды-

дущего регистра.

Внутренний регистр состояния.

Выходной регистр состояния. Служит для чтения состояния таймера. Адреса портов такие же, как у счетчика. Можно читать по команде - чтение состояния. Входные и выходные сигналы:

- сигнал внешнего кварцевого генератора,

б) GATE - сигнал управления каналом таймера, управляет только каналом 2, слу­жит для разрешения или запрете счета и др.,

в) OUT - выходной сигнал таймера: канал O - поступает в контроллер на линию прерываний 0,1 - на контроллер регенерации памяти, 2 - подключен кдинамику.

Управляющий байт таймера.

БитО - 0 - счетчик вдвоичном формате, 1 - в двоично-десятичном формате.

Биты І-3 - режимы работы канала таймера:

000 - режимО, 001-режимі, х10-режим2, xl 1-режим 3,

100 - режим 4, ■

101 - режим 5. х-любой бит.

Биты4-5 - режимчтения-записи счетчика: ОО-командазащелкиваниявыходногосчетчикаканалатаймера,

01 - чтение и запись только младшего байта счетчика,

- чтение и запись только старшего байта счетчика,

- чтение и запись сначала младшего, а затем старшего байта. Биты 6-7 - биты выбора канала:

00- каналО,

01- каналі, 10-канал2,

- команда чтения состояния.

Инициализация таймера.

Инициал изация счетчика состоит из двух шагов:

а) запись управляющего байта, в соответствующем канале сразу прекращается счет.

б) загрузка счетчика.

Чтение состояния таймера.

Вначале засылается байт в управляющий регистр (см. выше). Формат байта состояния:

бит 7 - 0 - низкий уровень сигнала, 1 - высокий уровень,

бит 6 - 0 выходной регистр счетчика отражает текущее значение, 1 - не отражает, остальные биты аналогичны битам управляющего байта при инициализации таймера. Чтение значения счетчика.

Чтение значения счетчика можно прочесть из порта 42Н.

Однако здесь может возникнуть проблема недостоверности:

из-за того, что значение счетчика может быть неопределенным в момент начала

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

значение младшего и старшего байтов счетчика может быть рассогласованным.

Данная проблема может быть решена двумя способами:

- приостановить работу счетчика (только канала 2),

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

Режимы работы таймера.

Здесь дается весьма краткое описание режимов. Для программирования вполне достаточно этого (и моих примеров).

Режим 0 обычно используют для генерации единичного импульса. Счет происхо­дит с переходом через ноль.

Режим 1. Используется для генерации звука (периодически поступающие сигна­лы). Работает только для канала 2.

Режим 2. Также генерирует периодически поступающие сигналы. Используют для часов реального времени.

Режим 3. Режим может использоваться и для звуковых сигналов, и для часов ре­ального времени. По достижению нуля значение счетчика восстанавливается и счет повторяется.

Режим 4. По достижению 0 счет продолжается с переходом через нуль (аналогич­но режиму 0).

Режим 5. Работает только для канала 2. Счет происходит с переходом через 0. Механизм работы таймера.

Кварцевый генератор с периодом примерно 0.840336 мкс. посылает сигнал на тай­мер. При получении сигнала содержимое счетчиков уменьшается на І.Т.о. изменение счетчика на 1 происходит через 0.840336 мкс. Максимальное число, которое можно поместить в счетчик, равно ОРРРРН=65535. Т.о. полный период таймера, т.е. время уменьшение счетчика до нуля, составляет мкс. Следовательно, количество периодов, соответствующее N е., можно вычислить по формуле (1Ч*1000000)/55071.41976.

Пример программирования таймера. Использование таймера для генерации звука рассмотрено в главе 6.

Программа 1. Ранее мы узнали, как организовывать независимый от скорости вы­полнения команд таймер. Приведем пример еще одного таймера, работающего путем непрерывного опроса таймера компьютера. Процедура, приведенная в программе, может быть использованадля создания своих процедур задержек, например, вязыках высокого уровня.

CODE SEGMENT

ORG 100Н

ASSUME CS:CODE, DS:CODE

BEGIN:

MOV AH, 9 LEA DX,TEXT1 INT 21H MOV CX,182 ;задержка 10 с.

;10/(0.000000840336*65535)=181.58238962

CALL TIMER MOV AH, 9 LEA DX,TEXT2

INT 21H RET

;процедура задержки ; параметр в СХ TIMER PROC

; отключаем работу канала 2

IN AL,61Н

AND AL,11111100В

OUT 61H,AL

JMP  SHORT $+2 ;управляющий байт: ;двоичный формат ;режим 2

/чтение и запись /канал 2

MOV AL,10110100В

' OUT 43H,AL

MOV AL,0FFH /пишем младший байт

OUT 42H,AL

•JMP   SHORT $+2 /пишем старший байт

OUT 42H,AL

JMP  SHORT $+2

IN

OR AL,01H

счетчик OUT 61H,AL JMP   SHORT $+2 MOV  BX,OFFFFH

WAITING:

/управляющий байт . /режим 2

счетчик MOV AL, 10000100B OUT 43H,AL

JMP SHORT $+2 /читаем младший байт

IN AL,42H

XCHG AH,AL /читаем старший байт

IN AL,42H

XCHG AH,AL

прохода  счетчика через нуль

CMP AX,BX

MOV BX,AX

JB WAITING LOOP WAITING RETN TIMER ENDP

TEXT1 DB   'Ждем... 10 c.    ',13,10, '$' TEXT2  DB   'Конец... ',13,10,'$'

CODE ENDS

END BEGIN

Рис. PI2.4. Программа задержки.

Алгоритм проверки перехода счетчика через нуль достаточно прост, однако ука­жем на [25], где приводится аналогичный алгоритм.

Еще одна программа, осуществляющая задержку в Юс., но на базе процедуры TIMERM, которая осуществляет задержку в единицах изменения счетчика. Данная процедура удобна для задержек на короткий интервал времени.

CODE SEGMENT

ORG !OOH

ASSUME CSrCODE, DS:CODE

BEGIN:

MOV AH,9

LEA DX,TEXT1 /цикл обеспечит задержку на  10 с. MOV СХ, 10000

L0O:

/задержка 1000 мкс.

/   1000/(0.840336)=1190.0001904

MOV DX,1190

CALL TIMERM

LOOP LOO

MOV AH,9

LEA DX,TEXT2

INT 21H

RET

/процедура задержки /параметр в DX

TIMERM PROC

/отключаем работу канала 2 IN AL,61H AND AL,11111100B OUT 61H,AL

JMP  SHORT $+2 / управляющий байт: /двоичный формат /режим 2

/чтение и запись /канал 2

MOV AL,10110100В

OUT 43H,AL

MOV AL,OFFH OUT 42H,AL

JMP SHORT $+2

OUT 42H,AL

JMP SHORT $+2

IN AL,61H OR AL,01H /включить счетчик

OUT 61H,AL JMP SHORT $+2

/получить значение  счетчика, когда /следует остановиться NEG DX

WAITING:

/управляющий байт /режим 2

счетчиMOV AL, 10000100В

OUT 43H,AL JMP   SHORT $+2 IN AL,42H XCHG AH, AL IN AL,42H XCHG AH,AL CMP DX,AX JB WAITING RETN TIMERM ENDP

TEXT1  DB  'Ждем...10 c.   ',13,10, '$* TEXT2 DB 'Конец... ',13,10,'$'

CODE ENDS

END BEGIN

Рис. P12.5. Еще одна программа задержки.

Контроллер прерываний. I. Схема функционирования.

В главе 9 мы рассказывали Вам о контроллере прерываний. Здесь мы дадим спра­вочный материал о структуре и программировании этого устройства. Ниже приведен рисунокиз главы 9, поясняющий схемуфункционирования контроллерапрерываний.

-х> ->а

->2

->з

->4 ->5 ->€ ->7

 

 

 

| си?

_f щоцедура

 

mm

Региетр Регжхвр запросов маски Порт 20Н   Порог 2Ш

(IMS)

Схема Ретжяф

анализа обслужи-

приори- ваенцх

тозхш запросов

Порт 20Н Порт 20S (РЯ) (ISRJ

Схема работы прерываний:

1. На одной или нескольких линиях запроса прерываний появляется единичный сигнал. А в регистре 1РР устанавливается соответствующий бит.

2. Далее сигнал поступает в регистр масок (1МР). Пройти этот сигнал может, если

соответствующий бит в регистре равен нулю.

3. После этого сигнал поступает в регистр анализа приоритетов (РР). Данный ре­гистр срабатывает лишь в том случае, если несколько прерываний поступили одно­временно.

4. Далее сигнал одновременно поступает в микропроцессор (сигнал 1г<ГГ) и в ре­гистр обслуживаемых запросов (КР).

5. Если микропроцессор блокирован командой СИ, то сигнал не пропадает, т.к. остается установленный бит в НЖ. После разрешения прерываний сигнал ШТ будет повторен.

6. Если прерывание разрешено, то из микропроцессора будет послан сигнал ЮТА. При этом устанавливается бит в регистре ГЗЯ и сбрасьтается бит в регистре 1РР. Пос­ле этого контроллер может воспринимать сигнал прерывания же устройства.

7. Микропроцессор выполняет процедуру прерывания. При этом не явно выпол­няется команда СБ!

Контроллер прерываний допускает каскадное подключение. В компьютерах АТ имеется два контроллера. Сигнал запроса прерывания с одного контроллера (ведо­мый) поступает не на микропроцессор, а на вход другого (ведущий). Т.о. одновремен­но может обслуживаться до 15 запросов: 8 на ведомый и 7 на ведущий. Приведем стандартное подключение внешних устройств:

Уровень (приоритет) Устройство

0

 

Таймер

1

 

Клавиатура

2

 

Ведомый контроллер

 

8

Часы реального времени

 

9

Перенаправление линии 2

 

10

Резерв

 

11

Резерв

 

12

Резерв

 

13

Прерывание сопроцессора

 

14

Контроллер винчестера

 

15

Резерв

3

 

СОМ2

4

 

СОМ 1

5

 

БРТ2

6

 

Контроллер НГМД

7

 

ЬРТ1

Режимы работы. Завершение прерывания.

1. Команда конца прерывания сбрасывает бит наиболее приоритетного прерыва­ния (именно оно и обслуживается в текущий момент).

2. Команда конца прерывания сбрасывает конкретный бит прерывания.

3. Автоматический конец прерывания по приходу импульса ШТА.

Приоритеты прерываний.

1. Режим полной вложенности. Все входные линии упорядочены по приоритетам. Обрабатывается всегда линия с наибольшим приоритетом.

2. Специальный режим полной вложенности. Похож на предыдущий с той лишь разницей, что при обслуживании сигнала от ведомого контроллера он не блокируется.

3. Автоматический сдвиг приоритетов. После обслуживание очередного прерыва­ния происходит циклический сдвиг приоритетов.

4. Заданный сдвиг приоритетов по команде программиста.

Программирование контроллера.

Для программирования контроллеров прерываний используется два регистра. По два на каждый контроллер. Для первого контроллера 20Н и 21Н, для второго контрол-лераАОНиАШ.

1. Команды инициализаций. Инициализация должна производиться над обоими контроллерами.

Команда 1. Формат засылаемого байта: БитО= 1,

Бит 1 - для двух контроллеров значение этого бита должно быть равно О, Бит2 = 0,

Бит 3 - для стандартных АТ компьютеров этот бит равен О,

Бит4=1,

Бит5 = 0,

Битб = 0,

Бит7 = 0.

Выдается по адресу 20Н (АОН).

Команда 2. Формат засылаемого байта: БитыО-2  о. "

Биты 3-7 - определяют 5 старших битов номеров Прерываний для всех линий кон­троллера (базовый вектор).

Выдается по адресу 21Н (А1Н).

Команда 3. Формат посылаемого байта: Для ведущего контроллера -Для ведомого контроллера -

контроллеров.

Команда 4. Формат посылаемого байта:

Бит 0 -1 (совместимость с процессором Intel),

Бит 1 -0(обычно 1 - режим автоматического завершения прерывания),

Бит 2 - рекомендуется

БитЗ-рекомендуетсяО,

Бит4 - 0 - режим полной вложенности.

Выдается по адресу 2Ш (АШ).

2. Другие контроллера.

Изменение регистра маски (IMR). Выдается по адресу 21H (АШ).

Завершение процедуры обработки прерывания контроллером. Формат посылае­мого байта:

Биты 0-2 - задают номер линии, когда это требуется. Иначе следует обнулять, БитЗ = 0,

Бит4 = O,

Биты 5-7; ,   ,      .      . ■

001 -командаконцапрерывания 1 (см. выше), 011 - командаконцапрерывания2, 101 - автоматический сдвиг приоритетов,

- установка сдвига приоритетов, 000 - сброс сдвига,

- сдвиг по команде,

110 - установка приоритетов (номер линии в первых битах),

- нет операции. Выдается по адресу 20H (AOH).

Командаизменения режима. Формат посылаемого байта: Биты 0-1:

- считать регистр IRR, 11 -считать регистр ISR. Бит 2 = 0,

БитЗ=1, Бит4 = 0,

Биты 5-6:

10-специальныйрежиммаскирования,

11 - сбросить специальный режим маскирования.

Выдается по адресу 20H (AOH). Чтение регистров производится по этому же адресу.

Другие порты.

Порт с адресом 6Ш. Доступен по записи и чтению. Управляющий регистр В. Структура для чтения:

БитО-0 сигнал GATE установлен в низкий уровень (линия GATE второго канала таймера), 1 - в высокий,

бит 1 - 0 - второй канал таймера отключен от динамика, 1 - подключен,

бит 2 - 0 - прерывание по ошибке четности памяти разрешено, 1 - запрещено,

бит 3 - 0 - прерывание по ошибке канала разрешено, 1 - запрещено,

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

бит 5 - определяет состояние линии OUT канала 2 таймера,

бит 6 - 0 - нет ошибки канала, 1 - ошибка,

бит 7 - 0 - нет ошибки четности, 1 - ошибка.

Структура для записи:

бит 0 - установить сигнал GATE в низкий уровень, 1 - в высокий,

бит 1 - 0 - отключить канал 2 от динамика, 1 - подключить,

бит 2 - 0 - прерывание по ошибке четности памяти разрешено, 1 - запрещено,

бит 3 - 0 - прерывание по ошибке канала разрешено, 1 - запрещено,

бит 4-6 - резерв,

бит 7 - недействителен.