Таблицы параметров НМД и НГМД




ЗНАЕТЕ ЛИ ВЫ?

Таблицы параметров НМД и НГМД



 

Для работы с диском на физическом уровне необходимо знать такие его характеристики, как количество головок, секторов и др. Эти характеристики можно определить из таблиц параметров НГМД и НМД, заполняемых BIOS в процессе инициализации системы.

 

Анализируя содержимое CMOS-памяти в компьютерах IBM PC/AT или установку переключателей конфигурации на основной плате в компьютерах IBM PC и IBM PC/XT, BIOS в процессе инициализации создает таблицу параметров дискеты DPT (Diskette Parameter Table ), а также одну или две таблицы параметров жесткого диска HDPT (Hard Disk Parameter Table). Если имеется специальная "дисковая" система ввода/вывода, то она сама создает таблицы HDPT.

 

Таблица параметров дискеты DPT имеет длину 10 байт, ее адрес располагается в области данных BIOS по адресу 0000h:0078h, что соответствует вектору прерывания INT 1Eh. Таблица содержит следующие параметры:

(слайд №26)

 

Смещение, байт Размер, байт Имя поля Описание
srt_hut Биты 0...3:SRT (Step Rate Time) - задержка для переключения головок, лежит в пределах 1 - 16 мс и задается с интервалом 1 мс (0Fh - 1 мс, 0Eh - 2 мс, 0Dh - 3 мс, ...).Биты 4...7:Задержка разгрузки головки , лежит в пределах 16 - 240 мс и задается с интервалом 16 мс (1 - 16 мс, 2 - 32 мс, ..., 0Fh - 240 mc)
dma_hlt Бит 0:Значение этого бита, равное 1, говорит о том, что используется прямой доступ к памяти; Биты 2...7: Время загрузки головок HLT - интервал между сигналом загрузки головок и началом операции чтения или записи, лежит в пределах 2 - 254 мс и задается с интервалом 2 мс (1 - 2 мс, 2 - 4 мс, ..., 0FFh - 254 мс)
motor_w Задержка перед выключением двигателя
sec_size Код размера сектора в байтах:0 - 128;1 - 256;2 - 512;3 - 1024
eot Номер последнего сектора на дорожке
gap_rw Длина межсекторного промежутка для чтения или записи
dtl Максимальная длина передаваемых данных. Используется, когда не задана длина сектора
gap_f Длина межсекторного промежутка для операции форматирования
fill_char Байт-заполнитель для форматирования, обычно используется F6h
hst Время установки головки в мс
mot_start Время запуска двигателя в 1/8 долях секунды

Все времена зависят от частоты тактового генератора контроллера НГМД, приведенные значения соответствуют частоте 8 МГц.

 

Адреса таблиц параметров жестких дисков HDPT расположены по адресам, соответствующим векторам прерываний INT 41h (для первого физического диска) и INT 46h (для второго физического диска). Эти таблицы имеют следующий формат:

(слайд №27)

 

Смещение, байт Размер, байт Имя поля Описание
max_cyl Максимальное количество дорожек на диске
max_head Максимальное количество магнитных головок
srwcc Начальная дорожка для предварительной записи (Starting reduced-write current cylinder)
swpc Начальная дорожка для предварительной компенсации при записи (Starting write precompensation cylinder)
max_ecc Максимальная длина блока коррекции ошибок ECC (Maximum ECC data burst length)
dstopt Параметры устройства: бит 7 - запрет восстановления; бит 6 - запрет восстановления по блоку коррекции ошибок ECC (Error Correction Code); биты 2-0 - дополнительные параметры устройства
st_del Стандартная величина задержки
fm_del Величина задержки для форматирования диска
chk_del Величина задержки для проверки диска
reserve Зарезервировано

 

Наиболее полезная информация, которую можно извлечь из таблицы параметров дискеты - это код размера сектора. Если вам когда-либо придется работать с нестандартным размером сектора (отличным от 512 байт), вам не обойтись без этой таблицы.

 

