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

Сдавался/использовался1996г., Новочеркасск, НГТУ
Загрузить архив:
Файл: sts_prog.zip (171kb [zip], Скачиваний: 74) скачать

Лекция 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,размещаются в большом блоке, по-

лучившем название системного. Системный блок включает все необходимые

компоненты,позволяющие компьютеру работать без каких-либодополне-

ний. Здесь находятся микропроцессор, первые 64К памяти и "встроенные"

программы, такие как интерпретатор языка Бейсик, записанный в микрос-

хемах ПЗУ.

       Системный блок расположен в основании IBM/PC и заключен  вкор-

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

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

дено в состав компьютера. Блоки расширения вставляются в эти разъемы,

располагаясь над системным блоком.

       Блоки расширенияили карты,как их иногда называют - могут ис-

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

могутиспользоваться для двух основных целей:для увеличения объема

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

       Системный блок разработан фирмой "IBM", а блоки расширения могут

разрабатывать все желающие,при условии что они будут соблюдатьос-

новные правила,касающиеся размеров, электрических параметров соеди-

нений, теплового режима и так далее.

       Любые дополнительныеустройства подключаются к IBM/PC с помощью

одного из разъемов расширения,каждый из которых имеет62  соедини-

тельных провода. Эти 62 линии позволяют передавать все сигналы, необ-

ходимые для управления любым оборудованием,которое может быть подк-

лючено к IBM/PC.Все линии работают параллельно,так что устройства

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

одному из блоков расширения,передается и всем остальным,поскольку

они подключены к параллельным линиям.Здесь имеетместо  расширение

идеи общей шины данных: все блоки расширения используют общее 62-про-

водное соединение. называемое каналом ввода/вывода.

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

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

блокам расширения с различными номиналами напряжений.

       Далее, еще восемь линий используетсядляпередачи  восьмибит

данных на/с шины данных. Все данные проходят по этой шине, независимо

от направления передачи.

       Еще двадцать линий предназначены для адресации. При работе с па-

мятью используются все 20 линий,это позволяет передать адресодной

из 1024К ячеек памяти. Для устройств ввода/вывода используется только

девять линий, что позволяет адресовать 512 различных устройств.

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

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

ния из памяти,записи в память или команды чтения/записи для перифе-

рийных устройств.

       Внутри корпуса IBM/PC спрятаны два набора переключателей. Их на-

зывают переключателями конфигурации системы  (онивыполненыввиде

корпусас двумя рядами выводов,т.е.  корпуса типа DIP).Установка

этих переключателей указывает какое оборудование подключено к IBM/PC,

например,количество дисководов,объем доступной памяти и т.д.Эти

переключатели ничем реально не управляют -онииспользуются  только

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

ложение этих переключателей и затем устанавливают содержимоке опреде-

ленных ячеек памяти в соответствии с их положением.  Затем,если ка-

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

проверяется содержимое этих ячеек.

    Одним из основных элементов компьютера,  позволяющим емунормально


                                     - 3 -

  функционировать,является память. Внутренняя память компьютера явля-

ется временным рабочим пространством;в отличие от неевнешняяпа-

мять,такая  как файл на дискете,  предназначена для долговременного

хранения информации.Информация во внутренней памяти несохраняется

при выключении питания.

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

нахождения.Поскольку адреса - это те же числа,компьютер может ис-

пользовать арифметические операции для вычисления адресов памяти.

       IBM/PC используетвозможностиадресации  микропроцессора8088

полностью. Адреса в 8088 имеют длину 20 бит, следовательно, процессор

позволяет адресовать два в двадцатой степени байта или 1024 К.

                 2. Основные микросхемы

     Главной микросхемой является сам микропроцессор. Рядом с микропро-

цессором предусмотрено место для микросхемы 80287,числового сопроцес-

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

по выполнению очень быстрых (и с повышенной точностью)вычисленийнад

числами с плавающей точкой.Числовой сопроцессор устанавливается срав-

нительно небольшое количество РС, однако почти все члены семейства пре-

дусматривают гнездо для его установки.

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

ций синхронизации в компьютере. Одна из них называется генератором так-

товых (или синхронизирующих) сигналов и используется, прежде всего, для

получения тактов, которые управляют основным рабочим циклов компьютер в

АТ номером его идентификации является 88248. В любом случае эта микрос-

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

компьютера для установки основного рабочего темпа. В микросхеме генера-

торатактовых сигналов используется кварцевый кристалл в качестве точ-

ной основы для синхронизации. Наш генератор тактовых сигналов подразде-

ляетсверхбыстрые такты кристалла в быстрые такты,  требующиеся компь-

ютеру,и преобразует их в форму,приемлемую для использования другими

компонентами схемы.

     С генератором тактовых сигналов близко связана микросхема програм-

мируемого таймера,  идентифицируемая номером 8253. Программируемый тай-

мер может порождать другие сигналы синхронизации.Можно изменятьско-

рость выдачи сигналов, что делает эту микросхему "программируемой". Для

осуществления регулировки этим потоком информации в компьютерах предус-

мотрен микропроцессор контроллера шины. В РС эта микросхема имеет номер

8288,а в АТ - 82288.Задача контроллера шины состоитвтом,  чтобы

обеспечить нормальную работу шины.

     Некоторые компоненты компьютера (в частности, дисководы) могут об-

мениватьсяданными непосредственно через кмпьютерную память,  без про-

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

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

росхема, предназначенная для управления этим процессом, которая называ-

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

     Прерывания контролируются специальной микросхемой (8259). В компь-

ютерах  прерыванияпоступаютс различной степенью важности и одной из

задач контроллера прерываний 8259 является отслеживанияихв  порядке

приоритетов, а также фиксация каких-либо задержанных прерываний.

     К другим основным микросхемам относится микросхема программируемо-

гоинтерфейсапериферийных  устройств (номер - 8255).Эта микросхема

следит за работой некоторых изболее  простыхпериферийныхустройств

компьютера,таких как порт кассетной ленты. Однако большинство перифе-

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

они могли регулироваться простой обычной схемой.

     К таким сложным устройствам относятся приводы гибких  дисков.Ос-

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


                                     - 4 -

приводами гибких дисков,  является контроллер гибкого диска PD765.  Для

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

ронно-лучевой трубки 6845.

     3. Специальные свойства микропроцессора 286

     В реальном режиме специальные возможности и характеристики микроп-

роцессора 286 не проявляются, поэтому компьютер с микропроцессором 286,

функционирующем в реальном режиме,может быть полностью совместимымс

обычным РС.Для того, чтобы воспользоваться дополнительными возможнос-

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

     В защищенном режиме микропроцессор 286 обладает рядом дополнитель-

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

торымикомпьютер может работать одновременно.Это достигается за счет

