Определение конфигурации компьютера программными средствами

Содержание

Слайд 2

Доступ к BIOS. Прерывания INT 10h – 11Ah – процедуры BIOS.

Доступ к BIOS.

Прерывания INT 10h – 11Ah – процедуры BIOS.
Пример 1:
MOV AH,

1 ; Функция 1 - установка времени
MOV CX, HIGH_COUNT ; CX:DX = новое значение времени MOV ; DX,LOW_COUNT
INT 1AH ; Точка входа в BIOS, обслуживающая ; запросы к таймеру
Пример 2:
MOV AH,0 ; Функция 0 - чтение времени
INT 1AH ; Запрос к BIOS. Результат будет возвращен в регистрах ; CX и DX.
Слайд 3

Области данных BIOS. Начинается с адреса 0000:0410 Функции BIOS. Int 10h

Области данных BIOS.

Начинается с адреса 0000:0410
Функции BIOS.
Int 10h - Управление экраном:
00h Задание

видеорежима
01h Задание формы курсора
02h Задание позиции курсора
03h Чтение позиции и формы курсора
04h Чтение позиции светового пера
05h Задание активной страницы дисплея
06h Прокрутка окна вверх
07h Прокрутка окна вниз
08h Чтение атрибута и символа в текущей позиции курсора
09h Вывод атрибута и символа в текущую позицию курсора
0Ah Вывод символа в текущую позицию курсора
0Bh Задание цветовой палитры
0Ch Вывод пикселя на экран
0Dh Чтение пикселя
0Eh Вывод символов в режиме телетайпа
0Fh Чтение текущего состояния дисплея
10h Установка регистров палитр (PCjr, EGA, VGA, MCGA)
11h Управление знакогенератором (EGA, VGA, MCGA)
12h Выбор альтернативы (EGA, VGA, MCGA)
13h Вывод строки на экран (многие ПЭВМ)
14h Управление плазменным дисплеем (Convertible)
15h Чтение параметров активного дисплея (Convertible)
1Ah Чтение/вывод кода комбинации дисплеев (PS/2)
1Bh Чтение функциональной информации (PS/2)
1Ch Сохранение/восстановление состояния дисплея (VGA)
Слайд 4

Выбор режима работы - функция 00h INT 10h Пример: mov ah,

Выбор режима работы - функция 00h INT 10h

Пример:
mov ah, 0
mov al, 3 ;

Выбираем режим номер 3 (16 цветной, текстовый,
int 10h ; разрешение 25х80 символов)
Информацию о видеоадаптерах и его режимах можно найти, например:
«Библиотека системного программиста» - Александр Фролов, Григорий Фролов Том 21, Программирование видеоадаптеров, М.: Диалог-МИФИ, 1995, 271 стр.
http://www.codenet.ru/cat/Applications/Graphics/VGA-VESA-Standarts/
http://www.codenet.ru/progr/video/vbe-svga.php
и т.д.
Слайд 5

Определение текущего режима работы видеоадаптера - функция 0Fh Список стандартных режимов работы видеоадаптеров

Определение текущего режима работы видеоадаптера - функция 0Fh

Список стандартных режимов работы

видеоадаптеров
Слайд 6

Список режимов работы видеоадаптеров, соответствующих стандарту VESA

Список режимов работы видеоадаптеров, соответствующих стандарту VESA

Слайд 7

Int 11h - Конфигурация оборудования Вход: нет Выход: AX = конфигурация

Int 11h - Конфигурация оборудования

Вход: нет
Выход: AX = конфигурация оборудования
Описание:
Возвращает в

AX конфигурацию оборудования ПЭВМ.
Это слово хранится в области данных BIOS по адресу  00410h.
Слайд 8

Слайд 9

// ===================================================== // Получение информации о конфигурации компьютера при помощи BIOS

// =====================================================
// Получение информации о конфигурации компьютера при помощи BIOS
// =====================================================
#include


