
- •Введение
- •Лабораторная работа № 1. Создание программы определения характеристик центрального процессора.
- •Определение параметров процессора на аппаратном уровне.
- •Лабораторная работа № 2.
- •Конфигурация персонального компьютера
- •Cmos-память и конфигурация компьютера
- •32H Текущее столетие
- •Использование bios для определения конфигурации
- •Лабораторная работа 3. Тестирование оптических накопителей.
- •Использование I/o Control Codes.
- •Использование Windows Management Instrumentation (wmi).
- •Порты контроллера накопителей на гибких дисках
- •Порт 3f2h.
- •Порт 3f4h.
- •Команды управления накопителями
- •Перечень команд контpоллеpа нгмд
- •Структура байтов состояния
- •Формат дорожки
- •Отличия контроллера для ат-подобных пэвм
- •Порт 3f7h.
- •Лабораторная работа № 5. Диагностика контроллера накопителей на жестких дисках.
- •Контроллер жестких дисков для хт-подобных пэвм
- •Порты ввода-вывода
- •Порт 320h.
- •Порт 321h.
- •Порт 322h.
- •Порт 323h.
- •Общий формат команды и терминология
- •Описание команд Проверка готовности накопителя (класс 0, опкод 0).
- •Рекалибровать (класс 0, опкод 1).
- •Запрос состояния (класс 0, опкод 3).
- •Форматирование накопителя (класс 0, опкод 4).
- •Проверка секторов (класс 0, опкод 5).
- •Форматирование дорожки (класс 0, опкод 6).
- •Форматирование дефектной дорожки (класс 0, опкод 7).
- •Чтение секторов (класс 0, опкод 8).
- •Запись секторов (класс 0, опкод 0Ah).(*)
- •Поиск цилиндра по номеру (класс 0, опкод 0Ch).(*)
- •Чтение внутреннего озу контроллера (класс 0, опкод 0Eh).(*)
- •Запись внутреннего озу контроллера (класс 0, опкод 0Fh).(*)
- •Диагностика внутреннего озу контроллера (класс 7,опкод 0).(*)
- •Тест устройства (класс 7, опкод 3).
- •Расширенный тест контроллера (класс 0, опкод 4).
- •Считывание без контроля (класс 7, опкод 5).
- •Запись без контроля (класс 7, опкод 6).
- •Разметка диска
- •Контроллер жестких дисков для ат-подобных пэвм
- •Описание портов ввода-вывода Порт 1f0h
- •Порт 1f1h.
- •Система команд
- •Лабораторная работа №6. Программное тестирование портов для работы с клавиатурой
- •Аппаратное прерывание клавиатуры
- •Средства bios для работы с клавиатурой
- •Чтение символа с ожиданием
- •Проверка буфера на наличие в нем символов
- •Получение состояния переключающих клавиш
- •Установка временных характеристик клавиатуры
- •Запись символов в буфер клавиатуры
- •Чтение символа с ожиданием для 101-клавишной клавиатуры
- •Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- •Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- •Лабораторная работа № 7. Тестирование и контроль оперативной памяти.
- •Алгоритм определения объёма оперативной памяти.
- •Сущность тестирования памяти.
- •Алгоритм диагностирования памяти в тесте Memtest86.
- •Лабораторная работа № 8. Программирование принтера. Цель работы: изучение методов программирования принтера.
- •Средства ms-dos для работы с принтером
- •Программирование режимов принтера
- •Установка атрибутов/цветов символов.
- •Сдвиг экрана и страницы.
- •Вертикальный сдвиг текстового экрана.
- •Сдвиг текстового экрана горизонтально.
- •Переключение между текстовыми страницами.
- •Сдвиг между страницами текста.
- •Использование wmi.
- •Аналогичным образом могут использоваться свойства и других классов.
Получение состояния переключающих клавиш
На входе: AH = 02h
На выходе: AL = Байт состояния переключающих клавиш
Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins). Формат байта состояния соответствует формату байта, находящегося в области данных BIOS по адресу 0000h:0417h:
Биты Значение
0 Нажата правая клавиша Shift.
1 Нажата левая клавиша Shift.
2 Нажата комбинация клавиш Ctrl-Shift с любой
стороны.
3 Нажата комбинация клавиш Alt-Shift с любой
стороны.
4 Состояние клавиши ScrollLock.
5 Состояние клавиши NumLock.
6 Состояние клавиши CapsLock.
7 Состояние клавиши Insert.
Функция может быть использована для анализа текущего состояния переключающих клавиш.
Изменим текст предыдущей программы таким образом, чтобы завершение ее работы происходило лишь в том случае, если переключающая клавиша CapsLock находится в выключенном состоянии (соответствующий светодиод не горит):
#include <stdio.h>
#include <dos.h>
void main(void);
void main(void) {
union REGS rg;
int i, zflag;
for(;;) {
// Выводим в цикле символ '*'
putchar('*');
// Небольшая задержка во времени
for(i=0; i<1000; i++);
// Вызываем прерывание INT 16h для проверки буфера клавиатуры
// Устанавливаем флаг, который будет сброшен при нажатии на
// любую клавишу
zflag = 1;
_asm {
mov ax, 0100h
int 16h
// Если нажатия не было,
// продолжаем выполнение программы
jz nokey
// При нажатии на любую клавишу
// сбрасываем флаг
mov zflag, 0
nokey:
}
if(zflag == 0) {
// Если флаг сброшен, читаем код нажатой клавиши из буфера
// при помощи функции 01h прерывания INT 16h
rg.h.ah = 0;
int86(0x16, &rg, &rg);
// Если была нажата клавиша ESC, завершаем работу программы,
// при условии, что переключатель CapsLock выключен
if(rg.h.ah == 1) {
// Дополнительно проверяем состояние клавиши CapsLock,
// этой клавише соответствует бит 0x40 в слове состояния
rg.h.ah = 2;
int86(0x16, &rg, &rg);
if((rg.h.al & 0x40) == 0) break;
else printf("\nДля завершения нажмите"
" ESC "
"при выключенной клавише CapsLock.\n");
}
else printf("\nДля завершения нажмите ESC "
"при выключенной клавише CapsLock.\n");
}
}
}
Установка временных характеристик клавиатуры
На входе: AH = 03h;
AL = 05h;
BL = Период автоповтора (количество повторов
за одну секунду):
0 - 30.0; 0Ah - 10.0;
1 - 26.7; 0Dh - 9.2;
2 - 24.0; 10h - 7.5;
4 - 20.0; 14h - 5.0;
8 - 15.0; 1Fh - 2.0.
BH = Задержка включения режима автоповтора:
0 - 250 мс;
1 - 500 мс;
2 - 750 мс;
3 - 1000 мс.
На выходе: Не используются.
Мы уже рассказывали о возможности изменения временных характеристик клавиатуры. Если BIOS, установленная в вашей машине, изготовлена после 15 декабря 1985 года, вы можете воспользоваться этой функцией для ускорения (или замедления) работы клавиатуры.
В качестве примера приведем две программы. Первая программа увеличивает быстродействие клавиатуры до его верхнего предела, вторая восстанавливает исходные значения временных характеристик.
#include <stdio.h>
#include <dos.h>
void main(void);
void main(void) {
union REGS rg;
rg.h.al = 5;
rg.h.ah = 3;
// Устанавливаем максимальное быстродействие клавиатуры
rg.h.bl = 0;
rg.h.bh = 0;
int86(0x16, &rg, &rg);
}
#include <stdio.h>
#include <dos.h>
void main(void);
void main(void) {
union REGS rg;
rg.h.al = 5;
rg.h.ah = 3;
// Восстанавливаем исходное быстродействие клавиатуры
rg.h.bl = 0xa;
rg.h.bh = 1;
int86(0x16, &rg, &rg);
}