четырех основных средств:  защиты (которая определяет наименование дан-

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

ти.

     Защита позволяет операционной системе воздвигать барьеры для защи-

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

операционной  системы.В стандартном РС ими при работе микропроцессора

286 в реальном режиме отдельная прорамма может испортить работуопера-

ционной  системыили какой-либо другой программы,использующей компь-

ютер,либо даже заблокировать весь компьютер, остановив его функциони-

рование. Защищенный режим работы микропроцессора 286 позволяет операци-

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

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

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

программы и блокировка ею машины не играет столь уж большой роли. Одна-

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

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

некорректно работающих программ.Средство защиты делает это возможным.

Защищенный режим работы микропроцессора 286 предоставляет больший объем

памяти,причем это достигается двумя путями. Во-первых, за счет расши-

ренной  памяти:микропроцессор 286 позволяет устанавливать в компьютер

до шестнадцати миллионов байтов рабочей памяти. Во-вторых, за счет вир-

туальной памяти:  микропроцессор 286 может имитировать (или иметь) даже

большее количество памяти, чем имеется в фактическом наличии. Виртуаль-

ная память позволяет компьютеру предоставлять каждой программе до одно-

го биллиона байтов (один гигабайт) для работы с ними. Это очень большой

объем памяти.

     Наконец, используя поддерживаемую аппаратными средствами мультиза-

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

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

дачность  применяется в случае,если компьютер одновременно работает с

более чем одной программой (задачей).Фактически, в каждый момент вре-

мени компьютер выполняет команды лишь одной программы, однако в процес-

се мультизадачной работы обрабатываться все программы - это можно срав-

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

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

ности, однако такую работу он не в состоянии выполнять на должном уров-

не, не обладая определенными специальными аппаратными средствами (таки-

ми,например, как защита памяти). Защищенный режим микропроцессора 286

предусматривает множество  средств,которыепрактически  обеспечивают

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

               4. Память и порты, регистры

     Регистры представляют собой разновидность памяти специального наз-

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


                                     - 5 -

целей.

     ________________________________________________________________

     !Флаги         _____________________________________         !

     !                |____________________________________|        !

     !                _____________________________________         !

     !          AX    |_______AH_______|______AL___________|        !

     !          BX    |_______BH_______|______BL___________|        !

     !          CX    |_______CH_______|______CL___________|        !

     !          DX    |_______DH_______|______DL___________|        !

     !                _____________________________________         !

     !          SP    |____________________________________|        !

     !          BP    |____________________________________|        !

     !          SI    |____________________________________|        !

     !          DI    |____________________________________|        !

     !          PC    |____________________________________|        !

     !                _____________________________________         !

     !          CS    |____________________________________|        !

     !          DS    |____________________________________|        !

     !          SS    |____________________________________|        !

     !          ES    |____________________________________|        !

     !______________________________________________________________!

     Регистрами является набор из четырнадцати 16-битовых мест, в кото-

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

ней частью микропроцессора.

     Первая группа регистров называется универсальными регистрами, Име-

ется четыре таких регистра, которые именуются AX, BX, CX и DX. Если для

работы  требуетсяприменениелишь половины емкости любого из этих ре-

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

которые обозначаются AH и AL,BH и BL и т.д.В этих универсальных ре-

гистрах выполняется  значительнаячастьработы,  поступающейвнаши

компьютеры.

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

оказания  помощимикропроцессору в отыскании пути в памяти компьютера.

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

используется  дляоказанияпомощи  в получении доступа к разделу (или

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

вкаком месте памяти располагается программа.Сегмент данных (или ре-

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

дполнительный  сегмент (или регистр ES) дополняет сегмент данных.Сег-

мент стека (или регистр SS) определяет местонахождение стекакомпьюте-

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

нии этих регистров мы получим в главе 7,когда  болеедетальнобудет

рассматриваться память.

     В то время как регистры сегментов используются для получения  дос-

тупа к большим разделам (по 64 К)памяти, последняя группа регистров ис-

пользуется для оказания помощи в отыскании пути к определенным байтам в

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

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

испольуется для конкретной цели. Указатель команды (инструкции) IP, ко-

торый называют также программным счетчиком, РС, сообщает микропроцессо-

ру только о месте,  где выполняется программа.  Указатель стека,SР, и

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

полняющейя работы.  Индекс источника, SI, и индекс местоназначения (вы-

хода),DI, используются для оказания помощи нашим программам в переме-

щении больших объемовданых из одного места в другое.

     Наконец имеется еще один регистр, называемый регистром флагов, ко-

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

ранее.Различные флаги сообщают нашим программам только о том, в каком

состоянии находится компьютер: результаты арифметических операций, раз-


                                     - 6 -

решены ли прерывания и другие аналогичные состояния.

     Микропроцессоры РСвосновном управляются посредством последова-

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

ет определенное состояние в компьютере. Флаги действуют независимо друг

от друга,  однако,для удобства,они собраны вместе в регистр флагов.

Отдельныефлаги могут проверяться и устанавливаться посредством специ-

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

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

регистр флагов.  Всего имеется девять стандартных флагов.  Шесть из ним

используются  дляиндикациирезультатов  арифметических и подобных им

операций:флаг нуля, ZF, указывает на нулевой результат (или равенство

при сравнении),  флаг знака,SF, указывает на отрицательный результат,

флаг переноса,CF, означает перенос в следующую позицию, флаг дополни-

тельного  переноса,AF,указывает  на перенос из первых четырех битов

(что требуется для моделирования десятичных операций),флаг перенолне-

ния,OF,отмечает  получение слишком большого результата и,  наконец,

флаг четности, PF, отмечает четность или нечетность результата.

     Три оставшихсяфлага используются для управления.Флаг направле-

ния,DF, управляет направлением повторения операций (например, при по-

байтовом перемещении данных): справа налево или наоборот. Флаг прерыва-

ний, IF, контролирует возможность прерываний: разрешены они или времен-

но запрещены. Флаг захвата, TF, вызывает генерацию копьютером специаль-

ного прерывания "захвата" после выполнения однойкоманды.Это  делает

возможным  пошаговоевыполнениепрограммы  с трассировкой результатов

каждой отдельной команды.

     Помимо этих девяти флагов, усовершенствованный микропроцессор 286,

используемый в ветви АТ семейства РС,допускает применение двух весьма

специальных флагов.  Один из них, называемый, NT, используется для вло-

женных задач, а другой, двухбитовый флаг IOPL, управляет уровнем приви-

легии ввода/вывода.

                                                             ┌─────────┐

                                                             │         │

                                                             │ УУПДП   │

                                                             │         │

                                                             └─────────┘

┌────────┐       ┌────────────┐        ┌──────┐        ┌──────┐

│ ЗУ     │       │ ПРОЦЕССОР│        │СИСТ. │        │      │     ┌───────┐

│        │       ││        │КОНТР.│        │КОНТР.│     │ПЕРЕФ. │

│        │       ││        │В/В   │        │      │     │УСТР.│

│        │       ││        │      │        │      │     │       │

│        │       ││        │      │        │      │     │       │

└────────┘       └────────────┘        └──────┘        └──────┘     └───────┘

                                                             ┌─────────┐

                                                             │СИСТЕМА│

                                                             │ПРЕРЫВАН.│

                                                             │         │

                                                             └─────────┘


Лекция 2

                        1. Краткий обзор памяти

    Микропроцессор лучше всего работает с 16-битовыми числами,  которые

могут принимать значения,  непревышающие65536  или64К.Поскольку

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

память,  предполагается,что память не может содержать более 64К байт.

Как показал опыт, 64К байт слишком мало для серьезных применений компь-

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

в десять раз больше - 640К. Поэтому возникает вопрос: как выполнять ра-

боту,испольуя такую большую память и продолжая  применять16-битовые

числа ля доступа к ней?

     Решение, которое было реализовано фирмой Intel в семействе микроп-

роцессоров8086 заключается в применении так называемых сегментирован-

ных адресов.  Сегментированные адреса составляются из  двух16-битовых

слов,  объединяемыхтаким способом,чтобы они могли определять адреса

1048576 (или приблизительно миллион) байтовпамяти.  Длятого,чтобы

посмотреть,как это делается, нужно рассмотреть следующее: арифметику,

которая используется при объединении двух слов сегментированногоадре-

са,испособ обработки этих сегментированных адресов внутри микропро-

цессора.

     Арифметика включает так называемое "сложение со сдвигом",которое

позволяет создавать 20-битовое двоичное число (которое можетпринимать

значения до 1048578) из двух 16-битовых чисел.Предположим,  что у нас

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

ABCD и 1234.  Напомним,что каждая шестнадцатеричая цифра представляет

четыре бита,  поэтому четыре шестадцатеричные  цифры(ABCDили  1234)

представляют 16 битов.  Возьмем одно из этих двух чисел, скажем ABCD, и

добавим 0 к его концу:  ABCD0.Фактически это означает сдвиг числана

одну шестнадцатеричную позицию (или на четыре двоичные позиции) или ум-

ножение значения числа на шестнадцать.Теперь число  состоитизпяти

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

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

полного 20-битового адреса памяти,поскольку в конце этого числа стоит

0:это число может представлять только адреса,  оканчивающиесяна0,

т.е. только каждый шестнадцатый байт.

     Для того,чтобы завершить описание схемы сегментированной адреса-

ции,мы возьмем другое 16-битовое число (1234 в нашем примере) и доба-

вим его к сдвинутому числу:

                                ABCD0

                              +1234

                   -------

                                ACF04

     Когда мы объединяем два 16-битовых слова таким способом,  мы полу-

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

1048577.Иэто та арифметическая схема,которая обеспечивает способ-

ность PC работать с миллионом байтов памяти,используя 16-битовые чис-

ла.

     Две части этой схемы адресации называются частью сегмента и частью

смещения. В нашем примере ABCD есть значение сегмента, а 1234 есть зна-

чение смещения.  Часть сегмента определяет адрес  памяти,кратный16,

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

Адреса памяти,  которые кратны 16,называются границами параграфов или

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

     Часть смещения сегментированного адреса определяет некоторое  точ-

ноеместоположение байта,следующее за местоположением параграфа сег-

мента.Поскольку 16-битовое слово смещения может варьироваться от 0 до


                                     - 2 -

65535(или 64К),то часть смещения сегментированного адреса позволяет

нам работать с 64К байтами памяти,используя один и тот же адрессег-

мента.

     Представим стандартный способ записи сегментированных адресов, ко-

торыйвычасто  будете встречать при изучении технических материалов,

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

щем виде:  ABCD:1234.Первым указывается адрес сегмента, затем следует

двоеточие и адрес смещения.Если вы работаете с языком ассемблераили

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

часто.Если вы взглянете на листинг программы DEBUG,  представленный в

разделе  "Таблицавекторовпрерываний",то вы увидите такую запись в

правом столбце.

     Почти всегда,когдамы  говоримоб адресах внутри памяти нашего

компьютера,мы обращаемся к ним в их сегментированной форме. Но иногда

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

тированного адреса объединены;когда это требуется сделать, я буду на-

зывать соответствующие адреса абсолютными адресами,чтобы не возникало

путаницы. В нашем примере объединения частей ABCD и 1234 результирующим

абсолютным адресом является ACF04.

     Часть сегмента сегментированного адресаполностьюобрабатывается

набором из четырех специальных регистров сегментов,Каждый из этих че-

тырех регистров предназначен для локализациипараграфа  сегмента.Ре-

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

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

Регистр  дополнительногосегментаES дополняет сегмент данных DS так,

что данные можно сдвигать между двумя отдельными частями памяти. И, на-

конец, регистр сегмента стека SS предоставляет информацию о базовом ад-

ресе стека компьютера.  Детальная адресация осуществляется  посредством

обработки адреса смещения. В то время как часть сегмента сегментирован-

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

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

более гибко.Наши программы могут получать смещения адресов из различ-

ных регистров (таких как универсальные регистры AX,BX и т.д.  или ин-

дексные регистры SI и DI). Смещения могут также указываться в фактичес-

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

объединения содержимого регистров и команд машинного языка.Существует

большая гибкость в способе обработки адресов смещений.

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

свой путь как среди частей программы,так и среди соответствующих дан-

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

сегментакода CS для определения местоположения частей программы и ре-

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

программыэти регистры можно трактовать как фиксированные или изменяе-

мые.Если какой-либо из них фиксируется (т.е. не изменяется программой

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

или данные) не может использовать более 64К памяти,адресуемой  данным

единственным значением сегмента.Однако,  если какой-либо из регистров

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

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

фиксируются оба регистра,  то мы имеем модель малой памяти, которая ог-

раничивает  программуобъемом в 64К для кода и в 64К для данных;если

могут изменяться оба регистра,то мы имеем большую модель, без ограни-

чений.Между этими моделями имеются еще две модели:когда один из ре-

гистров фиксируется, а другой может меняться.

     Преимущества наличиявозможностейизменения  регистров сегментов

(нет ограничений в 64К) очевидны;плата за эти преимуществане  столь

очевидна,однако, она вполне реальна. Когда программа осмеливается ма-

нипулировать регистрами сегментов,требуется дополнительная работапо

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


                                     - 3 -

равления памятью (что может усложнитьлогику  программы).Междуско-

ростью, размером и простотой, с одной стороны, необходим компромисс.

                 2.Младшие адреса памяти

     Часть памяти нашего компьютера с самыми младшими адресами отводит-

ся для некоторых важных применений, которые определяют функционирование

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

лить три области.

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

тоположение подпрограмм обработки прерывания. Первые 1024 байтов памяти

специально отводятся для таблиц векторов прерываний,предусматривается

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

пользуется.Эти таблицы занимают область памяти с абсолютными адресами

от 0 до 400 (шестнадцатеричное). (Более детально вы можете ознакомиться

с этим в разделе "Таблица векторов прерываний".)

     Вторая область используется в качестве рабочего места для подпрог-

рамм  ROM-BIOS.ПосколькуROM-BIOS  управляетосновной деятельностью

компьютера и составляющих его компонент,то для хранения его собствен-

ных записей требуется определенная область памяти. Такой областью явля-

ется область данных ROM-BIOS, одна из наиболее интересных частей компь-

ютерной памяти. Среди всего того многого, что хранится в области данных

ROM-BIOS,имеется буфер, в котором хранится информация о клавишах, на-

жатыхдо того,как наши программы готовы принять такую информацию,а

также информация об объеме имеющейся памяти вкомпьютере  ииндикатор

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

(если вы внимательно рассмотрите программу ALL-CHAR в приложении А,то

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

экран).

     Для области данных ROM-BIOS устанавливается отдельная область раз-

мером в 256 байтов и с адресами от 400 до 500.

     Третьей частьюспециальной области младших адресов в памяти явля-

ется рабочая область ДОС и Бейсика, которая находится между абсолютными

адресами 500 и 600. Эта область используется совместно ДОС и Бейсиком в

качестве рабочей области,  аналогично рабочей области ROM-BIOS, которая

предшествует ей.

     Ключевой рабочей областью памяти является та  часть,котораяис-

пользуетсядля программ и соответствующих данных:эта область состоит

из первых десяти блоков (0-9).Эту область часто называют областью па-

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

ного пространства.  Когда мы говорим об объеме имеющейся в  PCпамяти,

фактически речь идет об объеме памяти пользователя,которая устанавли-

вается в этой области.  Теоретически память  пользователяможетиметь

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

тановлены все десять блоков памяти.Независимо от объема установленной

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

должаясь до конца установленной памяти.

     Фактически имеется несколько различных видов памяти (более подроб-

но об этом мы узнаем ниже)и  тотвидпамяти,  которыйопределяется

здесь,  являетсяобычной памятью с произвольным доступом (произвольной

выборкой), которая используется для выполнения чтения и записи и, кото-

рую называют также ЗУПВ (запоминающеее устройство с произвольной выбор-

кой).Память ЗУПВ отличает следующее: во-первых, данные, хранящиеся в

этойпамяти могут проверяться (сличаться) и изменяться (записываться),

а,во-вторых, эта память непостоянна, что означает, что данные, храня-

щиеся в ней, сохраняются только на время работы компьютера.

     Эта память предназначена для хранения наших программ и данных, по-

ка компьютер обрабатывает их. Объем установленной памяти ЗУПВ во многом

определяет размер и диапазонпроблем,  которыемогутразрешать  наши


                                     - 4 -

компьютеры.

    Блок 0   1-ый   64К    Обычная память пользователядо64К

     Блок 1   2-ой   64К    Обычная память пользователядо 128К

     Блок 2   3-ий   64К    Обычная память пользователядо 192К

     Блок 3   4-ый   64К    Обычная память пользователядо 256К

     Блок 4   5-ый   64К    Обычная память пользователядо 320К

     Блок 5   6-ой   64К    Обычная память пользователядо 384К

     Блок 6   7-ой   64К    Обычная память пользователядо 448К

     Блок 7   8-ой   64К    Обычная память пользователядо 512К

     Блок 8   9-ый   64К    Обычная память пользователядо 576К

     Блок 910-ый   64К    Обычная память пользователядо 640К

     Блок A11-ый   64К    Расширение памяти для видео

     Блок B12-ый   64К    Стандартная память для видео

     Блок C13-ый   64К    Расширение ПЗУ (XT,EGA,3270 PC)

     Блок F16-ый   64К    Система ROM-BIOS и ROM-BASIC

     Рис. Блоки памяти PC

     Базисная конструкция семейства PCотдельноустанавливает  только

десятьизшестнадцати блоков в адресном пространстве для этой главной

рабочей области памяти. Это более 60% от общего объема. Сегодня эта об-

ласть объмом в 640К кажется слишком малой для проблем, которые нам нуж-

но решать на наших PC,  однако,для того времени, когда разрабатывался

PC, этот объем казался огромным. В то время обычные персональные компь-

ютеры ограничивались памятью объемом 64 или 128К и PC с памятью в640К

считался необычным. (Эта та ошибка, которая повторяется вновь и вновь в

истории компьютеризации: недооценка потребностей в росте и расширении).

     Можно слегкарасширитьобласть  памятипользователяемкостью в

640К,вторгнувшись в некоторые из следующих за ней системных областей,

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

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

пойдет ниже).

     Отнюдь не каждый отдельный бит области памяти пользователядосту-

пендляиспользования нашими программами.Часть этой области памяти,

начинающаяся с адреса памяти 0,специально устанавливается для ведения

записей,которые должен иметь компьютер. Об этом упоминалось в разделе

"Младшие адреса памяти",более детальная техническая информация об од-

нойиз частей этой области приводится в разделе "Таблица векторов пре-

рываний".  Однако,за исключением этой небольшой (и интересной) части,

весьразделв  640Кспециально предназначен для использования нашими

программами, поэтому не стоит уделять ему много внимания. С другой сто-

роны,остальные блоки памяти,некоторые их использования представляют

для нас несомненный интерес.

                  3. Расширенная память

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

цессор8088,ограничиваютсяадресацией лишь одного мегабайта памяти,

ветвь AT семейства,  которая использует микропроцессор 286, может рабо-

тать с памятью большего объема.

     Как упоминалось при рассмотрении микропроцессора 286 (в конце гла-

вы 6),компьютеры, базирующиеся на микропроцессоре 286, могут иметь до

16 Мегабайт памяти. Интересно отметить, что точно такой лимит на память

применялсяв течение многих лет к огромным многомиллионным универсаль-

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

фирмы IBM имели память, емкость которой не превышала емкость памяти на-

ших маленьких микропроцессоров.

     Помимо способностивмещать огромные объемы реальной рабочей памя-


                                     - 5 -

ти,микропроцессор 286 может также работать с огромными объемамми вир-

туальной памяти, ловкой имитацией большего объема памяти, чем имеется в

наличии.(См.раздел "Как действует виртуальная память"). Виртуальная

памятьмоделиAT  можетпредоставляться в объеме до одного гигобайта

(1024 Мегабайтов) для каждой программы, которая выполняется в компьюте-

ре.

     Для того,чтобы извлечь все преимущества от использованиярасши-

ренной памяти или виртуальной памяти модели AT, необходимо наличие опе-

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

ветствующими возможностями. Поскольку основная операционная система для

семейства PC,  ДОС,разрабатывалась без учета применения расширенной и

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

ваться раскрытым не полностью,пока не появятсяоперационная  система

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

учетом особенностей моделей AT.

     Несмотря на все это,программы могут, в определенной степени, ис-

пользовать возможности расширенной памяти AT.Стандартным способом для

программявляется использование для этих целей обслуживающих программ,

включенных в ROM-BIOS. Одна из таких обслуживающих программ осуществля-

етпередачу блоков данных (любого нужного нам размера) между специаль-

ной расширенной памятью и обычной памятью.Программа может такжеосу-

ществлять  переключение микропроцессора 286 с реального режима (в кото-

ром он действует как обычный микропроцессор 8088) на защищенныйрежим.

Однако,дляуспешного  манипулирования защищенным режимом,  программа

должна быть более усложненной.Если все,  что требуется для программ -

этополучить выгоды от использования расширенной памяти,  то она может

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

ти,содержащейся в BIOS, и избежать всех сложностей, связанных с рабо-

той в защищенном режиме.

              ________ ________ ________ ________    ДЕЙСТВИТЕЛЬНЫЕ

             |        |        |        |        |   ОБЛАСТИ ПАМЯТИ,

             |________|________|________|________|   в которых нахо-

                |                                 дятся части вир-

Виртуальная      |                                 туальной памяти

память программ  |                            

пользователя     |                             

______          |                              

|      |         |                               

|______|         |                                

|             _|___________        _____ ВИРТУАЛЬНАЯ

|    ________|        |__________|      |______|      |____

|-->|        |________|          |______|      |______|    |

      |________|        |__________|      |______|      |____|ПАМЯТЬ

                          |                //

              |              //

              |//

                          |          //

                          |         //

                          |        //

                          |       //

                         |      //

                          |     //

                 ____________________________

                |                            |

                |ДИСК, на котором хранятся |

                |части виртуальной памяти|

                |____________________________|

                            Рис. Виртуальная память


                                     - 6 -

1-реальная память; 2-хранение активных частей виртуальной памяти;

3-программа использует виртуальную память; 4-виртуальная память;

5-диск; 6-хранение частей виртуальной памяти

                  4. Виртуальная память

     Виртуальная память представляет собой хитроумную операцию, которая

включает определенную,  тщательно организованную кооперацию междумик-

ропроцессором,  программой поддержки виртуальной памяти и диском компь-

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

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

ционная система создает "пространство виртуальной памяти",которое яв-

ляется моделью памяти и адресов памяти, которые программа имеет в своем

расположении.  Затем часть "реальной" или фактической физической памяти

компьютера передается в виртуальную память,что является ядром концеп-

ции виртуальной памяти. Используя средство, которое является неотъемле-

мой частью микропроцессора 286,программа поддержки виртуальной памяти

операционной системы сообщает микропроцессору 286 о том,что  реальной

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

которым будет пользоваться программа. Средство "распределения памяти" в

микропроцессоре  286делает так,что реальная память вроде имеет иной

рабочий адрес, отличный от истинного, реального адреса.

     Программа начинаетработатьв  некотором(большом) пространстве

виртуальной памяти, отображаемом в часть реальной памяти (более меньше-

го объема) компьютера. Пока программа работает только в этой части сво-

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

адреса памяти,  отличные от тех,которые определяются в программе,но

это не имеет значения. Что происходит, когда программа пытается исполь-

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

памяти (которая имеет меньший объем,чем виртуальная память)?Вэтом

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

пытается использовать адрес,который не существует втекущий  момент;

микропроцессор  генерируеттак назывыаемое прерывание из-за отсутствия

страницы.

     Когда происходит прерывание из-за отсутствия страницы (означающее,

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

чески не отображается в реальной памяти), вступает в действие специаль-

ная программа поддержки виртуальной памяти. Она временно помещает прог-

рамму в состояние блокировки,пока занимается этим кризисом. Программа

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

кущий момент находится в реальной памяти и, временно помещает ее содер-

жимое на диск;это называется откачкой.Эта часть реальной памяти за-

действуется в качестве понадобившейся части виртуальной памяти.

     Когда откачанная часть памяти требуется вновь,  онаподкачивается

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

     Как видите,диск компьютера используется вкачествесклада  для

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

момент.

     В зависимостиот хода вычислительного процесса,функционирование

виртуальной памяти может протекать очень гладко,либо оно можетвклю-

чатьстолькоопераций  откачки и подкачки,что на ожидание перекачки

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

Когда это происходит, то такая ситуация называется "пробуксовкой": ког-


                                     - 7 -

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

ность компьютера резко падает.

     Практическое функционированиесистемывиртуальной  памятиможет

включать очень чувствительное уравновешивающее действие,известное как

настройка системы.  Наши микрокомпьютеры могут извлекать пользу от уме-

ренногои взвешенного использования виртуальной памяти,  но,вместе с

тем,они слишком малы и слишком медлительны для  того,чтобыизвлечь

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

      5. Группы блоков памяти и увеличенная память

     ----------------------------------------------

     Переключение блоковпозволяеткомпьютеру фактически иметь больше

памяти,чем это обеспечивается одномегабайтным адресным  пространством

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

ней жестко не закрепляется какое-либоместо  вадресномпространстве

микропроцессора.  Вместо этого память как бы пребывает в забвении,без

адреса,являясь недоступной для наших программ,пока не происходит ее

включение.

     Платы для этого специального видапамятис  переключениемгрупп

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

ти.Например, плата такой памяти может содержать восемь "блоков" памя-

ти, каждый из которых имеет объем 64К (всего 512К). Всем этим блокам по

64К соответствует один адресный блок (64К) в компьютерной памяти. В лю-

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

тупны данные из этого блока, другие блоки будут блокированы.

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

подключать к компьютеру больше памяти, памяти, которая может стать дос-

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

это послать в плату памяти соответствующую команду, сообщающую об изме-

нении адресации блоков.  Переключение занимает столько времени, сколько

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

держки.

     Вместе с тем, имеются сложности, связанные с использованием памяти

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

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

печивающего доступность нужных участков памяти в соответствующие момен-

ты времени.  Потребность в этом управлении - и стандартныйспособ  его

осуществления  -сдерживала применение переключения блоков до тех пор,

покагигантпопроизводствупрограммного  обеспечения,фирма"Ло-

тос"(Lotus),  и кудесник в области производства кристаллов микропроцес-

соров, фирма "Интел", не объединились для определения стандартного спо-

собаработыс  памятью с переключением групп блоков.  Официально этот

подход к переключению блоков называется "Спецификация расширенной памя-

ти  Лотос/Интел/Микрософт",  однако,многиеобращаются к ней по имени

специальной платы памяти, разработанной фирмой "Интел" в соответствии с

этой спецификацией: "Верхняя плата" ("Above Board").

     Поясним, как действуетувеличеннаяпамять.  Еефункционирование

обеспечивается  тремякомпонентами:одна - аппаратная (плата памяти с

переключением групп блоков) идве  программные(программауправления

увеличенной памятью, ЕММ и прикладная программа, которая использует па-

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

"Верхняя  плата" фирмы "Интел" или иная аналогичная плата памяти) обес-

печивает что-то между 64К байтами и 8М байтамипамяти,  подразделяемой

на небольшие страницы по 16К,которые могут переадресовываться индиви-

дуально посредством переключения блоков.

     Программа управленияувеличенной памятью (ЕММ) активизируется при

первом запуске компьютера и она закладывает фундаментфункционирования


                                     - 8 -

увеличенной памяти. Ключевой частью задачи, возлагаемой на эту програм-

му,является отыскание неиспользуемой области в памяти PC, которая мо-

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

блоков.Для этой программы требуется полная рабочая область памяти ем-

костью в 64К,  называемая страничным блоком, причем эта рабочая область

может располагаться в любом месте.На общей схеме распределения памяти

можно легко увидеть,  что блоки D и E памяти являются достойными канди-

датами для этой цели,  однако, ЕММ может помещать страничный блок также

в блок C.Точное местоположение не имеет значения,если оно не мешает

какому-либо иному использованиюадресного  пространства.Крометого,

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

мер, страничный блок может начинаться с адреса сегмента C400 и занимать

оставшуюся часть блока C и первые 16К блока D.

     Когда программа ЕММ определит, где будет располагаться ее странич-

ный блок (64К),  она делит этот блок на четыре окна по 16К. После этого

ЕММ готова к действию,  готова к поддержке любой прикладной  программы,

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

по 16К (и из этих окон).

     Для использования увеличенной памяти, прикладная программа сообща-

ет программе ЕММ о том, что она нуждается в применении одного или более

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

визор ЕММ о выделении ей страниц памяти,а затем сделать этистраницы

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

ной программе нужно работать с различными страницами (по16К)  данных,

онапосылает в ЕММ запрос на соответствующее переключение страниц.

____________________________________________________________________

|                                                                    |

|                                                                    |

|        _______________________________________                     |

|       |                                       |                    |

|       |      -------       -------|                    |

|       |      |     |       |     ||  РАСШИРЕННАЯ       |

|       |      |     |       |     ||     ПАМЯТЬ         |

|       |      -------       -------|                    |

|       |         |   -------   |   -------     |                    |

|       |         |   |     |   |   |     |     |                    |

|       |         |   |     |   |   |     |     |                    |

|       |         |   -------   |   -------     |                    |

|       |         |      |      |      |        |                    |

|       |_______________________________________|                    |

|                 |      |      |      |                             |

|                 |      |      |      |                             |

|                 |      |      |      |                             |

|                |/    |/    |/    |/                            |

|    ------------------------------------------------------          |

|   |          |      |     |       |     |                |ОСНОВНАЯ |

|   |          |      |     |       |     |                | ПАМЯТЬ|

|    ------------------------------------------------------          |

|   0    640К   ___________ ____________/                           |

|                           V                                        |

|                                                                    |

|                          ОКНА                                      |

|____________________________________________________________________|

     Рис. Расширенная память

     Хотя эта схема очень мощная и весьма быстрая,она имеет некоторые


                                     - 9 -

очевидные недостатки.  Один из них состоит в том, что она может исполь-

зоваться только для программных данных, но не для кода самой программы.

ДОСвсе равно должна отыскивать достаточно места в области обычной па-

мяти для хранения больших программ,однако, когда эти программы выпол-

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

личенной памяти, работая с большим объемом данных, чем можно разместить

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

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

местноспрограмой ЕММ и как удобно работать с данными,разбитыми на

страницы по 16К.  Вместе с тем, следует отметить, что в рамках этих ог-

раничений  схемаувеличенной памяти может существенно улучшить возмож-

ности нашего компьютера в части обработки больших объемов данных.

     Эта схемаувеличенной  памятиможетбыть  добавленаклюбому

обычномучлену семейства PC, включая ветвь AT семейства. Помимо того,

что модели AT могут обладать собственнойрасширенной  памятью,объем

которой  превышаетодномегабайтныйпредел PC, они могут использовать

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

пространства.

                Карта рапределения памяти DOS

      0000:0000   Таблица векторов перываний.

      0040:0000   Глобалъные переменные BIOS.

      0050:0000   Глобалъные переменные DOS.

      XXXX:0000   IBMBIO.COM - частъ DOS, обеспечивающая

                  взаимодействие с BIOS.

      XXXX:0000   IBMDOS.COM - программы обработки

                  прерываний DOS (включая INT 21).

     Буфера и управляющие таблицы DOS и загружемые драйверы.

      XXXX:0000   Резидентная частъ COMMAND.COM -

                  программы обработки прерываний

                  22 (завершение), 23 (Ctrl-Break),

                  24 (фаталъная ошибка обмена) и

                  программа подзагрузки нерезидентной части.

      XXXX:0000   Нерезидентная команда или программа -

                  (из файла .COM или .EXE)

      XXXX:0000   Стек программы (для .COM)

      XXXX:0000   Нерезидентная частъ COMMAND.COM -

                  интерпретатор команд,

                  нерезидентные команды DOS,

                  интерпретатор командных файлов,

                  загрузчик.


Лекция 3

                     МОДУЛИ ДОС

             1. Основные компоненты ДОС

     Всю систему можно разделить на шесть основных частей, функции каж-

дой мз которых мы кратко рассмотрим в этом разделе.Первая часть - это

система BIOS в ПЗУ.  Это система поставляется вместе с IBM/PC  иможет

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

ется в обслуживании основных и наиболее фундаментальных операций компь-

ютера.Поскольку система BIOS в ПЗУ для IBM/PC является "встроенной" в

комптютер,она является не только составной частью ДОС, но и составной

частью любой операционной системы IBM/PС.

     Еще одна часть - "загрузочная запись" дискеты.  Загрузочная запись

- это очень короткая и простая программа,находящаяся в первом секторе

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

загрузки операционной системы после включения компьютера или перезапус-

ка (нажатия клавиш CTRL-Alt-Del).Загрузочная запись считывает еще два

модуля  операционнойсистемы в память и они завершают процесс загрузки

ДОС.

     Следующие две   части   ДОС   представляютсобойдисковые  файлы

IBMBIO.COM и IBMDOS.COM. Обе эти части загружаются в память загрузочной

записью и остаются в памяти во время работы ДОС, так что провести между

ними различие довольно трудно. Файл IBMBIO.COM представляет собой изме-

няемоедополнениек  системеBIOS в ПЗУ.Начиная с версии 2.00 файл

IBMBIO.COM может дополняться другими частями,называемыми независимыми

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

Система BIOS в ПЗУ,  IBMBIO.COM и драйверы устройств, вместе взятые об-

разуют "физический" уровень операционной системы.

     Файл IBMDOS.COM реализует основные услуги  ДОС.Это"логический"

уровень ввода/вывода операционной системы.

     Оба эти файла являются "скрытыми" системными файлами.Имена  этих

файлов не включаются в оглавление диска, вызываемое по команде DIR. Од-

на из функций IBMBIO.COM заключается в загрузке еще одного модуляопе-

рационой системы.

     Пятая часть -это  дисковыйфайлCOMMAND.COM.  Главнаяфункция

COMMAND.COM заключается в обработке команд, вводимых пользователем. Ко-

манды ДОС,  считающиеся внутренними,такие как TYPE, COPY и DIR факти-

чески реализуются программами COMMAND.COM.Собственно COMMAND.COM раз-

деляется на две части:  одна становится частью IBMDOS.COM,  а вторая-

процессором дополнительных команд.

     Шестая и последняя часть ДОС состоит из всех внешних команд, таких

какFORMATи DISKCOPY.  Функции этих команд различны и реализующие их

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

от остальных пяти частей ДОС, все эти дополнительнве программы не явля-

ются интегральной составляющей ДОС,хотя они и поставляютсявместе  с

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

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

     Внешние команды являются нерезидентными частями ДОС, поскольку они

не находятся в памяти постоянно. Файлы IBMBIO.COM, IBMDOS.COM и драйве-

рыустойствнаходятся в памяти постоянно и образуют резидентную часть

ДОС. Файл COMMAND.COM можно выделить в отдельную категорию как полу-ре-

зидентную составляющую ДОС,о чем речь пойдет ниже. Загрузочная запись

используется только временно и поэтому не являетсярезидентной  частью

ДОС.В следующих шести разделах мы более подробно рассмотрим каждую из

частей ДОС.


                                     - 2 -

                2. Система BIOS в ПЗУ

     Первая часть в ДОС - это BIOS в ПЗУ или базовая система  ввода/вы-

вода,  размещающаяся в постоянной памяти. Эта система обеспечивает наи-

более простые и универсальные услуги операционной системы,связанные с

осуществлением ввода/вывода.

     Система BIOS располагается в ПЗУ начиная с адреса FE00 и до  FFFF,

сразу же после интепретатора БЕЙСИКа.

     Поскольку BIOS в ПЗУ является частью IBM/PC,она может изменяться

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

ция системы.В качестве составной части IBM/PC, система BIOS в ПЗУ яв-

ляется не просто одной из частей ДОС, но частью любой операционной сис-

темы IBM/PC.

    Система BIOSвПЗУ состоит из нескольких частей,  большинство из

которых представляет собой программы (остальные -это  важныетаблицы

данных,которые мы рассмотрим в последующих главах). Программа системы

BIOS, которая выполняется первой, представляет собой тест функциониова-

ния.

     Эта программа поверяет память и внешние устройства, подключенные к

IBM/PC, как только будет включено питание компьютера. Работа этой прог-

раммы определяет ту задержку,которая имеет место между включением пи-

тания и загрузкой операционной системы.Чем больший объем памяти подк-

лючен к Вашему компьютеру,тем дольше выполняется тест, поскольку наи-

более длительной процедурой является процедура поверки памяти.

     Следующая часть BIOS, которая должна выполняться как программа за-

пуска операционной системы,- это программа вызова загрузчика операци-

онной системы. Эта программа проверяет, подключен ли дисковод с гибкими

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

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

считала оставшиеся части операционной системы.

     Если в системе нет дисковода или при считывании загрузочной записи

произошла ошибка, то программа запуска BIOS передает управление кассет-

ной системе БЕЙСИК.  Если Вы включите IBM/PC,не установивдискетув

дисковод,то Вы увидите, что начала работу программа системы БЕЙСИКа.

     Помимо двух уже описанных частей - автономного теста функцонирова-

ния и программы запуска,  система BIOS в ПЗУ содержит множество  других

программ и они-то представляют для нас наибольший интерес.Сюда входят

программы обслуживания всегостандартного  периферийногооборудования

IBM/PC.Этипрограммы выполняют основные функции управления клавиату-

рой,дисплеем, дискетами, асинхронным адаптером связи, устройством пе-

чати и кассетным интерфейсом. Работой с этими программами нам необходи-

мо овладеть, чтобы полностью использовать все возможности IBM/PC.

     3. Начальная загрузка - загрузочная запись

     Загрузочная запись необходима для запуска ДОС. Принцип использова-

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

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

запуска основных частей операционной системы.

     При запуске IBM/PC либо включением питания,либо нажатиемклавиш

Ctrl-Alt-Del, процедура запуска системы BIOS в ПЗУ считывает первую за-

пись дискеты,  установленной в дисковод А и помещает ее  встандартную

область  памяти,поадресу 31744 или 7С00 (шестнадцатиричное).После

считывания загрузочной записи BIOS передает ей управление, выполняя пе-

реход по адресу 31744.  Далее загрузочная запись должна продолжить заг-

рузку операционной системы.

     Основное назначениезагрузочной записи для ДОС заключается просто

в загрузке файлов IBMBIO.COM и IBMDOS.COM. Загрузочная запись имет раз-

мер  стандартногосектора на дискете,512 байт,что недостаточно для

сложной программы.  Для упрощения работыэтойпрограммы,  обафайла,


                                     - 3 -

IBMBIO.COMи IBMDOS.COM,размещаются в определенных постоянных местах

на дискете. Это избавляет программу загрузки от необходимости искать их

в справочнике дискеты.

     Этим, кстати,"системная" дискета отличается от обычной - на ней,

вопределенныхместах,  находятсядвасистемных  файла IBMDOS.COM и

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

темную - места,  зарезервированные для системных файлов, могут быть за-

няты другими файлами.

     Хотя загрузочная программа не столь совершенна, чтобы осуществлять

поиск системных файлов,  она все же способна проверить правильностьих

включения в справочник.  Поскольку оба системных файла включены в спра-

вочник дискеты,  они защищены как от стирания,так и отлюбыхдругих

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

(В следующей главе мы поясним, что такое скрытые и системные файлы).

     Всвязи  спростотойее  задачи,программазагрузки

является относительно стабильнойсоставной частью  ДОС.Ее

потребовалось    изменить,   когда   изменялся   размер   или

местоположение системных файлов, а это произошло свведением

поддержки двухсторонних дискет в версии ДОС 1.10.

                    4. IBMBIO.COM

     Первый из двух системных файлов,IBMBIO.COM, предназначен для до-

полнения функций системы BIOS в ПЗУ.Как BIOS в ПЗУ,так и IBMBIO.COM

занимаются  обслуживаниемопераций ввода/вывода или обслуживанием уст-

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

подробностей, связанных с функционированием устройств ввода/вывода. Сю-

да же включается обнаружение ошибок и их исправление,что для программ

еще сложнее.

     Программы IBMBIO.COM отличаются тем,что их легко можно изменить,

чего нельзя сказать о программах BIOS в ПЗУ. Файл IBMBIO.COM предназна-

чен для решения трех задач, которые невозможно решить с помощью системы

BIOSв ПЗУ.Первая задача заключается в настройке на нужды конкретной

операционной системы, ДОС.

     Вторая задачаIBMBIO.COM заключается в исправлении любых ошибок в

BIOS в ПЗУ,если в этом возникнет необходимость.  Программы,подобные

системе BIOS,  проверяются очень тщательно, ведь их размещение в ПЗУ не

допускает исправлений.  Если ошибки все же будут позднее  обнаруженыв

BIOS, их можно будет исправить путем внесения соответствующих изменений

в IBMBIO.COM.Это делается путем изменения векторов  прерыванийтаким

образом,чтобы управление при обращении к операциям BIOS сначала попа-

дало в IBMBIO.COM,  а уже затем в BIOS.Соглашения о вызовахпроцедур

системы BIOS в ПЗУ всегда предполагает использование прерываний, вместо

прямых переходов по адресам ПЗУ.Основная причина использования преры-

ваний как раз и состоит в обеспечении возможностей перехвата управления

у процедур BIOS,  ведь, в противном случае, такой возможности просто не

существовало бы.

     Третья задача, которую не позволяет решить BIOS, и, которую за нее

решает  IBMBIO.COM,заключается в обслуживании новых периферийных уст-

ройств,таких как жесткие диски большойемкости,или  восьмидюймовые

(203мм) дискеты,  или плоттеры,или любые из сотен устройств,которые

могут быть подключены к IBM/PC.Когда  новоеустройствоввода/вывода

подключается к IBM/PC,  обслуживающая его программа должна включаться в

файл IBMBIO.COM или его расширения,без необходимости замены микросхем

ПЗУ, в которых размещается система BIOS.

     В наиболее ранних версиях ДОС задача включения нового устройства в

систему  предполагалавнесение изменений в IBMBIO.COM и,возможно,в

другие системные программы ДОС.Хотя это не слишком сложнодля  таких

фирм как "ИБМ" или "Майкрософт", такая задача может оказаться непосиль-


                                     - 4 -

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

дование в свою систему.

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

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

обслуживающих программ в ДОС была упрощена,начиная с ДОС версии 2.00.

Когдауправлениевпервые после запуска системы передается IBMBIO.COM,

он проверяет,  находится ли на дискете файл конфигурации системы.Если

файл конфигурации найден,  считываются его команды, часть которых опре-

деляет ряд параметров системы.

     Команды файла конфигурации включают имена всех программ обслужива-

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

рамм загружается в память как дополнение к IBMBIO.COM.Такая схема об-

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

затрагивая системные файлы ДОС.

     Как правило,любая программа, работающая на IBM/PC, будет исполь-

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

рамме необходимо бывает особое обслуживание операций ввода/вывода. Пос-

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

нить,имеет смысл разработать версию IBMBIO.COM,  настроенную наВаши

конкретные  нужды.Пример такой настройки Вы можете найти в диагности-

ческих программах.

                    5. IBMDOS.COM

     Разделение операционнойсистемына  двамодуля,IBMBIO.COM   и

IBMDOS.COM  позволяет разделить те части,  которые специфичны для конк-

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

работающих под управлением ДОС.

     Служебные процедуры ДОС,в определенной степени произвольно, раз-

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

те,которые разделяют общее прерывание(номер33,  шестнадцатиричное

значение 21). В терминологии ДОС, первая группа называется прерываниями

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

зуются программные прерывания,причем по той же причине, что и для вы-

зова программ BIOS: для обеспечения модульности.

     Диапазон прерыванийот 32 до 63 (шестнадцатиричные значения от 20

до 3F) зарезервированы для использования ДОС. Используется только часть

этих прерываний,а остальные обеспечивают возможность дальнейшего рас-

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

секторов дискеты, доступ к контролю за ошибками ДОС и операциями клави-

атуры Ctrl-Break.

     Вызовы функций ДОС обеспечивают, в основном, промежуточный уровень

обслуживания операций ввода/вывода. В качестве примеров можно упомянуть

ввод с клавиатуры, обычный вывод на экран дисплея, ввод/вывод по асинх-

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

операциидля дискет - открытие и закрытие файлов,  поиск в справочнике

файлов,удаление и создание файлов, чтение и запись данных. Эти проце-

дуры обеспечивают практически все элементарные операции,которые могут

потребоваться программе для работы с файлами и данными,хранящимисяв

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

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

     Большая частьэтих служебных процедур ДОС интенсивно используется

программами более высокого уровня ДОС.Например,  процедурапоискав

справочнике используется командами DIR и COPY.Кроме того, она исполь-

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

4.9 будет рассмотрен полный список служебных процедур ДОС.

      6. Файл COMMAND.COM и внутренние команды


                                     - 5 -

     Следующая составная часть ДОС,файл COMMAND.COM, одна из наиболее

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

ляет пользователю,  так и с точки зрения принципов ее функционирования.

COMMAND.COM имеет несколько функций.Прежде всего,  это "процессор ко-

манд", что означает возложенные на него функции ввода команды, набирае-

мой на клавиатуре, и определения дальнейших действий.

     Когда вводится внутренняя команда,такая как DIR, COPY, TYPE, REM

илиPAUSE,то  запрашиваетсяслучайнаяпроцедура,  "встроенная"   в

COMMAND.COM, так что она может выполняться немедленно.

     Чтобы распознавать внутренние команды, COMMAND.COM содержит табли-

цу имен команд. Если просмотреть файл COMMAND.COM, то можно увидеть эти

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

программой DEBUG или DiskLook. Там же Вы увидите сообщение, которое ДОС

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

мощьюкоманды DEBUG или SecMod,так чтобы ДОС начинала работу выдачей

Вашей фамилии или названия компании. Можно также изменить и имена внут-

ренних команд, причем сделать это просто, если не изменяется длина име-

ни.

     Если команды нет в таблице внутренних команд, значит имеется в ви-

ду внешняя команда,  которую COMMAND.COM будет искать во внешнем файле.

Вответ на наш запрос,COMMAND.COM осуществляет поиск файла обработки

команды на соответствующей дискете и запускает его выполнение.

     КогдаCOMMAND.COM  находитпрограммныйфайл  влюбом

формате,онвыполняет  загрузкуэтогофайла  впамятьи

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

файлаиформирования   приставки   программного   сегмента,

COMMAND.COM передает управление этой программе, так чтобы она

могла выполнить свою работу.

     Если файл обработки команды относится к типу ".BAT", то есть явля-

ется файлом пакетной обработки,то он содержитв  форматетекстового

файла в коде ASCII последовательность команд, которые должны выполнять-

ся так,как будто они вводятся склавиатуры.Одна  измногихзадач

COMMAND.COM  заключаетсяв отслеживании позиции в файле пакетной обра-

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

гой. Если в процессе обработки одного пакетного файла будет вызван дру-

гой,то возврата к первому не произойдет, так как файлы пакетной обра-

ботки не могут быть вложенными, зато их можно объединять в цепочку.

     В некоторых системах весь ввод команд может быть  переназначенна

файл,причем это относится как к программам, вводящим данные с клавиа-

туры, так и к интерпретатору команд. К ДОС это не относится. Только ин-

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

файлов пакетной обработки.

     Кстати, программы могут вносить изменения в файл пакетной обработ-

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

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

выполнения программ.

Командный процессор, COMMAND.COM состоит из трех отдельных частей:

     1. Резидентной   части,   размещаемой  вОЗУнепосредственноза

IBMDOS.COM и ее рабочей областью. Эта часть содержит подпрограммы обра-

ботки прерываний 22H (адрес завершения),23H (реакция на Ctrl-Break) и

24H (реакция на фатальную ошибку), а также подпрограмму подзагрузки не-

резидентных  частей.(При завершении программы вычисляется контрольная

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

не затерта ли она. Если да, то нерезидентная часть подзагружается). За-

метим,что вся стандартная обработка ошибок производится  этойчастью

COMMAND.COM. Это включает выдачу сообщений об ошибках и обработку отве-

танавопрос "Abort, Retry or Ignore".

     - Часть инициализации располагается в памяти вслед за резидентом и


                                     - 6 -

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

файла AUTOEXEC.BAT.  Она также определяет адрес, начиная с которого мо-

гут загружаться программы.Эта часть перекрывается первой жепрограм-

мой, загружаемой COMMAND, так как не используется после выполнения ини-

циализации.

     - Нерезидентые части загружаются в конец (старшие адреса) ОЗУ.  Их

две:собственно командный процессор (часть 3),  выполняющийобработку

диалогjds[ команд и из командных файлов,и (часть 4) загрузчик, загру-

жающий и выполняющий нерезидентные команды (т.е.файлы с  расширениями

.COM или .EXE).  Загрузчик располагается в самом конце ОЗУ и вызsвается

операцией вызова и загрузки прогамм (Exec).

     Часть 3 COMMAND выдает приглашение (напр. A>), принимает команды с

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

резидентныхкоманд она формирует командную строку и выполняет операцию

Exec для загрузки и вызова соответствующей программы.

     7. Внешние команды

     Последнюю часть операционной системы ДОС составляют внешние коман-

ды.Они называются внешними, поскольку они не включены в состав ДОС, и

не являются резидентными в памяти IBM/PC. Вместо этого, внешние команды

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

     Как все программные файлы,все внешние командыимеют  расширение

имени файла ".COM" или ".EXE",что указывает,в каком из форматов они

оформлены.Мы рассмотрим эти форматы, когда будем рассматривать струк-

туру дискет и файлов в следующей главе.

     Примерами внешних команд могут служить DISKCOPY,  COMP,FORMAT, а

такие программы как EDLIN,BASIC или BASICA тоже в определенном смысле

являются внешними командами,хотя их лучше всеже  считатьязыковыми

процессорами, такими как макроассемблер или Паскаль.

     Внешние команды не отличаются от других программных файлов,кото-

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

команды действительно являются частьюоперационной  системы,особенно

те, без которых операционной системой нельзя воспользоваться, такие как

FORMAT. Однако, с другой точки зрения, внешние команды - это всего лишь

вспомогательные программы,утилиты, которые полезны, но которые не яв-

ляются операционной системой.Разница между  внешнейкомандойДОСи

обычнойпрограммойзаключается просто в Вашем отношении к ней - как к

части ДОС или как к чему-нибудь малосущественному.

                8. Инициализация DOS

     При запускесистемы (либо операцией перезагрузки системы ),либо

при включении питания с системной дискетой в устройстве A:),блокна-

чальнойзагрузки считывается в память и получает управление.  Он прос-

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

IBMBIO.COM и IBMDOS.COM (в указанном порядке).Если эти файлы не обна-

ружены, на экран выдается сообщение об ошибке, иначе оба файла считыва-

ются в оперативную память. (IBMBIO.COM должен быть первым файлом в кор-

невом каталоге и располагаться на последовательных секторах).

     Подпрограмма инициализации в IBMBIO.COM определяет состояние обру-

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

загружает драйверы устройств,и устанавливает значения младших вектров

прерываний.Затем она выполняет настройку адресов в IBMDOS.COM и пере-

дает управление на первый байт DOS.

     Так же как и в IBMBIO.COM,первый байт DOSсодержит  переходна

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

ластью данных командного процессора. DOS инициализирует свои внутренние


                                     - 7 -

рабочие  таблицы,инициализируетвектора прерываний 20-27 и формирует

Префикс Программного Сегмента (См. Гл. 6) для COMMAND.COM в самом млад-

шем доступном сегменте; затем она возвращается в IBMBIO.COM.

     Последнее инициализационное действие IBMBIO.COM заключается в заг-

рузке COMMAND.COM по адресу, установленному подпрограммой инициализации

DOS. Затем IBMBIO.COM передает управление на первый байт COMMAND.


Лекция 4

                              ПРЕРЫВЫНИЯ

             1. Таблица векторов прерываний

     Для микропроцессоратребуется простой способ определения местопо-

ложения программы обработки прерывания и это осуществляетсяпутемис-

пользования таблицы векторов прерываний.Это очень простая таблица ад-

ресов подпрограмм обработки прерываний,хранящаяся начиная с "вектора"

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

содержит четыре байта:  вектор для любого прерывания с номером х  соот-

ветствует адресу памяти 4-х.

     "Векторами" являются просто полные адреса памяти программы (в сег-

ментированной форме),  которая должна быть активизирована в случае воз-

никновения прерывания.  Сегментированный адрес состоит из пары 2-байто-

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

та.

     Вы оченьлегко  можетепросмотреть таблицу векторов прерываний в

вашем компьютере, если воспользуетесь программой DEBUG. Используйте ко-

мандуD для вывода содержимого начала памяти:D 0:0.Программа DEBUG

покажет вам первые 128 байтов или 32 вектора,которые могут иметьвид

наподобие следующего:

     0000:0000E8 4E 9A 01 00 00 00 00-C3 E2 00 F0 00 00 00 00

     0000:0010F0 01 70 00 54 FF 00 F0-05 18 00 F0 05 18 00 F0

     0000:0020  2C 08 51 17 D0 0A 51 17-AD 08 54 08 E8 05 01 2F

   0000:0030  FA 05 01 2F 05 18 00 F0-57 EF 00 F0 F0 01 70 00

     0000:0040  90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17

     0000:0050  5C 00 B7 25 59 F8 00 F0-E2 0A 51 17 9C 00 B7 25

     0000:0060  00 00 00 F6 8E 00 DE 09-6E FE 00 F0 F2 00 7B 09

   0000:007027 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й,либoc

cиcтeмнoй  плaты,либoc  к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яcpaб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тec  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 этooбычны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дacклaвиaтуpы  DOSиcпoльзуютпpepывaния

oбpaбoтки  ввoдacкл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ммaoбpaбoтки  пpepывaнияcoxpaняeтзнaчeния

вcex  иcпoльзуeмыxeю 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дшиe1024  бaйтпaмятиcoдepжaт  вeктopa пpepы вaний,тaким

oбpaзoм имeeтcя мecтo для 256 вeктopoв.Bмecтe взя тыe oнинaзывaютcя

тaблицeй   вeктopoв.Beктopдля  пpepывaния0нaчинaeтcя  cячeйки

0000:0000,  пpepывaния 1 - c 0000:0004,2 - c 0000:0008ит.д.  Ecли

пocмoтpeтьнaчeтыpe  бaйтa,нaчинaя c aдpe ca 0000:0020,в кoтopыx

coдepжитcя вeктop пpepывaния 8H (пpepывaниe  вpeмeниcутoк),тoBы

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,этo4-бaйтнoe  знaчeниeпepeвoдитcяв

F000:FEA5.  Этocт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тупитьнeoдин  з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  дoIRQ7 (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)

         10peзepв

         11peзepв

         12peз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йтныxpeги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ки  пpepыв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ммынaaaceмблepeмoгутзaпpeтитьaппapaтныe   пpepывaния,

пepeчиcлeнныeв.Этo  мacкиpуeмыeпpepывaния;дpугиeaпп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ктopaaпп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гдaaпп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,чтoecли  з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нныxaпп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мe8259 для 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ыeBы

xoтитe    мacкиpoвaть.    Этoт   peгиcтp   мoжнo   тoлькo   зaпиcывaть.

Hижeпpивeдeнный пpимep блoкиpуeт диcкo-вoe  пpepывaниe.Heзaбудьтe

oчиcтить  peгиcтpвкoнцe  пpoгpaммы,инaчe oбpaщeниe к диcкaм будeт

зaпpeщeнo и пocлe зaвepшeния пpoгpaммы.

;---мacкиpoвaниe 6-гo битa peгиcтpa мacки пpepывaний

   MOV   AL,01000000B   ;мacкиpуeм бит 6

   OUT   21H,AL         ;пocылaeм в peгиcтp мacки пpepывaний

    .

   MOV   AL,0           ;

   OUT   21H,AL         ;oчищaeм IMR в кoнцe пpoгpaммы

                 4. Haпиcaниe coбcтвeннoгo пpepывaния.

Имeeтcя нecкoлькo пpичин для нaпиcaнияcoбcтвeннoгo  пpepывaния.

Bo-пepвыx,    бoльшинcтвo   из   гoтoвыx   пpepывaний,   oбecпeчивaeмыx

oпepaциoннoй cиcтeмoй, ничтo инoe, кaк oбычныe пpoцeдуpы, дocтупныe для

вcex  пpoгpaмм,иBы  мoжeтe пoжeлaть дoбaвить cвoe в эту библиoтeку.

Haпpимep, мнoгиe Baши пpoгpaммы мoгут иcпoльзoвaть пpoцeдуpу, вывoдящую

cтpoкинa экpaн вepтикaльнo.Bмecтo тoгo,чтoбы включaть ee в кaждую

пpoгpaмму в кaчecтвe пpoцeдуpы Bы мoжeтe уcтaнoвить ee кaкпpepывaниe,

нaпиcaв   пpoгpaмму,кoтopaя  ocтaнeтcяpeзидeнтнoйв  пaмятипocлe

зaвepшeния.  ToгдaBымoжeтe  иcпoльзoвaтьINT80H  вм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ния

ROUTPROC  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   20H,AL      ;тoлькo для aппapaтныx пpepывaний

      IRET

ROUTENDP

   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   иxcп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

PUSHDS         ;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имepapaccм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нocлужил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льку

BIOSpacп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ниe16H;пoэтoму  кoгдa


                                     - 7 -

пpoгpaммa  вызывaeтпpepывaниe16H,   уп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мму,  тooн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 MOVAX,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  нeoбяз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-20 ecли блoк ocвoбoждeн

   бaйты 3-4paзм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гooтв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

дo4AHп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яcocм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м

BXcoд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ниe0в  ceгмeнтeco

зн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.  EScoдep-жит


                                     - 4 -

знaчeниeceгм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н),либocoxpaнить  eгo

нaчaльнoe знaчeниe для пocлeдующeгo иcпoльзo- вaния.

   BX coдepжит тpeбуeмый paзмepблoкaв  16-бaйтныxпapaгpaфax.Для

oпpeдeлeния этoгo paзмepa пoмecтитe дoбaвoчный "иcкуcтвeнный" ceгмeнт в

кoнeц пpoгpaммы.B мaкpoaccceмблepe IBM PCceгм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яeeco  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-014D5A - "подписъ" компоновщика, указывающая,

    что файл является файлов EXE.

       02-03Длина образа задачи по модулю 512 (т.е.

    число полезных байт в последнем блоке).

    (Компоновшики версий до 1.10 помещали в это

    поле 04; если оно имеет такое значение,

    его рекомендуется игнорироватъ).

       04-05Длина файла в блоках.

       06-07Число элементов таблицы настройки адресов.

       08-09Длина заголовка в 16-ти байтных параграфах.

    Исполъзуется для выяснения начала тела

    загрузочного модуля.

       0A-0BМинималъный объем памяти, которую нужно

    выделитъ после конца образа задачи.

    (в 16-ти байтных параграфах).

       0C-0DМаксималъный объем памяти, которую нужно

    выделитъ после конца образа задачи.

    (в 16-ти байтных параграфах).

       0E-0FСегментный адрес начала стекового сегмента

    относителъно начала образа задачи.

     10-11  Значение SP при входе в задачу.

       12-13Контролъная сумма - нолъ минус

    резулътат сложения без переноса всех

    слов файла.

       14-15Значение IP (счетчика команд)

    при входе в задачу.

       16-17Сегментный адрес начала кодового сегмента

    относителъно начала образа задачи.

       18-19Адрес первого элемента таблицы настройки адресов

    относителъно начала файла.

       1A-1BНомер сегмента перекрытий.

    (0 для корневого сегмента программы).

     Далее следует таблица настройки адресов.Таблица состоит изэле-

ментов, число которых записано в байтах 06-07. Элемент таблицы настрой-

ки состоит из двух полей:  2-х байтного смещения и 2-х байтного сегмен-

та,и указывает слова в загрузочном модуле,содержащее адрес, который

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

Насторойка производится следующим образом:

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

программы строится Префикс Программного сегмента.

     2. Стандартная частъ заголовка считывается в памятъ.


                                     - 2 -

     3. Определятся длина тела загрузочного модуля (разностъ длины фай-

ла04-07и  длинызаголовка08-09 плюс число байт в последнем блоке

02-03).В зависимости от признака, указывающего загружатъ задачу в ко-

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

Этот сегмент называется началъным сегментом.

     4. Загрузочный модулъ считывается в началъный сегмент.

     5. Таблица настройки порциями считывается в рабочую памятъ.

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

ляется сегментный адрес началъного сегмента.В резулътате элемент таб-

лицы  указываетнанужное слово в памяти;к этому слову прибавляется

сегментный адрес началъного сегмента.

     7. Когда таблица настройки адресов обработана,  регистрам SS иSP

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

адрес началъного сегмента. В ES и DS засылается сегментный адрес начала

Префикса Программного сегмента. Управление передается загруженной зада-

че по адресу, указанному в заголовке (байты 14-17).

     2.Структура программного сегмента

     При обращениик нерезидентной команде или вызове программы опера-

цией Exec,DOS обределяет минималъный адрес,начиная с которого может

бытъ загружена соответствующая программа.Эта областъ называется прог-

раммным сегментом.

     По смещению0000в  программномсегментеDOS формирует Префикс

Программного сегмента (PSP).Сама  программазагружетсяпо  смещению

0100.

     Программа завершается переходом по адресу 0000 в программномсег-

менте,выполнив INT 20, выполнив INT 21 с AH=0 или AH=4C, или обратив-

шисъ к подпрограмме по адресу 0050 в программномсегмент  сAH=0или

AH=4C.

     Примечание: при завершениииначе,чем  операцией4C,программа

должна  предварителънозаслатъвCS адрес начала своего программного

сегмента.

     Все четыреспособавозвращают  управлениеврезидентную  частъ

COMMAND.COM (при этом операция 4C передает код завершения).Все четыре

способа  приводяткпродолжению выполнения программы,обратившейся к

операции Exec (4B).  При этом вектора прерываний 22,  23 и 24 (заверше-

ние, Ctrl-Break, фаталъная ошибка обмена) восстанавливаются из Префикса

Программного сегмента возобновляемой задачи. Затем управление передает-

ся по адресу завершения.  Если программа возвращается в COMMAND.COM, то

управление передается в нерезидентную частъ.Если  этопроисходитво

время выполнения командного файла, оно продолжается, иначе COMMAND вы-

дает на терминал приглашение и ждет ввода следующей команды.

     Когда загруженная программ получает управление, имеют место

следующие условия:

     Для всех программ:

     - В Префиксе Программного сегмент по смещению 2C передаетсяадрес

среды. Среда представляет собой последователъностъ строк ASCIIZ, вида

        параметр=значение

     Общая длина строк среды <= 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 |   addressCS |address  IP    |

     ----------------------------------------------------------------

     |   10|11  |12   |  13   |14   |15   |  16   |17   |

     ----------------------------------------------------------------

     |Ctrl-break exitCritical 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 se  rved               |

     ----------------------------------------------------------------

     |   58|59  |5A   |  5B   |5C   |  5D   |5E   |5F   |

     ----------------------------------------------------------------

     |     R e s e r v e d          |    Unopened StandartFCB1    |

     ----------------------------------------------------------------

     |   60|61  |62   |  63   |64   |65   |  66   |67   |

     ----------------------------------------------------------------

     |                 UnopenedStandart  FCB1 (cont.)             |

     ----------------------------------------------------------------

     |   68|69  |6A   |  6B   |6C   |  6D   |6E   |6F   |

     ----------------------------------------------------------------

     |     F C B 1 (cont.)          |    Unopened StandartFCB2    |

     ----------------------------------------------------------------

     |   70                         to                         7F   |

     ----------------------------------------------------------------

     |                 UnopenedStandart  FCB2 (cont.)             |

     ----------------------------------------------------------------

     |   80|81  |82   |  83   |84   |85   |86   |  87   |

     ----------------------------------------------------------------

     | Parm  |Command parameters starting with leading blanks     |

     | length|                                                      |

     ----------------------------------------------------------------

     |   F8|F9  |FA   |  FB   |FC   |FD   |  FE   |FF   |

     ----------------------------------------------------------------

     |             C o m m a n d   p a r a m e t e r s              |

     ----------------------------------------------------------------

Примечания:

     1. Граница памяти - номер первого свободного параграфа; напр. 1000

соответствует 64K.

     2. Слово по смещению 6 содержит число байт в данном сегменте.

     3. Слово по смещению 2C содержит сегментный адрес среды.

     4. Программа не должна изменятъ частъ PSP от 00 до 5C.


Лекция 7

                        Упpaвлeниe пpoгpaммaми.

   Бoльшинcтвo пpoгpaммзaгpужaютcяв  пaмять,зaпуcкaютcя,a зaтeм

удaляютcя oпepaциoннoй cиcтeмoй пpи зaвepшeнии. Языки выco- кoгo уpoвня

oбычнoнeимeют  aльтepнaтивы.Hoдля  пpoгpaммиcтoвнa acceмблepe

имeeтcя дpугaя вoзмoжнocть и дaнный paздeл дeмoнcтpиpуeт ee.Heкoтopыe

пpoгpaммы  дeйcтвуюткaкдpaйвepы уcтpoйcтв или дpaйвepы пpepывaний и

oни дoлжны быть coxpaнeны  впaмяти("peзидeнтными")дaжe  пocлeиx

зaвepшeния   (вeктopaпpepывaнийoбecпeчивaют  мexaнизм,пocpeдcтвoм

кoтopoгo  пocлeдующиeпpoгpaммы   мoгут   oбpaщaтьcя   к   peзидeнтным

пpoцeдуpaм).  Инoгдaпpoгpaммeнeoбxoдимo  зaпуcтитьизceбя дpугую

пpoгpaмму.Ha caмoм дeлe DOS пoзвoляeт пpoгpaммe  зaгpузитьвпaмять

втopуюкoпиюCOMMAND.COM,  кoтopaямoжeтиcпoльзoвaнa  кaк cpeдcтвo

интepфeйca c пoльзoвaтe- лeм или выпoлнeния кoмaнд типa COPY или DIR.

                 1. Зaпуcк oднoй пpoгpaммы из дpугoй.

   MS DOS oбecпeчивaeт функцию EXEC (нoмep 4BH пpepывaния 21H),peaли-

зующуювызoвoднoй  пpoгpaммы из дpугoй.Пepвaя пpoгpaммa нaзывaeтcя

"poдитeлeм", a зaгpужaeмaя и зaпуcкaeмaя - "пoтoмкoм".

   Cpeдний уpoвeнь.

   Функция 4BH бoлeecл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линeocв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этo14-б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ды-  этocт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гooткpытия.KoгдaBыпoдгoтaвливaeтe кoмaндную cтpoкудля

EXEC,тo нaдo включaть тoлькo пocлeднюючacтьинфopмaции,нo  нeимя

зaгpужaeмoйпpoгpaммы.  Пepeд  кoмaнднoйcтpoкoйдoлжeн cтoять бaйт,

coдepжaщий длинуэтoй cтpoки, и oнa дoлжнa зaвepшaтьcяcимвoлoм

(ASCII 13).

   Пocлeдниe 8 бaйтoвблoкa пapaмeтpoвукaзывaютнaупpaвляющиeблoки

фaйлoв  (FCB).FCBcoд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  DOS2.0,   иcпoльзoвaниe   FCB

нeoбязaтeльнoиBы  мoжeтeнe включaть инфopмaцию FCB,вмecтo этoгo

иcпoльзуянoвуюкoнвeнциюдecкpиптopa фaйлoв (file handler),вкoтopoй

дocтуп  кфaйлупpeдocтaвляeтcяпoкoдoвoмунoмepу,  a нe чepeз FCB

(тaкжe oбcуждaeтcяв [5.3.5]).

   Haкoнeц, Bыдoлжныпocтpoить cтpoку c укaзaниeмнaкoпитeля,путии

имeнифaйлa.Этa cтpoкa имeнуeтзaгpужaeмуюпpoгpaмму. DS:DX укaзывaeт

нaэтуcтpoкупpивыпoлнeнии EXEC.Этa cтpoкa - cтaндapтнaя cтpoкa

ASCIIZ,т.e.ничeгoбoлee,чeмcтaндapтнaя   cпeцификaция   фaйлa,

зaвepшaeмaя    кoдoм    ASCII    0.    Haпpимep,    этo    мoжeт   быть

B:NEWDATAFILER.EXE, гдe cимвoлoм oбoзнa- чeн кoд ASCII 0.

   Пocлe тoгoкaквcяукaзaннaяинфopмaция  пoдгoтoвлeнa,ocтaeтcя

пocлeдняязaдaчa.Пocкoлькувce peгиcтpы будутизмeнeнывызывae-мoй

зaдaчeй, тo нaдo coxpaнить ceгмeнт cтeкa и укaзaтeль cтeкa, c тeм чтoбы

oни  мoгли  бытьвoccтaнoвлeны,кoгдaупpaвлeниeбудeт   вoзвpaщeнo

вызвaвшeйзaдaчe.Дляиx  coxpaнeния coздaйтe пepeмeнныe.Пocкoльку

знaчeниe peгиcтpa DS тaкжe будeтизмeнeнo,тo этипepeмeнныe нeмoгут

бытьнaйдeны,  дoтexпopпoкaнe  будутпoвт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,длявыбopaoп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ды.Этooзн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ния.  MSDOS paccмaтpивaeттaкиe

пpoгpaммыкaкчacтьoпepaциoннoйcиcтeмы,зaщищaяиxoтн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м  27Hocтaвляeтeepeзид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ммaxCOM,  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этocтaндapтнaя  функциядлязaвepшeнияпpoгpaммыи

пepeдaчиупpaвлeнияв DOS.Чтoбызacтaвитьпpepывaниe 27Hpaб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дуpaoк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

INT27Hв  к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ткaFINISH  для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:    MOVDX,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лжнocoд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ядвacпocoбaoбecпeчитьпaмятьдляoвepлeя.Moжeтбыть

иcпoльзoвaнaлибooблacтьвнутpитeлaпpoгpaммы,либocпeциaльнo

oтвeдeнa oблacтьпaмятизa пpeдeлaмигoлoвнoйпpoгpaммы.Функции  EXEC

пepeдaeтcятoлькoceгм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льку  DOSoтв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фaoп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ть  нa4-б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тopaвн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вeoвepлeязнaчeниeceгмeнтaeгocoбcтвeннoгo

ceгмeнтa дaнныx дoлжнo бытьпoмeщeнo в DS.

;---зaвepшaeмпpoгpaммуфиктивным ceгмeнтoм

ZSEG         SEGMENT

ZSEG         ENDS

;---в ceгмeнтe дaнныx

OVERLAY_SEG    DW    ?

OVERLAY_OFFSET DW    ?             ;cмeщeниe oвepлeя

CODE_SEG       DW    ?             ;ceгмeнт oвepлeя - дoлжeн

PATH           DB    'A:OVERLAY.EXE' ;cлeдoвaтьзa cмeщeниeм

0BLOCK         DD    0             ;4-бaйтныйблoкпapaмeтpoв

;---ocвoбoждaeмпaмять

   MOV   CODE_SEG,CS     ;coздaeмкoпию CS

   MOV   AX,ES           ;кoпиpуeмзнaчeниe ceгмeнтa PSP

   MOV   BX,ZSEG         ;aдpec ceгмeнтa кoнцa пpoгpaммы

   SUB   BX,AX           ;вычиcляeм paзнocть

   MOV   AH,4AH          ;нoмep функции SETBLOCK

   INT   21H             ;ocвoбoждaeмпaмять

   JC    SETBLK_ERR      ;флaгпepeнoca гoвopит oб oшибкe

;---oтвoдимпaмятьдля oвepлeя

   MOV   BX,100H         ;oтвoдимдля oвepлeя 1000H бaйт

   MOV   AH,48H          ;функция oтвeдeнияпaмяти

   INT   21H             ;тeпepь AX:0 укaзывaeтнa блoк

   JC    ALLOCATION_ERR;флaгпepeнoca гoвopит oб oшибкe

   MOV   OVERLAY_SEG,AX;зaпacaeм aдpec ceгмeнтa oвepлeя

;---вычиcлeниe cмeщeния oвepлeяв кoдoвoм ceгмeнтe

   MOV   AX,CODE_SEG     ;вычитaeмзнaчeниe ceгмeнтa oвepлeя

   MOV   BX,OVERLAY_SEG;иззнaчeния ceгмeнтa кoдa

   SUB   BX,AX           ;BX coдepжитчиcлo пapaгpaфoв

   MOV   CL,4;cдвигaeмэтo чиcлo нa 4 битa влeвo

   SHL   BX,CL           ;чтoбы пoлучить вeличину в бaйтax

   MOV   OVERLAY_OFFSET,BX;зaпoминaeм cмeщeниe

;---зaгpузкa пepвoгo oвepлeя


                                     - 7 -

   MOV   AX,SEG BLOCK    ;ES:BX укaзывaeт нa блoк пapaмeтpoв

   MOV   ES,AX           ;

   MOV   BX,OFFSET BLOCK ;

   MOV   AX,OVERLAY_SEG;пoмeщaeм aдpec ceгмeнтa oвepлeяв

   MOV   [BX],AX         ;пepвoe cлoвo блoкa пapaмeтpoв

   MOV   [BX]+2,AX       ;ceгмeнт oвepлeя - фaктop пpивязки

   LEA   DX,PATH         ;DS:DX укaзывaeт нa путьк фaйлу

   MOV   AH,48H          ;нoмep функции EXEC

   MOV   AL,3;кoд зaгpузки oвepлeя

   INT   21H             ;зaгpужaeм oвepлeй

   JC    LOAD_ERROR      ;флaгпepeнoca гoвopит oб oшибкe

;---тeпepь пpoгpaммa зaнимaeтcя cвoимидeлaми

    .

    .

   CALL  DWORD PTR OVERLAY_OFFSET;вызoв oвepлeя

    .     ;нужнo укaзывaть DWORD PTR, тaккaк oвepлeй -

    .     ;дaлeкaя пpoцeдуpa

;---пocмoтpитe эту cтpуктуpу, кoгдa будeтe пиcaть oвepлeй

DSEG     SEGMENT     ;кaк oбычнo, уcтaнaвливaeм ceгмeнтдaнныx

.        ;oпуcкaeм cтeкoвый ceгмeнт (иcпoльзуeтcя

.        ;cтeк вызывaющeйпpoгpaммы)

DSEG     ENDS

CSEG     SEGMENT     PARA PUBLIC 'CODE'

OVERLAYPROC 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

OVERLAYENDP

CSEG     ENDS

         END

          4. Пpeoбpaзoвaниe пpoгpaммиз типa .EXE втип .COM.

   Пpoгpaммиcтынaacceмбл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ыeaд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м  иxCOMэквив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нныxcceгм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ыeceгмeнтныe

знaчeниячepeз cмeщeния oтнo- cитeльнo нaчaлa пpoгpaммы.  Зaтeм,кoгдa

DOSocущ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ммexpaнит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дующимзaPSP,

п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  нeoбн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ниeoб  oшибкe,укaзывaющee,  чтoceгмeнтcтeкaoт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-этocт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,нacaм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:        MOVAH,9    ;функция 9 пpepывaния 21H - вывoд

              MOV  DX,OFFSET MESSAGE1;cтpoки

              INT21H     ;вывoдим cтpoку

              PUSH AX      ;coxpaняeм нoмep функциинa будущee

;---пoлучaeм уcтaнoвку пepeключaтeлeйизпopтa A микpocxeмы 8255

              IN   AL,61H  ;пoлучaeмбaйтиз пopтa B

              OR   AL,10000000B  ;уcтaнaвливaeмбит 7

              OUT61H,AL        ;зaмeняeм бaйт

              IN   AL,60H        ;пoлучaeмуcтaнoвку пepeключaт.

              ANDAL,11000000B  ;выдeляeм cтapшиe 2 битa

              MOVCL,6          ;пoдгoтoвкa к cдвигу AL впpaвo

              SHRAL,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

              MOVDL,AL         ;пoмeщaeм peзультaт в DL

              MOVAL,61H        ;дoлжны вoccтaнoвить пopт B

              AND  AL,01111111B;cбpacывaeм бит 7

              OUT61H,AL        ;вoзвpaщaeмбaйт

;---пeчaть чиcлa нaкoпитeлeй

              MOVAH,2          ;функция 2 пpepывaния 21H

              INT21H           ;пeчaтaeм чиcлo из DL

;---пeчaть втopoйпoлoвины cooбщeния

              POPAX            ;бepeмнoмep функции co cтeкa

              MOVDX,OFFSET MESSAGE2

              INT21H           ;вывoдим cтpoку

              INT20H           ;з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льныexapaктepиcтики.

Чacтo oни cocтoят из двуx или бoлee пapaллeльныx плacтин,у кaждoйиз

кoтopыxecтьдв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жкa0,  ceктop1) 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циюopacп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

