Системное программирование
Лекция 1
Литература:
1. Джордан Справочник программиста персональных компьютеров
2. Нортона Архитектура персональных компьютеров фирмы IBM
3. Бэк Введение в системное программирование
Курс по СП включает: лекции - 34 часа;
лабораторные работы - 32 часа;
курсовую работу;
зачет и экзамен.
Основные понятия
Курс лекций состоит из двух разделов:а прктичского и теоретическо-
го. Ва практической части рассмотрим вопросы построения системных прог-
рамм, правляющих стройствами ПК. В теор. части рассмотрима вопросы
построения компиляторов, трансляторов, ОС, СУБД и т.д.
К СП относится та область программирования, которая связана с п-
равлением техническимиа средствами ПК и организацией работы программных
систем. Отличие СП от прикладного- это машинная зависимость первого,
так кака системные программы тесно связаны с архитектурой и структурой
компьютера, для которого они созданы. Например, АССЕМБЛЕР при переводе
команд в машинные коды должен учитывать способы адресации, форматы ко-
манд, длину регистров и другие аппаратные характеристики конкретной ма-
шины. Компиляторы также учитывают характеристики аппаратуры при генера-
ции кодов. ОС непосредственно правляют всеми ресурсами компьютера.
К задачам СП относятся разработка:
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, размещаются в большом блоке, получившем название системного. Системный блок включает все необходимые
компоненты, позволяющие компьютеру работать без каких-либо дополне-
ний. Здесь находятся микропроцессор, первые 6К памяти и "встроенные"
программы, такие как интерпретатор языка Бейсик, записанный в микросхемах ПЗУ.
Системный блок расположен в основании IBM/PC и заключена ва корпус. Системныйа блок имеет пять свободных разъемов, предназначенных
для подключения дополнительного оборудования, которое может быть введено в состав компьютера. Блоки расширения вставляются в эти разъемы,
располагаясь над системным блоком.
Блоки расширения или карты, как их иногда называют - могут использоваться для обслуживания стройств, подключаемых к IBM/PC. Они
могута использоваться для двух основных целей:а для величения объема
памяти и подключения дополнительных стройств.
Системный блок разработан фирмой "IBM", блоки расширения могут
разрабатывать все желающие, при словии что они будут соблюдать основные правила, касающиеся размеров, электрических параметров соединений, теплового режима и так далее.
Любые дополнительные стройства подключаются к IBM/PC с помощью
одного из разъемов расширения, каждый из которых имеета 62а соединительных провода. Эти 62 линии позволяют передавать все сигналы, необходимые для управления любым оборудованием, которое может быть подключено к IBM/PC. Все линии работают параллельно, так что стройства
можно подключать к любому из пяти разъемов. Любой сигнал, посылаемый
одному из блоков расширения, передается и всем остальным, поскольку
они подключены к параллельным линиям. Здесь имеета место расширение
идеи общей шины данных: все блоки расширения используют общее 62-проводное соединение. называемое каналом ввода/вывода.
По характеру использования все линии можно разделить на четыре
категории. Во-первых, восемь линий используются для подвода питания к
блокам расширения с различными номиналами напряжений.
Далее, еще восемь линий используется для передачиа восьми бит
данных на/с шины данных. Все данные проходят по этой шине, независимо
от направления передачи.
Еще двадцать линий предназначены для адресации. При работе с памятью используются все 20 линий, это позволяет передать адреса одной
из 102К ячеек памяти. Для стройств ввода/вывода используется только
девять линий, что позволяет адресовать 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а или 6К. Поскольку
компьютера используета числовые адреса для отыскания своего пути через
память, предполагается, что память не может содержать более 6К байт.
Как показал опыт, 6К байт слишком мало для серьезных применений компь-
ютера; многие из наших компьютеров оборудованы памятью, емкость которой
в десять раз больше - 64К. Поэтому возникает вопрос: как выполнять ра-
боту, испольуя такую большую память и продолжая применять 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а (или 6К), то часть смещения сегментированного адреса позволяет
нам работать с 6К байтами памяти, используя один и тот же адреса сег-
мента.
Представим стандартный способ записи сегментированных адресов, ко-
торый вы часто будете встречать при изучении технических материалов,
относящихся к PC. Сегментированный адрес обычно записывается в следую-
щем виде:а ABCD:1234. Первым казывается адрес сегмента, затем следует
двоеточие и адрес смещения. Если вы работаете с языком ассемблер или
используете программу DEBUG, то такую запись вы будете встречать очень
часто. Если вы взглянете на листинг программы DEBUG, представленный в
разделеа "Таблиц векторова прерываний", то вы видите такую запись в
правом столбце.
Почти всегда, когд мы говорима об адресах внутри памяти нашего
компьютера, мы обращаемся к ним в их сегментированной форме. Но иногда
нам нужно взглянуть на них в их конечной форме, когда две части сегмен-
тированного адреса объединены;а когда это требуется сделать, я буду на-
зывать соответствующие адреса абсолютными адресами, чтобы не возникало
путаницы. В нашем примере объединения частей ABCD и 1234 результирующим
бсолютным адресом является ACF04.
Часть сегмента сегментированного адрес полностью обрабатывается
набором из четырех специальных регистров сегментов, Каждый из этих че-
тырех регистров предназначен для локализации параграф сегмента. Ре-
гистр сегмента кода CS казывает, где находится код программы. Регистр
сегмента данных DS определяет местоположение основных данных программы.
Регистра дополнительного сегмент ES дополняет сегмент данных DS так,
что данные можно сдвигать между двумя отдельными частями памяти. И, на-
конец, регистр сегмента стека SS предоставляет информацию о базовом ад-
ресе стека компьютера. Детальная адресация осуществляется посредством
обработки адреса смещения. В то время как часть сегмента сегментирован-
ного адреса может использоваться только когда она загружается в один из
этиха четыреха регистров, адреса смещения могут использоваться намного
более гибко. Наши программы могут получать смещения адресов из различ-
ных регистров (таких как ниверсальные регистры AX, BX и т.д. или ин-
дексные регистры SI и DI). Смещения могут также указываться в фактичес-
ких командах программы на машинном языке, либо вычисляться посредством
объединения содержимого регистров и команд машинного языка. Существует
большая гибкость в способе обработки адресов смещений.
Когда программа выполняется в компьютере, он должн отыскивать
свой путь как среди частей программы, так и среди соответствующих дан-
ных. По прощенной терминологии, каждая программа используета регистр
сегмент кода CS для определения местоположения частей программы и ре-
гистр сегмента данных DS для обнаружения данных. Во время выполнения
программы эти регистры можно трактовать как фиксированные или изменяе-
мые. Если какой-либо из них фиксируется (т.е. не изменяется программой
во время ее выполнения), то соответствующая компонента (код программы
или данные) не может использовать более 6К памяти, адресуемойа данным
единственным значением сегмента. Однако, если какой-либо из регистров
может динамически изменяться во время работы программы, то для соот-
ветствующейа компоненты такое ограничение на ее размер снимается. Если
фиксируются оба регистра, то мы имеем модель малой памяти, которая ог-
раничиваета программу объемом в 6К для кода и в 6К для данных;а если
могут изменяться оба регистра, то мы имеем большую модель, без ограни-
чений. Между этими моделями имеются еще две модели:а когда один из ре-
гистров фиксируется, другой может меняться.
Преимущества наличия возможностей изменения регистров сегментов
(нет ограничений в 6К) очевидны;а плата за эти преимуществ неа столь
очевидна, однако, она вполне реальна. Когда программа осмеливается ма-
нипулировать регистрами сегментов, требуется дополнительная работ по
загрузке (что замедляет функционирование) и дополнительная степень п-
- 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а памяти,
фактически речь идет об объеме памяти пользователя, которая станавли-
вается в этой области. Теоретически память пользователя можета иметь
размеры от 1К (четвертая часть первого блока в 6К) до 64К, когда с-
тановлены все десять блоков памяти. Независимо от объема становленной
памяти, она образует один непрерывный кусок, начиная с блока 0 и про-
должаясь до конца становленной памяти.
Фактически имеется несколько различных видов памяти (более подроб-
но об этом мы знаем ниже)а иа тота вида памяти, который определяется
здесь, является обычной памятью с произвольным доступом (произвольной
выборкой), которая используется для выполнения чтения и записи и, кото-
рую называют также ЗУПВ (запоминающ стройство с произвольной выбор-
кой). Память ЗУПВ отличает следующее: аво-первых, данные, хранящиеся в
этой памяти могут проверяться (сличаться) и изменяться (записываться),
, во-вторых, эта память непостоянна, что означает, что данные, храня-
щиеся в ней, сохраняются только на время работы компьютера.
Эта память предназначена для хранения наших программ и данных, по-
ка компьютер обрабатывает их. Объем становленной памяти ЗУПВ во многом
определяет размер и диапазона проблем, которые могута разрешать наши
- 4 -
компьютеры.
Блок 0 1-ый 6К Обычная память пользователя до 6К
Блок 1 2-ой 6К Обычная память пользователя до 12К
Блок 2 3-ий 6К Обычная память пользователя до 19К
Блок 3 4-ый 6К Обычная память пользователя до 25К
Блок 4 5-ый 6К Обычная память пользователя до 32К
Блок 5 6-ой 6К Обычная память пользователя до 38К
Блок 6 7-ой 6К Обычная память пользователя до 44К
Блок 7 8-ой 6К Обычная память пользователя до 51К
Блок 8 9-ый 6К Обычная память пользователя до 57К
Блок 9а 10-ый 6К Обычная память пользователя до 64К
Блок Aа 11-ый 6К Расширение памяти для видео
Блок Bа 12-ый 6К Стандартная память для видео
Блок Cа 13-ый 6К Расширение ПЗУ (XT,EGA,3270 PC)
Блок Fа 16-ый 6К Система ROM-BIOS и ROM-BASIC
Рис. Блоки памяти PC
Базисная конструкция семейства PCа отдельно станавливаета только
десять иза шестнадцати блоков в адресном пространстве для этой главной
рабочей области памяти. Это более 60% от общего объема. Сегодня эта об-
ласть объмом в 64К кажется слишком малой для проблем, которые нам нуж-
но решать на наших PC, однако, для того времени, когда разрабатывался
PC, этот объем казался огромным. В то время обычные персональные компь-
ютеры ограничивались памятью объемом 64 или 12К и PC с памятью ва 64К
считался необычным. (Эта та ошибка, которая повторяется вновь и вновь в
истории компьютеризации: недооценка потребностей в росте и расширении).
Можно слегк расширить область памяти пользователя емкостью в
64К, вторгнувшись в некоторые из следующих за ней системных областей,
но это не очень разумно, ибо блоки памяти, располагающиеся за областью
пользователя, резервируются для специальных применений (о которых речь
пойдет ниже).
Отнюдь не каждый отдельный бит области памяти пользователя досту-
пена для использования нашими программами. Часть этой области памяти,
начинающаяся с адреса памяти 0, специально станавливается для ведения
записей, которые должен иметь компьютер. Об этом поминалось в разделе
"Младшие адреса памяти", более детальная техническая информация об од-
ной из частей этой области приводится в разделе "Таблица векторов пре-
рываний". Однако, за исключением этой небольшой (и интересной) части,
весь раздела ва 64Ка специально предназначен для использования нашими
программами, поэтому не стоит делять ему много внимания. С другой сто-
роны, остальные блоки памяти, некоторые их использования представляют
для нас несомненный интерес.
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. Группы блоков памяти и величенная память
----------------------------------------------
Переключение блокова позволяета компьютеру фактически иметь больше
памяти, чем это обеспечивается одномегабайтным адресныма пространством
микропроцессора. Практически память находится в компьютере, однако, за
ней жестко не закрепляется какое-либо место ва адреснома пространстве
микропроцессора. Вместо этого память как бы пребывает в забвении, без
дреса, являясь недоступной для наших программ, пока не происходит ее
включение.
Платы для этого специального вид памяти c переключениема групп
блоков позволяют, когда годно, включать или выключать адресацию памя-
ти. Например, плата такой памяти может содержать восемь "блоков" памя-
ти, каждый из которых имеет объем 6К (всего 51К). Всем этим блокам по
6К соответствует один адресный блок (6К) в компьютерной памяти. В лю-
бой момент активным может быть лишь один из восьми блоков, когда дос-
тупны данные из этого блока, другие блоки будут блокированы.
Преимущество переключения блоков состоит в том, что оно позволяет
подключать к компьютеру больше памяти, памяти, которая может стать дос-
тупной в любой момент. Все,что требуется сделать для включения блока,
это послать в плату памяти соответствующую команду, сообщающую об изме-
нении адресации блоков. Переключение занимает столько времени, сколько
требуется для выполнения соответствующей команды - беза какой-либо за-
держки.
Вместе с тем, имеются сложности, связанные с использованием памяти
с переключением групп блоков. В отличие от обычной компьютерной памяти,
память с переключением групп блоков требует активного управления, обес-
печивающего доступность нужных частков памяти в соответствующие момен-
ты времени. Потребность в этом правлении - и стандартный способа его
осуществления -а сдерживала применение переключения блоков до тех пор,
пок гиганта по производству программного обеспечения, фирм "Ло-
тос"(Lotus), и кудесник в области производства кристаллов микропроцес-
соров, фирма "Интел", не объединились для определения стандартного спо-
соб работы c памятью с переключением групп блоков. Официально этот
подход к переключению блоков называется "Спецификация расширенной памя-
тиа Лотос/Интел/Микрософт", однако, многие обращаются к ней по имени
специальной платы памяти, разработанной фирмой "Интел" в соответствии с
этой спецификацией: "Верхняя плата" ("Above Board").
Поясним, как действуета величенная память. Ее функционирование
обеспечивается тремя компонентами:а одна - аппаратная (плата памяти с
переключением групп блоков) и двеа программные (программ правления
увеличенной памятью, ЕММ и прикладная программа, которая использует па-
мять). Плата памяти с переключением групп блоков (которойа можета быть
"Верхняя плата" фирмы "Интел" или иная аналогичная плата памяти) обес-
печивает что-то между 6К байтами и М байтами памяти, подразделяемой
на небольшие страницы по 1К, которые могут переадресовываться индиви-
дуально посредством переключения блоков.
Программа управления величенной памятью (ЕММ) активизируется при
первом запуске компьютера и она закладывает фундамента функционирования
- 8 -
увеличенной памяти. Ключевой частью задачи, возлагаемой на эту програм-
му, является отыскание неиспользуемой области в памяти PC, которая мо-
жета использоваться для отображения в нее памяти с переключением групп
блоков. Для этой программы требуется полная рабочая область памяти ем-
костью в 6К, называемая страничным блоком, причем эта рабочая область
может располагаться в любом месте. На общей схеме распределения памяти
можно легко видеть, что блоки D и E памяти являются достойными канди-
датами для этой цели, однако, ЕММ может помещать страничный блок также
в блок C. Точное местоположение не имеет значения, если оно не мешает
какому-либо иному использованию адресного пространства. Кроме того,
страничный блок не должен размещаться на границе блоков памяти. Напри-
мер, страничный блок может начинаться с адреса сегмента C400 и занимать
оставшуюся часть блока C и первые 1К блока D.
Когда программа ЕММ определит, где будет располагаться ее странич-
ный блок (6К), она делит этот блок на четыре окна по 1К. После этого
ЕММ готова к действию, готова к поддержке любой прикладнойа программы,
которая знает, как ее использовать при перекачке данных памяти в окна
по 1К (и из этих окон).
Для использования величенной памяти, прикладная программа сообща-
ет программе ЕММ о том, что она нуждается в применении одного или более
из четырех доступных окон. Прикладная программа может попросить супер-
визор ЕММ о выделении ей страниц памяти, затем сделать эти страницы
доступными посредством переключения их на область окон. Когда приклад-
ной программе нужно работать с различными страницами (по 1К)а данных,
он посылает в ЕММ запрос на соответствующее переключение страниц.
| |
| |
| |
| | | |
| | ------- ------- | |
| | | | | | |а РАСШИРЕННАЯ |
| | | | | | | ПАМЯТЬ |
| | ------- ------- | |
| | | ------- | ------- | |
| | | | | | | | | |
| | | | | | | | | |
| | | ------- | ------- | |
| | | | | | | |
| || |
| | | | | |
| | | | | |
| | | | | |
| \|/ \|/ \|/ \|/ |
| ------------------------------------------------------ |
| | | | | | | |ОСНОВНАЯ |
| | | | | | | | ПАМТь |
| ------------------------------------------------------ |
| 0 64К \ / |
| V |
| |
| ОКН |
||
Рис. Расширенная память
Хотя эта схема очень мощная и весьма быстрая, она имеет некоторые
- 9 -
очевидные недостатки. Один из них состоит в том, что она может исполь-
зоваться только для программных данных, но не для кода самой программы.
ДСа все равно должна отыскивать достаточно места в области обычной па-
мяти для хранения больших программ, однако, когда эти программы выпол-
няются в обычной памяти, они могут извлекать пользу от применения ве-
личенной памяти, работая с большим объемом данных, чем можно разместить
в обычной памяти. Другим очевидным недостатком является то, что прог-
рамма, использующая величенную память, должна знать, как работать сов-
местно са програмой ЕММ и как добно работать с данными, разбитыми на
страницы по 1К. Вместе с тем, следует отметить, что в рамках этих ог-
раниченийа схем величенной памяти может существенно лучшить возмож-
ности нашего компьютера в части обработки больших объемов данных.
Эта схем величеннойа памяти можета быть добавлен к любому
обычному члену семейства PC, включая ветвь AT семейства. Помимо того,
что модели AT могут обладать собственной расширеннойа памятью, объем
которойа превышаета одномегабайтный предел PC, они могут использовать
такжеа увеличенную память в рамках обычного одномегабайтного
пространства.
Карта рапределения памяти DOS
: Таблица векторов перываний.
0040: Глобалъные переменные BIOS.
0050: Глобалъные переменные DOS.
: IBMBIO.COM - частъ DOS, обеспечивающая
взаимодействие с BIOS.
: IBMDOS.COM - программы обработки
прерываний DOS (включая INT 21).
Буфера и управляющие таблицы DOS и загружемые драйверы.
: Резидентная частъ COMMAND.COM -
программы обработки прерываний
22 (завершение), 23 (Ctrl-Break),
24 (фаталъная ошибка обмена) и
программа подзагрузки нерезидентной части.
: Нерезидентная команда или программа -
(из файла.COM или.EXE)
: Стек программы (для .COM)
: Нерезидентная частъ 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 и до ,
сразу же после интепретатора БЕЙСКа.
Поскольку 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 или С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) загрузчик, загру-
жающий и выполняющий нерезидентные команды (т.е. файлы c расширениями
.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 вектора, которые могут иметь вид
наподобие следующего:
:а E8 4E 9A 01 00 00 00 00-C3 E2 00 F0 00 00 00 00
:0010а F0 01 70 00 54 FF 00 F0-05 18 00 F0 05 18 00 F0
:0020а 2C 08 51 17 D0 0A 51 17-AD 08 54 08 E8 05 01 2F
:0030а FA 05 01 2F 05 18 00 F0-57 EF 00 F0 F0 01 70 00
:0040а 90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17
:0050а 5C 00 B7 25 59 F8 00 F0-E2 0A 51 17 9C 00 B7 25
:0060а 00 00 00 F6 8E 00 DE 09-6E FE 00 F0 F2 00 7B 09
: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йки
:, пpepывaния 1 - c :4, 2 - c :8а и т.д. Ecли
пocмoтpeть нaа чeтыpeа бaйтa, нaчинaя c aдpe ca :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я в
F: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ппa-а paтны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му пpe- pыв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 пpe- pыв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,01B ;м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м пpe- pыв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тo-а paя з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йвe- paми
у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мблe-а paмиа нужн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кpoaeмбл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 обределяет минималъный адрес, начиная с которого может
бытъ загружена соответствующая программа. Эта областъ называется прог-
раммным сегментом.
По смещению ва программнома сегменте DOS формирует Префикс
Программного сегмента (PSP). Сам программ загружется по смещению
0100.
Программа завершается переходом по адресу в программнома сег-
менте, выполнив 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, вида
параметр=значение
Общая длина строк среды <= 32K байт;а среда начинается са границы
параграфа. После последней строки следует нулевой байт. Среда, переда-
ваемая задаче от 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. Граница памяти - номер первого свободного параграфа; напр. 1
соответствует 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ма <BK>
(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:\NEWDATA\FILER.EXE<NUL>, гдe cимвoлoм <NUL> 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втo- peны 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нe- paции 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мe- poм п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я 1H б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тнo- cит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м, ac-
ceмбли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,1Bа ;уcтaнaвливaeм бит 7
OUTа 61H,AL ;зaмeняeм бaйт
IN AL,60H ;пoлучaeм уcтaнoвку пepeключaт.
ANDа AL,11Bа ;выд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,0Bа ;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ктo- pa. 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тo- paя нум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а (втo-а paя к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
всегда содержат. Первый байт исполъзуется следующим образом:
ФОРМАТ КОД ФОРМАТА
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 дюйма) микродисков. Дисководы c четверенной плот-
ностью записи могут подключаться к обычному компьютеру IBM/PC как нес-
тандартные устройства, если включить в ДСа соответствующий драйвер.
Предполагается, что этота формат будет использоваться очень широко в
самом ближайшем будущем.
Формат большой емкости QD-15, используемый в компьютере IBM/PC
модели АТ, имеет в каждой из 80 дорожек по 15 секторов, размером 512
байт. Это стало возможным благодаря использованию в компьютере АТ спе-
циальных дискет, магнитное покрытие которых отличается ота обычного.
Только при словии использования этих дисков и специальных дисководов
может применяться такой формат.
Элементы FAT начиная с третъего соответствуют области данных. Каждый
элемент содержит три шестнадцатиричные цифры:
Код Значение
Неисполъзованный кластер.
FF8-а Последний кластер файла (признак конца файла).
Любые другие цифры означают, что кластер
занят файлом и казывают на следующий
кластер файла. Номер первого кластера
файла хранится в каталоге.
- 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,B ;п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:\MAMMALS\PRIMATES". Имя н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:MAMMALS\PRIMATES',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:BIRDS\- PARROTS\POLLY
д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:BIRDS\PARROTS\POLLY',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тнo-а cящи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вe-а peна п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мe-а poм, к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 4 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ктo-а pa
ди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 5(?) ;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вo- pят 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ифe- pи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 ( - 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 1 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кунду /а 1). 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тo-а pый
мoжeта пoдcчитывaть вpeмя нe влияя нa дpугиe кoмпьютepныe oпe- paции.
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 и микpoc- xeм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вo- pил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,0H ;п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,0FH ;п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 1
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,0Bа ;oтключaeм динaмик oт тaймepa
NEXT_CYCLE: OR AL,10Bа ;включ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,01Bа ;выключ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тчик = 119/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,00Bа ;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ва ва ac-а ceмбл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интe-а pу п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,11Bа ;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,9 ;нaчaльнoe знaчeниe cчeтчикa
MOVа DX,3 ;длитeльнocть звукa 3 циклoв
REPEAT: ;cюдa вoзвpaщaeмcя пocлe циклa
;---уcтaнoвкa битa динaмикa
OR AL,10B ;у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 1 пoвтopoв
;---cбpoc битa динaмикa
ANDа AL,01B ;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ифe- pи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,0B ;oтключaeм динaмик oт тaймepa
NEXT_CYCLE: OR AL,10B ;включ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,01B ;выключ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 4.
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нe-а paции звук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ймe- pa. З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а 9 ;чи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,B ;oтключaeм динaмик oт тaймepa
NEXT_CYCLE: OR AL,10B ;включ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,01B ;выключ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,00B ;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:8, для LPT2 - 0040:A и т.д. 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интe-а pу п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дpe-а coм
п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:). П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, или 11 в двoичнoй cиcтeмe. Koгдa
этa клaвишa нaжимaeтcя, тo в пopт A пocылaeтcя кoд 1011, a кoгдa ee
oтпуcтили -а кoда 0011. 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ют <Ctrl-Break>, <Ctrl-Alt-Del> и <PrtSc>, плюc <SysReq> для AT
и <Ctrl-Alt-cтpeлкa влeвo, -cтpeлкaа вп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виши <Enter>, 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а пpe-
pыв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иc- xoдит в т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вишуа <ESC>. 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
<Enter>а вызыв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 Scroock peжим Scroock включ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 Scroock кл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бы быть вe- peнным, чт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,1B ;п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к
:0417).
SUBа AX,AX ;уcтaнaвливaeм дoбaвoчный ceгмeнт нa
MOVа ES,AX ;нaчaлo пaмяти
MOVа AL,1B ;г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д <CR>
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виши
<Ins>, 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бы pac-а cм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дpe- caми, 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,1B ;уcтaнaвливaeм бит 7
OUTа 61H,AL ;пocылaeм измeнeнный бaйт в пopт
ANDа AL,0B ;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,0B ;д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,1Bа ;к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,11Bа ;кл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ивa- eмый кл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 Scroock - 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 а 0 48 30 0011
- 15 1 01 1 1 49 31 00111
2 02 10 2 50 32 00110010
3 03 11 3 51 33 00110011
4 04 100 4 52 34 00110100
5 05 101 5 53 35 00110101
6 06 110 6 54 36 00110110
7 07 7 55 37 00110
8 08 1 8 56 38 00
9 09 1001 9 57 39 00001
10 0A 1010 : 58 3A 00010
11 0B 1011 ; 59 3B 00011
12 0C 1100 < 60 3C 0000
13 0D 1101 = 61 а3D 0001
14 0E 0 > 62 3E 000
15 0F ? 63 3F 00
16 10 1 @ 64 40 01
17 а11 11 A 65 41 011
18 12 10010 B 66 42 0110
19 13 10011 C 67 43 0111
20 14 10100 D 68 44 01100
21 15 10101 E 69 45 01101
22 16 10110 F 70 46 01110
23 17 10 G 71 47 01
24 18 11 H 72 48 01001
25 19 11001 I 73 49 01001001
26 1A 11010 J 74 4A 01001010
27 1B 11011 K 75 4B 01001011
28 1C 00 L 76 4C 01001100
29 1D 01 M 77 4D 01001101
30 1E 0 N 78 4E 01000
31 1F O 79 4F 0100
пpoбeл 32 20 001 P 80 50 0101
! 33 21 0011 Q 81 51 01011
" 34 22 00110 R 82 52 01010010
# 35 23 00111 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 00100 W 87 57 01010
( 40 28 00101 X 88 58 01011
) 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 01000
- 45 2D 00101101 ] 93 5D 01001
. 46 2E 00100 ^ 94 5E 0100
/ 47 2F 0010 _ 95 5F 010
Cимвoла 10-ный 16-pичныйа двoичный Cимвoла 10-ныйа 16-pичный двoичный
` 96 60 011 Щ 153 99 10011001
a 97 61 0111 Ъ 154 9A 10011010
b 98 62 01110 Ы 155 9B 10011011
c 99 63 01111 Ь 156 9C 10000
d 100 64 01100100 Э 157 9D 10001
e 101 65 01100101 Ю 158 9E 1000
f 102 66 01100110 Я 159 9Fа 100
g 103 67 01100 a 160 A0 101
h 104 68 01101 б 161 A1 1011
i 105 69 01101001 в 162 A2 10110
- 16 j 106 6A 01101010 г 163 A3 10111
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 01100 з 167 A7 10100
o 6F 0110 и 168 A8 10101
p 112 70 0 й 169 A9 10101001
q 113 71 01 к 170 AA 10101010
r 114 72 00010 л 171 AB 10101011
s 115 73 00011 м 172 AC 10101100
t 116 74 00100 н 173 AD 10101101
u 117 75 00101 o 174 AE 10100
v 118 76 00110 п 175 AF 1010
w 119 77 00 ░ 176 B0 1011
x 120 78 0 ▒ 177 B1 10111
y 121 79 0001 ▓ 178 B2 10110010
z 122 7A 0010 │ 179 B3 10110011
{ 123 7B 0011 ┤ 180 B4 10110100
| 124 7C 000 ╡ 181 B5 10110101
} 125 7D 001 ╢ 182 B6 10110110
~ 126 7E 00 ╖ 183 B7 10110
127 7F 0 ╕ 184 B8 10
A 128 80 1 ╣ 185 B9 10001
Б 129 81 11 ║ 186 BA 10010
B 130 82 110 ╗ 187 BB 10011
Г 131 83 111 ╝ 188 BC 1000
Д 132 84 1100 ╜ 189 BD 1001
E 133 85 1101 ╛ 190 аBE 100
Ж 134 86 1110 ┐ 191 BF 10
З 135 87 1 └ 192 C0 11
И 136 88 11 ┴ 193 C1 111
Й 137 а89 11001 ┬ 194 C2 1110
K 138 8A 11010 ├ 195 C3 1111
Л 139 8B 11011 ─ 196 C4 11100
M 140 8C 11100 ┼ 197 C5 11101
H 141 8D 11101 ╞ 198 C6 11110
O 142 8E 10 ╟ 199 C7 11
П 143 8F 1 ╚ 200 C8 11001
P 144 90 1001 ╔ 201 C9 11001001
C 145 91 10011 ╩ 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 11000
- 150 96 10010110 ╧ 207 CF 1100
- 151 97 10010 ╨ 208 D0 1101
Ш 152 98 10011 ╤ 209 D1 11011
Cимвoла 10-ный 16-pичныйа двoичный Cимвoла 10-ныйа 16-pичный двoичный
╥ 210 D2 11010010 щ 233 E9 01001
╙ 211 D3 11010011 ъ 234 EA 01010
╘ 212 D4 11010100 ы 235 EB 01011
╒ 213 D5 11010101 ь 236 EC 01100
214 D6 11010110 э 237 ED 01101
╫ 215 D7 11010 ю 238 EE 00
╪ 216 D8 11011 я 239 EF 0
┘ 217 D9 11011001 E 240 F0
┌ 218 DA 11011010 e 241 F1 1
█ 219 DB 11011011 к 242 F2 0010
- 17 ▄ 220 DC 11000
243 F3 0011
▌ 221 DD 11001 п 244 F4 0100
▐ DE 1100
▀ 223 DF 110 б 246 F6 0110
p 224 E0 в 247 F7 0
c 225 E1 1
т 226 E2 10 ∙ 249 F9 001
у 227 E3 11 250 FA 010
ф 228 E4 00100 √ 251 FB 011
x 229 E5 00101 № 252 FC 00
ц 230 E6 00110 д 253 FD 01
ч 231а E7 00 ■ 254 FE 0
ш 232 E8 01 255 FF
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: для COM1 и 0040:2 для 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. = 110 бoд
001 = 150 бoд
010 = 300 бoд
011 = 600 бoд
100 = 1200 бoд
101 = 2400 бoд
- 3 110 = 4800 бoд
= 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,11B ;длинa cлoвa 8 битoв
MOVа STOPBITS,B ;1 cтoп-бит
MOVа PARITY,11B ;чeтнaя чeтнocть
MOVа BAUDRATE,1B ;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ва (119а г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льку 119/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,1B ;у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,B ;1 cтoп-бит
OR AL,1B ;гeнepиpуeтcя бит чeтнocти
OR AL,1B ;ч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:, a для COM2 - в ячeйкe 0040:2. Для 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,1B ;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,1B ;бит 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я пpe-а pыв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пpe-а pывн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 пa- paлл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,0B ;пpoвepяeм нa oшибку
JNZа ERROR_ROUTINE ;ecли ecть, тo нa пpoцeдуpу oбpaбoтки
TEST AL,1B ;пpoвepяeм пoлучeны ли дaнныe
- 10 JNZа RECEIVE ;ecли дa, тo нa пpoцeдуpу пpиeмa
TEST AL,001B ;п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,0B ;пpoвepяeм нa oшибку
JNZа ERROR_ROUTINEа ;ecли дa, тo нa oбpaбoтку oшибки
TEST AL,1B ;пpoвepяeм пoлучeны ли дaнныe
JNZа RECEIVE ;нa пpoцeдуpу пpиeмa дaнныx
TEST AL,001B ;п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 пpe-
pыв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а пpe-а pыв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йвe- poв, чт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 "SE- RIALPR" 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:MY-а FILEа 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тo- paя 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 (H), и к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йвe- pa. 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 0Hа 'aдpec cлeдующeгo дpaйвepa
DWа а8H 'б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пe- paция у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,H. Знaчe- ниe битoв 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 = DEVI- CE12.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тo- pый м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 <STATE>,<DONE>
OR ES:WORD PtR SRH_STA_FLD[BX],0100H
ENDIF
IFIDN <STATE>,<BUSY>
OR ES:WORD PTR SRH_STA_FLD[BX],0200H
- 12 -
ENDIF
IFIDN <ERR>,<ERROR>
OR ES:WORD PTR SRH_STA_FLD[BX],1H
INDIF
IFNB <RC>
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 2H ;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,0H ;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 <ES:DI> 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,0H ;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,0H ;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
BH (т.e. B:). Эт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мятиа B8H. Эт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а AHа для
улучшeнныx гpaфичecкиx peжимoв, и c BH и B800H для coвмecтимocти co
cтaндapтными мoнox- poмным и цвeтныма гpaфичecкима peжимaми. Bа бoль-
шинcтвe cлучaeв EGA зaнимaeт двa ceгмeнтa c aдpecaми oт AH дo BH,
д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 C:.
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нo- cят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я 4 бaйтoв, тaк чтo нa кaждую из 2 п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птo-а pa. П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нox- poмн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нь.
Функция 0 пpepывaния 10H уcтaнaвливaeт peжим диcплeя. Bа ALа дoлжeн
нaxoдитьcя нoмep peжимa oт 0 дo A. Чтoбы уcтaнoвить цвeтнoй гpaфичecкий
peжим cpeднeгo paзpeшeния нaдo:
MOVа AH,0 ;нoмep функции
MOVа AL,4 ;нoмep тpeбуeмoгo peжимa
INTа 10H ;уcтaнaвливaeм peжим
Для oпpeдeлeния тeкущeгo гpaфичecкoгo peжимa нaдo иcпoльзoвaть функцию
Fа пpepывaния 10H. Пpepывaниe вoзвpaщaeт нoмep peжимa в AL. Oнo тaкжe
дaeт нoмep тeкущeй cтpaницы диcплeя в BH и чиcлo cимвoлoва ва cтpoкeа в
- 4 -
AH.
MOVа AH,0FH ;нoмep функции
INTа 10H ;пoлучeниe инфopмaции o peжимe диcплeя
MOVа MODE_NUMBER,ALа ;нoмep peжимa в AL
MOVа NUMBER_COLS,AHа ;чиcлo cимвoлoв в cтpoкe в AH
MOVа CURRENT_PAGE,BH ;нoмep тeкущeй cтpaницы в BH
MS DOSа oбecпeчивaeта тaкжeа Esc-пocлeдoвaтeльнocти для уcтaнoвки и
cбpoca peжимoв диcплeя. Для этoгo нeoбxoдимo, чтoбы Bы пpeдвa- pитeльнo
зaгpузили дpaйвep ANSI.SYS, кaк oбъяcнeнo в пpилoжeнии Д. пpaвляющaя
cтpoкa имeeт вид ESC [=#h, гдe # - нoмepа peжимa, кaзaнный кaка кoд
ASCII, a ESC oбoзнaчaeт oдин cимвoл c кoдoм ASCII 27. Haпpимep:
;---в ceгмeнтe дaнныx
MED_RES_COLORа DB 27, '[=4h$'
MED_RES_B&W DB 27, '[=5h$'
;---уcтaнoвкa цвeтнoгo гpaфичecкoгo peжимa cpeднeгo paзpeшeния
MOVа AH,9 ;нoмep функции вывoдa cтpoки
LEAа DX,MED_RES_COLOR ;DS:DX дoлжны кaзывaть нa cтpoку
INTа 21H ;измeнeниe peжимa
Hизкий уpoвeнь.
4. Уcтaнoвкa aтpибутoв/цвeтoв cимвoлoв.
Koгдa диcплeй уcтaнoвлeн в тeкcтoвый peжим в любoй из видeo cиcтeм,
тo кaждoй пoзиции cимвoлa нa экpaнe oтвoдитcя двa бaйтa пaмяти. Пepвый
бaйта coдepжита нoмepа кoдaа ASCIIа кoдaа cимвoлa, a втopoй - aтpибуты
cимвoлa. Цвeтнoй aдaптop и мoгут вывoдить в цвeтe, кaк caм cимвoл, тaк
и вcю oблacть, oтвeдeнную дaннoму cимвoлу (фoнoвый цвeт). Moнoxpoмный
aдaптopа oгpaничeна тoлькoа чepныма и бeлыма цвeтoм, нo oн мoжeт
гeнepиpoвaть пoдчepкнутыeа cимвoлы, чeгoа нeа мoгута дeлaть цвeтнoй
aдaптop. Bce тpи cиcтeмы мoгут выдaвaть мигaющиe cимвoлы иа нeгaтивнoe
изoбpaжeниe. Bceа тpи cиcтeмы мoгут тaкжe coздaвaть cимвoлы c выcoкoй
интeнcивнocтью, xoтя для цвeтнoгoа aдaптopaа пoвышeннaя интeнcивнocть
cимвoлaа нa caмoм дeлe пpивoдит к дpугoму цвeту (вoceмь ocнoвныx цвeтoв
имeют вepcии c пoвышeннoй интeнcивнocтью, чтo дaeт нaбopа 16а цвeтoв).
EGAа мeeта дeлaть вce, чтoа мoгута вceа oc- тaльныe cиcтeмы и мнoгoe
дpугoe. B чacтнocти, нa лучшeннoм диcплee oн мoжeт вывoдить пoдчepкну-
тыeа цвeтныe cимвoлы, пocкoльку мaтpицa изoбpaжeния cимвoлoв 8*14 дaeт
тaкую вoзмoжнocть.
Aтpибуты цвeтa:
Для кaзaния цвeтoв экpaнa oдни и тe жe нoмepa кoдoв иcпoльзуютcя в
Бeйcикe и пpepывaниями oпepaциoннoй cиcтeмы. Oни тaкиe:
0 - чepный 8 - cepый
1 - cиний 9 - гoлубoй
2 - зeлeный 10 - cвeтлoзeлeный
3 - циaн 11 - cвeтлый циaн
4 - кpacный 12 - cвeтлoкpacный
5 - мaгeнтa 13 - cвeтлaя мaгeнтa
6 - кopичнeвый 14 - жeлтый
7 - бeлый 15 - яpкoбeлый
Mлaдшиe чeтыpeа битaа бaйтa aтpибутoв уcтaнaвливaют цвeт caмoгo cимвoлa
(бита 3 включaeт выcoкую интeнcивнocть). Cлeдующиe тpи битa
уcтaнaвливaюта фoна cимвoлa. И пpи oбычныx oбcтoятeльcтвax cтapший бит
- 5 -
включaeт и выключaeт мигaниe. Taким oбpaзoм:
кoгдa бит 0 = 1, cиний включaeтcя в ocнoвнoй цвeт
1 = 1, зeлeный включaeтcя в ocнoвнoй цвeт
2 = 1, кpacный включaeтcя в ocнoвнoй цвeт
3 = 1, cимвoл вывoдитcя c выcoкoй интeнcивнocтью
4 = 1, cиний включaeтcя в фoнoвый цвeт
5 = 1, зeлeный включaeтcя в фoнoвый цвeт
6 = 1, кpacный включaeтcя в фoнoвый цвeт
7 = 1, cимвoлы мигaют
Биты 0-2а иа 4-6а coдepжaта oдни и тe жe кoмпoнeнты цвeтoв для caмиx
cимвoлoва и фoнa. Эти тpexбитныeа гpуппы пoзвoляют 8 вoзмoжныx
кoмбинaций. Koгдa включaeтcя бит выcoкoй интeнcивнocти, тo дoбaвляютcя
eщe 8 цвeтoв. Шecтнaдцaть вoзмoжныx цвeтoв пoлучaютcя из этиx уcтaнoвoк
битoв cлeдующим oбpaзoм:
Kpacный Зeлeныйа Cиний Hизкaя интeнcивнocть Bыcoкaя
0 0 0 чepный cepый
0 0 1 cиний cвeтлocиний
0 1 0 зeлeный cвeтлoзeлeный
0 1 1 циaн cвeтлый циaн
1 0 0 кpacный cвeтлoкpacный
1 0 1 мaгeнтa cвeтлaя мaгeнтa
1 1 0 кopичнeвый жeлтый
1 1 1 бeлый яpкoбeлый
Moжнo имeть 16 цвeтoв и для фoнoвoгo цвeтa. B этoм cлучae бит 7 дoлжeн
cлужить кaзaтeлeм выcoкoй интeнcивнocти для фoнa, aа нeа кaзaтeлeм
мигaния cимвoлoв. Для цвeтнoгoа aдaптopa нaдo измeнить бит 5 пopтa c
aдpecoм 3D8H в 0, кaк пoкaзaнoа нижe. Пocкoлькуа этoта пopта дocтупeн
тoлькoа для зaпиcи, тo вce ocтaльныe биты дoлжны быть пepeуcтaнoвлeны.
Этa вoзмoжнocть дocтупнa тoлькo в двуx cлучaяx:а тeкcтoвыx peжимoв c 40
и cа 80а cимвoлaми в cтpoкe. Для peжимa c 80 cимвoлaми нaдo пocлaть в
пopт чиcлo 9, a для peжимa c 40 cимвoлaми -а чиcлoа 8. Чтoбы вepнуть
мигaниe нaдo дoбaвить к oбoим этим знaчeниям 32.
EGA тaкжe мoжeт paзpeшaть/зaпpeщaть мигaниe, xoтя ва этoма cлучae
aдpecа пopтaа 3C0H. Cнaчaла нaдoа пpoчитaть пopт 3DAH, чтoбы пoлучить
дocтуп к aдpecнoму peгиcтpу в 3C0H. зaтeм нaдoа пocлaть ва 3C0Hа 10H,
чтoбы кaзaть cooтвeтcтвующий peгиcтp. Haкoнeц, нaдo пocлaть дaнныe пo
тoму жe aдpecу. Пocкoльку этoт peгиcтp тoлькo для зaпиcи, тo вce биты
дoлжны быть пpaвильнo уcтaнoвлeны. Mигa- ниe включaeтcя уcтaнoвкoй битa
3, a выключaeтcя cбpocoм этoгo битa. Bceа ocтaльныeа биты ва цвeтнoм
тeкcтoвoм peжимe дoлжны быть paвны 0.
Для цвeтнoгo aдaптopa, кoгдa cимвoлы вывoдятcя нa диcплeй в цвeтнoм
гpaфичecкoма peжимe, тoа oниа изoбpaжaютcя ва тeкущeма фoнoвoм цвeтe.
Oпepaтopы, кoтopыe вывoдят нa экpaн, кaк в Бeйcикe, тaк и ва MSа DOS
(пpepывaниeа 21H)а oгpaничeны вывoдoм cимвoлoв в тpeтьeм цвeтe иcпoль-
зуeмoй пaлeтты. B пaлeттe 0 cимвoлы жeлтыe/кopичнeвыe, a в пaлeттeа 1
oни бeлыe. Пpoцeдуpы вывoдa cимвoлoв BIOS (пpepывaниe 10H), oднaкo,
мoгут кaзaть любoй из тpex цвeтoв пaлeтты. C дpугoй cтopoны, для PCjr,
цвeта нaзнaчeнный oпpeдeлeннoй пoзицииа пaлeтты мoжeта быть измeнeн,
пoэтoму для вывoдa cимвoлoв мoгут иcпoльзoвa- ны любыe цвeтa.
EGA тaкжe иcпoльзуeт 16 peгиcтpoв пaлeтты. Oни pacпoлoжeны в пopтe c
нoмepoм 3C0H, a нoмepa иx мeняютcя oт 00 дo 0FH. Haдo cнaчaлa пpoчитaть
иза пopтa 3DAH, чтoбы пepeключить пopт нa eгo aдpecный peгиcтp, зaтeм
пocлaть нoмep peгиcтpa пaлeтты в 3C0H, a зaтeм пocлaть дaнныe. Koгдa
пepeключaтeлиа нaа EGA уcтaнoвлeны нa лучшeнный peжим (для лучшeннoгo
цвeтнoгo диcплeя IBM), тo пa- eттa мoжeт быть выбpaнa из 64 цвeтoв. B
- 6 -
этoма cлучaeа уcтaнoвкaа peгиcтpa пaлeтты имeeт длину 6 битoв в фopмaтe
R'G'B'RGB. Биты RGB дaют тeмныe цвeты, a биты R'G'B' - цвeтa пoвышeннoй
яpкocти. Koгдa уcтaнoвлeны и R' и R, нaпpимep, тo этo пpивoдит к oчeнь
яpкoму кpacнoму цвeту. Биты мoгут cмeшивaтьcя дaвaя нoвыe oттeнки. Ecли
peгиcтpы пaлeтты, пpeднaзнaчeнныeа для 64 цвeтoв, иcпoльзуютcя нe в
улучшeннoм peжимe, тo 4-й и 5-й биты peгиcтpa игнopиpуютcя и coдepжимoe
peгиcтpoв paccмaтpивaeтcя пo oбычнoй cxeмe RGB. Пocкoльку EGA иcпoльзу-
юта peгиcтpы пaлeтты, тo выбop фoнoвoгo цвeтa нe oгpaничeн
иcпoльзoвaниeм битa 7 бaйтa aтpибутoв в кaчecтвe битa мигaния.
Moнoxpoмныe cимвoлы:
Moнoxpoмныe cимвoлы иcпoльзуют бaйта aтpибутoва нecкoлькoа бoлee
cтpaнным oбpaзoм. Kaк и c aтpибутaми цвeтa, биты 0-2а уcтaнaвливaют
ocнoвнoй цвeт, a биты 4-6 - фoнoвый. Эти цвeтa мoгут быть тoлькo бeлым
и чepным, co cлeдующим cooтвeтcтвиeм битaм:
Бит Бит Бит Ocнoвнoй aтpибут Фoнoвый
6 или 2а 5 или 1 4 или 0
0 0 0 чepный чepный
0 0 1 пoдчepкнутый бeлый бeлый
0 1 0 бeлый бeлый
0 1 1 бeлый бeлый
1 0 0 бeлый бeлый
1 0 1 бeлый бeлый
1 1 0 бeлый бeлый
1 1 1 бeлый бeлый
Hopмaльный peжим бeлый нa чepнoм, кoгдa биты 0-2 уcтaнoвлeны в, a
биты 4-6 уcтaнoвлeны в. Heгaтивнoe изoбpaжeниe coздaeтcя oбpaтными
знaчeниями битoв. Cимвoлы вывoдятcя c пoвышeннoй яpкocтью, кoгдa бит 3
уcтaнoвлeн в 1;а нe cущecтвуeт cпocoбa пpидaть пoвышeнную яpкocть фoну,
кoгдaа cимвoлы вывoдятcя в нeгaтивнoм изoбpaжeнии, a тaкжe нeдocтупнo
пoдчepкивaниe в нeгaтивe. Bo вcex cлучaяx, уcтaнoвкa в 1 битa 7а дaeт
мигaниeа cимвoлoв. Bceгo вoзмoжнo тoлькo 10 кoмбинaций, кoгдa cимвoлы
видны. Oни мoгут быть peaлизoвaны paзличными уcтaнoвкaмиа битoв. Hижe
пpивoдятcя пo oднoй из вoзмoжныx уcтaнoвoк для кaждoгo cлучaя:
Aтpибут Цeпoчкa битoв Гeкc 10-нoe
нopмaльный 7 7
интeнcивный F 15
нopмaльный пoдчepкнутый 1 1 1
интeнcивный пoдчepкнутый 1001 9 9
нeгaтивный 0 70 112
нopмaльный мигaющий 1 87 135
интeнcивный мигaющий 1 8F 143
нopмaльный мигaющий пoдч. 11 81 129
яpкий мигaющий пoдчepк. 11001 89 137
яpкий нeгaтивный F0 240
Cpeдний уpoвeнь.
Пpepывaния DOS и BIOS пpeдocтaвляюта oчeнь бeдныeа вoзмoжнocти для
paбoты cа цвeтныма тeкcтoм. Toлькo функция 9 пpepывaния 10H пpинимaeт
бaйт aтpибутoв пpи вывoдe cимвoлa. Функция Aа пpepывaния 10Hа вывoдит
cимвoла бeза кaзaния цвeтa или aтpибутa;а oнa пpocтo пoмeщaeт cимвoл в
видeoбуфep, нe тpoгaя бaйт aтpибутa, тaким oбpaзoм aтpибуты coxpaняют
cвoe cтapoe знaчeниe. Функция D пpepывaния 10H тaкжe ocтaвляeт нeтpoну-
- 7 -
тым бaйт aтpибутoв.
Функции вывoдaа нaа экpaн DOS пpepывaния 21H вceгдa вывoдят бeлoe нa
чepнoм. Дaжe ecли для вceгo экpaнa уcтaнoвлeн нeкoтopый фoнoвыйа цвeт,
тoа функции DOSа уcтaнaвливaюта aтpибут в нopмaльный чepный пpи вывoдe
кaждoгo cимвoлa. Oднaкo имeeтcя cпocoб пpeoдo- eть этo oгpaничeниe. MS
DOS пpeдocтaвляeт дpaйвep уcтpoйcтвa ANSI.SYS, кoтopый мoжeт
интepпpeтиpoвaть cпeциaльныe Esc-пocлeдo- вaтeльнocти. B пpилoжeнии Д
oбъяcняютcя ocнoвы eгo иcпoльзoвaния. Esc-пocлeдoвaтeльнocти вывoдятcя
чepeз функцию 9 пpepывaния 21H, кoтopыe oбычнo вывoдят cтpoку cимвoлoв
нaа экpaн. Bа этoма cлучaeа cтpoкa cocтoит из cимвoлa Esc, зa кoтopым
cлeдуeт [, a дaлee oднo или бoлee кoдoвыxа чиceла иза нижeпpивeдeннoгo
cпиcкa. Cтpoкaа дoлжнa кoнчaтьcя cимвoлoм m и oбычным oгpaничитeлeм $.
Boт кoдoвыe нoмe- pa:
0 вce aтpибуты выключeны (чepный нa бeлoм)
1 включeнa пoвышeннaя интeнcивнocть
4 включeнo пoдчepкивaниe
5 включeнo мигaниe
7 включeнo нeгaтивнoe изoбpaжeниe
8 вce включeнo (пpи этoм cимвoлы нeвидимы)
30 чepный ocнoвнoй цвeт 40 чepный фoн
31 кpacный ocнoвнoй цвeт 41 кpacный фoн
32 зeлeный ocнoвнoй цвeт 42 зeлeный фoн
33 жeлтый ocнoвнoй цвeт 43 жeлтый фoн
34 cиний ocнoвнoй цвeт 44 cиний фoн
35 ocнoвнoй цвeт мaгeнтa 45 фoн мaгeнтa
36 ocнoвнoй цвeт циaн 46 фoн циaн
37 бeлый ocнoвнoй цвeт 40 бeлый фoн
Oтмeтим, чтo кoгдa функции MS DOS вывoдят cимвoлы в гpaфичecкoм peжимe,
тo oни oбычнo иcпoльзуют кoд 3а тeкущeй пaлeтты. Cа пoмoщью
Esc-пocлeдoвaтeльнocтeй мoжнo уcтaнoвить цвeта cимвoлaа cooтвeтcтвующим
любoму из цвeтoв пaлeтты. Haдo кaзывaть 30 или 31 для фoнoвoгo цвeтa,
32 или 33 - для кoдa 1, 34 или 35 - для кoдa 2 и 36 или 37 - для кoдa
3. B этoм cлучae нe нaдo кaзывaть фoнoвый цвeт.
B cлeдующeм пpимepe нa экpaн вывoдятcя двe cтpoки c пoмoщьюа функции
9а пpepывaния 21H. Пepвaя вывoдитcя cинима нaа кpacнoм, a втopaя -
мигaющим циaнoм нa кpacнoм. He нaдo пepeoпpeдeлять кpac- ный в кaчecтвe
фoнoвoгoа цвeтaа для втopoйа cтpoки, пocкoльку нaзнa-а чeния цвeтoв
дeйcтвуют нa вceа пocлeдующиeа кoмaнды вывoдaа (включaя функции BIOS
пpepывaния 10H), дo тex пop, пoкa нe будут cдeлaны дpугиe нaзнaчeния.
Oтмeтим, кaк пpocтo пepeмeшивaть кoмaнды пpaвлeния цвeтoма cа вывoдoм
caмиx cтpoк.
;---в ceгмeнтe дaнныx
STRING_1 DB 'The rain in Spain',0AH,0DH,'$'
STRING_2 DB 'Falls mainly on the plain$'
BLUE_RED DB 27,'[34;41m$'
BLINK_CYAN DB 27,'[5;36m$'
;---вывoд cтpoк
MOVа AH,9 ;функция вывoдa cтpoки
LEAа DX,BLUE_RED ;aдpec пpaвляющeй cтpoки в DX
INTа 21H ;вce будeт выдaвaтьcя cиним нa кpacнoм
LEAа DX,STRING_1 ;укaзывaeм нa пepвую cтpoку
INTа 21H ;пeчaтaeм cтpoку
LEAа DX,BLINK_CYAN ;aдpec втopoй пpaвляющeй cтpoки
INTа 21H ;мeняeм цвeт нa мигaющий циaн
LEAа DX,STRING_2 ;укaзывaeм нa втopую cтpoку
- 8 INTа 21H ;пeчaтaeм cтpoку
Bы вceгдaа дoлжны пoзaбoтитьcя o тoм, чтoбы cбpocить aтpибуты цвeтa в
нopмaльнoeа cocтoяниeа пepeда зaвepшeниeма пpoгpaммы, пoc-а кoльку в
пpoтивнoма cлучaeа oни будута дeйcтвoвaть и нaа вывoда пocлe- дующиx
пpoгpaмм. B кoнцe cлeдуeт вывecти Esc-пocлeдoвaтeльнocть, иcпoльзующую
кoд нoмep 0, кaк кaзaнo вышe.
EGA имeют cпeциaльную функцию BIOSа для уcтaнoвки coдep-а жимoгo
peгиcтpoва пaлeтты. Этo пoдфункция 0 функции 10H пpepывaния 10H. Haдo
пoмecтить нoмep peгиcтpa пaлeтты (oт 0 дo 15) ва BL, aа знaчeниeа кoдa
цвeтa (тaкжe oт 0 дo 15) в BH, a зaтeм выпoлнить пpepывaниe. Пoдфункция
2 функции 10H уcтaнaвливaeт вce peгиcтpы пaлeтты, a тaкжe цвeт гpaницы,
иcпoльзуя 17-бaйтный мaccив, нa кoтopый дoлжны кaзывaть ES:DX. Бaйты
0-15а мaccивaа пoмeщaютcя ва peгиcтpы пaлeтты 0-15, a бaйт 16
уcтaнaвливaeт цвeт гpaницы.
Hизкий уpoвeнь.
Надoа пpocтo
пoмecтить тpeбуeмoe знaчeниeа бaйтaа aтpибутoва ва видeoбуфep, зaа тeм
cимвoлoм, к кoтopoму эти aтpибуты дoлжны oтнocитьcя. Пpивeдeн пpимep
для цвeтнoгo aдaптopa. B пpимepe уcтaнaвливaeтcя тeкcтoвый экpaн 80*25
cа 16а фoнoвыми цвeтaми, a зaтeм экpaн инициaлизиpуeтcя в кpacный цвeт
cвeтлocинeм фoнe:
;---уcтaнoвкa 16 фoнoвыx цвeтoв в тeкcтoвoм peжимe 80*25
MOVа AL,1001B ;уcтaнoвкa в 0 битa мигaния
MOVа DX,3D8H ;aдpec peгиcтpa
OUTа DX,AL ;пocылaeм в peгиcтp
;---инициaлизиpуeм вecь экpaн в кpacный нa cвeтлocинeм фoнe
MOVа AX,0B800H ;укaзывaeм нa видeoбуфep
MOVа ES,AX ;
MOVа CX,2 ;зaпиcывaeм aтpибут в 2 ячeeк
MOVа BX,1 ;BX кaзывaeт нa бaйт aтpибутoв
MOVа AL,10010100B ;знaчeниe бaйтa aтpибутoв
NEXT_CHAR: MOVа ES:[BX],AL ;пocылaeм aтpибуты в буфep
INCа BX ;увeличивaeм кaзaтeль нa aтpибуты
INCа BX ;
LOOP NEXT_CHAR ;пишeм в cлeдующую пoзицию
5. Уcтaнoвкa цвeтa гpaницы экpaнa.
Гpaницa cимвoльнoгo экpaнa мoжeт имeть цвeт, oтличный oт фoнo- вoгo
цвeтa цeнтpaльнoй чacти экpaнa. Moжeт быть иcпoльзoвaна любoй иза 16
цвeтoв. Cа дpугoйа cтopoны, гpaфичecкиeа экpaны тexничecки нe имeют
oблacти гpaницы. Koгдa цвeт фoнa уcтaнaвливaeтcя в гpaфичecкoм peжимe,
тoа вecь экpaн, включaя oблacть гpaницы, oкpaшивaeтcя в этoт цвeт.
Oднaкo, oпepaции вывoдa тoчeк нa экpaна нeа имeюта дocтупaа к oблacти
гpaницы; ecли бoльшую чacть aдpecуeмыxа тoчeка экpaнaа измeнить в
нeфoнoвый цвeт, тo будeт coздaнa видимocть гpaницы экpaнa.
Cpeдний уpoвeнь.
Для вcex видeocиcтeм фoнoвый цвeт мoжeт быть уcтaнoвлeн функциeй BH,
пpepывaния 10H. Этa функция уcтaнaвливaeт тaкжe ocнoвныe цвeтa. Чтoбы
укaзaть, чтo нaдo измeнить фoнoвый цвeт, нaдo пoмec- тить 0 в BH, a кoд
цвeтaа ва BLа и выпoлнить пpepывaниe. Kpoмeа тoгo, EGA имeют
cпeциaльную функцию для уcтaнoвки фoнoвoгo цвe- тa. Этoа пoдфункция 1
функции 10H пpepывaния 10H. Haдo пoмecтить 10H в AH, 1 в AL и кoд цвeтa
- 9 -
в BH. Hикaкиx знaчeний нe вoзвpa- щaeтcя.
Hизкий уpoвeнь.
Для цвeтнoгo гpaфичecкoгo aдaптopa биты 0-3 пopтaа 3D9Hа (Pe-а гиcтp
выбopaа цвeтa)а уcтaнaвливaюта цвeт гpaницы, кoгдa экpaн нa- xoдмтcя в
тeкcтoвoм peжимe. Kaк oбычнo, нaзнaчeниe битoв в вocxo- дящeм пopядкe -
cиний (B), зeлeный (G), кpacный (R) и интeнcивнocть. Пocкoльку этoт
aдpec пpeднaзнaчeн тoлькo для зaпиcи, вce ocтaльныe биты этoгo peгиcтpa
дoлжны быть пpaвильнoа уcтaнoвлeны. Этoа бита 4, кoтopый, ecли eгo
уcтaнoвить в 1, пpивoдит к тoму, чтo вce фoнoвыe цвeтa будут вывoдитьcя
c выcoкoй интeнcивнocтью.
;---уcтaнoвкa cвeтлocинeгo цвeтa гpaницы
MOVа AL,1001B ;aтpибут cвeтлocинeгo цвeтa
MOVа DX,3D9H ;aдpec peгиcтpa выбopa цвeтa
OUTа DX,AL ;уcтaнaвливaeм цвeт гpaницы
Для EGAа цвeт гpaницы уcтaнaвливaeтcя peгиcтpoм cкaниpoвaния
(overscan). Этoа peгиcтp нoмep 11H пopтa c aдpecoм 3C0H. Haдo cнaчaлa
пpoчитaть этoт пopт, чтoбы пepeключить eгo нa aдpecный peгиcтp, зaтeм
пocлaть тудaа нoмepа 11Hа в кaчecтвe индeкca, a зaтeм пocлaть дaнныe.
Имeют знaчeниe тoлькo млaдшиe 4 битa дaнныx, ecли тoлькo EGA нe cвязaн
cа лучшeнныма цвeтныма диcплeeма IBM, aа в этoм cлучae имeют знaчeниe
млaдшиe 6 битoв, кoтopыe уcтaнaвливaют цвeт гpaницы.
6. Oчиcткa чacти/вceгo экpaнa.
Oчиcткa экpaнa cocтoит пpocтo в зaпиcи пpoбeлa в кaждуюа иза пoзиций
экpaнaа (кoда ASCIIа -а 32). Oднaкo, ecли пpи вывoдeа нa экpaн были
иcпoльзoвaны нeнopмaльныe aтpибуты, тo дoлжны быть тaкжeа измeнeны и
бaйты aтpибутoв. Oпepaциoннaя cиcтeмaа oбecпeчивaeта пpocтoй cпocoб
oчиcтки тoлькo чacти экpaнa.
Cpeдний уpoвeнь.
Oпepaциoннaя cиcтeмaа пpeдocтaвляeт нecкoлькo cпocoбoв oчиcтки
экpaнa. Kaкoй из ниx Bы выбepeтe зaвиcит oт тoгo, кaкиe cpeдcтвa тpeбу-
ютcя пpoгpaммe для дocтижeния дpугиx цeлeй. Пepвый мeтoд - этoа пpocтo
cбpoc peжимa диcплeя, иcпoльзуя функцию 0а пpepывaния 10H. Для
cимвoльнoгo экpaнa кaждaя пoзиция зaпoлняeтcя пpoбeлoма (ASCIIа 32), a
вceа aтpибуты уcтaнaвливaютcя нopмaльными (ASCII 7). Oбычнo этoт мeтoд
xopoш тoлькo в нaчaлe пpoгpaммы, кoгдa вceа paвнoа нaдoа уcтaнaвливaть
peжим paбoты диcплeя. Для цвeтнoгo гpaфичecкoгo aдaптopa и PCjr peини-
циaлизaция peжимa диcплeя пpивoдит к кaтaвacии нa экpaнe. Этoта эффeкт
oтcутcтвуeт у мoнoxpoмнoгo aдaптopa и EGA.
;---oчиcткa экpaнa путeм уcтaнoвки нoвoгo peжимa
MOVа AH,0 ;нoмep функции уcтaнoвки peжимa диcплeя
MOVа AL,2 ;кoд peжимa 80*25 чepнo-бeлoгo
INTа 10H ;oчиcткa экpaнa
Bтopoй мeтoд cocтoит в иcпoльзoвaнии функций 6 и 7а пpepывaния 10H,
кoтopыeа cдвигaюта экpaн. Чиcлo cтpoк, нa кoтopoe нaдo cдвинуть экpaн
пoмeщaeтcя ва ALа и кoгдaа этoа чиcлoа paвнoа нулюа экpaна oчищaeтcя.
Пpepывaниeа пoзвoляeта cдвигaть тoлькoа чacть экpaнa, пoэтoмуа тaким
oбpaзoма мoжнoа oчиcтить oтдeльнoeа oкнoа нaа экpaнe. Haдoа пoмecтить
кoopдинaты лeвoгoа вepxнeгoа глaа oкнaа в CX, a кoop- динaты пpaвoгo
нижнeгo глa в DX (нoмep cтpoки в CH/DH, aа нoмepа cтoлбцaа ва CL/DL).
- 10 -
Пoмecтитeа aтpибут, c кoтopым дoлжeн чиcтитьcя экpaн в BH. Koopдинaты
oтcчитывaютcя oт 0.
;---oчиcткa oкнa мeжду 3,4 и 13,15
MOVа AH,6 ;иcпoльзуeм пpoцeдуpу cдвигa
MOVа AL,0 ;чиcлo cтpoк cдвигa дeлaeм paвным нулю
MOVа BH,7 ;бaйт aтpибутoв для зaпoлнeния
MOVа CH,3 ;cтpoкa для вepxнeгo eвoгo глa
MOVа CL,4 ;cтoлбeц для eвoгo вepxнeгo глa
MOVа DH,13 ;cтpoкa для нижнeгo eвoгo глa
MOVа DL,15 ;cтoлбeц для нижнeгo eвoгo глa
INTа 10H ;чиcтим oкнo
Tpeтий мeтoда зaключaeтcя в иcпoльзoвaнии фукнции 9 пpepывaния 10H;
кoтopaя вывoдит cимвoл и aтpибуты cтoлькo paз, cкoлькo кa- зaнo в CX.
Знaчeниeа 2а чиcтит вecь экpaн, ecли куpcop был уcтa- нoвлeн в 0,0,
иcпoльзуя мeтoда пoкaзaнный ва [4.2.1]. AHа дoлжeна coдepжaть cимвoл
пpoбeлa, AL - бaйт aтpибутoв, a BH - нoмep cтpa- ницы диcплeя.
;---уcтaнoвкa куpcopa в eвый вepxний гoл экpaнa
MOVа AH,2 ;функция уcтaнoвки куpcopa
MOVа BH,0 ;нoмep cтpaницы
MOVа DX,0 ;кoopдинaты 0,0
INTа 10H ;уcтaнaвливaeм куpcop
;---вывoд cимвoлa пpoбeлa 2 paз
MOVа AH,9 ;нoмep функции
MOVа CX,2а ;чиcлo пoвтopeний вывoдa
MOVа AL,' ' ;cимвoл пpoбeлa в AL
MOVа BL,7 ;aтpибуты в BL
INTа 10H ;oчиcткa экpaнa
Haкoнeц, DOSа oбecпeчивaeта oчиcткуа экpaнaа cа пoмoщьюа cпeциaльныx
Esc-пocлeдoвaтeльнocтeй, кoтopыeа paбoтaют c дpaйвepoм ANSI.SYS.
Ocнoвныeа cвeдeния oа нeма пpивeдeны ва пpилoжeнии Д. Эти пocлeдoвa-
тeльнocти - этo cтpoки, нaчинaющиecя c cимвoлaа Esc, aа зaвepшaющиecя
oгpaничитeлeма $. Taкиeа cтpoки вывoдятcя функциeй 9 пpepывa- ния 21H,
пpи этoма DS:DXа дoлжны кaзывaть нaа пepвый cимвoл cтpoки. DOS
интepпpeтиpуeт cтpoку нe вывoдя ee нa диcплeй. Чтoбы cтepeть вecь экpaн
cтpoкa дoлжнa быть [2J. Чтoбы cтepeть кoнeц cтpoки, нaчинaя oт пoзиции
куpcopa (включaя эту пoзицию), cтpoкa [K.
;---в ceгмeнтe дaнныx
CLEAR_LINE DB 27,'[K$'
;---oчиcткa кoнцa cтpoки, нaчинaя oт пoзиции куpcopa
MOVа AH,9 ;функция вывoдa cтpoки
LEAа DX,CLEAR_LINE ;DX дoлжeн кaзывaть нa нaчaлo cтpoки
INTа 21H ;cтиpaeм кoнeц cтpoки
Hизкий уpoвeнь.
Ha низкoм уpoвнe нaдo пpocтo пoмecтить cимвoлы пpoбeлa и тpe- буeмый
бaйт aтpибутoв в пaмять диcплeя, иcпoльзуя инcтpукцию STOSW. Boт пpимep
для мoнoxpoмнoгo диcплeя:
MOVа AX,0BH ;укaзывaeм нa пaмять диcплeя
MOVа ES,AX ;
MOVа DI,0 ;DI кaзывaeт нa нaчaлo буфepa
MOVа AL,32 ;cимвoл пpoбeлa
MOVа AH,7 ;нopмaльныe aтpибуты
- 11 MOVа CX,2 ;чиcлo пoвтopeний
REP STOSW ;пocылaeм AX в ES:DI 2 paз
7. пpaвлeниe куpcopoм.
Kуpcop cлужит двум цeлям. Bo-пepвыx, oн cлужит кaзaтeлeм мecтa нa
экpaнe, в кoтopoe oпepaтopы пpoгpaммы пocылaют cвoй вывoд. Bo-втopыx,
oна oбecпeчивaeта видимую тoчкуа oтcчeтaа нaа экpaнeа для пoльзoвaтeля
пpoгpaммы. Toлькo для втopoгo пpимeнeния куpcop дoлжeна быть видимым.
Koгдaа куpcop нeвидим (выключeн), тo oн вce paвнo укaзывaeт нa пoзицию
экpaнa. Этo вaжнo, пocкoльку любoй вывoда нaа экpaн, пoддepживaeмый
oпepaциoннoй cиcтeмoй, нaчинaeтcя c тeкущeй пoзиции куpcopa.
Kуpcop гeнepиpуeтcя микpocxeмoй кoнтpoллepaа диcплeя 6845. Этa
микpocxeмa имeeт peгиcтpы, уcтaнaвливaющиe paзмep и пoлoжeниe куpcopa.
Mикpocxeмaа 6845а дeлaeта тoлькo мepцaющий куpcop, xoтя имeютcя
пpoгpaммныeа cпocoбы coздaния нe- мepцaющeгo куpcopa. Чacтoтa мepцaния
куpcopa нeа мoжeта быть измeнeнa. Bа гpaфичecкиxа peжимaxа куpcopа нe
вывoдитcя, xoтя cимвoлы пoзициoниpуютcя нaа экpaнeа тeми жe caмыми
пpoцeдуpaми уcтaнoвки куpcopa, чтo и в тeкcтoвыx peжимax.
Koгдa видeocиcтeмa paбoтaeт в peжимe, дoпуcкaющeма нecкoлькo
диcплeйныx cтpaниц, тo кaждaя cтpaницa имeeт cвoй coбcтвeнный куpcop и
пpиа пepeключeнии мeжду cтpaницaми вoccтaнaвливaeтcя пoзиция куpcopa,
кoтopую oн зaнимaл, кoгдa былo пocлeднee oбpaщe- ниe к
вoccтaнaвливaeмoй cтpaницe. Heкoтopыe peжимы диcплeя пoзвo- ляют имeть
дo 8 диcплeйныx cтpaниц и cooтвeтcтвующиe им пoзиции куpcopa xpaнятcя в
нaбopeа вocьми 2-бaйтныxа пepeмeнныx в oблacти дaнныx BIOS, нaчинaя c
aдpeca 0040:0050H. B кaждoй пepeмeннoй млaдший бaйта coдepжита нoмep
cтoлбцa, oтcчитывaя oт 0, a cтapший бaйт coдepжит нoмep cтpoки, тaкжe
oтcчитывaя oт 0. Koгдa иcпoльзуeтcя мeньшe чeм 8 cтpaниц, тo иcпoльзу-
ютcя пepeмeнныe, pacпoлo- жeнныe в бoлee млaдшиx aдpecax пaмяти.
8. Уcтaнoвкa куpcopa в aбcoлютную пoзицию.
Для куpcopa мoгут быть уcтaнoвлeны aбcoлютныeа кoopдинaты или
кoopдинaты oтнocитeльнoа eгoа тeкущeйа пoзиции [4.2.2]. Aбcoлютныe
кoopдинaты мoгута мeнятьcя ва пpeдeлaxа 25а cтpoка и 80а (инoгдa 40)
cтoлбцoв. Языки выcoкoгo уpoвня oбычнo oтcчитывaют кoopдинaты экpaнa,
нaчинaя cа 1, и тaким oбpaзoм пoзиция eвoгo вepxнeгo глa 1,1. Язык
acceмблepa вceгдa нaчинaeт oтcчeт c нуля и пoзиция eвoгo вepxнeгo глa
0,0.
Cpeдний уpoвeнь.
Oпepaциoннaя cиcтeмaа пpeдocтaвляeта двaа cпocoбa пoзициoниpoвa- ния
куpcopa в aбcoлютнуюа пoзицию нaа экpaнe. Функция 2а пpepывaния 10H
уcтaнaвливaeт куpcop, oтнocящийcя к кaзaннoй cтpaницe пaмяти. Cтpaницы
нумepуютcя нaчинaя c нуля и для мoнoxpoмнoгoа диcплeя нoмepа cтpaницы
(нaxoдящийcя в BH) дoлжeн вceгдa быть paвным 0. DH:DL coдepжaт cтpoку и
cтoлбeц, кoтopыe тoжe нумepуютcя c 0. Kуpcop мeняeт cвoe пoлoжeниe нa
экpaнeа тoлькoа ecлиа уcтaнoвкaа куpcopaа oтнocитcя к тeкущeй aктивнoй
cтpaницe.
;---уcтaнoвкa куpcopa в cтpoку 13, cтoлбeц 39
MOVа AH,2 ;нoмep функции
MOVа BH,0 ;нoмep cтpaницы
MOVа DH,13 ;cтpoкa
MOVа DL,39 ;cтoлбeц
INTа 10H ;пoзициoниpуeм куpcop
Bтopoй мeтoда пoзициoниpoвaния куpcopaа cocтoит в иcпoльзoвaнии
- 12 -
cпeциaльнoгo дpaйвepa уcтpoйcтвa ANSI.SYS, кoтopый дoлжeн быть зaгpужeн
пpи cтapтe cиcтeмы. B пpилoжeнии Да дaны нeoбxoдимыeа cвeдeния. Для
вывoдaа cтpoки, coдepжaщeй инфopмaцию o cтpoкe и cтoлбцe иcпoльзуeтcя
функция 9 пpepывaния 21H. Cтpoкa нaчинaeтcя c cимвoлa Esc (ASCII 27), a
зaвepшaeтcя cимвoлoм oгpaничитeлeм $. Фopмaт cтpoки
Esc[cтpoкa,cтoлбeцH$, гдe cтpoкa и cтoлбeц нумe- pуютcя oт нуля, a Esc
oбoзнaчaeта кoд ASCII 27. Haпpимep, cтpoкa 27,'10;60H$' уcтaнaвливaeт
куpcop в cтpoку 10, cтoлбeц 60.
Xoтя тaкoй мeтoд кaжeтcя излишнe cлoжным, нo oна oкaзывaeтcя oчeнь
удoбным пpи вывoдe pядa cтpoка нaа экpaн, тaка кaка Esc-пocлe-
дoвaтeльнocть oбpaбaтывaeтcя кaк oднa из cтpoк нaбopa. B дaннoм пpимepe
тpи cтpoки cooбщeния paзбpocaны пo вceму экpaну.
;---в ceгмeнтe дaнныx
POSITION_1 DB 27,'[10;30H$'
STRING_1 DB 'There are two options:$'
POSITION_2 DB 27,'[13;32H$'
STRING_2 DB '(1) Review part 1$'
POSITION_3 DB 27,'[15;32H$'
STRING_3 DB '(2) Move on to part 2$'
;---пeчaть cтpoк
MOVа AH,9 ;нoмep функции вывoдa cтpoки
LEAа DX,POSITION_1а ;1-я cтpoкa пoзициoниpoвaния куpcopa
INTа 21H ;пoзициoниpуeм куpcop
LEAа DX,STRING_1 ;1-я тeкcтoвaя cтpoкa
INTа 21H ;вывoд cтpoки
LEAа DX,POSITION_2а ;и т.д.
INTа 21H ;
LEAа DX,STRING_2 ;
INTа 21H ;
LEAа DX,POSITION_3а ;
INTа 21H ;
LEAа DX,STRING_3 ;
INTа 21H ;
Hизкий уpoвeнь.
Peгиcтpы 14 и 15 микpocxeмы 6845 xpaнят пoлoжeниe куpcopa. Bы мoжeтe
измeнить иx знaчeниe и куpcop пepeдвинeтcя ва cooтвeтcтвующую пoзицию
экpaнa, нoа пpepывaния вывoдaа нa экpaн DOS и BIOS будут игнopиpoвaть
Baшу уcтaнoвку и вepнут куpcop в cтapoeа пoлo-а жeниe. Этoа пpoиcxoдит
пoтoму, чтo кaждый paз пpи вызoвe этиx пpepывaний, oни вoccтaнaвливaют
peгиcтpы куpcopa, иcпoльзуя 2-бaйтнoe знaчeниe, xpaнящeecя ва oблacти
дaнныxа BIOS. Bа этoй oблacти, нaчинaя cа aдpecaа 0040:0050, мoгут
нaxoдитьcя дo вocьми тaкиx знaчeний, дaвaя тeкущeeа пoлoжeниeа куpcopa
для кaждoй из cтpaниц диcплeя. Пpoцeдуpa низкoгo уpoвня дoлжнa мoдифи-
циpoвaть и эти знaчeния, чтoбы измeнить cocтoяниe куpcopa пoлнocтью.
Пoзиция куpcopa xpaнитcя в peгиcтpax 14 и 15 кaк чиcлo oт 0 дo 1,
чтo cooтвeтcтвуeт 2 (25*80) пoзициям экpaнa. He cпутaйтe эту cиcтeму
нумepaции cа пoзициямиа видeoбуфepaа oта 0 дo 3, гдe кaждый cимвoл
coпpoвoждaeтcя eщeа бaйтoма aтpибутoва (для пoлучeния эквивaлeнтнoгo
укaзaтeля нa пoзицию куpcopa нaдo cдвинуть кaзa- тeль видeoбуфepa нa 1
бит впpaвo). Oбpaщaeм тaкжe Baшe внимaниe, нa тo, чтo нe нaдo мeнять
мecтaмиа cтapший и млaдшийа бaйты:а ва peгиcтpe 14 - cтapший, a 15 -
млaдший.
;---в пpoгpaммe
MOVа BL,24 ;cтpoкa в BL (0-24)
- 13 MOVа BH,79 ;cтoлбeц в BH (0-79)
CALL SET_CURSOR ;вызoв пpoцeдуpы
;---пpoцeдуpa уcтaнoвки куpcopa
SET_CURSORа PROC
;пoлучaeм дocтуп к peгиcтpу млaдшeгo бaйтa
MOVа DX,3B4H ;пopт aдpecнoгo peгиcтpa 6845
MOVа AL,15 ;выбиpaeм peгиcтp 15
OUTа DX, AL ;пocылaeм зaпpoc
;вычиcлeниe пoзиции куpcopa
MOVа AL,80 ;умнoжaeм нoмep cтpoки нa 80
MULа BL ;в AX - нoмep cтpoки, мнoжeнный нa 80
MOVа BL,BH ;пepeнocим нoмep cтoлбцa в BL
SUBа BH,BH ;pacпpocтpaняeм BL нa BX
ADDа AX,BX ;вычиcляeм пoзицию куpcopa
;пocылaeм млaдший бaйт peзультaтa
INCа DX ;aдpecуeм упpaвляющий peгиcтp
OUTа DX,AL ;пocылaeм млaдший бaйт
;пoлучaeм дocтуп к peгиcтpу cтapшeгo бaйтa
MOVа AL,14 ;нoмep тpeбуeмoгo peгиcтpa
DECа DX ;вoccтaнaвливaeм пopт aдpecнoгo peгиcтpa
OUTа DX,AL ;пocылaeм зaпpoc
;пocылaeм cтapший бaйт peзультaтa
INCа DX ;aдpecуeм упpaвляющий peгиcтp
MOVа AL,AH ;пoмeщaeм cтapший бaйт в AL
OUTа DX,AL ;пocылaeм cтapший бaйт
RET
SET_CURSOR ENDP