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

Назначение ячеек таймерной части cmos rtc

Индекс

Назначение

00h-09h, 32h

(37 в PS/2)

Ячейки РТС в BCD-формате: 00 – секунды; 01 – секунды будильника; 02 – минуты; 03 – минуты будильника; 04 – часы; 05 – часы будильника; 06 – день недели; 07 – день месяца; 08 – месяц; 09 – год (2 младшие цифры); 32h – век-1 (2 старшие цифры года); 37h – век-1 (2 старшие цифры года) в PS/2

0Ah

RTC Status Register А (регистр статуса А): бит 7 – обновление времени (0 – готов к чтению); биты [6:4] – делитель частоты (для кварца на 32,768 кГц – 010); биты [3:0] – 0110 – выходная частота меандра 1024 Гц

0Bh

PTC Status Register В (регистр статуса В): бит 7 – остановка часов (0 – нормальный ход); бит 6 – разрешение периодических прерываний (0 – запрещено); бит 5 – разрешение прерывания от будильника (0 – запрещено); бит 4 – разрешение прерывания по окончании смены времени (0 – запрещено); бит 3 (см. также регистр 0Ah) – разрешение выходного меандра (0 – запрещено); бит 2 – формат BCD/BIN (0 – BCD); бит 1 – 12/24-часовой режим (1 – 24-часовой); бит 0 – зимнее/летнее время (0 – переключение запрещено)

0Ch

RTC Status Register С (регистр статуса С): чтение флагов идентификаторов прерывания: бит 7 – IRQF (общий запрос прерывания); бит 6 – PF (периодические прерывания); бит 5 – AF (прерывание от будильника); бит 4 – UF (прерывание по окончании смены времени); биты [3:0] – зарезервированы

0Dh

RTC Status Register D (регистр статуса D): бит 7 – питание (1 – норма, 0 – разряд батареи); биты [6:0] – зарезервированы

Аппаратные таймеры имеют поддержку функциями. Сервисы BIOS Int 1Ah позволяют считывать и модифицировать значения системного таймера (ячейки 40:006Eh в BIOS Data Area), а также даты, времени и будильника CMOS RTC.

Функции BIOS Int 15h позволяют с помощью CMOS RTC вводить задержку или запускать таймер установки флага (через заданное время установить бит 7 указанной ячейки памяти). Время задается в микросекундах, но минимальная выдержка зависит от производительности ПК (достижимы единицы миллисекунд), максимальная выдержка – около 70 часов.