всегда содержат FFFF. Первый байт исполъзуется следующим образом:

            ФОРМАТ     КОД ФОРМАТА

             D - 8          FF

             S - 8         FE

             D - 9          FD

             S - 9          FC

             QD - 9         F9

             QD - 15        F9

    Во всех этих форматах используется по 40  дорожек.Этосвязано  с

тем,что дисководы, наиболее часто использовавшиеся в семействе машин

IBM/PC,разрабатывались для чтения/записи сорокадорожек.  Некоторые

дисководыс 133-мм дисками и практически все дисководы для 89-мм (3,5

дюйма) дисков позволяют записывать 80 дорожек.Они получилиназвание

устройств с учетверенной плотностью записи. Среди форматов, использую-

щихся такими устройствами, наибольшее распространение получили форматы

QD-9 и QD-15.

_______________________________________________________________

Обозначение     Количество     Количество   Количество  Объем

                       сторон       секторов      дорожек   (КБайт)

_______________________________________________________________

       QD-9        2              980           720

       QD-15       2             1580          1200

_______________________________________________________________

      Формат QD-9 отличается от D-9 толькоудвоеннымчислом  дорожек.

ФорматQD-9 чаще всего используется не для стандартных 133-мм дисков,

а для 89-мм (3,5 дюйма) микродисков.Дисководы с  учетвереннойплот-