Таблица параметров жесткого диска содержит такие важнейшие значения, как максимальное количество дорожек и максимальное количество головок. Если вам не удалось определить тип диска, то таблица HDPT - единственное надежное место, откуда можно получить информацию о количестве дорожек и головок.

 

H - конфигурация оборудования

Для варианта №11, Лабораторной работы №2 –Определить и и выести на экран список оборудования (BIOS 11h).

(слайд №28)

 

В этом байте находится информация о количестве установленных НГМД, о наличии арифметического сопроцессора, а также о типе видеоадаптера, подключенного к системе. Приведем формат байта конфигурации:

 

Бит Описание
1 - в системе установлены НГМД; 0 - НГМД не используются
1 - установлен арифметический сопроцессор; 0 - арифметический сопроцессор не установлен
2-3 не используются, равны 0
4-5 Тип видеоадаптера и видеорежим: 00 - не используется или EGA; 01 - CGA, EGA, VGA в режиме 40x25; 10 - CGA, EGA, VGA в режиме 80x25; 11 – монохромный видеоадаптер
6-7 Количество установленных НГМД, уменьшенное на единицу; 00 – один НГМД; 01 – два НГМД; 10 – три НГМД; 11 – четыре НГМД

Кроме этого, в ячейках CMOS-памяти содержится и информация об оперативно памяти: основной и расширенной (Для варианта №2, Лабораторной работы №2 - Определить объем установленной оперативной памяти и ее тип.)

(слайд №29)

 

Номера ячеек Назначение Описание
15h - 16h Объем основной памяти Ячейка 15h содержит младший байт, а ячейка 16h - старший байт объема основной памяти. Например: 0100h - 256K 0200h - 512K 0280h - 640K
17h - 18h Объем расширенной (extended) памяти Ячейки 17h и 18h содержат, соответственно, младший и старший байты размера дополнительной памяти (расположенной выше границы 1 М) в килобайтах.
30h - 31h Объем расширенной (extended) памяти Ячейки 30h и 31h содержат, соответственно, младший и старший байты размера дополнительной памяти (расположенной выше границы 1 М) в килобайтах. Эта информация дублирует аналогичную информацию, расположенную в ячейках с адресами 17h-18h.

 

Пример:

(слайд №30)

 

// =====================================================

// Чтение и отображение ячеек памяти CMOS

// =====================================================

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int main()

{

unsigned char cmos[64];

int i;

unsigned long nExtRam;

// Читаем 64 ячейки CMOS-памяти в массив cmos

for(i=0; i<64; i++)

{

outp(0x70,i);

cmos[i]=inp(0x71);

}

// Отображаем ячейки часов реального времени

printf("\nRTC: ");

for(i=0; i<0xd; i++)

{

printf("%02.2x ",(unsigned)cmos[i]);

}

// Отображаем состояние байта диагностики после включения питания

printf("\nDiagnostics byte: %02.2x",cmos[0xe]);

// Отображаем содержимое байта отключения

printf("\nShutdown byte: %02.2x\n",cmos[0xf]);

// Отображаем содержимое зарезервированных ячеек

printf("Reserved: ");

for(i=0x34; i<0x40; i++)

{

printf("%02.2x ",(unsigned)cmos[i]);

}

// Вычисляем объем расширенной памяти и отображаем его на консоли

nExtRam = ((unsigned long)cmos[0x18] << 8) + cmos[0x17];

printf("\nExtended RAM: %ld Kbyte\n", nExtRam);

getch();

return 0;

}

 

Int 14h - Управление стыком RS-232C

Для варианта №13, Лабораторной работы №2 – Определить статус последовательного порта связи (BIOS 14h).

(слайд №31)

 

Для управления последовательным интерфейсом (стыком RS-232C) имеются следующие функции:

 

Функция Назначение Примечания
00h Инициализация порта Поддерживаются BIOS всех ПЭВМ
01h Вывод одного символа в порт
02h Ввод одного символа из порта
03h Опрос состояния порта
04h Расширенная инициализация порта (PS/2) Поддерживаются только ПЭВМ семейства PS/2
05h Расширенное управление портом (PS/2)

 

