Электронная библиотека книг Александра Фролова и Григория Фролова.
 
Библиотека
Братьев
Фроловых
Электронная библиотека книг Александра Фролова и Григория Фролова.
Библиотека системного программиста
Программирование на JAVA
ПК. Шаг за шагом
Другие книги
Восстановление данных
Антивирусная защита
Статьи для
программистов
Пользователю компьютера

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание] [Дальше]

1.1. Определение типа компьютера и версии BIOS

У вас есть две возможности определить модель компьютера и получить некоторую информацию о конфигурации - прочитать эту информацию из ячеек ПЗУ BIOS, или вызвать одну из функций прерывания INT 15h, возвращающую адрес таблицы конфигурации.

ПЗУ BIOS содержит по адресу FFFF:FFFE байт, значение которого можно использовать для идентификации типа компьютера:

FF оригинальный IBM PC;
FE XT, Portable PC;
FD PCjr;
FC AT;
FB XT с памятью 640 К на материнской плате;
FA PS/2 модель 25 или 30;
F9 Convertible PC;
F8 PS/2 модели 55SX, 70, 80;
9A Compaq XT, Compaq Plus;
30 Sperry PC;
2D Compaq PC, Compaq Deskpro

Для определения модели компьютера таким способом мы предлагаем следующую функцию:

