Определение типа компьютера и версии BIOS
У вас есть две возможности определить модель компьютера и получить некоторую информацию о конфигурации - прочитать эту информацию из ячеек ПЗУ BIOS, или вызвать одну из функций прерывания INT15h, возвращающую адрес таблицы конфигурации.
ПЗУ 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
Для изменения конфигурации компьютера (добавления новых устройств или удаления устаревших), может потребоваться изменение установки перемычек на материнской плате компьютера и/или на плате контроллера устанавливаемого устройства. Поэтому теперь мы расскажем об установке перемычек на материнской плате.