Начиная с процессоров Pentium, появилась возможность измерения времени с точностью до такта ядра процессора. Для этого процессоры имеют внутренний 64-битный счетчик TSC (Time Stamp Counter), обнуляющийся по аппаратному сбросу (сигналом RESET#). Разрядность позволяет считать без переполнения в течение нескольких столетий. Для доступа к счетчику имеется специальная инструкция RDTSC, правда, установкой флага TSD в управляющем регистре CR4 (процессора) ОС может сделать ее привилегированной (доступной только на нулевом уровне привилегий). В этом случае приложение, исполняемое на уровне 3, может аварийно завершаться по отказу исполнения инструкции. ОС может и позволить обращение к этому регистру, но «подсовывая» программе угодное ей значение времени. Причем из-за внутреннего умножения частоты в процессоре результат чтения счетчика может отставать от реального времени на число, достигающее коэффициента умножения частоты. Правда, такая точность никому и не нужна (она потеряется в измеряющих программах).

Сервисы и прерывания BIOS

Системная BIOS предоставляет ряд сервисов низкого уровня, в основном предназначенных для обслуживания ввода-вывода и имеющих отношения к стандартным аппаратным интерфейсам. Традиционные сервисы BIOS обычно вызываются в реальном режиме или V86 посредством инструкций программных прерываний (Int xx). Большинство сервисов может быть вызвано и через фактически стандартизованные точки входа (адреса в области ROM BIOS) дальними вызовами процедур (CALL far) с предварительным помещением в стек регистра флагов (сервисы построены как обработчики прерываний). Все традиционные сервисы BIOS работают в 16-разрядном режиме процессора, и ими можно пользоваться в реальном режиме, V86 и малопривлекательном 16-разрядном защищенном режиме.

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

Внутренние прерывания:

Int 00h — деление на 0;

Int 01h — пошаговый режим;

Int 03h — точка останова;

Int 04h — переполнение;

Int 06h — недопустимая команда 286+;

Int 07h — вызов отсутствующего NPU.

Аппаратные прерывания:

Int 02h — немаскируемое прерывание;

Int 08h – таймер 8253/8254;

Int 09h — клавиатура;

Int 0Ah – IRQ2/9;

Int 0Bh – IRQ3;

Int 0Ch – IRQ4;

Int 0Dh — IRQ5;

Int 0Eh — IRQ6 — контроллер гибких дисков;

Int 0Fh – IRQ7;

Int 70h – CMOS-таймер;

Int 7Ih — IRQ9 (перенаправлено на Int 0Ah);

Int 72h – IRQ10;

Int 73h — IRQ11;

Int 74h — IRQ 12 (контроллер мыши PS/2);

Int 75h — IRQ 13 — исключение сопроцессора;

Int 76h — IRQ14— контроллер жестких дисков;

Int 77h – IRQ15.

Прерывания Int 70h-77h имеют место только в AT.

Функции ROM BIOS (16-битные сервисы):

Int 05h (F000:FF54h) - печать экрана;

Int 10h — видеосервис;

Int 11h — чтение списка оборудования (слово из BDA 0040:001 0h), возвращает в АХ:

биты 15:14 — число обнаруженных LPT-портов: 00 —0,... 11 - 3;

бит 13 — резерв;

бит 12 — обнаружен игровой адаптер;

биты 11:9 — число обнаруженных СОМ-портов: 000 —0,... 111 - 7;

бит 8 — наличие контроллера DMA;

биты 7:6 — число обнаруженных НГМД: 00 - 1,... 11 - 4;

биты 5:4 — активный видеорежим: 00 - резерв, 10 - 80-колоночный цветной, 01 — 40-колоночный цветной, 11 - монохромный;

биты 3:2 — размер ОЗУ на системной плате (теперь обычно 00);

бит 1 — присутствие математического сопроцессора;

бит 0 — присутствие дисководов;

Int 12h — размер непрерывной памяти;

Int 13h — дисковый сервис (блочный ввод-вывод);

Int 14h — обслуживание СОМ-портов;

Int 15h — АТ-функции (системный сервис, функции определяются значением АН/АХ):

00-03h — управление и обмен данными с кассетным магнитофоном (были когда-то и такие «стриммеры»!) на старых PC;

4fh — перехват клавиатуры;

53xxh — сервисы управления потреблением АРМ (Advanced Power Management);

8300h — запуск таймера, устанавливающего флаг в заданной ячейке;

830 lh — сброс того же таймера;

84h — джойстик;

86h — программируемая задержка;

87h — перемещение блока расширенной памяти;

88h — получение размера расширенной памяти;

89h — переключение в режим V86;

COh — получение системной конфигурации, при успешном выполнении (CF=0, AH=0) ES:BX указывает на таблицу данных конфигурации;

80-82h, 85h, 90h, 91h — функции многозадачных ОС (BIOS устанавливает заглушки);

Int 16h — клавиатурный ввод-вывод;

Int 17h — обслуживание LPT-портов;

Int 18h — процедура восстановления при неудаче начальной загрузки (прежде - ROM-Basic);

Int 19h — начальная загрузка (вызов процедуры Bootstrap);

Int lAh— системное время, дата, будильник и 16-битные вызовы сервисов PCI;

Int IBh — обработчик нажатия клавиш Ctrl+Break;

Int I C h — User Timer Interrupt, процедура, вызываемая обработчиком I n t 0 8 h каждые 55 мс; BIOS устанавливает простую заглушку (IRET), но программы могут перехватывать это прерывание; на время отработки этой процедуры все аппаратные прерывания запрещены (кроме NMI).

Int 33h — поддержка мыши;

Int 4Ah — обработчик будильника пользователя, установленного функцией BIOS Int lAh(6); прерывание вызывается асинхронно, так что при возврате из процедуры все регистры и флаги должны быть в том же состоянии, что и при входе; BIOS ставит заглушку (IRET);

Int 67h - EMS-функции.

Указатели на таблицы:

Int IDh — видеопараметры;

Int 1Eh — параметры дискет;

Int IFh — знакогенератор СGA;

Int 41h — параметры HDD 0;

Int 46h — параметры HDD 1;

Int 43h — знакогенератор EGA.

Int 09h, Int16 h — поддержка клавиатуры

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

Прерывания, вызванные приходом кодов нажатия и отпускания клавиш, обрабатывает BIOS Int 9h. Каждый принятый скан-код (или цепочка) обрабатывается с учетом состояния клавиатурных флагов. Результат обработки (как правило, ASCII-символ в младшем байте и скан-код в старшем) помещается в клавиатурный буфер, расположенный в ОЗУ. По приему каждого символа указатель головы буфера увеличивается. Буфер организован в виде кольца, после достижения конца области буфера указатель головы установится на начало области. В случае переполнения буфера (указатель головы «догнал» указатель хвоста) очередное слово не записывается, и подается звуковой сигнал. Размер позволяет хранить описание шестнадцати фактов нажатий клавиш. Нажатие клавиш Ctrl, Shift, Alt и некоторых комбинаций в буфере не отмечается, но приводит к модификации бит ячеек флагов клавиатуры. Нажатие «системной» комбинации Ctrl+Alt+Del, клавиши PrintScreen (SysRq) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры.

Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area):

