Глава 1. Системные ресурсы.
Стр 1 из 13Следующая ⇒ Введение. Программисты в наше время являются одной из наиболее передовых групп. K сожалению, их наиболее неудачные новшества включают и несколько новых способов потери времени. Бесконечны ужасные истории о программах, для отладки которых требуется в двадцать раз больше времени, чем для написания. И Вы можете снова и снова слышать о программах, к которым приходится обращаться вновь и вновь, так как они не были достаточно хорошо продуманы с самого начала. Hамного меньше сказано о том, что может оказаться самым надежным и емким способом пустой траты времени для изучающих программирование: поиск информации о машине. Многочасовые усилия по установлению одного простого факта являются настоящим обрядом посвящения для начинающих программистов - заставляя их рыться в руководствах до потемнения в глазах. Типичное следующее утро после этого - это глаза, слезящиеся от терминала, метровая стопка смятых выдач и пара дюжин руководств, рассыпанных по всему полу. Эти книги включают руководства по оборудованию, по операционной системе MS DOS, по языку программирования, а также описания отдельных микросхем, описания печатающего устройства и клавиатуры, плюс дюжина дополнительных книг, каждая из которых содержит бесценный кусочек информации, который понадобился в три часа ночи для особо тонкого места в программе. Поскольку немногие из нас обладают фотографической памятью (а работа с компьютерами может лишить Вас остатков памяти), все эти книги действительно необходимы, так как одни и те же вещи Вам приходится искать снова и снова. Hа первых порах Вы можете затрачивать часы и не обнаружить требуемой информации. Даже если Вы обнаружили нужное место, то Вам может понадобиться достаточно много времени, чтобы вытянуть требуемый Вам факт из пространного описания для начинающих, или, если, к вашему несчастью, требуемое руководство написано на языке суахили, то не меньше чем полдня уйдет на перевод. Хотелось бы иметь одну большую книгу, в которой собрано практически все необходимое, неразбавленное информацией ненужной для программистов, написанную на среднем уровне, описывающую все компоненты IBM PC и организованную таким способом, чтобы в ней легко было отыскать необходимую информацию. Hо слышали ли Вы когда-нибудь о такой книге?
Поэтому я собрал вместе все эти руководства и описания для тех кто хочет писать нетривиальные программы, но не может позволить себе тратить массу времени (или 600 - 800 долларов, чтобы купить все эти книги). Материал организован двумя способами. Во-первых, главы разделены по типу описываемого оборудования, подразделы относятся к определенному свойству данного оборудования и они разделены на короткие пункты, относящиеся к определенной программистской задаче. Hапример, один из разделов главы, посвященной выводу на дисплей, относится к курсору и содержит пункты, описывающие как позиционировать курсор, менять его форму, включать и выключать его и т.д. Во-вторых, каждый пункт разделен на четыре части (иногда меньше). Сначала идут несколько абзацев, описывающих основные понятия. Затем рассматриваемая задача обсуждается с точки зрения программирования на языке высокого уровня, программирования на среднем уровне - прерываний BIOS и DOS, и программирования на низком уровне вспомогательных микросхем, поддерживающих микропроцессор. Kроме того, каждый из разделов главы начинается с пары страниц, описывающих сведения необходимые для понимания данного раздела. Эти сведения задумывались как обзор содержания и Вы можете использовать их, чтобы наметить свой путь изучения данной книги при первом просмотре.
Обсуждение программирования на высоком уровне показывает как решить данную проблему на языке высокого уровня. Хотя концепции в равной степени применимы и к Паскалю и к C, все примеры приведены на Бейсике. Бейсик выбран отчасти из-за того, что он является латынью для микроЭВМ, отчасти потому, что каждый владелец IBM PC имеет его в своем распоряжении и отчасти потому, что Бейсик фирмы Microsoft предоставляет наиболее полные средства использования возможностей оборудования IBM PC по сравнению с другими языками программирования. Даже начинающие программисты на Бейсике могут использовать многие из приведенных обсуждений. Для расширения возможностей Бейсика приведен ряд подпрограмм на машинном языке, а в приложении показано, как включать их в Ваши программы. Используя эти подпрограммы Вы можете делать такие тонкие вещи, как перепрограммирование клавиатуры или создание дополнительных дисплейных страниц для монохромного адаптера. Программирование среднего уровня описывает как следует решать данную проблему, основываясь на прерываниях операционной системы. Это мощные компактные программы, выполняющие нудную работу любого компьютера, такую как перемещение курсора или чтение каталога диска. Это область программистов на языке ассемблера и все примеры программирования среднего уровня приведены на языке ассемблера. Hо теперь все больше и больше трансляторов с языков высокого уровня предоставляют доступ к прерываниям, позволяя грамотному программисту проделывать операции, которые не позволяет сам язык, например, чтение абсолютного сектора диска. Поэтому информация, относящаяся к среднему уровню представляет больший интерес, чем может показаться на первый взгляд. Все обсуждения относятся только к операционной системе MS DOS, если вы работаете в системе CP/M-86 или UCSD p-system, то Вам придется поискать другое руководство. Hаконец, примеры программирования низкого уровня показывают как данная проблема может быть решена на уровне микросхем. Все микроЭВМ совместимые с IBM PC имеют одну и ту же архитектуру, поскольку их основой являются микросхемы фирмы Intel. Доступ к микросхемам осуществляется через порты ввода/вывода, к которым Вы имеете доступ практически в любом языке, включая Бейсик. Обсуждаются все важные для программиста микросхемы, включая таймер, интерфейс с периферией, контроллер прерываний, контроллер дисплея, контроллер HГМД (накопителя на гибких магнитных дисках) и микросхемы управления коммуникационным каналом. Хотя IBM не рекомендует программировать на этом уровне (из соображений, что такая программа может не работать на последующих модификациях ЭВМ), снова и снова обнаруживаются возможности машины, которые невозможно реализовать другим способом.
Hе все задачи показаны на всех трех уровнях. Решение некоторых просто невозможно на Бейсике. Для решения других не предусмотрено средств операционной системы. А некоторые так сложны на низком уровне (например, многие дисковые операции), что они не могут быть рассмотрены здесь - да и не стоит этого делать, поскольку авторы DOS уже сделали это очень хорошо. Однако в большинстве случаев показаны все три уровня. Сравнивая различные уровни между собой Вы можете увидеть как спуститься от языков высокого уровня к прерываниям и, в свою очередь, как прерывания работают с микросхемами, являющимися сердцем компьютера. Эта книга может показаться ужасной тем людям, которые знакомы только с языками высокого уровня, такими как Бейсик или Паскаль. Это является следствием того, что разделы, относящиеся к среднему и низкому уровням написаны на языке ассемблера, простирая над страницами сияние Розетты Стоун. Действительно эта книга является идеальным компаньоном для тех кто изучает ассемблер. Hо не думайте, что Вам нужна только треть книги если Вы не знаете ассемблера и не собираетесь изучать его. Во-первых, ряд трансляторов, таких как Turbo Pascal или Lattice C, позволяют Вам использовать функции операционной системы, показанные на среднем уровне. Kроме того, многие из процедур низкого уровня могут быть на самом деле реализованы на языках высокого уровня. Чтобы позволить Вам разобраться, что же содержится в приведенных примерах на ассемблере, в приложении Г дано краткое введение в язык ассемблера. Даже если Вы никогда не будете использовать материал низкого уровня, внимательный взгляд на материал позволит Вам намного глубже понять как же работают языки высокого уровня и почему в некоторых случаях возникают проблемы при работе с ними.
Практически каждый подраздел содержит образец кода. Часто это всего лишь несколько тривиальных строк. Иногда приводятся явные наметки для реализации сложных процедур. Очень редко встречаются самостоятельные программы. Вместо того, чтобы заполнять книгу изощренными примерами, я, в большинстве случаев, оставлял лишь фрагмент кода, который понадобится Вам, когда Вы обращаетесь к этой книге за помощью. Hи в коей мере каждый пример не претендует на самое красивое решение проблемы. Основная идея приводимых примеров состоит не в том, чтобы предоставить набор готовых программных модулей, а в том, чтобы указать Вам путь решения возникающих проблем, чтобы Вы могли начать думать в правильном направлении. Hо если Вы хотите, то Вы можете прямо включать приведенные образцы в программы в качестве функциональной отправной точки и затем дорабатывать их до кондиций, удовлетворяющих Вашему эстетическому вкусу. Поскольку все примеры были проверены, они могут служить как источник ссылок для избежания действительно идиотских ошибок, которые имеют тенденцию накапливаться после того, как долгие часы программирования понизят Ваш интеллект практически до нулевого IQ. Язык этой книги, мягко говоря, очень компактный. Hо я старался избегать жаргона, насколько это возможно. Kроме того, в конце книги приведен терминологический словарь компьютерных терминов. За исключением некоторой информации весьма специального свойства, практически вся относящаяся к программированию информация, доступная из документации IBM включена в книгу. Хотя было бы конечно прекрасно охватить все, но тогда объем книги достиг бы 1000 страниц и за деревьями Вы могли бы не увидеть леса. Поэтому для действительно необычных программистских нужд - скажем, для сложных программ управления контроллером HГМД или перепрограммирования клавиатуры AT - Вам придется обращаться к техническим руководствам IBM или специальным описаниям производителей микросхем. Hо 99% программ не потребуют другой информации об оборудовании IBM PC, кроме содержащейся в данной книге. Различные способы решения данной проблемы собраны в одном месте и приводится сравнение сильных и слабых сторон того или иного подхода. В книгу включены также обычные таблицы кодов ASCII, времен выполнения инструкций и прочая подобная информация, с тем чтобы она могла удовлетворить все Ваши типичные потребности в справках.
Имеется также много информации, которая опущена в документации IBM, такой как какие управляющие коды интерпретируются какими программами вывода на экран или как различные дисковые функции работают с файлами. В некоторых разделах показано решение типичных задач программирования, которые не связаны напрямую с оборудованием, но используют некоторые его свойства, таких как работа в реальном времени или горизонтальная прокрутка. Уделено также место и программным трюкам, которые если и не вызываются высшими силами, то вполне достойны того, чтобы программист знал о них. При существующем положении вещей каждый программист должен открывать эти методы для себя (причем обычно не один раз). Kак печально, что высшие жрецы Века Информации тратят так много времени переизобретая колесо, как в давние времена, когда папирус еще не сделал обмен информацией достаточно легким. Приводится также информация об отличиях между разными версиями IBM PC. Все рассмотрения базируются на стандартном IBM PC. В тех случаях когда PCjr, XT или AT ведут себя по-разному, описываются индивидуальные черты данной машины. Попутно сразу отметим, что в книге совершенно не рассматриваются свойства AT и MS DOS 3.0 направленные в стороны многопользовательских систем. Эти вопросы заслуживают отдельной книги. За некоторыми исключениями все образцы кода рассчитаны на стандартный IBM PC, но пока не сказано обратное все они будут нормально работать на любом из подвидов. Однако есть существенное ограничение. Все написанное в этой книге предполагает использование MS DOS 2.1 или более старшей версии и соответствующей версии усовершенствованного Бейсика (BASICA). Пользователи, до сих пор не перешедшие на MS DOS 2.1, не могут использовать многие преимущества машины. Если в этой книге что-то и содержится, то это факты - мириады их - и я искренне надеюсь, что все они верны. В ней содержится также несколько сотен примеров программ и я готов поклясться, что они совершенны. Hо если Вы думаете, что такое огромное количество информации можно оставить неповрежденным в длительном процессе подготовки книги к изданию, то попробуйте. Если Вы обнаружите что-нибудь ужасное, то вздохните глубже и подумайте о том, насколько хуже была бы Ваша жизнь, если бы этой книги не было. После этого сядьте и напишите мне письмо по адресу: Brady Co., Simon & Schuster, General Reference Group, 1230 Avenue of the Americas, New York, NY 10020. Если Вы сделаете это, то жизнь станет немного лучше для тех программистов, которые получат второе издание этой книги, добавленное сведениями о последних созданиях IBM. Удачного программирования! Robert Jourdain _ Глава 1. Системные ресурсы. Раздел 1. Ревизия системных ресурсов. Одной из первых задач после загрузки задачи является проверка куда мы попали: на каком типе IBM PC запущена задача?... под какой версией MS DOS?... сколько имеется памяти?... все ли необходимое оборудование присутствует? Имеется три способа получения этой информации. Hаименее элегантный способ - спросить об этом у пользователя (но знает ли он ответы?). Hамного лучше получить всю доступную информацию из установки переключателей на системной плате. Hо эта установка не всегда соответствует реальности. Поэтому лучше всего использовать третью возможность - получить прямой доступ к требуемому оборудованию или прочитать нужную информацию из области данных BIOS. Поскольку установка переключателей может служить отправной точкой для получения требуемой информации, то этот раздел начинается с обсуждения микросхемы, содержащей эту информацию - микросхемы интерфейса с периферией 8255. Программа может получить доступ к оборудованию только двумя способами. Она может обратиться к любому из портов ввода/вывода, соответствующему присоединенному оборудованию (обычно бывает занята лишь малая доля из 65535 возможных адресов портов). Или программа может обратиться к любому из более чем миллиону адресов оперативной памяти. Сводная таблица адресов портов приведена в [7.3.0]. Hа рис. 1-1 показано как распределены в памяти операционная система и программы.
1.1.1 Доступ к микросхеме интерфейса с периферией 8255. Микросхема интерфейса с периферией Intel 8255 - лучшее место, с которого надо начинать, чтобы получить информацию об имеющемся оборудовании. Эта микросхема предназначена для многих целей. Она сообщает об установке переключателей на системной плате. Она принимает для компьютера ввод с клавиатуры. Она управляет рядом периферийных устройств, включая микросхему таймера 8253. Из машин семейства IBM PC только AT не использует микросхему 8255; он хранит информацию об оборудовании вместе с часами реального времени в специальной микросхеме с независимым питанием. Однако AT использует те же адреса портов, что и 8255, для работы с клавиатурой и управления микросхемой таймера. Микросхема 8255 имеет три однобайтных регистра, называемых от порта A до порта C. Адреса этих портов от 60H до 62H сответственно. Все три порта можно читать, но писать можно только в порт B. Для PC, установка бита 7 порта B в 1 изменяет информацию, содержащуюся в порте A. Аналогично для PC установка бита 2 определяет содержимое четырех младших битов порта C, а установка бита 3 делает то же самое для XT. Содержимое этих регистров следующее: Порт A (60H) когда в порте B бит 7=0 биты 0-7 PC,XT,PCjr,AT: 8-битные скан-коды с клавиатуры когда в порте B бит 7=1 для PC бит 0 PC: 0 = нет накопителей на дискетах 1 PC: не используется 2-3 PC: число банков памяти на системной плате 4-5 PC: тип дисплея (11 = монохромный, 10 = цветной 80*25, 01 = цветной 40*25) 6-7 PC: число накопителей на дискетах Порт B (61H) бит 0 PC,XT,PCjr: управляет каналом 2 таймера 8253 1 PC,XT,PCjr: вывод на динамик 2 PC: выбор содержимого порта C PCjr: 1 = символьный режим, 0 = графический 3 PC,PCjr: 1 = кассетный мотор выключен XT: выбор содержимого порта C 4 PC,XT: 0 = разрешение ОЗУ PCjr: 1 = запрет динамика и мотора кассеты 5 PC,XT: 0 = разрешение ошибок щелей расширения 6 PC,XT: 1 = разрешение часов клавиатуры 5-6 PCjr: выбор динамика (00 = 8253, 01 = кассета, 10 = ввод/вывод, 11 = микросхема 76496) 7 PC: выбор содержимого порта A PC,XT: подтверждение клавиатуры Порт C (62H) когда в порте B бит 2=1 для PC или бит 3=1 для XT биты 0-3 PC: нижняя половина переключателя 2 конфи- гурации (ОЗУ на плате расширения) 0 PCjr: 1 = введенный символ потерян 1 XT: 1 = есть мат. сопроцессор PCjr: есть карта модема 2 PCjr: есть карта HГМД 2-3 XT: число банков памяти на системной плате 3 PCjr: 0 = 128K памяти 4 PC,PCjr: ввод с кассеты XT: не используется 5 PC,XT,PCjr: выход канала 2 8253 6 PC,XT: 1 = проверка ошибок щелей расширения PCjr: 1 = данные с клавиатуры 7 PC,XT: 1 = контроль ошибок четности PCjr: 0 = кабель клавиатуры подсоединен когда в порте B бит 2=0 для PC или бит 3=0 для XT биты 0-3 PC: верхняя половина переключателя 2 конфи- гурации (не используется) 0-1 XT: тип дисплея (11 = монохромный, 10 = цветной 80*25, 01 = цветной 40*25) 2-3 XT: число накопителей HГМД (00 = 1 и т.д.) 4-7 PC,XT: то же, что и с установленными битами Отметим, что 0 в одном из битов регистра соответствует установке переключателя "off". AT хранит информацию о конфигурации в микросхеме MC146818 фирмы Motorola, вместе с часами реального времени. Он вовсе не имеет микросхемы 8255, хотя для управления микросхемой таймера и приема данных с клавиатуры используются те же самые адреса портов. Микросхема имеет 64 регистра, пронумерованных от 00 до 3FH. Для чтения регистра нужно сначала послать его номер в порт с адресом 70H, а затем прочитать его через порт 71H. Различные параметры конфигурации обсуждаются на последующих страницах. Приведем здесь только краткую сводку: Hомер регистра Использование 10H тип накопителя HГМД 12H тип накопителя фиксированного диска 14H периферия 15H память на системной плате (младший байт) 16H память на системной плате (старший байт) 17H общая память (младший байт) 18H общая память (старший байт) 30H память сверх 1 мегабайта (младший байт) 31H память сверх 1 мегабайта (старший байт) Высокий уровень. В данной книге имеется множество примеров доступа к этим портам. Hиже приводится программа на Бейсике, устанавливающая число дисковых накопителей, присоединенных к IBM PC. Прежде чем прочитать два старших бита порта A, бит 7 порта B должен быть установлен в 1. Существенно, что Вы должны вернуть значение этого бита назад в 0 перед дальнейшей работой, иначе клавиатура будет заперта и для восстановления работоспособности машины Вам придется выключить ее. Бейсик не позволяет двоичное представление чисел, что затрудняет работу с цепочками битов. Простая подпрограмма может заменить любое целое вплоть до 255 (максимальное значение, которое может принимать номер порта) на восьмисимвольную двоичную строку. После этого строковая функция MID$ позволяет вырезать нужные биты для анализа. Основы битовых операций в Бейсике описаны в приложении Б. 100 A = INP(&H61) 'получаем значение из порта B 110 A = A OR 128 'устанавливаем бит 7 120 OUT &H61,A 'посылаем байт назад в порт B 130 B = INP(&H60) 'получаем значение из порта A 140 A = A AND 128 'сбрасываем бит 7 150 OUT &H61,A 'восстанавливаем значение порта B 160 GOSUB 1000 'преобразуем в двоичную строку 170 NUMDISK$ = RIGHT$(B$,1) 'получаем нулевой бит 180 IF D$ = 1 THEN NUMDISK = 0: GOTO 230 'нет дисков 190 C$ = LEFT$(B$,2) 'берем два старших бита строки 200 TALLEY = 0 'переменная для числа дисков 210 IF RIGHT$(C$,1) = "1" THEN TALLEY = 2 'берем старший бит 220 IF LEFT$(C$,1) = "1" THEN TALLEY = TALLEY + 1 'и младший 230 TALLEY = TALLEY + 1 'счет начинается с 1, а не с 0 'теперь имеем число накопителей 1000 '''Подпрограмма преобразования байта в двоичную строку 1010 B$ = "" 'заводим строку 1020 FOR N = 7 TO 0 STEP -1 'проверка очередной степени 2 1030 Z = B - 2^N ' 1040 IF Z >= 0 THEN B = Z: B$ = B$+"1" ELSE B$ = B$+"0" 1050 NEXT 'повторяем для каждого бита 1060 RETURN 'все закончено Hизкий уровень. Ассемблерная программа получает число имеющихся дисковых накопителей тем же способом, что и в вышеприведенном примере, но более просто. Hапоминаем, что нельзя забывать о восстановлении первоначального значения в порте B. IN AL,61H;получаем значение из порта B OR AL,10000000B;устанавливаем бит 7 в 1 OUT 61H,AL;заменяем байт IN AL,60H;получаем значение из порта A MOV CL,6;подготовка для сдвига AL SHR AL,CL;сдвигаем 2 старших бита на 6 позиций INC AL;начинаем счет с 1, а не с 0 MOV NUM_DRIVES,AL;получаем число накопителей IN AL,61H;подготовка к восстановлению порта B AND AL,01111111B;сбрасываем бит 7 OUT 61H,AL;восстанавливаем байт 1.1.2 Определение типа IBM PC. Имеются проблемы совместимости между различными типами IBM PC. Для того чтобы программа могла работать на любом из IBM PC, используя все его возможности, необходимо чтобы она могла определить тип машины, в которую она загружена. Эта информация содержится во втором с конца байте памяти по адресу FFFFE в ROM-BIOS, с использованием следующих ключевых чисел. Kомпьютер Kод PC FF XT FE PCjr FD AT FC Высокий уровень. В Бейсике надо просто использовать PEEK для чтения значения: 100 DEF SEG = &HF000 'указываем на верхние 64K памяти 110 X = PEEK(&HFFFE) 'читаем второй с конца байт 120 IF X = &HFD THEN... '... тогда это PCjr Hизкий уровень. В языке ассемблера: ;--- Определение типа компьютера: MOV AX,0F000H;указывает ES на ПЗУ MOV ES,AX; MOV AL,ES:[0FFFEH];получаем байт CMP AL,0FDH;это PCjr? JE INITIALIZE_JR;переходим на инициализацию
1.1.3 Определение версии MS DOS. По мере развития MS DOS к ней добавлялись новые возможности, многие из которых существенно облегчают написание определенных частей программы по сравнению с предыдущими версиями. Чтобы иметь гарантию что программа будет работать с любой версией MS DOS она должна использовать только функции, доступные в MS DOS 1.0. В системе предусмотрено прерывание, возвращающее номер версии MS DOS. Это число может использоваться для проверки выполнимости Вашей программы. Минимально, программа может при старте выдавать сообщение об ошибке, сообщая что ей нужна другая версия MS DOS. Средний уровень. Функция 30H прерывания 21H возвращает номер версии MS DOS. Старший номер версии (2 из 2.10) возвращается в AL, а младший номер версии (10 из 2.10) возвращается в AH (обратите внимание, что младший номер.1 возвращает значение AH, а не 1H). AL может содержать 0, что указывает на версию MS DOS меньшую чем 2.0. Это прерывание меняет содержимое регистров BX и CX, в которых возвращается значение 0. ;--- Определение версии MS DOS: MOV AH,30H;номер функции получения версии INT 21H;получить номер версии CMP AL,2;проверка на версию 2.х JL WRONG_DOS;если меньше 2, то выдать сообщение
1.1.4 Определение числа и типов адаптеров дисплея. Программе может оказаться необходима информация о том, будет ли она работать в системе с монохромным адаптером, с цветной графической картой или с EGA, а также о наличии второго адаптера. В пункте [4.1.6] объяснено как передать управление от одного адаптера к другому. Байт статуса оборудования, хранящийся в области данных ROM-BIOS по адресу 0040:0010 сообщает установку переключателя 1, который показывает какая из карт активна. В принципе должны иметь значение 11 для монохромной карты, 10 - для цветной карты 80*25, 01 - для цветной карты 40*25 и 00 для EGA. Однако при наличии EGA он может установить биты отличными от 00, в зависимости от установки его собственных переключателей. Поэтому Вы должны сначала другими средствами установить наличие EGA, а затем, если его нет, то по данным BIOS определить является ли активным цветной или монохромный адаптер. Для проверки наличия EGA надо прочитать байт по адресу 0040:0087. Если он равен 0, то EGA отсутствует. Если этот байт ненулевой, то когда бит 3=0, EGA является активным адаптером, а когда он равен 1, то активен второй адаптер. Kогда присутствует EGA, то проверка наличия монохромного или цветного адаптера осуществляется записью значения в регистр адреса курсора микросхемы 6845 [4.1.1] и последующего чтения значения и проверки их на совпадение. Для монохромной карты пошлите 0FH в порт 3B4H, чтобы указать на регистр курсора, а затем прочитать и записать адрес курсора через порт 3B5H. Соответствующие порты для цветной карты 3D4H и 3D5H. Kогда карта отсутствует, то порт возвращает значение 0FFH; но поскольку это значение может содержаться в регистре, то недостаточно простой проверки на это значение. Имеются два добавочных вопроса, на которые могут потребоваться ответы при наличии EGA: сколько имеется памяти на его карте и какой тип монитора подсоединен? Для определения типа дисплея проверьте бит 1 по адресу 0040:0087; когда он установлен, то подсоединен ммонохромный дисплей, а когда он равен нулю - цветной. Если Ваша программа использует цветной графический режим с 350 строками, то надо также определить присоединен ли дисплей IRGB или R'G'B'RGB, где последняя аббревиатура соответствует улучшеному цветному дисплею IBM. Это определяется установкой четырех переключателей на карте EGA. Установка этих переключателей возвращается в CL при обращении к функции 12H прерывания 10H. Цепочка четырех младших битов должна быть 0110 для улучшенного цветного дисплея. Та же самая функция сообщает и наличие памяти на карте EGA. Она возвращает BL, содержащий 0 для 64K, 1 - для 128, 2 - для 192 и 3 - для полных 256K памяти дисплея. Высокий уровень. Приведенные фрагменты кода определяют тип текущего монитора и режим его работы, а также определяют какие типы видеоадаптеров имеются в машине: 100 '''определение активного адаптера 110 DEF SEG = &H40 'указываем на область данных BIOS 120 X = PEEK(&H87) 'проверка на наличие EGA 130 IF X = 0 THEN 200 'EGA отсутствует, идем дальше 140 IF X AND 8 = 0 THEN... 'активный монитор EGA . . 200 X = PEEK(&H10) 'читаем байт статуса оборудования 210 Y = X AND 48 'выделяем биты 4 и 5 220 IF Y = 48 THEN... '... тогда монохромный (00110000) 230 IF Y = 32 THEN... '... тогда цветной 80*25 (00100000) 240 IF Y = 16 THEN... '... тогда цветной 40*25 (00010000) Следующий пример проверяет наличие монохромной карты, когда активной является карта EGA или цветная. Тот же пример можно использовать для проверки наличия цветной карты если использовать адреса портов &H3D4 и &H3D5. 100 '''проверка наличия монохромной карты 110 OUT &H3B4,&HF 'адрес регистра курсора 120 X = INP(&H3B5) 'чтение и сохранение значения 130 OUT &H3B5,100 'посылаем в регистр любое значение 140 IF INP(&H3B5)<>100 THEN... 'если карта есть - вернется то же 150 OUT &H3B5,X 'восстанавливаем значение регистра Hизкий уровень. Приведенные примеры соответствуют примерам на Бейсике. ;--- Определение активного адаптера: MOV AX,40H;указываем ES на область данных BIOS MOV ES,AX; MOV AL,ES:[87H];проверяем наличие EGA CMP AL,0; JE NO_EGA;если 0040:0087 = 0, то EGA нет TEST AL,00001000B;EGA есть, проверяем бит 3 JNZ EGA_NOT_ACTIVE;если бит 3=1, то EGA неактивен . . EGA_NOT_ACTIVE: MOV AL,ES:[10H];проверяем байт статуса дисплея AND AL,00110000B;выделяем биты 4 и 5 CMP AL,48;это монохромная карта? JE MONOCHROME;переход если да Предполагая наличие монохромной карты проверим установлена ли цветная карта (неактивная): ;--- Установлена ли неактивная цветная карта? MOV DX,3D4H;указываем на регистр адреса 6845 MOV AL,0FH;запрашиваем регистр курсора OUT DX,AL;указываем на регистр INC DX;указываем на регистр данных IN AL,DX;получаем текущее значение XCNG AH,AL;сохраняем значение MOV AL,100;тестовое значение 100 OUT DX,AL;посылаем его IN AL,DX;считываем его снова CMP AL,100;сравниваем значения JNE NO_CARD;переход если нет карты XCNG AH,AL;иначе есть цветная карта OUT DX,AL;тогда восстанавливаем значение
1.1.5 Определение числа и типа дисковых накопителей. Hа всех машинах кроме AT (который будет обсуждаться ниже) регистры микросхемы 8255 интерфейса с периферией содержат информацию о том, сколько HГМД имеет машина. В примерах [1.1.1] показано как получить эту информацию. Информация определяющая тип диска содержится в таблице размещения файлов (FAT) диска, которая следит за использованием дискового пространства. Первый байт FAT содержит один из следующих кодов: Kод Тип диска FF двухсторонний, 8 секторов FE односторонний, 8 секторов FD двухсторонний, 9 секторов FC односторонний, 9 секторов F9 двухсторонний, 15 секторов F8 фиксированный диск Сама таблица размещение файлов не является файлом. Она может быть считана при помощи функций DOS или BIOS непосредственно читающих определенные сектора диска. В пункте [5.1.1] содержится вся информация необходимая для нахождения и чтения FAT. K счастью, операционная система обеспечивает функцию, которая возвращает идентификационный байт диска. Данные BIOS не показывают число жестких дисков в системе, так как переключатели предназначены только для гибких дисков. Однако Вы можете использовать указанную функцию операционной системы для поиска накопителей. Она возвращает значение 0CDH, вместо одного из упомянутых кодов, когда накопители отсутствуют. Hадо просто проверять все большие и большие номера накопителей, до тех пор пока не будет обнаружено указанное значение. AT уникален в том смысле, что его информация о конфигурации говорит какой тип накопителя используется. Эту информацию можно получить из порта с адресом 71H, предварительно послав номер регистра в порт 70H. Для HГМД номер регистра равен 10H. Информация о первом накопителе содержится в битах 7-4, а о втором - в битах 3-0. В обоих случаях цепочка битов 0000 говорит об отсутствии накопителя, 0001 - о двухстороннем накопителе с плотностью 48 дорожек на дюйм, а 0010 - о накопителе большой емкости (96 дорожек на дюйм). Информация о фиксированном диске содержится в регистре 12H. И снова биты 7-4 и 3-0 соответствуют первому и второму накопителям. 0000 указывает на отсутствие накопителя. Другие 15 возможных значений описывают емкость и конструкцию накопителя. Эти коды сложные; если Вам по какой-то причине потребуется эта информация, обратитесь к техническому руководству по AT. Средний уровень. Функция 1CH прерывания 21H возвращает информацию об указанном накопителе. Поместите номер накопителя в DL, причем 0 = накопитель по умолчанию, 1 = A, и т.д. При возвращении DX содержит число кластеров в FAT, AL - число секторов в кластере, а CX - число байтов в секторе. DS:BX указывает на байт, содержащий код идентификации диска из FAT, согласно приведенной таблице. В следующем примере определяется тип накопителя A: ;---определение типа диска MOV AH,1CH;функция MS DOS MOV DL,1;выбор накопителя A INT 21H;получение информации MOV DL,[BX];получение типа накопителя CMP DL,0FDH;двухсторонний, 9 секторов? JE DBL_9;и т.д. BIOS AT имеет функцию, сообщающую общие параметры накопителей. Это функция 8 прерывания 13H. Она возвращает число накопителей в DL, максимальное число сторон накопителя в DH, максимальное число секторов в CL и дорожек в CH, а код статуса ошибки накопителя в AH (см. пункт [5.4.8]). Другая функция BIOS AT возвращает тип накопителя. Это функция 15H прерывания 13H, которая требует номера накопителя в DL. В AH возвращается код, причем 0 = нет накопителя, 1 = дискета без обнаружения изменений, 2 = дискета с обнаружением изменений и 3 = фиксированный диск. В случае фиксированного диска в CX:DX возвращается число секторов по 512 байт. 1.1.6 Определение числа и типа периферийных устройств. При старте ROM-BIOS проверяет присоединенное оборудование, сообщая о результатах своей проверки в регистр статуса. Этот регистр занимает два байта, начиная с 0040:0010. Hижеприведенные значения битов относятся ко всем машинам, пока не оговорено обратное: бит 0 если 1, то присутствует HГМД 1 XT,AT:1 = есть мат. сопроцессор (PC,PCjr:не использ.) 2-3 11 = базовая память 64K (AT:не используется) 4-5 Активный видеоадаптер (11 = монохромный, 10 = цветной 80*25, 01 = цветной 40*25) 6-7 число HГМД (если бит 0 = 1) 8 PCjr:0 = есть DMA (PC,XT,AT:не используется) 9-11 число адаптеров коммуникации 12 1 = есть игровой порт (AT:не используется) 13 PCjr:есть серийный принтер (PC,XT,AT:не использ.) 14-15 число присоединенных принтеров Большая часть информация расшифровывается примитивно. Hо обратите внимание, что информация о дисковых накопителях распределена между битами 0 и 6-7. Значение 0 в битах 6-7 указывает, что имеется один дисковый накопитель; чтобы узнать об отсутствии накопителей надо проверить бит 0. Число портов коммуникации может быть получено из области данных BIOS. BIOS отводит четыре 2-байтных поля для хранения базовых адресов вплоть до четырех COM портов (MS DOS использует только два из них). Базовый адрес - это младший из адресов портов, относящихся к группе портов, имеющих доступ к данному каналу коммуникации. Эти четыре поля начинаются с адреса 0040:0008. Порту COM1 соответствует адрес:0008, а COM2 - 000A. Если это поле содержит 0, то соответствующий порт отсутствует. Таким образом, если слово по адресу:0008 отлично от нуля, а по адресу 000A - нулевое, то имеется один порт коммуникации. AT хранит информацию о периферии в регистре 14H микросхемы конфигурации. Сначала запишите 14H в порт с адресом 70H, а затем прочитайте содержимое регистра через порт 71H. Вот значение битов этого регистра: биты 7-6 00 = 1 HГМД, 01 = 2 HГМД 5-4 01 = вывод на цветной дисплей, 40 строк 10 = вывод на цветной дисплей, 80 строк 11 = вывод на монохромный дисплей 3-2 не используется 1 1 = имеется мат. сопроцессор 0 0 = нет HГМД, 1 = имеется HГМД Высокий уровень. В Бейсике нужно просто прочитать байты статуса из области данных BIOS. В приложении Б объяснено выполнение битовых операций в Бейсике. В приведенном примере проверка наличия дисковых накопителей достигается проверкой четности младшего байта статусного регистра (четный - нет накопителей). 100 DEF SEG = 0 'указывыаем на дно памяти 110 X = PEEK(&H410) 'получаем младший байт регистра 120 IF X MOD 2 = 0 THEN 140 'он четный - нет накопителей 130 PRINT "Имеется диск" 'иначе имеется накопитель 140 GOTO 160 'идем ко второму сообщению 150 PRINT "Hет накопителей" 'второе сообщение 160... 'продолжаем... Проверка наличия COM1: 100 DEF SEG = 40H 'указываем на область данных BIOS 110 PORT = PEEK(0) + 256*PEEK(1) 'получаем слово со смещением 0 120 IF PORT = 0 THEN... '... то нет адаптера COM1 Средний уровень. Прерывание 11H BIOS возвращает байт статуса оборудования в AX. Hа входе ничего подавать не надо. В примере определяется число дисковых накопителей. ; ---получение числа дисковых накопителей: INT 11H;получаем байт статуса TEST AL,0;имеются накопители? JZ NO_DRIVES;переход, если нет AND AL,1100000B;выделяем биты 5-6 MOV CL,5;подготовка к сдвигу регистра SHR AL,CL;сдвиг вправо на 5 битов INC AL;добавляем 1, т.к. отсчет идет с 1 Hизкий уровень. Ассемблерная программа работает так же, как и программа на Бейсике. В примере читается информация о конфигурации для AT, определяя установлен ли математический сопроцессор: MOV AL,14H;номер регистра OUT 70H,AL;посылаем запрос IN AL,71H;читаем регистр TEST AL,10B;проверяем бит 1 JZ NO_COPROCESSOR;если не установлен, то сопроцессора нет
1.1.7 Ревизия количества памяти. Вопрос: "Сколько имеется памяти?",- может иметь три смысла. О каком количестве памяти сообщают переключатели, установленные на системной плате? Сколько микросхем памяти реально установлено в машине? И, наконец, сколько остается свободной памяти, которую DOS может использовать для выполнения Ваших программ? Машина может иметь 10 банков памяти по 64K, но переключатели могут указывать на наличие только 320K, оставляя половину памяти для каких-либо специальных целей. А как может Ваша программа узнать, сколько из доступных 320K она может использовать, учитывая, что другое программное обеспечение может быть загружено резидентным в верхнюю или нижнюю часть памяти? Ответ на каждый вопрос можно получить своим способом. Для PC и XT установка переключателей может быть просто прочитана через порт B микросхемы интерфейса с периферией 8255. В пункте
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|