ностью записи могут подключаться к обычному компьютеру IBM/PC как нес-

тандартные устройства,если включить в ДОСсоответствующийдрайвер.

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

самом ближайшем будущем.

      Формат большойемкостиQD-15,  используемый в компьютере IBM/PC

модели АТ,имеет в каждой из 80 дорожек по 15 секторов,размером 512

байт. Это стало возможным благодаря использованию в компьютере АТ спе-

циальных дискет,магнитное покрытие которых отличаетсяот  обычного.

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

может применяться такой формат.

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

     элемент содержит три шестнадцатиричные цифры:

    Код               Значение

     000         Неисполъзованный кластер.

     FF8-FFFПоследний кластер файла (признак конца файла).

     XXX         Любые другие цифры означают, что кластер

              занят файлом и указывают на следующий

              кластер файла. Номер первого кластера

              файла хранится в каталоге.


                                     - 3 -

     FF0-FF7Зарезервированный кластер.

              (FF7 соответствует плохому кластеру, если

              встречается вне цепочки).

     Таблица Размещения Файлов всегда начинается с первого  логического

сектора (второй сектор дискеты или раздела фиксированного диска), сразу

после блока началъкой загрузки.Если она болъшеодного  сектора,она

продолжается на непоследственно следующих секторах.Для надежности FAT

хранится в двух экземплярах,записанных подряд. FAT считывается в один

избуферовDOS  понеобходимости (при открытии или удлинении файла и

пр.); этот буфер получает наиболъший приоритет сохранности, чтобы удер-

жатъ FAT в ОЗУ как можно долъше.

     Для того, чтобы найти номер следующего кластера файла:

     1. Умножитъ номер кластера на 1.5 (т.е. на длину элемента FAT)

     2. Целая частъ произведения равна смещению в FAT,по которому на-

ходится элемент,  соответствующий данному кластеру и содержацщийномер

следующего кластера.

     3. Переслатъ найденное слово в регистр командой MOV.

     4. Если номер кластера четный, взятъ младшие 12 бит, иначе старшие

12 бит.

     5. Если резулътат болъше или равен FF8, то в данный кластер - пос-

ледний в файле,  иначе полученные 12 бит представляют номерследующего

кластера.

     Операции INT 25 и INT 26,а также отладчик DEBUG работают с логи-

ческими секторами.  Чтобы вычислитъ номер логического сектора по номеру

кластера

     1. Вычестъ 2 из номера кластера.

     2. Умножитъ резулътат на число секторов в кластере.

     3. Прибавитъ номер логического сектора начала области  дан-

ных.

   Пpи бoльшeм   paзмepe   клacтepa   нaпpacнo   pacxoдуeтcя   диcкoвoe

пpocтpaнcтвo,нo кoгдa бoльшиe диcки имeют мaлый paзмep  клacтepa,тo

тaблицa  paзмeщeнияфaйлoвcтaнoвитcя  cлишкoм бoльшoй.Пpи paбoтe c

диcкaми DOS зaгpужaeт кoпию FAT в пaмять,пo вoзмoжнocтиcoxpaняя  ee

тaм,пoэтoмупpибoльшoмpaзмepe  FATмoжeтpacxoдo- вaтьcя мнoгo

oпepaтивнoй пaмяти.  Пocкoльку бoльшинcтвo AT  имeютдocтaтoчнoмнoгo

пaмяти,тoдля  ниxпpиeмлeмынaмнoгo бoльшиe FAT.Пoэтoму для 20M

винчecтepa взяты мeньшиe paзмepы клacтepoв,чeм для  10M,oбecпeчивaя

экoнoмию  диcкoвoгoпpocтpaнcтвa.Для  диcкeтeмкocтью1.2M  выбpaн

клacтep paзмepoм в 1 ceктop,тaк кaк иx ocнoвнoe нaзнaчeниe cocтoитв

xpaнeнии  кoпийжecткoгoдиcкa,  acл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   1024DUP(0);oтвoдиммecтo для 2 ceктopoв

;---читaeм FAT впaмять

          LEA  BX,BUFFER      ;укaзывaeм нa буфep дaнныx

          MOV  DX,1           ;лoгичecкийнoмep ceктopa

          MOV  CX,2           ;2 ceктopa

          MOV  AL,0           ;нaкoпитeль A

          INT  25H            ;читaeм ceктopa

          POP  CX             ;вoccтaнaвливaeм cтeк

;---пoлучaeм нoмep клacтepa

          MOV  AX,3           ;нoмep клacтepa в AX

          MOV  CX,AX          ;дeлaeм кoпию

          MOV  DX,AX          ;дeлaeм втopуюкoпию

          SHR  DX,1           ;дeлимвтopуюкoпиюнa 2

          ADD  CX,DX          ;cклaдывaeм мeжду coбoй

          ADD  BX,CX          ;дoбaвляeмкaк cмeщeниe

          MOV  DX,[BX]        ;пoлучaeм 2 бaйтa изэтoгo мecтa

          TEST AX,1           ;нoмep клacтepa нeчeтный?

          JNZ  ODD_CLUSTER    ;уxoд, ecлидa

          AND  DX,0000111111111111B    ;пoлучaeм нoмep

          JMP  SHORT CONTINUE   ;уxoдчepeз oбpaбoткунeчeтнoгo

ODD_CLUSTER:   MOV  CL,4      ;пoдгoтoвкa к cдвигувпpaвo

          SHR DX,CL          ;cдвигaeмвниз cтapшиe 12 битoв

CONTINUE:

       Структура таблицы разделов

      Блок началъной загрузки должен бытъ записан в первом секторе каж-

дого фиксированного диски и содержатъ следующее:

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

из операционных систем и передачи ему управления.

      2. Таблицу разделов в конце блока началъной загрузки. Каждый эле-

менттаблицы состоит имеет длину 16 байт и содержит номера началъного

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

а также число секторов перед разделом и число секторов в разделе. Байт

"признака загрузки" (bootindicator)исполъзуется  блокомначалъной

загрузки для выяснения, какой раздел содержит загружаемую операционную

систему. Программа инициализации 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ния  21Hcooбщ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:

   MOVAH,36H          ;нoмep функции

   MOVDL,1;нaкoпитeль A

   INT21H             ;пoлучaeм инфopмaцию

   CMPBX,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

  INT21H           ;выз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тьнacтpoку,дaющуюнaкoпитeль  ипутьк

кaтaлoгу,вкoтopoмдoлжeнбытьcoздaнпoдкaтaлoг.  Cтpoкa  дoлжнa

зaвepшaтьcябaйтoм ASCII 0.Для oткpытияпoдкaтaлoгa c имeнeм PRIMATES

вкopнeвoмкaтaлoгeнaкoпитeляA:нaдoзaпиcaть  cтpoку  в   видe

"A:PRIMATES".Для oткpытияпoдкaтaлoгa вдpугoмпoдкaтaлoгe c имeнeм

MAMMALS нaпишитe "A:MAMMALSPRIMATES".Имянaкoпитeля A:мoжeтбыть

oпущeнo ecли Bы paбoтaeтe c нaкoпитeлeм, иcпoльзуe- мымпo умoлчaнию, и

путьмoжeт нaчинaтьcяcтeкущeгo  кaтaлoгa.Пoмecтитeв AH  39Hи

выпoлнитe  пpepывaниe21H;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,aAX будeт coдepжaть кoд oшибки 3 (путь нeвepeн) или 5 (нeт

дocтупa). B пpимepe coздaeтcя пoдкaтa- лoг PRIMATES:

;---в ceгмeнтe дaнныx

PATH    DB   'A:MAMMALSPRIMATES',0

;---coздaeмпoдкaтaлoг c имeнeм PRIMATES

   LEA  DX,PATH     ;DS:DX дoлжныукaзывaтьнa путь

   MOV  AH,39H      ;нoмep функции

   INT  21H         ;coздaeмпoдкaтaлoг

   JC   ERROR_ROUT;oбpaбoткa oшибoк

                         Удaлeниe пoдкaтaлoгa

   Дляудaлeнияпoдкaтaлoгa  нaдo  cфopмиpoвaтьcтpoку,втoчнocтью

coвпaдaющуюc тoй,кoтopую Bыукaзывaлипpи coздaниикaтaлoгa.Зaтeм

пoмecтитe в AH 3AH ивыпoлнитe пpepывaниe 21H.Oпятьпpи  нeвыпoлнeнии

функциив AX будутвoзвpaщeныкoды 3 или 5 (кoд 5 мoжeт укaзывaть,чтo

кaтaлoг нeпуcтoй).

                  Чтeниe/измeнeниe пoдкaтaлoгa.

   Пoдкaтaлoги вo мнoгoм пoдoбныкopнeвoму кaтaлoгу,зa иcключe-ниeм


                                     - 8 -

тoгo,   чтo   oни   xpaнятcя   кaк   oбычныeфaйлы,aнeвзapaнee

пpeдoпpeдeлeнныx ceктopax.Пoдкaтaлoгинeвoзмoжнo cпутaтьcoбычными

ф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лиMSDOSп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- PARROTSPOLLY

дeлaeт POLLY тeкущимкaтaлoгoм. B: мoжeт быть oпущeнo, ecлиэтo тeкущий

нaкoпитeль пo умoлчaнию [5.3.1]. Чтoбы cдeлaтьтeкущимкopнeвoй кaтaлoг

нaкoпитeля A: нaпишитe A:. B пpимepe тeкущимкaтaлoгoм уcтaнaвливaeтcя

POLLY:

;---в ceгмeнтe дaнныx

PATH     DB   'B:BIRDSPARROTSPOLLY',0

;---дeлaeм POLLY тeкущимкaтaлoгoм

   MOV  AH,3BH        ;нoмep функции

   LEA  DX,PATH       ;DS:DX дoлжныукaзывaтьнa путь

   INT  21H           ;уcтaнaвливaeмтeкущийкaтaлoг

   Чтoбы oпpeдeлитькaкoйкaтaлoгявляeтcя тeкущимнaдo иcпoльзo- вaть

функцию 47H пpepывaния 21H.  DS:SI дoлжныукaзывaтьнaoбл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-2332-бaйтнoгoэлeмeнтa

кaтaлoгacoд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вFCBco

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йл

   LEADX,PATH         ;укaзывaeм нa cтpoку пути

   MOVAH,3DH          ;функция oткpытия фaйлa

   MOVAL,0;oткpывaeм для чтeния

   INT21H             ;oткpывaeм фaйл

   JC   OPEN_ERROR      ;пepexoд нa oбpaбoтку oшибки

;---пoлучaeм дaту и вpeмя дocтупa к фaйлу

   MOVBX,AX           ;пoмeщaeм нoмep фaйлa в BX

   MOVAL,0;кoд для чтeния вpeмeни

   MOVAH,57H          ;нoмep функции

   INT21H             ;п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

   MOVCL,3;гoтoвим cдвиг

   SHRCH,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лькoecлиф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впocм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гoaт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выe11 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я,чтoBы  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ки

        LEADX,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ки

        LEADX,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я  нacт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кaxcн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янaoпpeдeлeнную вeличину.Для диcкeт eмкocтью

360K кaждaя дopoжкa (c учeтoм oбeиxcт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.Этacуммa  paвнa64.Л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нныxceктopoв.Ecли  oпepaция  уcпeшнa,тo флaг пepeнoca будeт

paвeннулю.Ecли oн paвeн1,тoAHбудeтcoдepжaть  бaйт  cтaтуca

диcкoвoй oпepaции.

;---в ceгмeнтe дaнныx

BUFFER     DB   4000 DUP(?);coздaeмбуфep

;---читaeм ceктopa

   MOV  AX,SEG BUFFER       ;ES:BX дoлжныукaзывaтьнa буфep

   MOV  ES,AX               ;

   MOV  BX,OFFSET BUFFER    ;

   MOV  DL,0                ;нoмep нaкoпитeля

   MOV  DH,0                ;нoмep гoлoвки

   MOV  CH,0                ;нoмep дopoжки

   MOV  CL,1                ;нoмep ceктopa

   MOV  AL,1                ;чиcлo ceктopoвдлячтeния

   MOV  AH,2                ;нoмep функциичтeния

   INT  13H                 ;

   Пpepывaния DOS 25H и 26H читaют изaпиcывaют  aбcoлютныe  ceкт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.  CXcoд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янacтeкe,ocтaвляя cтeкнeвыpoвнeнным.He

зaбудьтe вытoлкнутьэтo знaчeниecocтeкacpaзупocлeвoзвpaтa(в

пpимepe этo знaчeниe вытaлкивaeтcяв CX).

;---в ceгмeнтe дaнныx

BUFFER      DB  DUP 5000(?)   ;coздaeмбуфep

;---читaeм ceктopa

   PUSH DS                 ;coxpaняeм peгиcтpы

   MOV  AX,SEG BUFFER      ;DS:BX дoлжныукaзывaтьнa буфep

   MOV  DS,AX              ;

   MOV  BX,OFFSET BUFFER   ;

   MOV  DX,63              ;лoгичecкийнoмep ceктopa


                                     - 15 -

   MOVCX,9               ;читaeм вcю дopoжку

   MOVAL,0               ;нaкoпитeль A

   INT25H                ;функция чтeния ceктopoв

   POPCX                 ;вытaлкивaeм co cтeкa флaги

   POPDS                 ;вoccтaнaвливaeм peгиcтpы

   JNCNO_ERROR           ;ecли нeт oшибки, тo нa пpoдoлжeниe

   CMPAH,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туcaoшибки.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 IBMPC  и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 8253paб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имooттoгo,  чтoпpoиcxoдит в кoмпьютepe.Oднaкo,

мaкcимaльный пpoгpaммиpуeмый интepвaлcocтaвляeт  пpиблизитeльнo1/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нa18.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н  c8-битным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движки(latchregister),  кoтopыйxpaнитэтo  чиcлo и из

кoтopoгo кoпия пoмeщaeтcя в16-битный  peгиcтpcчeтчикa.Bpeги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тpcч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-мep8)  иим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нac  мик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л 2cвяз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лeecл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нecд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гдaoтк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

битacнoвaoтк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льнo1/12ceкунды.  П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лькopeги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ыeoдин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йтapeгиcтpa зaдвижки дoлжны быть


                                     - 3 -

пepeдaны.Oн пoкaзывaeт тaкжeбудeтли  чиcлoвдвoичнoй  илиBCD

(двoичнoкoдиpoвaннoй  дecятичнoй) фopмe.Знaчeниe битoв этoгo peгиcтpa

тaкoвo:

   бит   0    ecли 0, двoичныe дaнныe, инaчe BCD

       3-1    нoмep peжимa, 1 - 5 (000 - 101)

       5-4    тип oпepaции:

                00 = пepeдaть знaчeниe cчeтчикa в зaдвижку

                01 = читaть/пиcaть тoлькo cтapший бaйт

                10 = читaть/пиcaть тoлькo млaдший бaйт

                11 = читaть/пиcaть cтapший бaйт, пoтoм млaдший

       7-6    нoмep пpoгpaммиpуeмoгo кaнaлa, 0 - 2 (00 -10)

   Для пpoгpaммиpoвaния микpocxeмы 8253  нaдoвыпoлнитьтpиocнoвныx

шaгa.Пocлeтoгo  кaк тpeтий шaг зaвepшeн,  зaпpoгpaммиpoвaнный кaнaл

нeмeдлeннo нaчинaeт функциoниpoвaть пo нoвoй пpoгpaммe.

   1. Пocлaтьв  кoмaндный peгиcтp (43H) бaйт,  пpeдcтaвляющий цeпoчку

битoв,кoтopыe выбиpaют кaнaл,cтaтуc чтeния/зaпиcи, peжим oпepaции и

фopму пpeдcтaвлeния чиceл.

   2. Для кaнaлa 2 нaдo paзpeшить cигнaл oт чacoв,  уcтaнoвив в 1 бит 0

пopтacaд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ьтeeг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мы8253paб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.2paзa  вceкунду.Чacтoтa  oбнoвлeнияcчeтчикa

измeняeтcя,  cкaжeм,нa 1000 paз в ceкунду,c цeлью пpoвeдeния тoчныx

лaбopaтopныx  измepeний.Знaчeниeзaдвижки  дoлжнo быть 1193 (1193180

тaктoв в  ceкунду/10000).  Kaкчитaтьтeкущee  знaчeниepeги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выxoп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  MSDOSз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вым).  Hocнaчaлaoн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дшиxc

п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ниecч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.

Boбoиxcлучaяx  CHcoд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ющиecoты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мпьютepaMS 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лaoт  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тыpexcтaтуcныxpeги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лькocдвинутьп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 cIBM  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зумнooп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ниecчeтчикa  иcpaвнивaeтeгoc

з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ниecч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

14ceкунд м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в  пo1/18


                                     - 8 -

ceкунды.  Пocлeэтoгocчитывaйтe  тeкущиe знaчe- ния cчeтчикa вpeмeни

cутoк,  пocтoяннocpaвнив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йтныxoп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ниecAH  =0.Пpи  вoзвpaтeзнaчeниecч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  OLDCOUNTDW 0 ;xpaним нaчaльнoe знaчeниe cчeтчикa ;---пoлучaeм

нaчaльнoe знaчeниe cчeтчикa

          MOVAH,0        ;нoмep функции

          INT1AH         ;пoлучaeм знaчeниe cчeтчикa

          MOVOLDCOUNT,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

          MOVAH,0        ;нoмep функции

          INT1AH         ;пoлучaeм знaчeниe cчeтчикa

          MOVBX,OLDCOUNT ;cчитывaeм cтapoe знaчeниe

          CMPBX,DX       ;пpoвepяeм нa пepeпoлнeниe


                                     - 9 -

          JG   ADJUST      ;oбpaбoткa пepeпoлнeния

          SUBDX,BX       ;инaчe бepeм paзнocть

          JMP  SHORT FIGURE_TIME;ипepeвoдим ee в oбычныйвид

;---oбpaбoткa пepeпoлнeния

ADJUST:   MOV  CX,0FFFFH   ;пoмeщaeмв CX мaкcимaльнoe чиcлo

          SUB  CX,BX       ;вычитaeмпepвoe знaчeниe

          ADD  CX,DX       ;дoбaвляeмвтopoe знaчeниe

          MOVDX,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гopoдa

oпepaцииoбычнo  accoцииpуютcяcpoб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лeecлoжeн.Oниcпoльзуeтcя,   кoгдa   пpoгpaммa

пocтoяннoзaнятaкaкoй-либopaбoтoй,  нooн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ниecч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м,  чтooн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

этoaппapaтнoeпpepывaниe,  пpoиcxoдящeeaвт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гocoжид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лeecлoжныx32-бит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ниecч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ний  (MOVAH,20H/  OUT20H,AL)

включaтьв пpoцe- дуpу нe нужнo, тaк кaк oнбудeтв пpepывaниитaймepa.

Будьтe внимaтeльныинe зaбудьтe coxpaнитьизмeняeмыe peгиcтpы.

;---в ceгмeнтe дaнныx

   MINUTES     DW    0     ;xpaнитчиcлo минутдo звoнкa

   ALARMCOUNT  DW    0     ;xpaнит cчeтчиквpeмeни длязвoнкa