#include
#include
#include
// Битовые поля слова конфигурации
typedef struct _HDWCFG
{
unsigned HddPresent: 1; // 0
unsigned NpuPresent: 1; // 1
unsigned AmountOfRAM: 2; // 2-3
unsigned VideoMode: 2; // 4-5
unsigned NumberOfFdd: 2; // 6-7
unsigned DmaPresent: 1; // 8
unsigned NumberOfCom: 3; // 9-11
unsigned GamePresent: 1; // 12
unsigned JrComPresent: 1; // 13
unsigned NumberOfLpt: 2; // 14-15
} HDWCFG;
int main(void)
{
union REGS rg;
HDWCFG HdwCfg;
unsigned uword;
// Вызываем прерывание INT 11h для получения слова конфигурации компьютера
rg.h.ah = 0x0;
int86(0x11, &rg, &rg);
// Получаем слово конфигурации и сохраняем его в структуре HdwCfg
uword = (unsigned int)rg.x.ax;
memcpy(&HdwCfg, &uword, 2);
Слайд 10

// Выводим на экран конфигурацию компьютера printf("\n\nConfiguration word: %04.4X", HdwCfg); if(HdwCfg.HddPresent)

// Выводим на экран конфигурацию компьютера printf("\n\nConfiguration word: %04.4X", HdwCfg);
if(HdwCfg.HddPresent)
printf("\nHDD present");
if(HdwCfg.NpuPresent)
printf("\nNPU

present");
printf("\nRAM banks: %d", HdwCfg.AmountOfRAM);
printf("\nVideo Mode: %d", HdwCfg.VideoMode);
printf("\nNubber of FDD: %d", HdwCfg.NumberOfFdd + 1);
if(HdwCfg.DmaPresent)
printf("\nDMA present");
printf("\nNubber of COM ports: %d", HdwCfg.NumberOfCom);
if(HdwCfg.GamePresent)
printf("\nGame adapter present");
if(HdwCfg.JrComPresent)
printf("\nPCjr Com present");
printf("\nNumber of LPT ports: %d", HdwCfg.NumberOfLpt);
// Вызываем прерывание INT 12h для определения объема основной оперативной памяти компьютера
rg.h.ah = 0x0;
int86(0x12, &rg, &rg);
// Выводим объем оперативной памяти
printf("\nRAM istalled: %d Kbytes",
(unsigned int)rg.x.ax);
// Получаем объем расширенной оперативной памяти,
// доступной через прерывание INT 15h
rg.h.ah = 0x88;
int86(0x15, &rg, &rg);
// Выводим объем расширенной оперативной памяти
printf("\nExtended RAM istalled: %ld Kbytes",
(unsigned int)rg.x.ax);
getch();
return 0;
}
Слайд 11

Int 12h - Размер ОЗУ Вход: нет Выход: AX=размер ОЗУ в

Int 12h - Размер ОЗУ

Вход: нет
Выход: AX=размер ОЗУ в килобайтах
Описание:
Возвращает в

AX размер оперативной памяти в Кб  (не более 640), определенный в процессе POST анализом DIP-переключателей на PC/XT или содержимого CMOS на AT и PS/2.
Это слово хранится в области данных BIOS по адресу  00413h.
Для определения размера расширенной памяти – Int 15h, функцию 88h – Получить размер расширенной памяти (AT, XT-286, PS/2).
Выход: AX = число непрерывных 1K блоков сверх 1M (1024K)
Для определения размера дополнительной памяти – Int 67h, функцию 42h.
Дополнительная память (EMS) начинается с адреса 0D000h.
Вызывать функции EMS можно, только есть драйвер ЕММХХХХ0.
Для проверки ее существования можно, например, вызвать функцию 3Dh.
INT 67h, АН = 42h — Получить объем памяти.
Слайд 12

Int 13h - Управление дисками Функции прерывания INT 13h:

Int 13h - Управление дисками

Функции прерывания INT 13h:

Слайд 13

Некоторые функции прерывания INT 13h 00h – сброс дисковой подсистемы. 01h - получить состояние дисковой подсистемы.

Некоторые функции прерывания INT 13h

00h – сброс дисковой подсистемы.

01h -

получить состояние дисковой подсистемы.
Слайд 14

Код ошибки прерывания INT13h функции 01h.

Код ошибки прерывания INT13h функции 01h.

Слайд 15

08h - получить текущие параметры дисковода (НМД). Тип дисковода в регистре BL:

08h - получить текущие параметры дисковода (НМД).

Тип дисковода в регистре BL:

Слайд 16

15h – Получить тип дисковода Тип дисковода:

15h – Получить тип дисковода

Тип дисковода:

Слайд 17

Организация доступа к CMOS-памяти: mov al,12h out 70h,al ; задаем адрес

Организация доступа к CMOS-памяти:

mov al,12h
out 70h,al ; задаем адрес в CMOS-памяти
jmp $+2 ; небольшая задержка
in al,71h ; записываем

в AL считанное значение

Ячейки CMOS-памяти, отвечающие за конфигурацию дисковой подсистемы:

14h - байт конфигурации
10h - тип НГМД
12h - тип НМД C: и D

Слайд 18

В памяти CMOS хранится:

В памяти CMOS хранится:

Слайд 19

00h - 0Dh - область часов реального времени 0Eh - байт диагностики

00h - 0Dh - область часов реального времени
0Eh - байт диагностики

Слайд 20

10h – ячейка CMOS-памяти: 12h - Тип НМД (если тип меньше

10h – ячейка CMOS-памяти:

12h - Тип НМД (если тип меньше 15)


19h - Тип первого НМД (если тип > 15)
1Ah - Тип второго НМД (если тип > 15)
Слайд 21

Сокращенная таблица параметров для стандартных типов НМД:

Сокращенная таблица параметров для стандартных типов НМД:

Слайд 22

Таблица параметров дискеты DPT (Diskette Parameter Table) – INT 1Eh

Таблица параметров дискеты DPT (Diskette Parameter Table) – INT 1Eh

Слайд 23

Таблица параметров жесткого диска HDPT (Hard Disk Parameter Table) – INT 41h и INT 46h

Таблица параметров жесткого диска HDPT (Hard Disk Parameter Table) – INT

41h и INT 46h
Слайд 24

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

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

Слайд 25

Ячейки CMOS-памяти, отвечающие за оперативную память

Ячейки CMOS-памяти, отвечающие за оперативную память

Слайд 26

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

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


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;
}
Слайд 27

Int 14h - Управление стыком RS-232C Функции прерывания: INT 14h AH

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

Функции прерывания:

INT 14h AH = 03 —

Получить текущее состояние порта
Слайд 28

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

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

Слайд 29

BIOS Data Area

BIOS Data Area

Слайд 30

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

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

Слайд 31

Байт BIOS для идентификации типа компьютера:

Байт BIOS для идентификации типа компьютера:

Слайд 32

Пример: #include #include #include "sysp.h" char unsigned pc_model(void) { char unsigned

Пример:

#include
#include
#include "sysp.h"
char unsigned pc_model(void) {
char unsigned _far *modptr;
modptr =

FP_MAKE(0xf000,0xfffe);
return *modptr;
}
Слайд 33

Функция C0h INT 15h На входе: AH = C0h На выходе:

Функция C0h INT 15h

На входе: AH = C0h
На выходе: ES:BX = адрес таблицы

конфигурации, таблица находится в ПЗУBIOS;
CF = 0 при успешном вызове прерывания;
CF = 1 если данная версия BIOS не поддерживает функцию C0h.
Слайд 34

Формат таблицы по адресу в ES:BX – результат C0h INT 15h

Формат таблицы по адресу в ES:BX – результат C0h INT 15h

Слайд 35

Коды моделей, дополнительные коды моделей и версии BIOS для некоторых широко

Коды моделей, дополнительные коды моделей и версии BIOS для некоторых широко

распространенных типов компьютеров:

C0h INT 15h
F000h:FFFEh
F000h:FFF5h.

Слайд 36

#include #include #include "sysp.h" void main(void); void main(void) { union REGS

#include
#include
#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);
Слайд 37

// Выводим на экран содержимое таблицы printf("\nАдрес таблицы конфигурации: %Fp" "\nРазмер

// Выводим на экран содержимое таблицы
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); }
Слайд 38