0:0417,0:418 — флаги клавиатуры;

0:0419 — аккумулятор кода Alt-набора;

0:041А — указатель головы буфера (Buffer Head), 2 байта (модифицируется при помещении символа в буфер);

0:041С — указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера);

0:041E-0:042D — область кольцевого буфера (16 слов).

Обработчик аппаратного прерывания до обработки принятого скан-кода вызывает прерывание BIOS IntlSh с AH=4Fh, а в AL находится принятый скан-код. Стандартный обработчик Int 15h(4Fh) просто выполняет возврат с CF=0, но его можно заменить специальным обработчиком, который будет при необходимости подменять принятые скан-коды на какие-либо иные (оставляя их в AL), что должно отмечаться установкой CF=1. В старых версиях BIOS такой возможности перехвата не было, ее наличие можно определить вызовом Int 15h(C0h).

Для клавиатуры USB или иного устройства ввода, заменяющего клавиатуру в качестве консоли, прерывание Int 9h должно вызываться программно при обработке каждого клавиатурного события. Обработчик этого прерывания должен выполнять те же действия: скан-код пропускать через Int 15h(4Fh) и помещать в клавиатурный буфер, а также модифицировать флаги клавиатуры.

Интерфейс прикладного уровня для клавиатуры представляет BIOS Int 16h. Его основное назначение — извлечение слов из клавиатурного буфера. Функция задается в регистре АН при вызове, результат помещается в регистр АХ.

АН = 00h — чтение (с ожиданием готовности) и выборка слова из буфера (меняется указатель хвоста). Индикаторы клавиатуры обновляются в соответствии с состоянием флагов. Если буфер пуст, то на AT выполняется прерывание Int 15h (подфункция 90), что может использоваться ОС, например, для переключения задач. Чтобы программа не «зависала» на ожидании символа, предварительно стоит проверить готовность функцией 0lh. Символы расширенной клавиатуры фильтруются – преобразуются в их аналоги 83-клавишной клавиатуры.

АН = 01h — проверка готовности, чтение без выборки (указатели не изменяются). Признак наличия символа в буфере — установленный флаг ZF.

АН = 02h — чтение состояния флагов (в AL — байт 0:417h, см. выше).

АН = 03h — установка задержки и частоты автоповтора: BL — код задержки (00=250, 01=500,02=750,03=1000 мс), ВН - код частоты.

АН = 05h — запись слова из регистра СХ в буфер (меняется указатель головы). Признак успешной записи — AL=Q, если в буфере нет места, то AL=1.