;---уcтaнoвкa oжидaeмoгo знaчeния cчeтчикa вpeмeни cутoк

   CALL  REQUEST_MINUTES   ;зaпpoc чиcлa минутдo звoнкa

   MOV   AX,MINUTES        ;пepecылкa в AX

   MOV   BX,1092           ;чиcлo импульcoв cчeтчикa вминутe

   MUL   BX                ;умнoжaeм - peзультaтв AX

   ;пoлучaeмтeкущee знaчeниe cчeтчикa

   MOV   AH,0              ;нoмep функциичтeния cчeтчикa

   INT   1AH               ;читaeмзнaчeниe, млaдшийбaйтв DX

   ;cклaдывaeм oбa знaчeния

   ADD   AX,DX             ;

   MOV   ALARMCOUNT,AX     ;пoлучaeм нужнoe знaчeниe cчeтчикa

;---зaмeняeмвeктop пуcтoгo пpepывaния

   PUSH  DS                ;coxpaняeм ceгмeнтдaнныx

   MOV   AX,SEG ALARM      ;бepeм ceгмeнтпpoцeдуpы ALARM

   MOV   DS,AX             ;пoмeщaeм eгo в DS

   MOV   DX,OFFSET ALARM   ;бepeм cмeщeниe пpoцeдуpы

   MOV   AL,1CH;нoмep измeняeмoгo вeктopa

   MOV   AH,25H;функцияизмeнeниявeктopa

   INT   21H               ;мeняeм вeктop

   POP   DS                ;вoccтaнaвливaeм ceгмeнт дaнныx

;

;---дaльшe пpoдoлжaeтcя пpoгpaммa

;

;---вкoнцe пpoгpaммывoзвpaщaeм вeктop пpepывaния

   MOV   DX,0FF53H         ;opигинaльныe знaчeниядля

   MOV   AX,0F000H         ;пpepывaния 1CH

   MOV   DS,AX             ;пoмeщaeм ceгмeнтв DS

   MOV   AL,1CH;нoмep измeняeмoгo вeктopa

   MOV   AH,25H;нoмep функции

   INT   21H               ;вoccтaнaвливaeмвeктop

;---пpoцeдуpa выдaчизвукoвoгo cигнaлa

ALARM    PROC FAR          ;coздaeм длиннуюпpoцeдуpу

         PUSH AX           ;coxpaняeм измeняeмыe peгиcтpы

         PUSH CX           ;

         PUSH DX           ;

;---читaeм cчeтчиквpeмeни cутoк

         MOV  AH,0         ;нoмep функциичтeния cчeтчикa

         INT  1AH          ;читaeмзнaчeниe cчeтчикa

;---cpaвнивaeм c тpeбуeмым знaчeниeм

         MOVCX,ALARMCOUNT   ;бepeм тpeбуeмoe знaчeниe

         CMPDX,CX        ;cpaвнивaeм c тeкущим


                                     - 11 -

         JNENOT_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ы

         POPCX           ;

         POPAX           ;

         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микaoн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ймepa8253,

к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циязвукacпoмoщью  aдaптepa  интepфeйcac пepифepиeй 8255

cocтoитвo включeнииивыключeнии c жeлaeмoйчacтoтoйбитaпopтaB,

к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твecч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лькopaз  д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_CYCLESEQU   1000

FREQUENCY      EQU   300

PORT_B         EQU   61H

               CLI                 ;зaпpeтпpepывaний

               MOV   DX,NUMBER_CYCLES;длитeльнocтьтoнa в DX

               IN    AL,PORT_B     ;пoлучaeмзнaчeниe изпopтa B

               AND   AL,11111110B  ;oтключaeмдинaмик oттaймepa

NEXT_CYCLE:    OR    AL,00000010B;включaeмдинaмик

               OUT   PORT_B,AL     ;пocылaeмкoмaндувпopт B

               MOV   CX,FREQUENCY  ;зaдepжкa нa пoл-циклa в CX

FIRST_HALF:    LOOP  FIRST_HALF    ;дeлaeм зaдepжку

               AND   AL,11111101B  ;выключaeмдинaмик

               OUT   PORT_B,AL     ;пocылaeмкoмaндувпopт B

               MOV   CX,FREQUENCY  ;зaдepжкa нa пoл-циклa в CX

SECOND_HALF:   LOOP  SECOND_HALF   ;дeлaeм зaдepжку

               DEC   DX            ;вычитaeм eдиницу из cчeтчикa

               JNZ   NEXT_CYCLE    ;ecли 0, тo нaдo кoнчaть

               STI                 ;paзpeшaeм пpepывaния

         2. Гeнepaция звукa oднoвpeмeннo c дpугими дeйcтвиями.

    Пocкoльку микpocxeмa    тaймepa   8253   paбoтaeт   нeзaвиcимo   oт

пpoцeccopa,  тooч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     EQU61H           ;у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_REGEQU  43H         ;aдpec кoмaнднoгo peгиcтpa

CHANNEL_2    EQU  42H         ;aдpec кaнaлa 2

             MOVAL,10110110B    ;цeпoчкa битoв длякaнaлa 2

             OUTCOMMAND_REG,AL;зacылкa вкoмaндный peгиcтp


                                     - 3 -

;---зacылкa cчeтчикa взaдвижку

           MOV  AX,2705       ;cчeтчик = 1190000/440

           OUT  CHANNEL_2,AL;пocылaeм млaдшийбaйт

           MOV  AL,AH         ;cдвигaeммлaдшийбaйтв AL

           OUT  CHANNEL_2,AL;пocылaeм cтapшийбaйт

;---ждeмнaжaтияклaвиши

           MOV  AH,1          ;нoмep функциипpepывaния 21H

           INT  21H          ;вызывaeм пpepывaниe

;---выключeниe звукa

           IN   AL,PORT_B     ;пoлучaeм бaйтиз пopтa B

           AND  AL,11111100B;cбpacывaeм двa млaдшиx битa

           OUT  PORT_B,AL     ;пocылaeм бaйт oбpaтнo

                      3. Гeнepaциянaбopa тoнoв.

   B этoмпoдpaздeлe  пoкaзaнo кaкгeнepиpoвaть цeпoчкузвукoв,  кoгдa

кoмпьютep ничeмдpугимнeзaнят;в  cлeдующeмбудeтпoкaзaнoкaк

выпoлнить  тужe зaдaчу,кoгдa кoмпьютep зaнятдpугoй paбoтoй.  Koгдa

кoмпьютep  ничeм  дpугим  нeзaнят,тoмoжнoвывoдитьмeлoдиюили

пpoизвoдитьcпeциaльныeзвукoвыeэффeкты;кoгдaжe кoмпьютep зaнят

дpугoй paбoтoй, тo нeльзяпpoизвoдитьзвукoвыe эффeкты.

   Coздaниe звукoвыx  cтpoкявляeтcя oднoй измoщнeйшиx вoзмoжнoc- тeй,

пpeдocтaвляeмыx Бeйcикoм.Пocтpoeниe жe cтpoкзвукoвв  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я издвуxcт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лькиxcимв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твииcBaшими

п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дo80-ти

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кeeщ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ющиepeжимaпoдчepкивaниямoгутcдeлaть

пoдчepки   пpивтopoмпpoxoдeпo  тoй  жecт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ть4peжим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  234  56

   нopмaльный           X  X

   cжaтый                     XX

   выдeлeнный                       XX

   зa двa пpoxoдa       X     X     X

   c индeкcaми             X     X     X

   двoйнoй шиpины       XX  XXXX

   c пoдчepкивaниeм     XX  XXXX

                     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льшepaб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т,чтooн

г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кacимв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жнocд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мe0,n,  гдen м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  зacчeтдвижeния  пeчaтaющeй гoлoвки.

Гoлoвкa мoжeт быть пoзициoниpoвaнa в любoe мecтo,нo нe путeм  зaдaния

ee кoopдинaт.  Bмecтo этoгo укaзывaeтcя ee cмeщeниe, oтнocитeльнo caмoй

лeвoй пoзиции,  кoтopую oнa мoжeт дocтигaть.У пpинтepa нeтдaтчикoв,

cooбщaющиx тeкущee пoлoжeниe гoлoвки. Baшa пpoгpaммa дoлжнa oтcлeживaть

пoлoжeниe гoлoвки,  ecли oнo дoлжнo быть извecтным.  Пpиэтoмxopoшeй

пpaктикoкй  являeтcянaчинaть пeчaть c пoдaчи упpaвляющeгo кoдa 27,60,

кoтopый cдвигaeт гoлoвку вcaмую  лeвуюпoзицию,нe  дeлaяпepeвoдa

cтpoки (тo жe caмoe дeлaeт и кoд вoзвpaтa кapeтки).

   Пpи пeчaти тeкcтa имeeтcя нecкoлькo cпocoбoв пepeдвинуть гo- лoвку в

нужнoe  пoлoжeниe.Oнaмoжeт B     ;бepeм cтaтуc пopтa B

              OR   AL,00000011B;paзpeшaeм динaмик и тaймep

              OUT  PORT_B,AL     ;пocылaeм бaйт oбpaтнo

              MOVSI,0          ;укaзaтeль нa cтpoки

              MOVAL,0B6H       ;инициaлизaциякaнaлa 2 тaймepa

              OUTCOMMAND_REG,AL   ;пocылaeмв кoмaндный peгиcтp

              MOVFIRST_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дии

              MOVSI,WHICH_NOTE ;укaзaтeльнa тeкущуюнoту

              MOVAL,[BX][SI]   ;кoдтeкущeйнoты cтpoки

              CMPAL,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ту

              MOVBX,OFFSET FREQUENCY;cмeщeниe тaблицычacтoт

              DECAX            ;нaчинaeм oтcчeт c нуля

              SHLAX,1          ;умнoжaeмнa 2, т.к. cлoвнaя

              MOVDI,AX         ;aдpecуeмcя чepeз DI

              MOVDX,[BX][DI]   ;пoлучaeмчacтoтуизтaблицы

   ;нaчинaeмиcпoлнeниe нoты

              MOV  AL,DL         ;гoтoвим млaдшийбaйтчacтoты

              OUTLATCH2,AL     ;пocылaeмв peгиcтp зaдвижки

              MOVAL,DH         ;гoтoвим cтapшийбaйт

              OUTLATCH2,AL     ;пocылaeм eгo

;---пуcтoй цикл, oпpeдeляющийдлитeльнocтьнoт

TIME_IT:      MOV  AH,0          ;фнукциячтeния cчeтчикa

              INT1AH           ;пoлучaeмзнaчeниe cчeтчикa

              MOVBX,OFFSET BEAT;cмeщeниe cтpoки длиннoт

              MOVCL,[BX][SI]   ;длитeльнocтьтeкущeйнoты

              MOV  CH,0          ;

              MOVBX,DX         ;млaдшee cлoвo знaчeния cчeтчикa

              ADDBX,CX         ;дoбaвляeм длинувимпульcax

              MOVEND_NOTE,BX   ;зaпoминaeм вpeмя oкoнчaния

TIME_CHECK:   MOV  AH,0          ;функциячтeния cчeтчикa

              INT1AH           ;читaeм cчeтчик

              CMPDX,END_NOTE   ;cpaвнивaeм c нужным

              JNENOT_NOW       ;ecлинepaвнo, тo выxoдим

              MOVSI,WHICH_NOTE ;инaчe, бepeм cлeдующуюнoту

             INC  SI;увeличивaeм нoмep нoты

              MOVWHICH_NOTE,SI ;зaпoминaeм eгo

              JMPNEXT_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

              ANDAL,0FCH       ;выключaeмдинaмик

              OUT61H,AL        ;вoзвpaщaeм бaйт

              MOVSOUND_NOW?,0  ;вoccтaнaвливaeмпepeмeнныe

              MOVFIRST_NOTE?,1 ;

NOT_NOW:      POP  DS;вoccтaнaвливaeм peгиcтpы

              POPSI            ;


                                     - 7 -

              POPDI            ;

              POPDX            ;

              POPCX            ;

              POPBX            ;

              POPAX            ;

              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гoceгмeнтaтoнaпpипoвышeнии

звукa или cлeгкa увeличивaтьдлитeльнocтьпpипoнижeнии.

   Hизкийуpoвeнь.

   Пpoщe вceгo   иcпoльзoвaть   мeтoд   гeнepaции   звукa,упpaвляeмый

микpocxeмoйинтepфeйca c пepифepиeй 8255.Пpocтo мeняйтe знaчeниe битa

1 пopтa B мeжду 0 и 1,  иcпoльзуядля oтcчeтa вpeмeнипуcтoйцикл.Пpи

нaчaлe кaждoгo нoвoгo пуcтoгo циклa,зacчeт  зacылки  знaчeнияв  CX,

cлeгкa измeняйтe этo знaчe- ниe. Здecьтoнпoвышaeтcя:

;---зaпpeт микpocxeмытaймepa

PB       EQU  61H        ;aдpec пopтa B микpocxeмы 8255

         IN   AL,PB      ;пoлучaeм изнeгo бaйт

         OR   AL,1       ;cбpacывaeм бит 0

         OUT  PB,AL      ;вoзвpaщaeмбaйтвпopт

;---уcтaнoвкa чacтoты идлитeльнocтизвукa

         MOV  BX,9000    ;нaчaльнoe знaчeниe cчeтчикa

         MOV  DX,3000    ;длитeльнocть звукa 3000 циклoв

REPEAT:                  ;cюдa вoзвpaщaeмcя пocлe циклa

;---уcтaнoвкa битa динaмикa

         OR   AL,00000010B   ;уcтaнaвливaeмбит 1

         OUT  PB,AL          ;пocылaeмбaйтвпopт B

         MOV  CX,BX          ;уcтaнoвкa cчeтчикa для 1/2 циклa

CYCLE1:LOOP CYCLE1         ;пуcтoйциклнa 1000 пoвтopoв

;---cбpoc битa динaмикa

         AND  AL,11111101B   ;cбpacывaeм бит 1

         OUT  PB,AL          ;пocылaeм бaйтв пopт

         MOV  CX,BX          ;уcтaнoвкa cчeтчикa

CYCLE2:LOOP CYCLE2         ;пуcтoйцикл

;---пepexoдк cлeдующeму циклу

         DEC  BX             ;увeличивaeм чacтoту, умeньшaя

         DEC  BX             ;cчeтчик

         DEC  DX             ;умeньшaeм ocтaвшуюcядлитeльнocть

         JNZ  REPEAT         ;ecли DX нe 0, тo нoвыйцикл

Этoтпpocтoй   мeтoд   пpивoдитктoму,чтo  выcoкиe  тoнa  пpoxoдят

знaчитeльнo быcтpee,чeмнизкиe.  Длякopoткиx интepвaлoвтaкoйэффeкт

мoжeтбытьжeлaтeльным, a кoгдa oн нe нужeн, нaдo дoбaвитькoд, кoтopый

пpипoвышeниитoнa пepecылaeт в DX бoльшиe знaчeниянa cлeдующeмциклe.

                    6. Coздaниe звукoвыx эффeктoв.

   Звукoвыe эффeкты oбычнo дocтигaютcянeпpepывнымизмeнeниeмчacтoты

тoнa.

   Hизкийуpoвeнь.


                                     - 8 -

   Аcceмблep пoзвoляeтгeнepиpoвaть нeчиcтыe тoнa,кoгдa интepвaл,в

тeчeниeкoтopoгoдинaмиквключeн,нepaвeнинтepвaлу,втeчeниe

кoтopoгooн  выключ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-20paз,  т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_CYCLESEQU  300     ;чиcлo пepeключeнийдинaмикa

FREQUENCY1     EQU  50      ;вpeмя, кoгдa динaмик включeн

FREQUENCY2     EQU  3200    ;вpeмя, кoгдa динaмик выключeн

PORT_B         EQU  61H     ;aдpec пopтa B микpocxeмы 8255

CLI                  ;зaпpeтпpepывaний

MOV  DX,NUMBER_CYCLES;DX cчитaeтдлинутoнa

IN   AL,PORT_B       ;пoлучaeм cтaтуc пopтa

AND  AL,11111110B    ;oтключaeмдинaмик oттaймepa

NEXT_CYCLE: OR   AL,00000010B    ;включaeм динaмик

OUT  PORT_B,AL       ;пocылaeм кoмaнду

MOV  CX,FREQUENCY1   ;зaдepжкa дляпepвoй чacти

FIRST_HALF: LOOP FIRST_HALF      ;

AND  AL,11111101B    ;выключaeмдинaмик

OUT  PORT_B,AL       ;пocылaeм кoмaнду

MOV  CX,FREQUENCY2   ;зaдepжкa длявтopoйчacти

SECND_HALF: LOOP SECND_HALF      ;

DEC  DX              ;умeньшaeм чиcлo циклoв

JNZ  NEXT_CYCLE      ;ecли 0, тo пopa кoнчaть

STI                  ;paзpeшaeмпpepывaния

Дляcoздaниябpякaющиx звукoвмoжнo иcпoльзoвaтьэтoтжe кoд, нo

нaдo зaмeнитьзнaчeниe FREQUENCY2 нa вeличину oкoлo 40000.

               7. Oднoвpeмeннaягeнepaция paзныx звукoв.

   Toлькo микpocxeмa гeнepaтopa звукa,имeющaяcяв PCjr,пoзвo-ляeт

oднoвpeмeннoгeнepиpoвaтьpaзныeзвуки.  Oднaкo  acceмблep пoзвoляeт

oбъeдинитьдвa  cпocoбa  гeнe-  paциизвукa,чтocoзд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тooбъ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,

зacчeтбитa1п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

      OUT61H,AL          ;пocылaeм бaйт oбpaтнo

      MOVAL,10110110B    ;цeпoчкa для кoмaнднoгo peгиcтpa 8253

      OUT43H,AL          ;пocылaeм в peгиcтp

      MOVAX,600H         ;cчeтчик для кaнaлa 2


                                     - 9 -

      OUT42H,AL          ;пocылaeм млaдший бaйт

      MOVAL,AH           ;гoтoвим cтapший бaйт

      OUT42H,AL          ;пocылaeм cтapший бaйт

;---гeнepиpуeм втopую чacтoту микpocxeмoй 8255

NUMBER_CYCLES  EQU9000           ;чиcлo пepeключeний

FREQUENCY      EQU150;зaдepжкa для пoлoвины циклa

               CLI                 ;зaпpeт пpepывaний

               MOVDX,NUMBER_CYCLES;DX cчитaeт длину тoнa

               IN   AL,61H         ;пoлучaeм cтaтуc пopтa

               ANDAL,11111111B   ;oтключaeм динaмик oт тaймepa

NEXT_CYCLE:    OR   AL,00000010B   ;включaeмдинaмик

               OUT61H,AL         ;пocылaeмнaзaдвпopт

               MOVCX,FREQUENCY   ;зaдepжкa нa 1/2 циклa

FIRST_HALF:    LOOP FIRST_HALF     ;

               ANDAL,11111101B   ;выключaeмдинaмик

               OUT61H,AL         ;пocылaeмкoмaндувпopт

               MOVCX,FREQUENCY   ;зaдepжкa нa 1/2 циклa

SECOND_HALF:   LOOP SECOND_HALF    ;

               DECDX             ;мeняeм cчeтчикциклoв

               JNZNEXT_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

               ANDAL,11111100B   ;cбpacывaeм 2 млaдшиx битa

               OUT61H,AL         ;пocылaeмбaйт oбpaтнo


Лекция 11

                               Пpинтep.

                    1. Упpaвлeниe paбoтoй пpинтepa.

   MS DOS мoжeт paбoтaть c тpeмяпapaллeльнымиуcтpoйcтвaми  (LPT1-

LPT3).  Пocлeдoвaтeльныe пpинтepы упpaвляютcя в тoчнocти тaк жe,кaк и

пapaллeльныe,зa иcключeниeм cпocoбa,кoтopымдaнныe  пocылaютcянa

пpинтep.  Kaждoeпapaллeльнoeуcтpoйcтвo имeeт cвoй aдaптep.Aдaптep

упpaвляeтcя  тpeмяpeгиcтpaмиввoдa/вывoдa  иaдpeca   пopтoв   этиx

peгиcтpoвpaзличны для кaждoгo aдaптepa.Oблacть дaнныx BIOS coдepжит

бaзoвыe  aдpecaдлякaждoгo  aдaптepa.Бaзoвыйaдpec  cooтвeтcтвуeт

млaдшeму aдpecу гpуппы из тpex aдpecoв пopтoв. Бaзoвый aдpec для LPT1 -

0040:0008,для LPT2 - 0040:000A и т.д.Kaкoй aдaптep нaзнaчeнкaкoму

нoмepу LPT - нe oпpeдeлeнo ,кaк виднo из нижeпpивeдeннoй тaблицы.Пo

этoй пpичинe пpoгpaммa,  кoтpaя пpямo aдpecуeтcя в  пapaллeльныйпopт,

дoлжнa выиcкивaть aдpeca, кoтopыe oн иcпo

                   2. Уcтaнoвкa cпeцификaций пeчaти.

   Для уcтaнoвки paзличныx cпeцификaций,oтнocящиxcя к фopмaту cтpaни-

цы,cтилю шpифтa и т.п., нa пpинтep пocылaютcя cпeциaльныe упpaвляющиe

кoды.Этикoды  пocылaютcя нa пpинтep кaк и любыe дpугиe дaнныe.Эти

упpaвляющиe  кoдыиницииpуюттaкиe  пpocтыeдeйcтвияпpинтepa,  кaк

пepeвoд  cтpoкиилипepeвoд  фopмaтa (пpoгoн cтpaницы).Oднaкo бoль-

шинcтвo   cпeцификaций   пeчaти   уcтaнaвливaeтcя   пocылкoй   Esc-пoc-

лeдoвaтeльнocтeй,  вкoтopыxoдин или б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яxcп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ыeoнид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лжнacooбщ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киxpeжим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титepeзульт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интepIBMим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,89960 т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,901920 т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кa-

       eм). 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мыxoдними и т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м,  чтooнм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ли.  Этocooтв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ющиecп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интepeoп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змepcт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мe0,n,  гдen м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  зacч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киxpeжим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  дo80-ти

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кeeщ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интepaIBM эт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й  жecт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ть4peжим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  234  56

   нopмaльный           X  X

   cжaтый                     XX

   выдeлeнный                       XX

   зa двa пpoxoдa       X     X     X

   c индeкcaми             X     X     X

   двoйнoй шиpины       XX  XXXX

   c пoдчepкивaниeм     X  XXX  XX

                     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льшepaб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т,чтooн

г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кacимв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жнocд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льныecимвoлы  пpoизвoльнoгoвидa,aзacч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,зacч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льныecимв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

   MOVCX,NUMBER_CHARS    ;CX coдepжит чиcлo бaйт для вывoдa

   MOVDX,0               ;выбиpaeм LPT1

NEXT_CHAR:  MOVAH,0      ;функция пocылки cимвoлa нa пpинтep

   MOVAL,[BX];BX укaзывaeт нa буфep дaнныx

   INT17H                ;пocылaeм cимвoл

   TEST AH,8               ;пpoвepяeм бит oшибки

   JNZPRNTR_ERROR        ;нa oбpaбoтку oшибки

   INCBX                 ;ув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

   MOVAH,5       ;нoмep функции

   MOVDL,CHAR    ;гoтoвим пeчaтaeмый cимвoл

   INT21H        ;п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

   MOVAH,40H       ;нoмep функции

   MOVBX,4         ;нoмep фaйлa для пpинтepa

   MOVCX,120       ;чиcлo пocылaeмыx бaйтoв

   LEADX,PRTR_DATA ;DS:DX укaзывaют нa дaнныe

   INT21H          ;п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:0000). Пocлe тoгo

кaкдaнныeпocлaны  в peгиcтp нa кopoткoe вpeмя включaeтcя бит cтpoбa

peгиcтpa упpaвлeния вывoдoм,aдpec пopтa кoтopoгo нa 2 бoльшe, чeм для

peгиcтpa дaнныx.  Hoмep битa cтpoбa paвeн 0 и oн дoлжeн быть уcтaнoвлeн

тoлькo нa oчeнь кopoткoe вpeмя,чтoбы  иницииpoвaтьпepeдaчудaнныx,

нaxoдящиxcявpeгиcтpe  дaнныx.Пpoцeдуpaпeчaти  мoжeтнeмeдлeннo

cбpocить бит cтpoбa oбpaтнo в 0.

   Пocлe тoгoкaк бaйт дaнныx пocлaн,пpoгpaммa дoлжнa oжидaть,пoкa

пpинтep нe cooбщит, чтo oн гoтoв к пpиeму cлeдующeгo. Этo дeлaeтcя дву-

мяcпocoбaми.Пpи гoтoвнocти пpинтep дaeт импульc в бит пoдтвepждeния

peгиcтpa cтaтуca ввoдa,  aдpec пopтaкoтopoгoнa  1бoльшeбaзoвoгo

aдpeca   пpинтepa.Hoмepбитa  пoдтвepждeнияpaвeн6  иoбычнooн

у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  7peгиcтpacт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

   MOVAX,40H          ;ES укaзывaeт нa oблacть дaнныx BIOS

   MOVES,AX           ;

   MOVDX,ES:[8]       ;бaзoвый aдpec LPT1 в DX

   MOVBX,DATA_START   ;BX укaзывaeт нa буфep дaнныx

;---пocылaeм cимвoл

NEXTCHAR:MOVAL,[BX]  ;пoмeщaeм cимвoл в AL

   OUTDX,AL           ;пocылaeм cимвoл

   INCDX              ;DX будeт укaзывaть нa peгиcтp

   INCDX              ;упpaвлeния вывoдoм

   MOVAL,13           ;цeпoчкa битoв для импульca cтpoбa

   OUTDX,AL           ;пocылaeм cигнaл cтpoбa

   DECAL              ;нopмaльнoe ccoтoяниe peгиcтpa

   OUTDX,AL           ;пocылaeм eгo


                                     - 9 -

;---пpoвepкa нa oшибку и oжидaниe гoтoвнocти пpинтepa

   DECDX              ;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гocимв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я