Int 16h - Обслуживание клавиатуры

Int 16h - Обслуживание клавиатуры

Слайд 39

Int 17h - Управление принтером Int 18h - Интерпретатор Бейсика F600h:0

Int 17h - Управление принтером

Int 18h - Интерпретатор Бейсика

F600h:0

GW-BASIC


Int 19h - Загрузка системы

0:7C00h

F000h:FFF0h

00472h

1234h

Слайд 40

Int 1Ah - Обслуживание таймера_F

Int 1Ah - Обслуживание таймера_F

Слайд 41

Int 1bH – прерывание с клавиатуры 0:006c IRET Int 1cH –

Int 1bH – прерывание с клавиатуры
0:006c
IRET
Int 1cH –

пользовательское прерывание по таймеру
0:0070
Int 1dH – указатель видеопараметров
0:0074
INT 10H
Int 1eH – указатель параметров дискеты
0:0078
INT 13H
Слайд 42

Int 1fH – указатель графических символов 0:007 ROM-BIOS F000:0000 г7+6+5+4+3+2+1+0¬ смещение_в_таблице

Int 1fH – указатель графических символов

0:007
ROM-BIOS
F000:0000
г7+6+5+4+3+2+1+0¬
смещение_в_таблице + 0: ¦

$ $ $ $ $ $ ¦ = 01111110 = 7e hex =¬
смещение_в_таблице + 1: ¦ $ $ $ $ ¦ = 00111100 = 3c hex ¦
смещение_в_таблице + 2: ¦ $ $ $ $ ¦ = 01101100 = 6c hex ¦
смещение_в_таблице + 3: ¦ $ $ $ $ ¦ = 01101100 = 6c hex ¦=> =¬
смещение_в_таблице + 4: ¦ $ $ $ $ ¦ = 01101100 = 6c hex ¦ ¦
смещение_в_таблице + 5: ¦ $ $ $ $ ¦ = 01101100 = 6c hex ¦ ¦
смещение_в_таблице + 6: ¦$ $ $ $ $ ¦ = 11001110 = ce hex ¦ ¦
смещение_в_таблице + 7: ¦ ¦ = 00000000 = 00 hex =- ¦
+ -+- +- +- +- +- +-+-+ ¦
+====================+
¦
+===============¦=============+
8-байтовая последовательность: 7еH,3cH,6cH,6cH,6cH,6cH,ceH,00H стояла бы в
таблице по смещению, соответствующему символу "Л". Так как код ASCII буквы 'Л' равен
139, а таблица начинается для символа с кодом 128, это будет 12-я группа из 8 байт
(смещение - 88 байт от начала таблицы).
f000:fa6e
Слайд 43