Примечания.

Номер стыка в описанных ниже функциях задается так:

COM1,

COM2 и т. д.

При этом в PS/2 он может варьироваться от 0 до 3, в остальных ПЭВМ - от 0 до 1. Базовый адрес порта для стыка извлекается из области данных по адресу 00400h.

 

Рассмотрим некоторые функции данного прерывания более подробно:

 

INT 14h AH = 03 — Получить текущее состояние порта

 

Ввод: АН = 03h DX = номер порта (00h – 03h)
Вывод: АН = состояние линии AL = состояние модема

 


INT 14h АН = 00 — Инициализация последовательного порта

(слайд №32)

 

Ввод: АН = 00h AL = параметры инициализации: биты 7 – 5: 000 — 19 200 бод (110 бод без FOSSIL) 001 — 38 400 бод (150 бод без FOSSIL) 010 — 300 бод 011 — 600 бод 100 — 1200 бод 101 — 2400 бод 110 — 4800 бод 111 — 9600 бод биты 4 – 3: четность (01 — четная, 11 — нечетная, 00 или 10 — нет) бит 2: число стоп-бит (0 — один, 1 — два) биты 1 – 0: длина слова (00 — 5, 01 — 6, 10 — 7, 11 — 8) DX = номер порта (00h – 03h)
Вывод: АН = состояние порта бит 7: тайм-аут бит 6: буфер вывода пуст (без FOSSIL: регистр сдвига передатчика пуст) бит 5: в буфере вывода есть место (без FOSSIL: регистр хранения передатчика пуст) бит 4: обнаружено состояние BREAK бит 3: ошибка синхронизации бит 2: ошибка четности бит 1: ошибка переполнения — данные потеряны бит 0: в буфере ввода есть данные AL = состояние модема бит 7: обнаружена несущая (состояние линии DCD) бит 6: обнаружен звонок (состояние линии RI) бит 5: запрос для передачи (состояние линии DSR) бит 4: сброс для передачи (состояние линии CTS) бит 3: линия DCD изменила состояние бит 2: линия RI изменила состояние бит 1: линия DSR изменила состояние бит 0: линия CTS изменила состояние

 

Более того информацию о портах можно извлечь и из области данных BIOS (Data Area BIOS).

 


Как говорилось ранее, после зоны векторов прерываний идет область, называемая BIOS Data Area, где размещаются данные, полученные в ходе тестирования оборудования, буфера системных устройств, например буфер клавиатуры, и различные служебные регистры. Эта область данных имеет размер не менее 256 байтов и начинается с адреса 0000:0400h или 0040:0000h. Назначение наиболее интересных для пользователя зон в области BIOS Data Area следующее:

(слайд №33)

 

Адрес Размер, байт Назначение
040:000 4x2 Базовые адреса портов СОМ 1— COM4 Для варианта №4, Лабораторной работы №2 – Определить количество установленных параллельных и последовательных портов.
040:008 3x2 Базовые адреса портов LPT1— LPT3 Для варианта №4, Лабораторной работы №2 – Определить количество установленных параллельных и последовательных портов
040:010 040:017 2 39 Установленное оборудование Для варианта №11, Лабораторной работы №2 – Определить и вывести на экран список оборудования (BIOS 11h). Область флагов и буфер клавиатуры
040:049 Текущий видеорежим Для варианта №12, Лабораторной работы №2 – Определить режим видеоадаптера (текстовый, графический, разрешение) (BIOS 10h).
040:04А Ширина экрана (число колонок символов)
040:050 Позиция курсора (младшая половина — колонка, старшая — ряд)
040:060 Размер курсора (в младшем байте — последняя строка, в старшем — первая)
040:067 Область данных POST

Лекция №7.

Int 15h - Системные утилиты

Для варианта №5, Лабораторной работы №2 – Определить модель компьютера (BIOS 15h) и версию BIOS.

(слайд №34)

 