/**
*.Name      pc_model
*
*.Title     Определить модель компьютера
*
*.Descr     Функция возвращает байт, идентифицирующий
*           модель персонального компьютера
*
*.Params    Нет
*
*.Return    Код модели персонального компьютера:
*
*       FF      оригинальный IBM PC;
*       FE      XT, Portable PC;
*       FD      PCjr;
*       FC      AT;
*       FB      XT с памятью 640 К на материнской плате;
*       FA      PS/2 модель 25 или 30;
*       F9      Convertible PC;
*       F8      PS/2 модели 55SX, 70, 80;
*       9A      Compaq XT, Compaq Plus;
*       30      Sperry PC;
*       2D      Compaq PC, Compaq Deskpro.
*
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

char unsigned pc_model(void) {

        char unsigned _far *modptr;

        modptr = FP_MAKE(0xf000,0xfffe);

        return *modptr;
}

Функция pc_model() возвращает байт, идентифицирующий код компьютера. В большинстве случаев вам достаточно проверить этот байт и сделать вывод о типе компьютера и составе его аппаратных средств.

Более подробную информацию можно получить, вызвав функцию C0h прерывания BIOS INT 15h:

На входе:       AH = C0h
        
На выходе:      ES:BX = адрес таблицы конфигурации,
                        таблица находится в ПЗУ BIOS;

        CF = 0 при успешном вызове прерывания;
        CF = 1 если данная версия BIOS не
                  поддерживает функцию C0h.

После выполнения прерывания регистры ES:BX будут указывать на таблицу в области ПЗУ BIOS. В этой таблице имеется более точная информация о типе компьютера, номер версии BIOS, сведения об аппаратных особенностях конкретной модели.

Приведем формат указанной таблицы:

Смещение        Описание
и размер


(+0) 2  размер таблицы в байтах

(+2) 1  код модели

(+3) 1  дополнительный код модели

(+4) 1  версия BIOS revision: 0 для первой
                        реализации; 2 для второй и т.д.

(+5) 1  байт конфигурации оборудования:

        бит 7 = канал 3 контроллера прямого доступа
                к памяти используется дисковой системой
                базового ввода-вывода (дисковой BIOS)

        бит 6 = установлен второй контроллер прерываний
                8259

        бит 5 = установлены часы реального времени

        бит 4 = каждый раз после вызова прерывания от
                клавиатуры INT 9h вызывается функция
                4Fh прерывания INT 15h

        бит 3 = BIOS поддерживает ожидание внешнего
                события

        бит 2 = используется расширенная область данных BIOS

        бит 1 = если этот бит установлен в 1, то
                используется шина Micro Channel,
                в противном случае - ISA

        бит 0 зарезервирован

(+6) 2  зарезервировано и равно 0
(+8) 2  зарезервировано и равно 0

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

Код      Доп.код        Версия BIOS     Тип компьютера
модели модели


FFh    *     *    04/24/81  оригинальная версия
                                        IBM PC

FFh    *     *    10/19/81  IBM PC, в этой версии
                        BIOS исправлены некоторые ошибки

FFh    *     *    10/27/82  IBM PC, используется
                        накопитель на магнитном диске
                        (НМД), оперативная память 640 К,
                        поддерживается адаптер дисплея EGA

FEh    *     *    08/16/82   IBM PC XT

FEh    *     *    11/08/82   IBM PC XT, Portable

FDh    *     *    06/01/83   PCjr

FCh    *     *    01/10/84   IBM AT, модели 068,
                        099, частота тактового генератора
                        6 MHz, емкость НМД - 20MB

FCh    00h         01h  06/10/85   IBM AT, модель 239,
                        частота тактового генератора
                        6 MHz, емкость НМД - 30MB

FCh    01h 00h  11/15/85   IBM AT, модели 319,
                        339, частота тактового генератора
                        8 MHz, используются расширенная
                        клавиатура, BIOS может работать с
                        накопителями на гибких магнитных
                        дисках формата 3,5 дюйма

FCh    01h         -                         Compaq 286/386

FCh    02h         00h     04/21/86    IBM PC XT-286

FCh    04h         00h     02/13/87    PS/2 модель 50

FCh    04h         03h     04/18/88    PS/2 модель 50Z

FCh    05h         00h     02/13/87    PS/2 модель 60

FCh    06h         -                         7552 "Gearbox"

FCh    09h         02h     06/28/89    PS/2 модель 30-286

FCh    81h         00h     01/15/88    Phoenix 386 BIOS,
                        версия 1.10

FBh    00h         01h     01/10/86    IBM PC XT, расширенная
                        клавиатура, BIOS может работать с
                        накопителями на гибких магнитных
                        дисках формата 3,5 дюйма

FBh    00h         02h     05/09/86    IBM PC XT

FAh    00h         00h     09/02/86    PS/2 модель 30

FAh    00h         01h     12/12/86    PS/2 модель 30

FAh    01h         00h  -           PS/2 модель 25

F9h    00h         00h     09/13/85    PC Convertible

F8h    00h         00h     03/30/87    PS/2 модель 80 16MHz

F8h    01h         00h     10/07/87    PS/2 модель 80 20MHz

F8h    04h         02h     04/11/88    PS/2 модель 70

F8h    04h         03h     03/17/89    PS/2 модель 70

F8h    09h         -       -           PS/2 модель 70

F8h    09h         02h     04/11/88    PS/2 модель 70

F8h    09h         03h     03/17/89    PS/2 модель 70

F8h    0Ch         00h     11/02/88    PS/2 модель 55SX

F8h    1Bh         00h     10/02/89    PS/2 модель 70-486

9Ah    *     *    -           Compaq XT или 
                                          Compaq Plus

30h    -   -       -           Sperry PC

2Dh    *     *    -           Compaq PC или
                                          Compaq Deskpro

Следует заметить, что функция C0h прерывания INT 15h поддерживается не всеми версиями BIOS, а только теми, которые были изготовлены после 10 января 1986 года. Если вы используете более старые версии BIOS, дополнительный код модели, версия BIOS и байт конфигурации вам недоступны.

Кроме того, BIOS изготовленный 10 января 1986 года и установленный в IBM XT возвращает неправильное значение байта конфигурации.

Символ "*" в таблице означает, что функция C0h прерывания INT 15h для данной версии BIOS не реализована. Все что вы можете сделать в этом случае для идентификации BIOS - получить байт кода модели по адресу F000h:FFFEh и дату изготовления BIOS, занимающую восемь байтов начиная с адреса F000h:FFF5h. Дата хранится в формате ASCII.

Приведем текст программы, которая поможет вам определить версию BIOS и дату ее изготовления, а также получить всю остальную информацию из таблицы конфигурации. Программа отображает также адрес этой таблицы.

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

void main(void);

void main(void) {

        union REGS  rg;
        struct SREGS srg;
        int   i;
        BIOSINFO far *biosinf_ptr;

                printf("\n*BIOSTEST* Информация о BIOS, "
                        "© Фролов А., 1991");

// Конструируем указатель на дату изготовления
// BIOS. Эта дата записана в ПЗУ по адресу F000h:FFF5h.

                biosinf_ptr = FP_MAKE(0xf000, 0xfff5);

// Выводим дату на экран

                printf("\n\nДата изготовления BIOS:     ");
                for(i=0; i<8; i++)
                        putch(*((char far *)biosinf_ptr + i));

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

                rg.h.ah = 0xc0;
                int86x(0x15, &rg, &rg, &srg);

// Если данная функция не поддерживается BIOS,
// читаем код модели компьютера из ПЗУ
// по адресу F000h:FFFEh.

                if(rg.x.cflag == 1) {
                        printf("\nФункция C0h прерывания INT 15h "
                                "данной версией BIOS не поддерживается\n");

// Конструируем указатель на код модели

                        biosinf_ptr = FP_MAKE(0xf000, 0xfffe);

// Выводим код модели компьютера на экран

                        printf("\nКод модели:             %02.2X",
                                (unsigned char)(*(char far *)biosinf_ptr));

                        exit(-1);
                }

// Конструируем укзатель на таблицу конфигурации

                biosinf_ptr = FP_MAKE(srg.es, rg.x.bx);

// Выводим на экран содержимое таблицы

                printf("\nАдрес таблицы конфигурации: %Fp"
                                 "\nРазмер таблицы в байтах:    %d"
                                 "\nКод модели:                 %02.2X"
                                 "\nДополнительный код модели:  %d"
                                 "\nВерсия BIOS:                %d"
                                 "\nКонфигурация оборудования:  %02.2X",
                                 biosinf_ptr,
                                 biosinf_ptr->size,
                                 biosinf_ptr->model,
                                 biosinf_ptr->submodel,
                                 biosinf_ptr->version,
                                 biosinf_ptr->hardcfg);

// Определяем конфигурацию компьютера

                printf("\n\nКонфигурация оборудования компьютера"
                                        "\n------------------------------------");

// Запоминаем байт конфигурации

                i = biosinf_ptr->hardcfg;

// Расшифровываем байт конфигурации

                if(i & 0x80)
                        printf("\nКанал 3 контроллера DMA используется"
                                                 " дисковой BIOS");

                if(i & 0x40)
                        printf("\nУстановлен второй контроллер"
                                                " прерываний 8259");

                if(i & 0x20)
                        printf("\nУстановлены часы реального времени");

                if(i & 0x10)
                        printf("\nПосле INT 9h вызывается функция 4Fh"
                                                " прерывания INT 15h");

                if(i & 0x8)
                        printf("\nBIOS поддерживает функцию ожидания"
                                                " внешнего события");

                if(i & 0x4)
                        printf("\nИспользуется расширенная"
                                                " область данных BIOS");

                if(i & 0x2)
                        printf("\nИспользуется шина Micro Channel");

                if(!(i & 0x2))
                        printf("\nИспользуется шина ISA");

                exit(0);
}

Мы запустили эту программу на компьютере Datamini 386 Tower, и вот что она показала на экране:

02/25/89
*BIOSTEST* Информация о BIOS, © Фролов А., 1991

Дата изготовления BIOS:     
Адрес таблицы конфигурации: F000:E6F5
Размер таблицы в байтах:    8
Код модели:                 FC
Дополнительный код модели:  1
Версия BIOS:                0
Конфигурация оборудования:  70

Конфигурация оборудования компьютера
------------------------------------
Установлен второй контроллер прерываний 8259
Установлены часы реального времени
После INT 9h вызывается функция 4Fh прерывания INT 15h
Используется шина ISA

Для изменения конфигурации компьютера (добавления новых устройств или удаления устаревших), может потребоваться изменение установки перемычек на материнской плате компьютера и/или на плате контроллера устанавливаемого устройства. Поэтому теперь мы расскажем об установке перемычек на материнской плате.

[Назад] [Содеожание] [Дальше]


Создание интернет-магазинов: http://www.shop2you.ru/ © Александр Фролов, Григорий Фролов, 1991-2016