Определение типа центрального процессора Модели Intel 8086/8088 pushf pop ax mov

Определение типа центрального процессора

Модели Intel 8086/8088
pushf
pop ax
mov cx, ax
and ax, 0fffh
push

ax
popf
pushf
pop ax
and ax, 0f000h
cmp ax, 0f000h
je is_8086

Модель Intel 80286
mov ax, 0f000h
push ax
popf
pushf
pop ax
and ax, 0f000h
jz is_80286

Слайд 44

Модель Intel 80386 pushfd pop eax mov ecx, eax xor eax,

Модель Intel 80386
pushfd
pop eax
mov ecx, eax
xor eax, 40000h
push eax
popfd
pushfd
pop eax
xor

eax, ecx
jz is_80386

Модель Intel 80486
pushfd
pop eax
mov ecx, eax
xor eax, 200000h
push eax
popfd
pushfd
pop eax
xor eax, ecx
je is_80486

Слайд 45

Команда CPUID CPU_ID MACRO db 0fh db 0a2h ENDM mov eax,

Команда CPUID

CPU_ID MACRO
db 0fh
db 0a2h
ENDM
mov eax, 00h
CPU_ID
_vendor_id_msg db "............", 0dh, 0ah,

"$"
. . .
mov dword ptr _vendor_id_msg, ebx
mov dword ptr _vendor_id_msg[+4], edx
mov dword ptr _vendor_id_msg[+8], ecx
_cpu_signature dd 0
_features_edx dd 0
. . .
mov _cpu_signature, eax
mov _features_edx, edx
Слайд 46

Формат слова сигнатуры Биты 12 и 13 определяют тип процессора:

