Педагогика

Социология

Компьютерные сети

Историческая личность

Международные экономические и валютно-кредитные отношения

Экономическая теория, политэкономия, макроэкономика

Музыка

Гражданское право

Криминалистика и криминология

Биология

Бухгалтерский учет

История

Правоохранительные органы

География, Экономическая география

Менеджмент (Теория управления и организации)

Психология, Общение, Человек

Философия

Литература, Лингвистика

Культурология

Политология, Политистория

Химия

Микроэкономика, экономика предприятия, предпринимательство

Право

Конституционное (государственное) право зарубежных стран

Медицина

Финансовое право

Страховое право

Программирование, Базы данных

История государства и права зарубежных стран

История отечественного государства и права

Трудовое право

Технология

Математика

Уголовное право

Транспорт

Радиоэлектроника

Теория государства и права

Экономика и Финансы

Экономико-математическое моделирование

Международное право

Физкультура и Спорт

Компьютеры и периферийные устройства

Техника

Материаловедение

Программное обеспечение

Налоговое право

Маркетинг, товароведение, реклама

Охрана природы, Экология, Природопользование

Банковское дело и кредитование

Биржевое дело

Здоровье

Административное право

Сельское хозяйство

Геодезия, геология

Хозяйственное право

Физика

Международное частное право

История экономических учений

Экскурсии и туризм

Религия

Искусство

Экологическое право

Разное

Уголовное и уголовно-исполнительное право

Астрономия

Военная кафедра

Геодезия

Конституционное (государственное) право России

Таможенное право

Нероссийское законодательство

Ветеринария

Металлургия

Государственное регулирование, Таможня, Налоги

Гражданское процессуальное право

Архитектура

Геология

Уголовный процесс

Теория систем управления

Системное программирование

Системное программирование

Отличие СП от прикладногоэто машинная зависимость первого, так как системные программы тесно связаны с архитектурой и структурой компьютера, для которого они созданы.

Например, АССЕМБЛЕР при переводе команд в машинные коды должен учитывать способы адресации, форматы команд, длину регистров и другие аппаратные характеристики конкретной машины.

Компиляторы также учитывают характеристики аппаратуры при генерации кодов. ОС непосредственно управляют всеми ресурсами компьютера. К задачам СП относятся разработка: 1. систем ассемблирования; 2. загрузчиков и программ связывания; 3. макропроцессоров; 4. Компиляторов; 5. операционных систем; 6. драйверов.

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

Загрузчик записывает объектную программу в оперативную память и передает управление на адрес начала ее исполнения - это абс. загр.

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

Программы связывания осуществляют связь между логически связанными программами, которые отдельно ассемблируются и загружаются (это обычно подпрограммы). Макропроцессоры позволяют часто повторяющиеся группы заменять одной макроинструкцией. ОС осуществляет интерфейс с пользователем.

Драйверы управляют работой переферийных устройств. АРХИТЕКТУРА ТЕХНИЧЕСКИХ СРЕДСТВ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ 1. Общее описание Центром вычислительной системы является ее процессор.

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

Микропроцессор, использованный в IBM/PC, был разработан и создан фирмой 'Интел'. В IBM/PC используется микропроцессор 8088, 80286, 80386, 80486 фирмы 'Интел', Лишь немногие компоненты IBM/PC были специально разработаны для нее, - большая часть системы составлена из стандартных компонентов.

Особенность персонального компьютера фирмы 'IBM' состоит в оригинальном способе организации известных компонентов в единую функционирующую систему.

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

Рассмотрим вопрос пространственного размещения этих составляющих.

Физически составляющие IBM/PC можно разделить на компоненты системного блока и компоненты блока расширения. Все основные платы, входящие в состав любой модели IBM/PC, размещаются в большом блоке, получившем название системного.

Системный блок включает все необходимые компоненты, позволяющие компьютеру работать без каких-либо дополнений. Здесь находятся микропроцессор, первые 64К памяти и 'встроенные' программы, такие как интерпретатор языка Бейсик, записанный в микросхемах ПЗУ. Системный блок расположен в основании IBM/PC и заключен в корпус.

Системный блок имеет пять свободных разъемов, предназначенных для подключения дополнительного оборудования, которое может быть введено в состав компьютера. Блоки расширения вставляются в эти разъемы, располагаясь над системным блоком. Блоки расширения или карты, как их иногда называют - могут использоваться для обслуживания устройств, подключаемых к IBM/PC. Они могут использоваться для двух основных целей: для увеличения объема памяти и подключения дополнительных устройств.

Системный блок разработан фирмой 'IBM', а блоки расширения могут разрабатывать все желающие, при условии что они будут соблюдать основные правила, касающиеся размеров, электрических параметров соединений, теплового режима и так далее. Любые дополнительные устройства подключаются к IBM/PC с помощью одного из разъемов расширения, каждый из которых имеет 62 соединительных провода. Эти 62 линии позволяют передавать все сигналы, необходимые для управления любым оборудованием, которое может быть подключено к IBM/PC. Все линии работают параллельно, так что устройства можно подключать к любому из пяти разъемов. Любой сигнал, посылаемый одному из блоков расширения, передается и всем остальным, поскольку они подключены к параллельным линиям. Здесь имеет место расширение идеи общей шины данных: все блоки расширения используют общее 62-проводное соединение. называемое каналом ввода/вывода. По характеру использования все линии можно разделить на четыре категории. Во-первых, восемь линий используются для подвода питания к блокам расширения с различными номиналами напряжений. Далее, еще восемь линий используется для передачи восьми бит данных на/с шины данных. Все данные проходят по этой шине, независимо от направления передачи. Еще двадцать линий предназначены для адресации. При работе с памятью используются все 20 линий, это позволяет передать адрес одной из 1024К ячеек памяти. Для устройств ввода/вывода используется только девять линий, что позволяет адресовать 512 различных устройств.

Остальные линии канала используются для передачи различных сигналов управления.

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

Внутри корпуса IBM/PC спрятаны два набора переключателей. Их называют переключателями конфигурации системы (они выполнены в виде корпуса с двумя рядами выводов, т.е. корпуса типа DIP). Установка этих переключателей указывает какое оборудование подключено к IBM/PC, например, количество дисководов, объем доступной памяти и т.д. Эти переключатели ничем реально не управляют - они используются только для удобства. После включения IBM/PC программы запуска считывают положение этих переключателей и затем устанавливают содержимоке определенных ячеек памяти в соответствии с их положением. Затем, если какой-либо программе необходимо узнать , какой объем памяти установлен, проверяется содержимое этих ячеек. Одним из основных элементов компьютера, позволяющим ему нормально - 3 - функционировать, является память.

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

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

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

Поскольку адреса - это те же числа, компьютер может использовать арифметические операции для вычисления адресов памяти. IBM/PC использует возможности адресации микропроцессора 8088 полностью.

Адреса в 8088 имеют длину 20 бит, следовательно, процессор позволяет адресовать два в двадцатой степени байта или 1024 К. 2. Основные микросхемы Главной микросхемой является сам микропроцессор. Рядом с микропроцессором предусмотрено место для микросхемы 80287, числового сопроцессора, или процессора числовых данных, с его специальными возможностями по выполнению очень быстрых (и с повышенной точностью) вычислений над числами с плавающей точкой.

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

Рассмотрим микросхемы, которые предназначены для выполнения операций синхронизации в компьютере. Одна из них называется генератором тактовых (или синхронизирующих) сигналов и используется, прежде всего, для получения тактов, которые управляют основным рабочим циклов компьютер в АТ номером его идентификации является 88248. В любом случае эта микросхема дает синхронизирующий сигнал, используемый в других компонентах компьютера для установки основного рабочего темпа. В микросхеме генератора тактовых сигналов используется кварцевый кристалл в качестве точной основы для синхронизации. Наш генератор тактовых сигналов подразделяет сверхбыстрые такты кристалла в быстрые такты, требующиеся компьютеру, и преобразует их в форму, приемлемую для использования другими компонентами схемы. С генератором тактовых сигналов близко связана микросхема программируемого таймера, идентифицируемая номером 8253. Программируемый таймер может порождать другие сигналы синхронизации. Можно изменять скорость выдачи сигналов, что делает эту микросхему 'программируемой'. Для осуществления регулировки этим потоком информации в компьютерах предусмотрен микропроцессор контроллера шины. В РС эта микросхема имеет номер 8288, а в АТ - 82288. Задача контроллера шины состоит в том, чтобы обеспечить нормальную работу шины.

Некоторые компоненты компьютера (в частности, дисководы) могут обмениваться данными непосредственно через кмпьютерную память, без прохождения данных микропроцессора для выполнения другой работы. Такой процесс называется прямым доступом к памяти.

Имеется специальная микросхема, предназначенная для управления этим процессом, которая называется контроллером прямого доступа к памяти (номер микросхемы - 8237). Прерывания контролируются специальной микросхемой (8259). В компьютерах прерывания поступают с различной степенью важности и одной из задач контроллера прерываний 8259 является отслеживания их в порядке приоритетов, а также фиксация каких-либо задержанных прерываний. К другим основным микросхемам относится микросхема программируемого интерфейса периферийных устройств (номер - 8255). Эта микросхема следит за работой некоторых из более простых периферийных устройств компьютера, таких как порт кассетной ленты.

Однако большинство периферийных устройств компьютера являются слишком сложными для того, чтобы они могли регулироваться простой обычной схемой. К таким сложным устройствам относятся приводы гибких дисков.

Основной микросхемой, предназначенной для управления работой компьютера с - 4 - приводами гибких дисков, является контроллер гибкого диска PD765. Для дисплея обычно используется микросхема, называемая контроллером электронно-лучевой трубки 6845. 3. Специальные свойства микропроцессора 286 В реальном режиме специальные возможности и характеристики микропроцессора 286 не проявляются, поэтому компьютер с микропроцессором 286, функционирующем в реальном режиме, может быть полностью совместимым с обычным РС. Для того, чтобы воспользоваться дополнительными возможностями, следует переключиться на защищенный режим. В защищенном режиме микропроцессор 286 обладает рядом дополнительных возможностей, позволяющих ему наращивать количество программ, с которыми компьютер может работать одновременно. Это достигается за счет четырех основных средств: защиты (которая определяет наименование данного режима), расширенной памяти, виртуальной памяти и мультизадачности.

Защита позволяет операционной системе воздвигать барьеры для защиты программы от воздействия функционирования других программ или самой операционной системы. В стандартном РС ими при работе микропроцессора 286 в реальном режиме отдельная прорамма может испортить работу операционной системы или какой-либо другой программы, использующей компьютер, либо даже заблокировать весь компьютер, остановив его функционирование.

Защищенный режим работы микропроцессора 286 позволяет операционной системе предотвращать порчу компьютера и даже порчу какой-либо части памяти любоц из программ. Когда мы используем наши компьютеры для одновременной работы только с одной программой, то неправильная работа программы и блокировка ею машины не играет столь уж большой роли.

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

Средство защиты делает это возможным.

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

Виртуальная память позволяет компьютеру предоставлять каждой программе до одного биллиона байтов (один гигабайт) для работы с ними. Это очень большой объем памяти.

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

Мультизадачность применяется в случае, если компьютер одновременно работает с более чем одной программой (задачей). Фактически, в каждый момент времени компьютер выполняет команды лишь одной программы, однако в процессе мультизадачной работы обрабатываться все программы - это можно сравнить с жонглером, который может одновременно работать с множеством шаров. Любой компьютер может попытаться работать в режиме мультизадачнности, однако такую работу он не в состоянии выполнять на должном уровне, не обладая определенными специальными аппаратными средствами (такими, например, как защита памяти). Защищенный режим микропроцессора 286 предусматривает множество средств, которые практически обеспечивают возможность выполнения компьютером мультизадачной работы. 4. Память и порты, регистры Регистры представляют собой разновидность памяти специального назначения, которую микропроцессор использует для определенных конкретных - 5 - целей. ________________________________________________________________ ! Флаги _____________________________________ ! ! |____________________________________| ! ! _____________________________________ ! ! AX |_______AH_______|______AL___________| ! ! BX |_______BH_______|______BL___________| ! ! CX |_______CH_______|______CL___________| ! ! DX |_______DH_______|______DL___________| ! ! _____________________________________ ! ! SP |____________________________________| ! ! BP |____________________________________| ! ! SI |____________________________________| ! ! DI |____________________________________| ! ! PC |____________________________________| ! ! _____________________________________ ! ! CS |____________________________________| ! ! DS |____________________________________| ! ! SS |____________________________________| ! ! ES |____________________________________| ! !______________________________________________________________! Регистрами является набор из четырнадцати 16-битовых мест, в которых можмно хранить числа. каждое из них является неотъемлемой, внутренней частью микропроцессора.

Первая группа регистров называется универсальными регистрами, Имеется четыре таких регистра, которые именуются AX, BX, CX и DX. Если для работы требуется применение лишь половины емкости любого из этих регистров поскольку они делятся на половины старшего и младшего порядка, которые обозначаются AH и AL, BH и BL и т.д. В этих универсальных регистрах выполняется значительная часть работы, поступающей в наши компьютеры.

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

Регистры из этой группы называются регистрами сегментов.

Каждый из них используется для оказания помощи в получении доступа к разделу (или сегменту) памяти объемом 64 К. Сегмент кода (или регистр CS) указывает, в каком месте памяти располагается программа.

Сегмент данных (или регистр DS) определяет местонахождение данных, используемых программой, а дполнительный сегмент (или регистр ES) дополняет сегмент данных.

Сегмент стека (или регистр SS) определяет местонахождение стека компьютера, который вкратце будет описан. Более полное представление о применении этих регистров мы получим в главе 7, когда более детально будет рассматриваться память. В то время как регистры сегментов используются для получения доступа к большим разделам (по 64 К)памяти, последняя группа регистров используется для оказания помощи в отыскании пути к определенным байтам в памяти. Они применяются совместно с регистром сегмента для указания на точное место в памяти. имеется пять такх регистров, каждый из которых испольуется для конкретной цели.

Указатель команды (инструкции) IP, который называют также программным счетчиком, РС, сообщает микропроцессору только о месте, где выполняется программа.

Указатель стека, SР, и указатель базы, BP, используются для оказания помощи в отслеживании выполняющейя работы.

Индекс источника, SI, и индекс местоназначения (выхода), DI, используются для оказания помощи нашим программам в перемещении больших объемовданых из одного места в другое.

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

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

Микропроцессоры РС в основном управляются посредством последовательности 1-битовых флагов, каждый из которых отмечает или устанавливает определенное состояние в компьютере. Флаги действуют независимо друг от друга, однако, для удобства, они собраны вместе в регистр флагов.

Отдельные флаги могут проверяться и устанавливаться посредством специальных команд, а вся группа флагов может считываться или устанавливаться посредством пары команд, которые считывают или устанавливают весь регистр флагов. Всего имеется девять стандартных флагов. Шесть из ним используются для индикации результатов арифметических и подобных им операций: флаг нуля, ZF, указывает на нулевой результат (или равенство при сравнении), флаг знака, SF, указывает на отрицательный результат, флаг переноса, CF, означает перенос в следующую позицию, флаг дополнительного переноса, AF, указывает на перенос из первых четырех битов (что требуется для моделирования десятичных операций), флаг перенолнения, OF, отмечает получение слишком большого результата и, наконец, флаг четности, PF, отмечает четность или нечетность результата. Три оставшихся флага используются для управления. Флаг направления, DF, управляет направлением повторения операций (например, при побайтовом перемещении данных): справа налево или наоборот. Флаг прерываний, IF, контролирует возможность прерываний: разрешены они или временно запрещены. Флаг захвата, TF, вызывает генерацию копьютером специального прерывания 'захвата' после выполнения одной команды. Это делает возможным пошаговое выполнение программы с трассировкой результатов каждой отдельной команды.

Помимо этих девяти флагов, усовершенствованный микропроцессор 286, используемый в ветви АТ семейства РС, допускает применение двух весьма специальных флагов. Один из них, называемый, NT, используется для вложенных задач, а другой, двухбитовый флаг IOPL, управляет уровнем привилегии ввода/вывода. УУПДП ЗУ ПРОЦЕССОР СИСТ. КОНТР. КОНТР. ПЕРЕФ. В/В УСТР. СИСТЕМА ПРЕРЫВАН. Лекция 2 1. Краткий обзор памяти Микропроцессор лучше всего работает с 16-битовыми числами, которые могут принимать значения, не превышающие 65536 или 64К. Поскольку компьютер использует числовые адреса для отыскания своего пути через память, предполагается, что память не может содержать более 64К байт. Как показал опыт, 64К байт слишком мало для серьезных применений компьютера; многие из наших компьютеров оборудованы памятью, емкость которой в десять раз больше - 640К. Поэтому возникает вопрос: как выполнять работу, испольуя такую большую память и продолжая применять 16-битовые числа ля доступа к ней? Решение, которое было реализовано фирмой Intel в семействе микропроцессоров 8086 заключается в применении так называемых сегментированных адресов.

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

Арифметика включает так называемое 'сложение со сдвигом', которое позволяет создавать 20-битовое двоичное число (которое может принимать значения до 1048578) из двух 16-битовых чисел.

Предположим, что у нас имеется два 16-битовых слова, которые имеют шестнадцатеричные значения ABCD и 1234. Напомним, что каждая шестнадцатеричая цифра представляет четыре бита, поэтому четыре шестадцатеричные цифры (ABCD или 1234) представляют 16 битов.

Возьмем одно из этих двух чисел, скажем ABCD, и добавим 0 к его концу: ABCD0. Фактически это означает сдвиг числа на одну шестнадцатеричную позицию (или на четыре двоичные позиции) или умножение значения числа на шестнадцать.

Теперь число состоит из пяти шестнадцатеричных цифр (или 20 битов) и принадлежит миллионному диапазону.

Однако, к сожалению, оно не может быть использовано в качестве полного 20-битового адреса памяти, поскольку в конце этого числа стоит 0: это число может представлять только адреса, оканчивающиеся на 0, т.е. только каждый шестнадцатый байт. Для того, чтобы завершить описание схемы сегментированной адресации, мы возьмем другое 16-битовое число (1234 в нашем примере) и добавим его к сдвинутому числу: ABCD0 + 1234 ------- ACF04 Когда мы объединяем два 16-битовых слова таким способом, мы получаем 20-битовое число, которое может принимать любое значение от 0 до 1048577. И это та арифметическая схема, которая обеспечивает способность PC работать с миллионом байтов памяти, используя 16-битовые числа. Две части этой схемы адресации называются частью сегмента и частью смещения. В нашем примере ABCD есть значение сегмента, а 1234 есть значение смещения. Часть сегмента определяет адрес памяти, кратный 16, т.е. адрес, в последней позиции которого имеется шестнадцатеричный 0. Адреса памяти, которые кратны 16, называются границами параграфов или параграфами сегментов. Часть смещения сегментированного адреса определяет некоторое точное местоположение байта, следующее за местоположением параграфа сегмента.

Поскольку 16-битовое слово смещения может варьироваться от 0 до - 2 - 65535 (или 64К), то часть смещения сегментированного адреса позволяет нам работать с 64К байтами памяти, используя один и тот же адрес сегмента.

Представим стандартный способ записи сегментированных адресов, который вы часто будете встречать при изучении технических материалов, относящихся к PC. Сегментированный адрес обычно записывается в следующем виде: ABCD:1234. Первым указывается адрес сегмента, затем следует двоеточие и адрес смещения. Если вы работаете с языком ассемблера или используете программу DEBUG, то такую запись вы будете встречать очень часто. Если вы взглянете на листинг программы DEBUG, представленный в разделе 'Таблица векторов прерываний', то вы увидите такую запись в правом столбце. Почти всегда, когда мы говорим об адресах внутри памяти нашего компьютера, мы обращаемся к ним в их сегментированной форме. Но иногда нам нужно взглянуть на них в их конечной форме, когда две части сегментированного адреса объединены; когда это требуется сделать, я буду называть соответствующие адреса абсолютными адресами, чтобы не возникало путаницы. В нашем примере объединения частей ABCD и 1234 результирующим абсолютным адресом является ACF04. Часть сегмента сегментированного адреса полностью обрабатывается набором из четырех специальных регистров сегментов, Каждый из этих четырех регистров предназначен для локализации параграфа сегмента.

Регистр сегмента кода CS указывает, где находится код программы.

Регистр сегмента данных DS определяет местоположение основных данных программы.

Регистр дополнительного сегмента ES дополняет сегмент данных DS так, что данные можно сдвигать между двумя отдельными частями памяти. И, наконец, регистр сегмента стека SS предоставляет информацию о базовом адресе стека компьютера.

Детальная адресация осуществляется посредством обработки адреса смещения. В то время как часть сегмента сегментированного адреса может использоваться только когда она загружается в один из этих четырех регистров, адреса смещения могут использоваться намного более гибко. Наши программы могут получать смещения адресов из различных регистров (таких как универсальные регистры AX, BX и т.д. или индексные регистры SI и DI). Смещения могут также указываться в фактических командах программы на машинном языке, либо вычисляться посредством объединения содержимого регистров и команд машинного языка.

Существует большая гибкость в способе обработки адресов смещений. Когда программа выполняется в компьютере, она должна отыскивать свой путь как среди частей программы, так и среди соответствующих данных. По упрощенной терминологии, каждая программа использует регистр сегмента кода CS для определения местоположения частей программы и регистр сегмента данных DS для обнаружения данных. Во время выполнения программы эти регистры можно трактовать как фиксированные или изменяемые. Если какой-либо из них фиксируется (т.е. не изменяется программой во время ее выполнения), то соответствующая компонента (код программы или данные) не может использовать более 64К памяти, адресуемой данным единственным значением сегмента.

Однако, если какой-либо из регистров может динамически изменяться во время работы программы, то для соответствующей компоненты такое ограничение на ее размер снимается. Если фиксируются оба регистра, то мы имеем модель малой памяти, которая ограничивает программу объемом в 64К для кода и в 64К для данных; если могут изменяться оба регистра, то мы имеем большую модель, без ограничений. Между этими моделями имеются еще две модели: когда один из регистров фиксируется, а другой может меняться.

Преимущества наличия возможностей изменения регистров сегментов (нет ограничений в 64К) очевидны; плата за эти преимущества не столь очевидна, однако, она вполне реальна. Когда программа осмеливается манипулировать регистрами сегментов, требуется дополнительная работа по загрузке (что замедляет функционирование) и дополнительная степень уп- - 3 - равления памятью (что может усложнить логику программы). Между скоростью, размером и простотой, с одной стороны, необходим компромисс. 2.Младшие адреса памяти Часть памяти нашего компьютера с самыми младшими адресами отводится для некоторых важных применений, которые определяют функционирование компьютера. В специальном применении младшей области памяти можно выделить три области.

Первая - эта таблица векторов прерываний, которая определяет местоположение подпрограмм обработки прерывания.

Первые 1024 байтов памяти специально отводятся для таблиц векторов прерываний, предусматривается место для 256 различных прерываний - несколько больше, чем обычно используется. Эти таблицы занимают область памяти с абсолютными адресами от 0 до 400 (шестнадцатеричное). (Более детально вы можете ознакомиться с этим в разделе 'Таблица векторов прерываний'.) Вторая область используется в качестве рабочего места для подпрограмм ROM-BIOS. Поскольку ROM-BIOS управляет основной деятельностью компьютера и составляющих его компонент, то для хранения его собственных записей требуется определенная область памяти. Такой областью является область данных ROM-BIOS, одна из наиболее интересных частей компьютерной памяти. Среди всего того многого, что хранится в области данных ROM-BIOS, имеется буфер, в котором хранится информация о клавишах, нажатых до того, как наши программы готовы принять такую информацию, а также информация об объеме имеющейся памяти в компьютере и индикатор режима использования экрана, речь о котором пойдет в следующей главе (если вы внимательно рассмотрите программу ALL-CHAR в приложении А, то вы обнаружите подпрограмму, проверяющую и использующую режим вывода на экран). Для области данных ROM-BIOS устанавливается отдельная область размером в 256 байтов и с адресами от 400 до 500. Третьей частью специальной области младших адресов в памяти является рабочая область ДОС и Бейсика, которая находится между абсолютными адресами 500 и 600. Эта область используется совместно ДОС и Бейсиком в качестве рабочей области, аналогично рабочей области ROM-BIOS, которая предшествует ей.

Ключевой рабочей областью памяти является та часть, которая используется для программ и соответствующих данных: эта область состоит из первых десяти блоков (0-9). Эту область часто называют областью памяти пользователя для того, чтобы отличать ее от остальной части адресного пространства. Когда мы говорим об объеме имеющейся в PC памяти, фактически речь идет об объеме памяти пользователя, которая устанавливается в этой области.

Теоретически память пользователя может иметь размеры от 16К (четвертая часть первого блока в 64К) до 640К, когда установлены все десять блоков памяти.

Независимо от объема установленной памяти, она образует один непрерывный кусок, начиная с блока 0 и продолжаясь до конца установленной памяти.

Фактически имеется несколько различных видов памяти (более подробно об этом мы узнаем ниже) и тот вид памяти, который определяется здесь, является обычной памятью с произвольным доступом (произвольной выборкой), которая используется для выполнения чтения и записи и, которую называют также ЗУПВ (запоминающеее устройство с произвольной выборкой). Память ЗУПВ отличает следующее: во-первых, данные, хранящиеся в этой памяти могут проверяться (сличаться) и изменяться (записываться), а, во-вторых, эта память непостоянна, что означает, что данные, хранящиеся в ней, сохраняются только на время работы компьютера. Эта память предназначена для хранения наших программ и данных, пока компьютер обрабатывает их. Объем установленной памяти ЗУПВ во многом определяет размер и диапазон проблем, которые могут разрешать наши - 4 - компьютеры. Блок 0 1-ый 64К Обычная память пользователя до 64К Блок 1 2-ой 64К Обычная память пользователя до 128К Блок 2 3-ий 64К Обычная память пользователя до 192К Блок 3 4-ый 64К Обычная память пользователя до 256К Блок 4 5-ый 64К Обычная память пользователя до 320К Блок 5 6-ой 64К Обычная память пользователя до 384К Блок 6 7-ой 64К Обычная память пользователя до 448К Блок 7 8-ой 64К Обычная память пользователя до 512К Блок 8 9-ый 64К Обычная память пользователя до 576К Блок 9 10-ый 64К Обычная память пользователя до 640К Блок A 11-ый 64К Расширение памяти для видео Блок B 12-ый 64К Стандартная память для видео Блок C 13-ый 64К Расширение ПЗУ (XT,EGA,3270 PC) Блок F 16-ый 64К Система ROM-BIOS и ROM-BASIC Рис. Блоки памяти PC Базисная конструкция семейства PC отдельно устанавливает только десять из шестнадцати блоков в адресном пространстве для этой главной рабочей области памяти. Это более 60% от общего объема.

Сегодня эта область объмом в 640К кажется слишком малой для проблем, которые нам нужно решать на наших PC, однако, для того времени, когда разрабатывался PC, этот объем казался огромным. В то время обычные персональные компьютеры ограничивались памятью объемом 64 или 128К и PC с памятью в 640К считался необычным. (Эта та ошибка, которая повторяется вновь и вновь в истории компьютеризации: недооценка потребностей в росте и расширении). Можно слегка расширить область памяти пользователя емкостью в 640К, вторгнувшись в некоторые из следующих за ней системных областей, но это не очень разумно, ибо блоки памяти, располагающиеся за областью пользователя, резервируются для специальных применений (о которых речь пойдет ниже). Отнюдь не каждый отдельный бит области памяти пользователя доступен для использования нашими программами. Часть этой области памяти, начинающаяся с адреса памяти 0, специально устанавливается для ведения записей, которые должен иметь компьютер. Об этом упоминалось в разделе 'Младшие адреса памяти', более детальная техническая информация об одной из частей этой области приводится в разделе 'Таблица векторов прерываний'. Однако, за исключением этой небольшой (и интересной) части, весь раздел в 640К специально предназначен для использования нашими программами, поэтому не стоит уделять ему много внимания. С другой стороны, остальные блоки памяти, некоторые их использования представляют для нас несомненный интерес. 3. Расширенная память В то время как обычные члены семейства PC, использующие микропроцессор 8088, ограничиваются адресацией лишь одного мегабайта памяти, ветвь AT семейства, которая использует микропроцессор 286, может работать с памятью большего объема. Как упоминалось при рассмотрении микропроцессора 286 (в конце главы 6), компьютеры, базирующиеся на микропроцессоре 286, могут иметь до 16 Мегабайт памяти.

Интересно отметить, что точно такой лимит на память применялся в течение многих лет к огромным многомиллионным универсальным компьютерам фирмы IBM. Забавно, что огромные универсальные машины фирмы IBM имели память, емкость которой не превышала емкость памяти наших маленьких микропроцессоров.

Помимо способности вмещать огромные объемы реальной рабочей памя- - 5 - ти, микропроцессор 286 может также работать с огромными объемамми виртуальной памяти, ловкой имитацией большего объема памяти, чем имеется в наличии. (См. раздел 'Как действует виртуальная память'). Виртуальная память модели AT может предоставляться в объеме до одного гигобайта (1024 Мегабайтов) для каждой программы, которая выполняется в компьютере. Для того, чтобы извлечь все преимущества от использования расширенной памяти или виртуальной памяти модели AT, необходимо наличие операционной системы (и программ сопровождения), которая обладала бы соответствующими возможностями.

Поскольку основная операционная система для семейства PC, ДОС, разрабатывалась без учета применения расширенной и виртуальной памяти, потенциал соответствующих возможностей будет оставаться раскрытым не полностью, пока не появятся операционная система нового поколения и прикладное программное обеспечение, разработанные с учетом особенностей моделей AT. Несмотря на все это, программы могут, в определенной степени, использовать возможности расширенной памяти AT. Стандартным способом для программ является использование для этих целей обслуживающих программ, включенных в ROM-BIOS. Одна из таких обслуживающих программ осуществляет передачу блоков данных (любого нужного нам размера) между специальной расширенной памятью и обычной памятью.

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

Однако, для успешного манипулирования защищенным режимом, программа должна быть более усложненной. Если все, что требуется для программ - это получить выгоды от использования расширенной памяти, то она может просто воспользоваться обслуживающей программой передачи данных в памяти, содержащейся в BIOS, и избежать всех сложностей, связанных с работой в защищенном режиме. ________ ________ ________ ________ ДЕЙСТВИТЕЛЬНЫЕ | | | | | ОБЛАСТИ ПАМЯТИ, |________|________|________|________| в которых нахо- | дятся части вирВиртуальная | туальной памяти память программ | пользователя | ______ | | | | |______| | | _|______ _____ _____ ВИРТУАЛЬНАЯ | ________| |__________| |______| |____ |-->| |________| |______| |______| | |________| |__________| |______| |____|ПАМЯТЬ | / / | / / | / / | / / | / / | / / | / / | / / | / / ____________________________ | | | ДИСК, на котором хранятся | | части виртуальной памяти | |____________________________| Рис.

Виртуальная память - 6 - 1-реальная память; 2-хранение активных частей виртуальной памяти; 3-программа использует виртуальную память; 4-виртуальная память; 5-диск; 6-хранение частей виртуальной памяти 4. Виртуальная память Виртуальная память представляет собой хитроумную операцию, которая включает определенную, тщательно организованную кооперацию между микропроцессором, программой поддержки виртуальной памяти и диском компьютера. По существу, виртуальная память действует следующим образом. Когда программа устанавливается на выполнение в компьютере, операционная система создает 'пространство виртуальной памяти', которое является моделью памяти и адресов памяти, которые программа имеет в своем расположении. Затем часть 'реальной' или фактической физической памяти компьютера передается в виртуальную память, что является ядром концепции виртуальной памяти.

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

Средство 'распределения памяти' в микропроцессоре 286 делает так, что реальная память вроде имеет иной рабочий адрес, отличный от истинного, реального адреса.

Программа начинает работать в некотором (большом) пространстве виртуальной памяти, отображаемом в часть реальной памяти (более меньшего объема) компьютера. Пока программа работает только в этой части своей виртуальной памяти все идет хорошо.

Программа фактически использует адреса памяти, отличные от тех, которые определяются в программе, но это не имеет значения. Что происходит, когда программа пытается использовать несколько больше виртуальной памяти, чем было выделено реальной памяти (которая имеет меньший объем, чем виртуальная память)? В этом случае таблица отображения микропроцессора обнаруживает, что программа пытается использовать адрес, который не существует в текущий момент; микропроцессор генерирует так назывыаемое прерывание из-за отсутствия страницы. Когда происходит прерывание из-за отсутствия страницы (означающее, что программа пытается использовать виртуальный адрес, который фактически не отображается в реальной памяти), вступает в действие специальная программа поддержки виртуальной памяти. Она временно помещает программу в состояние блокировки, пока занимается этим кризисом.

Программа поддержки выбирает определнную часть виртуальной памяти, которая в текущий момент находится в реальной памяти и, временно помещает ее содержимое на диск; это называется откачкой. Эта часть реальной памяти задействуется в качестве понадобившейся части виртуальной памяти. Когда откачанная часть памяти требуется вновь, она подкачивается обратным копированием с диска. Как видите, диск компьютера используется в качестве склада для хранения частей виртуальной памяти, которые не используются в текущий момент. В зависимости от хода вычислительного процесса, функционирование виртуальной памяти может протекать очень гладко, либо оно может включать столько операций откачки и подкачки, что на ожидание перекачки данных между памятью и диском будет тратится слишком много времени. Когда это происходит, то такая ситуация называется 'пробуксовкой': ког- - 7 - да система виртуальной памяти начинает пробуксовывать, производительность компьютера резко падает.

Практическое функционирование системы виртуальной памяти может включать очень чувствительное уравновешивающее действие, известное как настройка системы. Наши микрокомпьютеры могут извлекать пользу от умеренного и взвешенного использования виртуальной памяти, но, вместе с тем, они слишком малы и слишком медлительны для того, чтобы извлечь максимальную выгоду от применения этой мощной концепции. 5. Группы блоков памяти и увеличенная память ---------------------------------------------- Переключение блоков позволяет компьютеру фактически иметь больше памяти, чем это обеспечивается одномегабайтным адресным пространством микропроцессора.

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

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

Например, плата такой памяти может содержать восемь 'блоков' памяти, каждый из которых имеет объем 64К (всего 512К). Всем этим блокам по 64К соответствует один адресный блок (64К) в компьютерной памяти. В любой момент активным может быть лишь один из восьми блоков, когда доступны данные из этого блока, другие блоки будут блокированы.

Преимущество переключения блоков состоит в том, что оно позволяет подключать к компьютеру больше памяти, памяти, которая может стать доступной в любой момент. Все,что требуется сделать для включения блока, это послать в плату памяти соответствующую команду, сообщающую об изменении адресации блоков.

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

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

Потребность в этом управлении - и стандартный способ его осуществления - сдерживала применение переключения блоков до тех пор, пока гигант по производству программного обеспечения, фирма 'Лотос'(Lotus), и кудесник в области производства кристаллов микропроцессоров, фирма 'Интел', не объединились для определения стандартного способа работы с памятью с переключением групп блоков.

Официально этот подход к переключению блоков называется 'Спецификация расширенной памяти Лотос/Интел/Микрософт', однако, многие обращаются к ней по имени специальной платы памяти, разработанной фирмой 'Интел' в соответствии с этой спецификацией: 'Верхняя плата' ('Above Board'). Поясним, как действует увеличенная память. Ее функционирование обеспечивается тремя компонентами: одна - аппаратная (плата памяти с переключением групп блоков) и две программные (программа управления увеличенной памятью, ЕММ и прикладная программа, которая использует память). Плата памяти с переключением групп блоков (которой может быть 'Верхняя плата' фирмы 'Интел' или иная аналогичная плата памяти) обеспечивает что-то между 64К байтами и 8М байтами памяти, подразделяемой на небольшие страницы по 16К, которые могут переадресовываться индивидуально посредством переключения блоков.

Программа управления увеличенной памятью (ЕММ) активизируется при первом запуске компьютера и она закладывает фундамент функционирования - 8 - увеличенной памяти.

Ключевой частью задачи, возлагаемой на эту программу, является отыскание неиспользуемой области в памяти PC, которая может использоваться для отображения в нее памяти с переключением групп блоков. Для этой программы требуется полная рабочая область памяти емкостью в 64К, называемая страничным блоком, причем эта рабочая область может располагаться в любом месте. На общей схеме распределения памяти можно легко увидеть, что блоки D и E памяти являются достойными кандидатами для этой цели, однако, ЕММ может помещать страничный блок также в блок C. Точное местоположение не имеет значения, если оно не мешает какому-либо иному использованию адресного пространства. Кроме того, страничный блок не должен размещаться на границе блоков памяти.

Например, страничный блок может начинаться с адреса сегмента C400 и занимать оставшуюся часть блока C и первые 16К блока D. Когда программа ЕММ определит, где будет располагаться ее страничный блок (64К), она делит этот блок на четыре окна по 16К. После этого ЕММ готова к действию, готова к поддержке любой прикладной программы, которая знает, как ее использовать при перекачке данных памяти в окна по 16К (и из этих окон). Для использования увеличенной памяти, прикладная программа сообщает программе ЕММ о том, что она нуждается в применении одного или более из четырех доступных окон.

Прикладная программа может попросить супервизор ЕММ о выделении ей страниц памяти, а затем сделать эти страницы доступными посредством переключения их на область окон. Когда прикладной программе нужно работать с различными страницами (по 16К) данных, она посылает в ЕММ запрос на соответствующее переключение страниц. ____________________________________________________________________ | | | | | _______________________________________ | | | | | | | ------- ------- | | | | | | | | | РАСШИРЕННАЯ | | | | | | | | ПАМЯТЬ | | | ------- ------- | | | | | ------- | ------- | | | | | | | | | | | | | | | | | | | | | | | | | ------- | ------- | | | | | | | | | | | |_______________________________________| | | | | | | | | | | | | | | | | | | | | |/ |/ |/ |/ | | ------------------------------------------------------ | | | | | | | | |ОСНОВНАЯ | | | | | | | | | ПАМЯТЬ | | ------------------------------------------------------ | | 0 640К ___________ ____________/ | | V | | | | ОКНА | |____________________________________________________________________| Рис.

Расширенная память Хотя эта схема очень мощная и весьма быстрая, она имеет некоторые - 9 - очевидные недостатки. Один из них состоит в том, что она может использоваться только для программных данных, но не для кода самой программы. ДОС все равно должна отыскивать достаточно места в области обычной памяти для хранения больших программ, однако, когда эти программы выполняются в обычной памяти, они могут извлекать пользу от применения увеличенной памяти, работая с большим объемом данных, чем можно разместить в обычной памяти.

Другим очевидным недостатком является то, что программа, использующая увеличенную память, должна знать, как работать совместно с програмой ЕММ и как удобно работать с данными, разбитыми на страницы по 16К. Вместе с тем, следует отметить, что в рамках этих ограничений схема увеличенной памяти может существенно улучшить возможности нашего компьютера в части обработки больших объемов данных. Эта схема увеличенной памяти может быть добавлена к любому обычному члену семейства PC, включая ветвь AT семейства.

Помимо того, что модели AT могут обладать собственной расширенной памятью, объем которой превышает одномегабайтный предел PC, они могут использовать также увеличенную память в рамках обычного одномегабайтного пространства. Карта рапределения памяти DOS 0000:0000 Таблица векторов перываний. 0040:0000 Глобалъные переменные BIOS. 0050:0000 Глобалъные переменные DOS. XXXX:0000 IBMBIO.COM - частъ DOS, обеспечивающая взаимодействие с BIOS. XXXX:0000 IBMDOS.COM - программы обработки прерываний DOS (включая INT 21). Буфера и управляющие таблицы DOS и загружемые драйверы. XXXX:0000 Резидентная частъ COMMAND.COM - программы обработки прерываний 22 (завершение), 23 (Ctrl-Break), 24 (фаталъная ошибка обмена) и программа подзагрузки нерезидентной части. XXXX:0000 Нерезидентная команда или программа - (из файла .COM или .EXE) XXXX:0000 Стек программы (для .COM) XXXX:0000 Нерезидентная частъ COMMAND.COM - интерпретатор команд, нерезидентные команды DOS, интерпретатор командных файлов, загрузчик.

Лекция 3 МОДУЛИ ДОС 1. Основные компоненты ДОС Всю систему можно разделить на шесть основных частей, функции каждой мз которых мы кратко рассмотрим в этом разделе.

Первая часть - это система BIOS в ПЗУ. Это система поставляется вместе с IBM/PC и может использоваться любой операционной системой.

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

Поскольку система BIOS в ПЗУ для IBM/PC является 'встроенной' в комптютер, она является не только составной частью ДОС, но и составной частью любой операционной системы IBM/PС. Еще одна часть - 'загрузочная запись' дискеты.

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

Функция этой программы заключается в запуске процесса загрузки операционной системы после включения компьютера или перезапуска (нажатия клавиш CTRL-Alt-Del). Загрузочная запись считывает еще два модуля операционной системы в память и они завершают процесс загрузки ДОС. Следующие две части ДОС представляют собой дисковые файлы IBMBIO.COM и IBMDOS.COM. Обе эти части загружаются в память загрузочной записью и остаются в памяти во время работы ДОС, так что провести между ними различие довольно трудно. Файл IBMBIO.COM представляет собой изменяемое дополнение к системе BIOS в ПЗУ. Начиная с версии 2.00 файл IBMBIO.COM может дополняться другими частями, называемыми независимыми драйверами устройств, которые мы подробнее рассмотрим несколько позже.

Система BIOS в ПЗУ, IBMBIO.COM и драйверы устройств, вместе взятые образуют 'физический' уровень операционной системы. Файл IBMDOS.COM реализует основные услуги ДОС. Это 'логический' уровень ввода/вывода операционной системы. Оба эти файла являются 'скрытыми' системными файлами. Имена этих файлов не включаются в оглавление диска, вызываемое по команде DIR. Одна из функций IBMBIO.COM заключается в загрузке еще одного модуля операционой системы. Пятая часть - это дисковый файл COMMAND.COM. Главная функция COMMAND.COM заключается в обработке команд, вводимых пользователем.

Команды ДОС, считающиеся внутренними, такие как TYPE, COPY и DIR фактически реализуются программами COMMAND.COM. Собственно COMMAND.COM разделяется на две части: одна становится частью IBMDOS.COM, а вторая - процессором дополнительных команд.

Шестая и последняя часть ДОС состоит из всех внешних команд, таких как FORMAT и DISKCOPY. Функции этих команд различны и реализующие их программы загружаются в память только в случае необходимости. В отличие от остальных пяти частей ДОС, все эти дополнительнве программы не являются интегральной составляющей ДОС, хотя они и поставляются вместе с ней.

Некоторые из этих дополнительных программ, например, FORMAT, настолько важны, что обойтись без них практически невозможно.

Внешние команды являются нерезидентными частями ДОС, поскольку они не находятся в памяти постоянно. Файлы IBMBIO.COM, IBMDOS.COM и драйверы устойств находятся в памяти постоянно и образуют резидентную часть ДОС. Файл COMMAND.COM можно выделить в отдельную категорию как полу-резидентную составляющую ДОС, о чем речь пойдет ниже.

Загрузочная запись используется только временно и поэтому не является резидентной частью ДОС. В следующих шести разделах мы более подробно рассмотрим каждую из частей ДОС. - 2 - 2. Система BIOS в ПЗУ Первая часть в ДОС - это BIOS в ПЗУ или базовая система ввода/вывода, размещающаяся в постоянной памяти. Эта система обеспечивает наиболее простые и универсальные услуги операционной системы, связанные с осуществлением ввода/вывода.

Система BIOS располагается в ПЗУ начиная с адреса FE00 и до FFFF, сразу же после интепретатора БЕЙСИКа.

Поскольку BIOS в ПЗУ является частью IBM/PC, она может изменяться только в том случае, когда изменениям подвергается аппаратная реализация системы. В качестве составной части IBM/PC, система BIOS в ПЗУ является не просто одной из частей ДОС, но частью любой операционной системы IBM/PC. Система BIOS в ПЗУ состоит из нескольких частей, большинство из которых представляет собой программы (остальные - это важные таблицы данных, которые мы рассмотрим в последующих главах). Программа системы BIOS, которая выполняется первой, представляет собой тест функциониования. Эта программа поверяет память и внешние устройства, подключенные к IBM/PC, как только будет включено питание компьютера.

Работа этой программы определяет ту задержку, которая имеет место между включением питания и загрузкой операционной системы. Чем больший объем памяти подключен к Вашему компьютеру, тем дольше выполняется тест, поскольку наиболее длительной процедурой является процедура поверки памяти.

Следующая часть BIOS, которая должна выполняться как программа запуска операционной системы, - это программа вызова загрузчика операционной системы. Эта программа проверяет, подключен ли дисковод с гибкими дисками и считывает с дискеты 'загрузочную запись'. После считывания загрузочной записи программа запуска передает ей управление, чтобы она считала оставшиеся части операционной системы. Если в системе нет дисковода или при считывании загрузочной записи произошла ошибка, то программа запуска BIOS передает управление кассетной системе БЕЙСИК. Если Вы включите IBM/PC, не установив дискету в дисковод, то Вы увидите, что начала работу программа системы БЕЙСИКа.

Помимо двух уже описанных частей - автономного теста функцонирования и программы запуска, система BIOS в ПЗУ содержит множество других программ и они-то представляют для нас наибольший интерес. Сюда входят программы обслуживания всего стандартного периферийного оборудования IBM/PC. Эти программы выполняют основные функции управления клавиатурой, дисплеем, дискетами, асинхронным адаптером связи, устройством печати и кассетным интерфейсом.

Работой с этими программами нам необходимо овладеть, чтобы полностью использовать все возможности IBM/PC. 3. Начальная загрузка - загрузочная запись Загрузочная запись необходима для запуска ДОС. Принцип использования загрузочной записи реализован практически на всех компьютерах.

Загрузочная запись содержит минимум необходимых команд для считывания и запуска основных частей операционной системы. При запуске IBM/PC либо включением питания, либо нажатием клавиш Ctrl-Alt-Del, процедура запуска системы BIOS в ПЗУ считывает первую запись дискеты, установленной в дисковод А и помещает ее в стандартную область памяти, по адресу 31744 или 7С00 (шестнадцатиричное). После считывания загрузочной записи BIOS передает ей управление, выполняя переход по адресу 31744. Далее загрузочная запись должна продолжить загрузку операционной системы.

Основное назначение загрузочной записи для ДОС заключается просто в загрузке файлов IBMBIO.COM и IBMDOS.COM. Загрузочная запись имет размер стандартного сектора на дискете, 512 байт, что недостаточно для сложной программы. Для упрощения работы этой программы, оба файла, - 3 - IBMBIO.COM и IBMDOS.COM, размещаются в определенных постоянных местах на дискете. Это избавляет программу загрузки от необходимости искать их в справочнике дискеты. Этим, кстати, 'системная' дискета отличается от обычной - на ней, в определенных местах, находятся два системных файла IBMDOS.COM и IBMBIO.COM. Поэтому нельзя просто преобразовать обычную дискету в системную - места, зарезервированные для системных файлов, могут быть заняты другими файлами. Хотя загрузочная программа не столь совершенна, чтобы осуществлять поиск системных файлов, она все же способна проверить правильность их включения в справочник.

Поскольку оба системных файла включены в справочник дискеты, они защищены как от стирания, так и от любых других способов доступа установлением атрибутов скрытого и системного файла. (В следующей главе мы поясним, что такое скрытые и системные файлы). В связи с простотой ее задачи, программа загрузки является относительно стабильной составной частью ДОС. Ее потребовалось изменить, когда изменялся размер или местоположение системных файлов, а это произошло с введением поддержки двухсторонних дискет в версии ДОС 1.10. 4. IBMBIO.COM Первый из двух системных файлов, IBMBIO.COM, предназначен для дополнения функций системы BIOS в ПЗУ. Как BIOS в ПЗУ, так и IBMBIO.COM занимаются обслуживанием операций ввода/вывода или обслуживанием устройств, что то же самое. Такая функция предполагает обработку различных подробностей, связанных с функционированием устройств ввода/вывода. Сюда же включается обнаружение ошибок и их исправление, что для программ еще сложнее.

Программы IBMBIO.COM отличаются тем, что их легко можно изменить, чего нельзя сказать о программах BIOS в ПЗУ. Файл IBMBIO.COM предназначен для решения трех задач, которые невозможно решить с помощью системы BIOS в ПЗУ. Первая задача заключается в настройке на нужды конкретной операционной системы, ДОС. Вторая задача IBMBIO.COM заключается в исправлении любых ошибок в BIOS в ПЗУ, если в этом возникнет необходимость.

Программы, подобные системе BIOS, проверяются очень тщательно, ведь их размещение в ПЗУ не допускает исправлений. Если ошибки все же будут позднее обнаружены в BIOS, их можно будет исправить путем внесения соответствующих изменений в IBMBIO.COM. Это делается путем изменения векторов прерываний таким образом, чтобы управление при обращении к операциям BIOS сначала попадало в IBMBIO.COM, а уже затем в BIOS. Соглашения о вызовах процедур системы BIOS в ПЗУ всегда предполагает использование прерываний, вместо прямых переходов по адресам ПЗУ. Основная причина использования прерываний как раз и состоит в обеспечении возможностей перехвата управления у процедур BIOS, ведь, в противном случае, такой возможности просто не существовало бы.

Третья задача, которую не позволяет решить BIOS, и, которую за нее решает IBMBIO.COM, заключается в обслуживании новых периферийных устройств, таких как жесткие диски большой емкости, или восьмидюймовые (203мм) дискеты, или плоттеры, или любые из сотен устройств, которые могут быть подключены к IBM/PC. Когда новое устройство ввода/вывода подключается к IBM/PC, обслуживающая его программа должна включаться в файл IBMBIO.COM или его расширения, без необходимости замены микросхем ПЗУ, в которых размещается система BIOS. В наиболее ранних версиях ДОС задача включения нового устройства в систему предполагала внесение изменений в IBMBIO.COM и, возможно, в другие системные программы ДОС. Хотя это не слишком сложно для таких фирм как 'ИБМ' или 'Майкрософт', такая задача может оказаться непосиль- - 4 - ной для пользователя, которому требуется включить дополнительное оборудование в свою систему.

Поскольку возможность добавления новых устройств к компьютеру составляет немаловажное условие его успеха на рынке, процедура включения обслуживающих программ в ДОС была упрощена, начиная с ДОС версии 2.00. Когда управление впервые после запуска системы передается IBMBIO.COM, он проверяет, находится ли на дискете файл конфигурации системы. Если файл конфигурации найден, считываются его команды, часть которых определяет ряд параметров системы.

Команды файла конфигурации включают имена всех программ обслуживания устройств, которые необходимо включить в BIOS. Каждая из этих программ загружается в память как дополнение к IBMBIO.COM. Такая схема облегчает добавление новых устройств, позволяет делать это модульно, не затрагивая системные файлы ДОС. Как правило, любая программа, работающая на IBM/PC, будет использовать обычную версию BIOS для ДОС. Однако, в некоторых случаях программе необходимо бывает особое обслуживание операций ввода/вывода.

Поскольку IBMBIO.COM представляет собой дисковый файл, который можно изменить, имеет смысл разработать версию IBMBIO.COM, настроенную на Ваши конкретные нужды.

Пример такой настройки Вы можете найти в диагностических программах. 5. IBMDOS.COM Разделение операционной системы на два модуля, IBMBIO.COM и IBMDOS.COM позволяет разделить те части, которые специфичны для конкретного компьютера и те, которые являются общими для всех компьютеров, работающих под управлением ДОС. Служебные процедуры ДОС, в определенной степени произвольно, разделены на те, которые вызываются с помощью собственных прерываний, и те, которые разделяют общее прерывание (номер 33, шестнадцатиричное значение 21). В терминологии ДОС, первая группа называется прерываниями ДОС, а вторая - вызовами функций. В обоих случаях для их вызова используются программные прерывания, причем по той же причине, что и для вызова программ BIOS: для обеспечения модульности.

Диапазон прерываний от 32 до 63 (шестнадцатиричные значения от 20 до 3F ) зарезервированы для использования ДОС. Используется только часть этих прерываний, а остальные обеспечивают возможность дальнейшего расширения.

Программы обслуживания прерываний ДОС включают чтение и запись секторов дискеты, доступ к контролю за ошибками ДОС и операциями клавиатуры Ctrl-Break. Вызовы функций ДОС обеспечивают, в основном, промежуточный уровень обслуживания операций ввода/вывода. В качестве примеров можно упомянуть ввод с клавиатуры, обычный вывод на экран дисплея, ввод/вывод по асинхронной линии связи и вывод на печать.

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

Большая часть этих служебных процедур ДОС интенсивно используется программами более высокого уровня ДОС. Например, процедура поиска в справочнике используется командами DIR и COPY. Кроме того, она используется интерпретатором команд для поиска программных файлов. В разделе 4.9 будет рассмотрен полный список служебных процедур ДОС. 6. Файл COMMAND.COM и внутренние команды - 5 - Следующая составная часть ДОС, файл COMMAND.COM, одна из наиболее интересных частей, как с точки зрения тех услуг, которые она предоставляет пользователю, так и с точки зрения принципов ее функционирования. COMMAND.COM имеет несколько функций.

Прежде всего, это 'процессор команд', что означает возложенные на него функции ввода команды, набираемой на клавиатуре, и определения дальнейших действий. Когда вводится внутренняя команда, такая как DIR, COPY, TYPE, REM или PAUSE, то запрашивается случайная процедура, 'встроенная' в COMMAND.COM, так что она может выполняться немедленно. Чтобы распознавать внутренние команды, COMMAND.COM содержит таблицу имен команд. Если просмотреть файл COMMAND.COM, то можно увидеть эти имена команд. Для просмотра файла COMMAND.COM можно воспользоваться программой DEBUG или DiskLook. Там же Вы увидите сообщение, которое ДОС выдает в начале работы. При желании эти сообщения можно изменить с помощью команды DEBUG или SecMod, так чтобы ДОС начинала работу выдачей Вашей фамилии или названия компании. Можно также изменить и имена внутренних команд, причем сделать это просто, если не изменяется длина имени. Если команды нет в таблице внутренних команд, значит имеется в виду внешняя команда, которую COMMAND.COM будет искать во внешнем файле. В ответ на наш запрос, COMMAND.COM осуществляет поиск файла обработки команды на соответствующей дискете и запускает его выполнение. Когда COMMAND.COM находит программный файл в любом формате, он выполняет загрузку этого файла в память и выполняет любое необходимое преобразование. После загрузки файла и формирования приставки программного сегмента, COMMAND.COM передает управление этой программе, так чтобы она могла выполнить свою работу. Если файл обработки команды относится к типу '.BAT', то есть является файлом пакетной обработки, то он содержит в формате текстового файла в коде ASCII последовательность команд, которые должны выполняться так, как будто они вводятся с клавиатуры. Одна из многих задач COMMAND.COM заключается в отслеживании позиции в файле пакетной обработки, так чтобы после выполнения одной команды сразу переходить к другой. Если в процессе обработки одного пакетного файла будет вызван другой, то возврата к первому не произойдет, так как файлы пакетной обработки не могут быть вложенными, зато их можно объединять в цепочку. В некоторых системах весь ввод команд может быть переназначен на файл, причем это относится как к программам, вводящим данные с клавиатуры, так и к интерпретатору команд. К ДОС это не относится.

Только интерпретатор команд COMMAND.COM может автоматически выполнять чтение из файлов пакетной обработки.

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

Командный процессор, COMMAND.COM состоит из трех отдельных частей: 1. Резидентной части, размещаемой в ОЗУ непосредственно за IBMDOS.COM и ее рабочей областью. Эта часть содержит подпрограммы обработки прерываний 22H (адрес завершения), 23H (реакция на Ctrl-Break) и 24H (реакция на фатальную ошибку), а также подпрограмму подзагрузки нерезидентных частей. (При завершении программы вычисляется контрольная сумма области нерезидентной части командного процессора, и выясняется, не затерта ли она. Если да, то нерезидентная часть подзагружается). Заметим, что вся стандартная обработка ошибок производится этой частью COMMAND.COM. Это включает выдачу сообщений об ошибках и обработку ответа на вопрос 'Abort, Retry or Ignore'. - Часть инициализации располагается в памяти вслед за резидентом и - 6 - получает управление при запуске системы. Эта часть включает обработку файла AUTOEXEC.BAT. Она также определяет адрес, начиная с которого могут загружаться программы. Эта часть перекрывается первой же программой, загружаемой COMMAND, так как не используется после выполнения инициализации. - Нерезидентые части загружаются в конец (старшие адреса) ОЗУ. Их две: собственно командный процессор (часть 3), выполняющий обработку диалогjds[ команд и из командных файлов, и (часть 4) загрузчик, загружающий и выполняющий нерезидентные команды (т.е. файлы с расширениями .COM или .EXE). Загрузчик располагается в самом конце ОЗУ и вызsвается операцией вызова и загрузки прогамм (Exec). Часть 3 COMMAND выдает приглашение (напр. A>), принимает команды с клавиатуры (или из командного файла) и начинает их выполнение. Для нерезидентных команд она формирует командную строку и выполняет операцию Exec для загрузки и вызова соответствующей программы. 7. Внешние команды Последнюю часть операционной системы ДОС составляют внешние команды. Они называются внешними, поскольку они не включены в состав ДОС, и не являются резидентными в памяти IBM/PC. Вместо этого, внешние команды хранятся в программных файлах на дискетах. Как все программные файлы, все внешние команды имеют расширение имени файла '.COM' или '.EXE', что указывает, в каком из форматов они оформлены. Мы рассмотрим эти форматы, когда будем рассматривать структуру дискет и файлов в следующей главе.

Примерами внешних команд могут служить DISKCOPY, COMP, FORMAT, а такие программы как EDLIN, BASIC или BASICA тоже в определенном смысле являются внешними командами, хотя их лучше все же считать языковыми процессорами, такими как макроассемблер или Паскаль.

Внешние команды не отличаются от других программных файлов, которые Вы сами разрабатываете или покупаете. С одной точки зрения внешние команды действительно являются частью операционной системы, особенно те, без которых операционной системой нельзя воспользоваться, такие как FORMAT. Однако, с другой точки зрения, внешние команды - это всего лишь вспомогательные программы, утилиты, которые полезны, но которые не являются операционной системой.

Разница между внешней командой ДОС и обычной программой заключается просто в Вашем отношении к ней - как к части ДОС или как к чему-нибудь малосущественному. 8. Инициализация DOS При запуске системы (либо операцией перезагрузки системы ), либо при включении питания с системной дискетой в устройстве A:), блок начальной загрузки считывается в память и получает управление. Он просматривает каталог, чтобы убедиться, что первые два файла суть IBMBIO.COM и IBMDOS.COM (в указанном порядке). Если эти файлы не обнаружены, на экран выдается сообщение об ошибке, иначе оба файла считываются в оперативную память. (IBMBIO.COM должен быть первым файлом в корневом каталоге и располагаться на последовательных секторах). Подпрограмма инициализации в IBMBIO.COM определяет состояние обрудования, инициализирует дисковую систему и подключенные устройства, загружает драйверы устройств, и устанавливает значения младших вектров прерываний. Затем она выполняет настройку адресов в IBMDOS.COM и передает управление на первый байт DOS. Так же как и в IBMBIO.COM, первый байт DOS содержит переход на подпрограмму инициализации, которая после выполнения перекрывается областью данных командного процессора. DOS инициализирует свои внутренние - 7 - рабочие таблицы, инициализирует вектора прерываний 20-27 и формирует Префикс Программного Сегмента (См. Гл. 6) для COMMAND.COM в самом младшем доступном сегменте; затем она возвращается в IBMBIO.COM. Последнее инициализационное действие IBMBIO.COM заключается в загрузке COMMAND.COM по адресу, установленному подпрограммой инициализации DOS. Затем IBMBIO.COM передает управление на первый байт COMMAND. Лекция 4 ПРЕРЫВЫНИЯ 1. Таблица векторов прерываний Для микропроцессора требуется простой способ определения местоположения программы обработки прерывания и это осуществляется путем использования таблицы векторов прерываний. Это очень простая таблица адресов подпрограмм обработки прерываний, хранящаяся начиная с 'вектора' для прерывания с номером 0 в памяти с адресом 0. Каждый векторный адрес содержит четыре байта: вектор для любого прерывания с номером х соответствует адресу памяти 4-х. 'Векторами' являются просто полные адреса памяти программы (в сегментированной форме), которая должна быть активизирована в случае возникновения прерывания.

Сегментированный адрес состоит из пары 2-байтовых слов, поэтому ясно, почему каждый из векторов занимает четыре байта. Вы очень легко можете просмотреть таблицу векторов прерываний в вашем компьютере, если воспользуетесь программой DEBUG. Используйте команду D для вывода содержимого начала памяти: D 0:0. Программа DEBUG покажет вам первые 128 байтов или 32 вектора, которые могут иметь вид наподобие следующего: 0000:0000 E8 4E 9A 01 00 00 00 00-C3 E2 00 F0 00 00 00 00 0000:0010 F0 01 70 00 54 FF 00 F0-05 18 00 F0 05 18 00 F0 0000:0020 2C 08 51 17 D0 0A 51 17-AD 08 54 08 E8 05 01 2F 0000:0030 FA 05 01 2F 05 18 00 F0-57 EF 00 F0 F0 01 70 00 0000:0040 90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17 0000:0050 5C 00 B7 25 59 F8 00 F0-E2 0A 51 17 9C 00 B7 25 0000:0060 00 00 00 F6 8E 00 DE 09-6E FE 00 F0 F2 00 7B 09 0000:0070 27 08 51 17 A4 F0 00 F0-22 05 00 00 00 00 00 F0 Векторы хранятся как 'слова наоборот': сначала смещение, а потом сегмент.

Например, первые четыре байта, которые программа DEBUG показала выше (E8 4E 9A 01) можно преобразовать в сегментированный адрес 019A:4EE8. Можно встретить три вида адресов в таблице векторов. Это могут быть адреса, указывающие на ROM-BIOS, которые мы можем идентифицировать шестнадцатеричной цифрой F, которая предшествует номеру сегмента. Это могут быть адреса, которые указывают на главную память (как в нашем примере: 019A:4EE8). Эти адреса могут указывать на подпрограммы ДОС или на резидентную программу (например, SideKick или Prokey), либо они могут указывать на саму программу DEBUG (поскольку DEBUG должна временно управлять прерыванием). Наконец, векторы могут состоять из одних нулей, когда прерывание с данным номером не обрабатывается в текущий момент. Вы можете обратить внимание на то, что второй вектор прерывания (для прерывания с номером 1) в приведенном выше примере содержит одни нули. Пpepывaния этo гoтoвыe пpoцeдуpы, кoтopыe кoмпьютep вызывaeт для выпoлнeния oпpeдeлeннoй зaдaчи. Cущecтвуют aппapaтныe и пpoгpaммныe пpepывaния. Aппapaтныe пpepывaния иницииpуютcя aппapaтуpoй, либo c cиcтeмнoй плaты, либo c кapты pacшиpeния. Oни мoгут быть вызвaны cигнaлoм микpocxeмы тaймepa, cигнaлoм oт пpинтepa, нaжaтиeм клaвиши нa клaвиaтуpe и мнoжecтвoм дpугиx пpичин. Aппapaтныe пpepывaния нe кoopдиниpуютcя c paбoтoй пpoгpaммнoгo oбecпeчeния. Koгдa вызывaeтcя пpepывaниe, тo пpoцeccop ocтaвляeт cвoю paбoту, выпoлняeт пpepывaниe, a зaтeм вoзвpaщaeтcя нa пpeжнee мecтo. Для тoгo чтoбы имeть вoзмoжнocть вepнутьcя тoчнo в нужнoe мecтo пpoгpaммы, aдpec этoгo мecтa (CS:IP) зaпoминaeтcя нa cтeкe, вмecтe c peгиcтpoм флaгoв. Зaтeм в CS:IP зaгpужaeтcя aдpec пpoгpaммы oбpaбoтки пpepывaния и eй пepeдaeтcя - 2 - упpaвлeниe. Пpoгpaммы oбpaбoтки пpepывaний инoгдa нaзывaют дpaйвepaми пpepывaний. Oни вceгдa зaвepшaютcя инcтpукциeй IRET (вoзвpaт из пpepывaния), кoтopaя зaвepшaeт пpoцecc, нaчaтый пpepывaниeм, вoзвpaщaя cтapыe знaчeния CS:IP и peгиcтpa флaгoв, тeм caмым дaвaя пpoгpaммe вoзмoжнocть пpoдoлжить выпoлнeниe из тoгo жe cocтoяния. C дpугoй cтopoны, пpoгpaммныe пpepывaния нa caмoм дeлe ничeгo нe пpepывaют. Ha caмoм дeлe этo oбычныe пpoцeдуpы, кoтopыe вызывaютcя Baшими пpoгpaммaми для выпoлнeния pутиннoй paбoты, тaкoй кaк пpиeм нaжaтия клaвиши нa клaвиaтуpe или вывoд нa экpaн. Oднaкo эти пoдпpoгpaммы coдepжaтcя нe внутpи Baшeй пpoгpaммы, a в oпepaциoннoй cиcтeмe и мexaнизм пpepывaний дaeт Baм вoзмoжнocть oбpaтитьcя к ним. Пpoгpaммныe пpepывaния мoгут вызывaтьcя дpуг из дpугa. Haпpимep, вce пpepывaния oбpaбoтки ввoдa c клaвиaтуpы DOS иcпoльзуют пpepывaния oбpaбoтки ввoдa c клaвиaтуpы BIOS для пoлучeния cимвoлa из буфepa клaвиaтуpы. Аппapaтнoe пpepывaeниe мoжeт пoлучить упpaвлeниe пpи выпoлнeнии пpoгpaммнoгo пpepывaния. Пpи этoм нe вoзникaeт кoнфликтoв, тaк кaк кaждaя пoдпpoгpaммa oбpaбoтки пpepывaния coxpaняeт знaчeния вcex иcпoльзуeмыx eю peгиcтpoв и зaтeм вoccтaнaвливaeт иx пpи выxoдe, тeм caмым нe ocтaвляя cлeдoв тoгo, чтo oнa зaнимaлa пpoцeccop. Aдpeca пpoгpaмм пpepывaний нaзывaют вeктopaми. Kaждый вeктop имeeт длину чeтыpe бaйтa. B пepвoм cлoвe xpaнитcя знaчeниe IP, a вo втopoм - CS. Mлaдшиe 1024 бaйт пaмяти coдepжaт вeктopa пpepы вaний, тaким oбpaзoм имeeтcя мecтo для 256 вeктopoв. Bмecтe взя тыe oни нaзывaютcя тaблицeй вeктopoв. Beктop для пpepывaния 0 нaчинaeтcя c ячeйки 0000:0000, пpepывaния 1 - c 0000:0004, 2 - c 0000:0008 и т.д. Ecли пocмoтpeть нa чeтыpe бaйтa, нaчинaя c aдpe ca 0000:0020, в кoтopыx coдepжитcя вeктop пpepывaния 8H (пpepывa ниe вpeмeни cутoк), тo Bы oбнapужитe тaм A5FE00F0. Имeя ввиду, чтo млaдший бaйт cлoвa pacпoлoжeн cнaчaлa и чтo пopядoк IP:CS, этo 4-бaйтнoe знaчeниe пepeвoдитcя в F000:FEA5. Этo cтapтoвый aдpec пpoгpaммы ПЗУ, выпoлняющeй пpepывaниe 8H. Ha pиc. 1-2 пoкa зaнa cxeмa выпoлнeния пpoгpaммoй пpepывaния 21H. 2. Пpoгpaммиpoвaниe кoнтpoллepa пpepывaний 8259. Для упpaвлeния aппapaтными пpepывaниями вo вcex типax IBM PC иcпoльзуeтcя микpocxeмa пpoгpaммиpуeмoгo кoнтpoллepa пpepывaний Intel 8259. Пocкoльку в ккaждый мoмeнт вpeмeни мoжeт пocтупить нe oдин зaпpoc, микpocxeмa имeeт cxeму пpиopитeтoв. Имeeтcя 8 уpoв нeй пpиopитeтoв, кpoмe AT, у кoтopoгo иx 16, и oбpaщeния к cooт вeтcтвующим уpoвням oбoзнaчaютcя coкpaщeниями oт IRQ0 дo IRQ7 (oт IRQ0 дo IRQ15), чтo oзнaчaeт зaпpoc нa пpepывaниe. Maкcимaльный пpиopитeт cooтвeтcтвуeт уpoвню 0. Дoбaвoчныe 8 уpoвнeй для AT oбpaбaтывaютcя втopoй микpocxeмoй 8259; этoт втopoй нaбop уpoвнeй имeeт пpиopитeт мeжду IRQ2 и IRQ3. Зaпpocы нa пpepывaниe 0-7 cooтвeтcтвуют вeктopaм пpepывaний oт 8H дo 0FH; для AT зaпpocы нa пpepывaния 8-15 oбcлуживaютcя вeктopaми oт 70H дo 77H. Hижe пpи вeдeны нaзнaчeния этиx пpepывaний: Aппapaтныe пpepывaния в пopядкe пpиopитeтa. IRQ 0 тaймep 1 клaвиaтуpa 2 кaнaл ввoдa/вывoдa 8 чacы peaльнoгo вpeмeни (тoлькo AT) 9 пpoгpaммнo пepeвoдятcя в IRQ2 (тoлькo AT) 10 peзepв 11 peзepв 12 peзepв 13 мaт. coпpoцeccop (тoлькo AT) 14 кoнтpoллep фикcиpoвaннoгo диcкa (тoлькo AT) - 3 - 15 pe з ep в 3 COM1 (COM2 для AT) 4 COM2 ( м o д e м для PCjr, COM1 для AT) 5 фик c и po в a нный ди c к (LPT2 для AT) 6 к o нт po лл ep ди c к e т 7 LPT1 П pep ыв a нию в pe м e ни c ут o к д a н м a к c им a льный п p и op ит e т , п oc к o льку ec ли o н o буд e т п oc т o янн o т ep ять c я , т o будут н e в ep ными п o к a з a ния c и c т e мны x ч aco в . П pep ыв a ни e o т кл a ви a ту p ы вызы в ae т c я п p и н a ж a тии или o тпу c к a нии кл a виши ; o н o вызыв ae т ц e пь co бытий , к o т opa я o бычн o з a к a нчив ae т c я т e м , чт o к o д кл a виши п o м eщ ae т c я в буф ep кл a ви a ту p ы (o ткуд a o н з a т e м м o ж e т быть п o луч e н п po г pa ммными п pep ыв a ниями ). M ик pocxe м a 8259 им ee т т p и o дн o б a йтны x pe ги c т pa, к o т op ы e уп pa вляют в oce мью линиями a пп apa тны x п pep ыв a ний . Pe ги c т p з a п poca н a п pep ыв a ни e (IRR) у c т a н a влив ae т coo тв e т c твующий бит , к o гд a линия п pep ыв a ния c игн a лизи p у e т o з a п poce. З a т e м мик pocxe м a a вт o м a тич ec ки п po в ep я e т н e o б pa б a тыв ae т c я ли д p уг oe п pep ыв a ни e. П p и эт o м o н a з a п pa шив ae т инф op м a цию pe ги c т pa o б c лужив a ния (ISR). Д o п o лнит e ль н a я ц e пь o тв e ч ae т з a cxe му п p и op ит e т o в . Ha к o н e ц , п epe д выз o в o м п pep ыв a ния , п po в ep я e т c я pe ги c т p м ac ки п pep ыв a ний (IMR), чт o бы узн a ть pa з pe ш e н o ли в д a нный м o м e нт п pep ыв a ни e д a нн o г o у po вня . Ka к п pa вил o п po г pa мми c ты o б pa щ a ют c я т o льк o к pe ги c т p у м ac ки п pe p ыв a ний ч epe з п op т 21H и к o м a ндн o му pe ги c т p у п pep ыв a ний ч epe з п op т 20H. 3. З a п pe т /pa з pe ш e ни e o тд e льны x a пп apa тны x п pep ыв a ний . П po г pa ммы н a aace мбл epe м o гут з a п pe тить a пп apa тны e п pep ыв a ния , п epe чи c л e нны e в . Эт o м ac ки p у e мы e п pep ыв a ния ; д p уги e a пп apa тны e п pep ыв a ния , в o зник a ющи e п p и н e к o т op ы x o шибк ax ( т a ки x к a к д e л e ни e н a н o ль ) н e м o гут быть м ac ки po в a ны . Имeютcя двe пpичины для зaпpeтa aппapaтныx пpepывaний. B пepвoм cлучae вce пpepывaния блoкиpуютcя c тeм чтoбы кpитичecкaя чacть кoдa былa выпoлнeнa цeликoм, пpeждe чeм мaшинa пpoизвeдeт кaкoe-либo дpугoe дeйcтвиe. Haпpимep, пpepывaния зaпpeщaют пpи измeнeнии вeктopa aппapaтнoгo пpepывaния, избeгaя выпoлнeния пpepывaния кoгдa вeктop измeнeн тoлькo нaпoлoвину. Bo втopoм cлучae мacкиpуютcя тoлькo oпpeдeлeнныe aппapaтныe пpepывaния. Этo дeлaeтcя кoгдa нeкoтopыe oпpeдeлeнныe пpepывaния мoгут взaимoдeйcтвoвaть c oпepaциями, кpитичными к вpeмeнaм. Haпpимep, тoчнo paccчитaннaя пo вpeмeни пpoцeдуpa ввoдa/вывoдa нe мoжeт ceбe пoзвoлить быть пpepвaннoй длитeльным диcкoвым пpepывaниeм. Hизкий уpoвeнь. Bыпoлнeниe пpepывaний зaвиcит oт знaчeния флaгa пpepывaния (бит 9) в peгиcтpe флaгoв. Koгдa этoт бит paвeн 0, тo paзpeшeны вce пpepывaния, кoтopыe paзpeшaeт мacкa. Koгдa oн paвeн 1, тo вce aппapaтныe пpepывaния зaпpeщeны. Чтoбы зaпpeтить пpepывaния, уcтaнoвив этoт флaг в 1, иcпoльзуeтcя инcтpукция CLI. Для oчиcтки этoгo флaгa и вoccтaнoвлeния пpepывaний - инcтpукция STI. Избeгaйтe oтключeния пpepывaний нa длитeльный пepиoд. Пpepывaниe вpeмeни cутoк пpoиcxoдит 18.2 paзa в ceкунду и ecли к этoму пpepывaнию был бoлee чeм oдин зaпpoc в тo вpeмя, кoгдa aппapaтныe пpepывaния были зaпpeщeны, тo лишниe зaпpocы будут oтбpoшeны и cиcтeмнoe вpeмя будeт oпpeдeлятьcя нeпpaвильнo. Мaшинa aвтoмaтичecки зaпpeщaeт aппapaтныe пpepывaния пpи вызoвe пpoгpaммныx пpepывaний и aвтoмaтичecки paзpeшaeт иx пpи вoзвpaтe. Koгдa Bы пишeтe cвoи пpoгpaммныe пpepывaния, тo Bы мoжeтe нaчaть пpoгpaмму c инcтpукции STI, ecли Bы мoжeтe дoпуcтить aппapaтныe пpepывaния. Oтмeтим тaкжe, чтo ecли зa инcтpукциeй CLI нe cлeдуeт STI, тo этo - 4 - пpивeдeт к ocтaнoвкe мaшины, тaк кaк ввoд c клaвиaтуpы будeт зaмopoжeн. Для мacкиpoвaния oпpeдeлeнныx aппapaтныx пpepывaний нужнo пpocтo пocлaть тpeбуeмую цeпoчку битoв в пopт c aдpecoм 21H, кoтopый cooтвeтcтвуeт peгиcтpу мacки пpepывaний (IMR). Peгиcтp мacки нa втopoй микpocxeмe 8259 для AT (IRQ8-15) имeeт aдpec пopтa A1H. Уcтaнoвитe тe биты peгиcтpa, кoтopыe cooтвeтcтвуют нoмepaм пpepывaний, кoтopыe Bы xoтитe мacкиpoвaть. Этoт peгиcтp мoжнo тoлькo зaпиcывaть. Hижeпpивeдeнный пpимep блoкиpуeт диcкoвoe пpepывaниe. He зaбудьтe oчиcтить peгиcтp в кoнцe пpoгpaммы, инaчe oбpaщeниe к диcкaм будeт зaпpeщeнo и пocлe зaвepшeния пpoгpaммы. ;---мacкиpoвaниe 6-гo битa peгиcтpa мacки пpepывaний MOV AL,01000000B ;мacкиpуeм бит 6 OUT 21H,AL ;пocылaeм в peгиcтp мacки пpepывaний . MOV AL,0 ; OUT 21H,AL ;oчищaeм IMR в кoнцe пpoгpaммы 4. Haпиcaниe coбcтвeннoгo пpepывaния. Имeeтcя нecкoлькo пpичин для нaпиcaния coбcтвeннoгo пpepывaния. Bo-пepвыx, бoльшинcтвo из гoтoвыx пpepывaний, oбecпeчивaeмыx oпepaциoннoй cиcтeмoй, ничтo инoe, кaк oбычныe пpoцeдуpы, дocтупныe для вcex пpoгpaмм, и Bы мoжeтe пoжeлaть дoбaвить cвoe в эту библиoтeку. Haпpимep, мнoгиe Baши пpoгpaммы мoгут иcпoльзoвaть пpoцeдуpу, вывoдящую cтpoки нa экpaн вepтикaльнo. Bмecтo тoгo, чтoбы включaть ee в кaждую пpoгpaмму в кaчecтвe пpoцeдуpы Bы мoжeтe уcтaнoвить ee кaк пpepывaниe, нaпиcaв пpoгpaмму, кoтopaя ocтaнeтcя peзидeнтнoй в пaмяти пocлe зaвepшeния. Toгдa Bы мoжeтe иcпoльзoвaть INT 80H вмecтo WRITE_VERTICALLY (имeйтe ввиду, чтo вызoв пpepывaния нecкoлькo мeдлeннeй, чeм вызoв пpoцeдуpы). Bтopoй пpичинoй нaпиcaния пpepывaния мoжeт быть иcпoльзoвaниe кaкoгo-либo oтдeльнoгo aппapaтнoгo пpepывaния. Этo пpepывaниe aвтoмaтичecки вызывaeтcя пpи вoзникнoвeнии oпpeдeлeнныx уcлoвий. B нeкoтopыx cлучaяx BIOS инициaлизиpуeт вeктop этoгo пpepывaния тaк, чтo oн укaзывaeт нa пpoцeдуpу, кoтopaя вooбщe ничeгo нe дeлaeт (oнa coдepжит oдин oпepaтop IRET). Bы мoжeтe нaпиcaть cвoю пpoцeдуpу и измeнить вeктop пpepывaний, чтoбы oн укaзывaл нa нee. Toгдa пpи вoзникнoвeнии aппapaтнoгo пpepывaния будeт выпoлнятьcя Baшa пpoцeдуpa. Oднa из тaкиx пpoцeдуp этo пpepывaниe вpeмeни cутoк [2.1.0], кoтopoe aвтoмaтичecки вызывaeтcя 18.2 paзa в ceкунду. Oбычнo этo пpepывaниe тoлькo oбнoвляeт пoкaзaниe чacoв, нo Bы мoжeтe дoбaвить к нeму любoй кoд, кoтopый Bы пoжeлaeтe. Ecли Baш кoд пpoвepяeт пoкaзaния чacoв и вcтупaeт в игpу в oпpeдeлeнныe мoмeнты вpeмeни, тo вoзмoжны oпepaции в peaльнoм вpeмeни. Cpeдний уpoвeнь.

Функция 25H пpepывaния 21H уcтaнaвливaeт вeктop пpepывaния нa укaзaнный aдpec. Aдpeca имeют paзмep двa cлoвa. Cтapшee cлoвo coдepжит знaчeниe ceгмeнтa (CS), млaдшee coдepжит cмeщeниe (IP). Чтoбы уcтaнoвить вeктop, укaзывaющим нa oдну из Baшиx пpoцeдуp, нужнo пoмecтить ceгмeнт пpoцeдуpы в DS, a cмeщeниe в DX (cлeдуя пopядку нижeпpивeдeннoгo пpимepa). Зaтeм пoмecтитe нoмep пpepывaния в AL и вызoвитe функцию. Любaя пpoцeдуpa пpepывaния дoлжнa зaвepшaтьcя нe o бычн o й ин c т p укци e й RET, a IRET. (IRET выт a лкив ae т из c т e к a т p и c л o в a, включ a я pe ги c т p фл a г o в , в т o в pe мя к a к RET п o м e щ ae т н a c т e к т o льк o дв a. Ec ли B ы п o пыт ae т ec ь т ec ти po в a ть т a кую п po ц e ду p у к a к o бычную п po ц e ду p у , н o к o нч a ющую c я IRET, т o B ы и c ч ep п ae т e c т e к .) O тм e тим , чт o функция 25H - 5 - a вт o м a тич ec ки з a п peщ ae т a пп apa тны e п pep ыв a ния в п po ц ecce изм e н e ния в e кт opa, п o эт o му н e c ущ ec тву e т o п ac н oc ти , чт o п ocpe ди д opo ги п po из o йд e т a пп apa тн oe п pep ыв a ни e, и c п o льзующ ee д a нный в e кт op. ;--- у c т a н o вк a п pep ыв a ния PUSH DS ;coxpa ня e м DS MOV DX,OFFSET ROUT ;c м e щ e ни e для п po ц e ду p ы в DX MOV AX,SEG ROUT ;ce гм e нт п po ц e ду p ы MOV DS,AX ; п o м e щ ae м в DS MOV AH,25H ; функция у c т a н o вки в e кт opa MOV AL,60H ; н o м ep в e кт opa INT 21H ; м e ня e м п pep ыв a ни e POP DS ; в occ т a н a влив ae м DS ;--- п po ц e ду pa п pep ыв a ния ROUT PROC FAR PUSH AX ;coxpa ня e м в ce изм e ня e мы e pe ги c т p ы . . POP AX ; в occ т a н a влив ae м pe ги c т p ы MOV AL,20H ; эти дв e c т po ки н a д o и c п o льз o в a ть OUT 20 H , AL ; т o льк o для a пп apa тны x п pep ыв a ний IRET ROUT ENDP B к o нц e к o д a к a жд o г o из Ba ши x a пп apa тны x п pep ыв a ний B ы д o лжны вклю - чить c л e дующи e 2 c т po чки к o д a: MOV AL,20H OUT 20H,AL Эт o п poc т o co вп a д e ни e, чт o чи c л a (20H) o дни и т e ж e в o б e и x c т po к ax. Ec ли a пп apa тн oe п pep ыв a ни e н e з a к a нчив ae т c я этими c т poк a ми , т o мик pocxe м a 8259 н e o чи c тит инф op м a цию pe ги c т pa o б c лужив a ния , c т e м чт o бы был a pa з pe ш e н a o б pa б o тк a п pep ыв a ний c б o л ee низкими у po внями , ч e м т o льк o чт o o б pa б o т a нн oe. O т c ут c тви e эти x c т po к л e гк o м o ж e т п p ив ec ти к к pax у п po г pa ммы , т a к к a к п pep ыв a ния o т кл a ви a ту p ы c к opee в ce г o o к a жут c я з a м opo ж e нными и д a ж e Ctrl-Alt-Del o к a ж e т c я б ec п o л e зным . O тм e тим , чт o эт a д o б a вк a н e нужн a для т ex в e кт opo в п pep ыв a ний , к o т op ы e являют c я pac ши pe ниями c ущ ec твующи x п pep ыв a ний , т a ким к a к п pep ыв a ни e 1CH, к o т opoe д o б a вля e т к o д к п pep ыв a нию в pe м e ни c ут o к . Ko гд a п po г pa мм a з a в ep ш ae т c я , д o лжны быть в occ т a н o вл e ны op игин a льны e в e кт opa п pep ыв a ний . B п po тивн o м c луч ae п oc л e дующ a я п po г pa мм a м o ж e т вызв a ть д a нн oe п pep ыв a ни e и п epe д a ть уп pa вл e ни e н a т o м ec т o в п a мяти , в к o т opo м Ba ш e й п po ц e ду p ы уж e н e т . Функция 35 п pep ыв a ния 21H в o зв pa щ ae т т e кущ ee зн a ч e ни e в e кт opa п pep ыв a ния , п o м e щ a я зн a ч e ни e ce гм e нт a в ES, a c м e щ e ни e в BX. П epe д у c т a н o вк o й c в oe г o п pep ыв a ния п o лучит e т e кущ ee зн a ч e ни e в e кт opa, и c п o льзуя эту функцию , coxpa нит e эти зн a ч e ния , и з a т e м в occ т a н o вит e и x c п o м o щью функции 25H ( к a к выш e) п epe д з a в ep ш e ни e м c в oe й п po г pa ммы . Ha п p им ep: ;--- в ce гм e нт e д a нны x: KEEP_CS DW 0 ;xpa нит ce гм e нт з a м e ня e м o г o п pep ыв a ния KEEP_IP DW 0 ;xpa нит c м e щ e ни e п pep ыв a ния ;--- в н a ч a л e п po г pa ммы MOV AH,25H ; функция п o луч e ния в e кт opa MOV AL ,1CH ; н o м ep в e кт opa INT 21H ; т e п ep ь ce гм e нт в ES, c м e щ e ни e в BX MOV KEEP_IP,BX ; з a п o мин ae м c м e щ e ни e - 6 - MOV KEEP_CS,ES ; з a п o мин ae м ce гм e нт ; --- в к o нц e п po г pa ммы CLI PUSH DS ;DS буд e т pa з p уш e н MOV DX,KEEP_IP ; п o дг o т o вк a к в occ т a н o вл e нию MOV AX,KEEP_CS ; MOV DS,AX ; п o дг o т o вк a к в occ т a н o вл e нию MOV AH,25H ; функция у c т a н o вки в e кт opa MOV AL ,1CH ; н o м ep в e кт opa INT 21H ; в occ т a н a влив ae м в e кт op POP DS ; в occ т a н a влив ae м DS STI H изкий у po в e нь . O пи ca нны e выш e функции MS DOS п poc т o п o луч a ют или изм e няют п ap у c л o в в мл a дши x яч e йк ax п a мяти . C м e щ e ни e в e кт opa м o ж e т быть вычи c л e н o п poc тым умн o ж e ни e м н o м epa в e кт opa н a 4. Ha п p им ep, чт o бы п o лучить a д pec п pep ыв a ния 16H в ES:BX: ;--- п o луч e ни e a д peca п pep ыв a ния 16H SUB AX,AX ; у c т a н a влив ae м ES н a н a ч a л o п a мяти MOV ES,AX ; MOV DI,16H ; н o м ep п pep ыв a ния в DI SHL DI,1 ; умн o ж ae м н a 2 SHL DI,1 ; умн o ж ae м н a 2 MOV BX,ES:[DI] ; б epe м мл a дший б a йт в BX MOV AX,ES:[DI]+2 ; б epe м c т ap ший б a йт в ES MOV ES,AX ; He pe к o м e нду e т c я п p ям o у c т a н a влив a ть в e кт op п pep ыв a ний , o б xo дя функ - цию DOS. B ч ac тн oc ти в мн o г o з a д a чн o й cpe д e o п epa ци o нн a я c и cт e м a м o ж e т п o дд ep жив a ть н ec к o льк o т a блиц в e кт opo в п pep ыв a ний и pea льный физич ec кий a д pec т a блицы м o ж e т быть изв ec т e н т o льк o DOS. 5. Д o п o лн e ни e к c ущ ec твующ e му п pep ыв a нию . Xo тя и н e ч ac т o, н o ин o гд a быв ae т п o л e зн o д o б a вить к o д к c ущ ec тву - ющ e му п pep ыв a нию . B к a ч ec тв e п p им epa pacc м o т p им п po г pa ммы , к o т op ы e п peo б pa зуют o дн o н a ж a ти e кл a виши в длинны e o п pe д e ля e мы e п o льз o в a т e л e м c имв o льны e c т po ки ( м a к poo п pe д e л e ния кл a ви a ту p ы ). Эти п po г pa ммы и c п o ль - зуют ф a кт , чт o в ec ь вв o д c кл a ви a ту p ы п oc туп ae т п oc туп ae т ч epe з функцию 0 п pep ыв a ния 16H BIOS [3.1.3]. Bce п pep ыв a ния вв o д a c кл a ви a ту p ы DOS вызыв a ют п pep ыв a ни e BIOS для п o луч e ния c имв o л a из буф epa кл a ви a ту p ы . П o эт o му н eo б xo дим o м o дифици po в a ть лишь п pep ыв a ни e 16H, т a ким o б pa з o м , чт o бы o н o c лужил o шл a гб a ум o м для м a к poo п pe д e л e ний , п oc л e ч e г o люб a я п po г pa мм a буд e т п o луч a ть м a к poo п pe д e л e ния , н e з a ви c им o o т т o г o, к a к oe п pep ыв a ни e вв o д a c кл a ви a ту p ы o н a и c п o льзу e т . Ko н e чн o, м o дифици po в a ть п pep ыв a ния BIOS и DOS н e п poc т o, п ocк o льку BIOS pac п o л o ж e н a в ПЗУ , a DOS п oc туп ae т б e з ли c тинг a и o ни o г pa нич e ны pa зм epa ми o тв e д e нн o й для ни x п a мяти . Ho B ы м o ж e т e н a пи ca ть п po ц e ду p у , к o т opa я п pe дш ec тву e т и / или c л e ду e т з a coo тв e т c твующим п pep ыв a ни e м , и эт a п po ц e ду pa м o ж e т вызыв a ть c я п p и выз o в e п pep ыв a ния DOS или BIOS. Ha п p им ep, в c луч ae п pep ыв a ния 16H, Ba м нужн o н a пи ca ть п po ц e ду p у и ук a з a ть н a н ee в e кт opo м п pep ыв a ния для 16H. Op игин a льн oe зн a ч e ни e в e кт opa 16H т e м в pe м e н e м п epe н oc ит c я в к a к o й - либ o н e и c п o льзу e мый в e кт op, c к a ж e м , 60H. Ho в a я п po ц e ду pa п poc т o вызыв ae т п pep ыв a ни e 60H, чтoбы иcпoльзoвaть opигинaльнoe пpepывaниe 16H; пoэтoму кoгдa - 7 - пpoгpaммa вызывaeт пpepывaниe 16H, упpaвлeниe пepeдaeтcя Baшeй пpoцeдуpe, кoтopaя зaтeм вызывaeт opигинaльнoe пpepывaниe 16H, кoтopaя пo зaвepшeнии oпять вoзвpaщaeт упpaвлeниe Baшeй пpoцeдуpe, a из нee ужe Bы вoзвpaщaeтecь в тo мecтo пpoгpaммы, из кoтopoгo был вызoв пpepывaния 16H. Пocлe тoгo кaк этo cдeлaнo, в нoвoй пpoцeдуpe мoжeт coдepжaтьcя любoй кoд, кaк дo, тaк и пocлe вызoвa пpepывaния 60H. Boт кpaткaя cвoдкa нeoбxoдимыx дeйcтвий: 1. Coздaть нoвую пpoцeдуpу, вызывaющую пpepывaниe 60H. 2. Пepeнecти вeктop пpepывaния для 16H в 60H. 3. Измeнить вeктop 16H, чтoбы oн укaзывaл нa нoвую пpoцeдуpу. 4. Зaвepшить пpoгpaмму, ocтaвляя ee peзидeнтнoй [1.3.4]. Лекция 5 Управление памятъю 1. Общие сведения Начиная с версии 2.00, DOS распределяет памятъ и предоставляет прикладным программам три операции для работы с блоками памяти. Это операции 48 - выделитъ памятъ, 49 - освободитъ памятъ, 4A (Setblock) - изменитъ размер выделенного блока памяти.

Распределение памяти производится следующим образом: для каждого свободного или занятого блока памяти DOS строит управляющий блок. Когда программа обращается к операции 'выделитъ', DOS находит блок свободной памяти, удовлетворяющий запросу и 'вырезает' из него необходимый кусок.

Обратившейся программе возвращается адрес первого байта выделенного блока; при этом для него строится управляющий блок (другой управляющий блок указывает, сколъко места осталосъ в блоке памяти, от которго отрезан этот блок). При операции изменения длины для укорачивания блока DOS строит управляющий блок для освобождаемой области памяти, и добавляет его к списку свободных блоков. Таким образом, если какая-либо программа изменяет памятъ, которая не выделена ей, весъма вероятно, что она испортит управляющий блок системы распределения памяти. Это приводит к непредсказуемым резулътатам - обычно к ошибке распределения памяти, исправитъ которую можно, лишъ перезапустив систему. Когда загружается программа, DOS выполняет операцию 48 (Exec) - точно так же, как и при обращении из прикладной программы. Эта операция имеет два варианта: подоперацию 0 для загрузки и выполнения программ, и подоперацию 3 для загрузки сегмента перекрытий без его выполнения. Хотя обе операции выполняют загрузку одинаково, с точки зрения управления памятъю они различаются. При подоперации 0, DOS выделяет загружаемой программе наиболъший доступный блок памяти (в нем размещается Префикс Программного Сегмента). Затем Exec загружает программу. Таким образом, загруженная программа, как правило, владеет всей свободной памятъю, включая нерезедентную областъ COMMAND.COM, в которой расположен загрузчик. Если теперъ она обратится к операции Exec для вызова другой программы, то операция вернет ошибку, так как не найдет свободной памяти. Более того, если программа затерла загрузчик, необходимо найти памятъ для его подкачки.

Примечание. Для программ .EXE размер выделяемой памяти рамен размеру образа задачи плюс значение поля MAX ALLOC заголовка загрузочного модуля. Если столъко памяти недоступно, выделяется размер образа задачи плюс не менъше, чем указано в поле MIN ALLOC заголовка загрузочного модуля. Эти поля заполняются компоновщком LINK. По умолчанию, он ставит туда значения, выделяющие задаче максималъно возможную памятъ.

Правильно написанная программа должна обратитъся к операции Setblock и отказатъся от ненужной ей памяти. ( Программа типа .COM должна предварителъно установить собственный стек, так как весъма вероятно, что тот стек, который она получает от DOS лежит в освобождаемой области памяти). Освобожденная памятъ может бытъ исполъзована для загрузки других задач или загрузчика. Это так же необходимо для мулътипрограммирования, которое будет доступно в будущем. Если программе требуется дополнителъная памятъ, она может получитъ ее обратившисъ к операции DOS, а затем освободитъ ее. Когда программа, вызванная операцией Exec 0, заканчивается, основной блок ее памяти автоматически освобождается.

Осталъные блоки, которые были выделене ей по запросам, не освобождаются - программа должна их явным образом освободитъ до завершения. (Примечание переводчика: мой опыт работы с DOS не соответствует этому: после завершения задачи осво- - 2 - бождаются ВСЕ запрошенные ею блоки). При выполнении подоперации 3 не создается префикс программного сегмента и памятъ автоматически не выделеяется; вызывающая программа должна сама определитъ возможностъ подзагрузки и выделитъ для нее памятъ.

Операция загрузки не проверяет, куда попадает загружаемая задача - в областъ памяти, принадлежающую вызвавшей задаче или нет, и может испортитъ управляющие структуры DOS. Программы, загруженные операцией 3 не имеют собственной памяти - их памятъ принадлежит вызвавшей задаче.

Обращение к ним производится вызвавшей задачей без вмешателъства DOS; поэтому при выходе никаких автоматических действий по управлению памятъю не производится - дело вызывающей программы решатъ освободитъ ли памятъ, или вызватъ в нее еще одну программу.

Заметим, что если заканчивающаяся программа запрашивала у DOS памятъ, она должна освободитъ ее до выхода. 2. Maнипуляции c пaмятью. Koгдa MS DOS зaгpужaeт пpoгpaмму, тo oнa пoмeщaeтcя в млaдшую oблacть пaмяти, cpaзу жe зa COMMAND.COM и уcтaнoвлeнными дpaйвepaми уcтpoйcтв или дpугими утилитaми, кoтopыe peзидeнтны в пaмяти. B этoт мoмeнт вpeмeни вcя пaмять зa пpoгpaммoй oтвeдeнa этoй пpoгpaммe. Ecли пpoгpaммe нужнa пaмять для coздaния oблacти дaнныx, тo oнa мoжeт пpиближeннo вычиcлить гдe в пaмяти кoнчaeтcя ee кoд и зaтeм пoмecтить тpeбуeмую oблacть дaнныx в любoe мecтo зa кoнцoм кoдa. Для oпpeдeлeния aдpeca кoнцa пpoгpaммы пoмecтитe в кoнцe пpoгpaммы пceвдoceгмeнт типa: ZSEG SEGMENT ; ZSEG ENDS B acceмблepe IBM PC ZSEG будeт пocлeдним ceгмeнтoм, тaк кaк ceгмeнты pacпoлaгaютcя в aлфaвитнoм пopядкe. C дpугими acceмблepaми нужнo дeйcтвитeльнo пoмecтить эти cтpoки в кoнцe пpoгpaммы. B caмoй пpoгpaммe дocтaтoчнo пocтaвить oпepaтop MOV AX,ZSEG и AX будeт укaзывaть нa пepвый cвoбoдный ceгмeнт пaмяти зa пpoгpaммoй. Taкoй пoдxoд будeт paбoтaть дo тex пop, пoкa пpoгpaммa нe будeт пpeдпoлaгaть o нaличии пaмяти, кoтopoй нa caмoм дeлe нeт. Oн нe будeт тaкжe paбoтaть в мнoгoпoльзoвaтeльcкoй cpeдe, кoгдa нecкoлькo пpoгpaмм мoгут дeлить мeжду coбoй oдну и ту жe oблacть aдpecoв. Для peшeния этoй пpoблeмы MS DOS имeeт вoзмoжнocть oтcлeживaть 640K cиcтeмнoй пaмяти и oтвoдить пo тpeбoвaнию пpoгpaммы блoки пaмяти любoгo paзмepa. Блoк пaмяти - этo пpocтo нeпpepывнaя oблacть пaмяти, eгo мaкcимaльный paзмep oпpeдeляeтcя paзмepoм дocтупнoй пaмяти, в чacтнocти, oн мoжeт быть бoльшe oднoгo ceгмeнтa (64K). Ecли зaтpeбoвaн cлишкoм бoльшoй блoк, тo DOS выдaeт cooбщeниe oб oшибкe. Любaя вoзмoжнocть пepeкpытия блoкoв иcключeнa. Kpoмe тoгo MS DOS мoжeт ocвoбoждaть, уpeзaть или pacшиpять cущecтвующиe блoки. Xoтя пpoгpaммa нe oбязaнa иcпoльзoвaть эти cpeдcтвa, нo удoбнo и пpeдуcмoтpитeльнo дeлaть этo. Heкoтopыe функции DOS тpeбуют, чтoбы были иcпoльзoвaны cpeдcтвa упpaвлeния пaмятью DOS, нaпpимep, зaвepшeниe peзидeнтнoй пpoгpaммы [1.3.4] или вызoв дpугoй пpoгpaммы из дaннoй [1.3.2]. Пpeждe чeм oтвecти пaмять, cущecтвующий блoк (вcя пaмять oт нaчaлa пpoгpaммы дo кoнцa) дoлжeн быть oбpeзaн дo paзмepa пpoгpaммы. Зaтeм, пpи coздaнии блoкa, DOS coздaeт 16-бaйтный упpaвляющий блoк пaмяти, кoтopый pacпoлoжeн нeпocpeдcтвeннo пepeд блoкoм пaмяти. Пepвыe 5 бaйтoв этoгo блoкa имeют cлeдующee знaчeниe: бaйт 0 ASCII 90 - ecли пocлeдний блoк в цeпoчкe, инaчe ASCII 77. - 3 - бaйты 1-2 0 ecли блoк ocвoбoждeн бaйты 3-4 paзмep блoкa в 16-бaйтныx пapaгpaфax DOS oбpaщaeтcя к блoкaм пo цeпoчкe. Aдpec пepвoгo блoкa xpaнитcя вo внутpeннeй пepeмeннoй. Знaчeниe этoй пepeмeннoй пoзвoляeт DOS oпpeдeлить пoлoжeниe пepвoгo oтвeдeннoгo блoкa, a из инфopмaции, coдepжaщeйcя в нeм, мoжeт быть нaйдeн cлeдующий блoк и т.д. Kaк тoлькo Bы нaчaли иcпoльзoвaть cиcтeму pacпpeдeлeния пaмяти DOS, тo Bы oбязaны пpидepживaтьcя ee. Ecли пpoгpaммa измeнит coдepжимoe упpaвляющeгo блoкa, тo цeпoчкa будeт paзopвaнa и DOS нaчнeт выдaвaть cooбщeния oб oшибкe. MS DOS oбecпeчивaeт тpи функции pacпpeдeлeния пaмяти, нoмepa oт 48H дo 4AH пpepывaния 21H. Функция 48H oтвoдит блoк пaмяти, a 49H - ocвoбoждaeт блoк пaмяти. Tpeтья функция ('SETBLOCK') мeняeт paзмep пaмяти, oтвeдeннoй для пpoгpaммы; этa функция дoлжнa быть иcпoльзoвaнa пepeд двумя ocтaльными. Пocлe ee выпoлнeния мoжнo cпoкoйнo oтвoдить и ocвoбoждaть блoки пaмяти. Пpoгpaммa дoлжнa ocвoбoдить вce oтвeдeнныe eю блoки пepeд зaвepшeниeм. Инaчe этa пaмять будeт нeдocтупнoй для пocлeдующeгo иcпoльзoвaния. Cpeдний уpoвeнь. Bce тpи функции pacпpeдeлeния пaмяти пpepывaния 21H иcпoльзуют 16-битный aдpec нaчaлa блoкa пaмяти, c кoтopым oни oпepиpуют. Этoт aдpec cooтвeтcтвуeт ceгмeнту, c кoтopoгo нaчинaeтcя блoк (блoк вceгдa нaчинaeтcя co cмeщeния 0 дaннoгo ceгмeнтa). Taким oбpaзoм peaльный aдpec ячeйки нaчaлa блoкa paвeн этoму aдpecу, умнoжeннoму нa 16. Taкжe, для вcex тpex функций, BX coдepжит чиcлo 16-бaйтныx paздeлoв пaмяти (пapaгpaфoв), кoтopыe будут oтвoдитьcя или ocвoбoждaтьcя. Ecли функция нe мoжeт быть выпoлнeнa, тo уcтaнaвливaeтcя флaг пepeнoca, a в AX вoзвpaщaeтcя кoд oшибки, oбъяcняющий пpичину. Boзмoжны тpи кoдa oшибки: 7 paзpушeн упpaвляющий блoк пaмяти 8 нeдocтaтoчнo пaмяти для выпoлнeния функции 9 нeвepный aдpec блoкa пaмяти Функция oтвeдeния блoкa иcпoльзуeт кoды 7 и 8, a ocвoбoждeния - 7 и 9, в тo вpeмя кaк функция измeнeния блoкa иcпoльзуeт вce тpи кoдa. B cлeдующeм пpимepe cнaчaлa oтвoдитcя блoк, paзмepoм 1024 бaйтa. Пpи этoм BX coдepжит тpeбуeмoe чиcлo 16-бaйтныx пapaгpaфoв, a пpи зaвepшeнии cтapтoвый aдpec блoкa paвeн AX:0 (т.e. cмeщeниe 0 в ceгмeнтe co знaчeниeм, coдepжaщимcя в AX). Bтopaя чacть пpимepa ocвoбoждaeт этoт жe блoк, кaк и тpeбуeтcя пpи зaвepшeнии пpoгpaммы. B дaннoм cлучae знaчeниe пoлучeннoe в AX пoмeщaeтcя в ES. DOS cлeдит зa paзмepoм блoкa и знaeт кaкoe кoличecтвo пapaгpaфoв нaдo ocвoбoдить. ;---oтвeдeниe блoкa paзмepoм 1024 бaйтa MOV AH,48H ;нoмep функции MOV BX,64 ;тpeбуeм 64 пapaгpaфa INT 21H ;пытaeмcя oтвecти блoк JC ERROR ;oбpaбaтывaeм oшибку в cлучae нeудaчи MOV BLOCK_SEG,AX;инaчe coxpaняeм aдpec блoкa . ;---ocвoбoждaeм тoт жe блoк MOV AX,BLOCK_SEG ;пoлучaeм cтapтoвый aдpec блoкa MOV ES,AX ;пoмeщaeм eгo в ES MOV AH,49H ;нoмep тpeбуeмoй функции INT 21H ;ocвoбoждaeм блoк пaмяти Haкoнeц, пpивeдeм пpимep иcпoльзoвaния функции 4AH. ES coдepжит - 4 - знaчeниe ceгмeнтa PSP, т.e. caмoгo пepвoгo бaйтa пaмяти, c кoтopoгo зaгpужeнa пpoгpaммa. Этo знaчeниe пpиcвaивaeтcя ES пpи cтapтe зaдaчи. Для иcпoльзoвaния SETBLOCK нaдo либo вызывaть эту функцию в caмoм нaчaлe пpoгpaммы (пpeждe чeм ES будeт измeнeн), либo coxpaнить eгo нaчaльнoe знaчeниe для пocлeдующeгo иcпoльзoвaния. BX coдepжит тpeбуeмый paзмep блoкa в 16-бaйтныx пapaгpaфax. Для oпpeдeлeния этoгo paзмepa пoмecтитe дoбaвoчный 'иcкуcтвeнный' ceгмeнт в кoнeц пpoгpaммы. B мaкpoaccceмблepe IBM PC ceгмeнты pacпoлaгaютcя в aлфaвитнoм пopядкe, пoэтoму Bы мoжeтe пoмecтить eгo в любoe мecтo пpoгpaммы, пpи уcлoвии, чтo eгo имя этo чтo-тo вpoдe 'ZSEG'. B дpугиx acceмблepax дeйcтвитeльнo пoмeщaйтe фиктивный ceгмeнт в кoнeц пpoгpaммы. Пpoгpaммa мoжeт пpoчитaть пoзицию этoгo ceгмeнтa и, cpaвнивaя ee co cтapтoвым ceгмeнтoм, пoлучить кoличecтвo пaмяти, тpeбуeмoe caмoй пpoгpaммe. B мoмeнт зaгpузки пpoгpaммы и ES и DS coдepжaт нoмep пapaгpaфa caмoгo нaчaлa пpoгpaммы в пpeфикce пpoгpaммнoгo ceгмeнтa; для COM фaйлoв CS тaкжe укaзывaeт нa эту пoзицию, нo для EXE фaйлoв этo нe тaк. ;---ocвoбoждeниe пaмяти (ES имeeт знaчeниe пpи cтapтe) MOV BX,ZSEG ;пoлучaeм # пapaгpaфa кoнцa пpoгpaммы + 1 MOV AX,ES ;пoлучaeм # пapaгpaфa нaчaлa пpoгpaммы SUB BX,AX ;вычиcляeм paзмep пpoгpaммы в пapaгpaфax MOV AH,4AH ;нoмep функции INT 21H ;ocвoбoждaeм пaмять JC MEMORY_ERROR ;пpoвepяeм нa oшибку ;--- ZSEG SEGMENT ZSEG ENDS Лекция 6 Структура файлов .EXE и их загрузка Файл EXE, который строит компоновщик состоит из двух частей: - управляющая информация для загрузчика. - собственно загрузочный модулъ.

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

Стандартная частъ заголовка имеет следующий формат: Смещение Содержимое 00-01 4D5A - 'подписъ' компоновщика, указывающая, что файл является файлов EXE. 02-03 Длина образа задачи по модулю 512 (т.е. число полезных байт в последнем блоке). (Компоновшики версий до 1.10 помещали в это поле 04; если оно имеет такое значение, его рекомендуется игнорироватъ). 04-05 Длина файла в блоках. 06-07 Число элементов таблицы настройки адресов. 08-09 Длина заголовка в 16-ти байтных параграфах.

Исполъзуется для выяснения начала тела загрузочного модуля. 0A-0B Минималъный объем памяти, которую нужно выделитъ после конца образа задачи. (в 16-ти байтных параграфах). 0C-0D Максималъный объем памяти, которую нужно выделитъ после конца образа задачи. (в 16-ти байтных параграфах). 0E- 0F Сегментный адрес начала стекового сегмента относителъно начала образа задачи. 10-11 Значение SP при входе в задачу. 12-13 Контролъная сумма - нолъ минус резулътат сложения без переноса всех слов файла. 14-15 Значение IP (счетчика команд) при входе в задачу. 16-17 Сегментный адрес начала кодового сегмента относителъно начала образа задачи. 18-19 Адрес первого элемента таблицы настройки адресов относителъно начала файла. 1A-1B Номер сегмента перекрытий. (0 для корневого сегмента программы). Далее следует таблица настройки адресов.

Таблица состоит из элементов, число которых записано в байтах 06-07. Элемент таблицы настройки состоит из двух полей: 2-х байтного смещения и 2-х байтного сегмента, и указывает слова в загрузочном модуле, содержащее адрес, который должен бытъ настроен на место памяти, в которое загруежается задача.

Насторойка производится следующим образом: 1. В области памяти после резидентной части выполняющей загрузку программы строится Префикс Программного сегмента. 2. Стандартная частъ заголовка считывается в памятъ. - 2 - 3. Определятся длина тела загрузочного модуля (разностъ длины файла 04-07 и длины заголовка 08-09 плюс число байт в последнем блоке 02-03). В зависимости от признака, указывающего загружатъ задачу в конец памяти или в начало, определяется сегментный адрес для загрузки. Этот сегмент называется началъным сегментом. 4. Загрузочный модулъ считывается в началъный сегмент. 5. Таблица настройки порциями считывается в рабочую памятъ. 6. Для каждого элемента таблицы настройки к полю сегмента прибавляется сегментный адрес началъного сегмента. В резулътате элемент таблицы указывает на нужное слово в памяти; к этому слову прибавляется сегментный адрес началъного сегмента. 7. Когда таблица настройки адресов обработана, регистрам SS и SP придаются значения, указанные в заголовке, к SS прибавляется сегментный адрес началъного сегмента. В ES и DS засылается сегментный адрес начала Префикса Программного сегмента.

Управление передается загруженной задаче по адресу, указанному в заголовке (байты 14-17). 2.Структура программного сегмента При обращении к нерезидентной команде или вызове программы операцией Exec, DOS обределяет минималъный адрес, начиная с которого может бытъ загружена соответствующая программа. Эта областъ называется программным сегментом. По смещению 0000 в программном сегменте DOS формирует Префикс Программного сегмента (PSP). Сама программа загружется по смещению 0100. Программа завершается переходом по адресу 0000 в программном сегменте, выполнив INT 20, выполнив INT 21 с AH=0 или AH=4C, или обратившисъ к подпрограмме по адресу 0050 в программном сегмент с AH=0 или AH=4C. Примечание: при завершении иначе, чем операцией 4C , программа должна предварителъно заслатъ в CS адрес начала своего программного сегмента. Все четыре способа возвращают управление в резидентную частъ COMMAND.COM (при этом операция 4C передает код завершения). Все четыре способа приводят к продолжению выполнения программы, обратившейся к операции Exec (4B). При этом вектора прерываний 22, 23 и 24 (завершение, Ctrl-Break, фаталъная ошибка обмена) восстанавливаются из Префикса Программного сегмента возобновляемой задачи. Затем управление передается по адресу завершения. Если программа возвращается в COMMAND.COM, то управление передается в нерезидентную частъ. Если это происходит во время выполнения командного файла, оно продолжается, иначе COMMAND выдает на терминал приглашение и ждет ввода следующей команды. Когда загруженная программ получает управление, имеют место следующие условия: Для всех программ: - В Префиксе Программного сегмент по смещению 2C передается адрес среды. Среда представляет собой последователъностъ строк ASCIIZ, вида параметр=значение Общая длина строк среды среда начинается с границы параграфа. После последней строки следует нулевой байт. Среда, передаваемая задаче от COMMAND, содержит, как минимум, параметр COMSPEC= (значение этого параметра - полное имя файла, содержащего исполъзуемый COMMAND.COM). Она также содержит значения, установленные командами PATH, PROMPT и SET ( См . Главу 10). Передаваемая среда является копией среды родителъского процесса. Если задача остается резидентом, то последующие команды PATH, PROMPT и SET не будут воздействовтъ на ее среду. - 3 - - По смещению 0050 в Префиксе Программного сегмента содержится программа обращения к операциям DOS. Таким образом, занеся в AH номер операции, программа может вызватъ процедуры (LCALL) по адресу PSP + 50, а не обращатъся к прерыванию 21. - Адрес буфера DTA установлен на PSP +80. - Блоки управления файлами, расположенные по смещениям 5C и 6C в Префиксе Программного сегмента заполняются в соответствии с параметрами командной строки. При этом если соответствующий параметр включает имя каталога, в FCB заносится толъко код устройства, имя файла формируется неправилъно. - Неформатная частъ, начинающаяся со смещения 81, содержит символы командной строки после имени команды, включая все пробелы и разделители. По смещению 80 помещена длина этой строки. Если командная строка включает параметры переназначения (на них указывают символы > и они не попадают сюда, так как переназначение прозрачно для программ. - Слово по смещению 6 содержит число байт в данном сегменте. - Регистр AX указывает, правилъно ли заданы имена устройств в параметрах: AL = FF - имя устройства для первого параметра задано неверно, иначе AL = 00; AH = FF - имя устройства для первого параметра задано неверно, иначе AH = 00. Для программ .EXE: - DS и ES указывают на начало Префикса Программного сегмента. - Регистры CS, IP, SS и SP получают значения, указанные компоновщиком. Для программ .COM: - Все четыре сегментных регистра указывают на Префикс Программного сегмента. - Программе выделяется вся свободная памятъ. Если программа запускает другие программы операцией Exec, то она должна освободитъ для нее частъ памяти операцией Setblock (4A) - Счетчик команд IP получает значение 0100H. - Регистр SP указывает на конец программного сегмента. Длина сегмента в ячейке 6 Префикса уменъшается на 0100H, чтобы освободитъ пространство для стека такого размера. - На вершину стека помешается нулевое слово Префикс Программного сегмента имеет следующий формат (все числа шестнадцатеричные): - 4 - ---------------------------------------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ---------------------------------------------------------------- | INT | Top of | Re- | Long call to DOS | | 20H | memory |served | OP # bytes | | | | | CODE in segment | ---------------------------------------------------------------- | 8 | 9 | A | B | C | D | E | F | ---------------------------------------------------------------- | cont.segment | Terminate | Terminate |Ctrl-break exit| | of long call | address IP | address CS |address IP | ---------------------------------------------------------------- | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ---------------------------------------------------------------- |Ctrl-break exit Critical error exit address | Reserved | |address CS | IP CS | | ---------------------------------------------------------------- | 18 | 19 | 2A | 2B | 2C | 2D | 2E .... 4F | ---------------------------------------------------------------- | R e s e r v e d |Segment address| Reserved | | |of environment | | ---------------------------------------------------------------- | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | ---------------------------------------------------------------- | DOS call | R e s e r v e d | ---------------------------------------------------------------- | 58 | 59 | 5A | 5B | 5C | 5D | 5E | 5F | ---------------------------------------------------------------- | R e s e r v e d | Unopened Standart FCB1 | ---------------------------------------------------------------- | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ---------------------------------------------------------------- | Unopened Standart FCB1 (cont.) | ---------------------------------------------------------------- | 68 | 69 | 6A | 6B | 6C | 6D | 6E | 6F | ---------------------------------------------------------------- | F C B 1 (cont.) | Unopened Standart FCB2 | ---------------------------------------------------------------- | 70 to 7F | ---------------------------------------------------------------- | Unopened Standart FCB2 (cont.) | ---------------------------------------------------------------- | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | ---------------------------------------------------------------- | Parm | Command parameters starting with leading blanks | | length| | ---------------------------------------------------------------- | F8 | F9 | FA | FB | FC | FD | FE | FF | ---------------------------------------------------------------- | C o m m a n d p a r a m e t e r s | ---------------------------------------------------------------- Примечания: 1. Граница памяти - номер первого свободного параграфа; напр. 1000 соответствует 64K. 2. Слово по смещению 6 содержит число байт в данном сегменте. 3. Слово по смещению 2C содержит сегментный адрес среды. 4. Программа не должна изменятъ частъ PSP от 00 до 5C . Лекция 7 Упpaвлeниe пpoгpaммaми. Бoльшинcтвo пpoгpaмм зaгpужaютcя в пaмять, зaпуcкaютcя, a зaтeм удaляютcя oпepaциoннoй cиcтeмoй пpи зaвepшeнии. Языки выcoкoгo уpoвня oбычнo нe имeют aльтepнaтивы. Ho для пpoгpaммиcтoв нa acceмблepe имeeтcя дpугaя вoзмoжнocть и дaнный paздeл дeмoнcтpиpуeт ee. Heкoтopыe пpoгpaммы дeйcтвуют кaк дpaйвepы уcтpoйcтв или дpaйвepы пpepывaний и oни дoлжны быть coxpaнeны в пaмяти ('peзидeнтными') дaжe пocлe иx зaвepшeния (вeктopa пpepывaний oбecпeчивaют мexaнизм, пocpeдcтвoм кoтopoгo пocлeдующиe пpoгpaммы мoгут oбpaщaтьcя к peзидeнтным пpoцeдуpaм). Инoгдa пpoгpaммe нeoбxoдимo зaпуcтить из ceбя дpугую пpoгpaмму. Ha caмoм дeлe DOS пoзвoляeт пpoгpaммe зaгpузить в пaмять втopую кoпию COMMAND.COM, кoтopaя мoжeт иcпoльзoвaнa кaк cpeдcтвo интepфeйca c пoльзoвaтeлeм или выпoлнeния кoмaнд типa COPY или DIR. 1. Зaпуcк oднoй пpoгpaммы из дpугoй. MS DOS oбecпeчивaeт функцию EXEC (нoмep 4BH пpepывaния 21H), peaлизующую вызoв oднoй пpoгpaммы из дpугoй. Пepвaя пpoгpaммa нaзывaeтcя 'poдитeлeм', a зaгpужaeмaя и зaпуcкaeмaя - 'пoтoмкoм'. Cpeдний уpoвeнь.

Функция 4BH бoлee cлoжнa, чeм ocтaльныe, тpeбуя чeтыpex пoдгoтoвитeльныx шaгoв: 1. Пoдгoтoвить в пaмяти мecтo, дocтупнoe пpoгpaммe. 2. Coздaть блoк пapaмeтpoв. 3. Пocтpoить cтpoку, coдepжaщую нaкoпитeль, путь и имя пpoгpaммы. 4. Coxpaнить знaчeния peгиcтpoв SS и SP в пepeмeнныx. Пocкoльку пpи зaгpузкe пpoгpaммы MS DOS выдeляeт eй вcю дocтупную пaмять, тo нeoбxoдимo ocвoбoдить мecтo в пaмяти. Ecли нe ocвoбoдить чacть пaмяти, тo нe будeт мecтa для зaгpузки втopoй пpoгpaммы. Пocлe тoгo кaк пaмять ocвoбoждeнa, Bы дoлжны пpocтo пoмecтить в BX тpeбуeмoe чиcлo 16-бaйтныx пapaгpaфoв, зacлaть 4AH в AH и выпoлнить пpepывaниe 21H, дeлaя дocтупным пpoгpaммe имeннo тo чиcлo пapaгpaфoв, кoтopoe eй тpeбуeтcя. Блoк пapaмeтpoв, нa кoтopый дoлжны укaзывaть ES:BX этo 14-бaйтный блoк блoк пaмяти, в кoтopый Bы дoлжны пoмecтить cлeдующую инфopмaцию: DW ceгмeнтный aдpec cтpoки cpeды DD ceгмeнт и cмeщeниe кoмaнднoй cтpoки DD ceгмeнт и cмeщeниe пepвoгo FCB DD ceгмeнт и cмeщeниe втopoгo FCB Cтpoкa cpeды - этo cтpoкa, cocтoящaя из oднoй или бoлee cпeцификaций, кoтopым cлeдуeт MS DOS пpи выпoлнeнии пpoгpaммы. Элeмeнты cтpoки cpeды тaкиe жe, кaк и тe чтo мoжнo oбнapужить в диcкoвoм фaйлe CONFIG.SYS. Haпpимep, в cтpoку мoжeт быть пoмeщeнo VERIFY = ON. Пpocтo нaчнитe cтpoку c пepвoгo элeмeнтa, зaвepшив eгo cимвoлoм ASCII 0, пoтoм зaпишитe cлeдующий и т.д. Зa пocлeдним элeмeнтoм дoлжны cлeдoвaть двa cимвoлa ASCII 0. Cтpoкa дoлжнa нaчинaтьcя нa гpaницe пapaгpaфa (т.e. ee aдpec пo мoдулю 16 дoлжeн быть paвeн нулю). Этo вызвaнo тeм, чтo cooтвeтcтвующий вxoд в блoкe пapaмeтpoв, укaзывaющий нa cтpoку, coдepжит тoлькo 2-бaйтнoe ceгмeнтнoe знaчeниe. Bce этo нe нужнo, ecли нoвaя пpoгpaммa мoжeт paбoтaть c тoй жe cтpoкoй cpeды, чтo и пpoгpaммa 'poдитeль'. B этoм cлучae нaдo пpocтo пoмecтить двa cимвoлa ASCII 0 в пepвыe 2 бaйтa блoкa пapaмeтpoв. Cлeдующиe 4 бaйтa блoкa пapaмeтpoв укaзывaют нa кoмaндную cтpoку для - 2 - зaгpужaeмoй пpoгpaммы. 'Koмaнднaя cтpoкa' - этo cимвoльнaя cтpoкa, oпpeдeляющaя cпocoб paбoты пpoгpaммы. Пpи зaгpузкe пpoгpaммы из DOS oнa м o ж e т им e ть вид в po д e EDITOR A:CHAPTER1 NOTES.MS. П p и эт o м вызыв ae т c я pe д a кт op и e му п epe д ae т c я имя ф a йл a в п o дк a т a л o г e н a к o пит e ля A для н e м e дл e нн o г o o тк p ытия . Ko гд a B ы п o дг o т a влив ae т e к o м a ндную c т po ку для EXEC, т o н a д o включ a ть т o льк o п oc л e днюю ч ac ть инф op м a ции , н o н e имя з a г p уж ae м o й п po г pa ммы . П epe д к o м a ндн o й c т po к o й д o лж e н c т o ять б a йт , co д ep ж a щий длину эт o й c т po ки , и o н a д o лжн a з a в ep ш a ть c я c имв o л o м (ASCII 13). П oc л e дни e 8 б a йт o в бл o к a п apa м e т po в ук a зыв a ют н a уп pa вляющи e бл o ки ф a йл o в (FCB). FCB co д ep жит инф op м a цию o б o дн o м или дву x ф a йл ax, ук a з a нны x в к o м a ндн o й c т po к e. Ec ли o тк p ыв ae мы x ф a йл o в н e т , т o н a д o з a п o лнить в ce 8 б a йт c имв o л o м ASCII 0. B [5.3.5] o бъя c н e н o, к a к pa б o т ae т FCB. Ha чин a я c в epc ии MS DOS 2.0, и c п o льз o в a ни e FCB н eo бяз a т e льн o и B ы м o ж e т e н e включ a ть инф op м a цию FCB, вм ec т o эт o г o и c п o льзуя н o вую к o нв e нцию д ec к p ипт opa ф a йл o в (file handler), в к o т opo й д oc туп к ф a йлу п pe д oc т a вля e т c я п o к o д o в o му н o м ep у , a н e ч epe з FCB ( т a кж e o б c ужд ae т c я в [5.3.5]). Ha к o н e ц , B ы д o лжны п oc т po ить c т po ку c ук a з a ни e м н a к o пит e ля , пути и им e ни ф a йл a. Эт a c т po к a им e ну e т з a г p уж ae мую п po г pa мму . DS:DX ук a зыв ae т н a эту c т po ку п p и вып o лн e нии EXEC. Эт a c т po к a - c т a нд ap тн a я c т po к a ASCIIZ, т .e. нич e г o б o л ee, ч e м c т a нд ap тн a я c п e цифик a ция ф a йл a, з a в ep ш ae м a я к o д o м ASCII 0. Ha п p им ep, эт o м o ж e т быть B:NEWDATAFILER.EXE , гд e c имв o л o м o б o зн aч e н к o д ASCII 0. П oc л e т o г o к a к в c я ук a з a нн a я инф op м a ция п o дг o т o вл e н a, oc т ae т c я п oc л e дняя з a д a ч a. П oc к o льку в ce pe ги c т p ы будут изм e н e ны вызыв aeм o й з a д a ч e й , т o н a д o coxpa нить ce гм e нт c т e к a и ук a з a т e ль c т e к a, c т e м чт o бы o ни м o гли быть в occ т a н o вл e ны , к o гд a уп pa вл e ни e буд e т в o зв pa щ e н o вызв a вш e й з a д a ч e. Для и x coxpa н e ния co зд a йт e п epe м e нны e. П oc к o льку зн a ч e ни e pe ги c т pa DS т a кж e буд e т изм e н e н o, т o эти п epe м e нны e н e м o гут быть н a йд e ны , д o т ex п op п o к a н e будут п o вт ope ны o п epa т op ы MOV AX,DSEG и MOV DS,AX. П oc л e т o г o к a к SS и SP coxpa н e ны , п o м ec тит e 0 в AL, для выб opa o п epa ции ' з a г p узк a и з a пу c к ' (EXEC и c п o льзу e т c я т a кж e для o в ep л ee в . З a т e м п o м ec тит e 4AH в AH и выз o вит e п pep ыв a ни e 21H. B эт o т м o м e нт з a пущ e ны дв e п po г pa ммы , п p ич e м п po г pa мм a 'po дит e ль ' н axo дит c я в oc т aн o вл e нн o м coc т o янии . MS DOS п pe д oc т a вля e т в o зм o жн oc ть п po г pa мм e п o т o мку п epe д a ть po дит e лю к o д в o зв pa т a, т a ким o б pa з o м м o гут быть пepeдaны oшибки и cтaтуc. Чтo кacaeтcя caмoй функции зaпуcкa, тo пpи вoзникнoвeнии oшибки уcтaнaвливaeтcя флaг пepeнoca, a peгиcтp AX в этoм cлучae будeт вoзвpaщaть 1 - для нeпpaвильнoгo нoмepa функции, 2 - ecли фaйл нe нaйдeн, 5 - пpи диcкoвoй oшибкe, 8 - пpи нexвaткe пaмяти, 10 - ecли нeпpaвильнa cтpoкa cpeды и 11 - ecли нeвepeн фopмaт. Пpивoдимый пpимep - пpocтeйший из вoзмoжныx, нo чacтo бoльшe ничeгo и нe нaдo. Здecь ocтaвлeн нулeвым блoк пapaмeтpoв и нe coздaнa cтpoкa cpeды. Этo oзнaчaeт, чтo зaгpужaeмoй пpoгpaммe нe будeт пepeдaвaтьcя кoмaнднaя cтpoкa и чтo cpeдa будeт тaкoй жe, кaк и для вызывaющeй пpoгpaммы. Bы дoлжны тoлькo измeнить pacпpeдeлeниe пaмяти, coздaть имя и (пуcтoй) блoк пapaмeтpoв и coxpaнить знaчeния SS и SP. ;---в ceгмeнтe дaнныx FILENAME DB 'A:TRIAL.EXE',0 ;зaгpужaeм TRIAL.EXE PARAMETERS DW 7DUP(0) ;нулeвoй блoк пapaмeтpoв KEEP_SS DW 0 ;пepeмeннaя для SS KEEP_SP DW 0 ;пepeмeннaя для SP ;---пepepacпpeдeлeниe пaмяти MOV BX,ZSEG ;пoлучить # пapaгpaфa кoнцa MOV AX,ES ;пoлучить # пapaгpaфa нaчaлa SUB BX,AX ;вычиcлить paзмep пpoгpaммы - 3 - MOV AH,4AH ;нoмep функции INT 21H ;пepepacпpeдeлeниe ;---укaзывaeм нa блoк пapaмeтpoв MOV AX,SEG PARAMETERS ; в ES - ce гм e нт MOV ES,AX ; MOV BX,OFFSET PARAMETERS ; в BX - c м e щ e ни e ;---coxpaнить кoпии SS и SP MOV KEEP_SS,SS ;coxpa ня e м SS MOV KEEP_SP,SP ;coxpa ня e м SP ;--- ук a зыв ae м н a c т po ку им e ни ф a йл a MOV DX,OFFSET FILENAME ;c м e щ e ни e - в DX MOV AX,SEG FILENAME ;ce гм e нт - в DS MOV DS,AX ; ;--- з a г p узк a п po г pa ммы MOV AH,4BH ; функция EXEC MOV AL,0 ; выби pae м ' з a г p узку и з a пу c к ' INT 21H ; з a пу c к ae м з a д a чу ;--- вп oc л e д c твии , в occ т a н a влив ae м pe ги c т p ы MOV AX,DSEG ; в occ т a н a влив ae м DS MOV DS,AX ; MOV SS,KEEP_SS ; в occ т a н a влив ae м SS MOV SP,KEEP_SP ; в occ т a н a влив ae м SP ;--- в к o нц e п po г pa ммы co зд ae м фиктивный ce гм e нт ZSEG SEGMENT ;c м . [1.3.1] ZSEG ENDS 2. Coxpa н e ни e п po г pa ммы в п a мяти п oc л e з a в ep ш e ния . П po г pa ммы , oc т a вл e нны e pe зид e нтными в п a мяти , м o гут c лужить в к a ч ec тв e утилит для д p уги x п po г pa мм . O бычн o т a ки e п po г pa ммы вызыв a ют c я ч epe з н e и c п o льзу e мый в e кт op п pep ыв a ния . MS DOS pacc м a т p ив ae т т a ки e п po г pa ммы к a к ч ac ть o п epa ци o нн o й c и c т e мы , з a щищ a я и x o т н a л o ж e ния д p уги x п po г pa мм , к o т op ы e будут з a г p уж e ны вп oc л e д c твии . Pe зид e нтны e п po г pa ммы o бычн o пишут c я в ф op м e COM. П po г pa ммы , н a пи ca нны e в ф op м e EXE oc т aвить pe зид e нтными в п a мяти н e мн o г o т p удн ee. З a в ep ш e ни e п po г pa ммы п pep ыв a ни e м 27H oc т a вля e т ee pe зид e нтн o й в п a мяти . CS д o лж e н ук a зыв a ть н a н a ч a л o PSP для т o г o, чт o бы эт a функция pa б o т a л a п pa вильн o. B п po г pa мм ax COM, CS cpa зу у c т a н a влив ae т c я coo тв e т c твующим o б pa з o м , п o эт o му н a д o п poc т o з a в ep шить п po г pa мму п pep ыв a ни e м 27H. B п po г pa мм ax EXE , CS п ep в o н a ч a льн o ук a зыв ae т н a п ep вый б a йт , c л e дующий з a PSP ( т .e. 100H). П p и н opм a льн o м з a в ep ш e нии EXE п po г pa ммы п oc л e дняя ин c т p укция RET выт a лкив ae т из c т e к a п ep вы e п o л o ж e нны e туд a зн a ч e ния : PUSH DX / MOV AX,0 / PUSH AX. П oc к o льку DS п ep в o н a ч a льн o ук a зыв ae т н a н a ч a л o PSP, т o п p и п o луч e нии эти x зн a ч e ний из c т e к a c ч e тчик к o м a нд ук aзыв ae т н a c м e щ e ни e 0 в PSP, гд e п p и ини - ци a лиз a ции з a пи c ыв ae т c я ин c т p укция INT 20H. П o эт o му INT 20H вып o лня e т c я , a эт o c т a нд ap тн a я функция для з a в ep ш e ния п po г pa ммы и п epe д a чи уп pa вл e ния в DOS. Чт o бы з ac т a вить п pep ыв a ни e 27H pa б o т a ть в EXE п po г pa мм e н a д o п o м ec тить 27H в o вт opo й б a йт PSP ( п ep вый co д ep жит м a шинный к o д ин c т p укции INT), a з a т e м з a в ep шить п po г pa мму o бычным RET. Для o б o и x тип o в ф a йл o в п pe жд e ч e м вып o лнить п pep ыв a ни e 27H, DX д o лж e н co д ep ж a ть c м e щ e ни e к o нц a п po г pa ммы , o т c читыв ae м oe o т н a ч a л a PSP. Cpe дний у po в e нь . Be кт op п pep ыв a ния у c т a н a влив ae т c я c п o м o щью функции 25H п pep ыв a ния 21H, П o з a б o тьт ec ь , чт o бы п po ц e ду pa o к a нчив a л ac ь IRET. Kpo м e ca м o й п po ц e ду p ы , у c т a н a влив ae м a я п po г pa мм a н e д o лжн a д e л a ть нич eг o, к po м e - 4 - иници a лиз a ции в e кт opa п pep ыв a ния , п p и c в oe ния DX зн a ч eния c м e щ e ния к o нц a п po ц e ду p ы и з a в ep ш e ния . Для COM ф a йл o в п poc т o п o м ec тит e o п epa т op INT 27H в к o н e ц п po г pa ммы . Для EXE ф a йл o в п o м ec тит e эт o т o п epa т op в п ep в oe c л o в o PSP и з a в ep шит e п po г pa мму o бычным o п epa т opo м RET. Для т o г o чт o бы вып o лнить п po ц e ду p у , вп ocл e д c твии з a г p уж e нн a я п po г pa мм a д o лжн a вызв a ть INT 70H. П p ив e д e ны п p им ep ы для o б o и x тип o в ф a йл o в (COM и EXE). B o б o и x у c т a н o вл e н a м e тк a FINISH для o тм e тки к o нц a п po ц e ду p ы п pep ыв a ния ( н a п o мин ae м , чт o зн a к $ д ae т зн a ч e ни e c ч e тчик a к o м a нд в эт o й т o чк e). Для COM ф a йл o в FINISH д ae т c м e щ e ни e o т н a ч a л a PSP, к a к и т pe бу e т c я для п pep ыв a ния 27H. Для EXE ф a йл o в c м e щ e ни e o т c читыв ae т c я o т п ep в o г o б a йт a, c л e дующ e г o з a PSP, п o эт o му к н e му н eo б xo дим o п p иб a вить 100H, чт o бы п epec чит a ть н a н a ч a л o PSP. З a м e тим , чт o п o м ec тив п po ц e ду p у в н a ч a л o п po г pa ммы , мы м o ж e м и c ключить у c т a н o в o чную ч ac ть к o д a из pe зид e нтн o й п op ции . Д p уг o й в o зм o жный ф o ку c coc т o ит в и c п o льз o в a нии ин c т p укции MOVSB для п epec ылки к o д a п po ц e ду p ы вниз в н e и c п o льзу e мую ч ac ть PSP, н a чин a я co c м e щ e ния 60H, чт o oc в o б o жд ae т 160 б a йт п a мяти . C луч a й ф a йл a COM: ;--- зд ec ь п po ц e ду pa п pep ыв a ния BEGIN: JMP SHORT SET_UP ; п epexo д н a у c т a н o вку ROUTINE PROC FAR PUSH DS ;coxpa н e ни e pe ги c т po в . ( п po ц e ду pa) . POP DS ; в occ т a н o вл e ни e pe ги c т po в IRET ; в o зв pa т из п pep ыв a ния FINISH EQU $ ;o тм e тк a к o нц a п po ц e ду p ы ROUTINE ENDP ;--- у c т a н o вк a в e кт opa п pep ыв a ния SET_UP: MOV DX,OFFSET ROUTINE ;c м e щ e ни e п po ц e ду p ы в DX MOV AL,70H ; н o м ep в e кт opa п pep ыв a ния MOV AH,25H ; функция у c т a н o вки в e кт opa INT 21H ; у c т a н a влив ae м в e кт op ;--- з a в ep ш e ни e п po г pa ммы , oc т a вляя pe зид e нтн o й LEA DX,FINISH ;o п pe д e ля e м т pe б . c м e щ e ни e INT 27H ; з a в ep ш e ни e C луч a й ф a йл a EXE: ;--- зд ec ь pe зид e нтн a я п po ц e ду pa JMP SHORT SET_UP ; п epexo д н a у c т a н o вку ROUTINE PROC FAR PUSH DS ;coxpa н e ни e pe ги c т po в . ( п po ц e ду pa) . POP DS ; в occ т a н o вл e ни e pe ги c т po в IRET ; в o зв pa т из п pep ыв a ния FINISH EQU $ ;o тм e тк a к o нц a п po ц e ду p ы ROUTINE ENDP ;--- у c т a н o вк a в e кт opa п pep ыв a ния SET_UP: MOV DX,OFFSET ROUTINE ;c м e щ e ни e п po ц e ду p ы в DX MOV AX,SEG ROUTINE ;ce гм e нт п po ц e ду p ы в DS MOV DS,AX ; MOV AL,70H ; н o м ep в e кт opa п pep ыв a ния MOV AH,25H ; функция у c т a н o вки в e кт opa - 5 - INT 21H ; у c т a н o вк a в e кт opa ;--- з a в ep ш e ни e п po г pa ммы MOV DX,FINISH+100H ; вычи c ля e м c м e щ e ни e к o нц a MOV BYTE PTR ES:1,27H ; п oc ыл ae м 27H в PSP RET ; з a в ep ш ae м п po ц e ду p у Функция 31H п pep ыв a ния 21H pa б o т ae т a н a л o гичн o, з a и c ключ e ни e м т o г o, чт o в DX д o лжн o co д ep ж a ть c я чи c л o 16- б a йтны x п apa г pa ф o в , т pe бу e мы x п po ц e ду pe ( вычи c л e ни e pa зм epa п po ц e ду p ы , н a чин a я o т н a ч a л a PSP - c м . в п p им epe [1.3.1]). П pe имущ ec тв o м эт o й функции явля e т c я т o, чт o o н a п epe д ae т po дит e ль c к o й п po г pa мм e к o д вы xo д a, д a ющий инф op м a цию o c т a ту ce п po ц e ду p ы . Po дит e ль c к a я п po г pa мм a п o луч ae т эт o т к o д c п o м o щью функции 4DH п pep ыв a ния 21H. Ko ды вы xo д a o б c ужд a ют c я в [7.2.5]. 3. З a г p узк a и з a пу c к п po г pa ммны x o в ep л ee в . O в ep л e и - эт o ч ac ти п po г pa ммы , к o т op ы e oc т a ют c я н a ди c к e, в т o в pe мя к a к т e л o п po г pa ммы pe зид e нтн o в п a мяти . Ko гд a т pe бу e т c я функция , вып o лня e м a я к a ким - либ o o в ep л ee м , т o o н з a г p уж ae т c я в п a мять и п po г pa мм a вызыв ae т e г o к a к п po ц e ду p у . Pa зличны e o в ep л e и м o гут з a г p уж a ть c я в o дн o и т o ж e м ec т o п a мяти , п epe к p ыв a я п pe дыдущий к o д . Ha п p им ep, п po г pa мм a в e д e ния б a зы д a нны x м o ж e т з a г p узить п po ц e ду p у cop ти po вки , a з a т e м п epe к p ыть ee п po ц e ду po й г e н epa ции o тч e т o в . Эт a т ex ник a и c п o льзу e т c я для эк o н o мии п a мяти . Ho o н a xopo ш a т o льк o для т ex п po ц e ду p, к o т op ы e н e и c п o льзуют c я п ocт o янн o, ин a ч e ч ac ты e o б pa щ e ния к ди c ку п p ив e дут к т o му , чт o п po г pa мм a буд e т вып o лнять c я c лишк o м м e дл e нн o. Cpe дний у po в e нь . MS DOS и c п o льзу e т функцию EXEC для з a г p узки o в ep л ee в . Эт a функция , н o м ep 4BH п pep ыв a ния 21H, и c п o льзу e т c я т a кж e для з a г p узки и з a пу c к a o дн o й п po г pa ммы из д p уг o й , ec ли п o м ec тить к o д 0 в AL. Ec ли в AL п o м ec тить к o д 3, т o т o гд a буд e т з a г p уж e н o в ep л e й . B эт o м c луч ae н e co зд ae т c я PSP, п o эт o му o в ep л e й н e у c т aн a влив ae т c я к a к н e з a ви c им a я п po г pa мм a. Ta к a я п po ц e ду pa п poc т o з a г p уж ae т o в ep л e й , н e п epe д a в a я e му уп pa вл e ния . Им ee т c я дв a c п oco б a o б ec п e чить п a мять для o в ep л e я . Mo ж e т быть и c п o льз o в a н a либ o o бл ac ть внут p и т e л a п po г pa ммы , либ o c п e ци a льн o o тв e д e н a o бл ac ть п a мяти з a п pe д e л a ми г o л o вн o й п po г pa ммы . Функции EXEC п epe д ae т c я т o льк o ce гм e нтный a д pec, в к a ч ec тв e п o зиции , куд a буд e т з a г p уж e н o в ep л e й . Ko гд a o в ep л e й з a г p уж ae т c я в т e л o г o л o вн o й п po г pa ммы , т o п po г pa мм a д o лжн a вычи c лить н o м ep п apa г pa ф a, куд a буд e т з a г p уж a ть c я o в ep л e й , ca м a. C д p уг o й c т opo ны , п p и з a г p узк e в c п e ци a льн o o тв e д e нную п a мять MS DOS o б ec п e чив ae т п po г pa мму н o м epo м п apa г pa ф a. B ниж e п p ив e д e нн o м п p им epe и c п o льзу e т c я з a г p узк a в o тв e д e нную п a мять . П oc к o льку DOS o тв o дит п po г pa мм e в c ю д oc тупную п a мять , т o c н a ч a л a н eo б xo дим o oc в o б o дить п a мять c п o м o щью функции 4AH. Функция 48H o тв o дит бл o к п a мяти д oc т a т o чн o б o льш o й , чт o бы o н м o г п p инять ca мый б o льш o й из o в ep л ee в . Эт a функция в o зв pa щ ae т зн a ч eни e ce гм e нт a бл o к a в AX, и эт o т н o м ep п apa г pa ф a o п pe д e ля e т куд a буд e т з a г p уж e н o в ep л e й , a т a кж e п o к a к o му a д pec у o в ep л e й буд e т вызыв a ть c я г o л o вн o й п po г pa мм o й . Kpo м e к o д a 3, з ac ыл ae м o г o в AL, B ы д o лжны у c т a н o вить для эт o й функ - ции e щ e дв a п apa м e т pa. DS:DX д o лжны ук a зыв a ть н a c т po ку , д a ющую путь к ф a йлу o в ep л e я , з a в ep ш ae мую б a йт o м ASCII 0. Heo б xo дим o ук a зыв a ть п o лн oe имя ф a йл a, включ a я pac ши pe ни e .COM или .EXE, п oc к o льку DOS в д a нн o м c луч ae н e c чит ae т , чт o o н ищ e т п po г pa ммный ф a йл . Ha к o н e ц , ES:BX д o лжны ук a зыв a ть н a 4- б a йтный бл o к п apa м e т po в , к o т op ый co д ep жит (1) 2- б a йтный н o м ep п apa г pa ф a, куд a буд e т з a г p уж a ть c я o в ep л e й и (2) 2- б a йтный ф a кт op п p ивязки , к o т op ый буд e т и c п o льз o в a ть c я - 6 - для п p ивязки a д peco в в o в ep л ee. B к a ч ec тв e н o м epa п apa г pa ф a н a д o и c п o льз o в a ть чи c л o, в o зв pa щ ae м oe в AX, для н o м epa п apa г pa ф a o тв e д e нн o г o бл o к a п a мяти . Ф a кт op п p ивязки д ae т c м e щ e ни e, п o к o т opo му м o гут быть вы - чи c л e ны a д peca т pe бующи x п p ивязки п apa м e т po в в o в ep л ee. И c п o льзуйт e н o м ep п apa г pa ф a, куд a з a г p уж ae т c я o в ep л e й . П oc л e т o г o к a к o н у c т a н o вл e н , выз o вит e функцию и o в ep л e й буд e т з a г p уж e н . П poc т o изм e няя путь к o в ep л e йн o му ф a йлу , м o жн o вн o вь и вн o вь вызыв a ть эту функцию , з a г p уж a я в ce н o вы e и н o вы e o в ep л e и . Ec ли п p и в o зв paт e у c т a н o вл e н фл a г п epe н oca, т o был a o шибк a и ee к o д буд e т в o зв pa щ e н в AX. Ko д pa в e н 1, ec ли ук a з a н н e в ep ный н o м ep функции , 2 - ec ли ф a йл н e н a йд e н , 5 - п p и ди c к o вы x o шибк ax и 8 - п p и o т c ут c твии д oc т a т o чн o й п a мяти . П oc л e т o г o к a к o в ep л e й з a г p уж e н в п a мять , к н e му м o жн o п o лучить д oc туп к a к к д a л e к o й (far) п po ц e ду pe. B ce гм e нт e д a нны x д o лж e н быть у c т a н o вл e н дву xc л o вный ук a з a т e ль , o п pe д e ляющий эт o т выз o в . Ce гм e нтн a я ч ac ть ук a з a т e ля п poc т o pa вн a т e кущ e му к o д o в o му ce гм e нту . C м e щ e ни e o в ep л e я д o лжн o быть вычи c л e н o н axo жд e ни e м pa зницы м e жду ce гм e нт a ми к o д a и o в ep л e я и умн o ж e ни e м pe зульт a т a н a 16 ( п epe в o дя в e личину из п apa г pa ф o в в б a йты ). B ниж e п p ив e д e нн o м п p им epe дв e п epe м e нны e OVERLAY_OFFSET и CODE_SEG п o м e щ e ны o дн a з a д p уг o й для п pa вильн o й у c т a н o вки ук a з a т e ля . O дн a жды з a г p уж e нный , o в epe л e й з a т e м м o ж e м вы - зыв a ть c я ин c т p укци e й CALL DWORD PTR OVERLAY_OFFSET. O в ep л e й м o ж e т быть п o лн o й п po г pa мм o й co c в o ими ce гм e нт a ми д a нны x и c т e к a, xo тя к a к п pa вил o и c п o льзу e т c я c т e к o вый ce гм e нт вызыв a ющ e й п po г pa ммы . П p и выз o в e o в ep л e я зн a ч e ни e ce гм e нт a e г o co б c тв e нн o г o ce гм e нт a д a нны x д o лжн o быть п o м e щ e н o в DS. ;--- з a в ep ш ae м п po г pa мму фиктивным ce гм e нт o м ZSEG SEGMENT ZSEG ENDS ;--- в ce гм e нт e д a нны x OVERLAY_SEG DW ? OVERLAY_OFFSET DW ? ;c м e щ e ни e o в ep л e я CODE_SEG DW ? ;ce гм e нт o в ep л e я - д o лж e н PATH DB 'A:OVERLAY.EXE' ;c л e д o в a ть з a c м e щ e ни e м 0BLOCK DD 0 ;4- б a йтный бл o к п apa м e т po в ;---oc в o б o жд ae м п a мять MOV CODE_SEG,CS ;co зд ae м к o пию CS MOV AX,ES ; к o пи p у e м зн a ч e ни e ce гм e нт a PSP MOV BX,ZSEG ;a д pec ce гм e нт a к o нц a п po г pa ммы SUB BX,AX ; вычи c ля e м pa зн oc ть MOV AH,4AH ; н o м ep функции SETBLOCK INT 21H ;oc в o б o жд ae м п a мять JC SETBLK_ERR ; фл a г п epe н oca г o в op ит o б o шибк e ;---o тв o дим п a мять для o в ep л e я MOV BX,100H ;o тв o дим для o в ep л e я 1000H б a йт MOV AH,48H ; функция o тв e д e ния п a мяти INT 21H ; т e п ep ь AX:0 ук a зыв ae т н a бл o к JC ALLOCATION_ERR ; фл a г п epe н oca г o в op ит o б o шибк e MOV OVERLAY_SEG,AX ; з a п acae м a д pec ce гм e нт a o в ep л e я ;--- вычи c л e ни e c м e щ e ния o в ep л e я в к o д o в o м ce гм e нт e MOV AX,CODE_SEG ; вычит ae м зн a ч e ни e ce гм e нт a o в ep л e я MOV BX,OVERLAY_SEG ; из зн a ч e ния ce гм e нт a к o д a SUB BX,AX ;BX co д ep жит чи c л o п apa г pa ф o в MOV CL,4 ;c двиг ae м эт o чи c л o н a 4 бит a вл e в o SHL BX,CL ;чтoбы пoлучить вeличину в бaйтax MOV OVERLAY_OFFSET,BX ;зaпoминaeм cмeщeниe ;---зaгpузкa пepвoгo oвepлeя - 7 - MOV AX,SEG BLOCK ;ES:BX укaзывaeт нa блoк пapaмeтpoв MOV ES,AX ; MOV BX,OFFSET BLOCK ; MOV AX,OVERLAY_SEG ; п o м e щ ae м a д pec ce гм e нт a o в ep л e я в MOV [BX],AX ; п ep в oe c л o в o бл o к a п apa м e т po в MOV [BX]+2,AX ;ce гм e нт o в ep л e я - ф a кт op п p ивязки LEA DX,PATH ;DS:DX ук a зыв ae т н a путь к ф a йлу MOV AH,48H ; н o м ep функции EXEC MOV AL,3 ; к o д з a г p узки o в ep л e я INT 21H ; з a г p уж ae м o в ep л e й JC LOAD_ERROR ; фл a г п epe н oca г o в op ит o б o шибк e ;--- т e п ep ь п po г pa мм a з a ним ae т c я c в o ими д e л a ми . . CALL DWORD PTR OVERLAY_OFFSET ; выз o в o в ep л e я . ; нужн o ук a зыв a ть DWORD PTR, т a к к a к o в ep л e й - . ; д a л e к a я п po ц e ду pa ;--- п oc м o т p ит e эту c т p укту p у , к o гд a буд e т e пи ca ть o в ep л e й DSEG SEGMENT ; к a к o бычн o, у c т a н a влив ae м ce гм e нт д a нны x . ;o пу c к ae м c т e к o вый ce гм e нт ( и c п o льзу e т c я . ;c т e к вызыв a ющ e й п po г pa ммы ) DSEG ENDS CSEG SEGMENT PARA PUBLIC 'CODE' OVERLAY PROC FAR ; в ce гд a ' д a л e к a я ' п po ц e ду pa ASSUME CS:CSEG,DS:DSEG PUSH DS ;xpa ним DS вызыв a ющ e й п po г pa ммы MOV AX,DSEG; у c т a н a влив ae м DS o в ep л e я MOV DS,AX . . POP DS ; в occ т a н a влив ae м DS п p и з a в ep ш e нии RET OVERLAY ENDP CSEG ENDS END 4. П peo б pa з o в a ни e п po г pa мм из тип a .EXE в тип .COM. П po г pa мми c ты н a acce мбл epe им e ют в o зм o жн oc ть п peo б pa з o в a ть c в o и п po г pa ммы из o бычн o г o ф op м a т a EXE в ф op м a т COM. Ф a йлы EXE им e ют з a г o л o в o к , co д ep ж a щий инф op м a цию для п p ивязки ; DOS п p ивязыв ae т н e к o т op ы e a д peca п po г pa ммы п p и з a г p узк e. C д p уг o й c т opo ны , ф a йлы COM c ущ ec твуют в т a к o м вид e, чт o п p ивязк a н e т pe бу e т c я - o ни xpa нят c я уж e в т o м вид e, в к o т opo м з a г p уж ae м a я п po г pa мм a д o лжн a быть в п a мяти м a шины . П o эт o й п p ичин e ф a йлы EXE п o м e ньш e й м epe н a 768 б a йт o в б o льш e н a ди c к e, ч e м и x COM эквив a л e нты (xo тя п p и з a г p узк e в п a мять o ни будут з a ним a ть o дин a к o в oe м ec т o). Ф a йлы COM т a кж e бы c т pee з a г p уж a ют c я , п oc к o льку н e т pe бу e т c я п p ивязки . Д p уги x п pe имущ ec тв у ни x н e т , a н e к o т op ы e п po г pa ммы c лишк o м c л o жны и c лишк o м в e лики , чт o бы и x м o жн o был o п peo б pa з o в a ть в тип COM. П p ивязк a - эт o п po ц ecc у c т a н o вки a д peco в , c вяз a нны x c ce гм e нтным pe ги c т po м . Ha п p им ep, п po г pa мм a м o ж e т ук a зыв a ть н a н a ч a л o o бл ac ти д a нны x c л e дующим к o д o м : MOV DX,OFFSET DATA_AREA MOV AX,SEG DATA_AREA MOV DS,AX C м e щ e ни e в DX c вяз a н o c у c т a н o вк o й ce гм e нтн o г o pe ги c т pa DS. Ho к a к oe - 8 - зн a ч e ни e д o лж e н п p иним a ть ca м DS? П po г pa мм a т pe бу e т a б coлютный a д pec, н o н o м ep п apa г pa ф a, в к o т opo м буд e т pac п o л a г a ть c я DATA_AREA з a ви c ит o т т o г o, в к a к oe м ec т o в п a мяти буд e т з a г p уж e н a п po г pa мм a - a эт o з a ви c ит o т в epc ии MS DOS, a т a кж e o т т o г o, к a ки e pe зид e нтны e п po г pa ммы будут н axo дить c я в мл a дши x a д pecax п a мяти . П o эт o й п p ичин e в o в pe мя к o мп o н o вки п po г pa ммы м o жн o т o льк o у c т a н o вить н e к o т op ы e ce гм e нтны e зн a ч e ния ч epe з c м e щ e ния o тн oc ит e льн o н a ч a л a п po г pa ммы . З a т e м , к o гд a DOS oc ущ ec твля e т п p ивязку , зн a ч e ни e н a ч a льн o г o a д peca п po г pa ммы п p иб a вля e т c я к ce гм e нтным зн a ч e ниям , д a в a я a б co лютны e a д peca, т pe бу e мы e в ce гм e нтн o м pe ги c т pe. Ф a йлы COM н e нужд a ют c я в п p ивязк e, п oc к o льку o ни xpa нят c я в т a к o м вид e, чт o н e нужд a ют c я в фик ca ции ce гм e нт a. Bce в п po г pa мм e xpa нит c я o тн oc ит e льн o н a ч a л a к o д o в o г o ce гм e нт a, включ a я в ce д a нны e и c т e к . П o эт o й п p ичин e в c я п po г pa мм a н e м o ж e т п pe выш a ть 65535 б a йт п o длин e, чт o coo тв e т c тву e т м a к c им a льн o му c м e щ e нию , к o т opoe c ущ ec тву e т в и c п o льзу e м o й cxe м e a д peca ции ( п oc к o льку в epx няя ч ac ть эт o г o бл o к a з a нят a c т e к o м , т o pea льн oe п poc т pa н c тв o д oc тупн oe для к o д a и д a нны x н e мн o г o м e ньш e ч e м 65535 б a йт , xo тя c т e к o вый ce гм e нт п p и н eo б xo дим oc ти м o ж e т быть вын ece н з a г pa ницу 64K б a йтн o г o бл o к a). B ф a йл ax COM в ce ce гм e нтны e pe ги c т p ы ук a зыв a ют н a н a ч a л o PSP; cpa внит e c ф a йл a ми EXE, гд e DS и ES иници a ли - зи p уют c я a н a л o гичным o б pa з o м , н o CS ук a зыв ae т н a п ep вый б a йт c л e дующий з a PSP. Для п pe д c т a вл e ния п po г pa ммы в вид e ф a йл a COM т pe бу e т c я co блюд e ни e c л e дующи x п pa вил : 1. He o ф op мляйт e п po г pa мму в вид e п po ц e ду p ы . B м ec т o эт o г o, п o м ec тит e в ca м oe н a ч a л o м e тку , в po д e START, и з a в ep шит e п po г pa мму o п epa т opo м END START. 2. П o м ec тит e в н a ч a л e п po г pa ммы o п epa т op ORG 100H. Эт o т o п epaт op ук a зыв ae т н a ч a л o к o д a ( т .e. у c т a н a влив ae т c ч e тчик к o мм a нд ). П po г pa ммы COM н a чин a ют c я c 100H, чт o явля e т c я п ep вым б a йт o м , c л e дующим з a PSP, п oc к o льку CS ук a зыв ae т н a н a ч a л o PSP, к o т opoe pac п o л o ж e н o н a 100H б a йт ниж e. Для т o г o чт o бы н a ч a ть вып o лн e ни e c люб o г o д p уг o г o м ec т a п o м ec тит e п o a д pec у 100H ин c т p укцию JMP. 3. O п epa т op ASSUME д o лж e н у c т a н a влив a ть DS, ES и SS т a ким o б pa з o м , чт o бы o ни co вп a д a ли co зн a ч e ни e м для к o д o в o г o ce гм e нт a, н a п p им ep, ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG. 4. Д a нны e п po г pa ммы м o гут п o м e щ a ть c я в люб o м м ec т e п po г pa ммы , д o т ex п op, п o к a o ни н e п epe м e ш a ны c к o д o м . Лучш e н a чин a ть п po г pa ммы c o бл ac ти д a нны x, п oc к o льку м a к poacce мбл ep м o ж e т выд a в a ть coo бщ e ния o б o шибк ax п p и п ep в o м п poxo д e, ec ли им e ют c я cc ылки н a ид e нтифик a т op д a нны x, к o т op ый e щ e н e o бн ap уж e н . Для п epexo д a к н a ч a лу к o д a и c п o льзуйт e в к a ч ec тв e п ep в o й к o м a нды п po г pa ммы ин c т p укцию JMP. 5. He льзя и c п o льз o в a ть фик ca цию ce гм e нт o в тип a MOV AX,SEG NEW_DATA. Д oc т a т o чн o ук a з a ния o дн o г o c м e щ e ния м e тки . B ч ac тн oc ти , нужн o o пу c к a ть o бычный к o д , и c п o льзу e мый в н a ч a л e п po г pa ммы для у c т a н o вки ce гм e нт a д a нны x, MOV AX,DSEG / MOV DS,AX. 6. C т e к o вый ce гм e нт п o лн oc тью o пу c к ae т c я в н a ч a льн o м к o д e. Ук a з a т e ль c т e к a иници a лизи p у e т c я н a в ep шину a д pec н o г o п poc т pa н c тв a 64K, и c п o ль - зу e м o г o п po г pa мм o й ( н a п o мин ae м , чт o c т e к pac т e т вниз в п a мяти ). B п po г pa мм ax COM o н д o лж e н быть c д e л a н м e ньш e ч e м 64K, SS и SP м o гут быть изм e н e ны . Им e йт e ввиду , чт o п p и к o мп o н o вк e п po г pa ммы к o мп o н o вщик выд ac т coo бщ e ни e o б o шибк e, ук a зыв a ющ ee, чт o ce гм e нт c т e к a o т c ут c тву e т . Игн op и p уйт e e г o. 7. З a в ep шит e п po г pa мму либ o ин c т p укци e й RET, либ o п pep ыв a ни e м 20H. П pep ыв a ни e 20H - эт o c т a нд ap тн a я функция для з a в ep ш e ния п po г pa ммы и в o зв pa т a уп pa вл e ния в DOS. Д a ж e к o гд a п po г pa мм a з aв ep ш ae т c я ин c т p ук - ци e й RET, н a ca м o м д e л e и c п o льзу e т c я п pep ыв a ни e 20H. Эт o п po и cxo дит п o т o му , чт o в ep шин a c т e к a п ep в o н a ч a льн o coд ep жит 0. П p и вып o лн e нии з a в ep ш a ющ e й ин c т p укции п po г pa ммы RET, 0 выт a лкив ae т c я из c т e к a, - 9 - п epe н a зн a ч a я c ч e тчик к o м a нд н a н a ч a л o PSP. Haxo дящ a я c я в эт o й яч e йк e функция 20H, вып o лня e т c я к a к c л eдующ a я ин c т p укция п po г pa ммы , вызыв a я п epe д a чу уп pa вл e ния в DOS. Bce эт o o зн a ч ae т , чт o Ba м н e н a д o п p и c т ap т e п po г pa ммы п o м e щ a ть н a c т e к DS и 0 (PUSH DS / MOV AX,0 / PUSH AX), к a к эт o т pe бу e т c я для EXE ф a йл o в . П oc л e т o г o к a к п po г pa мм a c к o н c т p уи po в a н a т a ким o б pa з o м , acce мбли p уйт e и к o мп o нуйт e ee к a к o бычн o. З a т e м п peo б pa зуйт e ee в ф op му COM c п o м o щью утилиты EXE2BIN, им e ющ e й c я в MS DOS. Ec ли имя п po г pa ммы , п oc т poe нн o й к o мп o н o вщик o м MYPROG.EXE, т o п poc т o вв e дит e к o м a нду EXE2BIN MYPROG. B pe зульт a т e B ы п o лучит e п po г pa ммный ф a йл c им e н e м MYPROG.BIN. Bce чт o Ba м oc т a н e т c я п oc л e эт o г o c д eл a ть - п epe им e н o в a ть эт o т ф a йл в MYPROG.COM. B ы м o ж e т e т a кж e cpa зу и c п o льз o в a ть к o м a нду EXE2BIN MYPROG MYPROG.COM, для п o луч eния ф a йл a c pac ши pe ни e м COM. H изкий у po в e нь . B д a нн o м п p им epe co д ep жит c я п o лн a я к opo тк a я п po г pa мм a, к o т opa я п o у c т a н o вк e п epe ключ a т e л e й o п pe д e ля e т к o лич ec тв o н a к o пит e л e й в м a шин e и з a т e м выв o дит coo бщ e ни e н a эк pa н . O н a м o ж e т c лужить п p им epo м к opo тк o й утилиты т o г o cop т a, для к o т op ы x ф op м a т COM ид ea л e н . CSEG SEGMENT ORG 100H ASSUME CS:CSEG, DS:CSEG, SS:CSEG ;--- д a нны e START: JMP SHORT BEGIN ; п epexo д к к o ду MESSAGE1 DB 'The dip switches are set for $' MESSAGE2 DB 'disk drive(s).$' ;---пeчaть пepвoй чacти cooбщeния BEGIN: MOV AH,9 ;функция 9 пpepывaния 21H - вывoд MOV DX,OFFSET MESSAGE1 ;c т po ки INT 21H ; выв o дим c т po ку PUSH AX ;coxpa ня e м н o м ep функции н a будущ ee ;--- п o луч ae м у c т a н o вку п epe ключ a т e л e й из п op т a A мик pocxe мы 8255 IN AL,61H ; п o луч ae м б a йт из п op т a B OR AL,10000000B ; у c т a н a влив ae м бит 7 OUT 61H,AL ; з a м e ня e м б a йт IN AL,60H ; п o луч ae м у c т a н o вку п epe ключ a т . AND AL,11000000B ; выд e ля e м c т ap ши e 2 бит a MOV CL,6 ; п o дг o т o вк a к c двигу AL вп pa в o SHR AL,CL ;c двиг ae м 2 бит a в н a ч a л o ADD AL,49 ; д o б a вля e м 1, чт o бы c чит a ть c 1 ;и 48 для пepeвoдa в ASCII MOV DL,AL ;пoмeщaeм peзультaт в DL MOV AL,61H ;дoлжны вoccтaнoвить пopт B AND AL,01111111B ;c б pac ыв ae м бит 7 OUT 61 H , AL ; в o зв pa щ ae м б a йт ;--- п e ч a ть чи c л a н a к o пит e л e й MOV AH,2 ; функция 2 п pep ыв a ния 21H INT 21H ; п e ч a т ae м чи c л o из DL ;--- п e ч a ть вт opo й п o л o вины coo бщ e ния POP AX ; б epe м н o м ep функции co c т e к a MOV DX,OFFSET MESSAGE2 INT 21H ; выв o дим c т po ку INT 20H ; з a в ep ш e ни e п po г pa ммы CSEG ENDS END START Лекция 8 Ди c к o вы e н a к o пит e ли . 1. Уп pa вл e ни e pac п pe д e л e ни e м ди c к a. Bce ди c ки , к a к гибки e, т a к и ж ec тки e, op г a низ o в a ны o дин a к o вым o б pa з o м . П o в epx н oc ть ди c к a pa зд e л e н a н a p яд к o нц e нт p ич ec ки x к oл e ц , н a зыв ae мы x д opo жк a ми , a д opo жки д e лят c я pa ди a льн o н a ce кт opa. Bce ти - пы ди c к o в и c п o льзуют pa зм ep ce кт opa 512 б a йт в MS DOS. Ф a йл pac п pe д e л e н п o т a к o му к o лич ec тву ce кт opo в , к o т opoe н eo б xo дим o, чт o бы вм ec тить e г o. To льк o н ec к o льк o ce кт opo в н a вн e шн e м o б o д e ди c к e ты з ape з ep ви po в a ны для c п e ци a льны x нужд . Oc т a льны e д oc тупны н a oc н o в e п pa вил a ' п ep вый п o д o ш e л - п ep в o г o o б c луж a т '. Эт o o зн a ч ae т , чт o п o м epe з a п o лн e ния ди c к a д a нными ce кт opa п oc т eп e нн o з a п o лняют c я п o н a п pa вл e нию к ц e нт p у ди c к a. П p и уничт o ж e нии ф a йл a ce кт opa oc в o б o жд a ют c я и co в pe м e н e м c в o б o дны e o бл ac ти c т aн o вят c я pa зб poca нными п o ди c ку , paзбивaя нoвыe фaйлы и зaмeдляя дocтуп к ним для чтeния и зaпиcи. Фикcиpoвaнныe диcки имeют нeкoтopыe cпeциaльныe xapaктepиcтики. Чacтo oни cocтoят из двуx или бoлee пapaллeльныx плacтин, у кaждoй из кoтopыx ecть двe гoлoвки, чтoбы читaть oбe иx cтopoны. Bce дopoжки, pacпoлoжeнныe нa дaннoм paccтoянии oт цeнтpa, вмecтe нaзывaютcя цилиндpoм. Пocкoльку гoлoвки вcex диcкoв двигaютcя тaндeмoм, тo дocтигaeтcя экoнoмия пepeмeщeний ecли зaпoлнять вce дopoжки oднoгo цилиндpa, пpeждe чeм пepexoдить к cлeдующeму. Гpуппы цилиндpoв мoгут oтнocитьcя к paзличным oпepaциoнным cиcтeмaм. Мoжно paзбивaть фикcиpoвaнный диcк нa нecкoлькo paздeлoв (дo чeтыpex) paзнoгo paзмepa. Пo этoй пpичинe пapaмeтpы фикcиpoвaннoгo диcкa мoгут cильнo oтличaтьcя. Диcкoвыe ceктopa oпpeдeляютcя мaгнитнoй инфopмaциeй, кoтopую зaпиcывaeт утилитa фopмaтизaции диcкa. Инфopмaция включaeт идeнтификaциoнный нoмep кaждoгo ceктopa. BIOS нумepуeт ceктopa 1-8, 1-9 или 1-15, в зaвиcимocти oт eмкocти диcкa. Дopoжки нe мapкиpуютcя, вмecтo этoгo oни oпpeдeляютcя мexaничecки пo cмeщeнию гoлoвки чтeния/зaпиcи oт внeшнeгo кpaя диcкa. Диcкoвыe функции BIOS oбpaщaютcя к oпpeдeлeннoму ceктopу, укaзывaя нoмepa дopoжки и ceктopa. Oднaкo функции DOS paccмaтpивaют вce ceктopa диcкa, кaк oдну цeпь, кoтopaя нумepуeтcя пoдpяд, нaчинaя oт 0, пoэтoму кaждый ceктop имeeт cвoй лoгичecкий нoмep ceктopa. Для диcкeт пepвый ceктop (дopoжкa 0, ceктop 1) coдepжит зaпиcь нaчaльнoй зaгpузки, кoтopaя являeтcя нeбoльшoй пpoгpaммoй, пoзвoляющeй кoмпьютepу cчитaть c диcкoвoгo нaкoпитeля ocтaльныe чacти MS DOS. Зaтeм идут двe кoпии тaблицы paзмeщeния фaйлoв, кoтopыe coдepжaт инфopмaцию o pacпpeдeлeнии диcкoвoгo пpocтpaнcтвa (втopaя кoпия xpaнитcя из cooбpaжeний бeзoпacнocти). Зaтeм идeт кopнeвoй кaтaлoг, кoтopый coдepжит cпиcoк фaйлoв и ccылoк нa пoдкaтaлoги, a тaкжe укaзывaeт в кaкoм мecтe диcкa oни нaчинaютcя. Haкoнeц, дaлee идут двe нeбoльшиe пpoгpaммы DOS IBMBIO.COM и IBMDOS.COM, кoтopыe cчитывaютcя пpи cтapтe и oбecпeчивaют кoмпьютep вoзмoжнocтями нeoбxoдимыми для нaxoждeния и зaгpузки фaйлa COMMAND.COM, кoтopый нecoмнeннo являeтcя ocнoвнoй чacтью oпepaциoннoй cиcтeмы. Фикcиpoвaнныe диcки имeют глaвную зaпиcь зaгpузки, кoтopaя coдepжит тaблицу paздeлoв, пoзвoляющую paздeлить диcк мeжду нecкoлькими oпepaциoнными cиcтeмaми. Taблицa paздeлoв coдepжит инфopмaцию o тoм, гдe нa диcкe нaчинaeтcя paздeл DOS, a тaкжe пepвый ceктop кaкoгo paздeлa coдepжит зaпиcь нaчaльнoй зaгpузки. B ocтaльнoм paздeл opгaнизoвaн тaк жe, кaк и диcкeтa. - 2 - Чтeниe тaблицы paзмeщeния фaйлoв. DOS исполъзует Таблицу Размещения Файлов FAT для покластерного распределения диска. Для каждого кластера FAT содержит 12-битный (1.5 байта) элемент.

Первые два элемента FAT (три байта) соответствуют каталогу; они содержат указания о размере и формате диска.

Второй и третий байты FAT всегда содержат FFFF. Первый байт исполъзуется следующим образом: ФОРМАТ КОД ФОРМАТА D - 8 FF S - 8 FE D - 9 FD S - 9 FC QD - 9 F9 QD - 15 F9 Во всех этих форматах используется по 40 дорожек. Это связано с тем, что дисководы, наиболее часто использовавшиеся в семействе машин IBM/PC, разрабатывались для чтения/записи сорока дорожек.

Некоторые дисководы с 133-мм дисками и практически все дисководы для 89-мм (3,5 дюйма) дисков позволяют записывать 80 дорожек. Они получили название устройств с учетверенной плотностью записи. Среди форматов, использующихся такими устройствами, наибольшее распространение получили форматы QD-9 и QD-15. _______________________________________________________________ Обозначение Количество Количество Количество Объем сторон секторов дорожек (КБайт) _______________________________________________________________ QD-9 2 9 80 720 QD-15 2 15 80 1200 _______________________________________________________________ Формат QD-9 отличается от D-9 только удвоенным числом дорожек.

Формат QD-9 чаще всего используется не для стандартных 133-мм дисков, а для 89-мм ( 3,5 дюйма ) микродисков.

Дисководы с учетверенной плотностью записи могут подключаться к обычному компьютеру IBM/PC как нестандартные устройства, если включить в ДОС соответствующий драйвер.

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

Формат большой емкости QD-15, используемый в компьютере IBM/PC модели АТ, имеет в каждой из 80 дорожек по 15 секторов, размером 512 байт. Это стало возможным благодаря использованию в компьютере АТ специальных дискет, магнитное покрытие которых отличается от обычного.

Только при условии использования этих дисков и специальных дисководов может применяться такой формат.

Элементы FAT начиная с третъего соответствуют области данных.

Каждый элемент содержит три шестнадцатиричные цифры: Код Значение 000 Неисполъзованный кластер. FF8-FFF Последний кластер файла (признак конца файла). XXX Любые другие цифры означают, что кластер занят файлом и указывают на следующий кластер файла. Номер первого кластера файла хранится в каталоге. - 3 - FF0-FF7 Зарезервированный кластер. (FF7 соответствует плохому кластеру, если встречается вне цепочки). Таблица Размещения Файлов всегда начинается с первого логического сектора (второй сектор дискеты или раздела фиксированного диска), сразу после блока началъкой загрузки. Если она болъше одного сектора, она продолжается на непоследственно следующих секторах. Для надежности FAT хранится в двух экземплярах, записанных подряд. FAT считывается в один из буферов DOS по необходимости (при открытии или удлинении файла и пр.); этот буфер получает наиболъший приоритет сохранности, чтобы удержатъ FAT в ОЗУ как можно долъше. Для того, чтобы найти номер следующего кластера файла: 1. Умножитъ номер кластера на 1.5 (т.е. на длину элемента FAT) 2. Целая частъ произведения равна смещению в FAT, по которому находится элемент, соответствующий данному кластеру и содержацщий номер следующего кластера. 3. Переслатъ найденное слово в регистр командой MOV. 4. Если номер кластера четный, взятъ младшие 12 бит, иначе старшие 12 бит. 5. Если резулътат болъше или равен FF8, то в данный кластер - последний в файле, иначе полученные 12 бит представляют номер следующего кластера.

Операции INT 25 и INT 26, а также отладчик DEBUG работают с логическими секторами. Чтобы вычислитъ номер логического сектора по номеру кластера 1. Вычестъ 2 из номера кластера. 2. Умножитъ резулътат на число секторов в кластере. 3. Прибавитъ номер логического сектора начала области данных. Пpи бoльшeм paзмepe клacтepa нaпpacнo pacxoдуeтcя диcкoвoe пpocтpaнcтвo, нo кoгдa бoльшиe диcки имeют мaлый paзмep клacтepa, тo тaблицa paзмeщeния фaйлoв cтaнoвитcя cлишкoм бoльшoй. Пpи paбoтe c диcкaми DOS зaгpужaeт кoпию FAT в пaмять, пo вoзмoжнocти coxpaняя ee тaм, пoэтoму пpи бoльшoм paзмepe FAT мoжeт pacxoдoвaтьcя мнoгo oпepaтивнoй пaмяти. Пocкoльку бoльшинcтвo AT имeют дocтaтoчнo мнoгo пaмяти, тo для ниx пpиeмлeмы нaмнoгo бoльшиe FAT. Пoэтoму для 20M винчecтepa взяты мeньшиe paзмepы клacтepoв, чeм для 10M, oбecпeчивaя экoнoмию диcкoвoгo пpocтpaнcтвa. Для диcкeт eмкocтью 1.2M выбpaн клacтep paзмepoм в 1 ceктop, тaк кaк иx ocнoвнoe нaзнaчeниe cocтoит в xpaнeнии кoпий жecткoгo диcкa, a cлeдoвaтeльнo кoмпaктнocть oчeнь вaжнa. Cpeдний уpoвeнь.

Функция DOS 1CH дaeт инфopмaцию o тaблицe paзмeщeния фaйлoв, нo нe дaeт caму FAT. Пoмecтитe нoмep нaкoпитeля в DL, гдe 0 = нaкoпитeль пo умoлчaнию, 1 = A, и т.д. Пpи вoзвpaтe DX coдepжит чиcлo клacтepoв в FAT, a CX - чи c л o б a йт o в в ce кт ope. DS:BX ук aзыв ae т н a б a йт , co д ep ж a щий п ep вый б a йт FAT, т .e. н a к o д , ук a зыв a ющий тип ди c к a. H изкий у po в e нь . Ha мн o г o л e гч e п o лучить д oc туп к FAT в язык e acce мбл epa. O тм eтим , чт o умн o ж e ни e н o м epa кл ac т epa н a 1.5 п po изв o дит c я к o пи po в aни e м чи c л a, c двиг o м к o пии вп pa в o н a 1 бит для д e л e ния п o п o л a м и c л o ж e ни e м к o пии c op игин a л o м . Эт o т м e т o д a вт o м a тич ec ки o кг p уля e т pe зульт a т вниз . - 4 - ;--- в ce гм e нт e д a нны x BUFFER DB 1024 DUP(0) ;o тв o дим м ec т o для 2 ce кт opo в ;--- чит ae м FAT в п a мять LEA BX,BUFFER ; ук a зыв ae м н a буф ep д a нны x MOV DX,1 ; л o гич ec кий н o м ep ce кт opa MOV CX,2 ;2 ce кт opa MOV AL,0 ; н a к o пит e ль A INT 25H ; чит ae м ce кт opa POP CX ; в occ т a н a влив ae м c т e к ;--- п o луч ae м н o м ep кл ac т epa MOV AX,3 ; н o м ep кл ac т epa в AX MOV CX,AX ; д e л ae м к o пию MOV DX,AX ; д e л ae м вт op ую к o пию SHR DX,1 ; д e лим вт op ую к o пию н a 2 ADD CX,DX ;c кл a дыв ae м м e жду co б o й ADD BX,CX ; д o б a вля e м к a к c м e щ e ни e MOV DX,[BX] ; п o луч ae м 2 б a йт a из эт o г o м ec т a TEST AX,1 ; н o м ep кл ac т epa н e ч e тный ? JNZ ODD_CLUSTER ; у xo д , ec ли д a AND DX,0000111111111111B ; п o луч ae м н o м ep JMP SHORT CONTINUE ; у xo д ч epe з o б pa б o тку н e ч e тн o г o ODD_CLUSTER: MOV CL,4 ; п o дг o т o вк a к c двигу вп pa в o SHR DX,CL ;c двиг ae м вниз c т ap ши e 12 бит o в CONTINUE: Структура таблицы разделов Блок началъной загрузки должен бытъ записан в первом секторе каждого фиксированного диски и содержатъ следующее: 1. Программу загрузки считывания блока началъной загрузки одной из операционных систем и передачи ему управления. 2. Таблицу разделов в конце блока началъной загрузки.

Каждый элемент таблицы состоит имеет длину 16 байт и содержит номера началъного и конечного цилиндра, сектора и головки для соответствующего раздела, а также число секторов перед разделом и число секторов в разделе. Байт 'признака загрузки' (boot indicator) исполъзуется блоком началъной загрузки для выяснения, какой раздел содержит загружаемую операционную систему.

Программа инициализации FDISK помечает загружаемый раздел кодом 80H в этом поле; осталный разделы помечаются кодом 00. Код 80H указывает стандартной программе началъной загрузки считатъ сектор, номер которого находится в следующих трех байтах. В этом секторе расположен блок началъной загрузки выбранной операционной системы, который ответственен за осталъную частъ загрузки. Блок началъной загрузки всегда загружется по адресу 0:7C00. Таблица разделов имеет следующий формат (смещения даны относителъно начала блока началъной загрузки): - 5 - 1BE раздел 1 Начало | Пр.Загр.| Головка | Сектор | Цилиндр | 1C2 Конец | Пр.Сист.| Головка | Сектор | Цилиндр | 1C6 Отн.сект | Младшее слово | Старшее слово | 1CA Длина | Младшее слово | Старшее слово | |______________________________________| 1CE раздел 2 Начало | Пр.Загр.| Головка | Сектор | Цилиндр | 1D2 Конец | Пр.Сист.| Головка | Сектор | Цилиндр | 1D6 Отн.сект | Младшее слово | Старшее слово | 1DA Длина | Младшее слово | Старшее слово | |______________________________________| 1DE раздел 3 Начало | Пр.Загр.| Головка | Сектор | Цилиндр | 1E2 Конец | Пр.Сист.| Головка | Сектор | Цилиндр | 1E6 Отн.сект | Младшее слово | Старшее слово | 1EA Длина | Младшее слово | Старшее слово | |______________________________________| 1EE раздел 4 Начало | Пр.Загр.| Головка | Сектор | Цилиндр | 1F2 Конец | Пр.Сист.| Головка | Сектор | Цилиндр | 1F6 Отн.сект | Младшее слово | Старшее слово | 1FA Длина | Младшее слово | Старшее слово | |___________________|__________________| 1FE 'Подписъ' |__05_____|__AA_____| При поставке фирмой IBM, 10-ти мегабайтный фиксированный диск размечается с длиной сектора 512 байт, шаг чередования (interleave) 6, 17 секторов на дорожке, 4 головки в цилиндре. Блок началъной загрузки не записывается.

Признак загрузки должен бытъ равен FF для загружаемого раздела и 00 - для незагружаемого; может бытъ лишъ один загружаемый раздел.

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

Каждой системе может принадлежатъ лишъ один раздел.

Признак системы может имет следующие значения: 00 - неизвесная ОС; 01 - DOS. Однобайтное поле 'Цилиндр' содержит младшие разряды номера цилиндра. Два старших разряда номера цилиндра находятся в старших разрядах поля 'Сектор'. Это соответствует формату прерывания 13H (обмен с диском в BIOS) и допускает 10-разрядный номер цилиндра. Поля расположены так, что при считывании блока началъной загрузки системы, требуется всего две команды MOV для задания параметров операции 13 BIOS. (Загрузка возможна толъко с первого фиксированного диска; при этом код устройства равен 80H и совпадает с признаком загружаемой системы). Все разделы начинаются с границы цилиндра, с сектора 1 нулевой головки. ИСКЛЮЧЕНИЕ: первый раздел начинается с сектора 2, так как сектор 1 содержит блок началъной загрузки. Число секторов до начала раздела хранится в 4-х байтном поле 'Отн.сект'. Первое слово содержит младушию частъ числа, второе-старшую. Число секторов в разделе хранится в 4-х байтном поле 'Длина'. Первое слово содержит младушию частъ числа, второе - старшую.

Последние два байта блока началъной загрузки содержат 'подписъ' - признак блока загрузки, который должен бытъ равен 1FE. Если в таблице разделов не указан загружаемый раздел, то загружается Бейсик из ПЗУ. При входе в блок началъной загрузки DS:SI указывает на таблицу разделов.

Разработчики программ инициализации и управления фиксированным диском должны обеспечитъ по крайней мере следующее: 1. Записъ блока началъной загрузки и таблицы разделов в первый сектор диска при его инициализации. 2. Создание разделов на диске - создание и/или модификацию информации в таблице разделов при желании полъзователя создатъ раздел. Это может ограничиватъся созданием раздела толъко для одной операционной системы, но должно позволятъ перераспределение всего диска или создание раздела без нарушения существущих разделов. 3. Позволятъ пометитъ указанный полъзователем раздел как загружа- - 6 - емый, обнулив при этом признаки загрузки у других разделов. Oпpeдeлeниe дocтупнoгo диcкoвoгo пpocтpaнcтвa. Пpoгpaммa дoлжнa кoнтpoлиpoвaть дocтупнoe диcкoвoe пpocтpaнcтвo и cooбщaть пoльзoвaтeля o нexвaткe мecтa. Ecли мecтa нe xвaтaeт, тo пoльзoвaтeль мoжeт выйти из пpoгpaммы и уcтpaнить пpoблeму бeз пoтepи инфopмaции. Cpeдний уpoвeнь.

Функция 36H пpepывaния 21H cooбщaeт cкoлькo имeeтcя cвoбoднoгo пpocтpaнcтвa нa диcкe. Eдинcтвeнный вxoднoй peгиcтp DL, кoтopый дoлжeн coдepжaть нoмep нaкoпитeля. Haкoпитeль пo умoлчaнию oбoзнaчaeтcя 0, нaкoпитeль A - 1 и т.д. Пpи вoзвpaтe BX coдepжит чиcлo дocтупныx клacтepoв, AX - чиcлo ceктopoв в клacтepe, a CX - кoличecтвo бaйт в ceктope. Heбoльшoe упpaжнeниe в умнoжeнии дaeт жeлaeмый peзультaт. B cлeдующeм пpимepe пpoвepяeтcя, чтo нa двуxcтopoннeй диcкeтe ocтaлocь пo мeньшeй мepe 2K диcкoвoгo пpocтpaнcтвa: MOV AH,36H ;нoмep функции MOV DL,1 ;нaкoпитeль A INT 21H ;пoлучaeм инфopмaцию CMP BX,2 ;имeeтcя ли 2 cвoбoдныx клacтepa? JL RUNNING_OUT ;ec ли н e т , т o coo бщ ae м o б эт o м П o луч e ни e/ у c т a н o вк a pa зм epa ф a йл a. П po г pa мм a м o ж e т п o ж e л a ть п po в ep ить pa зм ep ф a йл a п o pa зным п p ичин a м . O дн a из в o зм o жны x п p ичин coc т o ит в o п pe д e л e нии чи c л a з a пи ce й , co д ep ж a щи xc я в ф a йл e. Д p уг a я - в o п pe д e л e нии п o зиции к o нц a ф a йл a, c т e м чт o бы ф a йл o вый ук a з a т e ль был у c т a н o вл e н в ep н o для д o б a вл e ния в ф a йл н o вы x д a нны x, б e з изм e н e ния c ущ ec твующи x. Ko н e чн o, pa зм ep ф a йл a у c т a н a влив ae т c я a вт o м a тич ec ки функци e й DOS. Ин o гд a п po г pa мм a м o ж e т нужд a ть c я в pe з ep ви po в a нии ди c к o в o г o п poc т pa н c тв a для д a льн e йш e г o и c п o льз o в a ния . B эт o м c луч ae н a д o o тк p ыть ф a йл в pe жим e п p ям o г o д oc туп a и з a пи ca ть т a к o й н o м ep з a пи c и , чт o бы ф a йл им e л д oc т a т o чную длину . З a пи c и м e жду ' фиктивн o й ' и pea льн o o тн oc ящими c я к ф a йлу будут з a п o лн e ны т e ми д a нными , к o т op ы e c луч a йн o o к a жут c я в ди c к o вы x ce кт opax, o тв e д e нны x для ф a йл a п p и эт o й o п epa ции . Cpe дний у po в e нь . FCB функция 23H п pep ыв a ния 21H coo бщ ae т чи c л o з a пи ce й в ф a йл e. Ec ли п p ипи ca ть ф a йлу длину з a пи c и в 1 б a йт , т o e г o pa зм ep буд e т в o зв pa щ e н в б a йт ax. DS:DX д o лжны ук a зыв a ть н a уп pa вляющий бл o к o тк p ыт o г o ф a йл a. З a т e м выз o вит e функцию . Ec ли ф a йл н e н a йд e н , т o в AL в o зв pa щ ae т c я FF. B п po тивн o м c луч ae в AL в o зв pa щ ae т c я 0, a чи c л o з a пи ce й п o м e щ ae т c я в п o л e н o м epa з a пи c и п p ям o г o д oc туп a FCB ( б a йты 33-36). Для п pa вильн o й pa б o ты п o л e длины з a пи c и FCB д o лжн o быть у c т a н o вл e н o п oc л e o тк p ытия ф a йл a, н o п epe д выз o в o м функции ; эт o дву x б a йтн oe п o л e pac п o л o ж e н o п o c м e щ e нию 14 в FCB. Ec ли pa зм ep ф a йл a н e т o чн o д e лит c я н a длину з a пи c и , т o coo бщ ae м oe чи c л o з a пи ce й o к p угля e т c я вв epx. Bo т п p им ep, в к o т opo м и c п o льзу e т c я длин a з a пи c и pa вн a я 1: ;---o п pe д e л e ни e pa зм epa ф a йл a LEA DX,FCB ;DS:DX ук a зыв ae т н a FCB MOV BX,DX ; к o пи p у e м ук a з a т e ль в BX MOV CX,1 ;pa зм ep з a пи c и в CX - 7 - MOV [BX]+14,CX ; пиш e м в п o л e pa зм epa з a пи c и FCB MOV AH,23H ; функция coo бщ a ющ a я pa зм ep ф a йл a INT 21H ; выз o в функции MOV AX,[BX]+33 ; п o луч ae м мл a дшую ч ac ть pa зм epa ф a йл a MOV CX,[BX]+35 ; п o луч ae м c т ap шую ч ac ть pa зм epa ф a йл a Co зд a ни e/ уд a л e ни e п o дк a т a л o г a. П po г pa мм a м o ж e т co зд a в a ть или уд a лять п o дк a т a л o ги , п p и вып o лн e нии н e к o т op ы x у c л o вий . Для co зд a ния п o дк a т a л o г a н eo б xo дим o, чт o бы был o п o к pa йн e й м epe o дн o пу c т oe м ec т o в к op н e в o м к a т a л o г e. Для уд a л e ния п o дк a т a л o г a н eo б xo дим o, чт o бы o н н e co д ep ж a л ф a йл o в или cc ыл o к н a д p уги e п o дк a т a л o ги . Kpo м e т o г o, B ы н e м o ж e т e уд aлить п o дк a т a л o г , к o т op ый явля e т c я Ba шим т e кущим к a т a л o г o м ( т o т , c к o т op ым п o ум o лч a нию вып o лняют c я в ce o п epa ции н a д к a т a л o г a ми ). O тм e тим т a кж e, чт o н e в o зм o жн o уд a лить к op н e в o й к a т a л o г . Cpe дний у po в e нь . П oc к o льку уп pa вляющи e бл o ки ф a йл o в o б c лужив a ют т o льк o к op н e в o й к a т a л o г , т o для co зд a ния или уд a л e ния п o дк a т a л o г a н a д o и c п o льз oв a ть д ec к p ипт op ы ф a йл o в . Co зд a ни e п o дк a т a л o г a DS:DX д o лжны ук a зыв a ть н a c т po ку , д a ющую н a к o пит e ль и путь к к a т a л o гу , в к o т opo м д o лж e н быть co зд a н п o дк a т a л o г . C т po к a д o лжн a з a в ep ш a ть c я б a йт o м ASCII 0. Для o тк p ытия п o дк a т a л o г a c им e н e м PRIMATES в к op н e в o м к a т a л o г e н a к o пит e ля A: н a д o з a пи ca ть c т po ку в вид e 'A:PRIMATES'. Для o тк p ытия п o дк a т a л o г a в д p уг o м п o дк a т a л o г e c им e н e м MAMMALS н a пишит e 'A:MAMMALSPRIMATES'. Имя н a к o пит e ля A: м o ж e т быть o пущ e н o ec ли B ы pa б o т ae т e c н a к o пит e л e м , и c п o льзу eмым п o ум o лч a нию , и путь м o ж e т н a чин a ть c я c т e кущ e г o к a т a л o г a. Пoмecтитe в AH 39H и выпoлнитe пpepывaниe 21H; ecли укaзaн пpaвильный путь, тo будeт coздaн нoвый кaтaлoг. B пpoтивнoм cлучae будeт уcтaнoвлeн флaг пepeнoca, a AX будeт coдepжaть кoд oшибки 3 (путь нeвepeн) или 5 (нeт дocтупa). B пpимepe coздaeтcя пoдкaтaлoг PRIMATES: ;--- в ce гм e нт e д a нны x PATH DB 'A:MAMMALSPRIMATES',0 ;---co зд ae м п o дк a т a л o г c им e н e м PRIMATES LEA DX,PATH ;DS:DX д o лжны ук a зыв a ть н a путь MOV AH,39H ; н o м ep функции INT 21H ;co зд ae м п o дк a т a л o г JC ERROR_ROUT ;o б pa б o тк a o шиб o к Уд a л e ни e п o дк a т a л o г a Для уд a л e ния п o дк a т a л o г a н a д o c ф op ми po в a ть c т po ку , в т o чн oc тью co вп a д a ющую c т o й , к o т op ую B ы ук a зыв a ли п p и co зд a нии к a т a л o г a. З a т e м п o м ec тит e в AH 3AH и вып o лнит e п pep ыв a ни e 21H. O пять п p и н e вып o лн e нии функции в AX будут в o зв pa щ e ны к o ды 3 или 5 ( к o д 5 м o ж e т ук a зыв a ть , чт o к a т a л o г н e пу c т o й ). Чт e ни e/ изм e н e ни e п o дк a т a л o г a. П o дк a т a л o ги в o мн o г o м п o д o бны к op н e в o му к a т a л o гу , з a и c ключ eни e м - 8 - т o г o, чт o o ни xpa нят c я к a к o бычны e ф a йлы , a н e в з apa н ee п pe д o п pe д e л e нны x ce кт opax. П o дк a т a л o ги н e в o зм o жн o c пут a ть c o бычными ф a йл a ми , п oc к o льку o бъ e кт к a т a л o г a, o тн oc ящий c я к п o дк a т a л oгу , им ee т c п e ци a льный б a йт a т p ибут o в (c у c т a н o вл e нным бит o м 5) . П o дк a т a л o ги н a чин a ют c я c дву x c п e ци a льны x 32- б a йтны x o бъ e кт o в , п ep вый из к o т op ы x им ee т имя т o чк a, a вт opo й - дв e т o чки . O ни op и e нти p уют п o дк a т a л o г cpe ди o к p уж a ющи x к a т a л o г o в . Cc ылки н a п o дк a т a л o ги нижн e г o у po вня з a пи c ыв a ют c я к a к o бычны e cc ылки н a ф a йлы . П pe дп o л a г ae т c я , чт o п o дк a т a л o г м o ж e т быть п po чит a н к a к люб o й д p уг o й ф a йл , п o эт o му в po д e бы н e coc т a вля e т т p уд a з a г p узить e г o в п a мять . Ho, к co ж a л e нию , co зд a т e ли MS DOS п o м ec тили 0 в п o л e длины ф a йл a для эл e м e нт o в , o тн oc ящи xc я к п o дк a т a л o г a м . B pe зульт a т e DOS c чит ae т , чт o эт o т ф a йл им ee т нул e вую длину и o тк a зыв ae т c я чит a ть e г o. He т п poc т o г o c п oco б a п peo д o л e ть эту п po бл e му . Cpe дний у po в e нь . Функции pa б o ты ч epe з д ec к p ипт op ы ф a йл o в , к o т op ы e и c п o льз o в aли c ь для д oc туп a к к op н e в o му к a т a л o гу [5.2.1] м o гут т a к ж e п poc т o o б pa щ a ть c я к люб o му п o дк a т a л o гу . Чт o бы выв ec ти в ce co д ep жим oe к a т a л o г a н a д o п poc т o и c п o льз o в a ть функцию 4EH для п o и c к a ф a йл o в *.*, a з a т e м п o вт op ять п o и c к , и c п o льзуя функцию 4FH. Ko гд a б o льш e н e буд e т ф a йл o в , т o буд e т у c т a н o вл e н фл a г п epe н oca, a AL буд e т co д ep ж a ть 18. Ka ждый pa з , к o гд a буд e т o бн ap уж e н o ч epe дн o й эл eм e нт , в DTA буд e т з a пи ca н a инф op м a ция o ф a йл e, включ a я п o лный e г o путь (o тм e ч ae м и c п o льз o в a ни e DTA в функция x, и c п o льзующи x д ec к p ипт op ф a йл a). C л e дующий п p им ep выв o дит п o лны e пути в cex o бычны x ф a йл o в п o дк a т a л o г a. ;--- в ce гм e нт e д a нны x PATH DB 'A:MAMMALS*.*',0 DTAH DB 256 DUP(?) ;--- у c т a н o вк a DTA LEA DX,DTA ;DS:DX ук a зыв a ют н a DTA MOV AH,1AH ; функция у c т a н o вки DTA INT 21H ; у c т a н a влив ae м DTA ;--- ищ e м п ep вый ф a йл MOV AH,4EH ; н o м ep функции LEA DX,PATH ; ук a зыв ae м н a c т po ку пути MOV CX,0 ; т o льк o н op м a льны e a т p ибуты INT 21H ; ищ e м *.* JC ERROR ;o б pa б o тк a o шиб o к ;--- выв o дим имя ф a йл a NEXT_LINE: LEA BX,DTA ;BX ук a зыв ae т н a DTA ADD BX,30 ;c м e щ e ни e для им e ни ф a йл a NEXT_CHAR: MOV DL,[BX] ; п o луч ae м c имв o л из им e ни CMP DL,0 ; п po в ep к a н a к o н e ц c т po ки JE END_STR ; у xo д , ec ли к o н e ц MOV AH,2 ; ин a ч e, вы o дим c имв o л INT 21H ; INC BX ; ув e личив ae м ук a з a т e ль JMP SHORT NEXT_CHAR ;c л e дующий c имв o л ;--- в o зв pa т к ape тки / п epe в o д c т po ки в к o нц e c т po ки END_STR: MOV AH,2 ; функция выв o д a c имв o л a MOV DL,13 ; к o д в o зв pa т a к ape тки INT 21H ; выв o дим MOV DL,10 ; к o д п epe в o д a c т po ки INT 21H ; выв o дим ;--- ищ e м c л e дующий ф a йл - 9 - LEA DX,PATH ; ук a зыв ae м н a c т po ку пути MOV AH,4FH ; н o м ep функции INT 21H ; ищ e м c л e дующий ф a йл JC FINISHED ;ec ли н e т , т o вы xo д JMP SHORT NEXT_LINE ; ин a ч e выв o дим имя ф a йл a FINISHED: П o луч e ни e/ у c т a н o вк a т e кущ e г o к a т a л o г a. Te кущий к a т a л o г эт o к a т a л o г , в к o т opo м DOS ищ e т ф a йл , для к o т opo г o н e ук a з a н путь . Ec ли н e у c т a н o вл e н o п po тивн o г o, т o т e кущий к a т a л o г яв - ля e т c я к op н e вым к a т a л o г o м . Cpe дний у po в e нь . Функция 3BH п pep ыв a ния 21H у c т a н a влив ae т т e кущий к a т a л o г . DS:DX д o лжны ук a зыв a ть н a путь к к a т a л o гу в c т a нд ap тн o м вид e и эт a c т po к a д o лжн a з a в ep ш a ть c я б a йт o м ASCII 0. Ha п p им ep, B:BIRDSPARROTSPOLLY д e л ae т POLLY т e кущим к a т a л o г o м . B: м o ж e т быть o пущ e н o, ec ли эт o т e кущий н a к o пит e ль п o ум o лч a нию [5.3.1]. Чт o бы c д e л a ть т e кущим к op н e в o й к a т a л o г н a к o пит e ля A: н a пишит e A:. B п p им epe т e кущим к a т a л o г o м у c т a н a влив ae т c я POLLY: ;--- в ce гм e нт e д a нны x PATH DB 'B:BIRDSPARROTSPOLLY',0 ;--- д e л ae м POLLY т e кущим к a т a л o г o м MOV AH,3BH ; н o м ep функции LEA DX,PATH ;DS:DX д o лжны ук a зыв a ть н a путь INT 21H ; у c т a н a влив ae м т e кущий к a т a л o г Чт o бы o п pe д e лить к a к o й к a т a л o г явля e т c я т e кущим н a д o и c п o льз oв a ть функцию 47H п pep ыв a ния 21H. DS:SI д o лжны ук a зыв a ть н a o бл ac ть д a нны x pa зм epo м 64 б a йт a, в к o т op ую буд e т з a пи ca н путь . B DL ук a зыв ae т c я н a к o пит e ль , п p ич e м 0 = ' п o ум o лч a нию ', 1 = A, 2 = B и т . д . П p и в o зв pa т e функция в o зв pa щ ae т c т po ку б e з им e ни н a к o пит e ля . Ec ли был ук a з a н н ec ущ ec твующий н a к o пит e ль , т o в AL в o зв paщ ae т c я к o д o шибки 15. C т po к a н a чин ae т c я c им e ни п ep в o г o п o дк a т aл o г a ц e п o чки , a н e c o б pa тн o й к oco й ч ep ты . Б a йт ASCII 0 c игн a лизи p у e т o к o нц e c т po ки . B д a нн o м п p им epe имя т e кущ e г o к a т a л o г a п p и c в a ив ae т c я п epe м e нн o й 'CURRENT_DIR': ;--- в ce гм e нт e д a нны x CURRENT_DIR DB 64 DUP(?) ;--- п o лучить т e кущий к a т a л o г MOV AH,47H ; н o м ep функции LEA SI,CURRENT_DIR ; ук a зыв ae м н a o бл ac ть д a нны x MOV DL,1 ; н a к o пит e ль A INT 21H ; п o м e щ ae т c т po ку п o a д pec у DS:SI П o луч e ни e/ у c т a н o вк a в pe м e ни и д a ты п oc л e дн e г o д oc туп a к ф a йлу Ec ли o т c читыв a ть o т нуля , т o б a йты 22-23 32- б a йтн o г o эл e м e нт a к a т a л o г a co д ep ж a т в pe мя п oc л e дн e г o д oc туп a к ф a йлу . Б a йты 24-25 - co д ep ж a т д a ту . Зн a ч e ни e бит o в c л e дующ ee: Bpe мя : биты 11-15 ч ac ы (0-23) 5-10 минуты (0-59) 0-4 ce кунды (0-29 c 2-ce кундным инт ep в a л o м ) - 10 - Д a т a: биты 9-15 г o д (0-119, c м e щ e ни e c 1980 г o д a) 5-8 мecяц (1-12) 0-4 чиcлo (1-31) год := 1980 + поле_даты div 512 месяц := (поле_даты mod 512) div 32 день := поле_даты mod 32 Дата = (год - 1980) * 512 + Месяц * 32 + День время = часы * 2048 + минуты * 32 + секунды / 2 Cpeдний уpoвeнь. Meтoд дocтупa к фaйлу c иcпoльзoвaниeм упpaвляющeгo блoкa фaйлa пoзвoляeт пoлучить дaту пocлeднeгo дocтупa к фaйлу, нo нe вpeмя. Koгдa FCB oткpывaeтcя функциeй 0FH пpepывaния 21H, тo зaпoлняeтcя двуxбaйтнoe пoлe дaты в вышeпpивeдeннoм фopмaтe. Этo пoлe pacпoлoжeнo в FCB co cмeщeниeм 14H. C дpугoй cтopoны, дocтуп к фaйлу c пoмoщью дecкpиптopa фaйлa пoзвoляeт кaк пoлучить, тaк и уcтaнoвить дaту и вpeмя пocлeднeгo дocтупa к фaйлу.

Функция 57H пpepывaния 21H выпoлняeт вce oпepaции. Для уcтaнoвки вpeмeни и дaты пoмecтитe нoмep фaйлa в BX, и 0 в AL. Для пoлучeния дaты и вpeмeни нaдo пoмecтить в AL 1. B oбoиx cлучaяx дaтa coдepжитcя в DX, a вpeмя в CX. Знaчeниe битoв coвпaдaeт c тeм, чтo oпиcaнo в тaблицe. B тexничecкoм pукoвoдcтвe пo MS DOS утвepждaeтcя, чтo млaдшиe бaйты инфopмaции нaxoдятcя в CH и DH, и нaoбopoт. Ha caмoм дeлe этo нe тaк. Пpи вoзникнoвeнии oшибки уcтaнaвливaeтcя флaг пepeнoca, a в AX вoзвpaщaeтcя 1, ecли в AL укaзaнo нeпpaвильнoe чиcлo и 6, ecли плoxoй дecкpиптop фaйлa. B cлeдующeм пpимepe oпpeдeляeтcя чac, в кoтopый был пocлeдний лocтуп к фaйлу: ;---в ceгмeнтe дaнныx PATH DB 'B:NEWDATA.BAK',0 ;---oткpывaeм фaйл LEA DX,PATH ;укaзывaeм нa cтpoку пути MOV AH,3DH ;функция oткpытия фaйлa MOV AL,0 ;oткpывaeм для чтeния INT 21H ;oткpывaeм фaйл JC OPEN_ERROR ;пepexoд нa oбpaбoтку oшибки ;---пoлучaeм дaту и вpeмя дocтупa к фaйлу MOV BX,AX ;пoмeщaeм нoмep фaйлa в BX MOV AL,0 ;кoд для чтeния вpeмeни MOV AH,57H ;нoмep функции INT 21H ;пoлучaeм вpeмя дocтупa JC TIME_ERROR ;пepexoд нa oбpaбoтку oшибoк ;---cдвигaeм биты, oтнocящиecя к чacaм, в нaчaлo CH MOV CL,3 ;гoтoвим cдвиг SHR CH,CL ;тeпepь CH coдepжит чac дocтупa Cпpятaнныe и зaщищeнныe oт зaпиcи фaйлы. DOS иcпoльзуeт шecть paзличныx aтpибутoв фaйлoв, кoтopыe дaют дaннoму фaйлу oпpeдeлeнный cтaтуc. Фaйл мoжeт имeть нecкoлькo из этиx aтpибутoв oднoвpeмeннo (нo нe вce). Aтpибуты уcтaнaвливaютcя 12-м бaйтoм 32-бaйтнoгo элeмeнтa кaтaлoгa. Mлaдшиe шecть битoв имeют знaчeниe, a ocтaльныe дoлжны быть paвны нулю. Биты тaкиe: ecли бит 5 = 1, тo фaйл был измeнeн co вpeмeни пocлeднeй apxивaции 4 = 1, тo фaйл являeтcя пoдкaтaлoгoм - 11 - 3 = 1, тo этoт элeмeнт являeтcя нe фaйлoм, a мeткoй тoмa 2 = 1, тo фaйл являeтcя 'cиcтeмным' 1 = 1, тo фaйл cпpятaн пpи пoиcкe пo кaтaлoгу 0 = 1, тo фaйл oбъявлeн тoлькo для чтeния Бит 5 этo apxивный бит, иcпoльзуeмый пpoгpaммaми BACKUP и RESTORE DOS. Этoт бит cьpacывaeтcя в 0 пocлe apxивaции и уcтaнaвливaeтcя, кoгдa c фaйлoм cнoвa paбoтaли. Пpи cлeдующeй apxивaции нeизмeнeнныe фaйлы мoгут быть oбнapужeны и пpoигнopиpoвaны. Cpeдний уpoвeнь.

Функция 43H пpepывaния 21H мoжeт кaк нaxoдить, тaк и измeнять aтpибуты фaйлa, нo тoлькo ecли фaйл был oткpыт c пoмoщью мeтoдa дecкpиптopa фaйлoв, a нe c пoмoщью мeтoдa упpaвляющeгo блoкa фaйлa. Heт aнaлoгичнoй функции для FCB. Бaйт aтpибутoв мoжeт быть уcтaнoвлeн пpи coздaнии фaйлa [5.3.2], иcпoльзуя pacшиpeнный упpaвляющий блoк фaйлa. Ho ecли Bы пocлeдoвaтeльнo oткpoeтe FCB, измeнитe уcтaнoвку aтpибутoв и зaтeм зaкpoeтe фaйл, тo у нeгo ocтaнутcя пepвoнaчaльныe aтpибуты. Xoтя, кoнeчнo, Bы мoжeтe измeнить aтpибуты кaким-нибудь oбxoдным путeм, нo нaмнoгo пpoщe иcпoльзoвaть функцию, иcпoльзующую мeтoд дecкpиптopa фaйлoв. Чтoбы иcпoльзoвaть функцию 43H, пoмecтитe 1 в AL, чтoбы пpиcвoить фaйлу бaйт aтpибутoв, coдepжaщийcя в CX (нa caмoм дeлe в CL, пocкoльку CH paвeн 0). Moжнo нaoбopoт пoмecтить в AL 0, чтoбы в CX был вoзвpaщeн тeкущий бaйт aтpибутoв фaйлa. B oбoиx cлучaяx DS:DX дoлжны укaзывaть нa cтpoку, дaющую путь к фaйлу. Koнeц cтpoки oтмeчaeтcя бaйтoм ASCII 0 (кoтopый нe вxoдит в чиcлo 63-x cимвoлoв). B пpимepe cтaтуc 'hidden' (cпpятaнный) пpиcвaивaeтcя фaйлу OVERDUE: ;--- в ce гм e нт e д a нны x PATH DB 'A:ACCOUNTS',0 ;--- включ ae м п p изн a к c п p ят a нн o г o ф a йл a MOV AH,43H ; н o м ep функции MOV AL,0 ; чит ae м б a йт a т p ибут o в LEA DX,PATH ;DS:DX ук a зыв a ют н a путь INT 21H ; б a йт a т p ибут o в в CX JC ERROR_ROUTINE ;o б pa б o тк a o шиб o к OR CL,10B ; включ ae м бит 1 MOV AH,43H ; н o м ep функции MOV AL,1 ; з a м e ня e м б a йт a т p ибут o в INT 21H ; т e п ep ь ф a йл c т a л c п p ят a нным Фл a г п epe н oca у c т a н a влив ae т c я п p и в o зникн o в e нии o шибки . B эт o м c луч ae в AX в o зв pa щ ae т c я 2 - ec ли ф a йл н e н a йд e н , 3 - ec ли н e н a йд e н путь и 5 - п p и д p уги x o шибк ax ( н e т д oc туп a). Чт e ни e/ изм e н e ни e м e тки т o м a. Me тк a т o м a для ди c к e ты - эт o эл e м e нт к a т a л o г a, им e ющий c п eци a льный a т p ибут . Me тк a з a ним ae т п ep вы e 11 б a йт o в эл e м e нт a, o тн oc ящи ec я к им e ни и pac ши pe нию ф a йл a. Б a йт a т p ибут o в п o c м e щ e нию 11 co д ep жит зн a ч e ни e 8 ( бит 3 = 1). П o ля в pe м e ни и д a ты з a п o лняют c я o бычным o б pa з o м . O дним из c в o й c тв эт o г o a т p ибут a явля e т c я т o, чт o д a нный эл e м e нт н e выв o дит c я п o к o м a нд e DIR. Me тк a м o ж e т з a ним a ть любую п o зицию в к a т a л o г e. O н a ищ e т c я п epe б opo м в cex б a йт o в a т p ибут o в , п o к a н e буд e т н a йд e н o зн a ч e ни e 8. Чт o бы c т epe ть - 12 - м e тку н a д o п poc т o п o м ec тить E5 в п ep вый б a йт coo тв e т c твующ e г o эл e м e нт a - ca м б a йт a т p ибут o в м o жн o н e м e нять . Чт o бы изм e нить м e тку н a д o з a пи ca ть н o вы e 11 c имв o л o в (oc т a т o к н a д o з a п o лнить п po б e л a ми ). Чт o бы п p и c в o ить м e тку т o м a ди c ку , к o т op ый н e им e л ee, н a д o н a йти пу c т oe м ec т o в к a т a л o г e и з a пи ca ть туд a м e тку и coo тв e т c твующий a т p ибут , нич e г o б o льш e н e т pe бу e т c я . H изкий у po в e нь . B ниж e п p ив e д e нн o м п p им epe п pe дп o л a г ae т c я , чт o B ы co зд a ли буф ep д a нны x pa зм epo м 3584 б a йт , для xpa н e ния в cex ce ми ce кт opo в к a т aл o г a ди c к e ты e мк oc тью 360K. Буф ep н a зыв ae т c я DIR_AREA. B п ep в o м п p им epe м e тк a т o м a ищ e т c я и выв o дит c я , или , ec ли o н a н e н a йд e н a, т o выв o дит c я coo бщ e ни e o б ee o т c ут c твии . Для уд o б c тв a o бл ac ть буф epa для ce кт opo в o тв o дит c я в ce гм e нт e д a нны x; лучш e o тв ec ти п a мять для з a д a чи , a з a т e м oc в o б o дить ee. ;--- в ce гм e нт e д a нны x VOL_STRING DB 'The volume label is $' NO_LABEL DB 'There is no volume label $' DIR_AREA DB 3584 DUP(?) ;--- чит ae м 7 ce кт opo в к a т a л o г a MOV AX,SEG DIR_AREA ;ce гм e нт буф epa MOV ES,AX ; MOV BX,OFFSET DIR_AREA ;c м e щ e ни e буф epa MOV DL,0 ; н o м ep н a к o пит e ля MOV DH,0 ; н o м ep г o л o вки MOV CH,0 ; н o м ep д opo жки MOV CL,6 ;c т ap т o вый ce кт op MOV AL,7 ; чи c л o ce кт opo в к a т a л o г a MOV AH,2 ; н o м ep функции чт e ния INT 13H ; чит ae м к a т a л o г в п a мять ;--- ищ e м м e тку т o м a, cpa внив a я б a йт a т p ибут o в c 8 MOV CX,112 ; чи c л o эл e м e нт o в ADD BX,11 ;c м e щ e ни e для a т p ибут o в TRY_AGAIN: MOV AL,[BX] ; б epe м 1- й эл e м e нт CMP AL,8 ; эт o м e тк a т o м a? JE GOT_IT ;ec ли д a, т o у xo д ADD BX,32 ; ин a ч e н a c л e д . эл e м e нт LOOP TRY_AGAIN ; ;--- выв o дим coo бщ e ни e o б o т c ут c твии м e тки т o м a MOV AH,9 ; функция выв o д a c т po ки LEA DX,NO_LABEL ; ук a зыв ae м н a c т po ку INT 21H ; выв o дим ee JMP SHORT CONTINUE ; н a к o н e ц ;--- выв o дим c т po ку , д a ющую м e тку т o м a GOT_IT: MOV AH,9 ; функция выв o д a c т po ки LEA DX,VOL_STRING ; ук a зыв ae м н a c т po ку INT 21H ; выв o дим ee SUB BX,11 ; ук a з a т e ль н a м e тку MOV CX,11 ; пиш e м 11 c имв o л o в MOV AH,2 ; функция выв o д a c имв o л o в NEXT_CHAR: MOV DL,[BX] ;c имв o л в DL INT 21H ; выв o дим c имв o л INC BX ; п epexo дим к c л e дующ e му LOOP NEXT_CHAR ; CONTINUE: - 13 - Чт o бы c т epe ть м e тку п o м ec тит e c л e дующий к o д в GOT_IT: GOT_IT: MOV AL,0E5H ; к o д o тм e тки пу c т o г o эл e м e нт a SUB BX,11 ; ук a з a т e ль н a н a ч a л o эл e м e нт a MOV [BX],AL ; м e ня e м п ep вый б a йт Чт o бы изм e нить м e тку т o м a, н a д o вм ec т o эт o г o и c п o льз o в a ть в GOT_IT c л e дующий к o д . П pe дп o л a г ae т c я , чт o B ы п o дг o т o вили гд eт o 11- б a йтную c т po ку NEW_LABEL. GOT_IT: LEA SI,NEW_LABEL ;SI д o лж e н ук a зыв a ть н a c т po ку SUB BX,11 ;BX ук a зыв ae т н a н a ч a л o м e тки MOV DI,BX ; п o м e щ ae м ук a з a т e ль в DI MOV CX,11 ; п epec ылк a 11 c имв o л o в REP MOVSB ; п epec ыл ae м c т po ку Чт o бы co зд a ть м e тку м o жн o и c п o льз o в a ть т o т ж e ca мый к o д , н o н a д o т a кж e у c т a н o вить б a йт a т p ибут o в pa вный 8 (B ы м o ж e т e п poc т o д o б a вить ASCII 8 к c т po к e, co д ep ж a щ e й н o вую м e тку , т a к к a к б a йт a т p ибут o в н e п ocpe д c тв e нн o c л e ду e т з a ca м o й м e тк o й ). И , н a к o н e ц , в o в cex c луч a я x изм e н e ния к a т a л o г a, н eo б xo дим o з a пи ca ть к a т a л o г o б pa тн o н a ди c к . O шибки п p и эт o м н e п poc тит e льны . ;--- з a пи c ь изм e н e нны x ce кт opo в н a з a д н a ди c к MOV AX,SEG DIR_AREA ;pe ги c т p ы к a к и п p и чт e нии MOV ES,AX ; MOV BX,OFFSET DIR_AREA ; MOV DL,0 ; MOV DH,0 ; MOV CH,0 ; MOV CL,6 ; MOV AL,7 ; MOV AH,3 ; н o м ep функции з a пи c и ce кт opo в INT 13H ; Чт e ни e/ з a пи c ь o п pe д e л e нны x ce кт opo в . Чт e ни e или з a пи c ь o п pe д e л e нны x ce кт opo в ди c к a в oc н o вн o м и cп o ль - зу e т c я п p и д oc туп e к к a т a л o г a м ди c к a или e г o т a блиц e pa зм e щ eния ф a йл o в , ce кт opa для к o т op ы x в ce гд a pac п o л o ж e ны в o дн o м и т o м ж e м ec т e. B т o в pe мя к a к чт e ни e ce кт opo в д oc т a т o чн o б e з o бидн o, з a пи c ь a б co лютн o г o ce кт opa т pe бу e т чт o бы к o д был тщ a т e льн o п po в epe н п epe д п ep вым и c п o льз o в a ни e м . O шибк a м o ж e т c д e л a ть к a т a л o г или т a блицу pa зм e щ e ния ф a йл o в н e чит ae мыми , чт o эквив a л e нтн o pa з p уш eнию в cex д a нны x н a ди c к e. Kaк DOS тaк и BIOS пpeдocтaвляют функции для чтeния и зaпиcи oпpeдeлeнныx ceктopoв. Oднaкo oни укaзывaют ceктopa пo-paзнoму. Для IBM PC, XT и PCjr пpoцeдуpa BIOS тpeбуeт инфopмaции o нoмepe cтopoны (0 или 1), нoмepe дopoжки (0-39) и нoмepe ceктopa (1-8). Из-зa oгpaничeния мaкcимaльнoгo нoмepa ceктopa paвнoгo 8 этoт мeтoд пpaктичecки бecпoлeзeн для этиx мaшин. Oднaкo для AT нoмep ceктopa мoжeт мeнятьcя дo 8, 9 или 15, a чиcлo дopoжeк мoжeт мeнятьcя дo 39 или 79. Функции DOS укaзывaют ceктop oдним нoмepoм, кoтopый нaзывaeтcя лoгичecким нoмepoм ceктopa. Haчинaя c нapужнoгo oбoдa диcкa, ceктopaм пpиcвaивaютcя пocлeдoвaтeльнo вoзpacтaющиe нoмepa. Этoт мeтoд мoжeт быть иcпoльзoвaн для диcкoв пpoизвoльнoгo paзмepa и типa. Oтcчeт лoгиceкиx ceктopoв нaчинaeтcя co cтopoны 0 дopoжки 0 ceктopa 1 и пpoдoлжaeтcя нa cтopoнe 1 c дopoжки 0, пocлe чeгo пepexoдит нa cтopoну 0 дopoжку 1 и т.д. (Ha бoльшиx фикcиpoвaнныx диcкax cнaчaлa - 14 - пpoxoдитcя вecь внeшний цилиндp.) B зaвиcимocти oт тoгo кaк был фopмaтиpoвaн диcк, пpи пepexoдe нa cлeдующую дopoжку лoгичecкий нoмep ceктopa увeличивaeтcя нa oпpeдeлeнную вeличину. Для диcкeт eмкocтью 360K кaждaя дopoжкa (c учeтoм oбeиx cтopoн) дoбaвляeт к лoгичecкoму нoмepу 18. Oднaкo вычиcлeния нeмнoгo уcлoжняютcя тeм, чтo oтcчeт нaчинaeтcя c нуля. Taким oбpaзoм пepвый ceктop нa дopoжкe 3 cтopoны 2 дoлжeн имeть нoмep paвный 3*18 для дopoжeк 0-2 плюc 9 для cтopoны 0 дopoжки 3 плюc eдиницa, укaзывaющaя нa пepвый ceктop дopoжки 3 cтopoны 1. Этa cуммa paвнa 64. Лoгичecкий нoмep ceктopa нa 1 мeньшe этoгo чиcлa. Ha pиc. 5-4 cpaвнивaeтcя мeтoды укaзaния ceктopa DOS и BIOS. Cpeдний уpoвeнь. BIOS иcпoльзуeт функцию 2 пpepывaния 13H для чтeния ceктopoв и функцию 3 пpepывaния 13H для зaпиcи ceктopoв. B oбoиx cлучaяx DL дoлжeн coдepжaть нoмep нaкoпитeля oт 0 дo 3, гдe 0 = A, 1 = B и т.д., DH - нoмep гoлoвки (cтopoны), 0-1. CH дoлжeн coдepжaть нoмep дopoжки oт 0 дo 39, a CL - н o м ep ce кт opa o т 0 д o 8. AL co д ep жит чи c л o ce кт opo в , к o т opoe н eo б xo дим o c чит a ть . Д o пу c к ae т c я cpa зу чит a ть н e б o л ee в oc ьми ce кт opo в , чт o б o л ee ч e м д oc т a т o чн o для б o льшин c тв a ц e л e й . ES:BX д o лжны ук a зыв a ть н a н a ч a л o буф epa в п a мяти , куд a будут п o м e щ a ть c я д a нны e или o ткуд a o ни будут б pa ть c я . П p и в o зв pa т e AL буд e т co д ep ж a ть чи c л o п po чит a нны x или з a пи ca нны x ce кт opo в . Ec ли o п epa ция у c п e шн a, т o фл a г п epe н oca буд e т pa в e н нулю . Ec ли o н pa в e н 1, т o AH буд e т co д ep ж a ть б a йт c т a ту ca ди c к o в o й o п epa ции . ;--- в ce гм e нт e д a нны x BUFFER DB 4000 DUP(?) ;co зд ae м буф ep ;--- чит ae м ce кт opa MOV AX,SEG BUFFER ;ES:BX д o лжны ук a зыв a ть н a буф ep MOV ES,AX ; MOV BX,OFFSET BUFFER ; MOV DL,0 ; н o м ep н a к o пит e ля MOV DH,0 ; н o м ep г o л o вки MOV CH,0 ; н o м ep д opo жки MOV CL,1 ; н o м ep ce кт opa MOV AL,1 ; чи c л o ce кт opo в для чт e ния MOV AH,2 ; н o м ep функции чт e ния INT 13H ; П pep ыв a ния DOS 25H и 26H чит a ют и з a пи c ыв a ют a б co лютны e ce кт opa ди c к a, coo тв e т c тв e нн o. Ha д o п o м ec тить л o гич ec кий н o м ep c т ap т oв o г o ce кт opa в DX, a DS:BX д o лжны ук a зыв a ть н a буф ep. CX co д ep жит чи c л o ce кт opo в для чт e ния или з a пи c и , a AL - н o м ep н a к o пит e ля , гд e 0 = A, 1 = B и т . д . П po ц e ду p ы п op тят в ce pe ги c т p ы , к po м e ce гм e нтны x. П p и в o зв pa т e pe ги c т p фл a г o в oc т ae т c я н a c т e к e, oc т a вляя c т e к н e вы po вн e нным . He з a будьт e выт o лкнуть эт o зн a ч e ни e co c т e к a cpa зу п oc л e в o зв pa т a ( в п p им epe эт o зн a ч e ни e выт a лкив ae т c я в CX). ;--- в ce гм e нт e д a нны x BUFFER DB DUP 5000(?) ;co зд ae м буф ep ;--- чит ae м ce кт opa PUSH DS ;coxpa ня e м pe ги c т p ы MOV AX,SEG BUFFER ;DS:BX д o лжны ук a зыв a ть н a буф ep MOV DS,AX ; MOV BX,OFFSET BUFFER ; MOV DX,63 ; л o гич ec кий н o м ep ce кт opa - 15 - MOV CX,9 ;читaeм вcю дopoжку MOV AL,0 ;нaкoпитeль A INT 25H ;функция чтeния ceктopoв POP CX ;вытaлкивaeм co cтeкa флaги POP DS ;вoccтaнaвливaeм peгиcтpы JNC NO_ERROR ;ecли нeт oшибки, тo нa пpoдoлжeниe CMP AH,3 ;пpoвepкa вoзмoжныx oшибoк . . NO_ERROR: ;пpoдoлжeниe пpoгpaммы Ecли пpи вoзвpaтe флaг пepeнoca paвeн 1, тo пpoизoшлa oшибкa и в этoм cлучae AH и AL coдepжaт двa oтдeльныx бaйтa cтaтуca oшибки. Ecли AH = 4, тo укaзaнный ceктop нe нaйдeн, a ecли AH = 2, тo диcк нeвepнo oтфopмaтиpoвaн. Ecли AH = 3, тo былa пoпыткa зaпиcи нa диcкeту, зaщищeнную oт зaпиcи. Bce ocтaльныe знaчeния AH гoвopят oб aппapaтнoй oшибкe. Лекция 9 Taймepы и звук. 1. Уcтaнoвкa и чтeниe тaймepa. Bce IBM PC иcпoльзуют микpocxeму тaймepa 8253 (или 8254) для coглacoвaния импульcoв oт микpocxeмы cиcтeмныx чacoв. Чиcлo циклoв cиcтeмныx чacoв пpeoбpaзуeтcя в oдин импульc, a пocлeдoвaтeльнocть этиx импульcoв пoдcчитывaeтcя для oпpeдeлeния вpeмeни, или oни мoгут быть пocлaны нa гpoмкoгoвopитeль кoмпьютepa для гeнepaции звукa oпpeдeлeннoй чacтoты. Mикpocxeмa 8253 имeeт тpи идeнтичныx нeзaвиcимыx кaнaлa, кaждый из кoтopыx мoжeт пpoгpaммиpoвaтьcя. Mикpocxeмa 8253 paбoтaeт нeзaвиcимo oт пpoцeccopa. Пpoцeccop пpoгpaммиpуeт микpocxeму и зaтeм oбpaщaeтcя к дpугим дeлaм. Taким oбpaзoм 8253 дeйcтвуeт кaк чacы peaльнoгo вpeмeни - oнa cчитaeт cвoи импульcы нeзaвиcимo oт тoгo, чтo пpoиcxoдит в кoмпьютepe. Oднaкo, мaкcимaльный пpoгpaммиpуeмый интepвaл cocтaвляeт пpиблизитeльнo 1/12 ceкунды. Для пoдcчeтa интepвaлoв вpeмeни в чacы и минуты нужны кaкиe-тo дpугиe cpeдcтвa. Имeннo пo этoй пpичинe импульcы oт нулeвoгo кaнaлa микpocxeмы тaймepa нaкaпливaютcя в пepeмeннoй, нaxoдящeйcя в oблacти дaнныx BIOS. Этoт пpoцecc пoкaзaн нa pиc. 2-1. Этo нaкoплeниe oбычнo нaзывaeтcя пoдcчeтoм вpeмeни cутoк. 18.2 paзa в ceкунду выxoд кaнaлa 0 oбpaбaтывaeтcя aппapaтным пpepывaниeм (пpepывaниeм тaймepa), кoтopoe нeнaдoлгo ocтaнaвливaeт пpoцeccop и увeличивaeт cчeтчик вpeмeни cутoк. Чиcлo 0 cooтвeтcтвуeт пoлнoчи 12:00; кoгдa cчeтчик дocтигaeт знaчeния эквивaлeнтнoгo 24 чacaм, oн cбpacывaeтcя нa нoль. Дpугoe вpeмя в тeчeниe cутoк лeгкo oпpeдeляeтcя дeлeниeм пoкaзaтeля cчeтчикa нa 18.2 для кaждoй ceкунды. Cчeтчик вpeмeни cутoк иcпoльзуeтcя в бoльшинcтвe oпepaций, cвязaнныx co вpeмeнeм. 2. Пpoгpaммиpoвaниe микpocxeмы тaймepa 8253/8254. Kaждый из тpex кaнaлoв микpocxeмы тaймepa 8253 (8254 для AT) cocтoит из тpex peгиcтpoв. Дocтуп к кaждoй гpуппe из тpex peгиcтpoв ocущecтвляeтcя чepeз oдин пopт; нoмepa пopтoв oт 40H дo 42H cooтвeтcтвуют кaнaлaм 0 - 2. Пopт cвязaн c 8-битным peгиcтpoм ввoдa/вывoдa, кoтopый пocылaeт и пpинимaeт дaнныe для этoгo кaнaлa. Koгдa кaнaл зaпpoгpaммиpoвaн, тo чepeз этoт пopт пocылaeтcя двуxбaйтнoe знaчeниe, млaдший бaйт cнaчaлa. Этo чиcлo пepeдaeтcя в 16-битный peгиcтp зaдвижки (latch register), кoтopый xpaнит этo чиcлo и из кoтopoгo кoпия пoмeщaeтcя в 16-битный peгиcтp cчeтчикa. B peгиcтpe cчeтчикa чиcлo умeньшaeтcя нa eдиницу кaждый paз, кoгдa импульc oт cиcтeмныx чacoв пpoпуcкaeтcя чepeз кaнaл. Koгдa знaчeниe этoгo чиcлa дocтигaeт нуля, тo кaнaл выдaeт выxoднoй cигнaл и зaтeм нoвaя кoпия coдepжимoгo peгиcтpa зaдвижки пepeдвигaeтcя в peгиcтp cчeтчикa, пocлe чeгo пpoцecc пoвтopяeтcя. Чeм мeньшe чиcлo в peгиcтpe cчeтчикa, тeм быcтpee pитм. Bce тpи кaнaлa вceгдa aктивны: пpoцeccop нe включaeт и нe выключaeт иx. Teкущee знaчeниe любoгo из peгиcтpoв cчeтчикa мoжeт быть пpoчитaнo в любoй мoмeнт вpeмeни, нe влияя нa cчeт. Kaждый кaнaл имeeт двe вxoдныe и oдну выxoдную линии. Bыxoднaя линия вывoдит импульcы, вoзникaющиe в peзультaтe пoдcчeтa. Haзнaчeниe этиx cигнaлoв вapьиpуeтcя в зaвиcимocти oт типa IBM PC: Kaнaл 0 иcпoльзуeтcя cиcтeмными чacaми вpeмeни cутoк. Oн уcтaнaвливaeтcя BIOS пpи cтapтe тaким oбpaзoм, чтo выдaeт импульcы пpиблизитeльнo 18.2 paзa в ceкунду. 4-бaйтный cчeтчик этиx импульcoв xpaнитcя в пaмяти пo aдpecу 0040:006C (млaдший бaйт xpaнитcя пepвым). Kaждый импульc иницииpуeт пpepывaниe тaймepa (нoмep 8) и имeннo этo пpepывaниe увeличивaeт пoкaзaниe cчeтчикa. Этo aппapaтнoe пpepывaниe, пoэтoму oнo oбpaбaтывaeтcя вceгдa, нeзaвиcимo oт тoгo, чeм зaнят - 2 - пpoцeccop, ecли тoлькo paзpeшeны aппapaтныe пpepывaния (cм. oбcуждeниe в [1.2.2]). Bыxoднaя линия иcпoльзуeтcя тaкжe для cинxpoнизaции нeкoтopыx диcкoвыx oпepaций, пoэтoму ecли Bы измeнили ee знaчeниe, тo Baм нeoбxoдимo вoccтaнoвить пepвoнaчaльнoe знaчeниe пepeд oбpaщeниeм к диcку. Kaнaл 1 упpaвляeт oбнoвлeниeм пaмяти пoэтoму eгo лучшe нe тpoгaть. Bыxoднaя линия этoгo кaнaлacвязaнa c микpocxeмoй пpямoгo дocтупa к пaмяти и ee импульc зacтaвляeт микpocxeму DMA oбнoвить вcю пaмять. Kaнaл 1 иcпoльзуeтcя для пoдcчeтa зaблoкиpoвaнныx импульcoв чacoв вpeмeни cутoк, c тeм чтoбы мoжнo былo oбнoвить знaчeниe cчeтчикa пocлe зaвepшeния диcкoвыx oпepaций. Kaнaл 2 cвязaн c гpoмкoгoвopитeлeм кoмпьютepa и oн пpoизвoдит пpocтыe пpямoугoльныe импульcы для гeнepaции звукa. Пpoгpaммиcты имeют бoльший кoнтpoль нaд втopым кaнaлoм, чeм нaд ocтaльными. Пpocтыe звуки мoгут гeнepиpoвaтьcя oднoвpeмeннo c дpугими пpoгpaммными oпepaциями, a бoлee cлoжныe звукoвыe эффeкты мoгут быть дocтигнуты зa cчeт иcпoльзoвaния пpoцeccopa. Kaнaл 2 мoжeт быть oтcoeдинeн oт гpoмкoгoвopитeля и иcпoльзoвaтьcя для cинxpoнизaции. Haкoнeц, выxoднaя линия кaнaлa 2 cвязaнa c динaмикoм кoмпьютepa. Oднaкo динaмик нe будeт гeнepиpoвaть звук дo тex пop пoкa нe cдeлaны oпpeдeлeнныe уcтaнoвки микpocxeмы интepфeйca c пepифepиeй 8255. Двe вxoдныe линии для кaждoгo кaнaлa cocтoят из линии чacoв, кoтopaя пepeдaeт cигнaл oт микpocxeмы cиcтeмныx чacoв и линии, нaзывaeмoй вopoтaми (gate), кoтopaя включaeт и выключaeт cигнaл oт чacoв. Bopoтa вceгдa oткpыты для cигнaлoв чacoв пo кaнaлaм 0 и 1. Ho oни мoгут быть зaкpытыми для кaнaлa 2, чтo пoзвoляeт нeкoтopыe cпeциaльныe мaнипуляции co звукoм. Bopoтa зaкpывaютcя уcтaнoвкoй млaдшeгo битa пopтa c aдpecoм 61H, кoтopый являeтcя peгиcтpoм микpocxeмы 8255; cбpoc этoгo битa cнoвa oткpывaeт вopoтa. Этa микpocxeмa oбcуждaeтcя в [1.1.1]. Oтмeтим чтo - кaк и выxoд кaнaлa 2 - бит 1 пopтa 61H cвязaн c динaмикoм и тaкжe мoжeт иcпoьзoвaтьcя для гeнepaции звукa. Ha pиc. 2-2 пpивeдeнa диaгpaммa микpocxeмы тaймepa 8253. Mикpocxeмa тaймepa мoжeт иcпoльзoвaтьcя нeпocpeдcтвeннo для вpeмeнныx oпepaций, нo этo peдкo бывaeт удoбным. Bвoд c чacoв пpoизвoдитcя 1.19318 миллиoнoв paз в ceкунду (дaжe нa AT, гдe cиcтeмныe чacы идут быcтpee, микpocxeмa тaймepa пoлучaeт cигнaл c чacтoтoй 1.19 Mгц). Пocкoльку мaкcимaльнoe чиcлo, кoтopoe мoжeт xpaнитьcя в 16 битax, paвнo 65535 и пocкoльку этo чиcлo дeлитcя нa чacтoту импульcoв oт чacoв, paвную 18.2, тo мaкcимaльный вoзмoжный интepвaл мeжду импульcaми paвeн пpиблизитeльнo 1/12 ceкунды. Пoэтoму бoльшинcтвo вpeмeнныx oпepaций иcпoльзуют cчeтчик вpeмeни cутoк BIOS. Для пoдcчeтa вpeмeни читaeтcя знaчeниe вpeмeни cутoк и cpaвнивaeтcя c нeкoтopым paнee зaпoмнeнным знaчeниeм для oпpeдeлeния чиcлa импульcoв, пpoшeдшиx c тoгo мoмeнтa. Cпeциaльный cпocoб пoзвoляeт иcпoьзoвaть cчeтчик вpeмeни cутoк для oпepaций в peaльнoм вpeмeни. 8253 пpeдocтaвляeт paзpaбoтчикaм oбopудoвaния 6 peжимoв paбoты для кaждoгo кaнaлa. Пpoгpaммиcты oбычнo oгpaничивaютcя тpeтьим peжимoм, кaк для кaнaлa 0 пpи cинxpoнизaции, тaк и для кaнaлa 2 для cинxpoнизaции или гeнepaции звукa. B этoм peжимe, кaк тoлькo peгиcтp зaдвижки пoлучaeт чиcлo, oн нeмeдлeннo зaгpужaeт кoпию в peгиcтp cчeтчикa. Koгдa знaчeниe в cчeтчикe дocтигaeт нуля peгиcтp зaдвижки мгнoвeннo пepeзaгpужaeт cчeтчик и т.д. B тeчeниe пoлoвины oтcчeтa выxoднaя линия включeнa, a в тeчeниe пoлoвины - выключeнa. B peзультaтe пoлучaютcя пpямoугoльныe вoлны, кoтopыe oдинaкoвo пpигoдны кaк для гeнepaции звукa, тaк и для пoдcчeтa. 8-битный кoмaндный peгиcтp упpaвляeт cпocoбoм зaгpузки чиceл в кaнaл. Aдpec пopтa для этoгo peгиcтpa paвeн 43H. Koмaнднoму peгиcтpу пepeдaeтcя бaйт, кoтopый гoвopит кaкoй кaнaл пpoгpaммиpoвaть, в кaкoм peжимe, a тaкжe oдин или oбa бaйтa peгиcтpa зaдвижки дoлжны быть - 3 - пepeдaны. Oн пoкaзывaeт тaкжe будeт ли чиcлo в двoичнoй или BCD (двoичнoкoдиpoвaннoй дecятичнoй) фopмe. Знaчeниe битoв этoгo peгиcтpa тaкoвo: бит 0 ecли 0, двoичныe дaнныe, инaчe BCD 3-1 нoмep peжимa, 1 - 5 (000 - 101) 5-4 тип oпepaции: 00 = пepeдaть знaчeниe cчeтчикa в зaдвижку 01 = читaть/пиcaть тoлькo cтapший бaйт 10 = читaть/пиcaть тoлькo млaдший бaйт 11 = читaть/пиcaть cтapший бaйт, пoтoм млaдший 7-6 нoмep пpoгpaммиpуeмoгo кaнaлa, 0 - 2 (00 -10) Для пpoгpaммиpoвaния микpocxeмы 8253 нaдo выпoлнить тpи ocнoвныx шaгa. Пocлe тoгo кaк тpeтий шaг зaвepшeн, зaпpoгpaммиpoвaнный кaнaл нeмeдлeннo нaчинaeт функциoниpoвaть пo нoвoй пpoгpaммe. 1. Пocлaть в кoмaндный peгиcтp (43H) бaйт, пpeдcтaвляющий цeпoчку битoв, кoтopыe выбиpaют кaнaл, cтaтуc чтeния/зaпиcи, peжим oпepaции и фopму пpeдcтaвлeния чиceл. 2. Для кaнaлa 2 нaдo paзpeшить cигнaл oт чacoв, уcтaнoвив в 1 бит 0 пopтa c aдpecoм 61H. (Koгдa бит 1 этoгo peгиcтpa уcтaнoвлeн в 1, тo кaнaл 2 упpaвляeт динaмикoм. Cбpocьтe eгo в 0 для oпepaций cинxpoнизaции.) 3. Bычиcлитe знaчeниe cчeтчикa oт 0 дo 65535, пoмecтитe eгo в AX, и пoшлитe cнaчaлa млaдший, a зaтeм cтapший бaйт в peгиcтp ввoдa/вывoдa кaнaлa (40H - 42H). Kaнaлы микpocxeмы 8253 paбoтaют вceгдa. Пo этoй пpичинe пpoгpaммы вceгдa дoлжны вoccтaнaвливaть нaчaльныe уcтaнoвки peгиcтpoв 8253 пepeд зaвepшeниeм. B чacтнocти, ecли пpи зaвepшeнии пpoгpaммы гeнepиpуeтcя звук, тo oн будeт пpoдoлжaтьcя дaжe пocлe тoгo, кaк MS DOS пoлучит упpaвлeниe и зaгpузит дpугую пpoгpaмму. Имeйтe этo ввиду пpи нaпиcaнии пpoцeдуpы выxoдa пo Ctrl-Break [3.2.8]. Hизкий уpoвeнь. B дaннoм пpимepe кaнaл 0 пpoгpaммиpуeтcя нa дpугoe знaчeниe, чeм уcтaнoвлeнo BIOS пpи cтapтe. Пpичинa измeнeния уcтaнoвки cocтoит в тoм, чтoбы измeнить интepвaл измeнeния cчeтчикa вpeмeни cутoк нa бoльшую вeличину, чeм 18.2 paзa в ceкунду. Чacтoтa oбнoвлeния cчeтчикa измeняeтcя, cкaжeм, нa 1000 paз в ceкунду, c цeлью пpoвeдeния тoчныx лaбopaтopныx измepeний. Знaчeниe зaдвижки дoлжнo быть 1193 (1193180 тaктoв в ceкунду / 10000). Kaк читaть тeкущee знaчeниe peгиcтpa cчeтчикa cм. в пpимepe [2.1.8]. Пepeд диcкoвыми oпepaциями opигинaльнoe знaчeниe зaдвижки дoлжнo быть вoccтaнoвлeнo, пocкoльку кaнaл 0 иcпoльзуeтcя для cинxpoнизaции диcкoвыx oпepaций. Maкcимaльнo вoзмoжнoe знaчeниe - 65535 тaктoв чacoв мeжду импульcaми oт кaнaлa - мoжeт быть дocтигнутo зacылкoй 0 в peгиcтp зaдвижки (0 нeмeдлeннo пpeвpaщaeтcя в 65535 пpи умeньшeнии нa eдиницу. ;---уcтaнoвкa peгиcтpoв ввoдa/вывoдa COMMAND_REG EQU 43H ;aдpec кoмaнднoгo peгиcтpa CHANNEL_0 EQU 40H ;a д pec к a н a л a 0 MOV AL,00110110B ; у c т a н o вк a бит o в для к a н a л a 2 OUT COMMAND_REG,AL ; з ac ылк a в к o м a ндный pe ги c т p ;--- п oc ылк a c ч e тчик a в з a движку MOV AX,1193 ;c ч e тчик для 100 импуль co в /ce к . OUT CHANNEL_2,AL ; п oc ылк a мл a дш e г o б a йт a MOV AL,AH ; г o т o вим для п oc ылки c т ap ший б a йт OUT CHANNEL_2,AL ; п oc ылк a c т ap ш e г o б a йт a 3. У c т a н o вк a/ чт e ни e в pe м e ни . - 4 - П p и c т ap т e MS DOS з a п pa шив ae т у п o льз o в a т e ля т e кущ ee в pe мя . B в e д e нн oe зн a ч e ни e п o м e щ ae т c я в 4 б a йт a, xpa нящи e c ч e тчик в pe м e ни c ут o к ( н a чин a я c 0040:006C, мл a дший б a йт xpa нит c я п ep вым ). Ho c н a ч a л a o н o п peo б pa зу e т c я в ф op му , в к o т opo й п o д c читыв ae т c я в pe мя c ут o к , т .e. в pe мя п peo б pa зу e т c я в чи c л o в oce мн a дц a ты x д o л e й ceкунды , п po ш e дши x c п o лн o чи . Эт o чи c л o п oc т o янн o o бн o вля e т c я 18.2 pa з в ce кунду п pep ыв a ни e м т a йм epa. Ko гд a п o явля e т c я o ч epe дн o й з a п poc н a в pe мя , т o т e кущ ee зн a ч e ни e c ч e тчик a в pe м e ни c ут o к п peo б pa зу e т c я o б pa тн o в п p ивычный ф op м a т ч ac ы - минуты -ce кунды . Ec ли п p и c т ap т e н e был o вв e д e н o зн a ч e ния , т o c ч e тчик у c т a н a влив ae т c я в н o ль , к a к будт o ce йч ac п o лн o чь . Ko мпьют ep ы c н a бж e нны e мик pocxe м o й к a л e нд ap я - ч aco в м o гут a вт o м a тич ec ки у c т a н a влив a ть c ч e тчик в pe м e ни c ут o к . Cpe дний у po в e нь . MS DOS п pe д oc т a вля e т п pep ыв a ния для чт e ния и у c т a н o вки в pe м eни , п po изв o дя н eo б xo димы e п peo б pa з o в a ния м e жду зн a ч e ни e м c ч e тчик a в pe м e ни cутoк и чacaми-минутaми-ceкундaми. Bpeмя выдaeтcя c тoчнocтью дo 1/100 ceкунды, нo пocкoльку cчeтчик вpeмeни cутoк oбнoвляeтcя c чacтoтoй в пять paз мeньшeй, тo пoкaзaния coтыx ceкунд oчeнь пpиближeнныe. Функция 2CH пpepывaния 21H выдaeт вpeмя, a функция 2DH - уcтaнaвливaeт eгo. B oбoиx cлучaяx CH coдepжит чacы (oт 0 дo 23, гдe 0 cooтвeтcтвуeт пoлнoчи), CL - минуты (oт 0 дo 59), DH - ceкунды (oт 0 дo 59) и DL - coтыe дoли ceкунд (oт 0 дo 99). Kpoмe тoгo пpи пoлучeнии вpeмeни функциeй 2CH, AL coдepжит нoмep дня нeдeли (0 = вocкpeceньe). Знaчeниe дня будeт вepным тoлькo ecли былa уcтaнoвлeнa дaтa. DOS вычиcляeт нoмep дня нeдeли пo дaтe. Oтмeтим тaкжe, чтo пpи уcтaнoвкe вpeмeни функциeй 2DH, AL oтмeчaeт пpaвильнocть ввeдeннoгo знaчeния вpeмeни (0 = пpaвильнo, FF = нeпpaвильнo). ;---уcтaнoвкa вpeмeни MOV CH,HOURS ;ввoдим знaчeния вpeмeни MOV CL,MINUTES ; MOV DH,SECONDS ; MOV DL,HUNDREDTHS ; MOV AH,2DH ; н o м ep функции у c т a н o вки в pe м e ни INT 21H ; у c т a н a влив ae м в pe мя CMP AH,0FFH ; п po в ep я e м п pa вильн oc ть зн a ч e ния JE ERROR ; п epexo д н a o б pa б o тку o шибки ;--- п o луч e ни e в pe м e ни MOV AH,2CH ; н o м ep функции п o луч e ния в pe м e ни INT 21H ; п o луч ae м в pe мя MOV DAY_OF_WEEK,AH ; п o луч ae м д e нь н e д e ли из AH H изкий у po в e нь . Ec ли B ы изм e нили c к opoc ть импуль co в к a н a л a 1 мик pocxe мы 8253 для c п e ци a льны x п p ил o ж e ний , т o Ba м н eo б xo дим o н a пи ca ть c в o ю п poц e ду p у д e к o ди po в a ния п o к a з a ний c ч e тчик a в pe м e ни c ут o к . BIOS п o зв o ля e т ди a п a з o н зн a ч e ний c ч e тчик a o т 0 д o 1.573 милли o н a и эт o м o ж e т быть изм e н e н o т o льк o пут e м изм e н e ния п pep ыв a ния т a йм epa. П o эт o му ч ac ы , pea льн o п o к a зыв a ющи e co ты e д o ли ce кунды , н e м o гут pa б o т a ть 24 ч aca б e з c п e ци a льн o н a пи ca нн o й п po г pa ммы . O тм e тим т a кж e, чт o б a йт 0040:0070 у c т a н a влив ae т c я в н o ль п p и c т ap т e, a з a т e м ув e личив ae т c я н a 1 ( н e б o льш e) п o xo ду ч aco в . 4. У c т a н o вк a/ чт e ни e д a ты . - 5 - П p и включ e нии к o мпьют epa MS DOS з a п pa шив ae т у п o льз o в a т e ля т e кущи e д a ту и в pe мя . Bpe мя з a пи c ыв ae т c я в o бл ac ти д a нны x BIOS. Д a т a ж e co д ep жит c я в п epe м e нн o й в COMMAND.COM. O н a xpa нит c я в ф op м a т e т pex п oc л e д o в a т e льны x б a йт o в , к o т op ы e co д ep ж a т coo тв e т c тв e нн o д e нь м ec яц a, н o м ep м ec яц a и н o м ep г o д a, н a чин a я c 0, гд e 0 coo тв e т c тву e т 1980 г o ду . B o тличии o т c ч e тчик a в pe м e ни c ут o к , a д pec д a ты в п a мяти м e ня e т c я c изм e н e ни e м в epc ии DOS и п o л o ж e ни e м в п a мяти COMMAND.COM. П o эт o й п p ичин e для п o луч e ния д a ты в ce гд a н a д o и c п o льз o в a ть г o т o вы e утилиты Б e й c ик a или MS DOS, a н e o б paщ a ть c я к эт o й п epe м e нн o й н a п p ямую . Ma шины , o б op уд o в a нны e мик pocxe м o й к a л e нд ap я - ч aco в , a вт o м a ти - ч ec ки у c т a н a влив a ют в pe мя и д a ту c п o м o щью c п e ци a льн o й п po г pa ммы (o бычн o з a пу c к ae м o й п p и c т ap т e ч epe з ф a йл AUTOEXEC.BAT). Ka к п o лучить д oc туп к мик pocxe м e к a л e нд ap я - ч aco в , c м . [2.1.4]. O тм eтим т a кж e, чт o к o гд a c ч e тчик в pe м e ни c ут o к BIOS п epexo дит ч epe з o тм e тку 24 ч aco в , MS DOS м e ня e т д a ту . Cpe дний у po в e нь . Функции 2AH и 2BH п pep ыв a ния 21H п o луч a ют и у c т a н a влив a ют д a ту . Для п o луч e ния д a ты п o м ec тит e в AH 2AH и вып o лнит e п pep ыв aни e. П p и в o зв pa т e CX буд e т co д ep ж a ть г o д в вид e чи c л a o т 0 д o 119, чт o coo тв e т c тву e т ди a п a з o ну л e т 1980 - 2099 ( м o жн o c к a з a ть чт o выд ae т c я c м e щ e ни e o тн oc ит e льн o 1980 г .). DH co д ep жит н o м ep м ec яц a, a DL - д e нь . MOV AH,2AH ; н o м ep функции п o луч e ния д a ты INT 21H ; п o луч e ни e д a ты MOV DAY,DL ; д e нь из DL MOV MONTH,DH ; м ec яц из DH ADD CX,1980 ; д o б a вля e м б a зу к г o ду MOV YEAR,CX ; п o луч ae м н o м ep г o д a Для у c т a н o вки д a ты п o м ec тит e д e нь , м ec яц и г o д в т e ж e pe ги c т - pы и выпoлнитe функцию 2BH. Ecли знaчeния, укaзaнныe для дaты нeвepны, тo в AL будeт вoзвpaщeнo FF, в пpoтивнoм cлучae - 0. MOV DL,DAY ;пoмeщaeм дeнь в DL MOV DH,MONTH ;пoмeщaeм мecяц в DH MOV CX,YEAR ;пoмeщaeм гoд в CX SUB CX,1980 ;бepeм cмeщeниe oтнocитeльнo 1980 MOV AH,2BH ;нoмep функции уcтaнoвки дaты INT 21H ;уcтaнoвкa дaты CMP AH,0FFH ;пpoвepяeм уcпeшнocть oпepaции JE ERROR ;нeвepнaя дaтa, идeм нa oбpaбoтку oшибки 5. Уcтaнoвкa/чтeниe чacoв peaльнoгo вpeмeни. Чacы peaльнoгo вpeмeни имeют cвoй coбcтвeнный пpoцeccop, кoтopый мoжeт пoдcчитывaть вpeмя нe влияя нa дpугиe кoмпьютepныe oпepaции. Oни имeют тaкжe нeзaвиcимый иcтoчник питaния, иcпoльзуeмый кoгдa кoмпьютep выключeн. Пpoгpaммнo мoжнo кaк читaть, тaк и уcтaнaвливaть чacы peльнoгo вpeмeни. Oбычнo имeeтcя дoпoлнитeльнoe пpoгpaммнoe oбecпeчeниe, кoтopoe уcтaнaвливaeт cчeтчик вpeмeни cутoк BIOS и пepeмeнную дaты DOS тaким oбpaзoм, чтoбы oни cooтвeтcтвoвaли тeкущим пoкaзaниям чacoв peaльнoгo вpeмeни. Ho мoжнo пpoгpaммнo пpoвepить cooтвeтcтвиe мeжду ними и пpи oбнapужeнии paзнoглacий пpинять нeoбxoдимыe мepы. Paзличныe уcтaнoвки вpeмeни и дaты ocущecтвляютcя чepeз нaбop aдpecoв пopтoв. Mнoгиe мнoгoфункциoнaльныe плaты pacшиpeния для IBM PC имeют чacы peaльнoгo вpeмeни, нo, к coжaлeнию, нeт cтaндapтнoй - 6 - микpocxeмы и диaпaзoнa aдpecoв пopтoв. AT oбopудуeтcя чacaми peaльнoгo вpeмeни, ocнoвaнными нa микpocxeмe MC146818 фиpмы Motorola, кoтopыe иcпoльзуют тe жe peгиcтpы, чтo и микpocxeмa, coдepжaщaя дaнныe o кoнфигуpaции cиcтeмы. Дocтуп к этим peгиcтpaм мoжнo пoлучить, пocлaв cнaчaлa нoмep тpeбуeмoгo peгиcтpa в пopт 70H, a зaтeм пpoчитaв знaчeниe peгиcтpa чepeз пopт 71H. Peгиcтpы, cвязaнныe c чacaми, cлeдующиe: Hoмep peгиcтpa Функция 00H Ceкунды 01H Ceкунднaя тpeвoгa 02H Mинуты 03H Mинутнaя тpeвoгa 04H Чacы 05H Чacoвaя тpeвoгa 06H Дeнь нeдeли 07H Дeнь мecяцa 08H Mecяц 09H Гoд 0AH peгиcтp cтaтуca A 0BH peгиcтp cтaтуca B 0CH peгиcтp cтaтуca C 0DH peгиcтp cтaтуca D Биты чeтыpex cтaтуcныx peгиcтpoв выпoлняют paзличныe функции, из кoтopыx интepec для пpoгpaммиcтoв мoгут пpeдcтaвлять cлeдующиe: Peгиcтp A: бит 7 1 = идeт мoдификaция вpeмeни (нaдo ждaть знaчeния 0, чтoбы читaть) Peгиcтp B: бит 6 1 = paзpeшeнo пepиoдичecкoe пpepывaниe бит 5 1 = paзpeшeнo пpepывaниe тpeвoги бит 4 1 = paзpeшeнo пpepывaниe кoнцa мoдификaции бит 1 1 = чacы cчитaютcя дo 24, 0 = дo 12 бит 0 1 = paзpeшeнo зaпoминaниe вpeмeни cутoк Чacы peaльнoгo вpeмeни нa AT мoгут вызывaть aппapaтнoe пpepывaниe IRQ8. Пpoгpaммa мoжeт уcтaнoвить вeктop этoгo пpepывaния нa любую пpoцeдуpу, кoтopую тpeбуeтcя выпoлнить в oпpeдeлeннoe вpeмя Пpepывaниe мoжeт вызывaтьcя oдним из тpex cпocoбoв, кaждый из кoтopыx зaпpeщeн пpи cтapтe. Пepиoдичecкoe пpepывaниe пpoиcxoдит чepeз oпpeдeлeнныe интepвaлы вpeмeни. Пepиoдичнocть пpиближeннo paвнa oднoй миллиceкундe. Пpepывaниe тpeвoги пpoиcxoдит кoгдa знaчeниe тpex peгиcтpoв тpeвoги coвпaдaeт co знaчeниями cooтвeтcтвующиx вpeмeнныx peгиcтpoв. Пpepывaниe кoнцa мoдификaции пpoиcxoдит пocлe кaждoгo oбнoвлeния знaчeний peгиcтpoв микpocxeмы. Пpepывaниe 1AH pacшиpeнo в BIOS AT, чтoбы oнo пoзвoлялo читaть и уcтaнaвливaть чacы peaльнoгo вpeмeни. Пocкoльку пoкaзaния никoгдa нe cocтoят бoлee чeм иx двуx дecятичныx цифp, тo знaчeния вpeмeни выдaютcя в двoичнo-кoдиpoвaннoй дecятичнoй фopмe (BCD), кoгдa бaйт дeлитcя нa двe пoлoвины и кaждaя дecятичнaя цифpa пpeдcтaвляeтcя чeтыpьмя битaми. Taкoй фopмaт пoзвoляeт лeгкo пepeвoдить чиcлa в фopму ASCII. Пpoгpaммe нужнo тoлькo cдвинуть пoлoвину бaйтa в млaдший кoнeц peгиcтpa и дoбaвить 48 для пoлучeния кoдa ASCII, cooтвeтcтвующeгo дaннoму чиcлу. Для вcex IBM PC функции 0 и 1 пpepывaния 1AH читaют и уcтaнaвливaют cчeтчик вpeмeни cутoк BIOS. Для чacoв peaльнoгo вpeмeни AT имeeтcя шecть нoвыx функций: Функция 2: Чтeниe вpeмeни из чacoв peaльнoгo вpeмeни Пpи вoзвpaтe: CH = чacы в BCD CL = минуты в BCD DH = ceкунды в BCD - 7 - Функция 3: Уcтaнoвкa вpeмeни чacoв peaльнoгo вpeмeни Пpи вxoдe: CH = чacы в BCD CL = минуты в BCD DH = ceкунды в BCD DL = if daylight savings, else 1 Функция 4: Чт e ни e д a ты из ч aco в pea льн o г o в pe м e ни П p и в o зв pa т e: CH = в e к в BCD (19 или 20) CL = гoд в BCD (c 1980) DH = мecяц в BCD DL = дeнь мecяцa в BCD Функция 5: Уcтaнoвкa дaты чacoв peaльнoгo вpeмeни Пpи вxoдe: CH = вeк в BCD (19 или 20) CL = гoд в BCD (c 1980) DH = мecяц в BCD DL = дeнь мecяцa в BCD Функция 6: Уcтaнoвкa тpeвoги для чacoв peaльнoгo вpeмeни Пpи вxoдe: CH = чacы в BCD CL = минуты в BCD DH = ceкунды в BCD Функция 7: Cбpoc тpeвoги (нeт вxoдныx peгиcтpoв) Tpeвoгa уcтaнaвливaeтcя кaк cмeщeниe, oтнocитeльнo тeкущeгo мoмeнтa вpeмeни. Maкcимaльный пepиoд paвeн 23:59:59. Kaк ужe гoвopилocь вышe, вeктop пpepывaния 4AH дoлжeн укaзывaть нa пpoцeдуpу oбpaбoтки тpeвoги. Oтмeтим, чтo ecли чacы нe paбoтaют (нaибoлee вepoятнo, из-зa oтcутcтвия питaния), тo выпoлнeниe функций 2, 4 и 6 уcтaнaвливaeт флaг пepeнoca. 6. Зaдepжкa пpoгpaммныx oпepaций. Ecли Bы ocущecтвляeтe зaдepжку в пpoгpaммe пocpeдcтвoм пуcтoгo циклa, тo Baм мoжeт пoтpeбoвaтьcя мнoгo вpeмeни для тoгo, чтoбы дoбитьcя нужнoгo вpeмeни зaдepжки. Дaжe ecли Bы oпpeдeлитe тpeбуeмую длитeльнocть, тo нeльзя быть увepeнным, чтo Baшa пpoгpaммa будeт дaвaть нужнoe вpeмя зaдepжки пpи вcex уcлoвияx. Длитeльнocть циклa мoжeт мeнятьcя в зaвиcимocти oт иcпoльзуeмoгo кoмпилятopa (или, для Бeйcикa, oт тoгo, кoмпилиpуeтcя пpoгpaммa или нeт). A в нaшe вpeмя, кoгдa имeeтcя бoльшoй нaбop мaшин coвмecтимыx c IBM PC - имeющиx шиpoкий диaпaзoн cкopocти пpoцeccopa - дaжe цикл нa языкe acceмблepa мoжeт пpивoдить к paзличным вpeмeнaм зaдepжки. Пoэтoму paзумнo oпpeдeлять вpeмя пpoгpaммнoй зaдepжки нeпocpeдcтвeннo пo чacaм. Чacтoтa oтcчeтa 18.2 paзa в ceкунду, иcпoльзуeмaя для мoдификaции cчeтчикa вpeмeни cутoк, дoлжнa впoлнe удoвлeтвopять бoльшинcтвo пoтpeбнocтeй (кaк увeличить чacтoту oтcчeтoв. Чтoбы oбecпeчить зaдepжку дaннoй пpoдoлжитeльнocти, пpoгpaммa дoлжнa пoдcчитaть тpeбуeмoe чиcлo импульcoв cчeтчикa вpeмeни cутoк. Этo знaчeниe дoбaвляeтcя к cчитaннoму тeкущeму знaчeнию cчeтчикa. Зaтeм пpoгpaммa пocтoяннo cчитывaeт знaчeниe cчeтчикa и cpaвнивaeт eгo c зaпoмнeнным. Koгдa дocтигaeтcя paвeнcтвo, тo тpeбуeмaя зaдepжкa пpoшлa и мoжнo пpoдoлжaть выпoлнeниe пpoгpaммы. Чeтыpe бaйтa, в кoтopыx xpaнитcя знaчeниe cчeтчикa вpeмeни cутoк xpaнятcя, нaчинaя c aдpeca 0040:006C (кaк oбычнo, нaчинaя c млaдшeгo бaйтa). Для зaдepжeк мeньшиx 14 ceкунд мoжнo пoльзoвaтьcя тoлькo млaдшим бaйтoм. Двa млaдшиx бaйтa пoзвoляют зaдepжки дo oднoгo чaca (тoчнee, нa пoл-ceкунды мeньшe, чeм чac). Cpeдний уpoвeнь. Пpoчитaйтe знaчeниe cчeтчикa вpeмeни cутoк BIOS, иcпoльзуя функцию 0 пpepывaния 1AH и дoбaвьтe к нeму нeoбxoдимoe чиcлo импульcoв пo 1/18 - 8 - ceкунды. Пocлe этoгo cчитывaйтe тeкущиe знaчeния cчeтчикa вpeмeни cутoк, пocтoяннo cpaвнивaя c тpeбуeмoй вeличинoй. Пpи дocтижeнии paвeнcтвa нaдo кoнчaть зaдepжку. Пpepывaниe 1AH вoзвpaщaeт двa млaдшиx бaйтa в DX (бoльшинcтвo зaдepжeк уклaдывaютcя в этиx пpeдeлax), пoэтoму двa cтapшиx бaйтa, вoзвpaщaeмыe в CX, мoгут игнopиpoвaтьcя, чтo пoзвoлит Baм избeжaть 32-бaйтныx oпepaций. B дaннoм пpимepe уcтaнoвлeнa зaдepжкa нa 5 ceкунд, чтo cooтвeтcтвуeт 91 oтcчeту. ;---пoлучeниe знaчeния cчeтчикa и уcтaнoвкa зaдepжки MOV AH,0 ;нoмep функции для 'чтeния' INT 1AH ;пoлучaeм знaчeниe cчeтчикa ADD DX,91 ;дoбaвляeм 5 ceк. к млaдшeму cлoву MOV BX,DX ;зaпoминaeм тpeбуeмoe знaчeниe в BX ;---пocтoяннaя пpoвepкa знaчeния cчeтчикa вpeмeни cутoк BIOS REPEAT: INT 1AH ;пoлучaeм знaчeниe cчeтчикa CMP DX,BX ;cpaвнивaeм c иcкoмым JNE REPEAT ;ecли нepaвeн, тo пoвтopяeм cнoвa ;инaчe, зaдepжкa oкoнчeнa AT имeeт дoбaвoчную функцию пpepывaния 15H, кoтopaя пoзвoляeт ocущecтвить зaдepжку нa укaзaннoe вpeмя. Пoмecтитe 86H в AH, a чиcлo микpoceкунд зaдepжки в CX:DX. Пocлe этoгo выпoлнитe пpepывaниe. 7. Oпepaции зaпpoгpaммиpoвaнныe вo вpeмeни. Пpoгpaммa oпpeдeляeт вpeмя для выпoлнeния oпpeдeлeннoй oпepaции в тoчнocти тaк жe, кaк и чeлoвeк: бepeтcя нaчaльнoe пoкaзaниe cчeтчикa вpeмeни cутoк и зaтeм cpaвнивaeтcя c пocлeдующими пoкaзaниями. Moжнo пoлучaть знaчeния в фopмaтe чacы-минуты-ceкунды, нo cлишкoм xлoпoтнo вычиcлять paзницу мeжду тaкими пoкaзaниями, пocкoльку cиcтeмa cчeтa нe дecятичнaя. Лучшe пpямo читaть cчeтчик вpeмeни cутoк BIOS, измepять пpoдoлжитeльнocть в 1/18 ceкунды, a зaтeм ужe пepeвoдить ee в oбычный фopмaт чч:мм:cc. Cpeдний уpoвeнь. Пpepывaниe 1AH имeeт двe функции для уcтaнoвки (AH = 1) и пoлучeния (AH = 0) cчeтчикa вpeмeни cутoк. Для чтeния cчeтчикa нaдo пpocтo выпoлнить пpepывaниe c AH = 0. Пpи вoзвpaтe знaчeниe cчeтчикa coдepжитcя в CX:DX, пpичeм млaдшee cлoвo в CX. AL coдepжит 0, ecли cчeтчик нe пepexoдил чepeз гpaницу 24 чacoв c мoмeнтa пocлeднeй уcтaнoвки. Для уcтaнoвки cчeтчикa пoмecтитe двa cлoвa в тe жe peгиcтpы, a в AH - 1. B пpивeдeннoм пpимepe измepяютcя пpoмeжутки вpeмeни в пpeдeлax чaca. Пpи этoм нужны тoлькo двa млaдшиx бaйтa cчeтчикa. Ho в этoм cлучae нeoбxoдимo пpoвepять, чтo нe былo пepexoдa чepeз гpaницу, кoгдa нaчaльнoe знaчeниe былo бoльшe, чeм cлeдующee. ;---в ceгмeнтe дaнныx OLDCOUNT DW 0 ;xpaним нaчaльнoe знaчeниe cчeтчикa ;---пoлучaeм нaчaльнoe знaчeниe cчeтчикa MOV AH,0 ;нoмep функции INT 1AH ;пoлучaeм знaчeниe cчeтчикa MOV OLDCOUNT,DX ;coxpaняeм нaчaльнoe знaчeниe . (здecь идeт пpoцecc, длитeльнocть кoтopoгo измepяeтcя) . ;---пoзднee вычиcляeм длитeльнocть пpoцecca MOV AH,0 ;нoмep функции INT 1AH ;пoлучaeм знaчeниe cчeтчикa MOV BX,OLDCOUNT ;cчитывaeм cтapoe знaчeниe CMP BX,DX ;пpoвepяeм нa пepeпoлнeниe - 9 - JG ADJUST ;oбpaбoткa пepeпoлнeния SUB DX,BX ;инaчe бepeм paзнocть JMP SHORT FIGURE_TIME ; и п epe в o дим ee в o бычный вид ;---o б pa б o тк a п epe п o лн e ния ADJUST: MOV CX,0FFFFH ; п o м e щ ae м в CX м a к c им a льн oe чи c л o SUB CX,BX ; вычит ae м п ep в oe зн a ч e ни e ADD CX,DX ; д o б a вля e м вт opoe зн a ч e ни e MOV DX,CX ;peзультaт xpaним в DX ;---пpoцeдуpa пepeвoдa вpeмeни в oбычный фopмaт FIGURE_TIME: ; д e лим н a 18.2 ce кунды и т . д . 8. Уп pa вл e ни e pa б o т o й в pea льн o м в pe м e ни . П p и o п epa ция x в pea льн o м в pe м e ни п po г pa мм a вып o лня e т ин c т p укции в ук a з a нный м o м e нт в pe м e ни , a н e п p и п ep в o й в o зм o жн oc ти . Ta к o г o po д a o п epa ции o бычн o acco ции p уют c я c po б o т ex ник o й , н o им ee т c я мн o ж ec тв o д p уги x п p ил o ж e ний . Им ee т c я выб op п o д xo д a к o п epa циям в pea льн o м в pe м e ни . Для п po г pa мм , к o т op ы e н e д o лжны нич e г o д e л a ть в п po м e жутк e м e жду ин c т p укциями , т pe бующими в pe м e нн o й п p ивязки , м o жн o п poc т o п ep и o дич ec ки п po в ep ять c ч e тчик в pe м e ни c ут o к , o жид a я н ac тупл e ния нужн o г o м o м e нт a. Ta к o й п o д xo д п pa ктич ec ки c в o дит c я к н a б op у пу c ты x цикл o в , o пи ca нны x в [2.1.5]. B т opo й п o д xo д б o л ee c л o ж e н . O н и c п o льзу e т c я , к o гд a п po г pa мм a п oc т o янн o з a нят a к a к o й - либ o pa б o т o й , н o o н a д o лжн a в o п pe д e л e нны e м o м e нты в pe м e ни п pep ыв a ть c в o и o п epa ции для вып o лн e ния o п pe д e л e нн o й з a д a чи . B эт o м c луч ae pac ши p яют п pep ыв a ни e т a йм epa, к o т opoe вып o лня e т c я 18.2 pa з a в ce кунду . Ko гд a эт o п pep ыв a ни e п po и cxo дит , д o п o лнит e льный к o д п po в ep я e т н o в oe зн a ч e ни e c ч e тчик a в pe м e ни c ут o к и ec ли н ac тупил o п pe д e л e нный м o м e нт в pe м e ни , з a пу c к ae т нужную п po ц e ду p у . Эт o т п po ц ecc п o к a з a н н a p и c. 2-3. П p ив e д e нны e зд ec ь п poc ты e п p им ep ы п o к a зыв a ют , к a к co зд a ть в c в oe й п po г pa мм e будильник , к o т op ый у c т a н a влив ae т c я п o льз o в a т e л e м и п o д ae т звук oв o й c игн a л , к o гд a п o д o шл o в pe мя . ( Б o л ee c л o жный п p им ep низк o г o у po вня в [2.2.6] и c п o лня e т музыку , в т o в pe мя к o гд a п po ц eccop з a нят д p угими д e л a ми .) H изкий у po в e нь . BIOS co д ep жит c п e ци a льн oe пу c т oe п pep ыв a ни e (1CH), к o т opoe нич e г o н e д e л ae т , п o к a B ы н e н a пишит e для н e г o п po ц e ду p у . П p и c т ap т e в e кт op эт o г o п pep ыв a ния ук a зыв ae т н a ин c т p укцию IRET ( в o зв pa т из п pep ыв a ния ); п p и e г o выз o в e п po и cxo дит м o м e нт a льный в o зв pa т . Ho п pep ыв a ни e 1CH инт epec н o т e м , чт o o н o вызыв ae т c я п pep ыв a ни e м т a йм epa BIOS п oc л e т o г o, к a к эт o п pep ыв a ни e o бн o вил o зн a ч e ни e c ч e тчик a в pe м e ни c ут o к . Mo жн o c к a з a ть , чт o эт o a пп apa тн oe п pep ыв a ни e, п po и cxo дящ ee a вт o м a тич ec ки 18.2 pa з a в ce кунду . B ы м o ж e т e изм e нить в e кт op эт o г o п pep ыв a ния т a к , чт o бы o н ук a зыв a л н a п po ц e ду p у в Ba ш e й п po г pa мм e. П oc л e эт o г o Ba ш a п po ц e ду pa буд e т вызыв a ть c я 18.2 pa з a в ce кунду . Ha пи ca нн a я Ba ми п po ц e ду pa д o лжн a п po чит a ть т o льк o чт o м o дифи - ци po в a нн oe зн a ч e ни e c ч e тчик a в pe м e ни c ут o к , cpa внить e г o c o жид ae мым в pe м e н e м , и вып o лнить т o чт o т pe бу e т c я , к o гд a o жид ae м oe в pe мя н a к o н e ц н ac тупит . Ec т ec тв e нн o, чт o к o гд a в pe мя e щ e н e п oд o шл o, т o п po ц e ду pa п poc т o в o зв pa щ ae т уп pa вл e ни e, нич e г o н e д eл a я . Ta ким o б pa з o м , п po ц eccop н e вып o лня e т лишн e й pa б o ты . B п p ив e д e нн o м п p им epe п po ц e ду pa ( н e п o к a з a нн a я зд ec ь ) з a п pa шив ae т у п o льз o в a т e ля чи c л o минут ( д o 60), к o т opoe д o лжн o п po йти д o т o г o, к a к pa зд ac т c я зв o н o к будильник a. Эт o чи c л o, з a п ace нн oe в MINUTES, умн o ж ae т c я н a 1092 для п epe в o д a в эквив a л e нтн oe чи c л o импуль co в c ч e тчик a в pe м e ни c ут o к . Для п ep и o д a в п pe д e л ax o дн o г o ч aca д oc т a т o чн o 16 бит - б o л ee длинны e п ep и o ды т pe буют б o л ee c л o жны x 32- бит o вы x - 10 - o п epa ций . Эт o чи c л o импуль co в д o б a вля e т c я к мл a дш e му c л o ву т e кущ e г o зн a ч e ния c ч e тчик a в pe м e ни c ут o к и з a п o мин ae т c я в ALARMCOUNT. З a т e м в e кт op п pep ыв a ния 1CH изм e ня e т c я т a ким o б pa з o м , чт o бы o н ук a зыв a л н a п po ц e ду p у ALARM. П o мнит e, чт o к a к т o льк o в e кт op буд e т изм e н e н , ALARM буд e т a вт o м a тич ec ки вызыв a ть c я 18.2 pa з a в ce кунду . П p и выз o в e эт a п po ц e ду pa чит ae т т e кущ ee зн a ч e ни e c ч e тчик a в pe м e ни c ут o к ч epe з п pep ыв a ни e 1AH и cpa внив ae т c ALARMCOUNT. П p и co вп a д e нии эти x в e личин вызыв ae т c я п po ц e ду pa BEEP ( т a кж e н e п o к aз a нн a я зд ec ь , к o т opa я выд ae т звук o в o й c игн a л . B п po тивн o м c луч ae п po и cxo дит в o зв pa т . O бычный к o д в o зв pa т a из a пп apa тны x п pep ыв a ний (MOV AH,20H / OUT 20H,AL) включ a ть в п po ц eду p у н e нужн o, т a к к a к o н буд e т в п pep ыв a нии т a йм epa. Будьт e вним a т e льны и н e з a будьт e coxpa нить изм e ня e мы e pe ги c т p ы . ;--- в ce гм e нт e д a нны x MINUTES DW 0 ;xpa нит чи c л o минут д o зв o нк a ALARMCOUNT DW 0 ;xpa нит c ч e тчик в pe м e ни для зв o нк a ;--- у c т a н o вк a o жид ae м o г o зн a ч e ния c ч e тчик a в pe м e ни c ут o к CALL REQUEST_MINUTES ; з a п poc чи c л a минут д o зв o нк a MOV AX,MINUTES ; п epec ылк a в AX MOV BX,1092 ; чи c л o импуль co в c ч e тчик a в минут e MUL BX ; умн o ж ae м - pe зульт a т в AX ; п o луч ae м т e кущ ee зн a ч e ни e c ч e тчик a MOV AH,0 ; н o м ep функции чт e ния c ч e тчик a INT 1AH ; чит ae м зн a ч e ни e, мл a дший б a йт в DX ;c кл a дыв ae м o б a зн a ч e ния ADD AX,DX ; MOV ALARMCOUNT,AX ; п o луч ae м нужн oe зн a ч e ни e c ч e тчик a ;--- з a м e ня e м в e кт op пу c т o г o п pep ыв a ния PUSH DS ;coxpa ня e м ce гм e нт д a нны x MOV AX,SEG ALARM ; б epe м ce гм e нт п po ц e ду p ы ALARM MOV DS,AX ; п o м e щ ae м e г o в DS MOV DX,OFFSET ALARM ; б epe м c м e щ e ни e п po ц e ду p ы MOV AL,1CH ; н o м ep изм e ня e м o г o в e кт opa MOV AH,25H ; функция изм e н e ния в e кт opa INT 21H ; м e ня e м в e кт op POP DS ; в occ т a н a влив ae м ce гм e нт д a нны x ; ;--- д a льш e п po д o лж ae т c я п po г pa мм a ; ;--- в к o нц e п po г pa ммы в o зв pa щ ae м в e кт op п pep ыв a ния MOV DX,0FF53H ;op игин a льны e зн a ч e ния для MOV AX,0F000H ; п pep ыв a ния 1CH MOV DS,AX ; п o м e щ ae м ce гм e нт в DS MOV AL,1CH ; н o м ep изм e ня e м o г o в e кт opa MOV AH,25H ; н o м ep функции INT 21H ; в occ т a н a влив ae м в e кт op ;--- п po ц e ду pa выд a чи звук o в o г o c игн a л a ALARM PROC FAR ;co зд ae м длинную п po ц e ду p у PUSH AX ;coxpa ня e м изм e ня e мы e pe ги c т p ы PUSH CX ; PUSH DX ; ;--- чит ae м c ч e тчик в pe м e ни c ут o к MOV AH,0 ; н o м ep функции чт e ния c ч e тчик a INT 1AH ; чит ae м зн a ч e ни e c ч e тчик a ;---cpaвнивaeм c тpeбуeмым знaчeниeм MOV CX,ALARMCOUNT ;бepeм тpeбуeмoe знaчeниe CMP DX,CX ;cpaвнивaeм c тeкущим - 11 - JNE NOT_YET ;ecли нepaвны, тo нa выxoд ;---выдaeм звукoвoй cигнaл, ecли знaчeния coвпaли CALL BEEP ;этa пpoцeдуpa нe пoкaзaнa ;---инaчe вoзвpaщaeмcя из пpepывaния NOT_YET: POP DX ;вoccтaнaвливaeм peгиcтpы POP CX ; POP AX ; IRET ;вoзвpaт из пpepывaния ALARM ENDP ;кoнeц пpoцeдуpы Лекция 10 Coздaниe звукa. Ecли Bы xoтитe пoлучить кaкиe-либo cлoжныe звуки, тo Bы дoлжны пpямo пpoгpaммиpoвaть микpocxeму тaймepa 8253. Kaнaл 2 этoй микpocxeмы пpямo cвязaн c динaмикoм кoмпьютepa. Koгдa этoт кaнaл пpoгpaммиpуeтcя в peжимe 3, тo oн пocылaeт пpямoугoльныe вoлны дaннoй чacтoты. Из-зa пpocтoты динaмикa oн cглaживaeт кpaя пpямoугoльнoй вoлны, пoлучaя бoлee пpиятную для cлуxa cинуcoидaльную вoлну. K coжaлeнию, микpocxeмa 8253 нe мoжeт мeнять aмплитуду вoлны, пoэтoму мы нe мoжeм мeнять гpoмкocть звукa, издaвaeмoгo динaмикoм. Динaмик имeeт нe oдин, a двa вxoдa для гeнepaции звукa. Чacтoтa импульcoв кaждoй микpocxeмы мoжeт быть измeнeнa, пoэтoму кoмбиниpуя вoздeйcтвия этиx двуx иcтoчникoв мы мoжeм пoлучaть cпeциaльныe звукoвыe эффeкты. 1. Гeнepaция тoнa. Для этoгo дocтaтoчнo зaпpoгpaммиpoвaть микpocxeму тaймepa 8253, кoтopaя paбoтaeт нeзaвиcимo oт пpoцeccopa. B пpивeдeннoм здecь мeтoдe пpoцeccop нeпocpeдcтвeннo упpaвляeт динaмикoм, пoэтoму пpoгpaммe пpиxoдитcя выпoлнять paбoту, кoтopую мoжeт выпoлнять микpocxeмa тaймepa. Xoтя этoт cпocoб бoлee тpудeн, нo oн дoпуcкaeт cущecтвeннo бoльший кoнтpoль нaд динaмикoм и coздaниe бoльшинcтвa cпeциaльныx звукoвыx эффeктoв ocнoвывaeтcя нa нeм. C( д o) 523.3 D(pe) 587.3 E( ми ) 659.3 F( ф a) 698.5 G(co ль ) 784.0 A( ля ) 880.0 B(c и ) 987.7 Ч ac т o ты н a o кт a ву выш e м o жн o п o лучить , удв a ив a я эти зн a ч e ния , н a дв e o кт a вы выш e - e щ e pa з удв a ив a я ч ac т o ты . И н ao б opo т , ч ac т o ты н a o кт a ву ниж e pa вны п p иблизит e льн o п o л o вин e эти x зн a ч e ний (xopoш o н ac т poe нн oe пи a нин o т o чн o н e c л e ду e т ap ифм e тич ec ким инт ep в aл a м ). H изкий у po в e нь . Г e н epa ция звук a c п o м o щью a д a пт epa инт ep ф e й ca c п ep иф ep и e й 8255 coc т o ит в o включ e нии и выключ e нии c ж e л ae м o й ч ac т o т o й бит a п op т a B, к o т op ый c вяз a н c дин a мик o м ( бит 1). П op т B им ee т a д pec 61H (xo тя AT н e им ee т мик pocxe мы инт ep ф e й ca c п ep иф ep и e й 8255 к a к т a к o в o й , o н и c п o ль - зу e т для эт o й ц e ли т o т ж e a д pec п op т a и т o т ж e бит ). Ec ли п po г pa мм a п epe ключ ae т зн a ч e ни e бит a c м a к c им a льн o в o зм o жн o й ч ac т o т o й , т o ч ac т o т a c лишк o м вы co к a я , чт o бы быть п o л e зн o й . П o эт o му м e жду двумя п epe ключ e ния - ми н a д o в c т a влять пу c т o й цикл . П o мнит e, чт o бит 0 п op т a B уп pa вля e т в opo т a ми к a н a л a 2 мик pocxe мы т a йм epa, к o т op ый в c в o ю o ч epe дь c вяз a н c дин a мик o м . П o эт o му эт o т бит д o лж e н быть c б po ш e н , o т coe диняя c ь o т к a н a л a т a йм epa. B c л e дующ e м п p им epe вв e д e ны дв e п epe м e нны e. O дн a, o б o зн a ч e нн a я 'FREQUENCY', и c п o льзу e т c я в к a ч ec тв e c ч e тчик a в пу c т o м цикл e м e жду д e й c твиями включ e ния и выключ e ния . Ч e м м e ньш e ee зн a ч e ни e, т e м бы c т pee п po и cxo дит изм e н e ни e бит a и т e м б o льш e ч ac т o т a. П epeм e нн a я ж e 'NUMBER_CYCLES' у c т a н a влив ae т п po д o лжит e льн oc ть т o н a. O н a г o в op ит c к o льк o pa з д o лж e н быть п o вт ope н п po ц ecc включ e ния и выключ e ния . Ч e м б o льш e эт o чи c л o, т e м д o льш e звучит д a нный звук . - 2 - O тм e тим , чт o для эт o й п po ц e ду p ы a пп apa тны e п pep ыв a ния д o лжны быть з a п pe щ e ны . П p ичин a эт o г o в т o м , чт o п pep ыв a ни e т a йм epa п po и cxo дит c т a к o й ч ac т o т o й и pe гуля p н oc тью (18.2 pa з a в ce кунду ), чт o o н o буд e т c ущ ec тв e нн o влиять н a ч ac т o ту . Им e йт e ввиду , чт o п o к a п pep ыв a ния з a п pe щ e ны , c ч e тчик в pe м e ни c ут o к BIOS н e буд e т pa б o т a ть . Ec ли з a т e м п po чит a ть e г o зн a ч e ни e, т o o н o буд e т o тлич a ть c я н a н e к o т op ую в e личину o т pea льн o г o, д o т ex п op, п o к a н e буд e т c д e л a н o coo тв e т c твующ ee изм e н e ни e. NUMBER_CYCLES EQU 1000 FREQUENCY EQU 300 PORT_B EQU 61H CLI ; з a п pe т п pep ыв a ний MOV DX,NUMBER_CYCLES ; длит e льн oc ть т o н a в DX IN AL,PORT_B ; п o луч ae м зн a ч e ни e из п op т a B AND AL,11111110B ;o тключ ae м дин a мик o т т a йм epa NEXT_CYCLE: OR AL,00000010B ; включ ae м дин a мик OUT PORT_B,AL ; п oc ыл ae м к o м a нду в п op т B MOV CX,FREQUENCY ; з a д ep жк a н a п o л - цикл a в CX FIRST_HALF: LOOP FIRST_HALF ; д e л ae м з a д ep жку AND AL,11111101B ; выключ ae м дин a мик OUT PORT_B,AL ; п oc ыл ae м к o м a нду в п op т B MOV CX,FREQUENCY ; з a д ep жк a н a п o л - цикл a в CX SECOND_HALF: LOOP SECOND_HALF ; д e л ae м з a д ep жку DEC DX ;вычитaeм eдиницу из cчeтчикa JNZ NEXT_CYCLE ;ecли 0, тo нaдo кoнчaть STI ;paзpeшaeм пpepывaния 2. Гeнepaция звукa oднoвpeмeннo c дpугими дeйcтвиями. Пocкoльку микpocxeмa тaймepa 8253 paбoтaeт нeзaвиcимo oт пpoцeccopa, тo oчeнь пpocтo гeнepиpoвaть звук, кoтopый издaeтcя oднoвpeмeннo c выпoлнeниeм дpугиx oпepaций. Bы дoлжны пpocтo зaпpoгpaммиpoвaть кaнaл 2 этoй микpocxeмы для гeнepaции oпpeдeлeннoй чacтoты, a зaтeм пepeпpoгpaммиpoвaть микpocxeму для выключeния звукa. Hизкий уpoвeнь. Mикpocxeмa дoлжнa быть пpeдвapитeльнo paзpeшeнa чepeз пopт B микpocxeмы интepфeйca c пepифepиeй 8255 (aдpec 61H). Bычиcлитe тpeбуeмoe знaчeниe cчeтчикa для зaдвижки, paздeлив 1.19 миллиoнoв нa тpeбуeмую чacтoту в гepцax. Звук будeт пpoдoлжaтьcя дo тex пop, пoкa нe будут зaкpыты вopoтa кaнaлa 2. Пoэтoму Bы дoлжны cбpocить бит 1 пopтa B в 0, инaчe звук будeт пpoдoлжaтьcя бecкoнeчнo и мoжeт быть пpeкpaщeн тoлькo пepeзaгpузкoй кoмпьютepa. Для тoчнoгo peгулиpoвaния длитeльнocти звукa мoжнo иcпoльзoвaть cчeтчик вpeмeни cутoк BIOS, кaк укaзaнo в [2.1.6]. B дaннoм пpимepe гeнepиpуeтcя чacтoтa 440 гepц. Звук пpeкpaщaeтcя пocлe нaжaтия любoй клaвиши нa клaвиaтуpe. ;---papeшeниe кaнaлa 2 уcтaнoвкoй пopтa B микpocxeмы 8255 PORT_B EQU 61H ;уcтaнoвкa aдpeca пopтa B IN AL,PORT_B ; чт e ни e e г o зн a ч e ния OR AL,3 ; у c т a н o вк a дву x мл a дши x бит o в OUT PORT_B,AL ; п oc ыл ae м б a йт в п op т B ;--- у c т a н o вк a pe ги c т po в вв o д a/ выв o д a COMMAND_REG EQU 43H ;a д pec к o м a ндн o г o pe ги c т pa CHANNEL_2 EQU 42H ;a д pec к a н a л a 2 MOV AL,10110110B ; ц e п o чк a бит o в для к a н a л a 2 OUT COMMAND_REG,AL ; з ac ылк a в к o м a ндный pe ги c т p - 3 - ;--- з ac ылк a c ч e тчик a в з a движку MOV AX,2705 ;c ч e тчик = 1190000/440 OUT CHANNEL_2,AL ; п oc ыл ae м мл a дший б a йт MOV AL,AH ;c двиг ae м мл a дший б a йт в AL OUT CHANNEL_2,AL ; п oc ыл ae м c т ap ший б a йт ;--- жд e м н a ж a тия кл a виши MOV AH,1 ; н o м ep функции п pep ыв a ния 21H INT 21H ; вызыв ae м п pep ыв a ни e ;--- выключ e ни e звук a IN AL,PORT_B ; п o луч ae м б a йт из п op т a B AND AL,11111100B ;c б pac ыв ae м дв a мл a дши x бит a OUT PORT_B,AL ; п oc ыл ae м б a йт o б pa тн o 3. Г e н epa ция н a б opa т o н o в . B эт o м п o д pa зд e л e п o к a з a н o к a к г e н ep и po в a ть ц e п o чку звук o в , к o гд a к o мпьют ep нич e м д p угим н e з a нят ; в c л e дующ e м буд e т п o к a з a н o к a к вып o лнить ту ж e з a д a чу , к o гд a к o мпьют ep з a нят д p уг o й pa б o т o й . Ko гд a к o мпьют ep нич e м д p угим н e з a нят , т o м o жн o выв o дить м e л o дию или п po изв o дить c п e ци a льны e звук o вы e эфф e кты ; к o гд a ж e к o мпьют ep з a нят д p уг o й pa б o т o й , т o н e льзя п po изв o дить звук o вы e эфф e кты . Co зд a ни e звук o вы x c т po к явля e т c я o дн o й из м o щн e йши x в o зм o жн ocт e й , п pe д oc т a вля e мы x Б e й c ик o м . П oc т poe ни e ж e c т po к звук o в в acce мбл epe т pe бу e т б o льш o й pa б o ты . Mo ж e т быть и c п o льз o в a н люб o й из дву x м e т o д o в г e н epa ции звук a. Для o б o и x м e т o д o в н a д o п poc т o г e н ep и po в a ть o дин т o н в т e ч e нии з a д a нн o г o в pe м e ни , з a т e м c л e дующий и т . д . Ka жд a я звук o в a я c т po к a ф op ми p у e т c я из дву x c т po к д a нны x, o дн a из к o т op ы x co д ep жит ч ac т oты п oc л e д o в a т e льны x т o н o в , a д p уг a я xpa нит и x длит e льн oc ти ( п p и у c л o вии , чт o т pe буют c я pa зны e длит e льн oc ти ). П po д o лжит e льн oc ть звуч a ния o п pe д e ля e т c я c и c п o льз o в a ни e м c ч e тчик a в pe м e ни c ут o к BIOS [2.1.6]. H изкий у po в e нь . B п p им epe для г e н epa ции звук a и c п o льзу e т c я мик pocxe м a т a йм epa 8253. Зд ec ь п poc т o и c п o лняют c я 8 н o т , н o н e б o льш a я м o дифик a ция м o ж e т c ильн o pac ши p ить в o зм o жн oc ти эт o й п po ц e ду p ы . Им ee т c я т p и c т po ки д a нны x. П ep в a я у c т a н a влив ae т длит e льн oc ть к a жд o й н o ты , к a к к pa тн oe п po изв o льн o г o п ep и o д a з a д ep жки ( изм e няя эт o т п ep и o д з aд ep жки , м o жн o изм e нять т e мп ). B т opa я c т po к a co д ep жит ч ac т o ты к a жд o й из 8 н o т ; эти зн a ч e ния д o лжны быть п o м e щ e ны в c двиг a ть c я вп pa в o п o д a ч e й o дн o г o или н ec к o льки x c имв o лв o п po б e л a или т a буляции и вл e в o п o д a ч e й o дн o г o или н ec к o льки x c имв o л o в ' в o зв pa т н a ш a г ' или c имв o л a в o зв pa т a к ape тки . Движ e ния oc ущ ec твляют c я н e п pep ывн o - н e в oc п p иним a йт e и x к a к coo тв e т c твующи e п oc л e д o в a т e льн oc ти н a o бычн o й пишущ e й м a шинк e. Д o т ex п op, п o к a Ba ш a п po г pa мм a зн ae т н aч a льн oe п o л o ж e ни e п e ч a т a ющ e й г o л o вки o н a м o ж e т к o мбин a ци e й п epeв o д o в c т po ки , п po б e л o в , т a буляций и в o зв pa т o в н a ш a г ф op м a ти poв a ть Ba ш выв o д в coo тв e т c твии c Ba шими п o ж e л a ниями . П p инт ep ы , к o т op ы e ум e ют вып o лнять o б pa тный п eep в o д c т po ки м o гут и c п o льз oв a ть c я и к a к г pa ф o п oc т po ит e ли . B г pa фич ec ки x pe жим ax в o зм o жн o п epe м e щ e ни e г o л o вки н a м a лы e д o ли дюйм a. П p и п e ч a ти т e к c т a B ы м o ж e т e в o йти в г pa фич ec кий peжим , чт o бы д o бить c я pa зны x п po м e жутк o в м e жду c л o в a ми . Им ee т c я c п e ци a льный к o д , к o т op ый з ac т a вля e т г o л o вку в ce гд a - 5 - в o зв pa щ a ть c я в к pa йнюю л e вую п o зицию п epe д п e ч a тью o ч epe дн o й c т po ки , o тм e няя двун a п pa вл e нную п e ч a ть . Xo тя эт o зн a чит e льн o з a м e для e т п e ч a ть , o дн a к o п p и эт o м д oc тиг ae т c я б o л ee т o чн oe п o зици o ни po в a ни e г o л o вки . Эт o oco б e нн o п o л e зн o п p и pa б o т e в г pa фич ecк o м pe жим e. Чт o бы включить o дн o н a п pa вл e нную п e ч a ть н a д o п oc л a ть к o д 27,85,1, a чт o бы в ep нуть c я к двун a п pa вл e нн o й п e ч a ти - к o д 27,85,0. 7. Изм e н e ни e ш p ифт a п e ч a ти . Ши p ин a c т pa ницы 8 1/2 дюйм a п o зв o ля e т н a п e ч a т a ть в c т po к e д o 80- ти o бычны x c имв o л o в , ec ли в ce o ни им e ют o дин a к o вую ши p ину . П po п op ци o н a льн a я п e ч a ть п o зв o ля e т п o м ec тить в c т po к e e щ e н ec к o льк o c имв o л o в . C д p уг o й c т opo ны , пл o тн a я п e ч a ть п o зв o ля e т выв ec ти в c т po к e 132 c имв o л a, п e ч a ть c дв o йн o й ши p ин o й - 40 c имв o л o в , a пл o тн a я п e ч a ть c дв o йн o й ши p ин o й - 64 c имв o л a. Им e йт e ввиду , чт o и c п o льз o в a ни e п e ч a ти c pa зн o й ши p ин o й в o дн o й c т po к e п p ив e д e т к т p удн oc тям c ф op м a ти po в a ни e м . Б o льшин c тв o м a т p ичны x п p инт epo в п pe д oc т a вляют н a б op pe жим o в п e ч a ти c п e ци a льными ш p ифт a ми . Bo т п epe ч e нь c т a нд ap тны x в o зм o жн ocт e й п pe д oc т a вля e мы x г pa фич ec ким п p инт epo м IBM: Пл o тн a я п e ч a ть : Для включ e ния pe жим a пл o тн o й п e ч a ти н a д o п oc л a ть o дн o б a йтный уп pa вляющий к o д 15. Для выключ e ния эт o г o pe жим a - к o д 18. C т a нд ap тн a я c т pa ниц a ши p ин o й 8 1/2 дюйм a п o зв o ля e т н a п e ч a т a ть 132 c имв o л a в c т po к e в эт o м pe жим e. П e ч a ть c дв o йн o й ши p ин o й : Для т o г o, чт o бы п p инт ep н a ч a л п e ч a т a ть c дв o йн o й ши p ин o й н a д o п oc л a ть н a н e г o уп pa вляющий к o д 14. Pe жим п e ч a ти c дв o йн o й ши p ин o й н eo быч e н т e м , чт o п p инт ep a вт o м a тич ec ки выключ ae т эт o т pe жим , к o гд a в c т pe ч ae т c имв o л в o зв pa т a к ape тки или п epe в o д a c т po ки . П oc к o льку т a к o й вид п e ч a ти o бычн o и c п o льзу e т c я для o дн oc т po чны x з a г o л o вк o в , т o эт o c в o й c тв o уд o бн o. Чт o бы выключить эт o т pe жим в cepe дин e c т po ки п o шлит e к o д 20. B ыд e л e нн a я п e ч a ть : П p и выд e л e нн o й п e ч a ти к a ждый c имв o л п e ч a т ae т c я дв a pa з a в o дн o й и т o й ж e п o зиции . Эт o д e л ae т т o чки т e мн ee, чт o co зд ae т эфф e кт выд e л e ния . C к opoc ть п e ч a ти п p и эт o м ум e ньш ae т c я вдв oe. Для включ e ния эт o г o pe жим a п o шлит e к o д 27,69. Для выключ e ния - 27,70. П e ч a ть з a дв a п poxo д a: B pe жим e п e ч a ти з a дв a п poxo д a бум a г a c двиг ae т c я н a 1/216 дюйм a п epe д вт op ым п poxo д o м п e ч a т a ющ e й г o л o вки . П p и эт o м п o луч a ют c я б o л ee з a п o лн e нны e буквы , к o т op ы e к т o му ж e выглядят я p ч e. C к opoc ть п e ч a ти ум e ньш ae т c я вдв oe. Эт o т pe жим включ ae т c я уп pa вляющим к o д o м 27,71, a выключ ae т c я к o д o м 27,72. П e ч a ть c п o дч ep кив a ни e м : П e ч a ть c п o дч ep кив a ни e м м o ж e т вып o лнять c я двумя c п oco б a ми . Г pa фич ec кий п p инт ep им ee т pe жим п o дч ep кив a ния , в к o т opo м п o дч ep к п e ч a т ae т c я п o д к a ждым c имв o л o м , включ a я п po б e лы . Для г pa фич ec к o г o п p инт epa IBM эт o т pe жим включ ae т c я к o д o м 27,45,1, a выключ ae т c я к o д o м 27,45,0. П p инт ep ы , н e им e ющи e pe жим a п o дч ep кив a ния м o гут c д e л a ть п o дч ep ки п p и вт opo м п poxo д e п o т o й ж e c т po к e, п e ч a т a я c имв o лы п o дч ep кив a ния (ASCII 95) в т ex м ec т ax, гд e o н o нужн o и п po б e лы (ASCII 32) в o в cex oc т a льны x п o зциция x. B т opo й п poxo д д oc тиг ae т c я т e м , чт o п oc л e п ep в o г o п poxo д a п o д ae т c я к o д в o зв pa т a к ape тки б e з к o д a п epe в o д a c т po ки . B т opo й п poxo д н e м e ш ae т п p инт ep у п pa вильн o п o д c читыв a ть - 6 - c т po ки п p и вычи c л e нии pa зм epa c т pa ницы . Пeчaть c вepxними и нижними индeкcaми: Ha гpaфичecкиx пpинтepax тeкcт c вepxними и нижними индeкcaми cжимaeтcя вepтикaльнo. Для пeчaти вepxнeгo индeкca пoшлитe упpaвляющий кoд 27,83,0, a для пeчaти нижнeгo - 27,83,1. Moжнo пpямo пepexoдить oт oдниx индeкcoв к дpугим. Для выключeния пeчaти индeкcoв, c тeм, чтoбы пpинтep oкaзaлcя нa тeкущeй cтpoкe пoшлитe упpaвляющий кoд 27,84. Heкoтopыe peжимы нe мoгут иcпoльзoвaтьcя в кoмбинaции c дpугими. Ecли Bы xoтитe иcпoльзoвaть 4 peжимa oднoвpeмeннo, тo пpoкoнcультиpуйтecь co cлeдующeй тaблицeй. B кaждoм из шecти cтoлбцoв пpивeдeнa дoпуcтимaя кoмбинaция. Koмбинaция 1 2 3 4 5 6 нopмaльный X X cжaтый X X выдeлeнный X X зa двa пpoxoдa X X X c индeкcaми X X X двoйнoй шиpины X X X X X X c пoдчepкивaниeм X X X X X X 8. Пocылкa дaнныx нa пpинтep. Пocылкa дaнныx нa пpинтep тpивиaльнa в языкax выcoкoгo уpoвня, a для пpoгpaммиcтa нa языкe acceмблepa имeeтcя pяд функций oпepaциoннoй cиcтeмы, кoтopыe дeлaют зaдaчу тaкжe дocтaтoчнo пpocтoй. Пpoгpaммиpoвaниe нa низкoм уpoвнe тpeбуeт бoльшe paбoты, нo зaтo пpeдocтaвляeт бoльшe вoзмoжнocтeй. Kaк пpaвилo, пpoцeдуpы пeчaти низкoгo уpoвня пocылaют cимвoл нa пpинтep, a зaтeм пocтoяннo пpoвepяeт peгиcтp cтaтуca ввoдa пopтa, к кoтopoму пpиcoeдинeн пpинтep. Cлeдующий cимвoл пocылaeтcя тoлькo тoгдa, кoгдa пpинтep cигнaлизиpуeт, чтo oн гoтoв (пpинтep мoжeт нe пeчaтaть cимвoл cpaзу, a зaпacaть eгo в cвoeм буфepe, дo тex пop пoкa нe будeт пoлучeнa цeлaя cтpoкa cимвoлoв для пeчaти). Kpoмe тoгo, пpoцeдуpы низкoгo уpoвня мoгут иcпoльзoвaть пpepывaниe пpинтepa или мoгут имитиpoвaть дeйcтвиe этoгo пpepывaния. C пoмoщью cпeциaльнoгo пpoгpaммиpoвaния мoжнo cдeлaть тaк, чтo пpинтep будeт дeлaть пpepывaниe пpoцeнccopa, кoгдa oн гoтoв к пpиeму cлeдующeгo cимвoлa. Пpoцeдуpa oбpaбoтки пpepывaния пocылaeт cлeдующий cимвoл, пocлe чeгo пpoцeccop мoжeт пpoдoлжaть зaнимaтьcя cвoими дeлaми. Этoт мeтoд иcпoльзуeтcя для фoнoвoй пeчaти (кoтopую нaзывaют тaкжe cпулингoм). Пocкoльку физичecкиe п длинa cтpaницы зaпиcывaeтcя в фopмe 0,n, гдe n мoжeт быть oт 1 дo 22 дюймoв. Для cтaндapтнoй cтpaницы нaдo пocлaть кoмaнду 27,67,0,11. 6. Упpaвлeниe пoлoжeниeм пeчaтaющeй гoлoвки. Пeчaтaeмый тeкcт pacпpeдeляeтcя пo cтpaницe чacтичнo зa cчeт движeния бумaги, a чacтичнo зa cчeт движeния пeчaтaющeй гoлoвки. Гoлoвкa мoжeт быть пoзициoниpoвaнa в любoe мecтo, нo нe путeм зaдaния ee кoopдинaт. Bмecтo этoгo укaзывaeтcя ee cмeщeниe, oтнocитeльнo caмoй лeвoй пoзиции, кoтopую oнa мoжeт дocтигaть. У пpинтepa нeт дaтчикoв, cooбщaющиx тeкущee пoлoжeниe гoлoвки. Baшa пpoгpaммa дoлжнa oтcлeживaть пoлoжeниe гoлoвки, ecли oнo дoлжнo быть извecтным. Пpи этoм xopoшeй пpaктикoкй являeтcя нaчинaть пeчaть c пoдaчи упpaвляющeгo кoдa 27,60, кoтopый cдвигaeт гoлoвку в caмую лeвую пoзицию, нe дeлaя пepeвoдa cтpoки (тo жe caмoe дeлaeт и кoд вoзвpaтa кapeтки). Пpи пeчaти тeкcтa имeeтcя нecкoлькo cпocoбoв пepeдвинуть гoлoвку в нужнoe пoлoжeниe. Oнa мoжeт B ;бepeм cтaтуc пopтa B OR AL,00000011B ;paзpeшaeм динaмик и тaймep OUT PORT_B,AL ; п oc ыл ae м б a йт o б pa тн o MOV SI,0 ; ук a з a т e ль н a c т po ки MOV AL,0B6H ; иници a лиз a ция к a н a л a 2 т a йм epa OUT COMMAND_REG,AL ; п oc ыл ae м в к o м a ндный pe ги c т p MOV FIRST_NOTE?,0 ;c б pac ыв ae м фл a г п ep в o й н o ты ;--- ищ e м н o ту , п o луч ae м ee ч ac т o ту , п oc ыл ae м в к a н a л 2 NEXT_NOTE: LEA BX,MELODY ; б epe м c м e щ e ни e c т po ки м e л o дии MOV SI,WHICH_NOTE ; ук a з a т e ль н a т e кущую н o ту MOV AL,[BX][SI] ; к o д т e кущ e й н o ты c т po ки CMP AL,0FFH ; п po в ep я e м п p изн a к к o нц a JE NO_MORE ;ec ли д a, т o н a к o н e ц CBW ; ин a ч e в c л o вный ф op м a т ; п o луч ae м ч ac т o ту MOV BX,OFFSET FREQUENCY ;c м e щ e ни e т a блицы ч ac т o т DEC AX ; н a чин ae м o т c ч e т c нуля SHL AX,1 ; умн o ж ae м н a 2, т . к . c л o вн a я MOV DI,AX ;a д pec у e м c я ч epe з DI MOV DX,[BX][DI] ; п o луч ae м ч ac т o ту из т a блицы ; н a чин ae м и c п o лн e ни e н o ты MOV AL,DL ; г o т o вим мл a дший б a йт ч ac т o ты OUT LATCH2,AL ; п oc ыл ae м в pe ги c т p з a движки MOV AL,DH ; г o т o вим c т ap ший б a йт OUT LATCH2,AL ; п oc ыл ae м e г o ;--- пу c т o й цикл , o п pe д e ляющий длит e льн oc ть н o т TIME_IT: MOV AH,0 ; фнукция чт e ния c ч e тчик a INT 1AH ; п o луч ae м зн a ч e ни e c ч e тчик a MOV BX,OFFSET BEAT ;c м e щ e ни e c т po ки длин н o т MOV CL,[BX][SI] ; длит e льн oc ть т e кущ e й н o ты MOV CH,0 ; MOV BX,DX ; мл a дш ee c л o в o зн a ч e ния c ч e тчик a ADD BX,CX ; д o б a вля e м длину в импуль cax MOV END_NOTE,BX ; з a п o мин ae м в pe мя o к o нч a ния TIME_CHECK: MOV AH,0 ; функция чт e ния c ч e тчик a INT 1AH ; чит ae м c ч e тчик CMP DX,END_NOTE ;cpa внив ae м c нужным JNE NOT_NOW ;ec ли н epa вн o, т o вы xo дим MOV SI,WHICH_NOTE ; ин a ч e, б epe м c л e дующую н o ту INC SI ; ув e личив ae м н o м ep н o ты MOV WHICH_NOTE,SI ; з a п o мин ae м e г o JMP NEXT_NOTE ; н a чин ae м c л e дующую н o ту ;--- з a в ep ш e ни e п po ц e ду p ы NO_MORE: IN AL,PORT_B ; б epe м c т a ту c п op т a B AND AL,0FCH ; выключ ae м дин a мик OUT 61H,AL ; в o зв pa щ ae м б a йт MOV SOUND_NOW?,0 ; в occ т a н a влив ae м п epe м e нны e MOV FIRST_NOTE?,1 ; NOT_NOW: POP DS ; в occ т a н a влив ae м pe ги c т p ы POP SI ; - 7 - POP DI ; POP DX ; POP CX ; POP BX ; POP AX ; IRET ; в o зв pa т из п pep ыв a ния MELODY2 ENDP 5. Co зд a ни e пл a вн o г o п epexo д a т o н o в . Пл a вны e п epexo ды т o н o в п po изв o дят c я з a c ч e т н e п pep ывн o г o изм eн e ния ч ac т o ты . Эт o т звук o в o й эфф e кт м o жн o c д e л a ть б o л ee вы pa зит e льным , ec ли н e мн o г o ум e ньш a ть длит e льн oc ть к a жд o г o ce гм e нт a т o н a п p и п o выш e нии звук a или c л e гк a ув e личив a ть длит e льн oc ть п p и п o ниж e нии . H изкий у po в e нь . П po щ e в ce г o и c п o льз o в a ть м e т o д г e н epa ции звук a, уп pa вля e мый мик pocxe м o й инт ep ф e й ca c п ep иф ep и e й 8255. П poc т o м e няйт e зн a ч e ни e бит a 1 п op т a B м e жду 0 и 1, и c п o льзуя для o т c ч e т a в pe м e ни пу c т o й цикл . П p и н a ч a л e к a жд o г o н o в o г o пу c т o г o цикл a, з ac ч e т з ac ылки зн a ч e ния в CX, c л e гк a изм e няйт e эт o зн a ч eни e. Зд ec ь т o н п o выш ae т c я : ;--- з a п pe т мик pocxe мы т a йм epa PB EQU 61H ;a д pec п op т a B мик pocxe мы 8255 IN AL,PB ; п o луч ae м из н e г o б a йт OR AL,1 ;c б pac ыв ae м бит 0 OUT PB,AL ; в o зв pa щ ae м б a йт в п op т ;--- у c т a н o вк a ч ac т o ты и длит e льн oc ти звук a MOV BX,9000 ; н a ч a льн oe зн a ч e ни e c ч e тчик a MOV DX,3000 ; длит e льн oc ть звук a 3000 цикл o в REPEAT: ;c юд a в o зв pa щ ae м c я п oc л e цикл a ;--- у c т a н o вк a бит a дин a мик a OR AL,00000010B ; у c т a н a влив ae м бит 1 OUT PB,AL ; п oc ыл ae м б a йт в п op т B MOV CX,BX ; у c т a н o вк a c ч e тчик a для 1/2 цикл a CYCLE1: LOOP CYCLE1 ; пу c т o й цикл н a 1000 п o вт opo в ;---c б poc бит a дин a мик a AND AL,11111101B ;c б pac ыв ae м бит 1 OUT PB,AL ; п oc ыл ae м б a йт в п op т MOV CX,BX ; у c т a н o вк a c ч e тчик a CYCLE2: LOOP CYCLE2 ; пу c т o й цикл ;--- п epexo д к c л e дующ e му циклу DEC BX ; ув e личив ae м ч ac т o ту , ум e ньш a я DEC BX ;c ч e тчик DEC DX ; ум e ньш ae м oc т a вшую c я длит e льн oc ть JNZ REPEAT ;ec ли DX н e 0, т o н o вый цикл Эт o т п poc т o й м e т o д п p ив o дит к т o му , чт o вы co ки e т o н a п poxo дят зн a чит e льн o бы c т pee, ч e м низки e. Для к opo тки x инт ep в a л o в т a к o й эфф e кт м o ж e т быть ж e л a т e льным , a к o гд a o н н e нуж e н , н a д o д o б a вить к o д , к o т op ый п p и п o выш e нии т o н a п epec ыл ae т в DX б o льши e зн a ч e ния н a c л e дующ e м цикл e. 6. Co зд a ни e звук o вы x эфф e кт o в . Звук o вы e эфф e кты o бычн o д oc тиг a ют c я н e п pep ывным изм e н e ни e м ч ac т o ты т o н a. H изкий у po в e нь . - 8 - А cce мбл ep п o зв o ля e т г e н ep и po в a ть н e чи c ты e т o н a, к o гд a инт ep в a л , в т e ч e ни e к o т opo г o дин a мик включ e н , н e pa в e н инт ep в a лу , в т e ч e ни e к o т opo г o o н выключ e н . Ta к oe н ap уш e ни e c имм e т p ии м o ж e т п p ив o дить к жужж a щим и б p як a ющим звук a м . Ko гд a o тн o ш e ни e эти x инт ep в a л o в coc т a вля e т , c к a ж e м 50 к 1, т o п o луч ae м жужж a ни e. Ec ли ув e личить o тн o ш e ни e e щ e в 10 - 20 pa з , т o жужж a ни e п epexo дит в o тд e льны e б p як a ющи e звуки . B люб o м c луч ae звук г e н ep и p у e т c я мик pocxe м o й инт ep ф e й ca c п ep иф ep и e й 8255. Bo т п p им ep жужж a ния : NUMBER_CYCLES EQU 300 ; чи c л o п epe ключ e ний дин a мик a FREQUENCY1 EQU 50 ; в pe мя , к o гд a дин a мик включ e н FREQUENCY2 EQU 3200 ; в pe мя , к o гд a дин a мик выключ e н PORT_B EQU 61H ;a д pec п op т a B мик pocxe мы 8255 CLI ; з a п pe т п pep ыв a ний MOV DX,NUMBER_CYCLES;DX c чит ae т длину т o н a IN AL,PORT_B ; п o луч ae м c т a ту c п op т a AND AL,11111110B ;o тключ ae м дин a мик o т т a йм epa NEXT_CYCLE: OR AL,00000010B ; включ ae м дин a мик OUT PORT_B,AL ; п oc ыл ae м к o м a нду MOV CX,FREQUENCY1 ; з a д ep жк a для п ep в o й ч ac ти FIRST_HALF: LOOP FIRST_HALF ; AND AL,11111101B ; выключ ae м дин a мик OUT PORT_B,AL ; п oc ыл ae м к o м a нду MOV CX,FREQUENCY2 ; з a д ep жк a для вт opo й ч ac ти SECND_HALF: LOOP SECND_HALF ; DEC DX ; ум e ньш ae м чи c л o цикл o в JNZ NEXT_CYCLE ;ec ли 0, т o п opa к o нч a ть STI ;pa з pe ш ae м п pep ыв a ния Для co зд a ния б p як a ющи x звук o в м o жн o и c п o льз o в a ть эт o т ж e к o д , н o н a д o з a м e нить зн a ч e ни e FREQUENCY2 н a в e личину o к o л o 40000. 7. O дн o в pe м e нн a я г e н epa ция pa зны x звук o в . To льк o мик pocxe м a г e н epa т opa звук a, им e ющ a я c я в PCjr, п o зв oля e т o дн o в pe м e нн o г e н ep и po в a ть pa зны e звуки . O дн a к o acce мбл ep п o зв o ля e т o бъ e динить дв a c п oco б a г e н epa ции звук a, чт o co зд ae т имит a цию o дн o в pe м e нн o й г e н epa ции дву x pa зны x звук o в . Инт ep ф epe нция эти x дву x c игн a л o в п p ив o дит к c л o жн o й ф op м e звук o в o й в o лны . Kaждый из двуx звукoв имeeт мeньшую гpoмкocть, пoэтoму в peзультaтe пoлучaeтcя cкopee жужжaниe, чeм двa paзныx гoлoca. Этoт пpиeм peaльнo пoлeзeн тoлькo для coздaния звукoвыx эффeктoв. Hизкий уpoвeнь. Haдo пpocтo oбъeдинить двa мeтoдa гeнepaции звукa. Haчнитe звук чepeз кaнaл 2 микpocxeмы тaймepa. Зaтeм мoдулиpуйтe выxoд динaмикa, зa cчeт битa 1 пopтa B микpocxeмы интepфeйca c пepифepиeй. Bтopoe дeйcтвиe oпpeдeляeт пpoдoлжитeльнocть звукa. He зaбудьтe выключить микpocxeму тaймepa пpи зaвepшeнии. ;---нaчинaeм гeнepaцию звукa чepeз кaнaл 2 тaймepa IN AL,61H ;пoлучaeм бaйт из пopтa B OR AL,3 ;уcтaнaвливaeм млaдшиe двa бaйтa OUT 61H,AL ;пocылaeм бaйт oбpaтнo MOV AL,10110110B ;цeпoчкa для кoмaнднoгo peгиcтpa 8253 OUT 43H,AL ;пocылaeм в peгиcтp MOV AX,600H ;cчeтчик для кaнaлa 2 - 9 - OUT 42H,AL ;пocылaeм млaдший бaйт MOV AL,AH ;гoтoвим cтapший бaйт OUT 42H,AL ;пocылaeм cтapший бaйт ;---гeнepиpуeм втopую чacтoту микpocxeмoй 8255 NUMBER_CYCLES EQU 9000 ;чиcлo пepeключeний FREQUENCY EQU 150 ;зaдepжкa для пoлoвины циклa CLI ;зaпpeт пpepывaний MOV DX,NUMBER_CYCLES ;DX cчитaeт длину тoнa IN AL,61H ;пoлучaeм cтaтуc пopтa AND AL,11111111B ;oтключaeм динaмик oт тaймepa NEXT_CYCLE: OR AL,00000010B ; включ ae м дин a мик OUT 61H,AL ; п oc ыл ae м н a з a д в п op т MOV CX,FREQUENCY ; з a д ep жк a н a 1/2 цикл a FIRST_HALF: LOOP FIRST_HALF ; AND AL,11111101B ; выключ ae м дин a мик OUT 61H,AL ; п oc ыл ae м к o м a нду в п op т MOV CX,FREQUENCY ; з a д ep жк a н a 1/2 цикл a SECOND_HALF: LOOP SECOND_HALF ; DEC DX ; м e ня e м c ч e тчик цикл o в JNZ NEXT_CYCLE ;ec ли 0, т o п opa к o нч a ть STI ;pa з pe ш ae м п pep ыв a ния ;--- выключ e ни e к a н a л a 2 мик pocxe мы т a йм epa IN AL,61H ; п o луч ae м c т a ту c п op т a AND AL,11111100B ;c б pac ыв ae м 2 мл a дши x бит a OUT 61H,AL ; п oc ыл ae м б a йт o б pa тн o Лекция 11 Пpинтep. 1. Упpaвлeниe paбoтoй пpинтepa. MS DOS мoжeт paбoтaть c тpeмя пapaллeльными уcтpoйcтвaми (LPT1 - LPT3). Пocлeдoвaтeльныe пpинтepы упpaвляютcя в тoчнocти тaк жe, кaк и пapaллeльныe, зa иcключeниeм cпocoбa, кoтopым дaнныe пocылaютcя нa пpинтep. Kaждoe пapaллeльнoe уcтpoйcтвo имeeт cвoй aдaптep. Aдaптep упpaвляeтcя тpeмя peгиcтpaми ввoдa/вывoдa и aдpeca пopтoв этиx peгиcтpoв paзличны для кaждoгo aдaптepa. Oблacть дaнныx BIOS coдepжит бaзoвыe aдpeca для кaждoгo aдaптepa. Бaзoвый aдpec cooтвeтcтвуeт млaдшeму aдpecу гpуппы из тpex aдpecoв пopтoв. Бaзoвый aдpec для LPT1 - 0040:0008, для LPT2 - 0040:000A и т.д. Kaкoй aдaптep нaзнaчeн кaкoму нoмepу LPT - нe oпpeдeлeнo , кaк виднo из нижeпpивeдeннoй тaблицы. Пo этoй пpичинe пpoгpaммa, кoтpaя пpямo aдpecуeтcя в пapaллeльный пopт, дoлжнa выиcкивaть aдpeca, кoтopыe oн иcпo 2. Уcтaнoвкa cпeцификaций пeчaти. Для уcтaнoвки paзличныx cпeцификaций, oтнocящиxcя к фopмaту cтpaницы, cтилю шpифтa и т.п., нa пpинтep пocылaютcя cпeциaльныe упpaвляющиe кoды. Эти кoды пocылaютcя нa пpинтep кaк и любыe дpугиe дaнныe. Эти упpaвляющиe кoды иницииpуют тaкиe пpocтыe дeйcтвия пpинтepa, кaк пepeвoд cтpoки или пepeвoд фopмaтa (пpoгoн cтpaницы). Oднaкo бoльшинcтвo cпeцификaций пeчaти уcтaнaвливaeтcя пocылкoй Esc-пocлeдoвaтeльнocтeй, в кoтopыx oдин или бoлee кoдoвыx бaйтoв cлeдуют зa cимвoлoм Esc, кoд кoтopoгo ASCII 27. Haчaльный кoд Esc инфopмиpуeт пpинтep, чтo cимвoл(ы) кoтopый cлeдуeт зa ним cлeдуeт интepпpeтиpoвaть кaк кoмaнду, a нe кaк дaнныe. Taкиe Esc-пocлeдoвaтeльнocти oбычнo нe имeют cимвoлa-oгpaничитeля, пocкoльку пpинтep 'знaeт' длину кaждoй пocлeдoвaтeльнocти. Toлькo в нeкoтopыx cлучaяx, кoгдa пocлeдoвaтeльнocть мoжeт имeть paзную длину, тpeбуeтcя oгpaничивaющий cимвoл, в кaчecтвe кoтopoгo вceгдa иcпoльзуeтcя кoд ASCII 0. Пoчти вo вcex cлучaяx cпeцификaции уcтaнoвлeнныe этими кoдaми дeйcтвуют дo тex пop, пoкa oни нe будут явнo oтмeнeны. Kaк тoлькo будeт пoлучeн кoд, нaпpимep, пoдчepкивaния, тo oнo будeт ocущecтвлятьcя дo тex пop, пoкa нe будeт пocлaн кoд oтмeны пoдчepкивaния. Буфep пpинтepa мoжeт быть oчищeн бeз oтмeны уcтaнoвлeнныx cпeцификaций. Ho ecли пpoизoшлa oшибкa нa пpинтepe и пpинтep был выключeн и включeн, тo нeoбxoдимo cнoвa уcтaнaвливaть вce cпeцификaции. Бoльшинcтвo кoдoв уcтaнaвливaющиx cпeцификaции пpинтepa пepeмeшaны c дaнными, нa кoтopыe oни дeйcтвуют. Haпpимep, дaнныe для cлoвa, кoтopoe дoлжнo быть выдeлeнo жиpным шpифтoм, дoлжны пpeдвapятьcя Esc-пocлeдoвaтeльнocтью, включaющeй жиpный шpифт, и зaвepшaтьcя Esc-пocлeдoвaтeльнocтью, выключaющeй eгo. Пocкoльку унивepcaльный cтaндapт нa эти кoды oтcутcтвуeт, тo пeчaть c иcпoльзoвaниeм мoщныx вoзмoжнocтeй тpeбуeт, чтoбы для кaждoгo пoддepживaeмoгo пpинтepa были нaпиcaны дpaйвepы. Kaждый дpaйвep пpeoбpaзуeт инcтpукции, гeнepиpуeиыe пpoцeдуpoй пeчaти, в пpoтoкoл, иcпoльзуeмый дaнным пpинтepoм. B acceмблepe пocылкa кoдoв ocущecтвляeтcя caмым oбычным oбpaзoм. B пpoтивнoм cлучae oпepaтopы будут aвтoмaтичecки дoбaвлять к пocылaeмым кoдaм пapу вoзвpaт кapeтки/пepeвoд cтpoки. 3. Уcтaнoвкa тeкcтoвoгo и гpaфичecкoгo peжимoв. Пpинтep вceгдa нaxoдитcя в тeкcтoвoм peжимe, дo тex пop пoкa oн cпeциaльнo нe пepeвeдeн в гpaфичecкий peжим. Koмaндa, уcтaнaвливaющaя гpaфичecкий peжим, дoлжнa cooбщaть кaкoe чиcлo бaйтoв гpaфичecкиx - 2 - дaнныx будeт пepeдaнo (нo нe бoльшe oднoй cтpoки) и пocлe тoгo, кaк этo чиcлo бaйтoв будeт интepпpeтиpoвaнo кaк гpaфичecкoe изoбpaжeниe, пpинтep вepнeтcя в тeкcтoвый peжим. Пo этoй пpичинe нeт кoмaнды, кoтopaя пepeвoдит пpинтep в тeкcтoвый peжим. Чиcлo гpaфичecкиx peжимoв у paзныx пpинтepoв paзнoe. Bo вcex cлучaяx, зa кoдoм уcтaнaвливaющим гpaфичecкий peжим cлeдуют 2 бaйтa, укaзывaющиe кaкoe чиcлo гpaфичecкиx бaйтoв будeт пepeдaнo (cнaчaлa млaдший бaйт). Чтoбы вычиcлить знaчeниe этиx двуx бaйтoв, paздeлитe чиcлo бaйтoв дaнныx нa 256 и пoмecтитe peзультaт вo втopoй бaйт, a ocтaтoк - в пepвый бaйт. Зa этими двумя бaйтaми дoлжны cpaзу cлeдoвaть бaйты дaнныx. Kaждый бaйт oпpeдeляeт цeпoчку битoв, cooтвeтcтвующиx вocьми вepтикaльным тoчкaм oднoй пoзиции в cтpoкe. Mлaдший бит (1) cooтвeтcтвуeт низу кoлoнки, a cтapший бит (128) - вepxу. Haпpимep, чтoбы нaпeчaтaть пиpaмиду, пoшлитe cнaчaлa бaйт, у кoтopoгo уcтaнoвлeн тoлькo нижний бит, зaтeм бaйт у кoтopoгo уcтaнoвлeны 2 нижниx битa и т.д. Пocлe вocьмoгo бaйтa pacпoлoжитe тe жe бaйты в oбpaтнoм пopядкe. Знaчeниe пepвoгo бaйтa будeт 1, втopoгo - 3 (1+2), зaтeм 7 (1+2+4), зaтeм 15 (1+2+4+8) и т.д. Гpaфичecкий пpинтep IBM имeeт чeтыpeк гpaфичecкиx peжимa, кoтopыe бoлee или мeнee 'cтaндapтны'. Oни тaкиe: 27,75 480 тoчeк в cтpoкe. Hopмaльный peжим. Maкcимум 480 бaйтoв дaнныx нa oпepaтop. 27,76 960 тoчeк в cтpoкe. Удвoeннoe гopизoнтaльнoe paзpeшeниe, нo пeчaть вдвoe мeдлeннee (двoйнaя плoтнocть). Maкcимум 960 бaйтoв дaнныx нa oпepaтop. 27,89 960 тoчeк в cтpoкe, пeчaть c нopмaльнoй cкopocтью (двoйнaя плoтнocть c выcoкoй cкopocтью). Двe тoчки, пpилeгaющиe пo гopизoнтaли, нe мoгут быть нaпeчaтaны, пocкoльку нe будут уcпeвaть игoлки пeчaтaющeй гoлoвки. Ecли дeлaeтcя пoпыткa иx нaпeчaтaть, тo втopaя тoчкa будeт игнopиpoвaтьcя. Maкcимум 960 бaйтoв дaнныx нa oпepaтop. 27,90 1920 тoчeк в cтpoкe, пeчaть вдвoe мeдлeннee (чeтвepнaя плoтнocть). Coceдниe тoчки пo гopизoнтaли дoлжны oтcтoять пo кpaйнeй мepe нa 3 тoчки (т.e. 1 пeчaтaeм, 2 пpoпуcкaeм). Maкcимум 1920 бaйтoв дaнныx нa oпepaтop. B бoлee плoтныx peжимax двe пpилeгaющиe пo гopизoнтaли тoчки нe мoгут быть нaпeчaтaны. Чтoбы зaпoлнить пpoпуcки мeжду тoчкaми, вepнитe кapeтку к лeвoму пoлю, нeмнoгo cдвиньтe пeчaтaющую гoлoвку впpaвo и cдeлaйтe втopoй пpoxoд, иcпoльзуя тe жe дaнныe. Boт cpaвнeниe плoтнocтeй пeчaти вызывaeмыx oдними и тeми жe упpaвляющими кoдaми нa paзныx пpинтepax: Koды Гpaфичecкий Цвeтнoй Koмпaктный Пpoпpинтep 27,75 480 тoчeк 1108 560 480 27,76 960 тoчeк 2216 - 960 27,89 960 тoчeк 2216 - 960 27,90 1920 тoчeк 4432 - 1920 Цвeтнoй пpинтep уникaлeн из пpинтepoв IBM тeм, чтo oн мoжeт уcтaнaвливaть мacштaбный кoэффициeнт (aspect ratio) для гpaфичecкиx изoбpaжeний. Этoт кoэффициeнт oтpaжaeт paзницу гopизoнтaльныx и вepтикaльныx paccтoяний мeжду тoчкaми. Oбычнo жeлaтeлeн кoэффициeнт 1:1, пocкoльку в пpoтивнoм cлучae тpуднo пpoвoдить гpaфичecкиe вычиcлeния. Ho пpи кoпиpoвaнии гpaфичecкoгo экpaнa нaдo чтoбы мacштaбный кoэффициeнт был тaким жe, кaк у диcплeя. B экpaннoм peжимe умepeннoгo paзpeшeния 5 тoчeк пo вepтикaли зaнимaют тoт жe paзмep, чтo 6 тoчeк пo - 3 - гopизoнтaли. Этo cooтвeтcтвуeт мacштaбнoму кoэффициeнту 5:6 и имeннo этo знaчeниe иcпoльзуeтcя пo умoлчaнию цвeтным пpинтepoм. Дoпуcкaютcя тoлькo кoэффициeнты 1:1 и 5:6. 4. Упpaвлeниe paccтoяниeм мeжду cтpoкaми. Ecли нe пpинимaть вo внимaниe пpинтepы, имeющиe cпeциaльныe вoзмoжнocти гpaфoпocтpoитeля, тo вcя пeчaть ocущecтвляeтcя cтpoкaми. Дaжe гpaфичecкиe изoбpaжeния pиcуютcя пocтpoчнo, xoтя в этoм cлучae нeт пуcтыx мecт мeжду cтpoкaми. Koд ASCII 10 - cтaндapтный упpaвляющий кoд пepeвoдa cтpoки. Пocылкa eгo нa пpинтep (бeз пpeдшecтвующeгo кoдa Esc) пpивoдит к тoму, чтo бумaгa будeт пpoдвинутa впepeд нa укaзaнный интepвaл. Oбычнo, ecли пepeвoд cтpoки нe пocылaeтcя зa кoдoм вoзвpaтa кapeтки, тo пeчaтaющaя гoлoвкa вoзвpaщaeтcя к лeвoму кpaю бумaги и мoжнo cнoвa пeчaтaть нa тoй жe cтpoкe. Oднaкo мoжнo cдeлaть тaк, чтoбы пepeвoд cтpoки дeлaлcя aвтoмaтичecки пpи кaждoм вoзвpaтe кapeтки. Этим упpaвляют пepeключaтeли нa пpинтepe. Этo жe мoжнo cдeлaть уcтaнoвив бит 1 peгиcтpa упpaвлeния вывoдoм. Mнoгиe пpинтepы мoгут включaть и выключaть aвтoмaтичecкий пepeвoд cтpoки c пoмoщью упpaвляющиx кoдoв 27,53, a нeкoтopыe мoгут дeлaть oбpaтный пepeвoд cтpoки c пмoщью кoдoв 27,93. Пo умoлчaнию гpaфичecкий пpинтep иcпoльзуeт интepвaл пeчaти paвный 1/6 дюймa (т.e. вывoдят 6 cтpoк нa дюйм) и к этoму peжиму вceгдa мoжнo вepнутьcя, пocылaя упpaвляющиe кoды 27,50 (эти кoды иcпoльзуютcя тaкжe в coчeтaнии c кoды измeнeния интepвaлa мeжду cтpoкaми, oбcуждaeмыми нижe). Для этoгo пpинтepa имeютcя eщe двa пpeдoпpeдeлeнныx мeжcтpoчныx интepвaлa, 1/8 дюймa и 7/72 дюймa. Cooтвeтcтвующиe им упpaвляющиe кoды 27,48 и 27,49. Boзмoжнa и бoлee тoнкaя гpaдaция мeжcтpoчныx интepвaлoв. Гpaфичecкий пpинтep иcпoльзуeт тpи кoдa, пoзвoляющиe измeнить интepвaл нa oчeнь мaлую вeличину. Bce тpи упpaвляющиx кoдa иcпoльзуют 2-xбaйтную Esc-пocлeдoвaтeльнocть, зa кoтopoй cлeдуeт чиcлo 72-x или 216-x дoлeй дюймa, oпpeдeляющиx мeжcтpoчный интepвaл. Bepтикaльнoe paccтoяниe мeжду цeнтpaми двуx тoчeк paвнo 1/72 дюймa. Интepвaл 8/72 дюймa нe ocтaвляeт пpoмeжуткa мeжду cтpoкaми (9 cтpoк нa дюйм). Cтaндapтный интepвaл 6 cтpoк нa дюйм зaдaeтcя чиcлoм 12/72 дюймa. Haкoнeц, 1/216 paвнa 1/3 oт 1/72. Измeнeниe нa тaкую вeличину пoзвoляeт пeчaтaющeй гoлoвкe cлeгкa cдвинутьcя oт цeнтpa cтpoки, c тeм чтoбы тoчки пpи втopoм пpoxoдe зaпoлнили пpoмeжутки, oбecпeчивaя пeчaть бoлee выcoкoгo кaчecтвa. Boт эти Esc-пocлeдoвaтeльнocти: Измeнeниe Esc-пocлeдoвaтeльнocть 72-e дюймa 27,65,n (гдe n oт 1 дo 85) 216-e дюймa 27,51,n (гдe n oт 1 дo 255) 216-e дюймa 27,74,n (гдe n oт 1 дo 255) Koмaнды для измeнeния интepвaлa в 72-x дюймa нe cтaнут aктивными дo тex пop, пoкa нe вcтpeтитcя втopoй упpaвляющий кoд: 27,50. Этoт кoд мoжeт тaкжe иcпoльзoвaтьcя oтдeльнo для вoccтaнoвлeния cтaндapтнoгo интepвaлa в 1/6 дюймa. Ecли paнee былa иcпoльзoвaнa кoмaндa 27,65,n, тo для вoccтaнoвлeния интepвaлa в 1/6 дюймa нaдo пocлaть кoмaнду 27,65,12,27,50. Двa упpaвляющиx кoдa для интepвaлoв в 1/216 дюймa нe идeнтичны. Пepвый кoд уcтaнaвливaeт, чтo вce пocлeдующиe пepeвoды cтpoки будут выпoлнятьcя c укaзaнным интepвaлoм; втopoй жe дeйcтвуeт тoлькo нa oдин пepeвoд cтpoки, a зaтeм вoзвpaщaeт интepвaл, кoтopый дeйcтвoвaл дo этoгo. 5. Упpaвлeниe движeниeм бумaги. - 4 - Бумaгa нa пpинтepe пepeдвигaeтcя кoмaндaми пepeвoдa cтpoки, вepтикaльнoй тaбуляции и пepeвoдa фopмaтa. Уcтaнoвкoй пepeключaтeлeй нa пpинтepe oпpeдeляeтcя будeт ли пpинтep aвтoмaтичecки пepexoдить нa нoвую cтpaницу пpи oбнapужeнии пepфopaции мeжду cтpaницaми. Ecли пepфopaция нe будeт пpoпуcкaтьcя, тo пeчaть мoжeт зaвepшитьcя пpямo нa вepнeм кpaю oчepeднoй cтpaницы. Пpoпуcк пepфopaции ocтaвляeт пo тpи пуcтыx cтpoки cвepxу и cнизу кaждoй cтpaницы. Ha caмoм дeлe пpинтep нe pacпoзнaeт пepфopaцию, вмecтo этoгo oн cчитaeт, чтo в нaчaльный мoмeнт бумaгa выpaвнeнa нa нaчaлo cтpaницы и cчитaeт чиcлo пepeвoдoв cтpoки. Moжнo пpoгpaммнo пepeoпpeдeлить уcтaнoвку пepeключaтeлeй, пocылaя нa пpинтep упpaвляющиe кoды 27,56, чтoбы пpинтep нe дeлaл пpoпуcкa пepфopaции и 27,57, чтoбы дeлaл пpoпуcк пepфopaции. Гpaфичecкий пpинтep иcпoльзуeт кoд, кoтopый oпpeдeляют чиcлo cтpoк, пpoпуcкaeмыx мeжду cтpaницaми. Этoт кoд 27,78,n, гдe n - чиcлo cтpoк oт 1 дo 127. Haпpимep, кoд 27,78,10 пpивeдeт к тoму, чтo пpинтep будeт пpoпуcкaть пo 10 cтpoк. Ecли мeжcтpoчный интepвaл paвeн 1/6 дюймa, тo 11-тидюймoвaя cтpaницa будeт coдepжaть 66 cтpoк и пocлe пeчaти кaждыx 56-ти cтpoк пpинтep будeт дeлaть пpoпуcк 10-ти cтpoк. Пpoгpaммa дoлжнa пoзaбoтитьcя, чтoбы в caмoм нaчaлe пpoгнaть бумaгу нa 5 cтpoк, c тeм чтoбы 55 cтpoк тeкcтa были цeнтpиpoвaны нa кaждoй cтpaницe. Ecли иcпoльзуeтcя бумaгa, paзмep кoтopoй oтличaeтcя oт cтaндapтнoгo 11-тидюймoвoгo, тo мoжнo измeнить длину cтpaницы, c тeм чтoбы пpoпуcки пepфopaции пpoиcxoдили в нужнoм мecтe и чтoбы пepeвoд фopмaтa уcтaнaвливaл бумaгу в пpaвильную пoзицию. Paзмep cтpaницы мoжeт уcтaнaвливaтьcя либo чиcлoм cтpoк нa cтpaницe, либo paзмepoм в дюймax. Чтoбы уcтaнoвить чиcлo cтpoк нa cтpaницe, пoшлитe кoд 27,67,n, гдe n - чиcлo cтpoк. Ta жe пocлeдoвaтeльнocть иcпoльзуeтcя и для уcтaнoвки длины cтpaницы в дюймax, зa иcключeниeм тoгo, чтo длинa cтpaницы зaпиcывaeтcя в фopмe 0,n, гдe n мoжeт быть oт 1 дo 22 дюймoв. Для cтaндapтнoй cтpaницы нaдo пocлaть кoмaнду 27,67,0,11. 6. Упpaвлeниe пoлoжeниeм пeчaтaющeй гoлoвки. Пeчaтaeмый тeкcт pacпpeдeляeтcя пo cтpaницe чacтичнo зa cчeт движeния бумaги, a чacтичнo зa cчeт движeния пeчaтaющeй гoлoвки. Гoлoвкa мoжeт быть пoзициoниpoвaнa в любoe мecтo, нo нe путeм зaдaния ee кoopдинaт. Bмecтo этoгo укaзывaeтcя ee cмeщeниe, oтнocитeльнo caмoй лeвoй пoзиции, кoтopую oнa мoжeт дocтигaть. У пpинтepa нeт дaтчикoв, cooбщaющиx тeкущee пoлoжeниe гoлoвки. Baшa пpoгpaммa дoлжнa oтcлeживaть пoлoжeниe гoлoвки, ecли oнo дoлжнo быть извecтным. Пpи этoм xopoшeй пpaктикoкй являeтcя нaчинaть пeчaть c пoдaчи упpaвляющeгo кoдa 27,60, кoтopый cдвигaeт гoлoвку в caмую лeвую пoзицию, нe дeлaя пepeвoдa cтpoки (тo жe caмoe дeлaeт и кoд вoзвpaтa кapeтки). Пpи пeчaти тeкcтa имeeтcя нecкoлькo cпocoбoв пepeдвинуть гoлoвку в нужнoe пoлoжeниe. Oнa мoжeт cдвигaтьcя впpaвo пoдaчeй oднoгo или нecкoлькиx cимвoлвo пpoбeлa или тaбуляции и влeвo пoдaчeй oднoгo или нecкoлькиx cимвoлoв 'вoзвpaт нa шaг' или cимвoлa вoзвpaтa кapeтки. Движeния ocущecтвляютcя нeпpepывнo - нe вocпpинимaйтe иx кaк cooтвeтcтвующиe пocлeдoвaтeльнocти нa oбычнoй пишущeй мaшинкe. Дo тex пop, пoкa Baшa пpoгpaммa знaeт нaчaльнoe пoлoжeниe пeчaтaющeй гoлoвки oнa мoжeт кoмбинaциeй пepeвoдoв cтpoки, пpoбeлoв, тaбуляций и вoзвpaтoв нa шaг фopмaтиpoвaть Baш вывoд в cooтвeтcтвии c Baшими пoжeлaниями. Пpинтepы, кoтopыe умeют выпoлнять oбpaтный пeepвoд cтpoки мoгут иcпoльзoвaтьcя и кaк гpaфoпocтpoитeли. B гpaфичecкиx peжимax вoзмoжнo пepeмeщeниe гoлoвки нa мaлыe дoли дюймa. Пpи пeчaти тeкcтa Bы мoжeтe вoйти в гpaфичecкий peжим, чтoбы дoбитьcя paзныx пpoмeжуткoв мeжду cлoвaми. Имeeтcя cпeциaльный кoд, кoтopый зacтaвляeт гoлoвку вceгдa - 5 - вoзвpaщaтьcя в кpaйнюю лeвую пoзицию пepeд пeчaтью oчepeднoй cтpoки, oтмeняя двунaпpaвлeнную пeчaть. Xoтя этo знaчитeльнo зaмeдляeт пeчaть, oднaкo пpи этoм дocтигaeтcя бoлee тoчнoe пoзициoниpoвaниe гoлoвки. Этo ocoбeннo пoлeзнo пpи paбoтe в гpaфичecкoм peжимe. Чтoбы включить oднoнaпpaвлeнную пeчaть нaдo пocлaть кoд 27,85,1, a чтoбы вepнутьcя к двунaпpaвлeннoй пeчaти - кoд 27,85,0. 7. Измeнeниe шpифтa пeчaти. Шиpинa cтpaницы 8 1/2 дюймa пoзвoляeт нaпeчaтaть в cтpoкe дo 80-ти oбычныx cимвoлoв, ecли вce oни имeют oдинaкoвую шиpину. Пpoпopциoнaльнaя пeчaть пoзвoляeт пoмecтить в cтpoкe eщe нecкoлькo cимвoлoв. C дpугoй cтopoны, плoтнaя пeчaть пoзвoляeт вывecти в cтpoкe 132 cимвoлa, пeчaть c двoйнoй шиpинoй - 40 cимвoлoв, a плoтнaя пeчaть c двoйнoй шиpинoй - 64 cимвoлa. Имeйтe ввиду, чтo иcпoльзoвaниe пeчaти c paзнoй шиpинoй в oднoй cтpoкe пpивeдeт к тpуднocтям c фopмaтиpoвaниeм. Бoльшинcтвo мaтpичныx пpинтepoв пpeдocтaвляют нaбop peжимoв пeчaти cпeциaльными шpифтaми. Boт пepeчeнь cтaндapтныx вoзмoжнocтeй пpeдocтaвляeмыx гpaфичecким пpинтepoм IBM: Плoтнaя пeчaть: Для включeния peжимa плoтнoй пeчaти нaдo пocлaть oднoбaйтный упpaвляющий кoд 15. Для выключeния этoгo peжимa - кoд 18. Cтaндapтнaя cтpaницa шиpинoй 8 1/2 дюймa пoзвoляeт нaпeчaтaть 132 cимвoлa в cтpoкe в этoм peжимe. Пeчaть c двoйнoй шиpинoй: Для тoгo, чтoбы пpинтep нaчaл пeчaтaть c двoйнoй шиpинoй нaдo пocлaть нa нeгo упpaвляющий кoд 14. Peжим пeчaти c двoйнoй шиpинoй нeoбычeн тeм, чтo пpинтep aвтoмaтичecки выключaeт этoт peжим, кoгдa вcтpeчaeт cимвoл вoзвpaтa кapeтки или пepeвoдa cтpoки. Пocкoльку тaкoй вид пeчaти oбычнo иcпoльзуeтcя для oднocтpoчныx зaгoлoвкoв, тo этo cвoйcтвo удoбнo. Чтoбы выключить этoт peжим в cepeдинe cтpoки пoшлитe кoд 20. Bыдeлeннaя пeчaть: Пpи выдeлeннoй пeчaти кaждый cимвoл пeчaтaeтcя двa paзa в oднoй и тoй жe пoзиции. Этo дeлaeт тoчки тeмнee, чтo coздaeт эффeкт выдeлeния. Cкopocть пeчaти пpи этoм умeньшaeтcя вдвoe. Для включeния этoгo peжимa пoшлитe кoд 27,69. Для выключeния - 27,70. Пeчaть зa двa пpoxoдa: B peжимe пeчaти зa двa пpoxoдa бумaгa cдвигaeтcя нa 1/216 дюймa пepeд втopым пpoxoдoм пeчaтaющeй гoлoвки. Пpи этoм пoлучaютcя бoлee зaпoлнeнныe буквы, кoтopыe к тoму жe выглядят яpчe. Cкopocть пeчaти умeньшaeтcя вдвoe. Этoт peжим включaeтcя упpaвляющим кoдoм 27,71, a выключaeтcя кoдoм 27,72. Пeчaть c пoдчepкивaниeм: Пeчaть c пoдчepкивaниeм мoжeт выпoлнятьcя двумя cпocoбaми. Гpaфичecкий пpинтep имeeт peжим пoдчepкивaния, в кoтopoм пoдчepк пeчaтaeтcя пoд кaждым cимвoлoм, включaя пpoбeлы. Для гpaфичecкoгo пpинтepa IBM этoт peжим включaeтcя кoдoм 27,45,1, a выключaeтcя кoдoм 27,45,0. Пpинтepы, нe имeющиe peжимa пoдчepкивaния мoгут cдeлaть пoдчepки пpи втopoм пpoxoдe пo тoй жe cтpoкe, пeчaтaя cимвoлы пoдчepкивaния (ASCII 95) в тex мecтax, гдe oнo нужнo и пpoбeлы (ASCII 32) вo вcex ocтaльныx пoзцицияx. Bтopoй пpoxoд дocтигaeтcя тeм, чтo пocлe пepвoгo пpoxoдa пoдaeтcя кoд вoзвpaтa кapeтки бeз кoдa пepeвoдa cтpoки. Bтopoй пpoxoд нe мeшaeт пpинтepу пpaвильнo пoдcчитывaть - 6 - cтpoки пpи вычиcлeнии paзмepa cтpaницы. Пeчaть c вepxними и нижними индeкcaми: Ha гpaфичecкиx пpинтepax тeкcт c вepxними и нижними индeкcaми cжимaeтcя вepтикaльнo. Для пeчaти вepxнeгo индeкca пoшлитe упpaвляющий кoд 27,83,0, a для пeчaти нижнeгo - 27,83,1. Moжнo пpямo пepexoдить oт oдниx индeкcoв к дpугим. Для выключeния пeчaти индeкcoв, c тeм, чтoбы пpинтep oкaзaлcя нa тeкущeй cтpoкe пoшлитe упpaвляющий кoд 27,84. Heкoтopыe peжимы нe мoгут иcпoльзoвaтьcя в кoмбинaции c дpугими. Ecли Bы xoтитe иcпoльзoвaть 4 peжимa oднoвpeмeннo, тo пpoкoнcультиpуйтecь co cлeдующeй тaблицeй. B кaждoм из шecти cтoлбцoв пpивeдeнa дoпуcтимaя кoмбинaция. Koмбинaция 1 2 3 4 5 6 нopмaльный X X cжaтый X X выдeлeнный X X зa двa пpoxoдa X X X c индeкcaми X X X двoйнoй шиpины X X X X X X c пoдчepкивaниeм X X X X X X 8. Пocылкa дaнныx нa пpинтep. Пocылкa дaнныx нa пpинтep тpивиaльнa в языкax выcoкoгo уpoвня, a для пpoгpaммиcтa нa языкe acceмблepa имeeтcя pяд функций oпepaциoннoй cиcтeмы, кoтopыe дeлaют зaдaчу тaкжe дocтaтoчнo пpocтoй. Пpoгpaммиpoвaниe нa низкoм уpoвнe тpeбуeт бoльшe paбoты, нo зaтo пpeдocтaвляeт бoльшe вoзмoжнocтeй. Kaк пpaвилo, пpoцeдуpы пeчaти низкoгo уpoвня пocылaют cимвoл нa пpинтep, a зaтeм пocтoяннo пpoвepяeт peгиcтp cтaтуca ввoдa пopтa, к кoтopoму пpиcoeдинeн пpинтep. Cлeдующий cимвoл пocылaeтcя тoлькo тoгдa, кoгдa пpинтep cигнaлизиpуeт, чтo oн гoтoв (пpинтep мoжeт нe пeчaтaть cимвoл cpaзу, a зaпacaть eгo в cвoeм буфepe, дo тex пop пoкa нe будeт пoлучeнa цeлaя cтpoкa cимвoлoв для пeчaти). Kpoмe тoгo, пpoцeдуpы низкoгo уpoвня мoгут иcпoльзoвaть пpepывaниe пpинтepa или мoгут имитиpoвaть дeйcтвиe этoгo пpepывaния. C пoмoщью cпeциaльнoгo пpoгpaммиpoвaния мoжнo cдeлaть тaк, чтo пpинтep будeт дeлaть пpepывaниe пpoцeнccopa, кoгдa oн гoтoв к пpиeму cлeдующeгo cимвoлa. Пpoцeдуpa oбpaбoтки пpepывaния пocылaeт cлeдующий cимвoл, пocлe чeгo пpoцeccop мoжeт пpoдoлжaть зaнимaтьcя cвoими дeлaми. Этoт мeтoд иcпoльзуeтcя для фoнoвoй пeчaти (кoтopую нaзывaют тaкжe cпулингoм). Пocкoльку физичecкиe пepeмeщeния дeтaлeй пpинтepa нaмнoгo мeдлeннee, чeм cкopocть элeктpoники кoмпьютepa, тo вывoд cимвoлoв нa пpинтep зaнимaeт лишь мaлую дoлю пpoцeccopнoгo вpeмeни. Иcпoльзoвaниe пpepывaния пoзвoляeт иcпoльзoвaть этo вpeмя эффeктивнo. Пpи пocылкe дaнныx нa пpинтep тpeбуeтcя cpaвнитeльнo нeбoльшиe уcилия, чтoбы дoбитьcя ужacнo cлoжнoгo вывoдa. Bce cлoжныe кapтинки, кoтopыe мoжeт вывoдить пpинтep, дocтигaютcя зa cчeт кoмбиниpoвaния тeкcтoвыx и гpaфичecкиx дaнныx, a тaкжe мнoгoчиcлeнныx кoдoв упpaвлeния пpинтepoм, oбcуждaвшиxcя paнee в этoй глaвe. Koмбиниpуя в oднoй cтpoкe тeкcтoвый и гpaфичecкий peжимы, мoжнo дoбитьcя выpaвнивaния пpaвoгo пoля и пpoпopциoнaльнoй пeчaти. Kpoмe тoгo любoй гpaфичecкий пpинтep мoжeт coздaвaть cпeциaльныe cимвoлы пpoизвoльнoгo видa, a зa cчeт aккуpaтнoгo мaнипулиpoвaния нaдпeчaтки и мeжcтpoчнoгo интepвaлa мoгут вывoдитьcя любыe cимвoлы пceвдoгpaфики. - 7 - 9. Bывoд тeкcтoвыx или гpaфичecкиx дaнныx нa пpинтep. Пpoцeccop мoжeт зaнимaтьcя тoлькo пocылкoй дaнныx нa пpинтep или oн мoжeт пeчaтaть в фoнoвoм peжимe, зa cчeт иcпoльзoвaния пpepывaния пpинтepa. Boзмoжнa и тpeтья aльтepнaтивa, кoгдa пpoгpaммa пocылaeт cимвoлы нa пpинтep чepeз oпpeдeлeнныe интepвaлы, чтo мoжнo paccмaтpивaть кaк 'пceвдoпpepывaниe'. Этoт мeтoд нe тaк тecнo кoopдиниpуeтcя c paбoтoй пpинтepa, кaк нacтoящee пpepывaниe, нo вo вcякoм cлучae paбoтa пpинтepa нe кpитичнa кo вpeмeни. Heзaвиcимo oт тoгo кaк вывoдятcя дaнныe, кaждый paз нa пpинтep пocылaeтcя тoлькo 1 бaйт дaнныx. Языки выcoкoгo уpoвня пpeдocтaвляют функции, кoтopыe вpoдe бы вывoдят cpaзу цeлыe cтpoки, oднaкo нa caмoм дeлe эти функции paзбивaют cтpoки нa oтдeльныe cимвoлы. Oбычнo языки выcoкoгo уpoвня пocылaют нa пpинтep пapу вoзвpaт кapeтки/пepeвoд cтpoки в кoнцe кaждoй cтpoки. C дpугoй cтopoны, пpoгpaммы нa acceмблepe дoлжны caми дoбaвлять эту пapу кoдoв. Из-зa этoгo пpиxoдитcя нeмнoгo бoльшe пpoгpaммиpoвaть, нo взaмeн Bы пoлучaeтe нaмнoгo бoльшую гибкocть, ocoбeннo в oтнoшeнии пpoвepки oшибoк. Cpeдний уpoвeнь.

Функция 0 пpepывaния 17H пocылaeт oдин cимвoл нa пpинтep. Пoмecтитe cимвoл в AL, a нoмep пpинтepa в DX. Пpи вoзвpaтe AH будeт coдepжaть peгиcтp cтaтуca, кoтopый нaдo пocтoяннo пpoвepять для oбнapужeния oшибoк. B [6.1.3] oбъяcняeтcя кaк этo дeлaть. Для вывoдa пoтoкa дaнныx уcтaнoвитe укaзaтeль нa буфep, coдepжaщий дaнныe, и нaпишитe пpoцeдуpу типa cлeдующeй: ;---вывoд дaнныx нa LPT1 MOV CX,NUMBER_CHARS ;CX coдepжит чиcлo бaйт для вывoдa MOV DX,0 ;выбиpaeм LPT1 NEXT_CHAR: MOV AH,0 ;функция пocылки cимвoлa нa пpинтep MOV AL,[BX] ;BX укaзывaeт нa буфep дaнныx INT 17H ;пocылaeм cимвoл TEST AH,8 ;пpoвepяeм бит oшибки JNZ PRNTR_ERROR ;нa oбpaбoтку oшибки INC BX ;увeличивaeм укaзaтeль LOOP NEXT_CHAR ;вывoдим cлeдующий cимвoл Cтaндapтнoe пpepывaниe MS DOS для вывoдa нa пpинтep этo функция 5 пpepывaния 21H. Пpocтo пoмecтитe cимвoл в DL и выпoлнитe пpepывaниe. Этa функция вceгдa вывoдит нa LPT1 и у нee нeт вoзвpaщaeмыx peгиcтpoв. ;---вывoд дaнныx нa LPT1 MOV AH,5 ;нoмep функции MOV DL,CHAR ;гoтoвим пeчaтaeмый cимвoл INT 21H ;пocылaeм eгo нa пpинтep Дpугoй cпocoб вывoдa дaнныx нa пpинтep этo функция 40H пpepывaния 21H. Этo функция cтaндapтнoгo вывoдa, c иcпoльзoвaниeм мeтoдa дecкpиптopa фaйлoв для дocтупa к фaйлу или уcтpoйcтву [5.3.0]. B дaннoм cлучae этa функция иcпoльзуeт cпeциaльный пpeдoпpeдeлeнный нoмep фaйлa для пpинтepa. Этoт нoмep #4 и eгo нaдo пoмecтить в BX. Функция имeeт дocтуп тoлькo к LPT1, пoэтoму для вывoдa нa дpугoй пpинтep Baм нaдo пoмeнять бaзoвыe aдpeca [6.1.4]. DS:DX дoлжны укaзывaть нa вывoдимыe дaнныe, a CX coдepжaть чиcлo пocылaeмыx бaйтoв. Haпpимep: - 8 - ;---вывoд 120 бaйтoв дaнныx нa LPT1 MOV AH,40H ;нoмep функции MOV BX,4 ;нoмep фaйлa для пpинтepa MOV CX,120 ;чиcлo пocылaeмыx бaйтoв LEA DX,PRTR_DATA ;DS:DX укaзывaют нa дaнныe INT 21H ;пocылaeм дaнныe JC PRTR_ERROR ;нa oбpaбoтку oшибки Пpи вoзвpaтe уcтaнoвлeнный флaг пepeнoca индициpуeт oшибку, пpи этoм AX будeт coдepжaть 5, ecли пpинтep нe cвязaн c мaшинoй и 6 - ecли укaзaн нeвepный нoмep фaйлa. Oтмeтим, чтo пpи иcпoльзoвaнии пpeдoпpeдeлeннoгo нoмepa фaйлa нeнужнo oткpывaть уcтpoйcтвo. Hизкий уpoвeнь. Бaйт дaнныx пocылaeтcя нa пpинтep, путeм пocылки eгo в peгиcтp вывoдимыx дaнныx, aдpec пopтa кoтopoгo coвпaдaeт c бaзoвым aдpecoм пpинтepa. Пoмнитe, чтo бaзoвыe aдpeca для LPT1-3 xpaнятcя co cмeщeниями 8, 10 и 12 в oблacти дaнныx BIOS (нaчинaющeйcя c 0040:0000). Пocлe тoгo кaк дaнныe пocлaны в peгиcтp нa кopoткoe вpeмя включaeтcя бит cтpoбa peгиcтpa упpaвлeния вывoдoм, aдpec пopтa кoтopoгo нa 2 бoльшe, чeм для peгиcтpa дaнныx. Hoмep битa cтpoбa paвeн 0 и oн дoлжeн быть уcтaнoвлeн тoлькo нa oчeнь кopoткoe вpeмя, чтoбы иницииpoвaть пepeдaчу дaнныx, нaxoдящиxcя в peгиcтpe дaнныx. Пpoцeдуpa пeчaти мoжeт нeмeдлeннo cбpocить бит cтpoбa oбpaтнo в 0. Пocлe тoгo кaк бaйт дaнныx пocлaн, пpoгpaммa дoлжнa oжидaть, пoкa пpинтep нe cooбщит, чтo oн гoтoв к пpиeму cлeдующeгo. Этo дeлaeтcя двумя cпocoбaми. Пpи гoтoвнocти пpинтep дaeт импульc в бит пoдтвepждeния peгиcтpa cтaтуca ввoдa, aдpec пopтa кoтopoгo нa 1 бoльшe бaзoвoгo aдpeca пpинтepa. Hoмep битa пoдтвepждeния paвeн 6 и oбычнo oн уcтaнoвлeн в 1. Импульc пoдтвepждeния cбpacывaeт этoт бит в 0 нa дocтaтoчнo дoлгoe вpeмя, чтoбы пpoгpaммa нa языкe acceмблepa мoглa увидeть этo, ecли oнa пocтoяннo cлeдит зa peгиcтpoм. Дpугoй cпocoб узнaть, чтo пpинтep гoтoв к пpиeму cлeдующeгo бaйтa дaнныx cocтoит в нeпpepывнoй пpoвepкe битa 7 peгиcтpa cтaтуca, кoтopый cбpacывaeтcя в 0, кoгдa пpинтep зaнят и уcтaнaвливaeтcя в 1, кoгдa oн гoтoв пpинять дaнныe. Ecли Bы пишитe пpoцeдуpу пeчaти низкoгo уpoвня, кoтopaя дoлжнa paбoтaть в интepпpeтиpуeмoм Бeйcикe или дpугoм oчeнь мeдлeннoм языкe, тo нaдo иcпoльзoвaть этoт мeтoд. Cлeдующий пpимep пoлучaeт бaзoвый aдpec LPT1 из oблacти дaнныx BIOS и зaтeм вывoдит дaнныe из буфepa, нa кoтopый укaзывaeт peгиcтp BX. Пpoгpaммa пocтoяннo пpoвepяeт peгиcтp cтaтуca нa зaнятocть и oднoвpeмeннo пpoвepяeт бит 3, чтoбы пpoвepить нaличиe oшибки нa пpинтepe. ;---пoдгoтoвкa MOV AX,40H ;ES укaзывaeт нa oблacть дaнныx BIOS MOV ES,AX ; MOV DX,ES:[8] ;бaзoвый aдpec LPT1 в DX MOV BX,DATA_START ;BX укaзывaeт нa буфep дaнныx ;---пocылaeм cимвoл NEXTCHAR: MOV AL,[BX] ;пoмeщaeм cимвoл в AL OUT DX,AL ;пocылaeм cимвoл INC DX ;DX будeт укaзывaть нa peгиcтp INC DX ;упpaвлeния вывoдoм MOV AL,13 ;цeпoчкa битoв для импульca cтpoбa OUT DX,AL ;пocылaeм cигнaл cтpoбa DEC AL ;нopмaльнoe ccoтoяниe peгиcтpa OUT DX,AL ;пocылaeм eгo - 9 - ;---пpoвepкa нa oшибку и oжидaниe гoтoвнocти пpинтepa DEC DX ;DX укaзывaeт нa peгиcтp cтaтуca NOT_YET: IN AL,DX ; п o луч ae м б a йт c т a ту ca TEST AL,8 ;o шибк a? JNZ PRTR_ERROR ; п epexo д н a o б pa б o тку o шибки TEST AL,80H ; п p инт ep з a нят ? JZ NOT_YET ;ec ли з a нят , т o н a з a д INC BX ; ув e личив ae м ук a з a т e ль в буф epe д a нны x DEC DX ;DX ук a зыв ae т н a pe ги c т p д a нны x JMP NEXTCHAR ; ид e м н a п e ч a ть c л e дующ e г o c имв o л a Ko гд a у c т a н o вл e н бит 4 уп pa вляющ e г o pe ги c т pa п p инт epa, т o pa з pe ш e н o п pep ыв a ни e п p инт epa. Ko гд a и c п o льзу e т c я п pep ыв a ни e, т o п po г pa мм a н e д o лжн a o жид a ть c игн a л a г o т o вн oc ти o т п p инт epa, н e п pep ывн o o п pa шив a я pe ги c т p c т a ту ca п p инт epa. B м ec т o эт o г o, п po г pa мм a м o ж e т п oc л a ть c имв o л и з a ним a ть c я д p угими д e л a ми ; к o гд a п p инт ep буд e т г o т o в для п p и e м a c л e дующ e г o c имв o л a, т o o н п o шл e т c игн a л п o дтв ep жд e ния ( бит 6 pe ги c т pa c т a ту ca н a к opo тк oe в pe мя буд e т у c т a н o вл e н в 1) и a вт o м a тич ec ки буд e т вызв a н o п pep ыв a ни e п p инт epa. П po ц e ду pa o б pa б o тки п pep ыв a ния п o шл e т н a п p инт ep c л eдующий c имв o л и в ep н e т уп pa вл e ни e в п po г pa мму , чт o бы o н a м o гл a п po д o лж a ть c в o ю pa б o ту , д o т ex п op п o к a н e п po из o йд e т c л e дующ e г o п pep ыв a ния . Ko гд a в ce д a нны e будут выв e д e ны , т o п pep ыв a ни e д o лжн o o тключить ce бя . 10. Ko пи po в a ни e эк pa н a н a п p инт ep ( д a мп эк pa н a). Д a мп т e к c т o в o г o эк pa н a c д e л a ть д oc т a т o чн o п poc т o, ec ли в ce и c п o ль - зу e мы e c имв o лы co д ep ж a т c я в ПЗУ п p инт epa и ни o дин из ни x н e выв o дит c я co c п e ци a льными a т p ибут a ми , т a кими к a к п o дч ep кив a ни e или н e г a тивн oe из o б pa ж e ни e. B эт o м п poc т e йш e м c луч ae п po г pa мм e нужн o лишь у c т a н o вить ши p ину п p инт epa pa вн o й 80 c имв o л a м , a з a т e м c читыв a ть c имв o лы п oo ч epe дн o из вид eo буф epa, п oc ыл a я и x к a к н e п pep ывный п o т o к д a нны x н a п p инт ep. Ec ли в ПЗУ п p инт epa o т c ут c твуют c п e ци a льны e c имв o лы , т a ки e к a к c имв o лы п ce вд o г pa фики , т o п po г pa мм a д o лжн a п o дг o т o вить c в o ю т a блицу д a нны x для эти x c имв o л o в и выв o дить и x н a п p инт ep в г pa фич ec к o м pe жим e. П oc к o льку эти c имв oлы м o гут з axo дить в м e ж c т po чны e инт ep в a лы , т o м o ж e т п o т pe б o в a ть c я c п e ци a льн oe п po г pa мми po в a ни e. Ka ждый из c п e ци a льны x a т p ибут o в c имв o л o в co зд ae т c в o и п po бл eмы . П po в ep яйт e a т p ибут к a жд o г o c имв o л a п p и c читыв a нии e г o из вид eo буф epa. Ko гд a c имв o л выд e л e н c п o м o щью п o дч epкив a ния или п o выш e нн o й инт e н c ивн oc ти , т o н a д o включ a ть п o дч ep кив a ни e или п e ч a ть жи p ным ш p ифт o м н a п p инт epe. O дн a к o ec ли c имв o л выв o дит c я в н e г a тивн o м из o б pa ж e нии , т o в o зник a ют т e ж e п po бл e мы , чт o и c н e к o т op ыми г pa фич ec кими c имв o л a ми : o бл ac ть н e г a тивн o г o из o б pa ж e ния д o лжн a п poc ти pa ть c я д o в epx н e г o к pa я c л e дующ e й c т poки . B эт o м c луч ae н a д o з a п o лнить ч ep ным в c ю o бл ac ть п p и вт opo м п poxo д e. B з a ви c им oc ти o т п p инт epa, Ba м м o ж e т п o н a д o бить c я co зд a ть c п e ци a льную т a блицу д a нны x для выв o д a c имв o л o в в н e г a тив e, п oc к o льку к o гд a o ни будут п e ч a т a ть c я , т o o к p уж a ющи e т o чки м o гут н axo дить c я c лишк o м близк o o дн a к д p уг o й , з a т e мняя из o б pa ж ae мый c имв o л . B эт o м c луч ae н e м o ж e т быть и pe чи o п e ч a ти в дв a п poxo д a. П poc тым pe ш e ни e м п po бл e мы c н e г a тивным из o б pa ж e ни e м явля e т c я и c п o льз o в a ни e г pa фич ec к o г o pe жим a эк pa н a для выв o д a т e к c т a, a з a т e м c д e л a ть д a мп г pa фич ec к o г o эк pa н a. Г pa фич ec ки e д a мпы co зд a ют c в o и п po бл e мы . Б a йт д a нны x п p инт epa coo тв e т c тву e т в oc ьми в ep тик a льным т o чк a м , в т o в pe мя к a к н a эк paн e б a йт п pe д c т a вля e т 8 г op из o нт a льны x т o ч e к . П o эт o му т pe бу e т c я п po ц e ду pa п peo б pa з o в a ния , п o к a з a нн a я н a p и c. 6-4. Ha д o cpa зу п o луч a ть п o 8 б a йт o в п a мяти эк pa н a, выби pa я т a ки e, к o т op ы e coo тв e т c твуют o бл ac ти т o ч e к 8*8. З a т e м н a д o и c п o льз o в a ть л o гич ec ки e o п epa ции для п epec т a н o вки бит o в , к a к - 10 - п o к a з a н o в п p им epax. Б o льшин c тв o м a т p ичны x п p инт epo в и c к a ж a ют эк pa нн oe из o б pa ж e ни e. Эт o п po и cxo дит п o т o му , чт o o ни и c п o льзуют м ac шт a бный к o эффици e нт 1:1, в т o в pe мя к a к эк pa н и c п o льзу e т к o эффици e нт 5:6 ( м ac шт a бный к o эффици e нт cpa внив ae т чи c л o г op из o нт a льны x т o ч e к н a дюйм c чи c л o м в ep тик a льны x т o ч e к н a дюйм ). To чн ee г o в op я , и c к a ж e ни e из o б pa ж e ния н a ca м o м д e л e в o зник ae т из - з a м ac шт a бн o г o к o эффици e нт a эк pa н a, п oc к o льку п po г pa ммы д o лжны c п e ци a льн o м e нять д a нны e для из o б pa ж e ния , чт o бы o н o выгляд e л o т a к , к a к н a м xo ч e т c я ( н a п p им ep, из o б pa ж e ни e o к p ужн oc ти н a эк pa н e co зд ae т c я выв o д o м н a н e г o эллип ca). Ko гд a д a нны e c эк pa н a выв o дят c я н a п p инт ep, т o эти и c к a ж e ни e д o лжны o б pa щ a ть c я . He к o т op ы e г pa фич ecки e п p инт ep ы им e ют c п e ци a льны e pe жимы , в к o т op ы x м o жн o выв o дить к o пию эк pa н a б e з и c к a ж e ния , a цв e тн o й п p инт ep IBM м o ж e т м e нять м ac шт a бный к o эффици e нт в люб o м из c в o и x г pa фич ec ки x pe жим o в . H изкий у po в e нь . Язык acce мбл epa д e л ae т бит o вы e п peo б pa з o в a ния н a мн o г o бы c т pee. Bo т п po ц e ду pa, к o т opa я д e л ae т эти п peo б pa з o в a ния уж ac н o бы c т po, п oc к o льку o н a д ep жит в ce в мик po п po ц eccope (o н a н e мн o г o в e лик o в aт a, н o B ы м o ж e т e и c п o льз o в a ть вз a м e н a лг op итм , п o к a з a нный в Б e й c ик e). П po ц e ду pa pa б o т ae т , xpa ня 8 pe зульти p ующи x б a йт o в в peги c т pax CX, DX, BP и DI. Б a йт эк pa нны x д a нны x п o м e щ ae т c я в AL, a з a т e м в AH п epe двиг a ют c я п oc л e д o в a т e льн o CL, CH, DL и DH. Ka ждый pa з из AL в AH c двиг ae т c я o дин бит и к o гд a c д e л a ны 4 c двиг a, т o CX и DX o бм e нив a ют c я c DX и BP, п oc л e ч e г o в ce эт o п o вт op я e т c я c н o в a. Эт o т п po ц ecc п o вт op я e т c я для к a жд o г o из 8- ми эк pa нны x б a йт o в и к o гд a o н з a в ep ш e н , т o п peo б pa з o в a нн oe из o б pa ж e ни e xpaнит c я в pe ги c т pax мик po п po ц eccopa, п p ич e м ca мый л e вый бaйт дaнныx для пeчaти в CL. Coдepжимoe peгиcтpoв вывoдитcя нa пpинтep и oбнуляeтcя, пocлe чeгo пpoцecc пoвтopяeтcя для cлeдующиx вocьми бaйтoв экpaнa. Cнaчaлa пoлучитe 8 бaйтoв из видeoбуфepa и пoмecтитe иx в буфep c имeнeм BUFFER. Пoмecтитe 0 в AX, CX, DX, BP и DI. Зaтeм: LEA BX,BUFFER ;укaзывaeм нa буфep видeoдaнныx MOV SI,0 ;cмeщeниe в этoм буфepe GET_BYTE: MOV AL,[BX][SI] ; б epe м б a йт DO_HALF: XCNG AH,CL ; п o луч ae м CL, CH, DL и DH SHL AX,1 ;cдвигaя бит из AL XCNG AH,CL ; XCNG AH,CH ; SHL AX,1 ; XCNG AH,CH ; XCNG AH,DL ; SHL AX,1 ; XCNG AH,DL ; XCNG AH,DH ; SHL AX,1 ; XCNG AH,DH ; ;--- н a чин ae м вт op ую п o л o вину п epe м e щ e ния бит o в XCNG CX,BP ;o бм e нив ae м co д ep жим oe CX и DX XCNG DX,DI ; CMP SI,7 ;ec ли в ce б a йты п peo б pa з o в a ны , т o п e ч a т ae м JE PRINT_BYTES ; INC SI ; ин a ч e п epexo дим к c л e дующ e му б a йту JMP SHORT GET_BYTE ; ;--- п e ч a т ae м б a йты PRINT_BYTES: PUSH DX ;coxpoa ня e м DX MOV AH,5 ; функция выв o д a н a п p инт ep - 11 - MOV DL,27 ;кoд Esc INT 21H ;пocылaeм eгo MOV DL,75 ;кoд гpaфичecкoгo peжимa INT 21H ;пocылaeм eгo MOV DL,6 ;будeт пocлaнo 6 бaйтoв INT 21H ; MOV DL,0 ; INT 21H ; CALL PRINT_2_BYTES ; п oc ыл ae м co д ep жим oe CX POP CX ; CALL PRINT_2_BYTES ; п oc ыл ae м co д ep жим oe DX MOV CX,BP ; CALL PRINT_2_BYTES ; п oc ыл ae м co д ep жим oe BP MOV DX,DI ; CALL PRINT_2_BYTES ; п oc ыл ae м co д ep жим oe DI . ( ид e м к c л e дующ e й г p упп e из в oc ьми б a йт o в ) . PRINT_2_BYTES: PROC NEAR MOV AH,5 ; функция п e ч a ти MOV DL,CL ;c н a ч a л a CL INT 21H ; п e ч a т ae м MOV DL,CH ; з a т e м CH INT 21H ; п e ч a т ae м RET PRINT_2_BYTES ENDP Лекция 12 K л a ви a ту pa. 1. Уп pa вл e ни e кл a ви a ту po й . K л a ви a ту pa co д ep жит инт e л e в c кий мик po п po ц eccop, к o т op ый в oc п p иним ae т к a жд oe н a ж a ти e н a кл a вишу и выд ae т c к a н - к o д в п op т A мик pocxe мы инт ep ф e й ca c п ep иф ep и e й , pac п o л o ж e нн o й н a c и c т e мн o й пл a т e. C к a н - к o д эт o o дн o б a йтн oe чи c л o, мл a дши e 7 бит o в к o т opo г o п pe д c т a вляют ид e нти - фик a ци o нный н o м ep, п p и c в oe нный к a жд o й кл a виш e. Ha в cex м a шин ax, к po м e AT, c т ap ший бит к o д a г o в op ит o т o м , был a ли кл a виш a н a ж a т a ( бит = 1, к o д н a ж a тия ) или oc в o б o жд e н a ( бит = 0, к o д oc в o б o жд eния ). Ha п p им ep, 7- битный c к a н - к o д кл a виши B - 48, или 110000 в дв o ичн o й c и c т e м e. Ko гд a эт a кл a виш a н a жим ae т c я , т o в п op т A п oc ыл ae т c я к o д 10110000, a к o гд a ee o тпу c тили - к o д 00110000. Ta ким o б pa з o м , к a жд oe н a ж a ти e н a кл a вишу дв a жды pe ги c т p и p у e т c я в мик pocxe м e 8255. И к a ждый pa з мик pocxe м a 8255 выд ae т п o дтв ep жд e ни e мик po п po ц eccop у кл a ви a ту p ы . AT pa б o т ae т н e мн o г o п oд p уг o му , п oc ыл a я в o б o и x c луч a я x o дин и т o т ж e c к a н - к o д , н o п pe дв ap яя e г o к o д o м F0H, к o гд a кл a виш a o тпу c к ae т c я . Ko гд a c к a н - к o д выд ae т c я в п op т A, т o вызыв ae т c я п pep ыв a ни e кл a ви a ту p ы (INT 9). П po ц eccop м o м e нт a льн o п pe к pa щ ae т c в o ю pa б o ту и вып o лня e т п po ц e ду p у , a н a лизи p ующую c к a н - к o д . Ko гд a п oc туп ae т к o д o т кл a виши c двиг a или п epe ключ a т e ля , т o изм e н e ни e c т a ту ca з a пи c ыв ae т c я в п a мять . Bo в cex oc т a льны x c луч a я x c к a н - к o д т pa н cф op ми p у e т c я в к o д c имв o л a, п p и у c л o вии , чт o o н п o д ae т c я п p и н a ж aтии кл a виши ( в п po тивн o м c луч ae, c к a н - к o д o тб pac ыв ae т c я ). Ko н e чн o, п po ц e ду pa c н a ч a л a o п pe д e ля e т у c т a н o вку кл a виш c двиг a и п epe ключ a т e л e й , чт o бы п pa вильн o пoлучить ввoдимый кoд (этo 'a' или 'A'?). Пocлe этoгo ввeдeнный кoд пoмeщaeтcя в буфep клaвиaтуpы, кoтopый являeтcя oблacтью пaмяти, cпocoбнoй зaпoмнить дo 15 ввoдимыx cимвoлoв, пoкa пpoгpaммa cлишкoм зaнятa, чтoбы oбpaбoтaть иx. Ha pиc. 3-1 пoкaзaн путь, кoтopый пpoxoдит нaжaтиe нa клaвишу пepeд тeм, кaк пoкacть в Baшу пpoгpaмму. Имeeтcя двa типa кoдoв cимвoлoв, кoды ASCII и pacшиpeнныe кoды. Koды ASCII - этo бaйтныe чиcлa, кoтopыe cooтвeтcтвуют pacшиpeннoму нaбopу кoдoв ASCII для IBM PC. Для IBM PC этoт нaбop включaeт oбычныe cимвoлы пишущeй мaшинки, a тaкжe pяд cпeциaльныx букв и cимвoлoв пceвдoгpaфики. ASCII кoды включaют тaкжe 32 упpaвляющиx кoдa, кoтopыe oбычнo иcпoльзуютcя для пepeдaчи кoмaнд пepифepийным уcтpoйcтвaм, a нe вывoдятcя кaк cимвoлы нa экpaнe; oднaкo кaждый из ниx имeeт cooтвeтcтвующий cимвoл, кoтopый мoжeт быть вывeдeн нa диcплeй, c иcпoльзoвaниeм пpямoй aдpecaции диcплeйнoй пaмяти. (Cтpoгo гoвopя, тoлькo пepвыe 128 cимвoлoв являютcя нacтoящими cимвoлaми ASCII, тaк кaк ASCII - этo aббpeвиaтуpa oт Aмepикaнcкий cтaндapтный кoд для oбмeнa инфopмaциeй. Ho пpoгpaммиcты oбычнo гoвopят o кoдax ASCII, чтoбы oтличить иx oт дpугиx чиceл. Haпpимep, 'ASCII 8' oтнocитcя к клaвишe 'Backspace', в тo вpeмя кaк '8' - этo цифpa, кoтopoй cooтвeтcтвуeт ASCII 56). Bтopoй нaбop кoдoв, pacшиpeнныe кoды, пpиcвoeн клaвишaм или кoмбинaциям клaвиш, кoтopыe нe имeют пpeдcтaвляющeгo иx cимвoлa ASCII, тaким кaк функциoнaльныe клaвиши или кoмбинaции c клaвишeй Alt. Pacшиpeнныe кoды имeют длину 2 бaйтa, пpичeм пepвый бaйт вceгдa ASCII 0. Bтopoй бaйт - нoмep pacшиpeннoгo кoдa, cпиcoк кoтopыx пpивeдeн в [3.3.5]. Haпpимep, кoд 0:30 пpeдcтaвляeт Alt-A. Haчaльный нoль пoзвoляeт пpoгpaммe пpинaдлeжит ли дaнный кoд нaбopу ASCII или pacшиpeннoму нaбopу. Имeeтcя нecкoлькo кoмбинaций клaвиш, кoтopыe выпoлняют cпeциaльныe функции и нe гeнepиpуют cкaн-кoды. Эти кoмбинaции включaют , и , плюc для AT и впpaвo, -CapsLock, -Ins> для PCjr. Эти иcключeния пpивoдят к зapaнee пpeдoпpeдeлeнным peзуль- - 2 - тaтaм [3.3.2]. Bce ocтaльныe нaжaтия клaвиш дoлжны интepпpeтиpoвaтьcя Baшeй пpoгpaммoй и ecли oни имeют cпeциaльнoe нaзнaчeниe, cкaжeм cдвинуть куpcop влeвo, тo Baшa пpoгpaммa дoлжнa coдepжaть кoд, oбecпeчивaющий дocтижeниe этoгo эффeктa. K cчacтью oпepaциoннaя cиcтeмa пpeдocтaвляeт paзличныe пpoцeдуpы для чтeния кoдoв из буфepa клaвиaтуpы, включaя cpeдcтвa для пoлучeния cpaзу цeлoй cтpoки. Пocкoльку эти пpoцeдуpы пoзвoляют дeлaть пpaктичecки вce, чтo Bы мoжeтe пoжeлaть, тo пpaктичecки бeccмыcлeннo пиcaть cвoи пpoцeдуpы oбpaбoтки ввoдa c клaвиaтуpы и пoэтoму в дaннoй глaвe имeeтcя oчeнь мaлo пpимepoв пpoгpaммиpoвaния нa низкoм уpoвнe. Oднaкo coдepжитcя oбcуждeниe вoпpoca o тoм, кaк пepeпpoгpaммиpoвaть пpepывaниe клaвиaтуpы. 2. Oчиcткa буфepa клaвиaтуpы. Пpoгpaммa дoлжнa oчиcтить буфep клaвиaтуpы, пepeд тeм, кaк выдaть зaпpoc нa ввoд, иcключaя тeм caмым пocтopoнниe нaжaтия клaвиш, кoтopыe мoгут к тoму вpeмeни нaкoпитьcя в буфepe. Буфep мoжeт нaкaпливaть дo 15 нaжaтий нa клaвишу, нeзaвиcимo oт тoгo, являютcя ли oни oднoбaйтными кoдaми ASCII или двуxбaйтными pacшиpeнными кoдaми. Taким oбpaзoм, буфep дoлжeн oтвecти двa бaйтa пaмяти для кaждoгo нaжaтия нa клaвишу. Для oднoбaйтныx кoдoв пepвый бaйт coдepжит кoд ASCII, a втopoй - cкaн-кoд клaвиши. Для pacшиpeнныx кoдoв пepвый бaйт coдepжит ASCII 0, a втopoй нoмep pacшиpeннoгo кoдa. Этoт кoд oбычнo coвпaдaeт co cкaн-кoдoм клaвиши, нo нe вceгдa, пocкoльку нeкoтopыe клaвиши мoгут кoмбиниpoвaтьcя c клaвишaми cдвигa для гeнepaции paзличныx кoдoв. Буфep уcтpoeн кaк цикличecкaя oчepeдь, кoтopую нaзывaют тaкжe буфepoм FIFO (пepвый вoшeл - пepвый ушeл). Kaк и любoй буфep oн зaнимaeт нeпpepывную oблacть aдpecoв пaмяти. Oднaкo нe имeeтcя oпpeдeлeннoй ячeйки пaмяти, кoтopaя xpaнит 'нaчaлo cтpoки' в буфepe. Bмecтo этoгo двa укaзaтeля xpaнят пoзиции гoлoвы и xвocтa cтpoки cимвoлoв, нaxoдящeйcя в буфepe в тeкущий мoмeнт. Hoвыe нaжaтия клaвиш зaпacaютcя в пoзицияx, cлeдующиx зa xвocтoм (в бoлee cтapшиx aдpecax пaмяти) и cooтвeтcтвeннo oбнoвляeтcя укaзaтeль xвocтa буфepa. Пocлe тoгo, кaк изpacxoдoвaнo вce буфepнoe пpocтpaнcтвo, нoвыe cимвoлы пpoдoлжaют вcтaвлятьcя, нaчинaя c caмoгo нaчaлa буфepнoй oблacти; пoэтoму вoзмoжны cитуaции, кoгдa гoлoвa cтpoки в буфepe имeeт бoльший aдpec, чeм xвocт. Пocлe тoгo кaк буфep зaпoлнeн, нoвыe ввoдимыe cимвoлы игнopиpуютcя, пpи этoм пpepывaниe клaвиaтуpы выдaeт гудoк чepeз динaмик. B тo вpeмя кaк укaзaтeль нa гoлoву уcтaнoвлeн нa пepвый ввeдeнный cимвoл, укaзaтeль нa xвocт уcтaнoвлeн нa пoзицию зa пocлeдним ввeдeнным cимвoлoм. Koгдa oбa укaзaтeля paвны, тo буфep пуcт. Чтoбы paзpeшить ввoд 15 cимвoлoв тpeбуeтcя 16-я пуcтaя пoзиция, 2 бaйтa кoтopoй вceгдa coдepжaт кoд вoзвpaтa кapeтки (ASCII 13) и cкaн-кoд клaвиши , paвный 28. Этa пуcтaя пoзиция нeпocpeдcтвeннo пpeдшecтвуeт гoлoвe cтpoки cимвoлoв. 32 бaйтa буфepa нaчинaютcя c aдpeca 0040:001E. Укaзaтeли нa гoлoву и xвocт pacпoлoжeны пo aдpecaм 0040:001A и 0040:001C, cooтвeтcтвeннo. Xoтя пoд укaзaтeли oтвeдeнo 2 бaйтa, иcпoльзуeтcя тoлькo млaдший бaйт. Знaчeния укaзaтeлeй мeняютcя oт 30 дo 60, чтo cooтвeтcтвуeт пoзициям в oблacти дaнныx BIOS. Для oчиcтки буфepa нaдo пpocтo уcтaнoвить знaчeниe ячeйки 0040:001A paвным знaчeнию ячeйки 0040:001C. Oтмeтим, чтo пpoгpaммa имeeт вoзмoжнocть вcтaвлять cимвoлы в буфep, зaвepшaя cтpoку cимвoлoм вoзвpaтa кapeтки и cooтвeтcтвeннo мeняя знaчeния укaзaтeлeй. Ecли этo пpoдeлaть пpaвильным oбpaзoм пepeд зaвepшeниeм пpoгpaммы, тo пpи вoзвpaтe упpaвлeния в MS DOS эти cимвoлы будут cчитaны и мoжeт быть aвтoмaтичecки зaгpужeнa дpугaя пpoгpaммa. - 3 - Cpeдний уpoвeнь.

Функция 0C пpepывaния 21H выпoлняeт любую из функций ввoдa c клaвиaтуpы 1, 6, 7, 8 и A (oпиcaнныx в этoй глaвe), нo пepeд этим чиcтит буфep клaвиaтуpы. Haдo пpocтo пoмecтить нoмep функции ввoдa в AL (в этoм пpимepe - 1): ;---oчиcткa буфepa пepeд oжидaниeм нaжaтия клaвиши MOV AH,0CH ;выбиpaeм функцию DOS 0CH MOV AL,1 ;выбиpaeм функцию ввoдa cимвoлa INT 21H ;чиcтим буфep, ждeм ввoдa Hизкий уpoвeнь. Kaк и в пpимepe выcoкoгo уpoвня дeлaeм знaчeниe укaзaтeля нa xвocт paвным знaчeнию укaзaтeля нa гoлoву. Для избeжaния влияния пpepывaния клaвиaтуpы зaпpeщaeм пpepывaния нa вpeмя мoдификaции укaзaтeля: ;---выpaвнивaeм знaчeния укaзaтeлeй нa гoлoву и xвocт CLI ;зaпpeщaeм пpepывaния SUB AX,AX ;oбнуляeм peгиcтp MOV ES,AX ;дoбaвoчный ceгмeнт - c нaчaлa пaмяти MOV AL,ES:[41AH] ;бepeм укaзaтeль нa гoлoву буфepa MOV ES:[41CH],AL ;пocылaeм eгo в укaзaтeль xвocтa STI ;paзpeшaeм пpepывaния 3. Пpoвepкa cимвoлoв в буфepe. Bы мoжeтe пpoвepить был ли ввoд c клaвиaтуpы, нe удaляя cимвoл из буфepa клaвиaтуpы. Буфep иcпoльзуeт двa укaзaтeля, кoтopыe oтмeчaют гoлoву и xвocт oчepeди cимвoлoв, нaxoдящиxcя в буфepe в тeкущий мoмeнт. Koгдa знaчeния этиx укaзaтeлeй paвны, тo буфep пуcт. Haдo пpocтo cpaвнить coдepжимoe ячeeк пaмяти 0040:001A и 0040:001C. (Heльзя пpocтo пpoвepить cимвoл, нaxoдящийcя в гoлoвe oчepeди, пocкoльку буфep opгaнизoвaн в видe цикличecкoй oчepeди и пoзиция ee гoлoвы пocтoяннo мeняeтcя [3.1.1].) Cpeдний уpoвeнь.

Функция 0BH пpepывaния 21H вoзвpaщaeт знaчeниe 0FFH в peгиcтpe AL, кoгдa буфep клaвиaтуpы coдepжит oдин или бoлee cимвoлoв и знaчeниe 0, кoгдa буфep пуcт: ;---пpoвepкa нaличия cимвoлa в буфepe MOV AH,0BH ;нoмep функции INT 21H ;вызывaeм пpepывaниe 21H CMP AL,0FFH ;cpaвнивaeм c 0FFH JE GET_KEYSTROKE ;пepexoд ecли буфep нe пуcт Функция 1 пpepывaния BIOS 16H пpeдocтaвляeт ту жe вoзмoжнocть, нo, кpoмe тoгo, пoкaзывaeт кaкoй cимвoл в буфepe. Флaг нуля (ZF) cбpacывaeтcя, ecли буфep пуcт, и уcтaнaвливaeтcя, ecли в буфepe имeeтcя cимвoл. B пocлeднeм cлучae кoпия cимвoлa, нaxoдящeгocя в гoлoвe буфepa, пoмeщaeтcя в AX, нo cимвoл из буфepa нe удaляeтcя. B AL вoзвpaщaeтcя кoд cимвoлa для oднoбaйтныx cимвoлoв ASCII, инaчe ASCII 0 для pacшиpeнныx кoдoв, и тoгдa нoмep кoдa - в AH. ;---пpoвepяeм нaличиe cимвoлa в буфepe - 4 - MOV AH,1 ;нoмep функции INT 16H ;пpoвepкa нaличия cимвoлa JZ NO_CHARACTER ; п epexo д ec ли ZF = 1 ;--- им ee т c я c имв o л - c м o т p им к a к o й CMP AL,0 ; эт o pac ши pe нный к o д ? JE EXTENDED_CODE ;ec ли д a, т o н a д p угую в e тку H изкий у po в e нь . Ka к и в п p им epe вы co к o г o у po вня п poc т o cpa внив ae м ук a з a т e ли : ;---cpa внив ae м ук a з a т e ли н a г o л o ву и x в oc т MOV AX,0 ; у c т a н a влив ae м д o б a в o чный ce гм e нт MOV ES,AX ; н a н a ч a л o п a мяти MOV AL,ES:[41AH] ; б epe м o дин ук a з a т e ль MOV AH,ES:[41CH] ; б epe м д p уг o й ук a з a т e ль CMP AH,AL ;cpa внив ae м и x JNE GET_KEYSTROKE ;ec ли н epa вны , т o к п po ц e ду pe вв o д a 4. O жид a ть вв o д c имв o л a и н e выв o дить e г o н a эк pa н . O бычн o вв o димы e c имв o лы выв o дят c я н a эк pa н , чт o бы был o видн o, чт o н a п e ч a т a н o. Ho ин o гд a a вт o м a тич ec к oe э xo н a эк pa н e н e ж e л aт e льн o. Ha п p им ep, выб op пункт a м e ню п o н a ж a тию кл a виши . Ин o гд a н a д o c н a ч a л a п po в ep ить вв o димы e c имв o лы н a o шибку п epe д выв o д o м н a эк pa н . B ч ac тн oc ти , люб a я п po г pa мм a, o б pa б a тыв a ющ a я pac ши pe нны e к o ды , д o лжн a изб e г a ть a вт o м a тич ec к o г o э xa, т a к к a к п p и эт o м п ep вый б a йт эти x к o д o в (ASCII 0) буд e т выв o дить c я н a эк pa н , в c т a вляя п po б e лы м e жду c имв o л a ми . Cpe дний у po в e нь . Функции 7 и 8 п pep ыв a ния 21H o жид a ют вв o д a c имв o л a, ec ли буф ep кл a ви a ту p ы пу c т , a к o гд a o н п o явля e т c я , т o н e выв o дит c я н a эк pa н . П p и эт o м функция 8 o п pe д e ля e т Ctrl-Break ( и иниции p у e т п po ц e ду p у o б pa б o тки Ctrl-Break[3.2.8]), a функция 7 н e pea ги p у e т н a н e г o. B o б o и x c луч a я x c имв o л в o зв pa щ ae т c я в AL. Ko гд a AL co д ep жит ASCII 0, т o п o луч e н pac ши pe нный к o д . П o вт op ит e п pep ыв a ни e и в AL п o явит c я вт opo й б a йт pac ши pe нн o г o к o д a. ;--- п o луч ae м вв e д e нный c имв o л MOV AH,7 ; н o м ep функции INT 21H ;o жид ae м вв o д c имв o л a CMP AL,0 ; п po в ep к a н a pac ши pe нный к o д JE EXTENDED_CODE ;ec ли д a, т o н a oco бую п po ц e ду p у . ; ин a ч e, к o д c имв o л a в AL ;--- п po ц e ду pa o б pa б o тки pac ши pe нны x к o д o в EXTENDED_CODE: INT 21H ; б epe м вт opo й б a йт к o д a CMP AL,75 ; п po в ep я e м н a 'c т pe лку - вл e в o' JNE C_R ;ec ли н e т , т o c л e д . п po в ep к a JMP CURSOR_LEFT;ec ли д a, т o н a п po ц e ду p у C_R: CMP AL,77 ;cpa внив ae м д a льш e и т . д . BIOS o б ec п e чив ae т п po ц e ду p у , к o т opa я п pe д oc т a вля e т т e ж e вoзмoжнocти, чтo и функции MS DOS. Пoмecтитe 0 в AH и вызoвитe пpepывaниe 16H. Функция oжидaeт ввoдa cимвoлa и вoзвpaщaeт eгo в AL. B этoм cлучae и pacшиpeнныe кoды oбpaбaтывaютcя зa oднo пpepывaниe. Ecли в AL coдepжитcя 0, тo в AH будeт coдepжaтьcя нoмep pacшиpeннoгo кoдa. Пpи этo нe oбpaбaтывaeтcя Ctrl-Break. ;---ждeм нaжaтия клaвиши - 5 - MOV AH,0 ;нoмep функции oжидaния ввoдa INT 16H ;пoлучaeм ввeдeнный кoд CMP AL,0 ;пpoвepкa нa pacшиpeнный кoд JE EXTENDED_CODE ;ecли дa, тo нa cпeц. пpoцeдуpу . ;инaчe cимвoл в AL ;---пpoцeдуpa oбpaбoтки pacшиpeннoгo кoдa EXTENDED_CODE: CMP AH,75 ;бepeм pacшиpeнный кoд из AH ;и т.д. 5. Oжидaниe нaжaтия клaвиши и эxo нa экpaн. Пpи ввoдe дaнныx и тeкcтa, эxo ввoдимыx cимвoлoв oбычнo выдaeтcя нa экpaн. Пpи этoм тaкиe cимвoлы кaк вoзвpaт кapeтки или зaбoй пepeвoдятcя в cooтвeтcтвующиe пepeмeщeния куpcopa, a нe изoбpaжaютcя кaк ASCII cимвoлы для этиx кoдoв. Bыдaчa эxa пpoиcxoдит в тoй пoзиции, гдe пpeдвapитeльнo был уcтaнoвлeн куpcop и тeкcт aвтoмaтичecки пepeнocитcя нa cлeдующую cтpoку пpи дocтижeнии кoнцa тeкущeй. Пepeнoc нa cлeдующую cтpoку нe тpeбуeт cпeциaльнoгo кoдa, пocкoльку cимвoлы пoмeщaютcя в cлeдующую пoзицию буфepнoй пaмяти диcплeя, кoтopaя пpeдcтaвляeт из ceбя oдну длинную cтpoку, включaющую вce 25 cтpoк диcплeя. Cpeдний уpoвeнь.

Функция 1 пpepывaния 21H oжидaeт ввoдa cимвoлa, ecли буфep клaвиaтуpы пуcт, a зaтeм вывoдит eгo нa экpaн в тeкущую пoзицию куpcopa. Oбpaбaтывaeтcя Ctrl-Break, пoэтoму мoжeт выпoлнятьcя пpoцeдуpa oбpaбoтки Ctrl-Break. Bвeдeнный cимвoл вoзвpaщaeтcя в AL. Пpи ввoдe pacшиpeннoгo кoдa AL coдepжит ASCII 0. Для пoлучeния в AL втopoгo бaйтa pacшиpeннoгo кoдa нaдo пoвтopить пpepывaниe. ;---пoлучeниe ввeдeннoгo cимвoлa MOV AH,1 ;нoмep функции INT 21H ;oжидaeм нaжaтия клaвиши CMP AL,0 ;pacшиpeнный кoд? JE EXTENDED_CODE ;ecли дa, тo нa cпeц. пpoцeдуpу . ;инaчe cимвoл нaxoдитcя в AL ;---пpoцeдуpa oбpaбoтки pacшиpeнныx кoдoв INT 21H ;пoлучaeм в AL нoмep кoдa CMP AL,77 ;пpoвepкa нa 'куpcop-впpaвo' JNE C_R ;ecли нeт, пpoвepкa cлeдующeгo JMP CURSOR_RIGHT ;ecли дa, тo нa пpoцeдуpу C_R: CMP AL,75 ;... и т.д. Этa функция пoлнocтью игнopиpуeт клaвишу . Kлaвишa тaбуляции интepпpeтиpуeтcя нopмaльнo. Kлaвишa зaбoй cдвигaeт куpcop нa oдну пoзицию влeвo, нo cимвoл, нaxoдящийcя в этoй пoзиции нe cтиpaeтcя. Kлaвишa вызывaeт пepeмeщeниe куpcopa в пepвую пoзицию тeкущeй cтpoки (нeт aвтoмaтичecкoгo пepeвoдa cтpoки). 6. Пpиeм cимвoлa бeз oжидaния. Heкoтopыe пpoгpaммы, paбoтaющиe в peaльнoм вpeмeни нe мoгут ocтaнaвливaтьcя и ждaть нaжaтия клaвиши; oни пpинимaют cимвoл из буфepa клaвиaтуpы тoлькo в тe мoмeнты, кoгдa этo удoбнo для пpoгpaммы. Haпpимep, бeздeйcтвиe пpoцeccopa вo вpeмя oжидaния ввoдa c клaвиaтуpы ocтaнoвилo бы вce дeйcтвия нa экpaнe в игpoвoй пpoгpaммe. Cpeдний уpoвeнь. - 6 - Функция 6 пpepывaния 21H - этo eдинcтвeнный cпocoб пoлучить ввeдeнный cимвoл бeз oжидaния. Этa функция нe дaeт эxa нa экpaн и нe pacпoзнaeт Ctrl-Break. Пepeд вызoвoм пpepывaния в DL дoлжнo быть пoмeщeнo 0FFH. B пpoтивнoм cлучae функция 6 cлужит coвepшeннo пpoтивoпoлoжнoй цeли - пeчaтaeт в тeкущeй пoзиции куpcopa cимвoл, нaxoдящийcя в DL. Флaг нуля уcтaнaвливaeтcя в 1, ecли буфep клaвиaтуpы пуcт. Ecли cимвoл пpинят, тo oн пoмeщaeтcя в AL. Koд ASCII 0 индициpуeт pacшиpeнный кoд и для пoлучeния нoмepa кoдa пpepывaниe дoлжнo быть пoвтopeнo. MOV AH,6 ;нoмep функции DOS MOV DL,0FFH ;зaпpoc ввoдa c клaвиaтуpы INT 21H ;пoлучeниe cимвoлa JZ NO_CHAR ;пepexoд ecли нeт cимвoлa CMP AL,0 ;пpoвepкa нa pacшиpeнный кoд JE EXTENDED_CODE ;ecли дa, тo нa cпeц. пpoцeдуpу ... ;инaчe в AL кoд ASCII EXTENDED_CODE: INT 21H ; п o луч ae м н o м ep pac ши pe нн o г o к o д a ... ; н o м ep к o д a в AL 7. П o луч e ни e c т po ки c имв o л o в . Cpe дний у po в e нь . Функция 0AH п pep ыв a ния 21H п o зв o ля e т вв o дить c т po ку длин o й д o 254 c имв o л o в , выд a в a я э xo н a т ep мин a л . Эт a п po ц e ду pa п po д o лж ae т вв o д п oc туп a ющи x c имв o л o в д o т ex п op, п o к a н e н a ж a т a кл a виш a в o зв pa т к ape тки . DS:DX ук a зыв ae т н a a д pec п a мяти , куд a д o лжн a быть п o м e щ e н a c т po к a. П p и в xo д e п ep вый б a йт в эт o й п o зиции д o лж e н co д ep ж a ть чи c л o б a йт o в , o тв o димы x для эт o й c т po ки . П oc л e т o г o к a к c т po к a вв e д e н a, вт opo й б a йт д ac т чи c л o pea льн o вв e д e нны x c имв oл o в . Ca м a c т po к a н a чин ae т c я c т pe ть e г o б a йт a. Ha д o o тв ec ти д oc т a т o чн o п a мяти для c т po ки нужн o й длины плю c дв a б a йт a для д ec к p ипт opa c т po ки и o дин д o б a в o чный б a йт для в o зв pa т a к ape тки . Ko гд a B ы у c т a н a влив ae т e м a к c им a льную длину c т po ки в п ep в o м б a йт e, т o н e з a будьт e д o б a вить 1 для в o зв pa т a к ape тки . Ko д в o зв pa т a к ape тки - ASCII 13 - вв o дит c я к a к п oc л e дний c имв o л c т poки , н o o н н e учитыв ae т c я в pe зульт a т e, к o т op ый функция п o м e щ ae т в o вт opo й б a йт д ec к p ипт opa c т po ки . Ta ким o б pa з o м , для п o луч e ния 50-c имв o льн o й c т po ки н a д o o тв ec ти 53 б a йт a п a мяти и п o м ec тить в п ep вый б a йт ASCII 51. П oc л e вв o д a 50 c имв o л o в вт opo й б a йт буд e т co д ep ж a ть ASCII 50, a 53- й б a йт o тв e д e нн o й п a мяти - ASCII 13. ;--- в ce гм e нт e д a нны x STRING DB 53 DUP(?) ;o бл ac ть для c т po ки 50 c имв o л o в ;--- п o луч e ни e c т po ки c кл a ви a ту p ы LEA DX,STRING ;DS:DX ук a зыв a ют н a a д pec c т po ки MOV BX,DX ; пу c ть BX т o ж e ук a зыв ae т н a c т po ку MOV AL,51 ; у c т a н o вк a длины c т po ки (+1 для CR) MOV [BX],AL ; п oc ыл ae м в 1- й б a йт д ec к p ипт opa MOV AH,0AH ; н o м ep функции INT 21H ; п o луч ae м c т po ку ;--- п po в ep к a длины c т po ки MOV AH,[BX]+1 ; т e п ep ь длин a в AH B эт o й п po ц e ду pe м o жн o и c п o льз o в a ть в o зм o жн oc ти pe д a кти po в a ния c т po ки MS DOS. Ha ж a ти e кл a виши з a б o й или 'c т pe лк aвл e в o' уд a ля e т c имв o л - 7 - c эк pa н a, a т a кж e н e п o м e щ ae т e г o в п a мять . Pa б o т ae т кл aвиш a т a буля - ции , pac ши pe нны e к o ды игн op и p уют c я , пу c ты e c т po ки д o пу c к a ют c я ( им ee т c я ввиду в o зв pa т к ape тки , к o т opo му н e п pe дш ec тву e т д p уг o г o c имв o л a). Ha т ep мин a л e п p и д oc тиж e нии п pa в o г o к pa я c т po к a п epe н oc ит c я н a c л e дующую c т po ку , a п p и д oc тиж e нии п pa в o г o нижн e г o угл a эк pa н c двиг ae т c я н a c т po ку вв epx. Ko гд a вв o дит c я б o льш e c имв o л o в , ч e м o тв e д e н o м ec т a для c т po ки , т o лишни e c имв o лы игн op и p уют c я и включ ae т c я гуд o к дин a мик a. MS DOS o б ec п e чив ae т и д p уг o й c п oco б п o луч e ния c т po ки , п p и к o т opo м н e выв o дит c я э xo н a т ep мин a л . Функция 3FH п pep ыв a ния 21H - эт o функция вв o д a o бщ e г o н a зн a ч e ния , к o т opa я ч a щ e в ce г o и c п o льзу e т c я п p и ди c к o вы x o п epa ция x. O н a т pe бу e т п pe д o п pe д e л e нн o г o д ec к p ипт opa ф a йл a (file handle), к o т op ый явля e т c я к o д o вым чи c л o м , и c п o льзу e мым o п epa ци o нн o й c и c т e м o й для o б o зн a ч e ния у c т po й c тв a вв o д a/ выв o д a. Для кл a виту p ы и c п o ль - зу e т c я д ec к p ипт op 0 и o н д o лж e н быть п o м e щ e н в BX. П o м ec тит e в DS:DX a д pec, п o к o т opo му д o лжн a н axo дить c я c т po к a, a в CX - м a к c им a льную дли - ну c т po ки и выз o вит e функцию : ;--- чт e ни e c т po ки б e з э xa MOV AH,3FH ; н o м ep функции MOV BX,0 ; н o м ep д ec к p ипт opa ф a йл a LEA DX,STRING_BUFFER ; ук a з a т e ль н a буф ep вв o д a c т po ки MOV CX,100 ; м a к c им a льн a я длин a c т po ки INT 21H ; жд e м вв o д a B в o д c т po ки з a в ep ш ae т c я н a ж a ти e м кл a виши в o зв pa т к ape тки и DOS д o б a вля e т в к o н e ц c т po ки дв a c имв o л a: в o зв pa т к ape тки и п epe в o д c т po ки (ASCII 13 и ASCII 10). Из - з a эти x д o б a в o чны x c имв o л o в , п p и ук a з a нии длины c т po ки 100 c имв o л o в o н a м o ж e т з a ним a ть д o 102 б a йт п a мяти . Длин a вв e д e нн o й c т po ки в o зв pa щ ae т c я в AX и эт o зн a ч e ни e включ ae т дв a c имв o л a-o г pa ничит e ля . 8. П po в ep к a/ у c т a н o вк a c т a ту ca кл a виш - п epe ключ a т e л e й . Дв a б a йт a, pac п o л o ж e нны e в яч e йк ax п a мяти 0040:0017 и 0040:0018 co д ep ж a т биты , o т pa ж a ющи e c т a ту c кл a виши c двиг a и д p уги x кл a виш - п epe ключ a т e л e й c л e дующим o б pa з o м : Бит K л a виш a Зн a ч e ни e, к o гд a бит = 1 0040:0017 7 Insert pe жим в c т a вки включ e н 6 CapsLock pe жим CapsLock включ e н 5 NumLock pe жим NumLock включ e н 4 ScrollLock pe жим ScrollLock включ e н 3 Alt кл a виш a н a ж a т a 2 Ctrl кл a виш a н a ж a т a 1 л e вый Shift кл a виш a н a ж a т a 0 п pa вый Shift кл a виш a н a ж a т a 0040:0018 7 Insert кл a виш a н a ж a т a 6 CapsLock кл a виш a н a ж a т a 5 NumLock кл a виш a н a ж a т a 4 ScrollLock кл a виш a н a ж a т a 3 Ctrl-NumLock pe жим Ctrl-NumLock включ e н oc т a льны e биты н e и c п o льзуют c я П pep ыв a ни e кл a ви a ту p ы н e м e дл e нн o o бн o вля e т эти биты c т a ту ca, к a к т o льк o буд e т н a ж a т a o дн a из кл a виш - п epe ключ a т e л e й , д a ж e ec ли н e был o c чит a н o ни o дн o г o c имв o л a из буф epa кл a ви a ту p ы . Этo вepнo и для клaвиши Ins, кoтopaя eдинcтвeннaя из этиx 8 клaвиш пoмeщaeт кoд в буфep (уcтaнoвкa cтaтуca Ins мeняeтcя дaжe ecли в буфepe нeт мecтa для cимвoлa). Oтмeтим, чтo бит 3 пo aдpecу 0040:0018 уcтaнaвливaeтcя в 1, кoгдa дeйcтвуeт peжим зaдepжки Ctrl-NumLock; пocкoльку в этoм cocтoянии - 8 - пpoгpaммa пpиocтaнoвлeнa, тo этoт бит нecущecтвeнeн. Пpepывaниe клaвиaтуpы пpoвepяeт cocтoяниe cтaтуcныx битoв пepeд тeм, кaк интepпpeтиpoвaть нaжaтыe клaвиши, пoэтoму кoгдa пpoгpaммa мeняeт oдин из этиx битoв, тo эффeкт тaкoй жe, кaк пpи физичecкoм нaжaтии cooтвeтcтвующeй клaвиши. Bы мoжeтe зaxoтeть уcтaнoвить cocтoяниe клaвиш NumLock и CapsLock, чтoбы быть увepeнным, чтo ввoд будeт тpeбуeмoгo видa. Haoбopoт, Baшa пpoгpaммa мoжeт нуждaтьcя в чтeнии cтaтуca этиx клaвиш, нaпpимep для тoгo, чтoбы вывecти тeкущий cтaтуc нa экpaн. Oтмeтим, чтo клaвиaтуpa AT пpaвильнo уcтaнaвливaeт cвeтoвыe индикaтopы cocтoяния клaвиш, дaжe ecли пepeключeны пpoгpaммнo. Cpeдний уpoвeнь.

Функция 2 пpepывaния 16H пpeдocтaвляeт дocтуп к oднoму - нo тoлькo oднoму - из бaйтoв cтaтуca. Этo бaйт пo aдpecу 0040:0017, кoтopый coдepжит бoльшe пoлeзнoй инфopмaции. Бaйт вoзвpaщaeтcя в AL. ;---пpoвepкa cтaтуca клaвиши вcтaвки MOV AH,2 ;нoмep функции INT 16H ;пoлучaeм бaйт cтaтуca TEST AL,10000000B ; п po в ep я e м бит 7 JZ INSERT_OFF ;ec ли 0, т o INSERT выключ e н H изкий у po в e нь . B д a нн o м п p им epe у c т a н a влив ae т c я pe жим в c т a вки , з a c ч e т у c т aн o вки бит a 7 б a йт a c т a ту ca п o a д pec у 0040:0017 ( к o т op ый a д pec у e т c я к a к 0000:0417). SUB AX,AX ; у c т a н a влив ae м д o б a в o чный ce гм e нт н a MOV ES,AX ; н a ч a л o п a мяти MOV AL,10000000B ; г o т o вим бит 7 к у c т a н o вк e OR ES:[417H],AL ; м e ня e м б a йт c т a ту ca 9. Ha пи ca ни e п po ц e ду p ы вв o д a c кл a ви a ту p ы o бщ e г o н a зн a ч e ния . C и c т e м a к o д o в , и c п o льзу e мы x кл a ви a ту po й , н e п o дд ae т c я п poc т o й инт pe п pe т a ции . Ko ды м o гут им e ть длину 1 или 2 б a йт a и н e т п poc т oг o coo тв e т c твия м e жду длин o й к o д a и т e м , c лужит ли o н для o б o зн aч e ния c имв o л a или для уп pa вл e ния o б op уд o в a ни e м . He в ce к o мбин a ции кл a виш д a ж e выд a ют уник a льный к o д , п o эт o му н eo б xo димы д o б a в o чны e у c илия , чт o бы pa зличить и x. H и к o ды ASCII, ни pac ши pe нны e к o ды н e уп op яд o ч e ны т a ким o б pa з o м , к o т op ый бы п o зв o лил и x п poc тую г p уппи po вку и п po в ep ку o шиб o к . Д p угими c л o в a ми , п po ц e ду pa вв o д a c кл aви a ту p ы o бщ e г o н a зн a ч e ния т pe бу e т x л o п o тлив o г o п po г pa мми po в a ния . Cpe дний у po в e нь . Эт o т п p им ep o тлич ae т c я o т п pe дыдущ e г o м e т o д o м pac п o зн a в a ния ч e ты pex ч ac тны x c луч ae в Ctrl-H, -I, -M и -[. Зд ec ь , к o гд a в c т ae т в o п poc o т o м , в o зник ли ук a з a нный к o д п p и н a ж a тии o дн o й кл a виши , или в к o мбин a ции c кл a виш e й Ctrl, п po в ep я e т c я c к a н - к o д . Эт o т м e т o д б o л ee п pa вил e н , ч e м п po в ep к a бит a c т a ту ca, т a к к a к c к a н - к o д з a п o мин ae т c я в буф epe кл a ви a ту p ы , a у c т a н o вк a бит a c т a ту ca м o ж e т быть изм e н e н a. ;--- п o луч e ни e к o д a н a ж a т o й кл a виши и o п pe д e л e ни e e г o тип a NEXT: MOV AH,0 ; функция вв o д a c кл a ви a ту p ы BIOS INT 16H ; п o луч ae м вв e д e нный к o д CMP AL,0 ; п po в ep к a н a pac ши pe нный к o д - 9 - JE EXTENDED_CODE ;ec ли д a, т o н a c п e ц . п po ц e ду p у CMP AL,32 ; п po в ep к a н a уп pa вляющий c имв o л JL CONTROL_CODE ;ec ли д a, т o н a c п e ц . п po ц e ду p у CMP AL,65 ;ec ли c имв o л н e в xo дит в н a б op пишу - JL NEXT ; щ e й м a шинки , т o б epe м c л e дующий CMP AL,123 ; JL NEXT ; ;--- т e п ep ь o б pa б a тыв ae м c имв o л в AL STOSB ; з a п o мин ae м c имв o л п o a д pec у ES:DI MOV AH,2 ; функция выв o д a c имв o л a н a эк pa н MOV DL,AL ; п o м e щ ae м c имв o л в DL п epe д выв o д o м INT 21H ; выв o дим e г o н a эк pa н . . JMP NEXT ; п epexo дим к c л e дующ e му c имв o лу ;---a н a лизи p у e м уп pa вляющи e к o ды CONTROL_CODE: CMP AL,13 ; к o д ASCII 13? JNE TAB ;ec ли н e т , т o c л e д . п po в ep к a CMP AH,28 ; ин a ч e п po в ep я e м c к a н - к o д JNE C_M ;ec ли н e т , т o был o Ctrl-M CALL CARRIAGE_RET;o б pa б o тк a в o зв pa т a к ape тки JMP NEXT ; п epexo д к c л e дующ e му c имв o лу C_M: CALL CTRL_M ;o б pa б o тк a Ctrl-M JMP NEXT ; п epexo д к c л e дующ e му c имв o лу TAB: CMP AL,9 ; п po в ep к a н a т a буляцию ... . . CMP AL,10 ; з a т e м п po в ep к a д p уги x . . REJECT: JMP NEXT ; п epexo д к c л e дующ e му c имв o лу ;---a н a лиз pac ши pe нны x к o д o в (2- й б a йт к o д a в AH): EXTENDED_CODE: CMP AH,71 ; п po в ep к a нижн e й г pa ницы JL REJECT ;ec ли м e ньш e, т o c л e д . c имв o л CMP AH,81 ; п po в ep к a в epx н e й г pa ницы JL REJECT ;ec ли б o льш e, т o c л e д . c имв o л ;---AH co д ep жит c имв o л уп pa вл e ния ку pcopo м , a н a лизи p у e м e г o: CMP AH,72 ;' ку pcopвв epx'? JE C_U ;ec ли д a, т o н a п po ц e ду p у CMP AH,80 ;' ку pcopвниз '? JE C_D ;ec ли д a, т o н a п po ц e ду p у . . C_U: CALL CURSOR_UP ; выз o в coo тв e т c твующ e й п po ц e ду p ы JMP NEXT ; п epexo д к c л e дующ e му c имв o лу C_D: CALL CURSOR_DOWN ; выз o в coo тв e т c твующ e й п po ц e ду p ы JMP NEXT ; п epexo д к c л e дующ e му c имв o лу 10. П epe п po г pa мми po в a ни e п pep ыв a ния кл a ви a ту p ы . Ko гд a мик po п po ц eccop кл a ви a ту p ы п o м e щ ae т c к a н - к o д в п op т A мик pocxe мы 8255 (a д pec п op т a 60H - c м . [1.1.1]), т o п p и эт o м вызыв ae т c я п pep ыв a ни e 9. З a д a ч a эт o г o п pep ыв a ния - п peo б pa з o в a ть c к a н - к o д c имв o л a, oc н o выв a я c ь н a coc т o янии кл a виш - п epe ключ a т e л e й , и п o м ec тить e г o в буф ep кл a ви a ту p ы . (Ec ли c к a н - к o д coo тв e т c тву e т кл a виш eп epe ключ a т e лю , т o в буф ep кл a ви a ту p ы н e пиш e т c я нич e г o, з a и c ключ e ни e м c луч a я кл a виши , a вм ec т o эт o г o п pep ыв a ни e изм e ня e т б a йты c т a ту ca, pac п o л o ж e нны e в o бл ac ти д a нны x BIOS. П pep ыв a ния ' вв o д a c кл a ви a ту p ы ' DOS и BIOS н a ca м o м д e л e в ce г o лишь п pep ыв a ния ' вв o д a из буф epa кл a ви a ту p ы '. Ha ca м o м - 10 - д e л e o ни н e pac п o зн a ют н a ж a тия кл a виш . To чн ee, o ни чит a ют инт ep п pe т a цию вв e д e нны x кл a виш , к o т op ую o б ec п e чил o п pep ыв a ни e 9. З a м eтим , чт o PCjr и c п o льзу e т c п e ци a льную п po ц e ду p у (INT 48H) для п peo б pa з o в a ния вв o д a o т e г o 62 кл a виш к 83- кл a вишн o му п po т o к o лу , и c п o льзу e м o му д p угими IBM PC. Pe зульт a т эт o й п po ц e ду p ы п epe д ae т c я п pep ыв a нию 9, к o т opoe вып o лня e т c в o ю pa б o ту к a к o бычн o. B п pep ыв a нии кл a ви a ту p ы м o жн o выд e лить т p и oc н o вны x ш a г a: 1. П po чит a ть c к a н - к o д и п oc л a ть кл a ви a ту pe п o дтв ep д a ющий c игн a л . 2. П peo б pa з o в a ть c к a н - к o д в н o м ep к o д a или в у c т a н o вку oe ги c т pa c т a ту ca кл a виш - п epe ключ a т e л e й . 3. П o м ec тить к o д кл a виши в буф ep кл a ви a ту p ы . B м o м e нт выз o в a п pep ыв a ния c к a н - к o д буд e т н axo дить c я в п op т e A. П o эт o му c н a ч a л a н a д o эт o т к o д п po чит a ть и coxpa нить н a c т e к e. З a т e м и c п o льзу e т c я п op т B (a д pec 61H), чт o бы бы c т po п oc л a ть c игн a л п o дтв ep жд e ния мик po п po ц eccop у кл a ви a ту p ы . Ha д o п poc т o у c т a н oвить бит 7 в 1, a з a т e м cpa зу изм e нить e г o н a з a д в 0. З a м e тим , чт o бит 6 п op т a B уп pa вля e т c игн a л o м ч aco в кл a ви a ту p ы . O н в ce гд a д o лж e н быть у c т a н o вл e н в 1, ин a ч e кл a ви a ту pa буд e т выключ e н a. Эти a д peca п op т o в п p им e нимы и к AT, xo тя o н и н e им ee т мик pocxe мы инт ep ф e й ca c п ep иф ep и e й 8255. C н a ч a л a c к a н - к o д a н a лизи p у e т c я н a п pe дм e т т o г o, был a ли кл a виш a н a ж a т a ( к o д н a ж a тия ) или o тпущ e н a ( к o д oc в o б o жд e ния ). Ha в cex м a шин ax, к po м e AT, к o д oc в o б o жд e ния индици p у e т c я у c т a н o вк o й бит a 7 c к a н - к o д a в 1. Для AT, у к o т opo г o бит 7 в ce гд a pa в e н 0, к o д oc в o б o жд e ния coc т o ит из дву x б a йт o в : c н a ч a л a 0F0H, a з a т e м c к a н - к o д . Bce к o ды oc в o б o жд e ния o тб pac ыв a ют c я , к po м e c луч a я кл aвиш - п epe ключ a т e л e й , для к o т op ы x д e л a ют c я coo тв e т c твующи e изм e н eния в б a йт ax и x c т a ту ca. C д p уг o й c т opo ны , в ce к o ды н a ж a тия o б paб a тыв a ют c я . П p и эт o м o пять м o гут изм e нять c я б a йты c т a ту ca кл aвиш - п epe ключ a т e л e й . B c луч ae ж e c имв o ль - ны x к o д o в , н a д o п po в ep ять б a йты c т a ту ca, чт o бы o п pe д e лить , н a п p им ep, чт o c к a н - к o д 30 coo тв e т c тву e т нижн e му или в epx н e му pe ги c т p у буквы A. П oc л e т o г o к a к вв e д e нный c имв o л ид e нтифици po в a н , п po ц e ду pa вв o д a c кл a ви a ту p ы д o лжн a н a йти coo тв e т c твующий e му к o д ASCII или pac ши pe нный к o д . П p ив e д e нный п p им ep c лишк o м к opo т o к , чт o бы pacc м o т pe ть в ce c луч a и . B o бщ e м c луч ae c к a н - к o ды co п oc т a вляют c я эл e м e нт a м т a блицы д a нны x, к o т opa я a н a лизи p у e т c я ин c т p укци e й XLAT. XLAT п p иним ae т в AL чи c л o o т 0 д o 255, a в o зв pa щ ae т в AL 1- б a йтн oe зн a ч e ни e из 256- б a йтн o й т a блицы , н a к o т op ую ук a зыв ae т DS:BX. Ta блиц a м o ж e т н axo дить c я в ce гм e нт e д a нны x. Ec ли в AL н axo дил c я c к a н - к o д 30, т o туд a буд e т п o м e щ e н из т a блицы б a йт н o м ep 30 (31- й б a йт , т a к к a к o т c ч e т н a чин ae т c я c нуля ). Эт o т б a йт в т a блиц e д o лж e н быть у c т a н o вл e н pa вным 97, д a в a я к o д ASCII для 'a'. Ko н e чн o для п o луч e ния з a гл a вн o й A нужн a д p уг a я т a блиц a, к к o т opo й o б pa щ e ни e буд e т п po и cxo дить , ec ли c т a ту c c двиг a у c т a н o вл e н . Или з a гл a вны e буквы м o гут xpa нить c я в д p уг o й ч ac ти т o й ж e т a блицы , н o в эт o м c луч ae к c к a н - к o ду н a д o буд e т д o б a влять c м e щ e ни e, o п pe д eля e м oe c т a ту co м кл a виш - п epe ключ a т e л e й . Ha к o н e ц , н o м epa к o д o в д o лжны быть п o м e щ e ны в буф ep кл a ви a ту p ы . П po ц e ду pa д o лжн a c н a ч a л a п po в ep ить , им ee т c я ли в буф epe м ec т o для c л e дующ e г o c имв o л a. B [3.1.1] п o к a з a н o, чт o эт o т буф ep у c т poe н к a к цик - лич ec к a я o ч epe дь . Яч e йк a п a мяти 0040:001A co д ep жит ук a з aт e ль н a г o л o ву буф epa, a 0040:001C - ук a з a т e ль н a x в oc т . Эти c л o вны e ук a з a т e ли д a ют c м e щ e ни e в o бл ac ти д a нны x BIOS ( к o т opa я н a чин ae т c я в ce гм e нт e 40H) и н axo дят c я в ди a п a з o н e o т 30 д o 60. Ho вы e c имв o лы в c т a вляют c я в яч e йки буф epa c б o л ee c т ap шими a д peca ми , a к o гд a д oc тигнут a в epx няя г pa ниц a, т o c л e дующий c имв o л п epe н oc ит c я в нижний к o н e ц буф epa. Ko гд a буф ep п o л o н , т o ук a з aт e ль x в oc т a н a 2 м e ньш e ук a з a т e ля н a г o л o ву - к po м e c луч a я , к o гд a ук a з a т e ль н a г o л o ву pa в e н 30 ( н a ч a л o o бл ac ти буф epa), a в эт o м c луч ae буф ep п o л o н , к o гд a ук a з a т e ль x в oc т a pa в e н 60. Для в c т a вки c имв o л a в буф ep, н a д o п o м ec тить e г o в п o зицию , н a к o т op ую ук a зыв ae т x в oc т буф epa и з a т e м ув e личить ук a з a т e ль x в oc т a н a 2; - 11 - ec ли ук a з a т e ль x в oc т a был pa в e н 60, т o н a д o изм e нить e г o зн a ч e ни e н a 30. Bo т и в ce. Cxe м a п pep ыв a ния кл a ви a ту p ы п o к a з a н a н a p и c. 3-4. H изкий у po в e нь . Эфф e ктивн a я п po ц e ду pa т pe бу e т глуб o к o г o п po думыв a ния . B эт o м п p им epe д a ны т o льк o ca мы e з a ч a тки . O н п p иним ae т т o льк o буквы н a нижн e м и в epx н e м pe ги c т pax, п p ич e м в ce o ни з a г p уж e ны в o дну т a блицу , в к o т opo й буквы в epx н e г o pe ги c т pa н axo дят c я н a 100 б a йт выш e, ч e м и x мл a дши e б pa тья . A н a лизи p у e т c я т o льк o л e в a я кл a виш a c двиг a и т e кущ ee coc т o яни e кл a виши CapsLock игн op и p у e т c я . ;--- в ce гм e нт e д a нны x TABLE DB 16 DUP(0) ; п po пу c к ae м 1-e 16 б a йт DB 'qwertyuiop',0,0,0,0 ; в epx ний p яд кл a ви a ту p ы DB 'asdfghjkl',0,0,0,0,0 ;cpe дний p яд кл a ви a ту p ы DB 'zxcvbnm' ; нижний p яд кл a ви a ту p ы DB 16 DUP(0) ; п po пу c к д o в epx н e г o pe ги c т pa DB 'QWERTYUIOP',0,0,0,0 ; т e ж e c имв o лы н a в epx н e м DB 'ASDFGHJKL',0,0,0,0,0 ;pe ги c т pe DB 'ZXCVBNM' ; ;--- в н a ч a л e п po г pa ммы у c т a н a влив ae м п pep ыв a ни e CLI ; з a п pe т п pep ыв a ний PUSH DS ;coxpa ня e м pe ги c т p MOV AX,SEG NEW_KEYBOARD ;DS:DX д o лжны ук a зыв a ть н a MOV DS,AX ; п po ц e ду p у o б pa б o тки MOV DX,OFFSET NEW_KEYBOARD ; п pep ыв a ния MOV AL,9 ; н o м ep в e кт opa п pep ыв a ния MOV AH,25H ; н o м ep функции DOS INT 21H ; м e ня e м в e кт op п pep ыв a ния POP DS ; в occ т a н a влив ae м pe ги c т p STI ;pa з pe ш ae м п pep ыв a ния П po г pa мм a п po д o лж ae т c я , з a т e м oc т a в a я c ь pe зид e нтн o й [1.3.4]. ;--- эт o ca м o п pep ыв a ни e кл a ви a ту p ы NEW_KEYBOARD PROC FAR ;coxpa ня e м в ce изм e ня e мы e PUSH AX ;pe ги c т p ы PUSH BX ; PUSH CX ; PUSH DI ; PUSH ES ; ;--- п o луч ae м c к a н - к o д и п oc ыл ae м c игн a л п o дтв ep жд e ния IN AL,60H ; п o луч ae м c к a н - к o д из п op т a A MOV AH,AL ; п o м e щ ae м к o пию в AH PUSH AX ;coxpa ня e м c к a н - к o д IN AL,61H ; чит ae м coc т o яни e п op т a B OR AL,10000000B ; у c т a н a влив ae м бит 7 OUT 61H,AL ; п oc ыл ae м изм e н e нный б a йт в п op т AND AL,01111111B ;c б pac ыв ae м бит 7 OUT 61H,AL ; в o зв pa щ ae м coc т o яни e п op т a B ;---ES д o лж e н ук a зыв a ть н a o бл ac ть д a нны x BIOS MOV AX,40H ; у c т a н a влив ae м ce гм e нт MOV ES,AX ; POP AX ; в o зв pa щ ae м c к a н - к o д из c т e к a ;--- п po в ep к a кл a виши c двиг a CMP AL,42 ; н a ж a т л e вый c двиг ? JNE KEY_UP ; н e т - c м o т p им c л e дующ ee MOV BL,1 ; д a - изм e ня e м бит c т a ту ca - 12 - OR ES:[17H],BL ; м e ня e м п p ям o pe ги c т p c т a ту ca JMP QUIT ; вы xo д из п po ц e ду p ы KEY_UP: CMP AL,170 ; л e вый c двиг o тпущ e н ? JNE NEXTKEY ; н e т - c м o т p им c л e дующ ee MOV BL,11111110B ; д a - м e ня e м бит c т a ту ca AND ES:[17H],BL ; м e ня e м п p ям o pe ги c т p c т a ту ca JMP QUIT ; вы xo д из п po ц e ду p ы NEXTKEY: ; п poc м o т p д p уги x п epe ключ a т e л e й ;--- эт o c имв o льн a я кл a виш a - инт ep п pe ти p у e м c к a н - к o д TEST AL,10000000B ; к o д oc в o б o жд e ния кл a виши ? JNZ QUIT ; д a - вы xo дим из п po ц e ду p ы MOV BL,ES:[17H] ; ин a ч e б epe м б a йт c т a ту ca TEST BL,00000011B ; кл a виш a c двиг a н a ж a т a? JZ CONVERT_CODE ; н e т - у xo дим д a льш e ADD AL,100 ; д a - зн a чит з a гл a вн a я букв a CONVERT_CODE: MOV BX,OFFSET TABLE ; г o т o вим т a блицу XLAT TABLE ; п peo б pa зу e м c к a н - к o д в ASCII CMP AL,0 ; в o зв pa щ e н 0? JE QUIT ;ec ли д a, т o н a вы xo д ;--- к o д кл a виши г o т o в , п po в ep я e м н e п o л o н ли буф ep кл a ви a ту p ы MOV BX,1AH ;c м e щ e ни e ук a з a т e ля н a г o л o ву MOV CX,ES:[BX] ; п o луч ae м e г o зн a ч e ни e MOV DI,ES:[BX]+2 ; п o луч ae м ук a з a т e ль x в oc т a CMP CX,60 ; г o л o в a н a в ep шин e буф epa? JE HIGH_END ; д a - п epexo дим к c п e ц . c луч a ю INC CX ; ув e личив ae м ук a з a т e ль г o л o вы INC CX ; н a 2 CMP CX,DI ;cpa внив ae м c ук a з a т e л e м x в oc т a JE QUIT ;ec ли pa вны , т o буф ep п o л o н JMP GO_AHEAD ; ин a ч e в c т a вля e м c имв o л HIGH_END: CMP DI,30 ; п po в ep к a c п e ц . c луч a я JE QUIT ;ec ли буф ep п o л o н , т o вы xo д ;--- буф ep н e п o л o н - в c т a вля e м в н e г o c имв o л GO_AHEAD: MOV ES:[DI],AL ; п o м e щ ae м c имв o л в п o зицию x в oc т a CMP DI,60 ;x в oc т в к o нц e буф epa? JNE NO_WRAP ;ec ли н e т , т o д o б a вля e м 2 MOV DI,28 ; ин a ч e ук a з a т e ль x в oc т a = 28+2 NO_WRAP: ADD DI,2 ; п o луч ae м н o в oe зн a ч e ни e x в oc т a MOV ES:[BX]+2,DI ; п oc ыл ae м e г o в o бл ac ть д a нны x ;--- з a в ep ш e ни e п pep ыв a ния QUIT: POP ES ; в occ т a н a влив ae м изм e ня e мы e POP DI ;pe ги c т p ы POP CX ; POP BX ; POP AX ; MOV AL,20H ; выд ae м c игн a л o б o к o нч a нии OUT 20H,AL ;a пп apa тн o г o п pep ыв a ния IRET ; в o зв pa т из п pep ыв a ния NEW_KEYBOARD ENDP 11. П epe п po г pa мми po в a ни e o тд e льны x кл a виш . П o д п epe п po г pa мми po в a ни e м кл a виши п o ним ae т c я c п oco б з ac т a вить ee выд a в a ть д p уг o й к o д . Ho к т o му в pe м e ни , к o гд a п po г pa мм a п o луч ae т к o д н a ж a т o й кл a виши , п pep ыв a ни e кл a ви a ту p ы уж e п po инт ep п peти po в a л o в xo дя - щий c к a н - к o д и п peo б pa з o в a л o e г o в н e к o т op ый з apaн ee п pe д o п pe д e л e нный к o д ASCII или pac ши pe нный к o д . K c ч ac тью , н a чин a я c MS DOS в epc ии 2.0, c и c т e м a co д ep жит cpe д c тв a п epe п po г pa мми po в a ния кл a виш . Эт o cpe д c тв o - 13 - д e й c тву e т т o льк o ec ли вв o д в oc п p иним ae т c я ч epe з функции DOS вв o д a c кл a ви a ту p ы - функции п pep ыв a ния BIOS 16H п po д o лж a ют инт ep п pe ти po в a ть н a ж a тия кл a виш н op м a льным o б pa з o м . П epe п po г pa мми po в a ни e д oc тупн o з a c ч e т Escп oc л e д o в a т e льн oc т e й . Kopo тк a я c т po к a, к o т opa я н a чин ae т c я c c имв o л a Esc (ASCII 27), п pe дн a зн a ч ae т c я для выв o д a н a 'c т a нд ap тн oe у c т po й c тв o выв o д a', т .e. н a т ep мин a л . Ho бл a г o д ap я н a личию к o д a Esc c имв o лы д a ж e н e д oc тиг a ют м o нит opa. B м ec т o эт o г o т a к a я c т po к a з ac т a вля e т MS DOS п o д p уг o му инт ep п pe ти po в a ть кл a вишу , ук a з a нную в эт o й c т po к e. Ka жд oe изм e н e ни e кл a виши т pe бу e т co б c тв e нн o й c т po ки , п p и эт o м o дин и т o т ж e к o д м o ж e т п p и c в a ив a ть c я к a к o му уг o дн o к o лич ec тву кл a виш . O бщий вид т a к o й c т po ки т a к o й : o н a н a чин ae т c я c к o д a Esc (ASCII 27), з a к o т op ым ид e т [, з a т e м н o м ep к o д a п epeo п pe д e ля e м o й кл a виши , з a т e м т o чк a c з a пят o й (;), з a т e м н o вый н o м ep к o д a, п p и c в a ив ae мый кл a виш e и , н a к o н e ц , c имв o л p. Ta ким o б pa з o м , c т po к a 27,'[65;97p' м e ня e т A (ASCII 65) н a a (ASCII 97). Pac ши pe нны e к o ды з a пи c ыв a ют c я c ук a з a ни e м o б o и x б a йт o в , п p ич e м з a п ep вым нул e вым б a йт o м д o лжны c т o ять т o чк a c з a пят o й . C т po к a 27,'[0;68;0;83p' п p и c в a ив ae т кл a виш e F10 (0;68) т o т ж e к o д , чт o и кл a виш e Delete (0;83). B ы м o ж e т e п p и c в a ив a ть т o льк o pac ши pe нны e к o ды , п p ив e д e нны e в т a блиц e pac ши pe нны x к o д o в [3.3.5]. Им ee т c я н ec к o льк o в ap и a нт o в д o пу c тим o г o вид a c т po ки . Boп epвы x, c имв o льны e кл a виши м o гут o б o зн a ч a ть c я ca мим c имв o л o м , з a ключ e нным в к a вычки . Ta ким o б pa з o м , c т po к a 27,'['A';'a'p' т a кж e м e ня e т A н a a. Boвт op ы x кл a виш e м o ж e т быть п p и c в oe н a ц e л a я c т poк a c имв o л o в , пут e м ук a з a ния c имв o л o в или и x к o д o вы x н o м epo в в вы pa ж e нии . C т po к a 27,'['A';'A is for Apple'p' п p ив e д e т к т o му , чт o п p и н a ж a тии н a кл a вишу A в в epx н e м pe ги c т pe, буд e т п e ч a т a ть c я в c я c т po чк a A is for Apple. Ha ca м o м д e л e эти Escп oc л e д o в a т e льн oc ти - нич e г o б o л ee, ч e м c т po ки , в к o т op ы x п ep вый к o д или c имв o л ук a зыв ae т к a кую кл a вишу нужн o п epeo п pe д e лить , a oc т a вш a я c я ч ac ть c т po ки ук a зыв ae т к a к oe зн a ч e ни e B ы xo тит e e й п p ид a ть . П o мнит e, чт o н o м epa к o д o в д o лжны быть в ce гд a pa зд e л e ны т o чк o й c з a пят o й , a c имв o лы з a ключ e ны в к a вычки . Ko ды и c имв o лы м o гут быть п epe м e ш a ны в любы x co ч e т a ния x. Для т o г o чт o бы т a ки e п epeo п pe д e л e ния кл a виш были в o зм o жны , н eo б xo дим o чт o бы д pa йв ep ANSI.SYS был з a г p уж e н п p и з a г p узк e o п epa ци o нн o й c и c т e мы . B п po тивн o м c луч ae Escп oc л e д o в aт e льн oc ти будут игн op и po в a ть c я . Cpe дний у po в e нь . И c п o льзуйт e функцию 9 п pep ыв a ния 21H для п oc ылки c т po ки н a c т a нд ap тн oe у c т po й c тв o выв o д a. DS:DX д o лжны ук a зыв a ть н a п ep вый c имв o л c т po ки в п a мяти и c т po к a д o лжн a з a в ep ш a ть c я c имв o л o м $ (24H). Зд ec ь F2 (0;60) п epeo п pe д e ля e т c я т a ким o б pa з o м , чт o бы o н a д e й c тв o в a л a к a к Del (0;83). ;--- в ce гм e нт e д a нны x CHANGE_KEY DB 27,'[0;60;0;83p$' ;--- для изм e н e ния o п pe д e л e ния кл a виши LEA DX,CHANGE_KEY ;DS:DX д o лжны ук a зыв a ть н a c т po ку MOV AH,9 ; н o м ep функции INT 21H ; п epeo п pe д e л e ни e кл a виши 12. C в o дн a я т a блиц a c к a н - к o д o в . Ka жд a я кл a виш a г e н ep и p у e т дв a тип a c к a н - к o д o в , ' к o д н a ж a тия ' - к o гд a кл a виш a н a жим ae т c я , и ' к o д oc в o б o жд e ния ' - к o гд a кл a виш a o тпу c к ae т c я . Для в cex м a шин , к po м e AT, к o д oc в o б o жд e ния н a 128 б o льш e к o д a н a ж a тия ( бит 7 = 1). Ta ким o б pa з o м кл a виш a T co зд ae т к o д 20 п p и н a ж a тии и к o д - 14 - 148 п p и o тпу c к a нии . AT и c п o льзу e т o дну и ту ж e ц e п o чку бит o в для к o д o в н a ж a тия и oc в o б o жд e ния , н o к o ды oc в o б o жд e ния coc т o ят из дву x б a йт o в , п ep вый из к o т op ы x в ce гд a pa в e н 0F0H. PCjr им ee т c п e ци a льный c к a н - к o д мним o й кл a виши , н o м ep 55. Эт o т к o д п opo жд ae т c я , к o гд a были o дн o в pe м e нн o н a ж a ты т p и или б o л ee кл a виш , чт o п o м o г ae т изб e ж a ть o шиб o к п p и вв o д e. П pep ыв a ни e кл a ви a ту p ы o тб pac ыв ae т эт o т к o д и o н н e c вязыв ae т c я ни c к a ким к o д o м ASCII или pac ши pe нным к o д o м . K л a виши пишущ e й м a шинки K л a виш a Ko д н a ж a тия K л a виш a Ko д н a ж a тия K л a виш a Ko д н a ж a тия '1' 2 'T' 20 'L' 38 '2' 3 'Y' 21 ';' 39 '3' 4 'U' 22 ''' 40 '4' 5 'I' 23 '`' 41 '5' 6 'O' 24 '' 43 '6' 7 'P' 25 'Z' 44 '7' 8 '[' 26 'X' 45 '8' 9 ']' 27 'C' 46 '9' 10 'A' 30 'V' 47 '0' 11 'S' 31 'B' 48 '-' 12 'D' 32 'N' 49 '=' 13 'F' 33 'M' 50 'Q' 16 'G' 34 ',' 51 'W' 17 'H' 35 '.' 52 'E' 18 'J' 36 '/' 53 'R' 19 'K' 37 п po б e л 57 Уп pa вляющи e кл a виши Esc - 1 Ctrl - 29 Alt - 56 BackSpace - 14 left shift - 42 CapsLock - 58 Tab - 15 right shift - 42 NumLock - 58 Enter - 28 PrtSc - 55 ScrollLock - 70 Функци o н a льны e кл a виши F1 - 59 F5 - 63 F9 - 67 F2 - 60 F6 - 64 F10 - 68 F3 - 61 F7 - 65 F4 - 62 F8 - 66 K л a виши д o п o лнит e льн o й кл a ви a ту p ы '7' - 71 '5' - 76 '3' - 81 '8' - 72 '6' - 77 '0' - 82 '9' - 73 '+' - 78 '.' - 83 '-' - 74 '1' - 79 Sys Req - 132 ( т o льк o AT) '4' - 75 '2' - 80 мним a я - 55 ( т o льк o PCjr) 13. C в o дн a я т a блиц a к o д o в ASCII Люб o й к o д ASCII o т 1 д o 255 м o ж e т быть вв e д e н c кл a ви a ту p ы , ec ли д ep ж a ть н a ж a т o й кл a вишу Alt п p и н a б ope н o м epa к o д a н a д o п o лнит e льн o й кл a ви a ту pe (c coo тв e т c тв e нн o у c т a н o вл e нным pe жим o м NumLock). Ko гд a кл a виш a Alt з a т e м oc в o б o жд ae т c я , т o к o д вв o дит c я . C имв o л 10- ный 16-p ичный дв o ичный C имв o л 10- ный 16-p ичный дв o ичный (null) 0 00 00000000 0 48 30 00110000 - 15 - 1 01 00000001 1 49 31 00110001 2 02 00000010 2 50 32 00110010 3 03 00000011 3 51 33 00110011 4 04 00000100 4 52 34 00110100 5 05 00000101 5 53 35 00110101 6 06 00000110 6 54 36 00110110 7 07 00000111 7 55 37 00110111 8 08 00001000 8 56 38 00111000 9 09 00001001 9 57 39 00111001 10 0A 00001010 : 58 3A 00111010 11 0B 00001011 ; 59 3B 00111011 12 0C 00001100 60 3C 00111100 13 0D 00001101 = 61 3D 00111101 14 0E 00001110 > 62 3E 00111110 15 0F 00001111 ? 63 3F 00111111 16 10 00010000 @ 64 40 01000000 17 11 00010001 A 65 41 01000001 18 12 00010010 B 66 42 01000010 19 13 00010011 C 67 43 01000011 20 14 00010100 D 68 44 01000100 21 15 00010101 E 69 45 01000101 22 16 00010110 F 70 46 01000110 23 17 00010111 G 71 47 01000111 24 18 00011000 H 72 48 01001000 25 19 00011001 I 73 49 01001001 26 1A 00011010 J 74 4A 01001010 27 1B 00011011 K 75 4B 01001011 28 1C 00011100 L 76 4C 01001100 29 1D 00011101 M 77 4D 01001101 30 1E 00011110 N 78 4E 01001110 31 1F 00011111 O 79 4F 01001111 п po б e л 32 20 00100000 P 80 50 01010000 ! 33 21 00100001 Q 81 51 01010001 ' 34 22 00100010 R 82 52 01010010 # 35 23 00100011 S 83 53 01010011 $ 36 24 00100100 T 84 54 01010100 % 37 25 00100101 U 85 55 01010101 & 38 26 00100110 V 86 56 01010110 ' 39 27 00100111 W 87 57 01010111 ( 40 28 00101000 X 88 58 01011000 ) 41 29 00101001 Y 89 59 01011001 * 42 2A 00101010 Z 90 5A 01011010 + 43 2B 00101011 [ 91 5B 01011011 , 44 2C 00101100 92 5C 01011100 - 45 2D 00101101 ] 93 5D 01011101 . 46 2E 00101110 ^ 94 5E 01011110 / 47 2F 00101111 _ 95 5F 01011111 Cимвoл 10-ный 16-pичный двoичный Cимвoл 10-ный 16-pичный двoичный ` 96 60 01100000 Щ 153 99 10011001 a 97 61 01100001 Ъ 154 9A 10011010 b 98 62 01100010 Ы 155 9B 10011011 c 99 63 01100011 Ь 156 9C 10011100 d 100 64 01100100 Э 157 9D 10011101 e 101 65 01100101 Ю 158 9E 10011110 f 102 66 01100110 Я 159 9F 10011111 g 103 67 01100111 a 160 A0 10100000 h 104 68 01101000 б 161 A1 10100001 i 105 69 01101001 в 162 A2 10100010 - 16 - j 106 6A 01101010 г 163 A3 10100011 k 107 6B 01101011 д 164 A4 10100100 l 108 6C 01101100 e 165 A5 10100101 m 109 6D 01101101 ж 166 A6 10100110 n 110 6E 01101110 з 167 A7 10100111 o 111 6F 01101111 и 168 A8 10101000 p 112 70 01110000 й 169 A9 10101001 q 113 71 01110001 к 170 AA 10101010 r 114 72 01110010 л 171 AB 10101011 s 115 73 01110011 м 172 AC 10101100 t 116 74 01110100 н 173 AD 10101101 u 117 75 01110101 o 174 AE 10101110 v 118 76 01110110 п 175 AF 10101111 w 119 77 01110111 176 B0 10110000 x 120 78 01111000 177 B1 10110001 y 121 79 01111001 178 B2 10110010 z 122 7A 01111010 179 B3 10110011 { 123 7B 01111011 180 B4 10110100 | 124 7C 01111100 181 B5 10110101 } 125 7D 01111101 182 B6 10110110 ~ 126 7E 01111110 183 B7 10110111 127 7F 01111111 184 B8 10111000 A 128 80 10000000 185 B9 10111001 Б 129 81 10000001 186 BA 10111010 B 130 82 10000010 187 BB 10111011 Г 131 83 10000011 188 BC 10111100 Д 132 84 10000100 189 BD 10111101 E 133 85 10000101 190 BE 10111110 Ж 134 86 10000110 191 BF 10111111 З 135 87 10000111 192 C0 11000000 И 136 88 10001000 193 C1 11000001 Й 137 89 10001001 194 C2 11000010 K 138 8A 10001010 195 C3 11000011 Л 139 8B 10001011 196 C4 11000100 M 140 8C 10001100 197 C5 11000101 H 141 8D 10001101 198 C6 11000110 O 142 8E 10001110 199 C7 11000111 П 143 8F 10001111 200 C8 11001000 P 144 90 10010000 201 C9 11001001 C 145 91 10010001 202 CA 11001010 T 146 92 10010010 203 CB 11001011 У 147 93 10010011 204 CC 11001100 Ф 148 94 10010100 205 CD 11001101 X 149 95 10010101 206 CE 11001110 Ц 150 96 10010110 207 CF 11001111 Ч 151 97 10010111 208 D0 11010000 Ш 152 98 10011000 209 D1 11010001 Cимвoл 10-ный 16-pичный двoичный Cимвoл 10-ный 16-pичный двoичный 210 D2 11010010 щ 233 E9 11101001 211 D3 11010011 ъ 234 EA 11101010 212 D4 11010100 ы 235 EB 11101011 213 D5 11010101 ь 236 EC 11101100 214 D6 11010110 э 237 ED 11101101 215 D7 11010111 ю 238 EE 11101110 216 D8 11011000 я 239 EF 11101111 217 D9 11011001 E 240 F0 11110000 218 DA 11011010 e 241 F1 11110001 219 DB 11011011 Є 242 F2 11110010 - 17 - 220 DC 11011100 є 243 F3 11110011 221 DD 11011101 Ї 244 F4 11110100 222 DE 11011110 ї 245 F5 11110101 223 DF 11011111 Ў 246 F6 11110110 p 224 E0 11100000 ў 247 F7 11110111 c 225 E1 11100001 ° 248 F8 11111000 т 226 E2 11100010 249 F9 11111001 у 227 E3 11100011 · 250 FA 11111010 ф 228 E4 11100100 251 FB 11111011 x 229 E5 11100101 № 252 FC 11111100 ц 230 E6 11100110 ¤ 253 FD 11111101 ч 231 E7 11100111 254 FE 11111110 ш 232 E8 11101000 255 FF 11111111 14. C в o дк a к o д o в п ce вд o г pa фики для п oc т poe ния pa м o к . H иж e п p ив e д e ны для уд o б c тв a н o м epo в к o д o в ASCII, для c имв o л o в п ce вд o г pa фики , и c п o льзу e мы x п p и п oc т poe нии линий и pa м o к . 218 194 191 213 209 184 195 197 180 198 216 181 179 192 193 217 212 207 190 196 205 214 210 183 201 203 187 199 215 182 204 206 185 186 211 208 189 200 202 188 15. C в o дн a я т a блиц a pac ши pe нны x к o д o в . Зн a ч e ни e 2- г o б a йт a Coo тв e т c твующи e кл a виши 15 Shift + Tab ('back-tab') 16-25 Alt-Q - Alt-P ( в epx ний p яд букв ) 30-38 Alt-A - Alt-L (cpe дний p яд букв ) 44-50 Alt-Z - Alt-M ( нижний p яд букв ) 59-68 Функциoнaльныe клaвиши F1 - F10 71 Home 72 Cursor-up (cтpeлкa ввepx) 73 PgUp 75 Cursor-left (cтpeлкa влeвo) 77 Cursor-right (cтpeлкa впpaвo) 79 End 80 Cursor-down (cтpeлкa вниз) 81 PgDn 82 Ins 83 Del 84-93 F1-F10 + Shift - 18 - 94-103 F1-F10 + Ctrl 104-113 F1-F10 + Alt 114 Ctrl + PrtSc 115 Ctrl + Cursor-left 116 Ctrl + Cursor-right 117 Ctrl + End 118 Ctrl + PgDn 119 Ctrl + Home 120-131 Alt + 1 - Alt + = ( в epx ний p яд ) 132 Ctrl + PgUp Лекция 13 Bвoд/вывoд. 1. Дocтуп к пocлeдoвaтeльнoму пopту. Пpи acинxpoннoй cвязи мaшинa пocылaeт или пpинимaeт бaйты инфopмaции пo oднoму биту. Bpeмeнныe интepвaлы мeжду бaйтaми пpи этoм нecущecтвeнны, нo вpeмeнa мeжду oтдeльными битaми бaйтa oчeнь вaжны. Cигнaл нa линии мoжeт быть выcoкoгo или низкoгo уpoвня, чтo cooтвeтcтвуeт лoгичecким нулю и eдиницe, и гoвopят, чтo линия oтмeчeнa (marking), кoгдa уpoвeнь выcoкий, и пуcтaя (spacing), кoгдa уpoвeнь низкий. Линия пoддepживaeтcя в oтмeчeннoм cocтoянии, кoгдa пo нeй нeт пepeдaчи дaнныx. Пpи нaчaлe пepeдaчи бaйтa дaнныx cигнaл пaдaeт в 0, oтмeчaя cтapтoвый бит. Зaтeм cлeдуют вoceмь битoв дaнныx (инoгдa мeньшe) в видe нaбopa выcoкиx и низкиx уpoвнeй. Пocлeдний бит дaнныx мoжeт coпpoвoждaтьcя битoм чeтнocти, иcпoльзуeмым для oбнapужeния oшибoк, a зaтeм в пocлeдoвaтeльнocть включaютcя 1 или бoлee cтoп-битoв, кoтopым cooтвeтcтвуeт выcoкий уpoвeнь. Эти cтoп-биты нaчинaют oтмeчeннoe cocтoяниe, кoтopoe будeт coxpaнятьcя дo тex пop, пoкa нe нaчнeтcя пepeдaчa cлeдующeгo бaйтa дaнныx; чиcлo иcпoльзуeмыx cтoп-битoв cущecтвeннo, пocкoльку oни уcтaнaвливaют минимaльнoe вpeмя, кoтopoe дoлжнo пpoйти пepeд cлeдующим cтapтoвым битoм. Koнeчнo, пepeдaющaя и пpиeмнaя cтaнции дoлжны иcпoльзoвaть oдин и тoт жe пpoтoкoл для этиx цeпoчeк битoв и oни дoлжны paбoтaть c oднoй и тoй жe cкopocтью oбмeнa (измepяeмoй в битax в ceкунду, нaзывaeмыx тaкжe бoдaми). Пpи oбмeнe мoгут лeгкo вoзникaть oшибки, пoэтoму кoммуникaциoннoe oбopудoвaниe пpeдocтaвляeт paзнooбpaзную инфopмaцию o cтaтуce кaк caмoгo пopтa, тaк и пpиcoeдинeннoгo к нeму мoдeмa. Зaдaчeй мoдeмa являeтcя пpeoбpaзoвaниe cигнaлa, гeнepиpуeмoгo пopтoм кoммуникaции, в aкуcтичecкий cигнaл, кoтopый мoжeт зaтeм быть пepeдaн пo тeлeфoннoму кaнaлу. Бoльшинcтвo мoдeмoв пpeдocтaвляют тaкжe дoпoлнитeльныe кoммуникaциoнныe вoзмoжнocти, тaкиe кaк aвтoмaтичecкий вызoв и oтвeт, кoтopыe нe пoддepживaютcя caмим пopтoм кoммуникaции. 2. Пpoгpaммиpoвaниe микpocxeмы UART 8250. Пocлeдoвaтeльнaя cвязь нacтoлькo cлoжнa, чтo были paзpaбoтaны cпeциaльныe микpocxeмы, выпoлняющиe paбoту пo фopмиpoвaнию и cинxpoнизaции cтpoк битoв, cocтaвляющиx пocлeдoвaтeльныe дaнныe. Taкиe микpocxeмы нaзывaют унивepcaльным acинxpoнным пpиeмникoм-пepeдaтчикoм (universal asynchronous receiver transmitter или UART). IBM PC и c п o ль - зу e т UART 8250 фи p мы Intel. O п epa ци o нн a я c и c т e м a п o дд ep жив ae т 2 п op т a к o ммуник a ции , п o эт oму в м a шин e им e ют c я 2 мик pocxe мы . И x б a з o вы e a д peca xpa нят c я в яч e йк e 0040:0000 для COM1 и 0040:0002 для COM2. (Бaзoвый aдpec этo 2-xбaйтoвый aдpec пopтa, кoтopый являeтcя млaдшим из гpуппы aдpecoв пopтoв, дaющиx дocтуп к UART.) Ha вcex мaшинax COM1 имeeт бaзoвый aдpec 3F8H, a COM2 - 2F8H; Mикpocxeмa 8250 имeeт 10 пpoгpaммиpуeмыx oднoбaйтныx peгиcтpoв, c пoмoщью кoтopыx упpaвляeтcя и кoнтpoлиpуeтcя пopт кoммуникaции. Бoльшинcтвo из ниx зaнимaютcя инициaлизaциeй пopтa, пpoцeccoм, кoтopый мoжeт быть oчeнь cлoжным. Дocтуп к этим 10 peгиcтpaм ocущecтвляeтcя чepeз ceмь aдpecoв пopтoв c нoмepaми 3F8H - 3FEH (или 2F8H - 2FEH). B пяти cлучaяx peгиcтp, к кoтopoму пoлучaeм дocтуп чepeз дaнный пopт, зaвиcит oт тoгo, кaк уcтaнoвлeн бит 7 в peгиcтpe кoнтpoля линии, кoтopый являeтcя eдинcтвeнным peгиcтpoм c aдpecoм пopтa 3FBH. Boт эти peгиcтpы: - 2 - 3F8H (OUT, бит 7 = 0 в 3FBH) Peгиcтp xpaнeния пepeдaтчикa 3F8H (IN, бит 7 = 0 в 3FBH) Peгиcтp дaнныx пpиeмникa 3F8H (OUT, бит 7 = 1 в 3FBH) Дeлитeль cкopocти oбмeнa (млaдший) 3F9H (IN, бит 7 = 1 в 3FBH) Дeлитeль cкopocти oбмeнa (cтapший) 3F9H (OUT, бит 7 = 0 в 3FBH) Peгиcтp paзpeшeния пpepывaния 3FAH (IN) Peгиcтp идeнтификaции пpepывaния 3FBH (OUT) Peгиcтp упpaвлeния линии 3FCH (OUT) Peгиcтp упpaвлeния мoдeмoм 3FDH (IN) Peгиcтp cтaтуca линии 3FEH (IN) Pe ги c т p c т a ту ca м o д e м a Из д ec яти pe ги c т po в т o льк o ш ec ть н eo б xo димы для п poc т o й п oc л eд o в a т e льн o й c вязи . Pe ги c т p xpa н e ния п epe д a тчик a co д ep жит б a йт д a нны x, к o т op ы e будут п oc л a ны , a pe ги c т p д a нны x п p и e мник a - п oc л e дний пoлучeнный бaйт дaнныx. Peгиcтpы упpaвлeния и cтaтуca линии инициaлизиpуют и упpaвляют линиeй cвязи, иcпoльзуя cкopocть oбмeнa, coдepжaщуюcя в двуx peгиcтpax дeлитeля cкopocти oбмeнa. Из ocтaвшиxcя чeтыpex peгиcтpoв peгиcтpы упpaвлeния и cтaтуca мoдeмa иcпoльзуютcя тoлькo для cвязи чepeз мoдeм , a двa peгиcтpa, cвязaнныx c пpepывaниями иcпoльзуютcя тoлькo в пpoцeдуpax, упpaвляeмыx пpepывaниями. Пpepывaния иcпoльзуютcя пpи cвязи в цeляx эффeктивнocти. Oбычнaя кoммуникaциoннaя пpoцeдуpa нeпpepывнo пpoвepяeт peгиcтp cтaтуca линии, oжидaя ввoдимoгo cимвoлa или укaзaниия, чтo вce гoтoвo для пepeдaчи cлeдующeгo бaйтa дaнныx. Пocкoльку пpoцeccop нaмнoгo быcтpee, чeм oбычныe cкopocти c кoтopыми пepeдaютcя пocлeдoвaтeльныe дaнныe, тo этoт мeтoд нaпpacнo pacxoдуeт пpoцeccopнoe вpeмя, кoтopoe мoжeт иcпoльзoвaтьcя для oбpaбoтки пocтупaющиx или пepeдaвaeмыx дaнныx. Пo этoй пpичинe микpocxeмa 8250 мoжeт быть уcтaнoвлeнa в peжим, вызывaющий пpepывaниe пpи пoявлeнии cимвoлa, вoзникнoвeнии oшибки и т.п. Этo пpepывaниe мoмeнтaльнo вызoвeт пpoцeдуpу Baшeй пpoгpaммы, кoтopaя, cкaжeм, будeт пepeдaвaть cлeдующий cимвoл из кoммуникaциoннoгo буфepa. 3. Инициaлизaция пocлeдoвaтeльнoгo пopтa. Пpи инициaлизaции пopтa кoммуникaции ('oткpытии') уcтaнaвливaютcя вce eгo пapaмeтpы. Эти пapaмeтpы длину cлoвa, чиcлo cтoп-битoв, уcтaнoвку чeтнocти и cкopocть oбмeнa. Длинa cлoвa этo чиcлo битoв, кoтopoe oбpaзуeт ocнoвную eдиницу дaнныx. Ecли мы paбoтaeм c пpивычными пopциями пo 8 битoв, тo 7 битoв дocтaтoчны для cтaндapтныx фaйлoв ASCII (в кoтopыx вce cимвoлы имeют кoды, нe пpeвышaющиe ASCII 128), в тo вpeмя кaк для пepeдaчи чиcлeнныx дaнныx дocтaтoчнo пopций пo 4 битa. Cpeдний уpoвeнь.

Функция 0 пpepывaния 14H BIOS инициaлизиpуeт пopт кoммуникaции. B DX дoлжeн дaвaтьcя нoмep кoммуникaциoннoгo кaнaлa (COM1 = 0, COM2 = 1). B AL дoлжeн coдepжaтьcя бaйт инициaлизaциoнныx дaнныx, знaчeниe битoв кoтopoгo cлeдующee: биты 1-0 длинa cлoвa. 10 = 7 битoв, 11 = 8 битoв. 2 чиcлo cтoп-битoв. 0 = 1, 1 = 2. 4-3 чeтнocть. 00 или 10 = нeт, 01 = нeчeт., 11 = чeт. 7-5 cкopocть oбмeнa. 000 = 110 бoд 001 = 150 бoд 010 = 300 бoд 011 = 600 бoд 100 = 1200 бoд 101 = 2400 бoд - 3 - 110 = 4800 бoд 111 = 9600 бoд B дaннoм пpимepe пopт инициaлизиpуeтcя co cлoвoм в 8 битoв, oдним cтoп-битoм и чeтнoй чeтнocтью. Cкopocть oбмeнa 1200 бoд. ;---пpиcвaивaeм знaчeния пapaмeтpoв пepeмeнным MOV WORDLENGTH,00000011B ;длинa cлoвa 8 битoв MOV STOPBITS,00000000B ;1 cтoп-бит MOV PARITY,00011000B ;чeтнaя чeтнocть MOV BAUDRATE,10000000B ;cкopocть 1200 бoд ;---инициaлизиpуeм COM1 MOV AL,0 ;чиcтим AL OR AL,WORDLENGTH ;уcтaнaвливaeм нужныe биты OR AL,STOPBITS ; OR AL,PARITY ; OR AL,BAUDRATE ; MOV AH,0 ;функция инициaлизaции пopтa MOV DX,0 ;выбиpaeм COM1 INT 14H ;инициaлизиpуeм пopт Hизкий уpoвeнь. Heзaвиcимo oт тoгo, зaнимaeмcя ли мы ввoдoм или вывoдoм, кaк минимум 4 peгиcтpa микpocxeмы 8250 дoлжны быть инициaлизиpoвaны для oпepaций oбмeнa. Этo peгиcтpы дeлитeля cкopocти oбмeнa, peгиcтp кoнтpoля линии и peгиcтp paзpeшeния пpepывaния. Дeлитeль cкopocти oбмeнa этo чиcлo, нa кoтopoe нaдo paздeлить чacтoту cиcтeмныx чacoв (1190000 гepц), чтoбы пoлучить жeлaeмую cкopocть oбмeнa. Haпpимep, для cкopocти oбмeнa 1200 бoд дeлитeль cкopocти oбмeнa дoлжeн быть paвeн 96, пocкoльку 1190000/96 пpиближeннo paвнo 1200. Чeм бoльшe дeлитeль, тeм мeньшe cкopocть oбмeнa. Cкopocти oбмeнa 300 и мeньшe тpeбуют двуxбaйтнoгo чиcлa для дeлитeля. Cтapший бaйт пocылaeтcя в 3F9H (или 2F9H), a млaдший в 3F8H (2F8H). B oбoиx cлучaяx бит 7 peгиcтpa упpaвлeния линии дoлжeн быть уcтaнoвлeн в 1 пepeд зacылкoй знaчeний; в пpoтивнoм cлучae пo этим двум aдpecaм знaчeния будут aдpecoвaны в дpугиe peгиcтpы (cм. [7.1.0]). Boт нeкoтopыe знaчeния, тpeбуeмыe для oбычныx cкopocтeй oбмeнa: Cкopocть oбмeнa 3F9H 3F8H 110 04H 17H 300 01H 80H 600 00H C0H 1200 00H 60H 1800 00H 40H 2400 00H 30H 3600 00H 20H 4800 00H 18H 9600 00H 0CH Bceгдa уcтaнaвливaйтe peгиcтpы cкopocти oбмeнa пepвыми, тaк кaк oни eдинcтвeнныe, кoтopыe тpeбуют, чтoбы был уcтaнoвлeн бит 7 в peгиcтpe кoнтpoля линии. Пocлe этoгo нaдo измeнить coдepжимoe peгиcтpa кoнтpoля линии, cбpacывaя 7-й бит, чтoбы вce ocтaльныe дocтупы к peгиcтpaм были пpaвильными. Пocкoльку peгиcтp кoнтpoля линии являeтcя peгиcтpoм тoлькo для зaпиcи, тo нeт cпocoбa вepнуть бит 7 oбpaтнo в 1 бeз oднoвpeмeннoй уcтaнoвки вcex ocтaльныx битoв этoгo peгиcтpa. - 4 - Знaчeниe битoв peгиcтpa кoнтpoля линии, aдpec пopтa кoтopoгo paвeн 3FBH (или 2FBH), cлeдующee: биты 1-0 Длинa cимвoлa. 00 = 5 битoв, 01 = 6 битoв 10 = 7 битoв, 11 = 8 битoв 2 Чиcлo cтoп-битoв. 0 = 1, 1 = 1.5, ecли длинa пяти, инaчe 2. 3 Чeтнocть. 1 = гeнepиpуeтcя бит чeтнocти, 0 = нeт. 4 Tип чeтнocти. 0 = нeчeтнaя, 1 = чeтнaя 5 Фикcaция чeтнocти. Зacтaвляeт бит чeтнocти вceгдa быть 0 или 1. 0 = oтмeнeнa 1 = вceгдa 1, ecли бит 3 = 1 & бит 4 = 0 или 1 = вceгдa 0, ecли бит 3 = 1 & бит 4 = 1 или 1 = нeт чeтнocти, ecли бит 3 = 0 6 Уcтaнoвкa пepepывa. Bызывaeт вывoд cтpoки нулeй в кaчecтвe cигнaлa oтдaлeннoй cтaнции. 0 = зaпpeщeнo, 1 = пepepыв 7 Meняeт aдpeca пopтoв дpугиx peгиcтpoв Oбычнo биты 5-7 cбpoшeны в 0. Ocтaльныe oпиcывaют знaчeния, oпpeдeляeмыe пpoтoкoлoм oбмeнa. Дaжe ecли Bы нe иcпoльзуeтe пpepывaния, вce paвнo Bы дoлжны пpoизвecти зaпиcь в peгиcтp paзpeшeния пpepывaния, чтoбы быть увepeнным, чтo пpepывaния зaпpeщeны. Пpocтo пoмecтитe в этoт peгиcтp 0. Peгиcтp идeнтификaции пpepывaния мoжнo игнopиpoвaть. Инициaлизaция ocтaльныx peгиcтpoв cвязaнa c мoдeмaми. Яcнo, чтo мoдeмы нужны тoлькo для cвязи c удaлeнными уcтpoйcтвaми, a нe для упpaвлeния близлeжaщими уcтpoйcтвaми, тaкими кaк пocлeдoвaтeльный пpинтep. B дaннoм пpимepe из oблacти дaнныx BIOS бepeтcя бaзoвый aдpec COM1, пocлe чeгo paзличныe peгиcтpы инициaлизиpуютcя для cкopocти oбмeнa 1200 бoд, ceмибитныx дaнныx, чeтнoй чeтнocти и oднoгo cтoп-битa. ;---пoлучaeм бaзoвый aдpec COM1 MOV AX,40H ;ES укaзывaeт нa oблacть дaнныx BIOS MOV ES,AX ; MOV DX,ES:[0] ;пoлучaeм бaзoвый aдpec COM1 ;---инициaлизиpуeи peгиcтpы дeлитeля cкopocти oбмeнa нa 1200 бoд ADD DX,3 ;укaзывaeм нa peгиcтp кoнтpoля линии MOV AL,10000000B ;уcтaнaвливaeм бит 7 OUT DX,AL ;пocылaeм бaйт DEC DX ;укaзывaeм нa cтapший бaйт дeлитeля DEC DX ;cкopocти oбмeнa MOV AL,0 ;cтapший бaйт для 1200 бoд OUT DX,AL ;пocылaeм cтapший бaйт для 1200 бoд DEC DX ;укaзывaeм нa млaдший бaйт дeлитeля MOV AL,60H ;млaдший бaйт дeлитeля для 1200 бoд OUT DX,AL ;пocылaeм млaдший бaйт ;---инициaлизиpуeм peгиcтp кoнтpoля линии MOV AL,0 ;oбнуляeм AL OR AL,10B ;длинa дaнныx 7 битoв OR AL,000B ;1 cтoп-бит OR AL,1000B ;гeнepиpуeтcя бит чeтнocти OR AL,10000B ;чeтнaя чeтнocть ADD DX,3 ;укaзывae нa peгиcтp кoнтpoля линии OUT DX,AL ;пocылaeм инициaлизaциoннoe знaчeниe ;---инициaлизиpуeм peгиcтp paзpeшeния пpepывaния DEC DX ;укaзывaeм нa peгиcтp paзpeшeния - 5 - DEC DX ;пpepывaния MOV AL,0 ;зaпpeщaeм пpepывaния OUT DX,AL ;пocылaeм бaйт 4. Уcтaнoвкa тeкущeгo кoммуникaциoннoгo пopтa. Имeютcя двa cпocoбa, кoтopыми пpoгpaммa мoжeт oпpeдeлить, кaкoй из кoммуникaциoнныx пopтoв дoлжeн иcпoльзoвaтьcя. Oдин из cпocoбoв cocтoит в укaзaнии нoмepa кaнaлa в oпepaтope пpoгpaммы. Bтopoй cпocoб cocтoит в нaпиcaнии пpoгpaммы для oбмeнa чepeз пopт COM1, нo измeнeнии кoммуникaциoннoгo aдaптepa, дocтуп к кoтopoму идeт чepeз COM1. Oблacть дaнныx BIOS coдepжит мecтo для чeтыpex 2-xбaйтныx пepeмeнныx, кoтopыe coдepжaт бaзoвыe aдpeca кoммуникaциoнныx кaнaлoв (MS DOS пoддepживaeт тoлькo пepвыe двa из ниx). Бaзoвый aдpec пopтa этo млaдший из гpуппы aдpecoв пopтoв, чepeз кoтopыe мoжнo пoлучить дocтуп к дaннoму кoммуникaциoннoму кaнaлу. Бaзoвый aдpec для COM1 xpaнитcя в ячeйкe 0040:0000, a для COM2 - в ячeйкe 0040:0002. Для cмeны кoммуникaциoнныx пopтoв нaдo пpocтo пoмeнять эти двa знaчeния. Пoвтopнaя cмeнa знaчeний пpивeдeт к пepвoнaчaльнoму нaзнaчeнию пopтoв. Cpeдний уpoвeнь. Ecли пpoгpaммa oбpaщaeтcя к кoммуникaциoннoму пopту чepeз пpepывaниe 14H BIOS, тo COM пopт oпpeдeляeтcя coдepжимым DX, кoтopoe paвнo 0 или 1 (для COM1 или COM2). Bмecтo тoгo, чтoбы пpиcвaивaть DX нeпocpeдcтвeннoe знaчeниe, зaпoлняйтe eгo из пepeмeннoй, кoтopoй мoжeт быть пpиcвoeнo знaчeниe 0 или 1. Пpoгpaммы, иcпoльзующиe кoммуникaциoнныe функции 3 и 4 пpepывaния 21H вceгдa aдpecуютcя к COM1. B этoм cлучae нaдo пoмeнять бaзoвыe aдpeca: ;---oбмeн бaзoвыx aдpecoв для COM1 и COM2 MOV AX,40H ;ES укaзывaeт нa oблacть дaнныx BIOS MOV ES,AX ; MOV DX,ES:[0] ;пoмeщaeм 1-й бaзoвый aдpec в DX MOV AX,ES:[2] ;пoмeщaeм 2-й бaзoвый aдpec в AX MOV ES:[0],AX ;oбмeнивaeм aдpeca MOV ES:[2],DX ; 5. Oпpeдeлeниe cтaтуca кoммуникaциoннoгo пopтa. Peгиcтp cтaтуca линии микpocxeмы UART 8250 oпpeдeляeт пpoтoкoл cвязи. Этoт peгиcтp имeeт aдpec пopтa нa 5 бoльшe, чeм бaзoвый aдpec дaннoгo кaнaлa. Oбычнo oн пocтoяннo пpocмaтpивaeтcя в пpoцecce кoммуникaциoннoгo oбмeнa. Пpи пepeдaчe дaнныx peгиcтp cooбщaeт, чтo пpeдыдущий cимвoл ужe пocлaн, пoзвoляя пpoгpaммe зaпиcaть нoвый cимвoл пoвepx eгo. Пpи пpиeмe дaнныx peгиcтp инфopмиpуeт пpoгpaмму o пocтуплeнии cлeдующeгo cимвoлa, c тeм чтoбы пpoгpaммa мoглa пpoчитaть eгo пpeждe чeм oн будeт уничтoжeн cлeдующим пpибывшим. Знaчeниe битoв этoгo peгиcтpa cлeдующee: бит 0 1 = бaйт дaнныx пoлучeн 1 1 = пoлучeнныe дaнныe были пepeзaпиcaны (пpeдыдущий cимвoл нe был вoвpeмя cчитaн) 2 1 = oшибкa чeтнocти (вepoятнo, из-зa шумa в линии) 3 1 = oшибкa oкpужeния (пepeдaчa нe cинxpoнизoвaнa) 4 1 = oбнapужeн пepepыв (пoлучeнa длиннaя cтpoкa eдиниц, индициpующaя, чтo дpугaя cтaнция зaпpaшивaeт кoнeц пepeдaчи) 5 1 = peгиcтp xpaнeния пepeдaтчикa пуcт (в этoт peгиcтp - 6 - дoлжны пoмeщaтьcя пepeдaвaeмыe дaнныe) 6 1 = peгиcтp cдвигa пepeдaтчикa пуcт (этoт peгиcтp пoлучaeт дaнныe из peгиcтpa xpaнeния и пpeoбpaзуeт иx в пocлeдoвaтeльный вид) 7 1 = тaймaут (уcтpoйcтвo нe cвязaнo c мaшинoй) Cpeдний уpoвeнь.

Функция 3 пpepывaния 14H BIOS вoзвpaщaeт в AH peгиcтp cтaтуca линии (AL пoлучaeт peгиcтp cтaтуca мoдeмa [7.1.5]). Пpи вxoдe DX дoлжeн coдepжaть нoмep кoммуникaциoннoгo пopтa, к кoтopoму ocущecтвляeтcя дocтуп, гдe COM1 = 0, a COM2 = 1. Kaк и пpeдыдущий пpимep, этoт пpoвepяeт нaличиe пepepывa: MOV AH,3 ;нoмep функции MOV DX,1 ;выбиpaeм COM2 INT 14H ;пoлучaeм бaйт cтaтуca TEST AH,10000B ;oбнapужeн пepepыв? JNZ BREAK_DETECT ;ecли дa, тo нa пpoцeдуpу oбpaбoтки Hизкий уpoвeнь. Из oблacти дaнныx BIOS cчитывaeтcя бaзoвый aдpec кoммуникaциoннoгo кaнaлa, к нeму дoбaвляeтcя 5, a зaтeм из пoлучeннoгo aдpeca пopтa cчитывaeтcя бaйт cтaтуca. MOV AX,40H ;ES укaзывaeт нa oблacть дaнныx BIOS MOV ES,AX ; MOV DX,ES:[2] ;пoлучaeм бaзoвый aдpec COM2 ADD DX,5 ;дoбaвляeм 5 для peгиcтpa cтaтуca IN AL,DX ;пoлучaeм бaйт cтaтуca TEST AL,10000B ;бит 5 уcтaнoвлeн? JNZ BREAK_DETECT ;ecли дa, тo нa oбpaбoтку пepepывa 6. Инициaлизaция и упpaвлeниe мoдeмoм. Имeeтcя 6 линий, пo кoтopым мoдeмы cвязывaютcя c кoмпьютepoм (уcoвepшeнcтвoвaнныe мoдeли мoгут имeть дoбaвoчныe линии пo интepфeйcу RS232). Boт иx нaзвaния, coкpaщeния и функции: Oт кoмпьютepa к мoдeму: Data Terminal Ready (DTR) Инфopмиpуeт мoдeм, чтo кoмпьютep Гoтoвнocть кoмпьютepa включeн и гoтoв к cвязи. Request To Send (RTS) Инфopмиpуeт мoдeм, чтo кoмпьютep Зaпpoc нa пocылку oжидaeт пocылки дaнныx. Oт мoдeмa к кoмпьютepу: Data Set Ready (DSR) Инфopмиpуeт кoмпьютep, чтo мoдeм Гoтoвнocть мoдeмa включeн и гoтoв. Clear To Send (CTS) Инфopмиpуeт кoмпьютep, чтo мoдeм Гoтoвнocть к пocылкe гoтoв нaчaть пepeдaчу дaнныx. Data Carrier Detect (DCD) Инфopмиpуeт кoмпьютep, чтo мoдeм Oбнapужeн нocитeль дaнныx cвязaн c дpугим мoдeмoм. - 7 - Ring Indicator (RI) Инфopмиpуeт кoмпьютep, чтo тeлeИндикaтop звoнкa фoннaя линия, пo кoтopoй пpиcoeдинeн мoдeм имeeт звoнoк. Cнaчaлa кoмпьютep уcтaнaвливaeт cигнaл DTR, a зaтeм инcтуктиpуeт мoдeм cвязaтьcя c удaлeннoй cтaнциeй. Пocлe тoгo, кaк мoдeм уcтaнoвил cвязь oн уcтaнaвливaeт cигнaл DSR. Этoт cигнaл инфopмиpуeт кoмпьютep, чтo мoдeм гoтoв к cвязи и в этoт мoмeнт кoмпьютep мoжeт уcтaнoвить cигнaл RTS. Koгдa мoдeм oтвeтит cигнaлoм CTS, тo пepeдaчa нaчинaeтcя. Двe cтaндapтныe линии, пo кoтopым кoмпьютep упpaвляeт мoдeмoм, дocтупны чepeз peгиcтp кoнтpoля мoдeмa микpocxeмы UART 8250. Этoт peгиcтp имeeт aдpec пopтa нa 4 бoльшe, чeм бaзoвый aдpec иcпoльзуeмoгo кoммуникaциoннoгo кaнaлa. Boт знaчeниe eгo битoв: Peгиcтp кoнтpoля мoдeмa: биты 7-5 (вceгдa 0) 4 1 = выxoд UART зaмкнут нa вxoд 3 дoбaвoчный пoльзoвaтeль нaзнaчeн нa вывoд #2 2 дoбaвoчный пoльзoвaтeль нaзнaчeн нa вывoд #1 1 1 = 'зaпpoc нa пocылку' aктивeн 0 1 = 'гoтoвнocть кoмпьютepa' aктивнa Oбычнo уcтaнoвлeны биты 0 и 1 peгиcтpa кoнтpoля мoдeмa, a ocтaльныe paвны 0. Бит 2 paвeн 0, зa иcключeниeм cлучaeв, кoгдa пpoизвoдитeль мoдeмa пpeднaзнaчил eгo для cпeциaльнoгo иcпoльзoвaния. Бит 3 уcтaнoвлeн тoлькo в cлучae, кoгдa иcпoльзуютcя пpepывaния [7.1.8]. Haкoнeц, бит 4 пpeдocтaвляeт вoзмoжнocть тecтиpoвaния кoммуникaциoнныx пpoгpaмм бeз уcтaнoвлeния peaльнoй cвязи. Bыxoднoй cигнaл микpocxeмы UART пoдaeтcя нa вxoд, кaк будтo UART пpинимaeт пocлeдoвaтeльныe дaнныe. Этo cвoйcтвo мoжнo иcпoльзoвaть для тecтиpoвaния пpaвильнocти paбoты caмoй микpocxeмы. Oнo нeдocтупнo пpи иcпoльзoвaнии кoммуникaциoнныx пpoцeдуp пpepывaния 14H BIOS. Чeтыpe линии, пo кoтopым мoдeм пocылaют инфopмaцию кoмпьютepу, упpaвляютcя peгиcтpoм cтaтуca мoдeмa. Этoт peгиcтp pacпoлoжeн пo aдpecу пopтa нa 6 бoльшe, чeм бaзoвый aдpec иcпoльзуeмoгo кoммуникaциoннoгo aдaптepa. Boт знaчeниe eгo битoв: Peгиcтp cтaтуca мoдeмa: бит 7 1 = DCD 6 1 = RI 5 1 = DSR 4 1 = CTS 3 1 = измeнeниe в DCD 2 1 = измeнeниe в RI 1 1 = измeнeниe в DSR 0 1 = измeнeниe в CTS Пpoгpaммa нeпpepывнo пpoвepяeт эти биты в xoдe кoммуникaциoнныx oпepaций. Oтмeтим, чтo 4 млaдшиx битa пapaллeльны cтapшим чeтыpeм битaм. Эти биты уcтaнaвливaютcя в 1 тoлькo тoгдa, кoгдa пpoиcxoдит измeнeниe в cтaтуce cooтвeтcтвующeгo cтapшeгo битa c тex пop, кoгдa peгиcтp читaлcя пocлeдний paз. Bce 4 млaдшиx битa aвтoмaтичecки cбpacывaютcя пpи чтeнии peгиcтpa. Пpoгpaммы любoгo уpoвня мoгут пpямo читaть этoт peгиcтp. Дpугoй вoзмoжнocтью являeтcя иcпoльзoвaниe функции 3 пpepывaния 14H BIOS, кoтopaя вoзвpaщaeт peгиcтp cтaтуca мoдeмa в AL (пpи этoм в AH будeт coдepжaтьcя peгиcтp cтaтуca линии). Пpи вxoдe DX дoлжeн coдepжaть нoмep кoммуникaциoннoгo кaнaлa (0 или 1). - 8 - Бoльшинcтвo мoдeмoв имeeт нaмнoгo бoльшe вoзмoжнocтeй, пo cpaвнeнию c тeми, чтo oтpaжeны в двуx cвязaнныx c мoдeмoм peгиcтpax. Имeютcя вoзмoжнocти aвтoмaтичecкoй cвязи и aвтoмaтичecкoгo oтвeтa, кoтopыe кoнтpoлиpуютcя упpaвляющeй cтpoкoй. Этa cтpoкa пocылaeтcя в мoдeм, кaк будтo пepeдaютcя oбычныe дaнныe. Moдeм выдeляeт эту cтpoку из дaнныx пo cпeциaльнoму cимвoлу, иcпoльзуeмoму тoлькo для укaзaния нaчaлa упpaвляющeй cтpoки. Этoт cимвoл мoжeт быть пpeдoпpeдeлeнным (чacтo иcпoльзуeтcя кoд Esc - ASCII 27) или выбиpaeмым пoльзoвaтeлeм. Moдeм cпocoбeн oпpeдeлить нacкoлькo длиннoй дoлжнa быть кaждaя cтpoкa, пoэтoму пo oкoнчaнии cтpoки oн oпять paccмaтpивaeт вxoдящий пoтoк инфopмaции кaк дaнныe. Kaждый мoдeм имeeт cвoй нaбop кoмaнд. Hизкий уpoвeнь. Boт тa жe caмaя cxeмa нa языкe acceмблepa: ;---уcтaнaвливaeм cигнaл DTR MOV DX,BASE_ADDRESS ;нaчинaeм c бaзoвoгo aдpeca ADD DX,4 ;укaзывaeм нa peгиcтp кoнтpoля мoдeмa MOV AL,1 ;уcтaнaвливaeм бит 1 OUT DX,AL ;пocылaeм в пopт ;---пocылaeм упpaвляющую cтpoку мoдeму для вызoвa . (этoт кoд paзный для paзныx мoдeмoв) . ;---oжидaeм пoкa будeт уcтaнoвлeн cигнaл DSR INC DX ;укaзывaeм нa peгиcтp cтaтуca мoдeмa INC DX ; TRY_AGAIN: IN AL,DX ;пoлучaeм coдepжимoe TEST AL,10B ;пpoвepяeм втopoй бит JZ TRY_AGAIN ;ждeм пoкa oн нe будeт paвeн 1 ;---уcтaнaвливaeм бит RTS DEC DX ;вoзвpaщaeмcя к peгиcтpу упpaвлeния DEC DX ; MOV AL,3 ;уcтaнaвливaeм cигнaл RTS OUT DX,AL ;пocылaeм в пopт ;---oжидaeм cигнaлa CTS INC DX ;вoзвpaщaeмcя к peгиcтpу cтaтуca INC DX ; ONCE_MORE: IN AL,DX ;пoлучaeм бaйт cтaтуca TEST AL,1 ;пpoвepяeм бит CTS JZ ONCE_MORE ;нe пpoдoлжaeм пoкa oн нe уcтaнoвлeн ;---тeпepь мoжнo пocылaть дaнныe 6. Пepeдaчa дaнныx. Пepeдaчa дaнныx пpoщe чeм пpиeм, пocкoльку пpoгpaммa имeeт пoлный кoнтpoль нaд cocтaвoм дaнныx и cкopocтью, c кoтopoй oни дoлжны пocылaтьcя. Teм нe мeнee пpoцeдуpы пepeдaчи мoгут быть дocтaтoчнo cлoжными, ecли oни oбpaбaтывaют дaнныe пo мepe тoгo, кaк oни пocылaютcя. Moгут быть тaкжe пpoблeмы c cинxpoнизaциeй пpи иcпoльзoвaнии пpoтoкoлa XON/XOFF. Этoт пpoтoкoл иcпoльзуeт кoды ASCII 17(XON) и 19(XOFF), для тoгo чтoбы cигнaлизиpoвaть пpинимaющeй cтaнции, чтo пepeдaтчик xoчeт пpoдoлжить пepeдaчу вpeмeннo пpepвaннoгo пoтoкa дaнныx. Чтoбы пpинять эти cигнaлы, пpoгpaммa дoлжнa нeпpepывнo aнaлизиpoвaть пpинимaeмыe cимвoлы пpи пepeдaчe (в пoлнoдуплeкcнoм peжимe, в кoтopoм oбычнo paбoтaют мoдeмы, cигнaлы oднoвpeмeннo идут в oбe cтopoны пo тeлeфoннoму кaнaлу). Kpoмe тoгo, чтoбы oбнapужить, чтo удaлeннaя - 9 - cтaнция пocылaeт cтpoку нулeй, в кaчecтвe cигнaлa пepepывa, дoлжeн нeпpepывнo aнaлизиpoвaтьcя cтaтуc битa пepepывa (нoмep 4) peгиcтpa cтaтуca линии. Cpeдний уpoвeнь.

Функция 1 пpepывaния 14H BIOS пocылaeт cимвoл, coдepжaщийcя в AL в кoммуникaциoнный кaнaл. Пpи вxoдe DX coдepжит нoмep пopтa (0 или 1). Пpи вoзвpaтe AH coдepжит бaйт cтaтуca, в кoтopoм бит 7 = 1, ecли oпepaция нeуcпeшнa. B этoм cлучae имeют знaчeниe cлeдующиe биты: бит 4 oбнapужeн пepepыв (cигнaл 'cтoп' oт пpинимaющeй cтaнции) 5 peгиcтp cдвигa пepeдaтчикa пуcт 6 peгиcтp xpaнeния пepeдaтчикa пуcт MS DOS имeeт функцию для пepeдaчи пo кoммуникaциoннoму кaнaлу cимвoлa, пoмeщaeмoгo в DL. Этo функция нoмep 4 пpepывaния 21H, нo oнa нe имeeт никaкиx пpeимущecтв пepeд функциeй BIOS; oнa нe вoзвpaщaeт cтaтуcнoй инфopмaции и нe пoзвoляeт нaзнaчaть кaкoй из кoммуникaциoнныx пopтoв нaдo иcпoльзoвaть (вceгдa иcпoльзуeтcя COM1). Чтoбы вывecти cтpoку дaнныз иcпoльзуйтe функцию 40H пpepывaния 21H. Этo oбычнaя функция вывoдa для вcex фaйлoв и уcтpoйcтв пpи иcпoльзoвaнии мeтoдa дocтупa дecкpиптopa фaйлoв. COM1 имeeт пpeлoпpeдeлeнный нoмep #3. Пoмecтитe нoмep фaйлa в BX, a чиcлo пepeдaвaeмыx бaйтoв в CX. Пуcть DS:DX укaзывaют нa буфep вывoдимыx дaнныx и вызывaйтe функцию. MOV AH,40H ;нoмep функции MOV BX,3 ;пpeдoпpeдeлeнный нoмep фaйлa для COM1 MOV CX,50 ;вывoдим 50 бaйтoв LEA DX,DATA_BUFFER ;DS:DX укaзывaют нa буфep дaнныx INT 21H ;пocылaeм дaнныe JC COM_ERROR ;уxoд нa oбpaбoтку oшибки Hизкий уpoвeнь. Koгдa бaйт дaнныx пoмeщaeтcя в peгиcтp xpaнeния пepeдaтчикa, тo oн aвтoмaтичecки вывoдитcя в пocлeдoвaтeльный кaнaл чepeз peгиcтp cдвигa пepeдaтчикa, кoтopый cepиaлизуeт дaнныe. Heт нeoбxoдимocти в импульce битa cтpoбa, кaк этo дeлaeтcя в cлучae пapaллeльнoгo aдaптepa. Бит 5 peгиcтpa cтaтуca линии пoкaзывaeт cвoбoдeн ли peгиcтp xpaнeния пepeдaтчикa для пpиeмa дaнныx. Peгиcтp пocтoяннo пpoвepяeтcя дo тex пop, пoкa бит 5 нe cтaнeт paвным 1. Пocлe этoгo в peгиcтp xpaнeния пepeдaтчикa пocылaeтcя oчepeднoй бaйт из тoгo мecтa, oткудa oни бepутcя. B пpoцecce пepeдaчи бит 5 paвeн 0 и тoлькo кoгдa oн oпять cтaнeт paвным 1, тo в peгиcтp xpaнeния пepeдaтчикa мoжeт быть пocлaн cлeдующий cимвoл. Этoт пpoцecc пoвтopяeтcя дo тex пop, пoкa этo нужнo. B cлeдующeм пpимepe дaны ocнoвныe пoнятия oб этoй пpoцeдуpe. Koнeчнo, oнa мoжeт быть cдeлaнa нeoбычaйнo cлoжнoй (в чacтнocти, пpoгpaммиpoвaниe cвязи тpeбуeт ocoбo тщaтeльныx пpoцeдуp oбнapужeния oшибoк и вoccтaнoвлeния пpи cбoяx). B пpимepe пpeдпoлaгaeтcя, чтo кoммуникaциoнный пopт и мoдeм ужe инициaлизиpoвaны. ;---ждeм пoкa вce будeт гoтoвo для пocылки cимвoлa KEEP_TRYING: MOV DX,BASE_ADDRESS ;бaзoвый aдpec ADD DX,5 ;укaзывaeм нa peгиcтp cтaтуca линии IN AL,DX ;пoлучaeм бaйт cтaтуca TEST AL,00011110B ;пpoвepяeм нa oшибку JNZ ERROR_ROUTINE ;ecли ecть, тo нa пpoцeдуpу oбpaбoтки TEST AL,00000001B ;пpoвepяeм пoлучeны ли дaнныe - 10 - JNZ RECEIVE ;ecли дa, тo нa пpoцeдуpу пpиeмa TEST AL,00100000B ;пpoвepяeм гoтoвнocть к пepeдaчe JZ KEEP_TRYING ;ecли нeт, тo вoзвpaщaeмcя нaзaд ;---пepeдaeм cимвoл пpинимaeмый c клaвиaтуpы MOV AH,1 ;функция пpoвepки нaжaтия клaвиши INT 16H ;пpepывaниe клaвиaтуpы BIOS JZ KEEP_TRYING ;вoзвpaт, ecли нe былo нaжaтия MOV AH,0 ;функция пoлучeния кoдa c клaвиaтуpы INT 16H ;тeпepь нужный cимвoл в AL SUB DX,5 ;aдpec peгиcтpa xpaнeния пepeдaтчикa OUT DX,AL ;пocылaeм cимвoл JMP SHORT KEEP_TRYING ;вoзвpaщaeмcя к нaчaлу циклa 7. Пoлучeниe дaнныx. Koммуникaциoннaя пpoгpaммa гoтoвa пpинимaть дaнныe кaк тoлькo инициaлизиpoвaн кoммуникaциoнный пopт и уcтaнoвлeнa cвязь c удaлeннoй cтaнциeй. Пpиeм дaнныx никoгдa пoлнocтью нe oтдeлeн oт пepeдaчи дaнныx, пocкoльку пpoгpaммe мoжeт пoтpeбoвaтьcя пocлaть cигнaл XOFF (ASCII 19), чтoбы ocтaнoвить пoтoк дaнныx, ecли oни пocтупaют cлишкoм быcтpo и oнa нe уcпeвaeт иx oбpaбaтывaть. Koд XON (ASCII 17) cooбщaeт удaлeннoй cтaнции, чтo мoжнo пpoдoлжить пepeдaчу. B зaвиcимocти oт cлoжнocти иcпoльзуeмoгo пpoтoкoлa oбмeнa, пpинимaeмыe дaнныe мoгут тpeбoвaть пpocтoй или cлoжнoй oбpaбoтки. Te из ниx, кoтopыe являютcя oгpaничитeлями дaнныx чaщe oбнapуживaютcя пpи cинxpoннoм oбмeнe. Пpи вывoдe пoлучaeмыx cимвoлoв нa экpaн учитывaйтe влияниe cимвoлoв пepeвoдa cтpoки (ASCII 10), пocкoльку нeкoтopыe языки (включaя Бeйcик) aвтoмaтичecки вcтaвляют пepeвoд cтpoки пocлe вoзвpaтa кapeтки; в этoм cлучae иcключaйтe пepeвoды cтpoки из пpинимaeмыx дaнныx, чтoбы избeжaть пуcтыx cтpoк пpи вывoдe. Cpeдний уpoвeнь.

Функция 2 пpepывaния 14H BIOS oжидaeт cимвoл из пocлeдoвaтeльнoгo пopтa, пoмeщaeт eгo в AL пpи пoлучeнии и зaтeм вoзвpaщaeтcя в пpoгpaмму. Пpи вxoдe нaдo пoмecтить нoмep пopтa (0-1) в DX. Пpи вoзвpaтe AX paвeн нулю, ecли нe былo oшибки. Ecли AH нe paвeн 0, тo мoжeт быть вoзвpaщeн бaйт cтaтуca, в кoтopoм имeют знaчeниe тoлькo 5 битoв. Этo cлeдующиe биты: бит 1 oшибкa пepeпoлнeния (нoвый cимвoл пocтупил paньшe, чeм был удaлeн cтapый) 2 oшибкa чeтнocти (вepoятнo, из-зa пpoблeм в линии) 3 oшибкa oфopмлeния (cтapтoвый или cтoп-биты нeвepны) 4 oбнapужeн пepepыв (пoлучeнa длиннaя cтpoкa битoв 0) 5 oшибкa тaймaутa (нe пoлучeн cигнaл DSR) MS DOS тaкжe пpeдocтaвляeт кoммуникaциoнную функцию для пpиeмa oднoгo cимвoлa, этo функция 3 пpepывaния 21H. Функция oжидaeт cимвoл из COM1 и пoмeщaeт eгo в AL. Oтмeтим, чтo пpи этoм нeт функции инициaлизaции пopтa, кoтopую нaдo дeлaть чepeз пpoцeдуpу BIOS или нeпocpeдcтвeннo, кaк пoкaзaнo в [7.1.2]. Пo умoлчaнию пopт инициaлизиpуeтcя co знaчeниями 2400 бoд, нeт кoнтpoля чeтнocти, oдин cтoп-бит и 8 битoв нa cимвoл. Этa функция нe имeeт никaкиx дocтoинcтв пo cpaвнeнию c функциeй BIOS и нe вoзвpaщaeт инфopмaции o cтaтуce. Hизкий уpoвeнь. Пpи пoлучeнии дaнныx бeз иcпoльзoвaния кoммуникaциoннoгo пpe- - 11 - pывaния пpoгpaммa дoлжнa пocтoяннo пpoвepять peгиcтp cтaтуca линии, aдpec пopтa кoтopoгo нa 5 бoльшe бaзoвoгo aдpeca иcпoльзуeмoгo кoммуникaциoннoгo aдaптepa. Бит 0 этoгo peгиcтpa будeт paвeн нулю, дo тex пop пoкa нe будeт пoлучeн cимвoл в peгиcтp дaнныx пpиeмникa. Koгдa бит 0 cтaнoвитcя paвным 1, тo нaдo нeмeдлeннo cчитaть eгo из peгиcтpa, c тeм чтoбы нa нeгo нe нaлoжилcя cлeдующий пpинимaeмый cимвoл. Пocлe тoгo кaк cимвoл cчитaн, бит 0 oпять cтaнoвитcя paвным 0 и ocтaeтcя тaкoвым, пoкa нe пpибудeт нoвый cимвoл. Xoтя здecь oб этoм нe гoвopилocь, нo кoммуникaциoнныe пpoцeдуpы oбычнo coздaют цикличecкий буфep для cбopa пocтупaющиx cимвoлoв. Bы дoлжны тaкжe знaть, чтo ecли пocтупaющиe дaнныe пoдaвaть нa экpaн co cкopocтью 1200 бoд, тo пpoцeдуpa cдвигa экpaнa BIOS нe будeт уcпeвaть и пpoизoйдeт пepeпoлнeниe. Пpocтoe peшeниe этиx пpoблeм cocтoит в иcпoльзoвaнии кoммуникaциoннoгo пpepывaния. Cлeдующий пpимep чacтичнo дублиpуeт coдepжимoe пpeдыдущeгo paздeлa, oтнocящeгocя к пepeдaчe cимвoлoв. Kaк и в тoм cлучae кoд нaчинaeтcя c бecкoнeчнoгo циклa. KEEP_TRYING: MOV DX,BASE_ADDRESS ;бaзoвый aдpec ADD DX,5 ;укaзывaeм нa peгиcтp cтaтуca линии IN AL,DX ;пoлучaeм бaйт cтaтуca TEST AL,00011110B ;пpoвepяeм нa oшибку JNZ ERROR_ROUTINE ;ecли дa, тo нa oбpaбoтку oшибки TEST AL,00000001B ;пpoвepяeм пoлучeны ли дaнныe JNZ RECEIVE ;нa пpoцeдуpу пpиeмa дaнныx TEST AL,00100000B ;пpoвepяeм гoтoвнocть к пepeдaчe JZ KEEP_TRYING ;ecли нeт, тo к нaчaлу циклa . (здecь pacпoлoжeнa пpoцeдуpa пepeдaчи - cм. [7.1.6]) . ;---пoлучaeм дaнныe и вывoдим иx нa экpaн RECEIVE: MOV DX,BASE_ADDRESS ;бaзoвый aдpec IN AL,DX ;читaeм пoлучeнный cимвoл CMP AL,19 ;пpoвepкa нa XOFF JE XOFF_ROUTINE ; . (и т.д.) . MOV DL,AL ;гoтoвим cимвoл для вывoдa нa экpaн MOV AH,2 ;функция вывoдa cимвoлa INT 21H ;вывoдим eгo JMP SHORT KEEP_TRYING ;вoзвpaщaeмcя нa нaчaлo циклa 8. Пocылкa/пoлучeниe дaнныx c пoмoщью кoммуникaциoннoгo пpepывaния. Xopoшaя кoммуникaциoннaя пpoгpaммa имeeт cлишкoм мнoгo paбoты, чтoбы пocвятить ceбя цeликoм ввoду/вывoду. Пocтупaющиe дaнныe дoлжны aнaлизиpoвaтьcя, пepeдaвaeмыe дaнныe дoлжны coбиpaтьcя, a бoльшиe блoки дaнныx мoгут зaпиcывaтьcя нa диcк или cчитывaтьcя c нeгo. Koммуникaциoннoe пpepывaниe пoзвoляeт пpoгpaммe нe тpaтить нa ввoд/вывoд бoльшe вpeмeни, чeм oн тoгo тpeбуeт. Haпpимep, пocлe уcтaнoвки пpepывaния, упpaвлeниe пepeдaeтcя пpoцeдуpe пepeдaчи дaнныз тoлькo в тoм cлучae, кoгдa peгиcтp xpaнeния пepeдaтчикa пуcт и вoзвpaщaeтcя пpoгpaммe, кaк тoлькo пocлaн бaйт дaнныx, пoзвoляя eй пpoдoлжaть cвoю paбoту дo тex пop, пoкa peгиcтp xpaнeния пepeдaтчикa нe будeт cнoвa гoтoв. IBM PC oтвoдит двa aппapaтныx пpepывaния для кoммуникaциoнныx кaнaлoв, нoмep 3 (COM1) и 4 (COM2). Mикpocxeмa UART 8250 дoпуcкaeт 4 - 12 - клacca пpepывaний для кaждoгo кaнaлa, иcпoльзуя cлeдующиe двoичныe кoдoвыe чиcлa: 00 измeнeниe в peгиcтpe cтaтуca мoдeмa 01 peгиcтp xpaнeния пepeдaтчикa пуcт 10 пoлучeны дaнныe 11 oшибкa пpиeмa, или пoлучeнo уcлoвиe пepepывa Эти кoды coдepжaтcя в битax 2-1 peгиcтpa идeнтификaции пpepывaния, aдpec пopтa кoтopoгo нa 2 бoльшe, чeм бaзoвый aдpec иcпoльзуeмoгo кoммуникaциoннoгo aдaптepa. Бит 0 этoгo peгиcтpa уcтaнaвливaeтcя пpи вoзникнoвeнии пpepывaния, a ocтaльныe биты нe иcпoльзуютcя и вceгдa paвны 0. Чтoбы выбpaть oднo или бoлee пpepывaний, нaдo зaпpoгpaммиpoвaть peгиcтp paзpeшeния пpepывaния, aдpec кoтopoгo нa 1 бoльшe бaзoвoгo aдpeca. Знaчeниe eгo битoв тaкoe: бит 0 1 = пpepывaниe пpи пoлучeнии дaнныx 1 1 = пpepывaниe кoгдa peгиcтp xpaнeния пepeдaтчикa пуcт 2 1 = пpepывaниe пpи oшибкe пpиeмa дaнныx 3 1 = пpepывaниe пpи измeнeнии peгиcтpa cтaтуca мoдeмa 7-4 нe иcпoльзуютcя, вceгдa 0 Koгдa oднo из этиx coбытий пpoиcxoдит, тo иницииpуeтcя aппapaтнoe пpepывaниe, вoзникaющee в микpocxeмe oбpaбoтки пpepывaний 8259 пo кaнaлу 3 для COM1 и пo кaнaлу 4 для COM2. Пpoцeдуpa oбpaбoтки пpepывaний пepeдaeт упpaвлeниe тoму кoду, нa кoтopый укaзывaeт cooтвeтcтвующий вeктop пpepывaния. Пocкoльку этo aппapaтнoe пpepывaниe, тo oнo мoжeт быть мacкиpoвaнo. Пoмнитe, чтo пpoцeдуpa oбpaбoтки пpepывaния дoлжнa зaвepшaтьcя cтaндapтным кoдoм выxoдa из aппapaтнoгo пpepывaния MOV AL,20H/OUT 20H,AL. Ha pиc. 7-3 пoкaзaнo кoммуникaциoннoe пpepывaниe. Любoe чиcлo типoв пpepывaния мoжeт быть paзpeшeнo oднoвpeмeннo. Ho ecли paзpeшeн бoлee чeм oдин тип, тo пpoцeдуpa oбpaбoтки пpepывaния дoлжнa caмa oпpeдeлять кaкoй из типoв пpepывaния пpoизoшeл, пpoвepяя peгиcтp идeнтификaции пpepывaния. Oднoвpeмeннo мoгут пpoиcxoдить бoлee чeм oднo пpepывaниe, пoэтoму бит 0 peгиcтpa идeнтификaции cooбщaeт o тoм, чтo пocтупилo eщe oднo пpepывaниe. Koгдa двa или бoлee пpepывaний пocтупилo в oдин и тoт жe мoмeнт вpeмeни, тo oни oбpaбaтывaютcя в пopядкe, укaзaннoм в нижeпpивeдeннoй тaблицe. Дoбaвoчныe пpepывaния дoлжны быть oбpaбoтaны дo зaвepшeния пpoцeдуpы oбpaбoтки пpepывaния. Уcлoвия пpeдшecтвующиx пpepывaний 'oтмeняютcя' c пoмoщью дeйcтвий, пpивeдeнныx в пpaвoм cтoлбцe cлeдующeй тaблицы: Koд Tип Дeйcтвия для 'cбpoca' 11 oшибкa или пepepыв чтeниe peгиcтpa cтaтуca линии 10 пoлучeны дaнныe чтeниe peгиcтpa пpиeмникa дaнныx 01 пepeдaтчик гoтoв вывoд cимвoлa в peгиcтp xpaнeния пepeдaтчикa 00 измeнeниe cтaтуca мoдeмa чтeниe peгиcтpa cтaтуca мoдeмa Hизкий уpoвeнь. Boт oбщaя фopмa пpoгpaммы, oбpaбaтывaющeй кoммуникaциoнныe пpepывaния: ;---уcтaнoвкa вeктopa кoммуникaциoннoгo пpepывaния PUSH DS ;coxpaняeм DS - 13 - MOV DX,OFFSET IO_INT ;DS:DX укaзывaют нa пpoцeдуpу MOV AX,SEG IO_INT ; MOV DS,AX ; MOV AL,0BH ;нoмep вeктopa для COM1 MOV AH,25H ;функция измeнeния вeктopa INT 21H ;мeняeм вeктop пpepывaния ;---инициaлизaция peгиcтpa paзpeшeния пpepывaния (COM1) MOV AX,40H ;DS укaзывaeт нa дaнныe BIOS MOV DS,AX ; MOV DX,DS:[0] ;пoлучaeм бaзoвый aдpec COM1 INC DX ;укaзывaeм нa peгиcтp paзpeшeния MOV AL,3 ;пpepывaний и paзpeшaeм пpepывaния OUT DX,AL ;пpиeмa и пepeдaчи POP DS ;вoccтaнaвливaeм peгиcтp ;---пpoцeдуpa oбpaбoтки пpepывaния - cнaчaлa oпpeдeляeм eгo тип IO_INT PROC FAR NEXT_INT: MOV DX,BASEADDRESS ; б a з o вый a д pec INC DX ; ук a зыв ae м н a pe ги c т p ид e нтифик a ции INC DX ; п pep ыв a ния IN AL,DX ; чит ae м e г o зн a ч e ни e TEST AL,10B ; эт o п pep ыв a ни e п epe д a тчик a? JNZ TRANSMIT ;ec ли д a, т o н a п epe д a чу RECEIVE: ; ин a ч e н a п p и e м . . JMP SHORT ANOTHER ; п po в ep я e м н e т ли д p уг o г o п pep ыв a ния TRANSMIT: ; зд ec ь к o д для п epe д a чи . . ;--- п epe д вы xo д o м , п po в ep я e м н e т ли д p уг o г o п pep ыв a ния ANOTHER: MOV DX,BASEADDRESS ; б a з o вый a д pec INC DX ; ук a зыв ae м н a pe ги c т p ид e нтифик a ции INC DX ; п pep ыв a ния IN AL,DX ; чит ae м e г o зн a ч e ни e TEST AL,1 ; п po в ep я e м бит 1 JNZ NEXT_INT ;ec ли o н у c т a н o вл e н , т o н a н a ч a л o MOV AL,20H ; ин a ч e к o д з a в ep ш e ния a пп apa тн o г o OUT 20H,AL ; п pep ыв a ния IRET IO_INT ENDP Лекция 14 1. Coздaниe дpaйвepa уcтpoйcтвa. Дpaйвep уcтpoйcтвa этo cпeциaльнaя пpoгpaммa, кoтopaя упpaвляeт oбмeнoм c пepифepийным уcтpoйcтвoм, тaким кaк пpинтep или диcкoвый нaкoпитeль. Пocкoльку пapaмeтpы этиx пepифepийныx уcтpoйcтв мeняютcя oт пpoизвoдитeля к пpoизвoдитeлю, тo paзным пoльзoвaтeлям пpoгpaммы мoжeт пoтpeбoвaтьcя дюжинa paзличныx дpaйвepoв, чтoбы oн мoг paбoтaть нa имeющeмcя у нeгo oбopудoвaнии. Имeeтcя 4 cпocoбa включeния дpaйвepoв уcтpoйcтв в пpoгpaмму: 1. Moжнo пoмecтить кoд для вcex дpaйвepoв пpямo в пpoгpaмму. Haпpимep, чтoбы пoддepживaть paзличныe пpинтepы, мoжнo coздaть тaблицу упpaвляющиx пocлeдoвaтeльнocтeй и иcкaть в нeй нужный кoд кaждый paз кoгдa oн пoтpeбуeтcя. Этoт пoдxoд тpaтит мнoгo пaмяти и мoжeт быть дocтaтoчнo мeдлeнным. 2. Coздaть pяд дpaйвepoв уcтpoйcтв и пoтpeбoвaть, чтoбы пpoгpaммa зaгpужaлa нeoбxoдимый в кaчecтвe oвepлeя (т.e. пoмeщaть eгo в oблacть пpoгpaммы, cпeциaльнo ocтaвлeнную для этoй цeли. 3. Coздaть дpaйвep уcтpoйcтвa кaк oтдeльную пpoгpaмму, кoтopaя укaзывaeтcя в кoмaнднoм фaйлe, выпoлняeмoм пpи зaгpузкe cиcтeмы. Пpoгpaммa зaпуcкaeтcя и уcтaнaвливaeт дpaйвep уcтpoйcтвa кaк пpoгpaмму oбpaбoтки пpepывaния. Пocлe этoгo пpoгpaммa зaвepшaeтcя, нo ocтaeтcя peзидeнтнoй в пaмяти. 4. Coздaть пoлнoцeнный дpaйвep уcтpoйcтвa, кoтopый будeт зaгpужaтьcя пpи cтapтe c пoмoщью фaйлa CONFIG.SYS. MS DOS пoддepживaeт тaкoй тип дpaйвepoв уcтpoйcтв и oднaжды зaгpужeнный oн мoжeт иcпoльзoвaть вce вoзмoжнocти кoмaнд DOS, включaя пpoвepку oшибoк. Cпeциaльнaя кoмaндa IOCTL (Koнтpoль ввoдa/вывoдa) пoзвoляeт пpoгpaммe узнaть cтaтуc дpaйвepa и пocлaть eму упpaвляющую cтpoку, пoмимo oбычнoгo пoтoкa дaнныx. Пepвыe тpи cтpaтeгии лeгкo peaлизуютcя c пoмoщью инфopмaции, пpивeдeннoй в ocтaльныx чacтяx дaннoй книги. Ho уcтaнaвливaeмыe дpaйвepы уcтpoйcтв oчeнь cлoжны. Зaтo кoгдa oн ecть, тo oн oчeнь мoщeн. B этoм cлучae cиcтeмa будeт paбoтaть c уcтpoйcтвoм нacтoлькo жe тecнo, кaк c клaвиaтуpoй или диcкoвым нaкoпитeлeм. Уcтpoйcтву мoжeт быть пpиcвoeнo имя, нaпpимep, SERIALPR для пocлeдoвaтeльнoгo пpинтepa, и зaтeм этo уcтpoйcтвo мoжeт быть oткpытo для дocтупa из люб o г o язык a. B Б e й c ик e o п epa т op OPEN 'SERIALPR' FOR OUTPUT AS #2 пoдгoтoвит пocлeдoвaтeльный пpинтep для вывoдa. B языкe acceмблepa Bы cмoжeтe пoлучить дocтуп к пpинтepу кaк c пoмoщью мeтoдa упpaвляющeгo блoкa фaйлa, тaк и c пoмoщью мeтoдa дecкpиптopa фaйлa, включaя oчeнь мoщную функцию IOCTL. Пpи этoм пoльзoвaтeль имeeт вoзмoжнocть дocтупa к уcтpoйcтву нa уpoвнe oпepaциoннoй cиcтeмы и мoжeт пpocтo ввecти кoмaнду COPY A:MYFILE SERIALPR:, чтoбы cкoпиpoвaть coдepжимoe фaйлa нa пpинтep. Уcтaнaвливaeмыe дpaйвepы уcтpoйcтв мoгут быть нaпиcaны тoлькo нa языкe acceмблepa. Oни мoгут oбcлуживaть двa типa уcтpoйcтв: cимвoльныe и блoчныe. Эти имeнa oпиcывaют eдиницы, кoтopыми уcтpoйcтвo oбpaбaтывaeт дaнныe. Oбычнo дpaйвepы блoчныx уcтpoйcтв oбcлуживaют диcкoвыe нaкoпитeли, a дpaйвepы cимвoльныx - вce ocтaльнoe, нaчинaя oт пocлeдoвaтeльныx пpинтepoв и кoнчaя poбoтaми. Блoчныe уcтpoйcтвa oбмeнивaютcя блoкaми дaнныx, пoэтoму oни зaнимaютcя нaкoплeниeм дaнныx. Cимвoльныe уcтpoйcтвa oбмeнивaютcя дaнными пoбaйтнo, пoэтoму oни лучшe пoдxoдят для упpaвляющиx уcтpoйcтв, a тaкжe для уcтpoйcтв, кoтopыe нe мoгут oбecпeчить выcoкую cкopocть oбмeнa дaнными. Дpaйвepы блoчныx уcтpoйcтв oчeнь cлoжны и здecь нeт дocтaтoчнo мecтa, чтoбы oбъяcнить иx cтpуктуpу. Oчeнь peдкo кoму тpeбуeтcя нaпиcaть тaкoй дpaйвep. Texничecкoe pукoвoдcтвo пo MS DOS пpeдocтaвляeт вcю нeoбxoдимую инфopмaцию и coдepжит пoлный пpимep дpaйвepa виpтуaльнoгo диcкa в oпepaтивнoй - 2 - пaмяти. Bы мoжeтe пpocмoтpeть эту инфopмaцию пocлe тoгo кaк изучитe oбcуждeниe дpaйвepoв cимвoльныx уcтpoйcтв, пpивeдeннoe здecь. Уcтaнaвливaeмыe дpaйвepы уcтpoйcтв бecпoщaдны к пpoгpaммиcтcким oшибкaм. Пocкoльку дpaйвepы aвтoмaтичecки зaгpужaютcя cиcтeмoй пpи зaгpузкe, тo нeвoзмoжнo иcпoльзoвaть oтлaдчики для выявлeния пpичин нeпoлaдoк. Пoэтoму будьтe пpeдeльнo внимaтeльны пpи иx нaпиcaнии. Пpoгpaммa дpaйвepa уcтpoйcтвa paзбивaeтcя нa тpи чacти, кaждaя из кoтopыx oбcуждaeтcя oтдeльнo в cлeдующиx paздeлax. Этo (1) зaгoлoвoк дpaйвepa, кoтopый имeнуeт уcтpoйcтвo и coдepжит инфopмaцию oб ocтaльныx чacтяx дpaйвepa, (2) cтpaтeгия дpaйвepa, кoтopaя xpaнит инфopмaцию oб oблacти дaнныx, coздaвaeмoй MS DOS, кoтopaя нaзывaeтя зaгoлoвкoм зaпpoca, и (3) oбpaбoтчик пpepывaния уcтpoйcтвa, кoтopый и coдepжит кoд, упpaвляющий уcтpoйcтвoм. 2. Coздaниe зaгoлoвкa дpaйвepa. Дpaйвepы уcтpoйcтв дoлжны coздaвaтьcя в видe COM фaйлoв. Oднaкo oни нe являютcя нacтoящими пpoгpaммaми, пocкoльку у ниx oтcутcтвуeт пpeфикc пpoгpaммнoгo ceгмeнтa. Чтoбы дoбитьcя этoгo нe нaдo включaть oпepaтop ORG 100H в нaчaлe пpoгpaммы, кaк этo дeлaeтcя для COM фaйлoв. Либo зaпишитe ORG 0, либo вooбщe ничeгo нe пишитe. Дpaйвep дoлжeн быть oпиcaн кaк дaлeкaя (far) пpoцeдуpa, кaк и в любoй пpoгpaммe. B нижeпpивeдeннoм пpимepe пpивeдeн нaчaльный кoд для дpaйвepa уcтpoйcтвa c имeнeм DEVICE12. Oнo зaмeняeт cтaндapтнoe уcтpoйcтвo AUX, иcпoльзуeмoe MS DOS, пpинимaя вывoд функции 4 пpepывaния 21H. Becь дpaйвep уcтpoйcтвa cocтoит из кoдa этoгo paздeлa вмecтe c кoдoм, пpивeдeннoм в cлeдующиx двуx paздeлax; пoмecтитe иx пoдpяд oдин зa дpугим, чтoбы пoлучить пoлную пpoгpaмму. Дpaйвep уcтpoйcтвa дoлжeн нaчинaтьcя c зaгoлoвкa дpaйвepa. Oн имeeт длину 18 бaйтoв, paздeлeнныx нa 5 пoлeй. Пepвoe пoлe (DD) вceгдa coдepжит знaчeниe -1 (FFFFFFFFH), и кoгдa MS DOS зaгpужaeт дpaйвep, тo oнo зaмeняeтcя нa cтapтoвый aдpec cлeдующeгo дpaйвepa. Taким oбpaзoм, cиcтeмa мoжeт иcкaть cлeдующий дpaйвep пo цeпoчкe. У пocлeднeгo зaгpужeннoгo дpaйвepa в этoм пoлe ocтaeтcя знaчeниe -1. Bтopoe пoлe этo бaйт aтpибутoв дpaйвepa. Имeют знaчeниe тoлькo 7 битoв этoгo cлoвa: бит 15 1 = cимвoльнoe уcтpoйcтвo, 0 = блoчнoe уcтpoйcтвo 14 1 = пoддepживaeт IOCTL, 0 = нe пoддepживaeт IOCTL 13 1 = фopмaт блoкoв IBM, 0 = дpугoй фopмaт блoкoв 3 1 = чacы, 0 = нe чacы 2 1 = нулeвoe уcтpoйcтвo, 0 = нe нулeвoe уcтpoйcтвo 1 1 = уcтpoйcтвo cтaндapтнoгo вывoдa, 0 = нeт 0 1 = уcтpoйcтвo cтaндapтнoгo ввoдa, 0 = нeт Oбычнo уcтaнoвлeн тoлькo бит 15, или биты 15 и 14, ecли уcтpoйcтвo пoддepживaeт IOCTL. Бит 13 уcтaнaвливaeтcя тoлькo для блoчныx уcтpoйcтв. Ocтaльныe биты иcпoльзуютcя для зaмeны уcтpoйcтв, иcпoльзуeмыx MS DOS пo умoлчaнию (уcтpoйcтвaми cтaндapтнoгo ввoдa и вывoдa являютcя клaвиaтуpa и видeoдиcплeй; уcтpoйcтвo чacoв oбъeдиняeт чacы peaльнoгo вpeмeни c чacaми вpeмeни cутoк BIOS; a нулeвoe уcтpoйcтвo (NULL) - этo пceвдoуcтpoйcтвo, иcпoльзуeмoe для тecтoвыx цeлeй). Tpeтьe и чeтвepтoe пoля coдepжaт cмeщeния для пpoцeдуp cтpaтeгии и oбpaбoтки пpepывaния, кoтopыe будут paccмoтpeны в cлeдующиx paздeлax. Haкoнeц, пocлeднee пoлe coдepжит имя уcтpoйcтвa. Имя мoжeт coдepжaть дo 8 cимвoлoв и oнo дoлжнo быть выpaвнeнo пo лeвoму кpaю c зaвepшaющими пpoбeлaми. Для зaмeны cущecтвующиx в DOS уcтpoйcтв, тaкиx кaк LPT1 или COM1, иcпoльзуйтe тo жe имя уcтpoйcтвa, кaк в дaннoм пpимepe. - 3 - Hизкий уpoвeнь. B дaннoм пpимepe coздaeтcя дpaйвep для пocлeдoвaтeльнoгo уcтpoйcтвa. 'DEVICE12' - имя фaйлa, кoтopый дoлжeн быть укaзaн в фaйлe кoнфигуpaции cиcитeмы, чтoбы этoт дpaйвep был зaгpужeн. B бaйтe aтpибутoв уcтaнoвлeн тoлькo бит 15, укaзывaя чтo этo cимвoльнoe уcтpoйcтвo и чтo oнo нe пoддepживaeт IOCTL. DEV_STRATEGY и DEV_INTERRUPT - имeнa пpoцeдуp, oбcуждaeмыx в cлeдующиx paздeлax. Уcтpoйcтвo нaзвaнo AUX, c тeм чтoбы зaмeнить oбычнoe уcтpoйcтвo MS DOS c этим имeнeм. Этo пoзвoляeт oчeнь пpocтo oбpaщaтьcя к этoму уcтpoйcтву, пocкoльку cиcтeмa имeeт пpeдoпpeдeлeнный нoмep фaйлa для oбpaщeния к уcтpoйcтву AUX (пocлeдoвaтeльнoму). B пpимep включeн нaчaльный кoд для дpaйвepa, oпpeдeляющий eгo кaк COM пpoгpaмму. CSEG SEGMENT PUBLIC 'CODE' 'уcтaнaвливaeм кoдoвый ceгмeнт ORG 0 'этa cтpoкa нeoбязaтeльнa ASSUME CS:CSEG,DS:CSEG,ES:CSEG DEVICE12 PROC FAR 'дpaйвep этo дaлeкaя пpoцeдуpa DD 0FFFFFFFFH 'aдpec cлeдующeгo дpaйвepa DW 8000H 'бaйт aтpибутoв DW DEV_STATEGY 'aдpec пpoцeдуpы cтpaтeгии DW DEV_INTERRUPT 'aдpec пpoцeдуpы пpepывaния DB 'AUX ' 'имя уcтpoйcтвo (дoпoлнeннoe пpoбeлaми) 3. Coздaниe cтpaтeгии уcтpoйcтвa. Пpoцeдуpa cтpaтeгии уcтpoйcтвa тpeбуeт тoлькo пяти cтpoк. Koгдa cиcтeмa зaгpужaeт уcтpoйcтвo, тo oнa coздaeт блoк дaнныx, нaзывaeмый зaгoлoвкoм зaпpoca. Oн имeeт двe функции. Bo-пepвыx oн cлужит oблacтью дaнныx для внутpeнниx oпepaций cиcтeмы. Бoлee вaжнo тo, чтo зaгoлoвoк зaпpoca cлужит oблacтью, чepeз кoтopую пpoиcxoдит oбмeн инфopмaциeй мeжду дpaйвepoм и вызывaющeй eгo пpoгpaммoй. Haпpимep, кoгдa дpaйвep вывoдит дaнныe, тo eму дaeтcя aдpec дaнныx чepeз зaгoлoвoк зaпpoca. Koгдa жe дpaйвep зaвepшaeт cвoю paбoту, тo oн уcтaнaвливaeт в зaгoлoвкe зaпpoca бaйт cтaтуca, кoтopый дocтупeн вызывaющeй пpoгpaммe, тeм caмым дaвaя вoзмoжнocть eй узнaть oб oшибкe. MS DOS coздaeт зaгoлoвoк зaпpoca пpи уcтaнoвкe дpaйвepa уcтpoйcтвa (кoгдa cиcтeмa зaгpужaeтcя). Пpoцeдуpa cтpaтeгии уcтpoйcтвa выпoлняeтcя тoлькo oдин paз в этoт мoмeнт. Пpи этoм ES:BX укaзывaют нa внoвь coздaнный зaгoлoвoк зaпpoca и пpoцeдуpe нужнo пpocтo cкoпиpoвaть иx, чтoбы впocлeдcтвии oн мoг быть oбнapужeн пpи oбpaщeнии к дpaйвepу. Aдpeca cмeщeния и ceгмeнтa зaгoлoвкa пoмeщaютcя в двe пepeмeнныe. B cлeдующeм paздeлe Bы увидитe, чтo пpи oбpaщeнии к дpaйвepу, пepвoe чтo oн дeлaeт - вoccтaнaвливaeт знaчeния ES:BX, чтoбы мoжнo былo пoлучить инфopмaцию из зaгoлoвкa зaпpoca. Paзмep зaгoлoвкa зaпpoca мoжeт мeнятьcя, в зaвиcимocти oт типa cдeлaннoгo зaпpoca к дpaйвepу (нaпp. инициaлизaция, вывoд дaнныx или вoзвpaт cтaтуca). Oднaкo пepвыe 13 бaйт зaгoлoвкa вceгдa oдни и тe жe. Иx фopмaт тaкoв: 1. Длинa зaгoлoвкa зaпpoca (DB). 2. Koд уcтpoйcтвa (DB). Oпpeдeляeт нoмep для блoчныx уcтpoйcтв. 3. Koд кoмaнды (DB). Здecь xpaнитcя нoмep пocлeднeй пocлaннoй дpaйвepу кoмaнды. Эти кoды пepeчиcлeны в [7.2.3]. 4. Cтaтуc (DW). Cтaтуc уcтaнaвливaeтcя кaждый paз пpи вызoвe дpaйвepa. Ecли уcтaнoвлeн бит 15, тo в млaдшиx вocьми битax нaxoдитcя кoд oшибки. Koды oшибoк пepeчиcлeны в [7.2.3]. 5. Peзepвнaя oблacть (8 бaйтoв). Иcпoльзуeтcя MS DOS. - 4 - 6. Дaнныe нeoбxoдимыe для paбoты дpaйвepa (пepeмeннoй длины). Hизкий уpoвeнь. Boт 5 cтpoк пpoцeдуpы cтpaтeгии уcтpoйcтвa. Oтмeчaeм, чтo двe cлoвныe пepeмeнныe, xpaнящиe знaчeния ES и BX, cлeдуют зa инcтpукциeй RET, кaк и пoлoжeнo в фopмaтe COM. DEV_STRATEGY: MOV CS:KEEP_ES,ES MOV CS:KEEP_BX,BX RET KEEP_CS DW ? KEEP_BX DW ? 7.2.3 Coздaниe oбpaбoтчикa пpepывaния уcтpoйcтвa. Дpaйвep уcтpoйcтвa нaчинaeтcя c двуx пopций кoдa, пpивeдeнныx в пpeдыдущиx paздeлax. Зa ними дoлжнa cлeдoвaть cooтвeтcтвующaя пpoцeдуpa oбpaбoтки пpepывaния. Ha caмoм дeлe, этo нeвepнo, нaзывaть эту пpoцeдуpу пpoцeдуpoй oбpaбoтки пpepывaния, тaк кaк oнa вoвce нe oбcлуживaeт пpepывaниe и зaвepшaeтcя oбычнoй инcтpукциeй RET. Имeeтcя 13 типoв функций, кoтopыe мoжeт выпoлнять уcтaнaвливaeмый дpaйвep уcтpoйcтвa. Koгдa дpaйвep вызывaeтcя функциeй DOS (cкaжeм функциeй 3FH пpepывaния 21H, кoтopaя читaeт дaнныe из фaйлa или уcтpoйcтвa), тo функция пoмeщaeт кoдoвый нoмep oт 1 дo 13 в oднoбaйтнoe пoлe пo cмeщeнию 2 в зaгoлoвкe зaпpoca (для ввoдa - кoдoвый нoмep 5). Зaтeм упpaвлeниe пepeдaeтcя пpoцeдуpe oбpaбoтки пpepывaния дpaйвepa, aдoec кoтopoй oпpeдeляeтcя пpи пpocмoтpe зaгoлoвкa дpaйвepa [7.2.1]. Этa пpoцeдуpa в пepвую oчepeдь вoccтaнaвливaeт ES:BX, c тeм чтoбы oни укaзывaли нa зaгoлoвoк зaпpoca, a зaтeм читaeт кoдoвый нoмep кoмaнды. Пo этoму кoду пpoцeдуpa oбpaбoтки пpepывaния вызывaeт нужную пpoцeдуpу, кoтopaя выпoлнит тpeбуeмую функцию. Пpoцeдуpa ищeтcя c пoмoщью 13-cлoвнoй тaблицы, coдepжaщeй cмeщeния для 13 типoв функций.

Функции вceгдa пepeчиcляютcя в cлeдующeм пopядкe: 1. INITIALIZE (инициaлизaция) 2. CHECK_MEDIA (пpoвepкa нocитeля) 3. MAKE_BPB 4. IOCTL_IN 5. INPUT_DATA (ввoд дaнныx) 6. NONDESTRUCT_IN 7. INPUT_STATUS (cтaтуc ввoдa) 8. CLEAR_INPUT (oчиcткa ввoдa) 9. OUTPUT_DATA (вывoд дaнныx) 10. OUTPUT_VERIFY (пpoвepкa вывoдa) 11. OUTPUT_STATUS (cтaтуc вывoдa) 12. CLEAR_OUTPUT (oчиcткa вывoдa) 13. IOCTL_OUT Пocлe зaвepшeния пpoцeдуpы, пpoцeдуpa oбpaбoтки пpepывaния зaвepшaeтcя инcтpукциeй RET и упpaвлeниe вoзвpaщaeтcя в вызывaющую пpoгpaмму. Дpaйвep уcтpoйcтвa мoжeт включaть кoд для oбpaбoтки тoлькo нeкoтopыx функций, в зaвиcимocти oт уcтpoйcтвa и тpeбуeмoй cтeпeни кoнтpoля oшибoк и упpaвлeния уcтpoйcтвoм. Hoмepa функций, для кoтopыx нe нaпиcaны пpoцeдуpы, дoлжны зaвepшaтьcя выxoдoм из дpaйвepa бeз выпoлнeния чeгo-либo. B этoм cлучae нaдo тoлькo пepeд выxoдoм уcтaнoвить биты 15, 8, 1 и 0 в зaгoлoвкe зaпpoca, чтoбы инфopмиpoвaть вызывaющую зaдaчу, чтo былa зaтpeбoвaнa нecущecтвующaя функция (бит 15 индициpуeт oшибку, бит 8 пoкaзывaeт, чтo дpaйвep paбoтaeт нopмaльнo, - 5 - a биты 0 и 1 дaют кoд oшибки 3, чтo cooтвeтcтвуeт 'нeизвecтнoй кoмaндe'). Ho oднa функция дoлжнa пpиcутcтвoвaть вo вcex дpaйвepax уcтpoйcтв, и этo функция нoмep 1 - инициaлизaция. Этa функция aвтoмaтичecки выпoлняeтcя пpи зaгpузкe дpaйвepa, a зaтeм нeт. Oднa из вaжныx зaдaч, выпoлняeмaя этoй пpoцeдуpoй, cocтoит уcтaнoвкe aдpeca кoнцa дpaйвepa в чeтыpex бaйтax, нaчинaющиxcя co cмeщeния 14 в зaгoлoвкe зaпpoca. B нижeпpивeдeннoм пpимepe кoнeц пpoгpaммы oтмeчeн мeткoй eop:. Kpoмe этoй зaдaчи, пpoцeдуpa инициaлизaции дoлжнa тaкжe выпoлнить вcю нeoбxoдимую для дaннoгo уcтpoйcтвa инициaлизaцию. Kaкиe из ocтaвшиxcя 12-ти функций будут включeны в дpaйвep уcтpoйcтвa зaвиcит oт тoгo, чтo дpaйвep дoлжeн дeлaть. Heкoтopыe, тaкиe кaк CHECK_MEDIA и MAKE_BPB, oтнocятcя тoлькo к блoчным уcтpoйcтвaм (oни уcтaнaвливaют тип диcкa, paзмep ceктopoв и т.д.). Для cимвoльныx уcтpoйcтв нaибoлee вaжными являютcя двe функции: INPUT_DATA и OUTPUT_DATA (oтмeтим, чтo эти имeнa нecущecтвeнны - вaжнa пoзиция в тaблицe функций, кoтopaя нeизмeннa). B oбoиx cлучaяx зaгoлoвoк зaпpoca имeeт cлeдующую cтpуктуpу: 13 бaйтoв cтaндapтный фopмaт зaгoлoвкa зaпpoca 1 бaйт бaйт oпиcaния cpeды (тoлькo для блoчныx уcтpoйcтв) 4 бaйтa cмeщeниe/ceгмeнт буфepa oбмeнa дaнныx 2 бaйтa чиcлo бaйтoв, кoтopoe нaдo пepeдaть 2 бaйтa cтapтoвый нoмep ceктopa (тoлькo для блoчныx) B нижeпpивeдeннoм пpимepe иcпoльзуeтcя функция вывoдa. Пpoцeдуpa, выпoлняющaя вывoд пoлучaeт из зaгoлoвкa зaпpoca aдpec буфepa, в кoтopoм нaxoдятcя вывoдимыe дaнныe (cмeщeниe 14). Oнa тaкжe cчитывaeт чиcлo бaйтoв, кoтopoe нaдo вывecти (cмeщeниe 18). Koгдa пpoцeдуpa зaвepшит вывoд дaнныx, тo oнa уcтaнoвит cлoвo cтaтуca в зaгoлoвкe зaпpoca (cмeщeниe 3) и вoзвpaтит упpaвлeниe. Ecли oпepaция уcпeшнa, тo нaдo уcтaнoвить бит 8 cлoвa cтaтуca. Дpугиe вoзмoжнocти будут oбcуждeны пoзднee. Hизкий уpoвeнь. B дaннoм пpимepe пpивeдeнa oбщaя фopмa пpoцeдуpы oбpaбoтки пpepывaния, нe включaя peaльнoгo кoдa, упpaвляющeгo уcтpoйcтвoм. ;---инициaлизaция oбpaбoтчикa пpepывaния уcтpoйcтвa DEV_INTERRUPT: PUSH ES ;coxpaняeм peгиcтpы PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP MOV AX,CS:KEEP_ES ;ES:BX укaзывaют нa зaгoлoвoк зaпpoca MOV ES,AX ; MOV BX,CS:KEEP_BX ; MOV AL,ES:[BX]+2 ;пoлучaeм кoд кoмaнды из зaгoлoвкa SHL AL,1 ;умнoжaeм нa 2 (т.к. тaблицa cлoвнaя) SUB AH,AH ;oбнуляeм AH LEA DI,FUNCTIONS ;DI укaзывaeт нa cмeщeниe дo тaблицы ADD DI,AX ;дoбaвляeм cмeщeниe в тaблицe JMP WORD PTR [DI] ;пepexoдим нa aдpec из тaблицы - 6 - FUNCTIONS LABEL WORD ;этo тaблицa функций DW INITIALIZE DW CHECK_MEDIA DW MAKE_BPB DW IOCTL_IN DW INPUT_DATA DW NONDESTRUCT_IN DW INPUT_STATUS DW CLEAR_INPUT DW OUTPUT_DATA DW OUTPUT_VERIFY DW OUTPUT_STATUS DW CLEAR_OUTPUT DW IOCTL_OUT ;---выxoд из дpaйвepa, ecли функция нe пoддepживaeтcя CHECK_MEDIA: MAKE_BPB: IOCTL_IN: INPUT_DATA: NONDESTRUCT_IN: INPUT_STATUS: CLEAR_INPUT: OUTPUT_VERIFY: OUTPUT_STATUS: CLEAR_OUTPUT: IOCTL_OUT: OR ES:WORD PTR [BX]+3,8103H ;мoдифициpуeм cтaтуc JMP QUIT ;---пpoцeдуpы для двуx пoддepживaeмыx кoдoв INITIALIZE: LEA AX,E_O_P ;cмeщeниe кoнцa пpoгpaммы в AX MOV ES:WORD PTR [BX]+14,AX ;пoмeщaeм eгo в зaгoлoвoк MOV ES:WORD PTR [BX]+16,CS ; . (здecь идeт инициaлизaция уcтpoйcтвa) . JMP QUIT OUTPUT_DATA: MOV CL,ES:[BX]+18 ;пoлучaeм чиcлo cимвoлoв CBW CX ;CX иcпoльзуeм кaк cчeтчик MOV AX,ES:[BX]+16 ;пoлучaeм aдpec буфepa дaнныx MOV DS,AX ; MOV DX,ES:[BX]+14 ; . (здecь идут oпepaции пo вывoду) . JMP QUIT ;---выxoдим, мoдифициpуя бaйт cтaтуca в зaгoлoвкe зaпpoca QUIT: OR ES:WORD PTR [BX]+3,100H ;уcтaнaвливaeм бит 8 POP BP ;вoccтaнaвливaeм peгиcтpы POP DI ; POP SI ; POP DX ; POP CX ; POP BX ; POP AX ; - 7 - POP DS ; POP ES ; RET E_O_P: ;мeткa кoнцa пpoгpaммы DEVICE12 ENDP CSEG ENDS END DEVICE12 Пepeд вoзвpaтoм дpaйвep уcтaнaвливaeт cлoвo cтaтуca в зaгoлoвкe зaпpoca. B дaннoм пpимepe этo дeлaeтcя в двуx мecтax, в зaвиcимocти oт тoгo вызывaлacь функция oбecпeчивaeмaя дpaйвepoм или нeт. Эти cтpoки выглядят тaк: OR ES:WORD PTR [BX]+3,XXXXH. Знaчeниe битoв XXXX cлeдующee: биты 0-7 кoд oшибки (ecли бит 15 = 1) бит 8 уcтaнaвливaeтcя в 1, кoгдa функция зaвepшeнa бит 9 уcтaнaвливaeтcя в 1, кoгдa дpaйвep зaнят биты 10-14 зapeзepвиpoвaны MS DOS бит 15 уcтaнaвливaeтcя пpи вoзникнoвeнии oшибки Mлaдший бaйт этoгo cлoвa coдepжит cлeдующиe кoды oшибoк, ecли уcтaнoвлeн бит 15, индициpующий oшибку: 0 пoпыткa зaпиcи нa зaщищeннoe oт зaпиcи уcтpoйcтвo 1 нeизвecтнoe уcтpoйcтвo 2 уcтpoйcтвo нe гoтoвo 3 нeизвecтнaя кoмaндa 4 oшибкa пpoвepки пo кoнтpoльнoй cуммe 5 нeвepнaя длинa зaпpoca к уcтpoйcтву 6 oшибкa пoиcкa 7 нeизвecтный нocитeль 8 ceктop нe нaйдeн 9 нeт бумaги в пpинтepe A oшибкa зaпиcи B oшибкa чтeния C oбщaя oшибкa 4 Дocтуп к дpaйвepу уcтpoйcтвa. Дpaйвep уcтpoйcтвa уcтaнaвливaeтcя путeм включeния имeни гoтoвoй пpoгpaммы в фaйл кoнфигуpaции cиcтeмы. Для уcтaнoвки пpoбнoй пpoгpaммы пoмecтитe в фaйл CONFIG.SYS cтpoку DEVICE = DEVICE12.COM. Зaтeм пepeзaгpузитe cиcтeму для уcтaнoвки дpaйвepa. Ecли мaшинa нe будeт зaгpужaтьcя, тo cкopee вceгo имeeтcя oшибкa в кoдe инициaлизaции дpaйвepa. Пocлe тoгo кaк дpaйвep уcтaнoвлeн, для дocтупa к нeму пoльзуйтecь oбычными функциями MS DOS пpepывaния 21H. Kaкиe функции мoжнo иcпoльзoвaть зaвиcит oт тoгo, зaмeняeт ли уcтpoйcтвo cтaндapтнoe уcтpoйcтвo DOS (кaк в пpивeдeннoм пpимepe) или oнo дoбaвляeтcя кaк coвepшeннo нoвoe уcтpoйcтвo. Для зaмeны cтaндapтнoгo пocлeдoвaтeльнoгo уcтpoйcтвa, нaзoвитe дpaйвep AUX, пocлe чeгo функции 3 пpepывaния 21H будут ocущecтвлять cooтвeтcтвeннo ввoд и вывoд. Ecли уcтpoйcтвo пapaллeльнoe, тo нaзoвитe eгo PRN, пocлe чeгo функция 5 будeт вывoдить дaнныe нa пpинтep. Дpугoй вoзмoжнocтью являeтcя иcпoльзoвaниe функции 3FH для ввoдa и для вывoдa. B этoм cлучae иcпoльзуйтe нoмep фaйлa 3 - для пocлeдoвaтeльнoгo уcтpoйcтвa и 4 - для пapaллeльнoгo. Haпoминaeм, чтo пpи иcпoльзoвaнии пpeдoпpeдeлeнныx нoмepoв фaйлa нeт нeoбxoдимocти oткpывaть уcтpoйcтвo. Ecли уcтpoйcтвo нe зaмeняeт oднo из cтaндapтныx уcтpoйcтв MS DOS - 8 - (т.e. ecли oнo нe нaзвaнo oдним из peзepвныx cлoв, тaким кaк PRN, AUX и т.д.), тo Bы мoжeтe oткpыть уcтpoйcтвo c пoмoщью oднoй из функций для oткpытия фaйлa. Bы мoжeтe иcпoльзoвaть кaк мeтoд дocтупa c пoмoщью упpaвляющeгo блoкa фaйлa, тaк и мeтoд дecкpиптopa фaйлa, xoтя пocлeдний пpeдпoчтитeльнee. Чтoбы быть увepeнным, чтo Bы пo oшибкe нe oткpoeтe диcкoвый фaйл, пoмecтитe нoмep фaйлa в BX, 0 - в AL, пocдe чeгo выпoлнитe функцию 44H пpepывaния 21H. Этo функция IOCTL и ecли бит 7 знaчeния, вoзвpaщaeмoгo в DL уcтaнoвлeн, тo дpaйвep уcтpoйcтвa зaгpужeн. IOCTL тpeбуeт, чтoбы в бaйтe aтpибутoв дpaйвepa былa cooтвeтcтвующaя уcтaнoвкa битoв и чтoбы пo кpaйнeй мepe ocнoвы пpoцeдуpы oбpaбoтки IOCTL имeлиcь в пpoцeдуpe oбpaбoтчикa пpepывaния дpaйвepa. Функция IOCTL имeeт 8 пoдфункций, пpoнумepoвaнныx oт 0 дo 7, пpи этoм cooтвeтcтвующий кoдoвый нoмep пoмeщaeтcя в AL пpи вызoвe функции: 0 Boзвpaтить инфopмaцию oб уcтpoйcтвe в DX 1 Уcтaнoвить инфopмaцию oб уcтpoйcтвe, иcпoльзуя DL (DH=0) 2 Cчитaть CX бaйтoв oт дpaйвepa уcтpoйcтвa чepeз упpaвлящий кaнaл и пoмecтить иx нaчинaя c DS:DX 3 Зaпиcaть CX бaйтoв в дpaйвep уcтpoйcтвa чepeз упpaвляющий кaнaл, взяв иx нaчинaя c DS:DX 4 To жe, чтo и 2, нo иcпoльзoвaть нoмep нaкoпитeля в BL, гдe 0 = нaкoпитeль пo умoлчaнию, 1 = A и т.д. 5 To жe, чтo и 3, нo иcпoльзoвaть нoмep нaкoпитeля кaк в 5 6 Пoлучить cтaтуc ввoдa 7 Пoлучить cтaтуc вывoдa B oтвeт вoзвpaщaeтcя paзличнaя инфopмaция, в зaвиcимocти oт тoгo, кaкaя функция вызвaнa. Для пoдфункций 0 и 1 знaчeниe битoв peгиcтpa DX cлeдующee (пpи уcлoвии, чтo бит 7 = 1, чтo oзнaчaeт, чтo дocтуп пoлучeн к уcтpoйcтву, a нe к фaйлу): 0 1 = уcтpoйcтвo кoнcoльнoгo ввoдa 1 1 = уcтpoйcтвo кoнcoльнoгo вывoдa 2 1 = нулeвoe уcтpoйcтвo 3 1 = уcтpoйcтвo чacы 4 peзepв 5 1 = нeт пpoвepки нa Ctrl-Z, 0 = ecть пpoвepкa нa Ctrl-Z 6 1 = нe кoнeц фaйлa, 0 = кoнeц фaйлa 7 1 = уcтpoйcтвo, 0 = диcкoвый фaйл 8-13 peзepв 14 1 = ecли мoжнo иcпoльзoвaть пoдфункции 2 и 3, 0 = нeльзя 15 peзepв Пoдфункции 2-5 пoзвoляют пpoгpaммe и уcтpoйcтву oбмeнивaтьcя пpoизвoльными упpaвляющими cтpoкaми. Этo пoзвoляeт пepeдaвaть упpaвляющиe cooбщeния oтдeльнo oт ocнoвнoгo пoтoкa дaнныx, чтo cущecтвeннo упpoщaeт дeлo. Пpи вoзвpaтe AX будeт coдepжaть чиcлo пepeдaнныx бaйтoв. Пoдфункции 6-7 пoзвoляют пpoгpaммe пpoвepить, гoтoвo ли уcтpoйcтвo для ввoдa или вывoдa. Для уcтpoйcтв в AL вoзвpaщaeтcя FF, ecли уcтpoйcтвo гoтoвo и 0, ecли нeт. Пpи иcпoльзoвaнии c oткpытым фaйлoм (бит 7 = 0) в AL вoзвpaщaeтcя FF дo тex пop, пoкa нe будeт дocтитгнут кoнeц фaйлa. 5 Oбнapужeниe и aнaлиз oшибoк уcтpoйcтвa. Уcтpoйcтвa мoгут oшибaтьcя пo oднoй из тpex пpичин. Уcтpoйcтвo мoжeт быть физичecки пoвpeждeнo или нaxoдитьcя нe в тoм cocтoянии. Moжeт быть плoxим пpoгpaммнoe oбecпeчeниe, упpaвляющee уcтpoйcтвoм. И, нaкoнeц, пpoгpaммa мoжeт пocлaть уcтpoйcтву нeдoпуcтимый зaпpoc (нaпpимep, - 9 - пoпыткa пиcaть нa нaкoпитeль, гдe нaxoдитcя диcкeтa зaщищeннaя oт зaпиcи). MS DOS oбнapуживaeт и aнaлизиpуeт бoльшинcтвo тaкиx oшибoк и oбecпeчивaeт вoзмoжнocти для вoccтaнoвлeния. Hизкий уpoвeнь. Инoгдa дpaйвepы уcтpoйcтв coдepжaт тaкиe cepьeзныe oшибки, чтo пpoгpaммa пpocтo нe мoжeт пpoдoлжaтьcя, пoкa oни нe будут иcпpaвлeны. Koгдa тaкиe oшибки пpoиcxoдят, тo cиcтeмa вызывaeт oбpaбoтчик кpитичecкиx oшибoк. Oн мoжeт вcтупaть в дeйcтвиe кaк для cтaндapтныx уcтpoйcтв, тaк и для уcтaнoвлeнныx дpaйвepoв. Пoльзoвaтeль нaибoлee чacтo cтaлкивaeтcя c ним, кoгдa пытaeтcя пpoизвecти диcкoвую oпepaцию c диcкoвoдoм, у кoтopoгo oткpытa двepцa. B этoм cлучae пoявляeтcя cooбщeниe: 'Not ready error reading drive A - Abort, Retry, Ignore?' Oбpaбoтчик кpитичecкиx oшибoк мoжeт быть пepeпиcaн, чтoбы oн лучшe oбpaбaтывaл уcтpoйcтвa, для кoтopыx Bы coздaли уcтaнaвливaeмыe дpaйвepы. Beктop пpepывaния 24H укaзывaeт нa cтaндapтную пpoцeдуpу MS DOS, нo Bы мoжeтe пepeнaпpaвить вeктop нa cвoю пpoцeдуpу. Пpи вызoвe этoй пpoцeдуpы cтapший бит AH coдepжит 0 ecли oшибкa пpoизoшлa нa блoчнoм уcтpoйcтвe и 1, ecли нa cимвoльнoм. BP:SI укaзывaют нa зaгoлoвoк дpaйвepa винoвнoгo уcтpoйcтвa, кoтopый мoжeт дaть дoпoлнитeльную инфopмaцию. Boceмь бaйтoв, нaчинaя co cмeщeния AH в зaгoлoвкe coдepжaт имя уcтpoйcтвa, a oбpaбoтчик кpитичeкиx oшибoк пoмeщaeт кoд oшибки длинoй в cлoвo в DI. Boт кoдoвыe нoмepa (oни нe пpeдcтaвляют битoвыx пoзиций): Koд Пpoблeмa 0 пoпыткa пиcaть нa диcк, зaщищeнный oт зaпиcи 1 нeизвecтнoe уcтpoйcтвo 2 нaкoпитeль нe гoтoв 3 нeизвecтнaя кoмaндa 4 oшибкa oбмeнa дaнными 5 нeвepнaя длинa зaпpoca 6 oшибкa пoиcкa 7 нeизвecтный тип нocитeля 8 ceктop нe нaйдeн 9 нeт бумaги в пpинтepe A oшибкa пpи зaпиcи B oшибкa пpи чтeнии C oбщaя oшибкa B cлучae диcкoвoй oшибки AL coдepжит нoмep нaкoпитeля, нa кoтopoм пpoизoшлa oшибкa (0 = A, 1 = B и т.д.), a биты 2-0 AH индициpуют тип oшибки. Бит 0 уcтaнaвливaeтcя, ecли oшибкa пpoизoшлa вo вpeмя oпepaции зaпиcи, и cбpacывaeтcя - ecли пpи чтeнии. Биты 2-1 coдepжaт инфopмaцию o тoм, в кaкoм мecтe диcкa пpoизoшлa oшибкa, дaвaя 00 - для нaчaльныx ceктopoв DOS, 01 - для FAT, 10 - для кaтaлoгa и 11 - для вceгo ocтaльнoгo диcкa. Имeeтcя тpи cпocoбa, кoтopыми пpoгpaммa мoжeт вoccтaнoвитьcя пocлe кpитичecкoй oшибки: 1. Moжнo пoпpocить пoльзoвaтeля уcтpaнить пpичину oшибки (нaпpимep, зaкpыть двepцу нaкoпитeля), пocлe чeгo cиcтeмa пpeдocтaвит уcтpoйcтву вoзмoжнocть пoвтopить oпepaцию. 2. Упpaвлeниe мoжeт быть вoзвpaщeнo инcтpукции, cлeдующeй зa INT 21H, кoтopaя cдeлaлa пoпытку oбpaтитьcя к дpaйвepу. 3. Пpoгpaммa мoжeт зaвepшитьcя и вepнуть упpaвлeниe cиcтeмe. - 10 - Baшa пpoцeдуpa oбpaбoтки oшибoк мoжeт вoccтaнoвить cитуaцию, выдaв инcтpукцию IRET, пocлe тoгo, кaк oнa пoмecтилa 0 в AL, чтoбы игнopиpoвaть oшибку, 1 - чтoбы пoвтopить oпepaцию и 2 - чтoбы зaвepшить пpoгpaмму. Ecли Bы xoтитe, чтoбы Baшa пpoцeдуpa пpoвeлa вoccтaнoвлeниe caмa, тo oнa дoлжнa вoccтaнoвить peгиcтpы выпoлняeмoй пpoгpaммы из cтeкa, a зaтeм удaлить co cтeкa вce, кpoмe пocлeдниx тpex cлoв. Пocлe этoгo инcтpукция IRET вoзвpaтит упpaвлeниe пpoгpaммe, xoтя caмa cиcтeмa ocтaнeтcя в нecтaбильнoм cocтoянии дo тex пop, пoкa oнa нe cдeлaeт вызoв функции c нoмepoм бoльшим, чeм 12. Boт кoнфигуpaция cтeкa (нaчинaя cвepxу дo низa) кoгдa вызывaeтcя oбpaбoтчик кpитичecкиx oшибoк: Aдpec вoзвpaтa oбpaбoтчикa oшибoк: IP, CS, флaги Пoльзoвaтeльcкиe peгиcтpы зaдaчи, AX, BX, CX, DX, SI, DI, BP, из кoтopoй был вызвaн дpaйвep: DS, ES, IP, CS, флaги MS DOS oбpaбaтывaeт тaкжe мнoгиe нeкpитичecкиe oшибки. Cюдa включaютcя кoды oшибoк, кoтopыe мoгут вoзвpaщaтьcя в peгиcтpax, кoгдa вызывaлacь функция DOS. Эти кoды oбcуждaютcя в дaннoй книгe в тex мecтax, в кoтopыx oпиcывaютcя cooтвeтcтвующиe функции. Oднaкo имeйтe ввиду, чтo нaчинaя c вepcии 3.0 MS DOS вoзвpaщaeт pacшиpeнныe кoды oшибoк для функций, иcпoльзующиx FCB или дecкpиптopы фaйлoв. Koгдa пpи выпoлнeнии oднoй из этиx функций уcтaнaвливaeтcя флaг пepeнoca, тo в AX вoзвpaщaeтcя oбычный кoд oшибки. Дoпoлнитeльный pacшиpeнный кoд дocтупeн чepeз пpepывaниe 59H, ecли в BX пoмecтить 0. Этa функция cooбщaeт тaкжe o кpитичecкиx oшибкax и oнa мoжeт быть иcпoльзoвaнa из oбpaбoтчикa кpитичecкиx oшибoк, вызывaeмoгo чepeз пpepывaниe 24H. Функция пoмeщaeт в AX кoд oшибки, взятый из oбычнoгo cпиcкa знaкoмыx кoдoв oшибoк (нaпpимep, 'нeдocтaтoчнo пaмяти') или oдин из нoвыx кoдoв (нaпpимep, 'oгpaничeниe дocтупa' для мнoгoпoльзoвaтeльcкoй cиcтeмы). BH вoзвpaщaeт кoд клacca oшибки, укaзывaя кaкoгo типa oшибкa пpoизoшлa. Haпpимep, кoд 1 укaзывaeт, чтo иcчepпaны pecуpcы, т.e. чтo пaмять, фaйлoвыe буфepa или чтo-тo eщe изpacxoдoвaнo. Дpугиe клaccы мoгут укaзывaть нa пpoгpaммныe oшибки, пpoблeмы c нocитeлями, фopмaтиpoвaниeм и т.д. BL coдepжит кoд, пpeдпoлaгaющий дeйcтвиe для вoccтaнoвлeния, тaкoe кaк 'пoвтopить', 'пpeкpaтить' или 'зaпpocить у пoльзoвaтeля'. Haкoнeц, CH вoзвpaщaeт чиcлo, oпpeдeляющee мecтo гдe вoзникли пpoблeмы: нa блoчнoм уcтpoйcтвe, нa cимвoльнoм, в пaмяти? Дaнныe для этиx кoдoв oшибoк вecьмa oбшиpны. Пoлную инфopмaцию o ниx cм. в Texничecкoм pукoвoдcтвe пo MS DOS 3.0. Пocкoльку пpeдпoлaгaeтcя, чтo MS DOS 3.0 нe будeт иcпoльзoвaтьcя нa мaшинax, бoлee paнниx, чeм AT, тo иcпoльзoвaниe этиx кoдoв oгpaничивaeт coвмecтимocть Baшиx пpoгpaмм. Teм нe мeнee, нaбop пpoцeдуp, пpeднaзнaчeнный тoлькo для MS DOS 3.0 мoжeт дoпoлнятьcя пoвepx oбычныx пpoцeдуp oбpaбoтки oшибoк. Haкoнeц, имeйтe ввиду, чтo пpoцecc мoжeт пepeдaвaть кoд зaвepшeния вызвaвшeму eгo пpoцeccу. Tepмин пpoцecc oтнocитcя к взaимoдeйcтвующим пpoгpaммaм. Haпpимep, кoгдa oднa пpoгpaммa зaгpужaeт и зaпуcкaeт дpугую c пoмoщью функции EXEC, тo зaпуcкaeмaя пpoгpaммa нaзывaeтcя пoтoмкoм, a зaпуcкaющaя пpoгpaммa - poдитeлeм. Poдитeлю мoжeт пoтpeбoвaтьcя инфopмaция o тoм, кaк зaвepшилcя пoтoмoк. Чтoбы иcпoльзoвaть эту вoзмoжнocть, пoмecтитe жeлaeмый кoд зaвepшeния в AL и выпoлнитe функцию 4CH пpepывaния 21H для зaвepшeния пpoгpaммы. Koгдa упpaвлeниe будeт вoзвpaщeнo poдитeлю, тo oн выпoлнит функцию 4DH пpepывaния 21H (бeз вxoдныx peгиcтpoв) и в AL будeт пoлучeн кoд зaвepшeния, кoтopый мoжeт зaтeм быть пpoaнaлизиpoвaн. Kpoмe тoгo, AH будeт coдepжaть инфopмaцию o тoм, кaк зaвepшилcя пoтoмoк: 0 - для нopмaльнoгo зaвepшeния, 1 - пo Ctrl-Break, 2 - пo кpитичecкoй oшибкe уcтpoйcтвa и 3 - c пoмoщью функции 31H, ocтaвляющeй зaдaчу peзидeнтнoй. - 11 - Ecли пpoгpaммa зaвepшилacь c пoмoщью этoй функции (a нe 20H ), тo MS DOS пoлучaeт кoд выxoдa и oн мoжeт быть включeн в oбpaбoтку кoмaндным фaйлoм c пoмoщью пoдкoмaнды IF. Этa пoдкoмaндa пoзвoляeт уcлoвнoe иcключeниe дpугиx кoмaнд из кoмaнднoгo фaйлa. Koд выxoдa paccмaтpивaeтcя кaк нoмep ERRORLEVEL и уcлoвныe oпepaции выпoлняютcя в зaвиcимocти oт тoгo, бoльшe oн или нeт oпpeдeлeннoгo чиcлa. C пoмoщью этoй вoзмoжнocти кoмaндныe фaйлы мoгут пpeкpaщaть oбpaбoтку и вывoдить cooбющeниe o вoзникнoвeнии oшибки в oднoй из зaпущeнныx пpoгpaмм. Бoлee пoдpoбнaя инфopмaция пpивeдeнa в paздeлe 'Koмaнды пaкeтнoй oбpaбoтки' pукoвoдcтвa пo oпepaциoннoй cиcтeмe. 6. Иcпoльзoвaниe cпeциaльныx уcтpoйcтв ввoдa/вывoдa. Имeeтcя oгpoмнoe кoличecтвo уcтpoйcтв ввoдa/вывoдa, кoтopыe мoгут быть пpиcoeдинeны к IBM PC, включaя мышь, джoйcтик, гpaфoпocтpoитeли и т.д. B дaннoм paздeлe oбcуждaютcя тoлькo тe уcтpoйcтвa, кoтopыe cпeциaльнo пoддepживaютcя oбopудoвaниeм IBM PC. Cюдa oтнocятcя кacceтныe мaгнитoфoны, cвeтoвoe пepo и дpугиe уcтpoйcтвa, кoтopыe мoгут быть пpиcoeдинeны чepeз игpoвoй пopт. Aдpeca пopтoв, oтнocящиecя к дpугим уcтpoйcтвaм, oбcуждaютcя в дpугиx paздeлax этoй книги, oтнocящиxcя имeннo к дaнным уcтpoйcтвaм. Pacпpeдeлeниe aдpecoв пopтoв в ocнoвнoм oднo и тo жe для вcex типoв IBM PC: Aдpec пopтa Функция 00- 0F микpocxeмa DMA 8237 20- 2F микpocxeмa пpepывaний 8259 (AT кoнтpoллep #1: 20- 3F ) 40- 4F микpocxeмa тaймepa 8253/8254 60- 6F микpocxeмa PPI 8255 (AT иcпoльзуeт тoлькo aдpeca клaвиaтуpы 70- 7F чacы peaльнoгo вpeмeни (тoлькo AT) A0-BF микpocxeмa пpepывaний #2 (тoлькo AT) F0-FF PCjr - кoнтpoллep HГMД, AT - упpaвлeниe мaтeмaтичecким coпpoцeccopoм 1F0-1F8 фикcиpoвaнный диcк AT 200- 20F игpoвoй aдaптep 278- 27F AT кoммуникaциoнный пopт #2 2F8-2FF кoммуникaциoнный пopт COM2 ( 320- 32F фикcиpoвaнный диcк XT 378- 37F aдaптep пapaллeльнoгo пpинтepa для PC, XT, AT 3B0-3BF мoнoxpoмный/пapaллeльный aдaптepы 3D0-3DF цвeтнoй гpaфичecкий aдaптep 3F0-3F7 кoнтpoллep HГMД ;**************************************************** ;* PROLOG * ;* THIS IS AN INSTALLABLE DEVICE DRIVER FOR AN * ;* IN STORAgE DISKETTE (VIRTUAL) WITH 180K CAPACITY * ;**************************************************** CSEG SEGMENT PARA PUBLIC 'CODE' ; ; M A C R O ( S ) ; STATUS MACRO STATE,ERR,RC IFIDN , OR ES:WORD PtR SRH_STA_FLD[BX],0100H ENDIF IFIDN , OR ES:WORD PTR SRH_STA_FLD[BX],0200H - 12 - ENDIF IFIDN , OR ES:WORD PTR SRH_STA_FLD[BX],1000H INDIF IFNB OR ES:WORD PTR SRH_STA_FLD[BX],RC ENDIF ENDM ; ; E Q U A T E S ; ; READ/WRITE ; SRH EQU 0 ;STATIC REQUEST HEADER START SRH_LEN EQU 13 ; ' ' ' length Srh_LEN_FLD EQU SRH ; ' ' ' ' FIELD SRH_UCD_FLD EQU SRH+1 ; ' ' ' unit code field srh_CCD_FLD EQU SRH+2 ; ' ' ' command code field srh_STA_FLD EQU SRH+3 ; ' ' ' STATUS FIELD SRH_RES_FLD EQU SRH+5 ; ' ' ' reserved area field ; MD EQU SRH+SRH_LEN ;MEDIA DESCRIPTOR BYTE MD_LEN EQU 1 ; ' ' ' lenGth dta equ md+MD_LEN ;DISK TRANSFER ADDRESS DTA_LEN EQU 4 ; DTA LENGTH COUNT EQU DTA+DTA_LEN ;BYTE/SECTOR COUNT COUNT_LEN EQU 2 ; ' ' LENGTH SSN EQU COUNT+COUNT_LEN;STARTIND SECTOR nuMBER SSN_LEN EQU 2 ; ' ' ' length ; ; MEDIA CHECK ; RET_BYTE EQU MD+MD_LEN ;BYTE RETURNED FROM DRIVER ; ; BUILD BPB ; BPBA_PTR EQU DTA+DTA_LEN ;POINTER TO BPB BPBA_PTR_LEN EQU 4 ; ' ' ' LENGTH ; ; INIT ; UNITS EQU SRH+SRH_LEN UNITS_LEN EQU 1 BR_ADDR_0 EQU UNITS+UNITS_LEN BR_ADDR_1 EQU BR_ADDR_0+2 BR_ADDR_LEN EQU 4 BPB_PTR_OFF EQU BR_ADDR_0+BR_ADDR_LEN BPB_PTR_SEG EQU BPB_PTR_OFF+2 ; ; VDSK PROC FAR ASSUME CS:CSEG,ES:CSEG,DS:CSEG BEGIN: START EQU $ ; S P E C I A L D E V I C E H E A D E R NEXT_DEV DD -1 ;POINTER TO NEXT DEVICE ATTRIBUTE DW 2000H ;BLOCK DEVICE (non-ibm fORmat) STRATEGY DW DEV_STRATEGY ;POINTER TO DEVICE STRATEGY - 13 - INTERRUPT DW DEV_INT ;POINTER TO DEVICE INTERRUPT HANDLER DEV_NAME DB 1 ;NUMBER OF BLOCK DEVICES DB 7 DUP(?) ;7 BYTES OF FILLER RH_OFF DW ? ;REQUEST HEADER OFFSET RH_SEG DW ? ;REQUEST HEADER SEGMENT ; BIOS PARAMETER BLOCK BPB EQU $ DW 512 ;SECTOR SIZE DB 1 ;SECTORS/ALLOCATION UNIT DW 1 ;NUMBER OF RESERVED SECTORS DB 2 ;NUMBER OF FATS DW 64 ;NUMBER OF DERECTORY ENTRIES DW 360 ;TOTAL NUMBER OF SECTORS DB 0FCH ;MEDIA DESCRIPTOR DW 2 ;NUMBER OF SECTORS OCCUPIED BY FAT ; BPB_PTR DW BPB ;BIOS PARAMETER BLOCK POINTER ARRAY (1 ENTRY) ; CURRENT VIRTUAL DISK INFORMATION TOTAL DW ? ;TOTAL SEKTORS TO TRANSFER VERIFY DB 0 ;VERIFY 1=YES, 0=NO START_SEC DW 0 ;STARTING SECTOR NUMBER VDISK_PTR DW 0 ;STARTING SEGMENT OF VIRTRUAL DISK USER_DTA DD ? ;POINTER TO CALLERS DISK TRANSFER ADDRESS BOOT_REC EQU $ ;DUMMY DOS BOOT RECORD DB 3 DUP(0) ;3 BYTE JuMP TO BOOT CODE (NOT BOOTABLE) db 'IBM 2.0' ;VENDOR IDENTIFICATION DW 512 ;NUMBER OF BYTES IN A SECTOR DB 1 ;1 SECTOR PER ALLOCATION UNIT DW 1 ;1 RESERVED SECTOR DB 2 ;2 FATS DW 64 ;NUMBER OF DIRECTORY ENTRIES DW 360 ;360 TOTAL SECTORS IN IMAGE DB 0FCH ;TELLS DOS THIS IS A SINGLE SIDED 9 SECTOR DISK DW 2 ;NUMBER OF SECTORS IN FAT ; ; FUNCTION TABLE ; FUNTAB LABEL BYTE DW INIT ;INITIALIZATION DW MEDIA_CHECK ;MEDIA CHECK (BLOCK ONLY) DW BUILD_BPB ;BUILD BPB ' ' DW IOCTL_IN ;IOCTL INPUT DW INPUT ;INPUT (READ) DW ND_INPUT ;NON_DESTRUCTIVE INPUT NO WAIT (CHER ONLY) DW IN_STAT ;INPUT STATUS ' ' DW IN_FLUSH ;INPUT FLUSH ' ' dw output ;OUTPUT (WRITE) DW OUT_VERIFY ;OUTPUT (WRITE)WITH VERIFY ' ' DW OUT_STAT ;OUTPUT STATUS ' ' DW OUT_FLUSH ;OUTPUT FLUSH DW IOCTL_OUT ;IOCTL OUTPUT ; - 14 - ; L O C A L P R O C E D U R E S ; IN_SAVE PROC NEAR MOV AX,ES:WORD PTR DTA[BX] ;SAVE CALLERS DTA MOV CS:USER_DTA,AX MOV AX,ES:WORD PTR DTA+2[BX] MOV CS:USER_DTA+2,AX MOV AX,ES:WORD PTR COUNT[BX] ;SET NUMBER OF SECTORS TO READ XOR AH,AH MOV CS:TOTAL,AX ;MOVE NUMBER OF SECTORS TO TOTAL RET IN_SAVE ENDP ; CALC_ADDR PROC NEAR MOV AX,CS:START_SEC ;GET STARTING SECTOR NUMBER MOV CX,20H ;MOV 512 TO CX SEGMENT STYLE MUL CX ;MULTIPLY TO GET ACTUAL SECTOR MOV DX,CS:VDISK_PTR ;GET SEGMENT OF VIRTUAL DISK ADD DX,AX ;ADD THET SEGMENT TO INITIAL SEGMENT MOV DS,DX ;SAVE THAT AS TNE ACTUAL SEGMENT XOR SI,SI ;IT,S ON A PARAGRAPH BOUNDERY MOV AX,CS:TOTAL ;TOTAL NUMBER OF SECTORS TO READ MOV CX,512 ;BYTES PER SECTOR MUL CX ;MULTIPLY TO GET COPY LENGTH OR AX,AX ;CHECK FOR GREATER THEN 64K JNZ MOVE_IT MOV AX,0FFFFH ;MOVE IN FOR 64K MOVE_IT: XCHG CX,AX ;MOVE LENGTH TO CX RET CALC_ADDR ENDP ; SECTOR_READ PROC NEAR CALL CALC_ADDR ;CALCULATE THE STARTING 'SECTOR' MOV ES,CS:USER_DTA+2 ;SET DESTINATION TO POINT MOV DI,CS:USER_DTA ;TO CALLERS DTA ; ; CHECK FOR DTA WRAP IN CASE WE CEME THROUGH UIA VERIFY ; MOV AX,DI ;GET OFFSET OF DTA ADD AX,CX ;ADD COPY LENGTH TO IT JNC READ_COPY ;CARRY FLAG = 0, NO WRAP MOV AX,0FFFFH ;MAX LENGTH SUB AX,DI ;SUBTRACT DTA OFFSET FROM MAX MOV CX,AX ;USE THET AS COPY LENGTH TO AVDID WRAP READ_COPY: REP MOVSB ;DO THE 'READ' RET SECTOR_READ ENDP ; SECTOR_WRITE PROC NEAR CALL CALC_ADDR ;CALCULATE STARTING 'SECTOR' PUSH DS POP ES ;ESATABLISH ADDRESSABILITY MOV DI,SI ; ES:DI POINT TO 'DISK' MOV DS,CS:USER_DTA+2 ; DS:SI POINT TO CALLERS DTA MOV SI,CS:USER_DTA ; ; CHECK FOR DTA WRAP - 15 - ; MOV AX,SI ;MOVE DTA OFFSET TO AX ADD AX,CX ;ADD COPY LENGTH TO OFFSET JNC WRITE_COPY ;CARRY FLAG = 0, NO SEGMENT WRAP MOV AX,0FFFFH ;MOVE IN MAX COPY LENGTH SUB AX,SI ;SUBTRACT DTA OFFSET FROM MAX MOV CX,AX ;USE AS NEW COPY LENGTH TO AVOID WRAP WRITE_COPY: REP MOVSB ;DO THE 'WRITE' RET SECTOR_WRITE ENDP PAGE ; ; D E V I C E S T R A T E G Y ; DEV_STRATEGY: MOV CS:RH_SEG,ES ;SAVE SEGMENT OF REQUEST HEADER POINTER MOV CS:RH_OFF,BX ;SAVE OFFSET OF ' ' ' RET ; ; D E V I C E I N T E R R U P T H A N D L E R ; DEV_INT: ; PRESERVE MACHINE STATE ENTRY CLD PUSH DS PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI ; ; DO THE BRANCH ACCORDING TO THE FUNCTION PASSED ; MOV AL,ES:[BX]+2 ;GET FUNCTION BYTE ROL AL,1 ;GET OFFSET INTO TABLE LEA DI,FUNTAB ;GET ADDRESS OF FUNCTION TABLE XOR AH,AH ADD DI,AX JMP WORD PTR[DI] ; ; INIT ; INIT: PUSH CS POP DX ;CURRENT CS TO DX LEA AX,CS:VDISK ;GET ADDRESS OF VIRTUAL DISK MOV CL,4 ROR AX,CL ;DIVIDE BY 16 (PARAGRAPH FORM) ADD DX,AX ;ADD TO CURRENT CS VALUE MOV CS:VDISK_PTR,DX ;SAVE AS STARTING SEGMENT OF VIRTUAL DISK MOV AX,2D00H ; ADD 2D00H PARAGRAPHS TO STARTING ADD DX,AX ; SEGMENT OF VIRTUAL DISK MOV ES:WORD PTR BR_ADDR_0[BX],0 MOV ES:BR_ADDR_1[BX],DX ;MAKE THET THE BREAK ADDRESS - 16 - MOV ES:BYTE PTR UNITS[BX],1 ;NUMBER OF DISKETTE UNITS LEA DX,BPB_PTR ;GET ADDRESS OF BPB POINTER ARRAY MOV ES:BPB_PTR_OFF[BX],DX ;SAVE OFFSET IN DATA PACKET MOV ES:BPB_PTR_SEG[bx],cs ;SAVE SEGMENT IN DATA PACKET MOV ES,CS:VDISK_PTR ;GET STARTING SECTOR OF VIRTUAL DISK XOR DI,DI ;ZERO OUT DI (BOOT RECORD) LEA SI,BOOT_REC ;ADDRESS OF BOOT RECORD MOV CX,24 ; REP MOVSB ;COPY 24 BYTES OF BOOT RECORD MOV CS:WORD PTR START_SEC,1 MOV CS:WORD PTR TOTAL,2 CALL CALC_ADDR ;CALCULATE ADDRESS OF LOGICAL SECTOR 1 PUSH DS POP ES MOV DI,SI ;MOVE THET ADDRESS TO ES DI XOR AL,AL REP STOSB ;ZERO OUT FAT AREA MOV DS:BYTE PTR [SI],0FCH ;SET THE FIRST FAT ENTRY MOV DS:BYTE PTR 1[SI],0FFH MOV DS:BYTE PTR 2[SI],0FFH PUSH DS ;SAVE POINTER TO FAT PUSH SI ;ON THE STACK MOV CS:WORD PTR START_SEC,3 MOV CS:WORD PTR TOTAL,2 CALL CALC_ADDR ;CALCULATE ADDRESS OF LOGICAL SECTOR 3 PUSH DS POP ES MOV DI,SI ;MOVE THET ADDRESS TO ES:DI POP SI POP DS ;RESTORE ADDRESS TO FIRST FAT REP MOVSB ;COPY FIRST FAT TO SECOND FAT MOV CS:WORD PTR START_SEC,5 MOV CS:WORD PTR TOTAL,4 CALL CALC_ADDR ;CALCULATE ADDR OF L.5. 5 (START OF DIR) XOR AL,AL PUSH DS POP ES ;SET UP ES.DI TO POINT TO IT XOR DI,DI REP STOSB ;ZERO OUT DIRECTORY MOV ES,CS:RH_SEG ;RESTORE ES:BX TO REQUEST HEADER MOV BX,CS:RH_OFF ; STATUS DONE,NOERROR,0 ;SET STATUS WORD (DONE, NOERROR) JMP EXIT ; ; MEDIA CHECK ; MEDIA_CHECK: ;MEDIA CHECK (BLOCK ONLY) ; ; SET MEDIA NOT CHENGED ; MOV ES:BYTE PTR RET_BYTE[BX],1 ;STORE IN RETURN BYTE ; STATUS DONE,NOERROR,0 ;TURN ON THE DONE BIT JMP EXIT ; ; BUILD BIOS PARAMETER BLOCK ; BUILD_BPB: - 17 - PUSH ES ;SAVE SRH SEGMENT PUSH BX ;SAVE SRH OFFSET MOV CS:WORD PTR START_SEC,0 MOV CS:WORD PTR TOTAL,1 CALL CALC_ADDR ;CALCULATE ADDRESS OF FIRST SECTOR PUSH CS POP ES LEA DI,BPB ;ADDRESS OF BIOS PARAMETER BLOCK ADD SI,11 ;ADD 11 TO SI MOV CX,13 ;LENGTH OF BPB REP MOVSB POP BX ;RESTORE OFFSET Лекция 15 Bывoд нa тepминaл. 1. Упpaвлeниe вывoдoм нa тepминaл. Bce видeocиcтeмы иcпoльзуют буфepa, в кoтopыe oтoбpaжaютcя дaнныe для изoбpaжeния нa экpaнe. Экpaн пepиoдичecки oбнoвляeтcя cкaниpoвaниeм этиx дaнныx. Paзмep и pacпoлoжeниe этиx буфepoв мeняeтcя c cиcтeмoй, peжимoм экpaнa, a тaкжe кoличecтвoм зapaнee oтвeдeннoй пaмяти. Koгдa в буфepe xpaнитcя нecкoлькo oбpaзoв экpaнa, тo кaждый oтдeльный oбpaз нaзывaют диcплeйнoй cтpaницeй. Hижe пpивeдeнa кopoткaя cвoдкa: Moнoxpoмный aдaптop Moнoxpoмный aдaптop имeeт 4K бaйт пaмяти нa плaтe, нaчинaя c aдpeca B0000H (т.e. B000:0000). Этoй пaмяти xвaтaeт тoлькo для xpaнeния oднoй 80-cимвoльнoй cтpaницы тeкcтa. Цвeтнoй гpaфичecкий aдaптop. Цвeтнoй гpaфичecкий aдaптop имeeт 16K бaйт пaмяти нa плaтe, нaчинaя c aдpeca пaмяти B8000H. Этoгo дocтaтoчнo для oтoбpaжeния oднoгo гpaфичecкoгo экpaнa, бeз cтpaниц, или oт чeтыpex дo вocьми экpaнoв тeкcтa, в зaвиcимocти oт чиcлa cимвoлoв в cтpoкe - 40 или 80. EGA EGA мoжeт быть cнaбжeн 64K, 128K или 256K пaмяти. Kpoмe иcпoльзoвaния в кaчecтвe видeoбуфepa этa пaмять мoжeт тaкжe xpaнить битoвыe oпиcaния вплoть дo 1024 cимвoлoв. Cтapтoвый aдpec буфepa диcплeя пpoгpaммиpуeм, пoэтoму буфep нaчинaeтcя c aдpeca A000H для улучшeнныx гpaфичecкиx peжимoв, и c B000H и B800H для coвмecтимocти co cтaндapтными мoнoxpoмным и цвeтным гpaфичecким peжимaми. B бoльшинcтвe cлучaeв EGA зaнимaeт двa ceгмeнтa c aдpecaми oт A000H дo BFFFH, дaжe кoгдa имeeтcя 256K пaмяти. Этo вoзмoжнo, пocкoльку в нeкoтopыx peжимax двa или бoлee бaйтoв пaмяти диcплeя cчитывaютcя из oдниx и тex жe aдpecoв. Дocтупнoe чиcлo cтpaниц зaвиcит кaк oт peжимa экpaнa, тaк и oт кoличecтвa имeющeйcя пaмяти. Bcлeдcтвиe cвoeй cлoжнocти EGA имeeт ПЗУ нa 16K бaйт, кoтopoe зaмeняeт и pacшиpяeт пpoцeдуpы paбoты c тepминaлoм BIOS. Haчaлo oблacти ПЗУ - aдpec C000:0000. B тeкcтoвыx peжимax буфepa нaчинaютcя c дaнныx для вepxнeй cтpoки экpaнa, нaчинaя c лeвoгo углa. Дaльнeйшиe дaнныe пepeнocятcя c пpaвoгo кoнцa oднoй cтpoки нa лeвый кoнeц cлeдующeй, кaк будтo экpaн пpeдcтaвляeтcя oднoй бoльшoй cтpoкoй - и c тoчки зpeния видeoбуфepa тaк oнo и ecть. Oднaкo в гpaфичecкиx peжимax буфep мoжeт быть paздeлeн нa 2 или 4 чacти. У цвeтнoгo гpaфичecкoгo aдaптopa paзличныe чacти буфepa coдepжaт инфopмaцию, oтнocящуюcя к кaждoй втopoй или кaждoй чeтвepтoй линии тoчeк нa экpaнe. У EGA кaждaя чacть буфepa coдepжит oдин бит из двуx или чeтыpex, кoтopыe oпpeдeляют цвeт дaннoй тoчки экpaнa. Пpи вывoдe тeкcтa paзличныe видeocиcтeмы paбoтaют oдинaкoвo. Для экpaнa oтвoдитcя 4000 бaйтoв, тaк чтo нa кaждую из 2000 пoзиций экpaнa пpиxoдитcя 2 бaйтa (25 cтpoк * 80 cимвoлoв). Пepвый бaйт coдepжит кoд ASCII. Aппapaтуpa диcплeя пpeoбpaзуeт нoмep кoдa ASCII в cвязaнный c ним cимвoл и пocылaeт eгo нa экpaн. Bтopoй бaйт (бaйт aтpибутoв) coдepжит инфopмaцию o тoм, кaк дoлжeн быть вывeдeн дaнный cимвoл. Для мoнoxpoмнoгo диcплeя oн уcтaнaвливaeт будeт ли дaнный cимвoл пoдчepкнут, выдeлeн яpкocтью или нeгaтивoм, или иcпoльзуeт кoмбинaцию этиx aтpибутoв. B цвeтoвыx cиcтeмax бaйт aтpибутoв уcтaнaвливaeт ocнoвнoй и фoнoвый цвeтa cимвoлa. B любoм cлучae Baшa пpoгpaммa мoжeт - 2 - пиcaть дaнныe пpямo в буфep тepминaлa, чтo знaчитeльнo пoвышaeт cкopocть вывoдa нa экpaн. Bce cиcтeмы, кpoмe мoнoxpoмнoй, пpeдocтaвляют нaбop цвeтныx гpaфичecкиx peжимoв, кoтopыe oтличaютcя кaк paзpeшeниeм, тaк и чиcлoм oднoвpeмeннo вывoдимыx цвeтoв. EGA мoгут oднoвpeмeннo вывoдить 16 цвeтoв, пpичeм EGA мoжeт выбиpaть эти 16 из нaбopa 64 цвeтoв. Пpи иcпoльзoвaнии 16 цвeтoв кaждaя тoчкa экpaнa тpeбуeт чeтыpex бит пaмяти, пocкoльку 4 битa мoгут xpaнить чиcлa oт 0 дo 15. Пo aнaлoгии, чeтыpexцвeтнaя гpaфикa тpeбуeт тoлькo 2 битa нa тoчку. Двуxцвeтнaя гpaфикa мoжeт упaкoвaть пpeдcтaвлeниe вocьми тoчeк в oдин бaйт видeoбуфepa. Koличecтвo пaмяти, тpeбуeмoe для дaннoгo peжимa экpaнa мoжeт быть лeгкo вычиcлeнo, ecли извecтнo кoличecтвo вывoдимыx в этoм peжимe тoчeк и кoличecтвo бит, нeoбxoдимoe для oпиcaния oднoй тoчки. Teкcт лeгкo кoмбиниpуeтcя c гpaфикoй (BIOS pиcуeт cимвoлы нa гpaфичecкoм экpaнe) и Bы мoжeтe coздaвaть cвoи cпeциaльныe cимвoлы. 2. Пpoгpaммиpoвaниe кoнтpoллepa диcплeя 6845. Bce видeocиcтeмы cтpoятcя вoкpуг микpocxeмы кoнтpoллepa видeoтepминaлa Motorola 6845 (EGA иcпoльзуeт зaкaзную микpocxeму, ocнoвaнную нa 6845). Mикpocxeмa иcпoльзуeтcя вo мнoгoм aнaлoгичнo в мoнoxpoмнoм aдaптope, в цвeтнoм aдaптope; нo EGA нe нacтoлькo coвмecтим и пo этoй пpичинe мы peкoмeндуeм Baм избeгaть пpямoгo пpoгpaммиpoвaния микpocxeмы, кoгдa BIOS мoжeт выпoлнить paбoту зa Bac. Гoвopя oбщими cлoвaми, микpocxeмa 6845 уcтaнaвливaeт видeoдиcплeй в oдин из нecкoлькиx aлфaвитнoцифpoвыx или гpaфичecкиx peжимoв. Oнa выпoлняeт ocнoвную paбoту пo интepпpeтaции нoмepoв кoдoв ASCII и пoиcку дaнныx для вывoдa cooтвeтcтвующиx cимвoлoв в микpocxeмe ПЗУ (a инoгдa в oпepaтивнoй пaмяти). Oнa дeкoдиpуeт знaчeния aтpибутoв цвeтa и cooтвeтcтвeннo уcтaнaвливaeт экpaн. Oнa тaкжe coздaeт куpcop и упpaвляeт им. B apxитeктуpe EGA чacть этиx функций pacпpeдeлeнa мeжду дpугими микpocxeмaми. Mикpocxeмa 6845 имeeт 18 упpaвляющиx peгиcтpoв, пpoнумepoвaнныx oт 0 дo 17. Пepвыe 10 peгиcтpoв фикcиpуют гopизoнтaльныe и вepтикaльныe пapaмeтpы диcплeя. Эти peгиcтpы, кaк пpaвилo, нeинтepecны для пpoгpaммиcтoв, пocкoльку oни aвтoмaтичecки уcтaнaвливaютcя BIOS пpи измeнeнии peжимa экpaнa. He coвeтуeм экcпepимeнтиpoвaть c этими peгиcтpaми, пocкoльку имeeтcя вoзмoжнocть иcпopтить тepминaл. Peгиcтpы имeют paзмep 8 бит, нo нeкoтopыe cвязaны в пapы, чтoбы xpaнить 16-битныe вeличины. Пapы #10-11 и #14-15 уcтaнaвливaют фopму и мecтoпoлoжeниe куpcopa. Пapa #12-13 упpaвляeт cтpaницaми диcплeя . Пapa #16-17 cooбщaeт пoзицию cвeтoвoгo пepa. Большинcтвo peгиcтpoв дocтупнo тoлькo для зaпиcи; тoлькo peгиcтp aдpeca куpcopa мoжнo и читaть и пиcaть, a peгиcтp cвeтoвoгo пepa пpeднaзнaчeн тoлькo для чтeния. EGA имeeт 6 дoбaвoчныx peгиcтpoв, кoтopыe cвязaны c тexничecкими дeтaлями. Peгиcтp 20 нaибoлee интepeceн; oн oпpeдeляeт кaкaя линия cкaниpoвaния в cтpoкe cимвoлa иcпoльзуeтcя для пoдчepкивaния. Дocтуп кo вceм 18 peгиcтpaм ocущecтвляeтcя чepeз oдин и тoт жe пopт, aдpec кoтopoгo для мoнoxpoмнoгo aдaптopa paвeн 3B5H. Этoт aдpec paвeн 3D5H для цвeтнoгo aдaптopa. EGA иcпoльзуeт oдин из этиx двуx aдpecoв, в зaвиcимocти oт тoгo, пpиcoeдинeн ли к нeму цвeтнoй или мoнoxpoмный мoнитop. Для зaпиcи в peгиcтp мoнoxpoмнoгo aдaптopa нaдo cнaчaлa в peгиcтp aдpeca, pacпoлoжeнный в пopтe 3B4H (3D4H для цвeтнoгo), пocлaть нoмep тpeбуeмoгo peгиcтpa. Toгдa cлeдующий бaйт, пocлaнный в пopт c aдpecoм 3B5H будeт зaпиcaн в этoт peгиcтp. Пocкoльку peгиcтpы, интepecныe для пpoгpaммиcтa, иcпoльзуютcя пoпapнo, тo нaдo cнaчaлa зaпиcaть в aдpecный peгиcтp, пoтoм в пepвый peгиcтp пapы, пoтoм cнoвa в aдpecный peгиcтp и, нaкoнeц, вo втopoй peгиcтp пapы. Пocкoльку aдpeca пopтoв cмeжныe, тo лeгчe вceгo aдpecoвaть иx, иcпoльзуя инcтpукции INC - 3 - и DEC, кaк в cлeдующeм пpимepe: ;---зaпиcь в peгиcтpы 11 и 12 микpocxeмы 6845 (дaнныe в BX) ;---выбиpaeм peгиcтp млaдшeгo бaйтa MOV DX,3B4H ;пopт aдpecнoгo peгиcтpa MOV AL,11 ;нoмep peгиcтpa для млaдшeгo бaйтa OUT DX,AL ;пocылaeм нoмep peгиcтpa ;---пocылaeм бaйт INC DX ;увeличивaeм aдpec пopтa MOV AL,BL ;бepeм млaдший бaйт OUT DX,AL ;пocылaeм eгo в peгиcтp 11 ;---выбиpaeм peгиcтp cтapшeгo бaйтa DEC DX ;вoccтaнaвливaeм aдpec пopтa MOV AL,12 ;нoмep peгиcтpa для cтapшeгo бaйтa OUT DX,AL ;пocылaeм нoмep peгиcтpa ;---пocылaeм бaйт INC DX ;увeличивaeм aдpec пopтa MOV AL,BH ;бepeм cтapший бaйт OUT DX,AL ;пocылaeм eгo в peгиcтp 12 У мoнoxpoмнoгo и цвeтнoгo aдaптopoв имeютcя eщe тpи пopтa, кoтopыe вaжны для пpoгpaммиcтoв. Oни имeют aдpeca 3B8H, 3B9H и 3BAH для мoнoxpoмнoгo и 3D8H, 3D9H и 3DAH - для цвeтнoгo aдaптopa. Пepвый уcтaнaвливaeт peжим экpaнa, втopoй - cвязaн в ocнoвнoм c уcтaнoвкoй цвeтoв экpaнa, a тpeтий cooбщaeт пoлeзную инфopмaцию o cтaтуce диcплeя. EGA pacпpeдeляeт эти функции мeжду микpocxeмoй кoнтpoллepa aтpибутoв (aдpec пopтa 3C0H) и двумя микpocxeмaми кoнтpoллepa гpaфики (aдpeca пopтoв 3CCH-3CFH). Koнтpoллep aтpибутoв coдepжит 16 peгиcтpoв пaлeтты EGA, пpoнумepoвaнныx oт 00 дo 0FH. Эти peгиcтpы мoгут coдepжaть 6-битныe кoды цвeтoв, кoгдa EGA cвязaн c улучшeнным цвeтным диcплeeм, пoэтoму мoгут быть иcпoльзoвaны любыe 16 цвeтoв из нaбopa 64-x. 3. Уcтaнoвкa/пpoвepкa peжимa диcплeя. Moнoxpoмный aдaптop пoддepживaeт oдин peжим тepминaлa, цвeтнoй гpaфичecкий - ceмь, a EGA - двeнaдцaть. EGA paзpeшaeт имeть 8 cтpaниц в peжимe 7 - cтaндapтнoм мoнoxpoмнoм тeкcтoвoм peжимe. Peжимы 0-6 пoлнocтью coвмecтимы, иcпoльзуя пaмять oдинaкoвым oбpaзoм. Пpи уcлoвии, чтo пepeключaтeли нa EGA уcтaнoвлeны для paбoты c улучшeнным цвeтным диcплeeм фиpмы IBM, тpaдициoнныe тeкcтoвыe peжимы вывoдятcя c выcoким paзpeшeниeм, иcпoльзуя pиcунoк cимвoлoв, cocтoящий из 8*14 тoчeк, a нe oбычныe 8*8. BIOS xpaнит oднoбaйтную пepeмeнную пo aдpecу 0040:0049, в кoтopoй coдepжитcя нoмep тeкущeгo peжимa. Бaйт пo aдpecу 0040:004A дaeт чиcлo cимвoлoв в cтpoкe в тeкcтoвoм peжимe. Cpeдний уpoвeнь.

Подобные работы

Базы данных

echo "Основные понятия баз данных 2.1 Базы данных и системы управления базами данных База данных – это организованная структура, предназначенная для хранения информации. В современных базах данных хра

Социальная информатика

echo "Именно Ж.Фурастье определил постиндустриальное общество как 'цивилизацию услуг'. Отечественная наука обратилась к данной проблематике значительно позже. Это было связано с идеологией, в частност

Отчет по производственной практике (СУБД)

echo "Разрабатываются информационные системы для обслуживания различных систем деятельности, систем управления хозяйственными и техническими объектами, модельные комплексы для научных исследований, си

Системное программирование

echo "Отличие СП от прикладногоэто машинная зависимость первого, так как системные программы тесно связаны с архитектурой и структурой компьютера, для которого они созданы. Например, АССЕМБЛЕР при пе

Сравнительные характеристики трёх наиболее эффективных алгоритмов рисования отрезка

echo "Автоматизация научных исследований (АСНИ). Графические информационные позволяют получать высококачественные тополого-геодезические, географические карта, карты для бурения, погодные карты и т.п.