АН = 10h и AH=11h — функции, аналогичные 00Н и 01h, но предназначены специально для 101/102-клавишных клавиатур — в них не выполняется фильтрация символов расширенной клавиатуры. Для ряда клавиш, отсутствующих в клавиатуре АТ-84, эти функции дадут результаты, отличающиеся от вызовов 00h и 01h.

AH=12h . — чтение расширенного состояния флагов (в АХ — слово KbdShiftFlags101Rec), в котором младший байт совпадает с тем, что дает функция 02h (слово из 0:417h), а старший байт похож на слово из 0:418h. Назначение бит АХ:

бит 0 — клавиша Shift (правая) нажата;

бит 1 — клавиша Shift (левая) нажата; .

бит 2 — клавиша Ctrl (любая) нажата;

бит 3 — клавиша Alt (любая) нажата;

бит 4 — включен индикатор Scroll Lock;

бит 5 — включен индикатор Num Lock;

бит 6 — включен индикатор Caps Lock;

бит 7 — включен режим Insert;

бит 8 — клавиша Ctrl (левая) нажата;

бит 9 — клавиша Alt (левая) нажата;

бит 10 — клавиша Ctrl (правая) нажата;

бит 11 — клавиша Alt (правая) нажата;

бит 12 — клавиша Scroll Lock нажата;

бит 13 — клавиша Num Lock нажата;

бит 14 — клавиша Caps Lock нажата;

бит 15 — клавиша SysReq нажата.

Функции чтения буфера (00 и 10h) в регистре AL возвращают ASCII-код символа, в АН — скан-код. Символы, полученные нестандартным способом (в русском регистре или Alt-набором), сопровождаются нулевым скан-кодом. Alt-набор позволяет ввести в буфер любой символ — для этого его код в десятичной системе набирается на цифровой клавиатуре при нажатой клавише Alt, результат заносится в буфер при отпускании клавиши Alt.

При AL=0 регистр АН содержит расширенный ASCII-код. Дополнительные клавиши 101/102 клавиатур при использовании функций 10h-12h генерируют код E0h в младшем байте и скан-код, соответствующий аналогичным управляющим клавишам 83/84-клавишных клавиатур.

Функция записи (05h), несколько неожиданная для клавиатуры, позволяет легко имитировать работу оператора для различных демонстрационных программ. Если прикладная программа не перехватывает обслуживание клавиатуры на уровне аппаратного прерывания (In t 9h), то резидентная программа может ей «подбрасывать» слова в буфер, которые будут восприниматься как нажатие клавиш.

При русификации (или другой локализации) клавиатуры отслеживание переключения регистров (языков) ложится на обработчик аппаратного прерывания клавиатуры.

int 10h — видеосервис

Int 10h — видеосервис — предназначен для работы с графическим адаптером. Его первичной задачей является управление видеорежимом (BIOS Video Mode), определяющим формат экрана. BIOS адаптера должна выполнять программирование всех стандартных и специфических управляющих регистров для установки (смены) требуемого видеорежима и выбранных параметров развертки — кроме нее о способах этих переключений остальное ПО может и не знать. В пределах возможностей установленного видеорежима видеосервис предоставляет возможности отображения информации на различных уровнях. Простейший для программиста телетайпный режим позволяет посылать поток символов, которые будут построчно отображаться на экране с отработкой символов возврата каретки, перевода строки, обеспечивая «прокрутку» изображения при заполнении экрана. Есть функции и для полноэкранной работы с текстом, при которой доступны и атрибуты символа. В графическом режиме имеется возможность чтения и записи пиксела с указанными координатами. Однако видеосервисом Int 10h программисты пользуются далеко не всегда, поскольку работает он довольно медленно.

