Скачайте в формате документа WORD

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

Лекция 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