
- •Введение
- •Лабораторная работа № 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.
- •Аналогичным образом могут использоваться свойства и других классов.
Средства ms-dos для работы с принтером
Для печати символа на стандартном печатающем устройстве LPT1 (он же PRN) вы можете использовать функцию 05h прерывания MS-DOS INT 21h:
На входе: AH = 05h;
DL = ASCII-код символа для печати.
На выходе: AH = слово состояния принтера (см. ниже).
Команда MS-DOS MODE может переназначить стандартное устройство печати LPT1 на асинхронный последовательный порт:
MODE LPT1:=COM1
Ниже приведена программа распечатки содержимого файла, но уже при помощи прерывания MS-DOS:
#include <dos.h>
#include <stdio.h>
union REGS rg;
int main(int argc, char *argv[]) {
FILE *srcfile;
// Открываем файл, заданный первым параметром
// в командной строке.
// Если при запуске программы оператор забыл
// указать имя файла, выводим напоминающее сообщение.
if( (srcfile = fopen( argv[1], "rb" )) == NULL ) {
printf("\nЗадайте имя файла в качестве параметра");
exit(-1);
}
// Читаем файл по одному символу, полученный из файла
// символ выводим на принтер при помощи функции printchar().
for(;;) {
printchar(fgetc(srcfile));
if(feof(srcfile)) break;
}
// Закрываем файл.
fclose(srcfile);
}
// ------------------------------------
// Эта функция выводит один символ
// на стандартный принтер (LPT1)
// ------------------------------------
int printchar(int chr) {
// Дублируем распечатываемый символ на экране
putch(chr);
// Вызываем функцию 5 прерывания INT 21h -
// распечатка символа на принтере.
rg.h.ah = 5;
rg.h.dl = chr;
int86(0x21, &rg, &rg);
}
Заметьте, что функция 05h прерывания INT 21h не возвращает состояния принтера при ошибке ввода/вывода. Вместо этого вызывается стандартный обработчик критических ошибок MS-DOS, который выводит на экран хорошо знакомое вам сообщение:
Write fault error writing device PRN
Abort, Retry, Ignore, Fail?
Вы можете ответить Retry, нажав клавишу "R", тогда MS-DOS выполнит попытку повторить печать символа. Если ответить Abort (нажав клавишу "A"), MS-DOS завершит работу вашей программы.
Поэтому приведенная выше программа не содержит обработчика ошибочных ситуаций error(). Если вас не устраивают действия, выполняемые стандартным обработчиком критических ошибок MS-DOS, вы можете составить собственный. В третьей книге первого тома "Библиотеки системного программиста" мы рассказывали вам о создании и подключении собственного обработчика критических ошибок.
Более интересные возможности по управлению процессом печати предоставляет программа резидентного спулера печати PRINT.COM. Вы знаете, что команда PRINT предназначена для выполнения печати в фоновом режиме.
Оказывается, что если запущена программа PRINT, другие программы могут взаимодействовать с ней, управляя процессом печати.
Для связи со спулером печати можно использовать несколько функций прерывания INT 2Fh:
На входе: AH = 01h;
AL = номер выполняемой операции.
На выходе: AH = 00 - спулер печати не установлен,
но его можно установить, запустив
программу PRINT;
01 - спулер печати не установлен и
его установка невозможна (система
не содержит ни одного принтера);
FFh - спулер установлен.
Приведем форматы регистров для выполнения различных операций со спулером печати.
На входе: AH = 01h;
AL = 0 - проверить установку спулера печати.
На выходе: AH = 00 - спулер печати не установлен,
но его можно установить, запустив
программу PRINT;
01 - спулер печати не установлен и
его установка невозможна;
FFh - спулер установлен.
----------
На входе: AH = 01h;
AL = 1 - передача файла спулеру для печати;
DS:DX = адрес управляющего блока:
Смещение Длина
(+0) 1 уровень запроса, равен 0;
(+1) 4 FAR-адрес строки в формате ASCIIZ,
содержащей путь файла.
На выходе: AH = 00 - спулер печати не установлен,
но его можно установить, запустив
программу PRINT;
01 - спулер печати не установлен и
его установка невозможна;
FFh - спулер установлен.
----------
На входе: AH = 01h;
AL = 2 - отменить печать файла;
DS:DX = адрес строки в формате ASCIIZ,
содержащей имя файла, удаляемого
из очереди для печати.
На выходе: AH = 00 - спулер печати не установлен,
но его можно установить, запустив
программу PRINT;
01 - спулер печати не установлен и
его установка невозможна;
FFh - спулер установлен.
----------
На входе: AH = 01h;
AL = 3 - отменить печать всех файлов.
На выходе: AH = 00 - спулер печати не установлен,
но его можно установить, запустив
программу PRINT;
01 - спулер печати не установлен и
его установка невозможна;
FFh - спулер установлен.
----------
На входе: AH = 01h;
AL = 4 - определить состояние спулера и заблокировать спулер.
На выходе: DS:SI = адрес очереди печати (массив строк
в формате ASCIIZ, конец массива
отмечен строкой, состоящей из 0;
DX = количество ошибок при попытке напечатать
последний символ;
AH = 00 - спулер печати не установлен, но его можно установить, запустив программу PRINT;
01 - спулер печати не установлен и
его установка невозможна;
FFh - спулер установлен.
----------
На входе: AH = 01h;
AL = 5 - разблокировать спулер для продолжения
печати.
На выходе: AH = 00 - спулер печати не установлен,
но его можно установить, запустив
программу PRINT;
01 - спулер печати не установлен и
его установка невозможна;
FFh - спулер установлен.