Это прерывание объединяет большую группу функций, не связанных с каким-либо конкретным внешним устройством, а именно:

 

Функция Назначение
00h Включить мотор кассетного магнитофона (PC, PCjr)
01h Выключить мотор кассетного магнитофона (PC, PCjr)
02h Чтение с кассетного магнитофона (PC, PCjr)
03h Запись на кассетный магнитофон (PC, PCjr)
0Fh Ловушка форматирования дисков (PS/2)
21h Регистрация ошибок POST (PS/2) Для варианта №7, Лабораторной работы №2 – Определить состояние байта диагностики из области CMOS (0Eh) и написать программу, анализирующую возможные неисправности в системе.
40h Операции с профилем системы (Convertible)
41h Ожидание внешнего события (Convertible)
42h Отключение ПЭВМ (Convertible)
43h Чтение состояния системы (Convertible)
44h Управление встроенным модемом (Convertible)
4Fh Ловушка клавиатуры (многие)
80h Открыть устройство (многие)
81h Закрыть устройство (многие)
82h Освободить устройство (многие)
83h Ожидание события (многие)
84h Работа с джойстиком (многие)
85h Обработка SysReq (многие)
86h Задержка (AT, XT-286, PS/2)
87h Обмен с расширенной памятью (AT, XT-286, PS/2)
88h Получить размер расширенной памяти (AT, XT-286, PS/2) Для варианта №2, Лабораторной работы №2 – Определить объем установленной оперативной памяти и ее тип.
89h Переключение в защищенный режим (AT, XT-286, PS/2)
90h Устройство занято (многие)
91h Прерывание завершено (многие)
C0h Получить конфигурацию системы (многие) Для варианта №5, Лабораторной работы №2 – Определить модель компьютера (BIOS 15h) и версию BIOS.
C1h Взять адрес дополнительной области данных BIOS (PS/2)
C2h Управление мышью (PS/2) Для варианта №3, Лабораторной работы №2 – Определить наличие и типу установленного манипулятора «мышь» и написать программу для считывания данных с этого устройства, например, сообщать пользователю о наличии данных, поступающих с мышки.
C3h Управление сторожем (PS/2)
C4h Выбор программируемых опций (PS/2)

 

Примечания:

Функции 01h - 04h предназначены для работы с кассетным магнитофоном, которым комплектовались первые PC и PCjr и сегодня представляют чисто исторический интерес.

Функция 0Fh - это специфическая функция, которая поддерживается только контроллером жестких дисков IBM ESDI Adapter/A.

Функции 40h - 44h поддерживаются только в PC Convertible.

Функции 86h - 89h реализованы в ПЭВМ на базе процессоров 80286 и 80386, функции 21h и C1h - C4h только в PS/2.

 

Определение типа компьютера и версии BIOS.

 

Существует две возможности определить модель компьютера и получить некоторую информацию о конфигурации:

  1. прочитать эту информацию из ячеек ПЗУ BIOS,
  2. вызвать одну из функций прерывания INT 15h, возвращающую адрес таблицы конфигурации.

 


ПЗУ BIOS содержит по адресу FFFF:FFFE байт, значение которого можно использовать для идентификации типа компьютера:

(слайд №35)

 

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;
Sperry PC;
2D Compaq PC, Compaq Deskpro

 

Для определения модели компьютера таким способом можно использовать следующую функцию:

(слайд №36)

 

#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, сведения об аппаратных особенностях конкретной модели.

 


Приведем формат указанной таблицы:

(слайд №38)

 

Смещение и размер Описание
(+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 для некоторых широко распространенных типов компьютеров:

(слайд №39)

 

Код модели Доп.код модели Версия 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. Все что можно сделать в этом случае для идентификации BIOS - получить байт кода модели по адресу F000h:FFFEh и дату изготовления BIOS, занимающую восемь байтов начиная с адреса F000h:FFF5h. Дата хранится в формате ASCII.

 

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

(слайд №40-41)

 

#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;

}

 





Последнее изменение этой страницы: 2016-04-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.239.236.140 (0.064 с.)