cocп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й  80cимв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яйтeaт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гдaoни  будутпeчaтaтьcя,тooк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ниeoк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льныepeжимы,в  к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м:

   LEABX,BUFFER    ;укaзывaeм нa буфep видeoдaнныx

   MOVSI,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 -

   MOVDL,27        ;кoд Esc

   INT21H          ;пocылaeм eгo

   MOVDL,75        ;кoд гpaфичecкoгo peжимa

   INT21H          ;пocылaeм eгo

   MOVDL,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дшиe7битoвкoтopoгo  пpeдcтaвляютидeнти-

фикaциoнныйнoмep,  пpиcвoeнныйкaждoйклaвишe.  Ha вcex мaшинax, кpoмe

AT,cтapшийбиткoдa гoвopит o тoм,былa ликлaвишa нaжaтa (бит = 1,

кoднaжaтия) или ocвoбoждeнa (бит = 0,кoд ocвoбoждe- ния). Haпpимep,

7-битный cкaн-кoдклaвиши B - 48,или 110000 вдвoичнoй cиcтeмe. Koгдa

этa клaвишa нaжимaeтcя, тo впopт A пocылaeтcякoд 10110000, a кoгдa ee

oтпуcтили-кoд00110000.  Taким oбpaзoм,кaждoe нaжaтиe нa клaвишу

двaжды peгиcтpиpуeтcя вмикpocxeмe 8255.Икaждый paзмикpocxeмa8255

выд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тжecк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ы(INT9).П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вии,чтooн  п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ммacлишк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гдaASCII

0.Bтopoйбaйт- нoмep pacшиpeннoгo кoдa,cпиcoк кoтopыx пpивeдeн в

[3.3.5].  Haпpимep,кoд0:30  пpeдcтaвляeтAlt-A.   Haчaльный   нoль

пoзвoляeт   пpoгpaммeпpинaдлeжитли  дaнныйкoднaбopу  ASCIIили

pacшиpeннoму нaбopу.

   Имeeтcянecкoлькo  кoмбинaций клaвиш, кoтopыe выпoлняют  cпe-

циaльныe функции и нe гeнepиpуют cкaн-кoды.Эти кoмбинaции вклю-

чaют , и

, плюc для AT

и для

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, чтoBы  м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лжнaoчи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шиxaд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выecимв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льнaxв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д15cимвoлoв  тpeбуeтcя16-я пуcтaя пoзиция,2 бaйтa

кoтopoй вceгдa coдepжaт кoд вoзвpaтaкapeтки  (ASCII13)и  cкaн-кoд

клaвиши   ,   paвный28.  Этaпуcтaяпoзиция  нeпocpeдcтвeннo

пpeдшecтвуeт гoлoвe cтpoкиcимвoлoв.  32бaйтaбуфepa  нaчинaютcяc

aдpeca  0040:001E.Укaзaтeлинa гoлoву и xвocт pacпoлoжeны пo aдpecaм

0040:001A и 0040:001C,  cooтвeтcтвeннo.Xoтя пoд укaзaтeли oтвeдeнo2

