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




ре 14H микросхемы конфигурации. Сначала запишите 14H в порт с адресом 70H, а затем прочитайте содержимое регистра через порт 71H. Вот значение битов этого регистра:

      биты 7-6 00 = 1 НГМД, 01 = 2 НГМД
      5-4 01 = вывод на цветной дисплей, 40 строк
      10 = вывод на цветной дисплей, 80 строк
      11 = вывод на монохромный дисплей
      3-2 не используется
      1 1 = имеется мат. сопроцессор
      0 0 = нет НГМД, 1 = имеется НГМД

      Высокий уровень.

      В Бейсике нужно просто прочитать байты статуса из области данных BIOS. В приложении Б объяснено выполнение битовых операций в Бейсике. В приведенном примере проверка наличия дисковых нако- пителей достигается проверкой четности младшего байта статусного регистра (четный - нет накопителей).

100 DEF SEG = 0 'указывыаем на дно памяти 110 X = PEEK(&H410) 'получаем младший байт регистра 120 IF X MOD 2 = 0 THEN 140 'он четный - нет накопителей 130 PRINT "Имеется диск" 'иначе имеется накопитель 140 GOTO 160 'идем ко второму сообщению 150 PRINT "Нет накопителей" 'второе сообщение 160 ... 'продолжаем...

      Проверка наличия COM1:
100 DEF SEG = 40H 'указываем на область данных BIOS 110 PORT = PEEK(0) + 256*PEEK(1) 'получаем слово со смещением 0 120 IF PORT = 0 THEN... '... то нет адаптера COM1

      Средний уровень.

      Прерывание 11H BIOS возвращает байт статуса оборудования в AX. На входе ничего подавать не надо. В примере определяется число дисковых накопителей.
; ---получение числа дисковых накопителей:
      INT 11H ;получаем байт статуса
      TEST AL,0 ;имеются накопители?
      JZ NO_DRIVES ;переход, если нет
      AND AL,1100000B ;выделяем биты 5-6
      MOV CL,5 ;подготовка к сдвигу регистра
      SHR AL,CL ;сдвиг вправо на 5 битов
      INC AL ;добавляем 1, т.к. отсчет идет с 1

      Низкий уровень.

      Ассемблерная программа работает так же, как и программа на Бейсике. В примере читается информация о конфигурации для 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. В пункте [1.1.1] описано как это делается. BIOS хранит двухбайтную переменную по адресу 0040:0013, которая сообщает число килобайт используемой памяти. Для PCjr бит 3 порта 62H (порт C микросхемы 8255) равен нулю, когда машина имеет добавочные 64K памяти. AT дает особо полную информацию о памяти. Регистры 15H (младший) и 16H (стар- ший) микросхемы информации о конфигурации говорят сколько памяти установлено на системной плате (возможны три значения: 0100H - для 256K, 0200H - для 512K и 0280H для 512K плюс 128K на плате расширения). Память канала ввода/вывода для AT сообщается регист- рами 17H и 18H (с инкрементом 512K). Память сверх 1 мегабайта доступна через регистры 30H и 31H (опять с инкрементом 512K, вплоть до 15 мегабайт). Если AT имеет 128K на плате расширения, то установлен бит 7 регистра 33. Во всех случаях надо сначала послать номер регистра в порт 70H, а затем прочитать значение из порта 71H.
      Легко написать программу, которая прямо тестирует наличие памяти через определенные интервалы адресного пространства. Пос- кольку минимальная порция памяти 16 килобайт, то достаточно про- верить одну ячейку памяти в каждом 16-килобайтном сегменте, чтобы убедиться, что все 16K присутствуют. Когда данная ячейка памяти отсутствует, то при чтении из нее получаем значение 233. Для проверки можно записать в ячейку произвольное число, отличное от 233 и сразу же считать его. Если вместо посланного числа возвра- щается 233, то соответствующий банк памяти отсутствует. Не приме- няйте этот способ на AT, где при попытке писать в несуществующую память вступает в действие встроенная обработка несуществующей памяти. Диагностика AT настолько хороша, что Вы можете целиком положиться на системную информацию о конфигурации.
      Память постоянно занимается частями операционной системы, драйверами устройств, резидентными программами обработки прерыва- ний и управляющими блоками MS DOS. При проверке банков памяти Вы не должны вносить необратимых изменений в содержимое памяти. Сначала надо сохранить значение, хранящееся в тестируемой ячейке, затем проверить ее и восстановить первоначальное значение.
      Имеется еще одна проблема. Если Ваша процедура хотя бы времен- но модифицирует свой код, то это может привести к краху. Поэтому для проверки надо выбирать такую ячейку из блока 64K, которая не будет занята текстом Вашей процедуры. Для этого поместите проце- дуру тестирования впереди программы, а для тестирования выберите

ячейку со смещением равным смещению для кодового сегмента. Напри- мер, если регистр кодового сегмента содержит 13E2, то сегмент начинается со смещения 13E2 во втором 64K-байтном блоке памяти. Поскольку Ваша подпрограмма проверки