Аппаратное обеспечение
персонального компьютера
© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.
На этапе инициализации 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;
}
|