Функция телетайпного вывода Int 10h(0Eh). При вызове AH=0Eh, в AL — код выводимого символа, в BL — цвет (только для графического режима). Символ выводится в текущую позицию курсора, и курсор сдвигается на следующую, переходя на новую строку после конца предыдущей и прокручивая экран при его заполнении. Специальные символы вызывают возврат на начало строки (CR, код 0Dh), перевод строки (LF, 0Ah) и короткий гудок (BEL, 07h). Этой функцией часто пользуются для вывода сообщений программами, работающими на нижнем уровне (например, модули инициализации ПЗУ расширений BIOS, загрузчики и другие, не имеющие еще доступа к сервисам операционных систем). Программа вывода получается простейшей, работает на всех адаптерах и во всех режимах, но довольно медленно.

Int 13h — поддержка дисков

Функции дискового сервиса вызываются программным прерыванием Int 13h.

Традиционно дисковый сервис подразделяет физические диски на дискеты (diskette) и фиксированные диски (fixed disk). Набор функций для этих классов устройств несколько различается как по составу, так и по реализации. Классы различаются по диапазонам номеров физических устройств:

для дискет отводятся номера 0-7Fh (реально только 0-3);

для фиксированных дисков — 80h-FFh.

Контроллеры дисковых интерфейсов, имеющие в своем составе дополнительные модули BIOS, перехватывают вектор Int 13h, беря на себя обслуживание своих устройств. Когда в IBM PC/XT появились жесткие диски со своим контроллером, модуль BIOS этого контроллера, инициализирующийся во время теста POST, вставал на место Int 13h, а указатель на исходный обработчик дискового сервиса (драйвер НГМД из системной BIOS) сохранялся на месте Int 40h. Хотя поддержка жестких дисков давно уже включена в системную BIOS, ради совместимости возможность использования прерывания Int 40h для вызова драйвера гибких дисков сохраняется. Интерфейс этого вызова совпадает c Int 13h, но номер устройства (в регистре DL) не должен превышать 7Fh.

Кроме функций дискового сервиса (Int 13h)c дисковыми устройствами связаны еще и векторы, обслуживающие аппаратные прерывания от контроллера НГМД — Int 0Eh (линия IRQ 6) и от контроллера жестких дисков — Int 76h (линия IRQ 14). При наличии двухканального порта АТА второй канал обычно задействует линию IRQ 15 (вектор 77h). В XT контроллер жестких дисков занимал линию IRQ 5 (вектор 0Dh). Дополнительные контроллеры дисков могут использовать и другие прерывания. Аппаратные прерывания вырабатываются контроллерами по завершении (нормальному и аварийному) внутренних операций. На эти прерывания BIOS не реагирует, а при инициализации их векторы направляются на программную заглушку (инструкцию IRET).

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

Традиционный сервис BIOS

Традиционный дисковый сервис работает в 16-разрядном режиме процессора, все параметры вызова передаются через регистры процессора. Адрес сектора задается в системе CHS и размещен весьма специфично. Сервис вызывается программным прерыванием Int 13h, при вызове принимаются следующие соглашения:

номер функции задается в регистре АН и не должен превышать 3Fh;

логический номер диска задается в регистре DL (бит 7 = 0 — признак обращения к НГМД);

номер цилиндра (0-1023) задается в регистре СН (младшие8бит)иСL [7:6] (старшие 2 бита);

номер головки (0-255) задается в регистре DH;

номер начального сектора (1-63) задается в регистре CL [ 5 :0];

количество секторов, участвующих в операции, 8 бит — в регистре AL (0-255);

указатель на начало буфера оперативной памяти для считываемых и записываемых данных (address of buffer) — в регистрах Е S: ВХ;

результат выполнения операции определяется по флагу переноса: С F = 0 —успешное выполнение операции, CF = 1 — обнаружены ошибки (код состояния возвращается в регистре АН, код завершения последней операции с дискетами хранится по адресу 40:4lh, с жесткими дисками — 40:74h);

таблица параметров диска для дискет (DPT) задана указателем в памяти по адресу 0:78h, для жестких дисков (HDPT) — 0:104h или 0:118h.

Список функций традиционного сервиса приведен в табл. 4,. Устройства могут не поддерживать некоторые функции, о чем драйверы должны «честно сообщить» кодом возврата 01h.

Таблица 4

Соседние файлы в папке УМК_Орг_ЭВМ