Код модели компьютера и версия BIOS
На этапе инициализации BIOS записывает в свою область данных по адресу FFFFh:FFFEh байт идентификатора модели компьютера. Ниже мы привели возможные значения этого байта:
Байт
|
Модель компьютера
|
FF
|
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
#include
#include
// Структура области данных с информацией о 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;
}
|