Int 15h - Системные утилиты. Для варианта №5, Лабораторной работы №2 – Определить модель компьютера (BIOS 15h) и версию BIOS.
Int 15h - Системные утилиты Для варианта №5, Лабораторной работы №2 – Определить модель компьютера (BIOS 15h) и версию BIOS.
Это прерывание объединяет большую группу функций, не связанных с каким-либо конкретным внешним устройством, а именно:
Примечания: Функции 01h - 04h предназначены для работы с кассетным магнитофоном, которым комплектовались первые PC и PCjr и сегодня представляют чисто исторический интерес. Функция 0Fh - это специфическая функция, которая поддерживается только контроллером жестких дисков IBM ESDI Adapter/A. Функции 40h - 44h поддерживаются только в PC Convertible. Функции 86h - 89h реализованы в ПЭВМ на базе процессоров 80286 и 80386, функции 21h и C1h - C4h только в PS/2.
Определение типа компьютера и версии BIOS.
Существует две возможности определить модель компьютера и получить некоторую информацию о конфигурации:
ПЗУ BIOS содержит по адресу FFFF: FFFE байт, значение которого можно использовать для идентификации типа компьютера:
Для определения модели компьютера таким способом можно использовать следующую функцию:
#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: (слайд №37)
На входе: AH = C0h На выходе: ES: BX = адрес таблицы конфигурации, таблица находится в ПЗУ BIOS; CF = 0 при успешном вызове прерывания; CF = 1 если данная версия BIOS не поддерживает функцию C0h.
После выполнения прерывания регистры ES: BX будут указывать на таблицу в области ПЗУ BIOS. В этой таблице имеется более точная информация о типе компьютера, номер версии BIOS, сведения об аппаратных особенностях конкретной модели.
Приведем формат указанной таблицы:
В следующей таблице приведены коды моделей, дополнительные коды моделей и версии BIOS для некоторых широко распространенных типов компьютеров:
Следует заметить, что функция 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; // Конструируем указатель на дату изготовления 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); }
Рассмотрим еще один пример определения типа BIOS:
// ===================================================== // Получение информации о BIOS // ===================================================== #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; // Конструируем указатель на дату изготовления 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; }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|