Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.

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

Код модели компьютера и версия BIOS

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

Байт

Модель компьютера

PRIVATEFF

IBM PC

FE

IBM XT, Portable PC

FD

PCjr

FC

IBM PC/AT

FB

IBM XT с памятью 640 Кбайт на системной плате

FA

IBM PS/2 модель 25 или 30

F9

Convertible PC

F8

IBM PS/2 модели 55SX, 70, 80

9A

Compaq XT, Compaq Plus

30

Sperry PC

2D

Compaq PC

Более подробную информацию можно получить, вызвав функцию 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

5

1

Байт конфигурации аппаратных средств

6

2

Зарезервировано и равно 0

8

2

Зарезервировано и равно 0

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

Номер бита

Описание

0

Зарезервирован

1

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

2

Применяется расширенная область данных BIOS

3

В BIOS реализована функция ожидания внешнего события

4

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

5

Установлены часы реального времени

6

Установлен второй контроллер прерываний 8259

7

Канал DMA номер 3 используется BIOS для работы с диском

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

Код модели

Доп. код модели

Модификация версии BIOS

Тип компьютера

FFh

-

-

Оригинальная версия IBM PC

FEh

-

-

IBM PC/XT

FDh

-

-

PCjr

FCh

00h

01h

IBM PC/AT, модель 239

FCh

01h

00h

IBM PC/AT

FCh

02h

00h

IBM PC/XT-286

FCh

04h

00h

IBM PS/2 модель 50

FCh

05h

00h

IBM PS/2 модель 60

FBh

00h

01h

IBM PC/XT

FBh

00h

02h

IBM PC/XT

FAh

00h

00h

IBM PS/2 модель 30

FAh

00h

01h

IBM PS/2 модель 30

FAh

01h

00h

IBM PS/2 модель 25

F9h

00h

00h

PC Convertible

F8h

00h

00h

IBM PS/2 модель 80 с тактовой частотой 16 Мгц

F8h

01h

00h

IBM PS/2 модель 80 с тактовой частотой 20 Мгц

F8h

04h

02h, 03h

IBM PS/2 модель 70

F8h

09h

02h, 03h

IBM PS/2 модель 70

F8h

0Ch

00h

IBM PS/2 модель 55 SX

F8h

1Bhh

00h

IBM PS/2 модель 70-486

9Ah

-

-

Compaq XT или Compaq Plus

30h

-

-

Sperry PC

2Dh

-

-

Compaq PC или Compaq Deskpro

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

Большинство современных так называемых IBM-совместимых персональных компьютеров имеют код модели FCh, а дополнительный код модели 01h. Такие значения, например, записаны в таблице конфигурации компьютера Compaq Deskpro 6000 с процессором Pentium Pro 200.

Программа BIOSINFO

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


BIOSINFO (C)A. Frolov, 1997

BIOS data:        04/18/97
BIOSINFO address: 0212:0190
BIOSINFO Size:    8
Model:            FC
SubModel:         1
BIOS Revision:    0
Hardvare Cfg:     70
Reserved1:        00
Reserved2:        00

Hardware configuration
----------------------
Second IRQ Controller 8259
Real Time Clock
Used function 4Fh INT 15h
ISA Bus installed

Исходный текст программы представлен в листинге 1.2.

Листинг 1.2. Файл biosinfo\biosinfo.c

// ===================================================== // Получение информации о BIOS // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или// http://www.dials.ccas.ru/frolov // ===================================================== #include <stdio.h> #include <conio.h> #include <dos.h> // Структура области данных с информацией о BIOS typedef struct _BIOSINFO { int nSize; // размер структуры unsigned char bModel; // код модели компьютера unsigned char bSubModel; // дополнительный код модели unsigned char bBIOSRevision; // номер изменений // версии BIOS unsigned char bHardwareCfg; // конфигурация аппаратуры int reserved1; // зарезервировано int reserved2; // зарезервировано } BIOSINFO; int main(void) { union REGS rg; struct SREGS srg; int i; BIOSINFO far *lpbi; void far* lp; unsigned char bHdwCfg; printf("\nBIOSINFO (C)A. Frolov, 1997"); // Конструируем указатель на дату изготовления // BIOS. Эта дата записана в ПЗУ по адресу F000h:FFF5h _FP_SEG(lp) = 0xf000; _FP_OFF(lp) = 0xfff5; // Выводим дату на экран printf("\n\nBIOS data: "); for(i=0; i<8; i++) putch(*((char far *)lp + i)); // Вызываем функцию C0h для получения адреса // таблицы конфигурации компьютера. rg.h.ah = 0xc0; int86x(0x15, &rg, &rg, &srg); // Если в BIOS нет данной функции, // читаем код модели компьютера // из ПЗУ по адресу F000h:FFFEh if(rg.x.cflag == 1) { printf("\nFunction C0h INT 15h not supported\n"); // Конструируем указатель на код модели _FP_SEG(lp) = 0xf000; _FP_OFF(lp) = 0xfffe; // Выводим код модели компьютера на экран printf("\nModel: %02.2X", (unsigned char)(*(char far *)lp)); return(-1); } // Конструируем укзатель на таблицу // информации о BIOS _FP_SEG(lpbi) = srg.es; _FP_OFF(lpbi) = rg.x.bx; // Выводим на экран содержимое таблицы printf("\nBIOSINFO address: %Fp" "\nBIOSINFO Size: %d" "\nModel: %02.2X" "\nSubModel: %d" "\nBIOS Revision: %d" "\nHardvare Cfg: %02.2X" "\nReserved1: %02.2X" "\nReserved2: %02.2X", lpbi, lpbi->nSize, lpbi->bModel, lpbi->bSubModel, lpbi->bBIOSRevision, lpbi->bHardwareCfg, lpbi->reserved1, lpbi->reserved2); // Определяем конфигурацию компьютера printf("\n\nHardware configuration" "\n----------------------"); // Запоминаем байт конфигурации bHdwCfg = lpbi->bHardwareCfg; // Расшифровываем байт конфигурации if(bHdwCfg & 0x80) printf("\nDMA Channel 3"); if(bHdwCfg & 0x40) printf("\nSecond IRQ Controller 8259"); if(bHdwCfg & 0x20) printf("\nReal Time Clock"); if(bHdwCfg & 0x10) printf("\nUsed function 4Fh INT 15h"); if(bHdwCfg & 0x8) printf("\nBIOS event wait supported"); if(bHdwCfg & 0x4) printf("\nExtended BIOS data used"); if(bHdwCfg & 0x2) printf("\nMicro Channel Bus"); if(!(bHdwCfg & 0x2)) printf("\nISA Bus installed\n"); getch(); return 0; }
[Назад] [Содеожание] [Дальше]