Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание] [Дальше]

7.4. Средства 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 - спулер установлен.


Если после вызова перечисленных выше функций флаг переноса CF установлен в 1, регистр AX содержит код ошибки:

  • 1
  • Неправильный код функции
  • 2
  • Файл не найден
  • 3
  • Путь не найден
  • 4
  • Слишком много открытых файлов
  • 5
  • Доступ запрещен
  • 6
  • Неправильный индекс (handle)
  • 8
  • Переполнение очереди
  • 9
  • Занято
  • 0Ch
  • Слишком длинный путь и имя файла (больше 64 байтов)
  • 0Fh
  • Неправильное определение диска
[Назад] [Содеожание] [Дальше]