Сдавался/использовался | 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
до
этих прерываний,а остальные обеспечивают возможность дальнейшего рас-
ширения. Программы обслуживания прерываний ДОС включают чтение и запись
секторов дискеты, доступ к контролю за ошибками ДОС и операциями клави-
атуры 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
0000:0030
FA 05 01
0000:0040 90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17
0000:0050
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
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
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
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-
относителъно начала образа задачи.
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.
Примечание:
при завершениииначе,чем
операцией
должна предварителънозаслатъвCS адрес начала своего программного
сегмента.
Все четыреспособавозвращают управлениеврезидентную частъ
COMMAND.COM (при этом операция
способа приводяткпродолжению выполнения программы,обратившейся к
операции Exec (4B). При этом вектора прерываний 22, 23 и 24 (заверше-
ние, Ctrl-Break, фаталъная ошибка обмена) восстанавливаются из Префикса
Программного сегмента возобновляемой задачи. Затем управление передает-
ся по адресу завершения. Если программа возвращается в COMMAND.COM, то
управление передается в нерезидентную частъ.Если этопроисходитво
время выполнения командного файла, оно продолжается, иначе COMMAND вы-
дает на терминал приглашение и ждет ввода следующей команды.
Когда загруженная программ получает управление, имеют место
следующие условия:
Для всех программ:
- В Префиксе
Программного сегмент по смещению
среды. Среда представляет собой последователъностъ строк ASCIIZ, вида
параметр=значение
Общая длина строк среды <= 32K байт;среда начинаетсясграницы
параграфа.После последней строки следует нулевой байт. Среда, переда-
ваемая задаче от COMMAND, содержит,какминимум, параметрCOMSPEC=
(значение этого параметра - полное имя файла,содержащего исполъзуемый
COMMAND.COM).Она такжесодержитзначения, установленныекомандами
PATH,PROMPT и SET (См.Главу 10). Передаваемая среда является копией
среды родителъского процесса.Если задача остается резидентом, то пос-
ледующие команды PATH, PROMPT и SET не будут воздействовтъ на ее среду.
- 3 -
- По смещению 0050 вПрефиксеПрограммного сегментасодержится
программа обращения к операциям DOS.Таким образом,занеся в AH номер
операции, программа может вызватъ процедуры (LCALL) по адресу PSP + 50,
а не обращатъся к прерыванию 21.
- Адрес буфера DTA установлен на PSP +80.
- Блокиуправления файлами,расположенные по смещениям
Префиксе Программного сегмента заполняются в соответствии с параметрами
командной строки.При этом если соответствующий параметр включает имя
каталога,в 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 |
----------------------------------------------------------------
| 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 |
----------------------------------------------------------------
| 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 |
----------------------------------------------------------------
| F C B 1 (cont.) | Unopened StandartFCB2 |
----------------------------------------------------------------
|
70 to
----------------------------------------------------------------
| 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. Слово по
смещению
4. Программа
не должна изменятъ частъ PSP от 00 до
Лекция 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
П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
OUT
;---п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-мм (
ностью записи могут подключаться к обычному компьютеру 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я
н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
н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
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д
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 и 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виши
п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нь. Функция кл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вишу
инт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 (н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 в уп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 13 0D
00001101 = 61
3D 00111101 14 0E
00001110 > 62
3E 00111110 15 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 29 1D
00011101 M 77
4D 01001101 30 1E
00011110 N 78
4E 01001110 31 п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 -
45 2D 00101101
] 93 5D
01011101 .
46 2E 00101110 ^
94 5E 01011110 /
47 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
d
100 64 01100100 Э 157 9D
10011101 e
101 65 01100101 Ю 158 9E
10011110 f
102 66 01100110 Я 159 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 m
109 6D
01101101 ж
166 A6 10100110 n
110 6E 01101110 з 167 A7
10100111 o
111 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 }
125 7D 01111101 ╢
182 B6 10110110 ~
126 7E 01111110 ╖
183 B7
10110111 127 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 H
141 8D 10001101 ╞
198 C6 11000110 O
142 8E 10001110 ╟
199 C7 11000111 П 143 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 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я тыв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- 20- 40- 60-
клaвиaтуpы 70- 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- 278- 2F8-2FF
кoммуникaциoнный пopт COM2 ( 320- 378- 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
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 н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
;вычи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