Формат слова сигнатуры

Биты 12 и 13 определяют тип процессора:

Слайд 47

Слайд 48

Слайд 49

Базовые функции для прерывания DOS INT 21h 00 Завершение программы (аналогично

Базовые функции для прерывания DOS INT 21h

00 Завершение программы (аналогично int 20h).
01 Ввод

символа с клавиатуры с эхом на экран.
02 Вывод символа на экран.
03 Ввод символа из асинхронного коммуникационного канала.
04 Вывод символа на асинхронный коммуникационный канал.
05 Вывод символа на печать.
06 Прямой ввод с клавиатуры и вывод на экран.
07 Ввод с клавиатуры без эха и без проверки ctrl/break.
08 Ввод с клавиатуры без эха с проверкой ctrl/break.
09 Вывод строки символов на экран.
0А Ввод с клавиатуры с буферизацией.
0В Проверка наличия ввода с клавиатуры.
0С Очистка буфера ввода с клавиатуры и запрос на ввод.
0d Сброс диска.
0Е Установка текущего дисковода.
0f Открытие файла через fcb.
10 Закрытие файла через fcb.
11 Начальный поиск файла по шаблону.
12 Поиск следующего файла по шаблону.
13 Удаление файла с диска.
14 Последовательное чтение файла.
15 Последовательная запись файла.
16 Создание файла.

17 Переименование файла.
18 Внутренняя операция dos.
19 Определение текущего дисковода.
1А Установка области передачи данных (dta).
1В Получение таблицы fat для текущего дисковода.
1С Получение fat для любого дисковода.
21 Чтение с диска с прямым доступом.
22 Запись на диск с прямым доступом.
23 Определение размера файла.
24 Установка номера записи для прямого доступа.
25 Установка вектора прерывания.
26 Создание программного сегмента.
27 Чтение блока записей с прямым доступом.
28 Запись блока с прямым доступом .
29 Преобразование имени файла во внутренние параметры.
2А Получение даты (cx-год,dh-месяц,dl-день).
Вариант №6.
2В Установка даты.
2С Получение времени (ch-час,cl-мин,dh-с,
dl-1/100с).
Вариант №6.
2d Установка времени.
2Е Установка/отмена верификации записи на диск.

Слайд 50

Расширенные функции возможны в dos начиная с версии 2.0 2f Получение

Расширенные функции возможны в dos начиная с версии 2.0

2f Получение адреса dta

в регистровой паре es:bx.
Для многих вариантов.
30 Получение номера версии dos в регистре АХ.
31 Завершение программы, после которого она остается резидентной в памяти.
33 Проверка ctrl/break.
35 Получение вектора прерывания (адреса подпрограммы).
36 Получение размера свободного пространства на диске.
38 Получение государственно зависимых форматов.
Вариант №10.
39 Создание подкаталога (команда mkdir).
ЗА Удаление подкаталога (команда rmdir).
3В Установка текущего каталога (команда chdir).
3c Создание файла без использования fcb.
3d Открытие файла без использования fcb.
3e Закрытие файла без использования fcb.
3f Чтение из файла или ввод с устройства.
40 Запись в файл или вывод на устройство.

41 Удаление файла из каталога.
42 Установка позиции для последовательного доступа .
43 Изменение атрибутов файла.
44 Управление вводом-выводом для различных устройств.
45 Дублирование файлового номера.
46 "Склеивание" дублированных файловых номеров.
47 Получение текущего каталога.
48 Выделение памяти из свободного пространства.
49 Освобождений выделенной памяти.
4А Изменение длины блока выделенной памяти.
4В Загрузка/выполнение программы (подпроцесса).
4С Завершение подпроцесса с возвратом управления.
4d Получение кода завершения подпроцесса.
4Е Начальный поиск файла по шаблону.
4f Поиск следующего файла по шаблону.
54 Получение состояния верификации.
56 Переименование файла.
57 Получение/установка даты и времени изменения файла.

Слайд 51

Расширенные функции возможны в dos начиная с версии 3.0 59 Получение

Расширенные функции возможны в dos начиная с версии 3.0

59 Получение расширенного кода

ошибки.
5А Создание временного файла.
5В Создание нового файла.
5С Блокирование/разблокирование доступа к файлу.
62 Получение адреса префикса программного сегмента (psp).
Слайд 52

DOS INT 21H – 38H – дать/установить информацию о стране Вход

DOS INT 21H – 38H – дать/установить информацию о стране

Вход
AH =

38H
DX = 0ffffH чтобы установить код страны равным AL (или BX)
DS:DX = адрес локального буфера для чтения блокa данных страны
AL = 0 чтобы получить данные для текущей страны
= 1 до 0feH чтобы получить данные для указанной страны
= 0ffH чтобы получить данные для кода страны : 255
BX = (если AL=0ffH) 16-битовый код страны
Выход
AX = код ошибки если флаг CF установлен
BX = код страны (если AL=0 при входе)
DX=0ffffH
AL=0ffH
Вход
AL=0
DS:DX = адрес 20-байтового локального буфера
Выход
Пересылает в DS:DX блок данных страны для DOS 2.x
Слайд 53

Hex Dec страна Keybrd дата время формат валюты DS 3dH 061

Hex Dec страна Keybrd дата время формат валюты DS
3dH 061 Австралия

DD-MM-YY 13:00:00 $1,000.00 ,
20H 032 Бельгия DD/MM/YY 13:00:00 1 000,00 F ;
2 002 Французская Канада YY-MM-DD 13:00:00 1 000,00 $ ;
2dH 045 Дания DD/MM/YY 13.00:00 1.000,00 DKR ;
166H 358 Финляндия DD-MM-YY 13:00:00 1 000,00 MK ;
21H 033 Франция keybFR DD/MM/YY 13:00:00 1 000,00 F ;
31H 049 Германия keybGR DD.MM.YY 13.00.00 DM1.000,00 ;
27H 039 Италия keybIT DD/MM/YY 13:00:00 1.000,Lit. ;
3ccH 972 Израиль DD/MM/YY 13:00:00 Щ 1,000.00 ,
311H 785 Средний Восток DD/MM/YY 01:00:00 PM 1.000,000 $ ;
1fH 031 Нидерланды DD-MM-YY 13:00:00 Я1.000,00 ;
2fH 047 Норвегия DD/MM/YY 13.00.00 KR 1.000,00 ;
15fH 351 Португалия DD/MM/YY 13:00:00 1.000$00 ;
22H 034 Испания keybSP DD/MM/YY 13:00:00 1.000,00 Ю ;
2eH 046 Швеция YY-MM-DD 13.00.00 SEK 1.000,00 ;
29H 041 Швейцария DD.MM.YY 13.00.00 Fr 1,000.00 ,
2cH 044 Великобритания keybUK DD-MM-YY 13:00:00 Ь1,000.00 ,
1 001 Соединенные Штаты MM-DD-YY 01:00:00 PM $1,000.00 ,
Слайд 54

DOS INT 21h – 32H – дать информацию DOS о диске

DOS INT 21h – 32H – дать информацию DOS о диске

Вход
AH

= 32H
DL = номер диска (0=текущий, 1=A, и т.д.)
Выход
AL = 0 если DL задавал корректный диск
FF = 0ffH если диск задан неверно
DS:BX = адрес блока информации диска для запрошенного устройства
Слайд 55

INT 33h – прерывание для обслуживания мыши Инициализация мыши Включить курсор

INT 33h – прерывание для обслуживания мыши

Инициализация мыши

Включить курсор мыши

Выключить

курсор мыши

Определить положение курсора

Слайд 56

Установить курсор Определить положение курсора при нажатии клавиши

Установить курсор

Определить положение курсора при нажатии клавиши

Слайд 57

Определить положение курсора при отпускании клавиши Задать диапазон движения курсора по

Определить положение курсора при отпускании клавиши

Задать диапазон движения курсора по

горизонтали

Задать диапазон движения курсора по вертикали

Слайд 58

Задать форму курсора в графическом режиме Задать форму курсора в текстовом режиме Определить содержимое счетчиков перемещения

Задать форму курсора в графическом режиме

Задать форму курсора в текстовом

режиме

Определить содержимое счетчиков перемещения

Слайд 59

Установить драйвер событий

Установить драйвер событий

Слайд 60

Включить эмуляцию светового пера Выключить эмуляцию светового пера Задать скорость перемещения

Включить эмуляцию светового пера

Выключить эмуляцию светового пера

Задать скорость перемещения курсора мыши

Установить

область исключения для курсора

Задать увеличенный графический курсор

Слайд 61

Определить порог удвоения скорости Заменить драйвер событий Определить размер буфера состояния

Определить порог удвоения скорости

Заменить драйвер событий

Определить размер буфера состояния драйвера

Сохранить состояние

драйвера

Восстановить состояние драйвера

Слайд 62

Установить альтернативный драйвер событий Получить адрес альтернативного драйвера событий Установить чувствительность мыши

Установить альтернативный драйвер событий

Получить адрес альтернативного драйвера событий

Установить чувствительность мыши

Слайд 63

Определить чувствительность мыши Установить частоту прерываний для Inport Mouse Установить номер

Определить чувствительность мыши

Установить частоту прерываний для Inport Mouse

Установить номер страницы

видеопамяти

Определить номер страницы видеопамяти

Слайд 64

Отключить драйвер мыши Восстановить драйвер мыши Сбросить драйвер мыши Определить тип мыши

Отключить драйвер мыши

Восстановить драйвер мыши

Сбросить драйвер мыши

Определить тип мыши

Слайд 65

Регистры часов реального времени Регистры счетчиков Регистр состояния A Регистр состояния B

Регистры часов реального времени

Регистры счетчиков

Регистр состояния A

Регистр состояния B


Слайд 66

Функции прерывания INT 1Ah Прочитать показания часов реального времени Установить часы

Функции прерывания INT 1Ah

Прочитать показания часов реального времени

Установить часы реального времени


Прочитать дату из часов реального времени

Слайд 67

Установить дату в часах реального времени Установить будильник Сброс будильника

Установить дату в часах реального времени

Установить будильник

Сброс будильника

Слайд 68

#include #include #include #include typedef struct _SYSTIMER_ { char hour; char

#include
#include
#include
#include
typedef struct _SYSTIMER_
{ char hour;
char

min;
char sec;
unsigned year;
char month;
char day;
char daylight_savings;
} SYSTIMER;
#define GET_TIME
#define GET_DATE
int bcd1bin(char *bcd);
int bcd2bin(char *bcd);
int timer(char fn, SYSTIMER *treal);
#pragma check_stack( off )
#pragma check_pointer( off )
union REGS reg;
int main(void)
{
char *month_to_text[] =
{ "январь",
"февраль",
"март",
"апрель",
"май",
"июнь",
"июль",
"август",
"сентябрь",
"октябрь",
"ноябрь",
"декабрь" };
SYSTIMER timereal;

timer(GET_DATE, &timereal);
timer(GET_TIME, &timereal);
printf("\nСейчас %d год, %s, %d число."
"\n",
bcd2bin((char*)&(timereal.year)),
month_to_text[bcd1bin(&(timereal.month)) - 1],
bcd1bin(&(timereal.day)));
printf("\nВремя - %02.2d:%02.2d:%02.2d"
"\n",
bcd1bin(&(timereal.hour)),
bcd1bin(&(timereal.min)),
bcd1bin(&(timereal.sec)));
getch();
return 0;
}
int bcd1bin(char *bcd)
{
return( ((*bcd) & 0x0f) +10 * (((*bcd) & 0xf0) >> 4) );
}
int bcd2bin(char *bcd)
{
return( bcd1bin(bcd) +100 * bcd1bin(bcd + 1) );
}
int timer(char fn, SYSTIMER *treal)
{ reg.h.ah = fn;
int86(0x1a,®,®);
if(reg.x.cflag == 1)
return(-1);
switch (fn)
{ case GET_TIME:
{ treal->hour = reg.h.ch;
treal->min = reg.h.cl;
treal->sec = reg.h.dh;
break; }
case GET_DATE:
{ treal->year = reg.x.cx;
treal->month = reg.h.dh;
treal->day = reg.h.dl;
break; }
}
return 0;
}