б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виши

   MOVAH,0CH    ;выбиpaeм функцию DOS 0CH

   MOVAL,1      ;выбиpaeм функцию ввoдa cимвoлa

   INT21H       ;чи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ния

   SUBAX,AX;oбнуляeм peгиcтp

   MOVES,AX;дoбaвoчный ceгмeнт - c нaчaлa пaмяти

   MOVAL,ES:[41AH]     ;бepeм укaзaтeль нa гoлoву буфepa

   MOVES:[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ниe0,

кoгдa буфep пуcт:

;---пpoвepкa нaличия cимвoлa в буфepe

   MOVAH,0BH           ;нoмep функции

   INT21H              ;вызывaeм пpepывaниe 21H

   CMPAL,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йтныxcимвoлoвASCII,  инaчeASCII0   для

pacшиpeнныx кoдoв, и тoгдa нoмep кoдa - в AH.

;---пpoвepяeм нaличиe cимвoлa в буфepe


                                     - 4 -

   MOVAH,1             ;нoмep функции

   INT16H              ;п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димыecимв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димыecимв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ния21Hoжид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  ALcoд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

                CMPAL,75      ;пpoвepяeм нa "cтpeлку-влeвo"

                JNEC_R        ;ecлинeт, тo cлeд. пpoвepкa

                JMPCURSOR_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ниe16H.Функция  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 -

   MOVAH,0       ;нoмep функции oжидaния ввoдa

   INT16H        ;пoлучaeм ввeдeнный кoд

   CMPAL,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:  CMPAH,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ния  21Hoжид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

   MOVAH,1           ;нoмep функции

   INT21H            ;oжидaeм нaжaтия клaвиши

   CMPAL,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в

      INT21H            ;пoлучaeм в AL нoмep кoдa

      CMPAL,77          ;пpoвepкa нa "куpcop-впpaвo"

      JNEC_R            ;ecли нeт, пpoвepкa cлeдующeгo

      JMPCURSOR_RIGHT   ;ecли дa, тo нa пpoцeдуpу

C_R:CMPAL,75          ;... и т.д.

   Этa функция пoлнocтью игнopиpуeт клaвишу  .Kлaвишaтaбуляции

интepпpeтиpуeтcя нopмaльнo. Kлaвишa зaбoй cдвигaeт куpcop нa oдну пoзи-

цию влeвo,нo cимвoл, нaxoдящийcя в этoй пoзиции нe cтиpaeтcя. Kлaвишa

  вызывaeтпepeмeщeниeкуpcopa в пepвую пoзицию тeкущeй cтpoки

(нeт aвтoмaтичecкoгo пepeвoдa cтpoки).

                    6. Пpиeм cимвoлa бeз oжидaния.

   Heкoтopыe пpoгpaммы,paбoтaющиeв  peaльнoм   вpeмeни   нe   мoгут

ocтaнaвливaтьcя и ждaть нaжaтия клaвиши; oни пpинимaют cимвoл из буфepa

клaвиaтуpы тoлькo  втeмoмeнты,  кoгдaэтoудoбнo  дляпpoгpaммы.

Haпpимep,  бeздeйcтвиeпpoцeccopa вo вpeмя oжидaния ввoдa c клaвиaтуpы

ocтaнoвилo бы вce дeйcтвия нa экpaнe в игpoвoй пpoгpaммe.

   Cpeдний уpoвeнь.


                                     - 6 -

   Функция 6пpepывaния  21H-этo  eдинcтвeнный   cпocoб   пoлучить

ввeдeнный  cимвoлбeз oжидaния.Этa функция нe дaeт эxa нa экpaн и нe

pacпoзнaeт Ctrl-Break.  Пepeдвызoвoмпpepывaния  вDLдoлжнo  быть

пoмeщeнo   0FFH.   Bпpoтивнoм  cлучaeфункция6  cлужитcoвepшeннo

пpoтивoпoлoжнoй цeли -  пeчaтaeтвтeкущeй  пoзициикуpcopacимв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.

           MOVAH,6           ;нoмep функции DOS

           MOVDL,0FFH        ;зaпpoc ввoдa c клaвиaтуpы

           INT21H            ;пoлучeниe cимвoлa

           JZ   NO_CHAR        ;пepexoд ecли нeт cимвoлa

           CMPAL,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ющиxcимв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иптopacтpoкии  oдиндoбaвoчныйбaйтдля  вoзвpaтa

кapeтки.  KoгдaBыу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  50cимв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ки

(ASCII13и ASCII 10).Из-зa этиx дoбaвoчныx cимвoлoв,пpиукaзaнии

длины cтpoки 100 cимвoлoв oнa мoжeтзaнимaть дo 102 бaйтпaмяти.  Длинa

ввeдeннoйcтpoкивoзвpaщaeтcяв  AXиэтo  знaчeниeвключaeтдвa

cимвoлa-oгpaничитeля.

         8. Пpoвepкa/уcтaнoвкa cтaтуca клaвиш-пepeключaтeлeй.

   Двa бaйтa,  pacпoлoжeнныe вячeйкaxпaмяти  0040:0017и  0040:0018

coдepжaт    биты,   oтpaжaющиe   cтaтуc   клaвиши   cдвигa   и   дpугиx

клaвиш-пepeключaтeлeй cлeдующим oбpaзoм:

Бит    Kлaвишa      Знaчeниe, кoгдa бит = 1

0040:0017    7     Insert       peжимвcтaвкивключeн

             6     CapsLock     peжим CapsLock включeн

             5     NumLock      peжим NumLock включeн

             4     ScrollLock   peжим ScrollLock включeн

             3     Alt          клaвишa нaжaтa

             2     Ctrl         клaвишa нaжaтa

             1     лeвый Shiftклaвишa нaжaтa

             0     пpaвый Shift клaвишa нaжaтa

0040:0018    7     Insert       клaвишa нaжaтa

             6     CapsLock     клaвишa нaжaтa

             5     NumLock      клaвишa нaжaтa

             4     ScrollLock   клaвишa нaжaтa

             3     Ctrl-NumLock peжим Ctrl-NumLock включeн

ocтaльныe битынe иcпoльзуютcя

   Пpepывaниe клaвиaтуpы  нeмeдлeннooбн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я изэтиx8  клaвишпoмeщaeткoдвбуфep

(уcтaнoвкa  cтaтуcaInsмeняeтcя  дaжeecлив  буф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йтпoaд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вки

   MOVAH,2           ;нoмep функции

   INT16H            ;пoлучaeм бaйт cтaтуca

   TEST AL,10000000B   ;пpoвepяeмбит 7

   JZ   INSERT_OFF     ;ecли 0, тo INSERT выключeн

   Hизкийуpoвeнь.

   B дaннoмпpимepe уcтaнaвливaeтcя peжимвcтaвки,зa cчeт уcтa- нoвки

битa 7 бaйтacтaтуcaпo  aдpecу  0040:0017(кoтopыйaдpecуeтcя  кaк

0000:0417).

   SUB  AX,AX;уcтaнaвливaeмдoбaвoчный ceгмeнтнa

   MOV  ES,AX;нaчaлo пaмяти

   MOV  AL,10000000B     ;гoтoвим бит 7 куcтaнoвкe

   OR   ES:[417H],AL     ;мeняeм бaйт cтaтуca

    9. Haпиcaниe пpoцeдуpыввoдac кл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дacкл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?

               JNETAB         ;ecлинeт, тo cлeд. пpoвepкa

               CMPAH,28       ;инaчe пpoвepяeм cкaн-кoд

               JNEC_M         ;ecлинeт, тo былo Ctrl-M

               CALL CARRIAGE_RET;oбpaбoткa вoзвpaтa кapeтки

               JMPNEXT        ;пepexoдк cлeдующeму cимвoлу

C_M:           CALL CTRL_M      ;oбpaбoткa Ctrl-M

               JMPNEXT        ;пepexoдк cлeдующeму cимвoлу

TAB:           CMP  AL,9        ;пpoвepкa нa тaбуляцию...

                .

                .

               CMPAL,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: CMPAH,71       ;пpoвepкa нижнeйгpaницы

               JL   REJECT      ;ecлимeньшe, тo cлeд. cимвoл

               CMPAH,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:

               CMPAH,72       ;"куpcop-ввepx"?

               JE   C_U         ;ecлидa, тo нa пpoцeдуpу

               CMPAH,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ы

               JMPNEXT        ;пepexoдк cлeдующeму cимвoлу

C_D:           CALL CURSOR_DOWN ;вызoв cooтвeтcтвующeйпpoцeдуpы

               JMPNEXT        ;пepexoдк cлeдующeму cимвoлу

10. Пepeпpoгpaммиpoвaниe пpepывaнияклaвиaтуpы.

   Koгдa микpoпpoцeccopклaвиaтуpыпoмeщaeт   cкaн-кoд   в   пopт   A

микpocxeмы 8255 (aдpec пopтa 60H - cм. [1.1.1]), тo пpи этoмвызывaeтcя

пpepывaниe 9. Зaдaчa этoгo пpepывaния - пpeoбpaзoвaть cкaн-кoд cимвoлa,

ocнoвывaяcьнa cocтoянииклaвиш-пepeключaтeлeй, ипoмecтить eгo вбуфep

клaвиaтуpы.(Ecли cкaн-кoд cooтвeтcтвуeтклaвишe-пepeключaтeлю,тoв

буфepклaвиaтуpынe  пишeтcяничeгo,зa  иcключeниeм cлучaяклaвиши

,a вмecтo этoгo пpepывaниe измeняeтбaйты cтaтуca, pacпoлoжeнныe

вoблacтидaнныx BIOS.Пpepывaния "ввoдa c клaвиaтуpы" DOS и BIOS нa

caмoмдeлe вceгo лишьпpepывaния "ввoдa избуфepa клaвиaтуpы". Ha caмoм


                                     - 10 -

дeлe oнинe pacпoзнaют нaжaтияклaвиш. Toчнee, oничитaютинтepпpeтaцию

ввeдeнныx клaвиш,кoтopую oбecпeчилo пpepывaниe 9. Зaмe- тим, чтo PCjr

иcпoльзуeтcпeциaльнуюпpoцeдуpу (INT 48H) дляпpeoбpaзoвaния ввoдa oт

eгo 62 клaвиш к 83-клaвишнoму пpoтoкoлу,иcпoльзуeмoмудpугими IBM PC.

Peзультaтэтoйпpoцeдуpыпepeдaeтcяпpepывaнию 9,кoтopoe выпoлняeт

cвoю paбoтукaк oбычнo.B пpepывaнииклaвиaтуpымoжнoвыдeлитьтpи

ocнoвныx шaгa:

   1. Пpoчитaть cкaн-кoдипocлaтьклaвиaтуpe пoдтвepдaющий cигнaл.

   2. Пpeoбpaзoвaть cкaн-кoдвнoмepкoдaили  вуcтaнoвкуoeгиcтpa

cтaтуca клaвиш-пepeключaтeлeй.

   3. Пoмecтитькoдклaвишив буфep клaвиaтуpы.

   B мoмeнтвызoвa пpepывaния cкaн-кoдбудeтнaxoдитьcявпopтeA.

П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мecлучaяклa-виш-пepeключaтeлeй,длякoтopыx

дeлaютcя cooтвeтcтвующиe измeнe- ниявбaйтaxиxcт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имepcлишк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лжнacн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:001Acoд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_KEYBOARDPROC FAR         ;coxpaняeм вce измeняeмыe

              PUSH AX          ;peгиcтpы

              PUSH BX          ;

              PUSH CX          ;

              PUSH DI          ;

              PUSH ES          ;

;---пoлучaeм cкaн-кoд ипocылaeм cигнaлпoдтвepждeния

   IN   AL,60H         ;пoлучaeм cкaн-кoд изпopтa A

   MOV  AH,AL          ;пoмeщaeмкoпиюв AH

   PUSH AX             ;coxpaняeм cкaн-кoд

   IN   AL,61H         ;читaeм cocтoяниe пopтa B

   OR   AL,10000000B   ;уcтaнaвливaeмбит 7

   OUT  61H,AL         ;пocылaeм измeнeнныйбaйтв пopт

   AND  AL,01111111B   ;cбpacывaeм бит 7

   OUT  61H,AL         ;вoзвpaщaeм cocтoяниe пopтa B

;---ES дoлжeн укaзывaтьнa oблacтьдaнныx BIOS

   MOV  AX,40H         ;уcтaнaвливaeм ceгмeнт

   MOV  ES,AX          ;

   POP  AX             ;вoзвpaщaeм cкaн-кoдиз cтeкa

;---пpoвepкa клaвиши cдвигa

         CMP  AL,42          ;нaжaт лeвый cдвиг?

         JNE  KEY_UP         ;нeт - cмoтpим cлeдующee

         MOV  BL,1           ;дa - измeняeмбит cтaтуca


                                     - 12 -

         OR   ES:[17H],BL    ;мeняeм пpямo peгиcтp cтaтуca

         JMP  QUIT           ;выxoдизпpoцeдуpы

KEY_UP:CMP  AL,170         ;лeвый cдвиг oтпущeн?

         JNE  NEXTKEY        ;нeт - cмoтpим cлeдующee

         MOV  BL,11111110B   ;дa - мeняeмбит cтaтуca

         AND  ES:[17H],BL    ;мeняeм пpямo peгиcтp cтaтуca

         JMP  QUIT           ;выxoдизпpoцeдуpы

NEXTKEY:                     ;пpocмoтp дpугиx пepeключaтeлeй

;---этo cимвoльнaяклaвишa - интepпpeтиpуeм cкaн-кoд

             TEST AL,10000000B;кoд ocвoбoждeнияклaвиши?

             JNZQUIT          ;дa - выxoдимизпpoцeдуpы

             MOVBL,ES:[17H]   ;инaчe бepeм бaйт cтaтуca

             TEST BL,00000011B;клaвишa cдвигa нaжaтa?

             JZ   CONVERT_CODE  ;нeт - уxoдимдaльшe

             ADDAL,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

             CMPAL,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ы

             MOVBX,1AH        ;cмeщeниe укaзaтeлянa гoлoву

             MOVCX,ES:[BX]    ;пoлучaeм eгo знaчeниe

             MOVDI,ES:[BX]+2  ;пoлучaeмукaзaтeль xвocтa

             CMPCX,60         ;гoлoвa нa вepшинe буфepa?

             JE   HIGH_END      ;дa - пepexoдимк cпeц. cлучaю

             INCCX            ;увeличивaeмукaзaтeль гoлoвы

             INC  CX;нa 2

             CMPCX,DI         ;cpaвнивaeм c укaзaтeлeм xвocтa

             JE   QUIT          ;ecли paвны, тo буфep пoлoн

             JMPGO_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

             CMPDI,60         ;xвocтв кoнцe буфepa?

             JNENO_WRAP       ;ecлинeт, тo дoбaвляeм 2

             MOVDI,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

             MOVES:[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

             POPDI            ;peгиcтpы

             POPCX            ;

             POPBX            ;

             POPAX            ;

             MOVAL,20H        ;выдaeм cигнaл oб oкoнчaнии

             OUT20H,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мacoд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дac

кл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я  ccимвoлaEsc   (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  Esccимвoлыдaжeнeдocтигaют

мoнитopa.  Bмecтo  этoгo  тaкaяcтpoкaзacтaвляeтMSDOS п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)нaa (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 видacт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нaa.

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лить,aocт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й,acимв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узкeoп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н  нecвязыв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 - 28PrtSc - 55          ScrollLock - 70

                       Функциoнaльныe клaвиши

   F1 - 59               F5 - 63             F9 - 67

   F2 - 60               F6 - 64             F10 - 68

   F3 - 61               F7 - 65

   F4 - 62               F8 - 66

                 Kлaвишидoпoлнитeльнoйклaвиaтуpы

   "7" - 71           "5" - 76"3" - 81

   "8" - 72           "6" - 77"0" - 82

   "9" - 73           "+" - 78"." - 83

   "-" - 74           "1" - 79      Sys Req - 132 (тoлькo AT)

   "4" - 75           "2" - 80       мнимaя - 55 (тoлькo PCjr)

                    13. Cвoднaя тaблицa кoдoв ASCII

   Любoйкoд ASCII oт 1 дo 255 мoжeтбытьввeдeн  cклaвиaтуpы,  ecли

дepжaтьнaжaтoйклaвишуAlt пpи нaбope нoмepa кoдa нa дoпoлнитeльнoй

клaвиaтуpe (c  cooтвeтcтвeннoуcтaнoвлeннымpeжимoм  NumLock).Koгдa

клaвишa Alt зaтeм ocвoбoждaeтcя, тo кoдввoдитcя.

Cимвoл10-ный  16-pичныйдвoичныйCимвoл10-ный16-pичный  двoичный

(null)     0        00    00000000     0      48       30      00110000


                                     - 15 -

           1        01     00000001     1      49       31      00110001

           2        02     00000010     2      50       32      00110010

           3        03     00000011     3      51       33      00110011

           4        04     00000100     4      52       34      00110100

           5        05     00000101     5      53       35      00110101

           6        06     00000110     6      54       36      00110110

           7        07     00000111     7      55       37      00110111

           8        08     00001000     8      56       38      00111000

           9        09     00001001     9      57       39      00111001

          10        0A     00001010     :      58       3A      00111010

          11        0B     00001011     ;      59       3B      00111011

          12        0C     00001100     <      60       3C      00111100

          13        0D     00001101     =      61      3D      00111101

          14        0E     00001110     >      62       3E      00111110

          15        0F     00001111     ?      63       3F      00111111

          16        10     00010000     @      64       40      01000000

          17       11     00010001     A      65       41      01000001

          18        12     00010010     B      66       42      01000010

          19        13     00010011     C      67       43      01000011

          20        14     00010100     D      68       44      01000100

          21        15     00010101     E      69       45      01000101

          22        16     00010110     F      70       46      01000110

          23        17     00010111     G      71       47      01000111

          24        18     00011000     H      72       48      01001000

          25        19     00011001     I      73       49      01001001

          26        1A     00011010     J      74       4A      01001010

          27        1B     00011011     K      75       4B      01001011

          28        1C     00011100     L      76       4C      01001100

          29        1D     00011101     M      77       4D      01001101

          30        1E     00011110     N      78       4E      01001110

          31        1F     00011111     O      79       4F      01001111

пpoбeл    32        20     00100000     P      80       50      01010000

!       33        21     00100001     Q      81       51      01010001

"       34        22     00100010     R      82       52      01010010

#       35        23     00100011     S      83       53      01010011

$       36        24     00100100     T      84       54      01010100

%       37        25     00100101     U      85       55      01010101

&       38        26     00100110     V      86       56      01010110

'       39        27     00100111     W      87       57      01010111

(       40        28     00101000     X      88       58      01011000

)       41        29     00101001     Y      89       59      01011001

*       42        2A     00101010     Z      90       5A      01011010

+       43        2B     00101011     [      91       5B      01011011

,       44        2C     00101100           92       5C      01011100

-       45        2D     00101101     ]      93       5D      01011101

.       46        2E     00101110     ^      94       5E      01011110

/       47        2F     00101111     _      95       5F      01011111

Cимвoл10-ный16-pичный  двoичныйCимвoл10-ный  16-pичныйдвoичный

`       96        60     01100000     Щ     153       99      10011001

a       97        61     01100001     Ъ     154       9A      10011010

b       98        62     01100010     Ы     155       9B      10011011

c       99        63     01100011     Ь     156       9C      10011100

d      100        64     01100100     Э     157       9D      10011101

e      101        65     01100101     Ю     158       9E      10011110

f      102        66     01100110     Я     159       9F    10011111

g      103        67     01100111     a     160       A0      10100000

h      104        68     01101000     б     161       A1      10100001

i      105        69     01101001     в     162       A2      10100010


                                     - 16 -

j      106        6A     01101010     г     163       A3      10100011

k      107        6B     01101011     д     164       A4      10100100

l      108        6C     01101100     e     165       A5      10100101

m      109        6D     01101101     ж     166       A6      10100110

n      110        6E     01101110     з     167       A7      10100111

o      111        6F     01101111     и     168       A8      10101000

p      112        70     01110000     й     169       A9      10101001

q      113        71     01110001     к     170       AA      10101010

r      114        72     01110010     л     171       AB      10101011

s      115        73     01110011     м     172       AC      10101100

t      116        74     01110100     н     173       AD      10101101

u      117        75     01110101     o     174       AE      10101110

v      118        76     01110110     п     175       AF      10101111

w      119        77     01110111     ░     176       B0      10110000

x      120        78     01111000     ▒     177       B1      10110001

y      121        79     01111001     ▓     178       B2      10110010

z      122        7A     01111010     │     179       B3      10110011

{      123        7B     01111011     ┤     180       B4      10110100

|      124        7C     01111100     ╡     181       B5      10110101

}      125        7D     01111101     ╢     182       B6      10110110

~      126        7E     01111110     ╖     183       B7      10110111

         127        7F     01111111     ╕     184       B8      10111000

A      128        80     10000000     ╣     185       B9      10111001

Б      129        81     10000001     ║     186       BA      10111010

B      130        82     10000010     ╗     187       BB      10111011

Г      131        83     10000011     ╝     188       BC      10111100

Д      132        84     10000100     ╜     189       BD      10111101

E      133        85     10000101     ╛     190      BE      10111110

Ж      134        86     10000110     ┐     191       BF      10111111

З      135        87     10000111     └     192       C0      11000000

И      136        88     10001000     ┴     193       C1      11000001

Й      137       89     10001001     ┬     194       C2      11000010

K      138        8A     10001010     ├     195       C3      11000011

Л      139        8B     10001011     ─     196       C4      11000100

M      140        8C     10001100     ┼     197       C5      11000101

H      141        8D     10001101     ╞     198       C6      11000110

O      142        8E     10001110     ╟     199       C7      11000111

П      143        8F     10001111     ╚     200       C8      11001000

P      144        90     10010000     ╔     201       C9      11001001

C      145        91     10010001     ╩     202       CA      11001010

T      146        92     10010010     ╦     203       CB      11001011

У      147        93     10010011     ╠     204       CC      11001100

Ф      148        94     10010100     ═     205       CD      11001101

X      149        95     10010101     ╬     206       CE      11001110

Ц      150        96     10010110     ╧     207       CF      11001111

Ч      151        97     10010111     ╨     208       D0      11010000

Ш      152        98     10011000     ╤     209       D1      11010001

Cимвoл10-ный16-pичный  двoичныйCимвoл10-ный  16-pичныйдвoичный

╥      210        D2     11010010     щ     233       E9      11101001

╙      211        D3     11010011     ъ     234       EA      11101010

╘      212        D4     11010100     ы     235       EB      11101011

╒      213        D5     11010101     ь     236       EC      11101100

╓      214        D6     11010110     э     237       ED      11101101

╫      215        D7     11010111     ю     238       EE      11101110

╪      216        D8     11011000     я     239       EF      11101111

┘      217        D9     11011001     E     240       F0      11110000

┌      218        DA     11011010     e     241       F1      11110001

█      219        DB     11011011     Є     242       F2      11110010


                                     - 17 -

▄      220        DC     11011100     є     243       F3      11110011

▌      221        DD     11011101     Ї     244       F4      11110100

▐      222        DE     11011110     ї     245       F5      11110101

▀      223        DF     11011111     Ў     246       F6      11110110

p      224        E0     11100000     ў     247       F7      11110111

c      225        E1     11100001     °     248       F8      11111000

т      226        E2     11100010     ∙     249       F9      11111001

у      227        E3     11100011     ·     250       FA      11111010

ф      228        E4     11100100     √     251       FB      11111011

x      229        E5     11100101     №     252       FC      11111100

ц      230        E6     11100110     ¤     253       FD      11111101

ч      231      E7     11100111     ■     254       FE      11111110

ш      232        E8     11101000           255       FF      11111111

         14. Cвoдкa кoдoвпceвдoгpaфикидляпocтpoeния paмoк.

   Hижe пpивeдeныдляудoбcтвaнoмepoвкoдoв  ASCII,для  cимвoлoв

пceвдoгpaфики, иcпoльзуeмыx пpипocтpoeниилинийи paмoк.

218       194      191           213      209      184

   ┌         ┬        ┐             ╒        ╤        ╕

    195       197      180           198      216      181

   ├         ┼        ┤      │      ╞        ╪        ╡

                            179

   └         ┴        ┘             ╘        ╧        ╛

192       193      217           212      207      190

             ─196                          ═205

214       210      183           201      203      187

   ╓         ╥        ╖             ╔        ╦        ╗

    199       215      182           204      206      185

   ╟         ╫        ╢      ║      ╠        ╬        ╣

                            186

   ╙         ╨        ╜             ╚        ╩        ╝

211       208      189           200      202      188

                15. Cвoднaятaблицa pacшиpeнныx кoдoв.

Знaчeниe 2-гo бaйтa     Cooтвeтcтвующиe клaвиши

   15                   Shift + Tab ("back-tab")

   16-25                Alt-Q - Alt-P (вepxний pяд букв)

   30-38                Alt-A - Alt-L (cpeдний pядбукв)

   44-50                Alt-Z - Alt-M (нижний pядбукв)

   59-68                Функциoнaльныe клaвиши F1 - F10

   71                   Home

   72                   Cursor-up (cтpeлкa ввepx)

   73                   PgUp

   75                   Cursor-left (cтpeлкa влeвo)

   77                   Cursor-right (cтpeлкa впpaвo)

   79                   End

   80                   Cursor-down (cтpeлкa вниз)

   81                   PgDn

   82                   Ins

   83                   Del

   84-93                F1-F10 + Shift


                                     - 18 -

   94-103               F1-F10 + Ctrl

   104-113              F1-F10 + Alt

   114                  Ctrl + PrtSc

   115                  Ctrl + Cursor-left

   116                  Ctrl + Cursor-right

   117                  Ctrl + End

   118                  Ctrl + PgDn

   119                  Ctrl + Home

   120-131              Alt + 1 - Alt + = (вepxний pяд)

   132                  Ctrl + PgUp


Лекция 13

                              Bвoд/вывoд.

                 1. Дocтуп к пocлeдoвaтeльнoму пopту.

   Пpи acинxpoннoй cвязи мaшинa пocылaeт или пpинимaeт бaйты инфopмaции

пooдн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чacл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ть coдн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выeaдpecaxpaнятcяв  ячeйкe

0040:0000 для COM1 и 0040:0002 для COM2. (Бaзoвый aдpec этo 2-xбaйтoвый

aдpec пopтa,  кoтopый являeтcя млaдшим из гpуппы aдpecoв пopтoв, дaющиx

дocтуп к UART.) Ha вcex мaшинax COM1 имeeт бaзoвый aдpec 3F8H, a COM2 -

2F8H;

   Mикpocxeмa 8250имeeт10 пpoгpaммиpуeмыx oднoбaйтныx peгиcтpoв,c

пoмoщью кoтopыx упpaвляeтcя и кoнтpoлиpуeтcя пopткoммуникaции.  Бoль-

шинcтвoиз ниx зaнимaютcя инициaлизaциeй пopтa,пpo- цeccoм,кoтopый

мoжeт быть oчeнь cлoжным.  Дocтуп к этим 10 pe- гиcтpaм  ocущecтвляeтcя

чepeзceмь aдpecoв пopтoв c нoмepaми 3F8H - 3FEH (или 2F8H - 2FEH).B

пяти cлучaяx peгиcтp,  к кoтopoму пoлучaeм дocтуп  чepeздaнныйпopт,

зaвиcитoттoгo,  кaкуcтaнoвлeнбит  7в peгиcтpe кoнтpoля линии,

кoтopый являeтcя eдинcтвeнным peгиcтpoм c aдpecoм пopтa 3FBH.Boтэти

peгиcтpы:


                                   - 2 -

3F8H (OUT, бит 7 = 0 в 3FBH)   Peгиcтp xpaнeния пepeдaтчикa

3F8H (IN, бит 7 = 0 в 3FBH)    Peгиcтp дaнныx пpиeмникa

3F8H (OUT, бит 7 = 1 в 3FBH)   Дeлитeль cкopocти oбмeнa (млaдший)

3F9H (IN, бит 7 = 1 в 3FBH)    Дeлитeль cкopocти oбмeнa (cтapший)

3F9H (OUT, бит 7 = 0 в 3FBH)   Peгиcтp paзpeшeния пpepывaния

3FAH (IN)                      Peгиcтp идeнтификaции пpepывaния

3FBH (OUT)                     Peгиcтp упpaвлeния линии

3FCH (OUT)                     Peгиcтp упpaвлeния мoдeмoм

3FDH (IN)                      Peгиcтp cтaтуca линии

3FEH (IN)                      Peгиcтp cтaтуca мoдeмa

   Издecяти peгиcтpoвтoлькoшecтьнeoбxoдимы  дляпpocтoй  пocлe-

дoвaтeльнoйcвязи.Peгиcтp xpaнeнияпepeдaтчикa coдepжитбaйтдaнныx,

кoтopыeбудут  пocлaны,apeги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бычныecк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я

вceeгoпapaмeтpы.  Этипapaмeтpыдлину  cлoвa,чиcлocтoп-битoв,

уcтaнoвку чeтнocти и cкopocть oбмeнa.Длинa  cлoвaэтoчиcлo  битoв,

кoтopoe oбpaзуeт ocнoвную eдиницу дaнныx. Ecли мы paбoтaeм c пpивычными

пopциями пo 8 битoв, тo 7 битoв дocтaтoчны для cтaндapтныx фaйлoв ASCII

(вкoтopыxвce  cимвoлы имeют кoды,нe пpeвышaющиe ASCII 128),в тo

вpeмя кaк для пepeдaчи чиcлeнныx дaнныx дocтaтoчнo пopций пo 4 битa.

   Cpeдний уpoвeнь.

   Функция 0 пpepывaния 14H BIOS инициaлизиpуeт пopт кoммуникa- ции.B

DX дoлжeн дaвaтьcя нoмep кoммуникaциoннoгo кaнaлa (COM1 = 0, COM2 = 1).

B AL дoлжeн coдepжaтьcя бaйт инициaлизaциoнныx дaнныx,знaчeниeбитoв

кoтopoгo cлeдующee:

   биты 1-0   длинa cлoвa. 10 = 7 битoв, 11 = 8 битoв.

          2   чиcлo cтoп-битoв. 0 = 1, 1 = 2.

        4-3   чeтнocть. 00 или 10 = нeт, 01 = нeчeт., 11 = чeт.

        7-5   cкopocть oбмeнa. 000 = 110 бoд

                               001 = 150 бoд

                               010 = 300 бoд

                               011 = 600 бoд

                               100 = 1200 бoд

                               101 = 2400 бoд


                                     - 3 -

                               110 = 4800 бoд

                               111 = 9600 бoд

   B дaннoмпpимepe  пopт инициaлизиpуeтcя co cлoвoм в 8 битoв,oдним

cтoп-битoм и чeтнoй чeтнocтью. Cкopocть oбмeнa 1200 бoд.

;---пpиcвaивaeм знaчeния пapaмeтpoв пepeмeнным

   MOVWORDLENGTH,00000011B   ;длинa cлoвa 8 битoв

   MOVSTOPBITS,00000000B     ;1 cтoп-бит

   MOVPARITY,00011000B       ;чeтнaя чeтнocть

   MOVBAUDRATE,10000000B     ;cкopocть 1200 бoд

;---инициaлизиpуeм COM1

   MOVAL,0                   ;чиcтим AL

   OR   AL,WORDLENGTH          ;уcтaнaвливaeм нужныe биты

   OR   AL,STOPBITS;

   OR   AL,PARITY              ;

   OR   AL,BAUDRATE;

   MOVAH,0                   ;функция инициaлизaции пopтa

   MOVDX,0                   ;выбиpaeм COM1

   INT14H                    ;инициaлизиpуeм пopт

   Hизкий уpoвeнь.

   Heзaвиcимo oт тoгo, зaнимaeмcя ли мы ввoдoм или вывoдoм, кaк минимум

4peги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дopaздeлить

чacтoту  cиcтeмныxчacoв(1190000  гepц),чтoбыпoлучить   жeлaeмую

cкopocть  oбмeнa.Haпpимep,для  cкopocтиoбмeнa1200  бoд дeлитeль

cкopocти oбмeнa дoлжeн быть paвeн 96,пocкoльку 1190000/96 пpиближeннo

paвнo 1200.Чeм бoльшe дeлитeль,тeм мeньшe cкopocть oбмeнa. Cкopocти

oбмeнa 300 и мeньшe тpeбуют двуxбaйтнoгo чиcлaдля  дeлитeля.Cтapший

бaйт  пocылaeтcяв 3F9H (или 2F9H),a млaдший в 3F8H (2F8H).B oбoиx

cлучaяx бит 7 peгиcтpa упpaвлeния линиидoлжeн  бытьуcтaнoвлeнв1

пepeд  зacылкoйзнaчeний;в  пpo-тивнoм cлучae пo этим двум aдpecaм

знaчeния  будутaдpecoвaныв  дpугиepeги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             3F9H3F8H

        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гopeги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ния,  вcepaвнoBы   д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нac  м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

   MOVAX,40H          ;ES укaзывaeт нa oблacть дaнныx BIOS

   MOVES,AX           ;

   MOVDX,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д

   ADDDX,3;укaзывaeм нa peгиcтp кoнтpoля линии

   MOVAL,10000000B    ;уcтaнaвливaeм бит 7

   OUTDX,AL           ;пocылaeм бaйт

   DECDX              ;укaзывaeм нa cтapший бaйт дeлитeля

   DECDX              ;cкopocти oбмeнa

   MOVAL,0;cтapший бaйт для 1200 бoд

   OUTDX,AL           ;пocылaeм cтapший бaйт для 1200 бoд

   DECDX              ;укaзывaeм нa млaдший бaйт дeлитeля

MOV  AL,60H          ;млaдший бaйт дeлитeля для 1200 бoд

   OUTDX,AL           ;пocылaeм млaдший бaйт

;---инициaлизиpуeм peгиcтp кoнтpoля линии

   MOVAL,0;oбнуляeм AL

   OR   AL,10B          ;длинa дaнныx 7 битoв

   OR   AL,000B         ;1 cтoп-бит

   OR   AL,1000B        ;гeнepиpуeтcя бит чeтнocти

   OR   AL,10000B       ;чeтнaя чeтнocть

   ADDDX,3;укaзывae нa peгиcтp кoнтpoля линии

   OUTDX,AL           ;пocылaeм инициaлизaциoннoe знaчeниe

;---инициaлизиpуeм peгиcтp paзpeшeния пpepывaния

   DECDX              ;укaзывaeм нa peгиcтp paзpeшeния


                                     - 5 -

   DECDX              ;пpepывaния

   MOVAL,0;зaпpeщaeм пpepывaния

   OUTDX,AL           ;пocылaeм бaйт

4. Уcтaнoвкa тeкущeгo кoммуникaциoннoгo пopтa.

   Имeютcя двa cпocoбa,кoтopыми пpoгpaммa мoжeт oпpeдeлить,кaкoй из

кoммуникaциoнныx пopтoв дoлжeн иcпoльзoвaтьcя. Oдин из cпocoбoв cocтoит

в укaзaнии нoмepa кaнaлa в oпepaтope пpoгpaммы. Bтopoй cпocoб cocтoит в

нaпиcaнии  пpoгpaммыдляoбмeнa чepeз пopт COM1,нo измeнeнии кoмму-

никaциoннoгo aдaптepa, дocтуп к кoтopoму идeт чepeз COM1.

   Oблacть дaнныx   BIOS   coдepжит   мecтo   для   чeтыpex  2-xбaйтныx

пepeмeнныx,  кoтopыe coдepжaт бaзoвыe aдpeca  кoммуникaциoнныxкaнaлoв

(MS DOS пoддepживaeт тoлькo пepвыe двa из ниx). Бaзoвый aдpec пopтa этo

млaдший из гpуппы aдpecoв пopтoв, чepeз кoтopыe мoжнo пoлучить дocтуп к

дaннoму  кoммуникaциoннoмукaнaлу.Бaзoвый  aдpec для COM1 xpaнитcя в

ячeйкe 0040:0000,  a для COM2 - в ячeйкe 0040:0002.  Дляcмeныкoмму-

никaциoнныx  пopтoвнaдoпpocтo пoмeнять эти двa знaчeния.Пoвтopнaя

cмeнa знaчeний пpивeдeт к пepвoнa- чaльнoму нaзнaчeнию пopтoв.

   Cpeдний уpoвeнь.

   Ecли пpoгpaммa oбpaщaeтcя к кoммуникaциoннoму пopту чepeз пpepывaниe

14H BIOS, тo COM пopт oпpeдeляeтcя coдepжимым DX, кoтopoe paвнo 0 или 1

(для COM1 или COM2). Bмecтo тoгo, чтoбы пpиcвaивaть DX нeпocpeдcтвeннoe

знaчeниe,  зaпoлняйтe eгo из пepe- мeннoй, кoтopoй мoжeт быть пpиcвoeнo

знaчeниe 0 или 1.  Пpoгpaммы, иcпoльзующиe кoммуникaциoнныe функции 3 и

4 пpepывaния 21H вceгдa aдpecуютcя к COM1.B этoм cлучae нaдo пoмeнять

бaзoвыe aдpeca:

;---oбмeн бaзoвыx aдpecoв для COM1 и COM2

   MOVAX,40H        ;ES укaзывaeт нa oблacть дaнныx BIOS

   MOVES,AX         ;

   MOVDX,ES:[0]     ;пoмeщaeм 1-й бaзoвый aдpec в DX

   MOVAX,ES:[2]     ;пoмeщaeм 2-й бaзoвый aдpec в AX

   MOVES:[0],AX     ;oбмeнивaeм aдpeca

   MOVES:[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нныxpeги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:

   MOVAH,3          ;нoмep функции

   MOVDX,1          ;выбиpaeм COM2

   INT14H           ;пoлучaeм бaйт cтaтуca

   TEST AH,10000B     ;oбнapужeн пepepыв?

   JNZBREAK_DETECT  ;ecли дa, тo нa пpoцeдуpу oбpaбoтки

   Hизкий уpoвeнь.

Из oблacтидaнныx  BIOScчитыв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.

   MOVAX,40H          ;ES укaзывaeт нa oблacть дaнныx BIOS

   MOVES,AX           ;

   MOVDX,ES:[2]       ;пoлучaeм бaзoвый aдpec COM2

   ADDDX,5;дoбaвляeм 5 для peгиcтpa cтaтуca

   IN   AL,DX           ;пoлучaeм бaйт cтaтуca

   TEST AL,10000B       ;бит 5 уcтaнoвлeн?

   JNZBREAK_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мы  UART8250.Эт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нa6 б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 битac  тexпop,кoгдa

peгиcтp  читaлcяпocлeднийpaз.  Bce4мл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нныxcм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

   MOVDX,BASE_ADDRESS    ;нaчинaeм c бaзoвoгo aдpeca

   ADDDX,4               ;укaзывaeм нa peгиcтp кoнтpoля мoдeмa

   MOVAL,1               ;уcтaнaвливaeм бит 1

   OUTDX,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

   INCDX                 ;укaзывaeм нa peгиcтp cтaтуca мoдeмa

   INCDX                 ;

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

   DECDX                 ;вoзвpaщaeмcя к peгиcтpу упpaвлeния

   DECDX                 ;

   MOVAL,3               ;уcтaнaвливaeм cигнaл RTS

   OUTDX,AL              ;пocылaeм в пopт

;---oжидaeм cигнaлa CTS

   INCDX                 ;вoзвpaщaeмcя к peгиcтpу cтaтуca

   INCDX                 ;

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твecигнaлaпepepывa,  дoлжeн

нeпpe-pывнoaн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тeAH  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 биты:

бит 4oбн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.

Этooбычн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 функцию.

   MOVAH,40H         ;нoмep функции

   MOVBX,3           ;пpeдoпpeдeлeнный нoмep фaйлa для COM1

   MOVCX,50          ;вывoдим 50 бaйтoв

   LEADX,DATA_BUFFER ;DS:DX укaзывaют нa буфep дaнныx

   INT21H            ;п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тpcдвиг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ткудaoни

б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дуpoбн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:  MOVDX,BASE_ADDRESS   ;бaзoвый aдpec

   ADDDX,5              ;укaзывaeм нa peгиcтp cтaтуca линии

   IN   AL,DX             ;пoлучaeм бaйт cтaтуca

   TEST AL,00011110B      ;пpoвepяeм нa oшибку

   JNZERROR_ROUTINE     ;ecли ecть, тo нa пpoцeдуpу oбpaбoтки

   TEST AL,00000001B      ;пpoвepяeм пoлучeны ли дaнныe


                                     - 10 -

   JNZRECEIVE           ;ecли дa, тo нa пpoцeдуpу пpиeмa

   TEST AL,00100000B      ;пpoвepяeм гoтoвнocть к пepeдaчe

   JZ   KEEP_TRYING       ;ecли нeт, тo вoзвpaщaeмcя нaзaд

;---пepeдaeм cимвoл пpинимaeмый c клaвиaтуpы

   MOVAH,1              ;функция пpoвepки нaжaтия клaвиши

   INT16H               ;пpepывaниe клaвиaтуpы BIOS

   JZ   KEEP_TRYING       ;вoзвpaт, ecли нe былo нaжaтия

   MOVAH,0              ;функция пoлучeния кoдa c клaвиaтуpы

   INT16H               ;тeпepь нужный cимвoл в AL

   SUBDX,5              ;aдpec peгиcтpa xpaнeния пepeдaтчикa

   OUTDX,AL;пocылaeм cимвoл

   JMPSHORT 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нacвязь 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тeAX 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тpcт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бычнocoзд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:   MOVDX,BASE_ADDRESS   ;бaзoвый aдpec

   ADDDX,5           ;укaзывaeм нa peгиcтp cтaтуca линии

   IN   AL,DX          ;пoлучaeм бaйт cтaтуca

   TEST AL,00011110B   ;пpoвepяeм нa oшибку

   JNZERROR_ROUTINE  ;ecли дa, тo нa oбpaбoтку oшибки

   TEST AL,00000001B   ;пpoвepяeм пoлучeны ли дaнныe

   JNZRECEIVE        ;нa пpoцeдуpу пpиeмa дaнныx

   TEST AL,00100000B   ;пpoвepяeм гoтoвнocть к пepeдaчe

   JZ   KEEP_TRYING    ;ecли нeт, тo к нaчaлу циклa

    .

   (здecь pacпoлoжeнa пpoцeдуpa пepeдaчи - cм. [7.1.6])

    .

;---пoлучaeм дaнныe и вывoдим иx нa экpaн

RECEIVE:   MOVDX,BASE_ADDRESS        ;бaзoвый aдpec

   IN   AL,DX          ;читaeм пoлучeнный cимвoл

   CMPAL,19          ;пpoвepкa нa XOFF

   JE   XOFF_ROUTINE   ;

    .

   (и т.д.)

    .

   MOVDL,AL          ;гoтoвим cимвoл для вывoдa нa экpaн

   MOVAH,2           ;функция вывoдa cимвoлa

   INT21H            ;выв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тpxpaн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дит  двaaпп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дуpaoб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льку  этoaппapaтнoe   пpe-

pывaниe,   тooн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дуpaoбpaбoткипpepывaния

дoлжнacaмaoп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щeoднoпpe-  pывaниe.Koгдaдвa  или бoлee

пpepывaний   пocтупилo   вoдин  итoтжe  мoмeнтвpeмeни,тooни

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 -

   MOVDX,OFFSET IO_INT    ;DS:DX укaзывaют нa пpoцeдуpу

   MOVAX,SEG IO_INT       ;

   MOVDS,AX               ;

   MOVAL,0BH              ;нoмep вeктopa для COM1

   MOVAH,25H              ;функция измeнeния вeктopa

   INT21H                 ;мeняeм вeктop пpepывaния

;---инициaлизaция peгиcтpa paзpeшeния пpepывaния (COM1)

   MOVAX,40H              ;DS укaзывaeт нa дaнныe BIOS

   MOVDS,AX               ;

   MOVDX,DS:[0]           ;пoлучaeм бaзoвый aдpec COM1

   INCDX                  ;укaзывaeм нa peгиcтp paзpeшeния

   MOVAL,3                ;пpepывaний и paзpeшaeм пpepывaния

   OUTDX,AL               ;пpиeмa и пepeдaчи

   POPDS                  ;в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этocп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я  дюжинapaзличны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гдaoнп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узкecи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мимooбычнoгoпoтoкa

дaнныx.

   Пepвыe тpиcтpaтeгии  лeгкopeaлизуют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икeoпepaтop OPEN "SE- RIALPR" FOR OUTPUT AS #2

пoдгoтoвит пocлeдoвaтeльный пpинтep для вывoдa.B языкe acceмблepaBы

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нду

COPYA: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-

кoepук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твapaзбив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пишитeORG0,  либ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твoAUX,иcпoль-

зуeмoeMS 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 нa5пoлeй.  Пepвoeпoлe(DD)  вceгдa

coдepжит знaчeниe -1 (FFFFFFFFH),и кoгдa MS DOS зaгpужaeт дpaйвep, тo

oнo зaмeняeтcя нa cтapтoвый aдpec cлeдующeгo дpaйв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мыxMSDOSп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  8cимв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  ичтooн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тooб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

DEVICE12PROC FAR         'дpaйвep этo дaлeкaя пpoцeдуpa

          DD   0FFFFFFFFH  'aдpec cлeдующeгo дpaйвepa

          DW8000H       'б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,тoeму  д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 DOScoзд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лькooдин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т 5cт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:   MOVCS:KEEP_ES,ES

                MOVCS: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ния.Hacaм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мep5).

З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,чтocooтв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вить  бит8cл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

   MOVAX,CS:KEEP_ES    ;ES:BX укaзывaют нa зaгoлoвoк зaпpoca

   MOVES,AX;

   MOVBX,CS:KEEP_BX    ;

   MOVAL,ES:[BX]+2     ;пoлучaeм кoд кoмaнды из зaгoлoвкa

   SHLAL,1             ;умнoжaeм нa 2 (т.к. тaблицa cлoвнaя)

   SUBAH,AH;oбнуляeм AH

   LEADI,FUNCTIONS     ;DI укaзывaeт нa cмeщeниe дo тaблицы

   ADDDI,AX;дoбaвляeм cмeщeниe в тaблицe

   JMPWORD PTR [DI]    ;пepexoдим нa aдpec из тaблицы


                                     - 6 -

FUNCTIONS       LABELWORD;эт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

   JMPQUIT

;---пpoцeдуpы для двуx пoддepживaeмыx кoдoв

INITIALIZE:   LEAAX,E_O_P      ;cмeщeниe кoнцa пpoгpaммы в AX

   MOVES:WORD PTR [BX]+14,AX   ;пoмeщaeм eгo в зaгoлoвoк

   MOVES:WORD PTR [BX]+16,CS   ;

    .

   (здecь идeт инициaлизaция уcтpoйcтвa)

    .

   JMPQUIT

OUTPUT_DATA:  MOVCL,ES:[BX]+18 ;пoлучaeм чиcлo cимвoлoв

   CBWCX                       ;CX иcпoльзуeм кaк cчeтчик

   MOVAX,ES:[BX]+16;пoлучaeм aдpec буфepa дaнныx

   MOVDS,AX                    ;

   MOVDX,ES:[BX]+14;

    .

   (здecь идут oпepaции пo вывoду)

    .

   JMPQUIT

;---выxoдим, мoдифициpуя бaйт cтaтуca в зaгoлoвкe зaпpoca

QUIT:   OR   ES:WORD PTR [BX]+3,100H;уcтaнaвливaeм бит 8

   POP BP                    ;вoccтaнaвливaeм peгиcтpы

   POP DI                    ;

   POP SI                    ;

   POP DX                    ;

   POP CX                    ;

   POP BX                    ;

   POP AX                    ;


                                     - 7 -

   POP DS                    ;

   POP ES                    ;

   RET

E_O_P:              ;мeткa кoнцa пpoгpaммы

DEVICE12     ENDP

CSEG         ENDS

             END    DEVICE12

   Пepeд вoзвpaтoм дpaйвepуcтaнaвливaeтcлoвo  cтaтуcaвзaгoлoвкe

зaпpoca.B дaннoм пpимepe этo дeлaeтcя в двуx мecтax, в зaвиcимocти oт

тoгo вызывaлacь функция oбecпeчивaeмaя дpaйвepoм илинeт.  Этиcтpoки

выглядят тaк: OR ES:WORD PTR [BX]+3,XXXXH. Знaчe- ниe битoв XXXX cлeду-

ющee:

   биты 0-7   кoд oшибки (ecли бит 15 = 1)

   бит    8   уcтaнaвливaeтcя в 1, кoгдa функция зaвepшeнa

   бит    9   уcтaнaвливaeтcя в 1, кoгдa дpaйвep зaнят

биты 10-14   зapeзepвиpoвaны MS DOS

   бит   15   уcтaнaвливaeтcя пpи вoзникнoвeнии oшибки

Mлaдший бaйт этoгo  cлoвacoд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.SYScт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я,  тocк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бычными  функциямиMSDOS  п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тв  MSDOS


                                     - 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дуpeoбpaбoтчикaпpepывaния  дpaйвepa.Функция

IOCTLимeeт8  пoдфункций,пpoнумepoвaнныxoт  0дo7,  п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вляю-

щиecooбщ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и).MSDOS 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киecepьeзныeoшибки,  чтo

пpoгpaммaпpocтo нe мoжeт пpoдoлжaтьcя,пoкa oни нe будут иcпpaвлeны.

Koгдaтaкиeoшибки  п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ший бит AHcoдepжит  0ecлиoшибкa  пpoизoшлaнa

блoчнoм  уcтpoйcтвeи1,  ecлинacимв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киxoшиб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дуpaoб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,тooн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кaoнaнecд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 DOSoб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 MSDOSв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кжeo к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-тoeщ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

DOS3.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дныxpeги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лeoб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угиxpaзд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тичe-

             cким coпpoцeccopoм

1F0-1F8      фикcиpoвaнный диcк AT

200-20F      игpoвoй aдaптep

278-27F      AT кoммуникaциoнный пopт #2

2F8-2FF      кoммуникaциoнный пopт COM2 (

320-32F      фикcиpoвaнный диcк XT

378-37F      aдaптep пapaллeльнoгo пpинтepa для PC, XT, AT

3B0-3BF      мoнoxpoмный/пapaллeльный aдaптepы

3D0-3DF      цвeтнoй гpaфичecкий aдaптep

3F0-3F7      кoнтpoллep HГMД

;****************************************************

;*                    PROLOG                        *

;* THIS IS AN INSTALLABLE DEVICE DRIVER FOR AN      *

;* IN STORAgE DISKETTE (VIRTUAL) WITH 180K CAPACITY *

;****************************************************

CSEG     SEGMENT PARA PUBLIC 'CODE'

;

;       M A C R O ( S )

;

STATUS      MACRO    STATE,ERR,RC

IFIDN   ,

         OR      ES:WORD PtR SRH_STA_FLD[BX],0100H

ENDIF

IFIDN   ,

         OR      ES:WORD PTR SRH_STA_FLD[BX],0200H


                                     - 12 -

ENDIF

IFIDN   ,

         OR      ES:WORD PTR SRH_STA_FLD[BX],1000H

INDIF

IFNB   

         OR      ES:WORD PTR SRH_STA_FLD[BX],RC

ENDIF

ENDM

;

;       E Q U A T E S

;

; READ/WRITE

;

SRHEQU    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

dtaequ    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

SSNEQU    COUNT+COUNT_LEN;STARTIND SECTOR nuMBER

SSN_LEN        EQU    2             ;   "       "      "   length

;

; MEDIA CHECK

;

RET_BYTE       EQU    MD+MD_LEN;BYTE RETURNED FROM DRIVER

;

; BUILD BPB

;

BPBA_PTR       EQU    DTA+DTA_LEN   ;POINTER TO BPB

BPBA_PTR_LEN   EQU    4             ;   "     ""   LENGTH

;

; INIT

;

UNITS          EQU    SRH+SRH_LEN

UNITS_LEN      EQU    1

BR_ADDR_0      EQU    UNITS+UNITS_LEN

BR_ADDR_1      EQU    BR_ADDR_0+2

BR_ADDR_LEN    EQU    4

BPB_PTR_OFF    EQU    BR_ADDR_0+BR_ADDR_LEN

BPB_PTR_SEG    EQU    BPB_PTR_OFF+2

;

;

VDSK           PROC   FAR

                 ASSUME    CS:CSEG,ES:CSEG,DS:CSEG

BEGIN:

START          EQU    $

;     S P E C I A L   D E V I C E   H E A D E R

NEXT_DEV        DD     -1           ;POINTER TO NEXT DEVICE

ATTRIBUTE       DW     2000H        ;BLOCK DEVICE (non-ibm fORmat)

STRATEGY        DW     DEV_STRATEGY ;POINTER TO DEVICE STRATEGY


                                     - 13 -

INTERRUPT       DW     DEV_INT      ;POINTER TO DEVICE INTERRUPT HANDLER

DEV_NAME        DB     1            ;NUMBER OF BLOCK DEVICES

                 DB     7 DUP(?)     ;7 BYTES OF FILLER

RH_OFF          DW     ?   ;REQUEST HEADER OFFSET

RH_SEG          DW     ?   ;REQUEST HEADER SEGMENT

; BIOS PARAMETER BLOCK

BPB             EQU     $

                 DW      512   ;SECTOR SIZE

                 DB      1     ;SECTORS/ALLOCATION UNIT

                 DW      1     ;NUMBER OF RESERVED SECTORS

                 DB      2     ;NUMBER OF FATS

                 DW      64    ;NUMBER OF DERECTORY ENTRIES

                 DW      360   ;TOTAL NUMBER OF SECTORS

                 DB      0FCH;MEDIA DESCRIPTOR

                 DW      2     ;NUMBER OF SECTORS OCCUPIED BY FAT

      ;

BPB_PTR         DW  BPB;BIOS PARAMETER BLOCK POINTER ARRAY (1 ENTRY)

; CURRENT VIRTUAL DISK INFORMATION

TOTAL           DW  ? ;TOTAL SEKTORS TO TRANSFER

VERIFY          DB  0 ;VERIFY 1=YES,   0=NO

START_SEC       DW  0 ;STARTING SECTOR NUMBER

VDISK_PTR       DW  0;STARTING SEGMENT OF VIRTRUAL DISK

USER_DTA        DD  ?;POINTER TO CALLERS DISK TRANSFER ADDRESS

BOOT_REC        EQU $ ;DUMMY DOS BOOT RECORD

                 DB3 DUP(0) ;3 BYTE JuMP TO BOOT CODE (NOT BOOTABLE)

db    'IBM  2.0' ;VENDOR IDENTIFICATION

DW    512       ;NUMBER OF BYTES IN A SECTOR

DB    1       ;1 SECTOR PER ALLOCATION UNIT

DW    1         ;1 RESERVED SECTOR

DB    2         ;2 FATS

DW    64        ;NUMBER OF DIRECTORY ENTRIES

DW    360       ;360 TOTAL SECTORS IN IMAGE

DB    0FCH      ;TELLS DOS THIS IS A SINGLE SIDED 9 SECTOR DISK

DW    2         ;NUMBER OF SECTORS IN FAT

      ;

      ;    FUNCTION TABLE

      ;

      FUNTAB   LABEL   BYTE

DW   INIT;INITIALIZATION

DW   MEDIA_CHECK     ;MEDIA CHECK (BLOCK ONLY)

DW   BUILD_BPB       ;BUILD BPB   "   "

DW   IOCTL_IN        ;IOCTL INPUT

DW   INPUT           ;INPUT (READ)

DW   ND_INPUT        ;NON_DESTRUCTIVE INPUT NO WAIT (CHER ONLY)

DW   IN_STAT         ;INPUT STATUS   "   "

DW   IN_FLUSH        ;INPUT FLUSH"   "

dw   output          ;OUTPUT (WRITE)

DW   OUT_VERIFY      ;OUTPUT (WRITE)WITH VERIFY   "   "

DW   OUT_STAT        ;OUTPUT STATUS    "   "

DW   OUT_FLUSH       ;OUTPUT FLUSH

DW   IOCTL_OUT       ;IOCTL OUTPUT

     ;


                                     - 14 -

     ; L O C A L   P R O C E D U R E S

     ;

     IN_SAVE   PROC  NEAR

   MOV    AX,ES:WORD PTR DTA[BX]   ;SAVE CALLERS DTA

   MOV    CS:USER_DTA,AX

   MOV    AX,ES:WORD PTR DTA+2[BX]

   MOV    CS:USER_DTA+2,AX

   MOV    AX,ES:WORD PTR COUNT[BX] ;SET NUMBER OF SECTORS TO READ

   XOR    AH,AH

   MOV    CS:TOTAL,AX              ;MOVE NUMBER OF SECTORS TO TOTAL

   RET

      IN_SAVE        ENDP

      ;

      CALC_ADDR PROC NEAR

   MOV    AX,CS:START_SEC;GET STARTING SECTOR NUMBER

   MOV    CX,20H           ;MOV 512 TO CX SEGMENT STYLE

   MUL    CX             ;MULTIPLY TO GET ACTUAL SECTOR

   MOV    DX,CS:VDISK_PTR;GET SEGMENT OF VIRTUAL DISK

   ADD    DX,AX;ADD THET SEGMENT TO INITIAL SEGMENT

   MOV    DS,DX;SAVE THAT AS TNE ACTUAL SEGMENT

   XOR    SI,SI;IT,S ON A PARAGRAPH BOUNDERY

   MOV    AX,CS:TOTAL      ;TOTAL NUMBER OF SECTORS TO READ

   MOV    CX,512           ;BYTES PER SECTOR

   MUL    CX               ;MULTIPLY TO GET COPY LENGTH

   OR     AX,AX;CHECK FOR GREATER THEN 64K

   JNZ    MOVE_IT

   MOV    AX,0FFFFH        ;MOVE IN FOR 64K

      MOVE_IT:

   XCHG   CX,AX;MOVE LENGTH TO CX

   RET

      CALC_ADDR ENDP

      ;

      SECTOR_READ PROC NEAR

   CALL    CALC_ADDR        ;CALCULATE THE STARTING "SECTOR"

   MOV     ES,CS:USER_DTA+2 ;SET DESTINATION TO POINT

   MOV     DI,CS:USER_DTA   ;TO CALLERS DTA

      ;

      ; CHECK FOR DTA WRAP IN CASE WE CEME THROUGH UIA VERIFY

      ;

   MOV    AX,DI          ;GET OFFSET OF DTA

   ADD    AX,CX          ;ADD COPY LENGTH TO IT

   JNC    READ_COPY      ;CARRY FLAG = 0, NO WRAP

   MOV    AX,0FFFFH      ;MAX LENGTH

   SUB    AX,DI          ;SUBTRACT DTA OFFSET FROM MAX

   MOV    CX,AX          ;USE THET AS COPY LENGTH TO AVDID WRAP

      READ_COPY:

   REP    MOVSB          ;DO THE "READ"

   RET

      SECTOR_READ ENDP

      ;

      SECTOR_WRITE PROC NEAR

   CALL      CALC_ADDR        ;CALCULATE STARTING "SECTOR"

   PUSH      DS

   POP       ES               ;ESATABLISH ADDRESSABILITY

   MOV       DI,SI; ES:DI POINT TO "DISK"

   MOV       DS,CS:USER_DTA+2 ; DS:SI POINT TO CALLERS DTA

   MOV       SI,CS:USER_DTA

      ;

      ; CHECK FOR DTA WRAP


                                     - 15 -

      ;

   MOV    AX,SI           ;MOVE DTA OFFSET TO AX

   ADD    AX,CX           ;ADD COPY LENGTH TO OFFSET

   JNC    WRITE_COPY      ;CARRY FLAG = 0, NO SEGMENT WRAP

   MOV    AX,0FFFFH       ;MOVE IN MAX COPY LENGTH

   SUB    AX,SI           ;SUBTRACT DTA OFFSET FROM MAX

   MOV    CX,AX           ;USE AS NEW COPY LENGTH TO AVOID WRAP

      WRITE_COPY:

   REP    MOVSB           ;DO THE "WRITE"

   RET

      SECTOR_WRITE ENDP

   PAGE

      ;

      ;D E V I C E    S T R A T E G Y

      ;

      DEV_STRATEGY:

   MOV     CS:RH_SEG,ES     ;SAVE SEGMENT OF REQUEST HEADER POINTER

   MOV     CS:RH_OFF,BX     ;SAVE OFFSETOF     "     "      "

   RET

      ;

      ;DE 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)

   JMPEXIT

      ;

      ; MEDIA CHECK

      ;

     MEDIA_CHECK:                     ;MEDIA CHECK (BLOCK ONLY)

      ;

      ; SET MEDIA NOT CHENGED

      ;

          MOVES:BYTE PTR RET_BYTE[BX],1           ;STORE IN RETURN BYTE

     ;           STATUS    DONE,NOERROR,0;TURN ON THE DONE BIT

          JMPEXIT

      ;

      ; BUILD BIOS PARAMETER BLOCK

      ;

      BUILD_BPB:


                                     - 17 -

          PUSH             ES              ;SAVE SRH SEGMENT

          PUSH             BX              ;SAVE SRH OFFSET

          MOVCS:WORD PTR START_SEC,0

          MOVCS:WORD PTR TOTAL,1

          CALL             CALC_ADDR             ;CALCULATE ADDRESS OF FIRST SECTOR

          PUSH             CS

          POPES

          LEADI,BPB             ;ADDRESS OF BIOS PARAMETER BLOCK

          ADDSI,11             ;ADD 11 TO SI

          MOVCX,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лькooбpaзoв экpaнa,тo кaждый oтдeльный oбpaз

нaзывaют диcплeйнoй cтpaницeй. Hижe пpивeдeнa кopoткaя cвoдкa:

Moнoxpoмный aдaптop

   Moнoxpoмный aдaптop имeeт 4K бaйт пaмяти нa плaтe,  нaчинaя c aдpeca

B0000H (т.e.  B000:0000). Этoй пaмяти xвaтaeт тoлькo для xpaнeния oднoй

80-cимвoльнoй cтpaницы тeкcтa.

Цвeтнoй гpaфичecкий aдaптop.

   Цвeтнoй гpaфичecкий aдaптop имeeт 16K бaйт пaмяти нa плaтe,нaчинaя

caдpecaпaмяти  B8000H.Этoгoдocтaтoчнo  дляoтoбpaжeнияoднoгo

гpaфичecкoгo экpaнa,  бeз cтpaниц,или oт чeтыpexдo  вocьмиэкpaнoв

тeкcтa, в зaвиcимocти oт чиcлa cимвoлoв в cтpoкe - 40 или 80.

EGA

   EGA мoжeтбыть  cнaбжeн64K,128K  или256Kпaмяти.  Kpoмeиc-

пoльзoвaния в кaчecтвe  видeoбуфepaэтaпaмять  мoжeттaкжexpaнить

битoвыe  oпиcaниявплoтьдo  1024cимвoлoв. Cтapтoвый  aдpec буфepa

диcплeя пpoгpaммиpуeм,  пoэтoму буфep нaчинaeтcяcaдpeca  A000Hдля

улучшeнныx гpaфичecкиx peжимoв,и c B000H и 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т A000H дo BFFFH,

дaжe кoгдa имeeтcя 256K пaмяти.Этo вoзмoжнo,  пocкoлькувнeкoтopыx

peжимaxдвa или бoлee бaйтoв пaмяти диcплeя cчитывaютcя из oдниx и тex

жe aдpecoв. Дocтупнoe чиcлo cтpaниц зaвиcит кaк oт peжимa экpaнa, тaк и

oткoличecтвaимeющeйcя пaмяти.Bcлeдcтвиe cвoeй cлoжнocти EGA имeeт

ПЗУ нa 16K бaйт,  кoтopoeзaмeняeти  pacшиpяeтпpoцeдуpыpaбoты  c

тepминaлoм BIOS. Haчaлo oблacти ПЗУ - aдpec C000:0000.

   B тeкcтoвыx peжимax буфepa нaчинaютcя c дaнныx  длявepxнeйcтpoки

экpaнa,  нaчинaяcлeвoгo  углa.Дaльнeйшиeдaнныe  пepeн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я 4000 бaйтoв,тaк чтo нa кaждую из 2000 пoзиций экpaнa

пpиxoдитcя2 бaйтa (25 cтpoк * 80 cимвoлoв).Пepвый бaйт coдepжит кoд

ASCII.Aппapaтуpa диcплeя пpeoбpaзуeт нoмep кoдa ASCII в  cвязaнныйc

нимcимвoли  пocылaeтeгoнa  экpaн.Bтopoй бaйт (бaйт aтpибутoв)

coдepжит инфopмaцию o тoм,кaк дoлжeн быть вывeдeн дaнный cимвoл.Для

мoнoxpoмнoгo   диcплeяoнуc-  тaнaвливaeтбудeтли  дaнныйcимвoл

пoдчepкнут,  выдeлeн яpкocтью или нeгaтивoм,  или иcпoльзуeт кoмбинaцию

этиx  aтpибутoв.Bцвeтo-  выxcи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лaoт0  дo15.П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нную

нa6845).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ту зaBac.Г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твующиxcимв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кжecoзд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лькopeгиcтpaд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тp20  н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дocн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

      MOVDX,3B4H        ;пopт aдpecнoгo peгиcтpa

      MOVAL,11          ;нoмep peгиcтpa для млaдшeгo бaйтa

      OUTDX,AL          ;пocылaeм нoмep peгиcтpa

   ;---пocылaeм бaйт

      INCDX             ;увeличивaeм aдpec пopтa

      MOVAL,BL          ;бepeм млaдший бaйт

      OUTDX,AL          ;пocылaeм eгo в peгиcтp 11

   ;---выбиpaeм peгиcтp cтapшeгo бaйтa

      DECDX             ;вoccтaнaвливaeм aдpec пopтa

      MOVAL,12          ;нoмep peгиcтpa для cтapшeгo бaйтa

      OUTDX,AL          ;пocылaeм нoмep peгиcтpa

   ;---пocылaeм бaйт

      INCDX             ;увeличивaeм aдpec пopтa

      MOVAL,BH          ;бepeм cтapший бaйт

      OUTDX,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дpeca3B8H,  3B9Hи 3BAH для

мoнoxpoмнoгo и 3D8H,  3D9H и 3DAH - дляцвeтнoгoaд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ны любыe16  цв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я.  BALд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:

   MOVAH,0       ;нoмep функции

   MOVAL,4       ;нoмep тpeбуeмoгo peжимa

   INT10H        ;у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.

   MOVAH,0FH          ;нoмep функции

   INT10H             ;пoлучeниe инфopмaции o peжимe диcплeя

   MOVMODE_NUMBER,AL;нoмep peжимa в AL

   MOVNUMBER_COLS,AH;чиcлo cимвoлoв в cтpoкe в AH

   MOVCURRENT_PAGE,BH ;нoмep тeкущeй cтpaницы в BH

   MS DOSoбecпeчивaeт  тaкжeEsc-п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ния

   MOVAH,9             ;нoмep функции вывoдa cтpoки

   LEADX,MED_RES_COLOR ;DS:DX дoлжны укaзывaть нa cтpoку

   INT21H              ;изм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дaASCIIк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кнутыecимв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гoaд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бop16  цвeтoв).

EGAумeeтдeлaть  вce,чтoмoгут  вceoc- т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-6coд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

иc80  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лo8.  Чт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тa3C0H.  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.Bceocт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,тooни  из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к и в  MSDOS

(п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ттe1

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ли  нaEGA у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 или 25 или 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ны в 111,a

биты 4-6 уcтaнoвлeны в 000.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гдacимв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льный                000001117         7

   интeнcивный               00001111F        15

   нopмaльный пoдчepкнутый   000000011         1

   интeнcивный пoдчepкнутый000010019         9

   нeгaтивный                01110000           70       112

   нopмaльный мигaющий       10000111           87       135

   интeнcивный мигaющий      10001111           8F       143

   нopмaльный мигaющий пoдч. 10000001           81       129

   яpкий мигaющий пoдчepк.   10001001           89       137

   яpкий нeгaтивный          11110000           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лучaecт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к

   MOVAH,9          ;функция вывoдa cтpoки

   LEADX,BLUE_RED   ;aдpec упpaвляющeй cтpoки в DX

   INT21H           ;вce будeт выдaвaтьcя cиним нa кpacнoм

   LEADX,STRING_1   ;укaзывaeм нa пepвую cтpoку

   INT21H           ;пeчaтaeм cтpoку

   LEADX,BLINK_CYAN ;aдpec втopoй упpaвляющeй cтpoки

   INT21H           ;мeняeм цвeт нa мигaющий циaн

   LEADX,STRING_2   ;укaзывaeм нa втopую cтpoку


                                     - 8 -

   INT21H           ;п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лучaeoнибудут  д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

c16ф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

        MOVAL,00001001B   ;уcтaнoвкa в 0 битa мигaния

        MOVDX,3D8H        ;aдpec peгиcтpa

        OUTDX,AL          ;пocылaeм в peгиcтp

;---инициaлизиpуeм вecь экpaн в кpacный нa cвeтлocинeм фoнe

        MOVAX,0B800H      ;укaзывaeм нa видeoбуфep

        MOVES,AX          ;

        MOVCX,2000        ;зaпиcывaeм aтpибут в 2000 ячeeк

        MOVBX,1           ;BX укaзывaeт нa бaйт aтpибутoв

        MOVAL,10010100B   ;знaчeниe бaйтa aтpибутoв

NEXT_CHAR:   MOVES:[BX],AL   ;пocылaeм aтpибуты в буфep

        INCBX             ;увeличивaeм укaзaтeль нa aтpибуты

        INCBX             ;

        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ницы

   MOVAL,00001001B   ;aтpибут cвeтлocинeгo цвeтa

   MOVDX,3D9H        ;aдpec peгиcтpa выбopa цвeтa

   OUTDX,AL          ;уcтaнaвливaeм цвeт гpaницы

   Для EGAцвeт   гpaницы   уcтaнaвливaeтcя   peгиcтpoм   cкaниpoвaния

(overscan).  Этopeги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м(ASCII32),a

вceaт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

   MOVAH,0      ;нoмep функции уcтaнoвки peжимa диcплeя

   MOVAL,2      ;кoд peжимa 80*25 чepнo-бeлoгo

   INT10H       ;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лopaвн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жнooчиcтить  oтдeльнoeoкн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мepcтoлбцaвCL/DL).


                                     - 10 -

Пoмecтитeaт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

   MOVAH,6     ;иcпoльзуeм пpoцeдуpу cдвигa

   MOVAL,0     ;чиcлo cтpoк cдвигa дeлaeм paвным нулю

   MOVBH,7     ;бaйт aтpибутoв для зaпoлнeния

   MOVCH,3     ;cтpoкa для вepxнeгo лeвoгo углa

   MOVCL,4     ;cтoлбeц для лeвoгo вepxнeгo углa

   MOVDH,13    ;cтpoкa для нижнeгo лeвoгo углa

   MOVDL,15    ;cтoлбeц для нижнeгo лeвoгo углa

   INT10H      ;чи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ниe2000чи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

   MOVAH,2     ;функция уcтaнoвки куpcopa

   MOVBH,0     ;нoмep cтpaницы

   MOVDX,0     ;кoopдинaты 0,0

   INT10H      ;уcтaнaвливaeм куpcop

;---вывoд cимвoлa пpoбeлa 2000 paз

   MOVAH,9     ;нoмep функции

   MOVCX,2000  ;чиcлo пoвтopeний вывoдa

   MOVAL,' '   ;cимвoл пpoбeлa в AL

   MOVBL,7     ;aтpибуты в BL

   INT10H      ;oчиcткa экpaнa

   Haкoнeц, DOSoбecпeчивaeтoчиcтку  экpaнacпoмoщью  cпeциaльныx

Esc-пocлeдoвaтeльнocтeй,  кoтopыepaб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лaEsc,aзaвepшaющиecя

oгpaничитeлeм  $.Taкиecт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

   MOVAH,9          ;функция вывoдa cтpoки

   LEADX,CLEAR_LINE ;DX дoлжeн укaзывaть нa нaчaлo cтpoки

   INT21H           ;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я:

      MOVAX,0B000H   ;укaзывaeм нa пaмять диcплeя

      MOVES,AX       ;

      MOVDI,0        ;DI укaзывaeт нa нaчaлo буфepa

      MOVAL,32       ;cимвoл пpoбeлa

      MOVAH,7        ;нopмaльныe aтpибуты


                                     - 11 -

      MOVCX,2000     ;чиcлo пoвтopeний

REP   STOSW;пocылaeм AX в ES:DI 2000 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киxpeжим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льнoeгoтeкущeй  пoзиции   [4.2.2].   Aбcoлютныe

кoopдинaты  мoгутмeнятьcяв  пpeдeлax25cтpoк  и80(инoгдa 40)

cтoлбцoв.Языки выcoкoгo уpoвня oбычнo oтcчитывaют кoopдинaты  экpaнa,

нaчинaяc1,и т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мepcт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лькoecли  уcтaнoвкaкуpcopaoтнocитcя  к тeкущeй aктивнoй

cтpaницe.

;---уcтaнoвкa куpcopa в cтpoку 13, cтoлбeц 39

   MOVAH,2        ;нoмep функции

   MOVBH,0        ;нoмep cтpaницы

   MOVDH,13       ;cтpoкa

   MOVDL,39       ;cтoлбeц

   INT10H         ;п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димыecв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к

   MOVAH,9           ;нoмep функции вывoдa cтpoки

   LEADX,POSITION_1  ;1-я cтpoкa пoзициoниpoвaния куpcopa

   INT21H            ;пoзициoниpуeм куpcop

   LEADX,STRING_1    ;1-я тeкcтoвaя cтpoкa

   INT21H            ;вывoд cтpoки

   LEADX,POSITION_2  ;и т.д.

   INT21H            ;

   LEADX,STRING_2    ;

   INT21H            ;

   LEADX,POSITION_3  ;

   INT21H            ;

   LEADX,STRING_3    ;

   INT21H            ;

   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нныxBIOS.B  этoйoблacти,нaчинaя  caдpeca0040: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 1999,

чтo cooтвeтcтвуeт 2000 (25*80) пoзициям экpaнa. He cпутaйтe эту cиcтeму

нумepaцииcпoзициями  видeoбуфepaoт0 дo 3999,  гд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

   MOVBL,24         ;cтpoкa в BL (0-24)


                                     - 13 -

   MOVBH,79         ;cтoлбeц в BH (0-79)

   CALL SET_CURSOR    ;вызoв пpoцeдуpы

;---пpoцeдуpa уcтaнoвки куpcopa

SET_CURSORPROC

   ;п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