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

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.

7 параллельный адаптер

  • Функции BIOS для работы с принтером
  • Функции MS-DOS для работы с принтером
  • Программирование принтера
  • Следующее очень распространенное периферийное устройстов, которое мы рассмотрим в нашей книге, это параллельный адаптер. Такой адаптер есть практически в любом компьютере и обычно применяется для подключения принтера. Только в некоторых моделях блокнотных компьютеров, где принтер подключается через асинхронный последовательный адаптер, отсутствует параллельный адаптер.

    Базовая система ввода/вывода BIOS может работать с тремя параллельными адапетрами. В процессе тестирования и инициализации системы BIOS находит работоспособные адаптеры и записывает их базовые адреса в таблицу. Таблица базовых адресов располагается в области данных BIOS по адресу 0000:0408h и может содержать следующие значения:

    ·          378h – параллельный адаптер LPT1;

    ·          278h – параллельный адаптер LPT2;

    ·          3BCh – параллельный адаптер на плате адаптера монохромного дисплея (сейчас это уже редкость).

    Параллельные адаптеры могут вырабатывать запросы на прерывание:

    ·          LPT1 - IRQ7, INT 0Fh;

    ·          LPT2 - IRQ5, INT 0Dh

    Порты параллельного адаптера

    Каждый параллельный адаптер обслуживается несколькими портами ввода/вывода.

    Обычно программа редко работает с параллельным адапетром на уровне портов ввода/вывода, так как достаточно использовать предназначенные для этого функции BIOS или MS-DOS. Однако сведения о портах может пригодиться вам для разработки собственного драйвера принтера или программы, обслуживающей какое-либо устройство, подлкюченное к параллельному адапетру, например, аналого-цифрового преобразователь.

    Порт 378h

    Этот порт, доступный как для записи, так и для чтения, предназначен для вывода данных. Программа может прочитать байт, только что записанный в порт 378h.

    Порт 37Ah

    Порт обычно применяется для управления принтером, подключенным к параллельному адаптеру. Он доступен для чтения и записи. Ниже мы привели описание отдельных разрядов этого порта:

    Поле

    Описание

    0

    STROBE

    Cтроб данных, принимает значение 1 при выводе байта, подключен к 1 контакту разъема параллельного адаптера

    1

    AUTO LineFeed

    Автоматический перевод строки после символа возврата каретки CR, контакт 14

    2

    INIT

    Сброс принтера, активный уровень - 0, контакт 16

    3

    SLCT IN

    Выбор принтера для работы, контакт 17

    4

    IRQ Enable

    Разрешение прерывания от принтера. Если прерывания от принтера разрешены, они вырабатываются когда сигнал готовности принтера ACK (контакт 10) принимает уровень логического 0

    5-7

    Равно 0

    Порт 379h

    Порт состояния принтера, доступен только для чтения:

    Поле

    Описание

    0-2

    Равно 0

    3

    ERROR

    Сигнал ошибки, активный уровень - 0, контакт 15

    4

    SLCT

    Принтер выбран, контакт 13

    5

    PE

    Конец бумаги, контакт 12

    6

    ACK

    Готовность принтера, активный уровень - 0, контакт 10

    7

    BUSY

    0 - принтер занят, находится в состоянии offline или произошла ошибка, контакт 11

    Разъем параллельного адаптера

    Для тех, кто будет использовать параллельный адаптер для подключения аппаратуры, приведем таблицу назначения контактов разъемов этого адаптера , а также соответствующих контактов разъема принтера:

    Контакт разъема адаптера

    Контакт разъема принтера

    Назначение

    Вход или выход

    1

    1

    STROBE

    Строб

    Выход, инверсия

    2

    2

    Данные, бит 0

    Выход

    3

    3

    Данные, бит 1

    Выход

    4

    4

    Данные, бит 2

    Выход

    5

    5

    Данные, бит 3

    Выход

    6

    6

    Данные, бит 4

    Выход

    7

    7

    Данные, бит 5

    Выход

    8

    8

    Данные, бит 6

    Выход

    9

    9

    Данные, бит 7

    Выход

    10

    10

    ACK

    Подтверждение

    Вход, инверсия

    11

    11

    BUSY

    Занятость

    Вход

    12

    12

    PE

    Конец бумаги

    Вход

    13

    13

    SLCT

    Выбор

    Вход

    14

    14

    Auto Line Feed

    Авт. перевод строки

    Выход, инверсия

    15

    32

    ERROR

    Ошибка

    Вход, инверсия

    16

    31

    INIT

    Сброс принтера

    Выход, инверсия

    17

    36

    SLCT IN

    Принтер выбран

    Выход, инверсия

    18-25

    16,17, 19-30,33

    Земля

    -

    Для сигналов, отмеченных в таблице словом "инверсия", используется уровень логического нуля в активном состоянии сигнала.

    Используя параллельный адаптер для управления внешними устройствами, будьте осторожны и выполняйте все правила заземления устройств. Если ваш устройство не заземлено или заземлено неправильно, параллельный адаптер может выйти из строя (и когда-нибудь он обязательно сделает это).

    Следует также учитывать, что нагрузка на выходную линию параллельного адаптера не должна превышать одного входа TTL (то есть к одному выходу адаптера вы можете подключить не более одного входа микросхемы серии 155).

    Вывод байта на принтер через параллельный адаптер

    Для того, чтобы вывести символ на принтер, программа вначале должна убедится, что уровень сигнала на линии BUSY (бит 7 порта 379h) равен 0, а уровень сигнала на линии ACK (бит 6 порта 379h) - единице. После этого следует установить код выходного символа на линиях DATA (порт 378h).

    Затем не ранее, чем через 0,5 мкс линию STROBE (бит 0 порта 37Ah) необходимо перевести в состояние логического 0. При этом выходной символ запишется во внутренний буфер принтера. Уровень логического нуля необходимо удерживать в течение как минимум 0,5 мкс. Это время нужно для того, чтобы символ записался в буфер принтера. После истечения интервала времени линию STROBE нужно опять перевести в состояние логической единицы.

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

    Когда принтер полность обработает выведенный символ, линия ACK перейдет в состояние 0. Приблизительно через 5 мкс после этого линия BUSY также перейдет в состояние 0.

    Еще через 5 мкс линия ACK примет состояние 1. Теперь принтер готов принят следующий байт данных.

    Функции BIOS для работы с принтером

    В BIOS есть ряд функций, предназначенных для работы с принтером, подключенным через параллельный адаптер. Это функции 00h, 01h, 02h прерывания INT 17h.

    Печать символа

    Функция 00h предназначена для печати одного символа:

    Регистры на входе:

    AH = 00h;

    AL = код ASCII символа, который нужно напечатать;

    DX = номер параллельного адаптера: 0 – LPT1, 1 – LPT2, 2 – LPT3

    Регистры на выходе:

    AH = слово состояния принтера

    Эта функция выводит на принтер один символ, заданный в регистре AL. В регистре DX необходимо записать номер используемого параллельного адаптера. Для адаптера LPT1 это 0, для LPT2 - 1 и так далее.

    После выполнения прерывания регистр AH будет содержать слово состояния, имеющее следующий формат:

    Поле

    Описание

    0

    Истекло время ожидания при выполнении операции печати, возможно, что принтер неисправен

    1-2

    Не используются

    3

    Ошибка ввода/вывода

    4

    1 - принтер выбран для работы;

    0 - принтер находится в состоянии offline

    5

    Конец бумаги

    6

    Подтверждение

    7

    1 - принтер готов к работе;

    0 - принтер занят

    Вызвав функцию 00h прерывания INT 17h, программа должна проверить биты слова состояния и убедиться в том, что вывод байта произошел без ошибок. Пользователь часто забывает перевести принтер в состояние online, вставить бумагу, либо вообще включить принтер. В этом случае целесообразно напомнить пользователю о необходимости выполнения этих действий и затем повторить попытку печати.

    Если принтер неисправен, программа должна предоставить пользователю возможность отменить печать.

    Обратите внимание на бит 1 байта состояния. Если принтер находится в состоянии offline, функция 00h прерывания INT 17h ожидает некоторое время готовности принтера, после чего, если принтер так и не перешел в состояние готовности, устанавливает бит 1 в байте состояния. Область данных BIOS по адресу 0000h:0478h содержит четыре байта, которые используются в качестве счетчика времени при ожидании готовности принтера.

    Инициализация принтера

    Функция 01h инициализирует принтер:

    Регистры на входе:

    AH = 01h;

    DX = номер параллельного адаптера: 0 – LPT1, 1 – LPT2, 2 – LPT3

    Регистры на выходе:

    AH = слово состояния принтера

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

    Определение состояния принтера

    Слово состояния принтера может быть получено с помощью функции 02h:

    Регистры на входе:

    AH = 02h;

    DX = номер параллельного адаптера: 0 – LPT1, 1 – LPT2, 2 – LPT3

    Регистры на выходе:

    AH = слово состояния принтера

    Эту функцию удобно использовать перед началом печати для определения готовности принтера к работе.

    Программа PRINTFL

    Приведем исходный текст программы PRINTFL, которая распечатывает содержимое файла с использованием функции 0 прерывания INT 17h (листинг 7.1).

    Листинг 7.1. Файл printfl\printfl.с

    
    // =====================================================
    // Печать на принтере с помощью функций BIOS
    //
    // (C) Фролов А.В, 1997
    //
    // E-mail: frolov@glas.apc.org
    // WWW:    http://www.glasnet.ru/~frolov
    //            или
    //         http://www.dials.ccas.ru/frolov
    // =====================================================
    #include <dos.h>
    #include <stdio.h>
    #include <conio.h>
    
    union REGS rg;
    int printchar(int chr);
    int error(char chr, int status);
    
    int main(int argc, char *argv[]) 
    {
      FILE *srcfile;
    
      // Открываем файл, заданный первым параметром
      // в командной строке.
      // Если при запуске программы оператор забыл
      // указать имя файла, выводим напоминающее сообщение
      if( (srcfile = fopen( argv[1], "rb" )) == NULL ) 
      {
        printf("\nЗадайте имя файла в качестве параметра");
        return (-1);
      }
    
      // Читаем файл по одному символу, полученный из файла
      // символ выводим на принтер при помощи функции printchar
      for(;;) 
      {
        printchar(fgetc(srcfile));
        if(feof(srcfile)) 
          break;
      }
    
      // Закрываем файл
      fclose(srcfile);
      
      return 0;
    }
    
    // ------------------------------------
    // Эта функция выводит один символ
    // на первый принтер (LPT1)
    // ------------------------------------
    int printchar(int chr) 
    {
      int status;
    
      // Повторяем в цикле выдачу символа на принтер
      // до тех пор, пока он не будет выведен без
      // ошибок, либо пока оператор не отменит
      // распечатку файла
      for(;;) 
      {
        // Дублируем распечатываемый символ на экране
        putch(chr);
    
        // Вызываем функцию 00h прерывания INT 17h -
        // распечатка символа на принтере.
        // В регистре DX задаем номер принтера LPT1 - это 0
        rg.h.ah = 0;
        rg.h.al = chr;
        rg.x.dx = 0;
    
        int86(0x17, &rg, &rg);
    
        // Запоминаем байт состояния принтера
        // после вывода символа
        status = rg.h.ah;
    
        // Проверяем наличие ошибок. Нас интересуют биты:
        //
        //    0 - задержка при печати
        //    3 - ошибка ввода/вывода
        //    4 - принтер в состоянии ONLINE (1) или OFFLINE (0)
        //    5 - конец бумаги
        if((status & 0x39) != 0x10) 
        {
          // Вызываем функцию обработки ошибки error(). Эта
          // функция возвращает 0, если оператор желает
          // повторить печать символа, или 1 - если
          // оператор отменяет печать
          if(error(chr, status)) 
          {
            printf("\nПечать завершилась аварийно");
            return -1;
          }
        }
        else 
          break;
      }
    }
    
    // ------------------------------------
    // Функция выводит на экран состояние
    // принтера и запрашивает у оператора
    // требуемые действия - повторить
    // печать символа или отменить печать
    // ------------------------------------
    int error(char chr, int status) 
    {
      // Выводим состояние принтера после ошибки
      printf("\nОшибка принтера %02.2X"
           "\n\nСостояние принтера:"
           "\n-------------------", status);
    
      if(status & 1)
        printf("\nТаймаут при печати");
    
      if(status & 8)
        printf("\nОшибка ввода/вывода");
    
      if(!(status & 0x10))
        printf("\nПринтер находится в состоянии OFFLINE");
    
      if(status & 0x20)
        printf("\nКонец бумаги");
    
      printf("\n\nДля отмены печати нажмите клавишу ESC,"
        "\nдля повтора - любую другую клавишу\n");
    
      if(getch() == 27) 
        return 1;
      else 
        return 0;
    }
    

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

    После вызова прерывания INT 17h функция printchar проверяет состояние принтера. При возникновении ошибки ввода/вывода вызывается обработчик - функция error. Эта функция выводит на экран состояние принтера (в развернутом виде с объяснением каждого бита в байте состояния), а также запрашивает пользователя о дальнейших действиях.

    Если пользователь может устранить причину ошибки (перевести принтер в состояние online, вставить бумагу, если она кончилась и так далее), он нажимает любую клавишу, кроме <Esc>. В этом случае функция error возвращает 0. Иначе возвращается значение 1.

    Если пользователь решил повторить печать, и, соответственно, если функция error возвратила значение 0, функция printchar повторяет печать символа. При отмене печати выдается сообщение об ошибке и работа программы завершается.

    Функции MS-DOS для работы с принтером

    Операционная система MS-DOS имеет свои срдества, предназначенные для работы с принтером. Это функция 05h прерывания INT 21h и система буферизованной печати.

    Функция MS-DOS для вывода на принтер

    Для печати символа на стандартном печатающем устройстве PRN вы можете использовать функцию 05h прерывания MS-DOS INT 21h:

    Регистры на входе:

    AH = 05h;

    DL = код ASCII символа для печати

    Регистры на выходе:

    AH = слово состояния принтера

    Ниже мы привели исходный текст функции printchar, которая распечатывает символ, передаваемый ей в качестве параметра, при помощи описанной выше функции MS-DOS:

    
    int printchar(int chr) 
    {
      // Дублируем распечатываемый символ на экране
      putch(chr);
    
      // Вызываем функцию 5 прерывания INT 21h -
      // распечатка символа на принтере.
      rg.h.ah = 5;
      rg.h.dl = chr;
      int86(0x21, &rg, &rg);
    }
    

    Функция 05h по умолчанию работает с устройством PRN, однако с помощью команды MODE вы можете переназначить стандартное устройство печати LPT1, например, на асинхронный последовательный адаптер COM1:

    
    MODE LPT1:=COM1
    

    Заметим, что функция 05h прерывания INT 21h не возвращает состояния принтера при ошибке ввода/вывода. Вместо этого вызывается стандартный обработчик критических ошибок MS-DOS, который выводит на экран хорошо знакомое вам сообщение:

    
    Write fault error writing device PRN
    Abort, Retry, Ignore, Fail?
    

    Вы можете ответить Retry, нажав клавишу <R>, и тогда MS-DOS выполнит попытку повторить печать символа. Если ответить Abort (нажав клавишу <A>), MS-DOS завершит работу вашей программы.

    Если вас не устраивают действия, выполняемые стандартным обработчиком критических ошибок MS-DOS, вы можете составить собственный. О том, как это сделать, можно узнать из 18 и 19 томов «Библиотеки системного программиста», посвященных программированию для MS-DOS.

    Система буферизованной печати

    Более интересные возможности по управлению процессом печати предоставляет резидентная программа буферизованной печати PRINT.EXE. Напомним, что команда PRINT операционной системы MS-DOS предназначена для выполнения печати в фоновом режиме.

    Оказывается, что если запущена программа PRINT, другие программы могут взаимодействовать с ней, управляя процессом печати.

    Для связи с системой буферизованной печати можно использовать несколько функций прерывания INT 2Fh, которые мы рассмотрим ниже.

    Проверка установки системы буферизованной печати

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

    Регистры на входе:

    AH = 01h;

    AL = 00h

    Регистры на выходе:

    AH = состояние системы буферизованной печати

    Байт состояния системы буферизованной печати описан ниже:

    Содержимое регистра AH

    Состояние системы буферизованной печати

    00h

    Не установлена, но ее можно установить командой PRINT

    01h

    Не установлена и ее установка невозможна

    FFh

    Установлена

    Запуск процесса печати файла

    Данная функция запускает процесс фоновой печати.

    Регистры на входе:

    AH = 01h;

    AL = 01h;

    DS:DX = адрес структуры, с помощью которой функции передается путь к распечатываемому файлу

    Регистры на выходе:

    AH = состояние системы буферизованной печати

    Формат структуры, адрес которой передается функции в регистровой паре DS:DX, представлен ниже:

    Смещение

    Длина

    Описание

    0

    1

    Уровень запроса, равен 0

    1

    4

    Полный адрес строки в формате ASCIIZ, содержащей путь к файлу

    Отмена печати файла

    С помощью этой функции вы можете удалить файл из очереди печати.

    Регистры на входе:

    AH = 01h;

    AL = 02h;

    DS:DX = адрес строки в формате ASCIIZ, содержащей имя файла, удаляемого из очереди для печати

    Регистры на выходе:

    AH = состояние системы буферизованной печати

    Отмена печати всех файлов

    С помощью этой функции вы можете удалить печать всех файлов, которые находятся в очереди печати.

    Регистры на входе:

    AH = 01h;

    AL = 03h

    Регистры на выходе:

    AH = состояние системы буферизованной печати

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

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

    Регистры на входе:

    AH = 01h;

    AL = 04h

    Регистры на выходе:

    AH = состояние системы буферизованной печати;

    FFh – система буферизованной печати установлена;

    DS:SI = адрес очереди печати (массив строк в формате ASCIIZ, конец массива отмечен строкой, состоящей из 0;

    DX = количество ошибок при попытке напечатать последний символ

    Разблокирование системы буферизованной печати

    Эта функция может быть использована для разблокирования системы буферизованной печати, заблокированной предыдущей функцией.

    Регистры на входе:

    AH = 01h;

    AL = 05h

    Регистры на выходе:

    AH = состояние системы буферизованной печати

    Коды ошибок

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

    PRIVATE Код

    Описание

    01h

    Неправильный код функции

    02h

    Файл не найден

    03h

    Путь не найден

    04h

    Слишком много открытых файлов

    05h

    Доступ запрещен

    06h

    Неправильный идентификатор файла

    08h

    Переполнение очереди

    09h

    Занято

    0Ch

    Слишком длинная строка пути к файлу (больше 64 байт)

    0Fh

    Диск указан неправильно

    Программирование принтера

    В этом разделе мы расскажем о некоторых приемах программирования принтеров.

    Относительно недавно наибольшей популярностью пользовались матричные принтеры, в основном из-за их низкой стоимости. Сегодня матричные принтеры вытесняются струйными и лазерными, особенно если они используются с приложениями Windows.

    Больше всего распространены две группы матричных принтеров, различающихся по системе используемых команд - это принтеры, совместимые с принтерами Epson и принтеры, совместимые с принтерами IBM Proprinter. Принтеры некоторых третьих фирм-производителей компьютерного оборудования обычно эмулируют команды обоих или одной из этих групп в зависимости от установленного режима работы.

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

    Средим матричных принтеров в России очень распространены принтеры серии Epson FX: FX-80, FX-850, FX-1050. Печатающие головки этих принтеров имеют девять иголок, поэтому качество печати принтеров серии FX оставляет желать лучшего. Принтеры серии Epson LQ используют для печати 24 иголки, кроме того, некоторые модели способны печатать цветные изображения (например, Epson LQ-2550). Качество печати принтеров LQ намного лучше.

    Подключение принтера к компьютеру

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

    Для подключения к последовательному адаптеру принтер должен быть оборудован специальным последовательным интерфейсом. Кроме того, необходимо использовать специальный кабель. Если вы подсоедините принтер к последовательному порту при помощи кабеля, предназначенного для работы с параллельным портом, то это может привести к повреждениям в оборудовании компьютера или принтера. Внимательно читайте раздел документации на принтер, посвященный подключению к компьютеру.

    Установка переключателей конфигурации

    Как правило, матричные принтеры позволяют устанавливать режим своей работы с помощью переключателей режима. Для доступа к этим переключателям вам не надо разбирать принтер или снимать крышку корпуса - эти переключатели располагаются в легкодоступном месте.

    Некоторые принтеры, например, струйные и лазерные, не имеют переключателей режимов. Для задания режимов используется клавиатура и небольшой дисплей на корпусе принтера. Режим такого принтера хранится в памяти CMOS, которая установлена в принтере и питается от аккумулятора. Поэтому установленный режим не сбрасывается при выключении питания принтера.

    Программирование режимов работы принтера

    Для изменения режимов работы принтера и выполнения загрузки шрифтов используются специальные командные последовательности символов. Командные последовательности посылаются в принтер как обычные символы. Для вывода этих последовательностей вы можете использовать описанные ранее функции MS-DOS или BIOS.

    Признак начала командной последовательности символов - байт ESC с кодом 1Bh. Вслед за этим байтом программа посылает в принтер байты командной последовательности. Длина последовательности зависит от выполняемой команды.

    Первый байт командной последовательности - код выполняемой команды. Далее следуют байты параметров команды. Некоторым командам не предшествует байт ESC (это, например, команды перевода строки, страницы или команды табуляции).

    Подробное описание всех команд не входит в задачу данной книги. Вы можете найти список команд в документации на принтер. Мы опишем подробно лишь несколько команд принтера Epson FX-850/1050 с целью иллюстрации способов программирования режимов принтера с использованием протокола ESC/P.

    Инициализация принтера

    Код команды: ESC "@"

    Для сброса принтера в исходное состояние программа должна послать на принтер два байта - байт ESC (1Bh) и байт, соответствующий ASCII-символу "@" (40h).

    Генерация звукового сигнала

    Код команды: 07h

    Если послать этот байт, принтер издаст звуковой сигнал. Этот сигнал удобно использовать для привлечения внимания оператора, например, когда кончилась бумага.

    Возврат каретки

    Код команды: 0Dh

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

    Перевод строки

    Код команды: 0Ah

    Когда этот символ посылается на принтер, все символы, находящиеся во внутреннем буфере принтера, распечатываются, затем каретка возвращается к началу строки и происходит подача листа вперед на одну строку.

    Перевод страницы

    Код команды: 0Ch

    Принтер распечатывает все символы, находившиеся в буфере, затем выполняет прогон одного листа бумаги.

    Другие команды

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

    Если вас не устраивает шрифт, который записан в ПЗУ принтера (например, в нем нет символов кириллицы), вы можете использовать команды для загрузки собственного шрифта.

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