Главная » Ассемблер, Железо » Вывод информации на принтер при помощи стандартных функций BIOS

0

Для работы с принтером предназначена группа функций BIOS, вызываемых по прерыванию Int 17h. После выполнения любой из функций данной группы в регистре АН будет возвращен код состояния

принтера, разряды которого имеют следующее значение;

•       бит 0 — признак тайм-аута (0 — нормальное состояние, 1 — ошибка тайм-аута, то есть принтер не отвечает);

•           биты 1 и 2 — не используются, установлены в 0;

•       бит 3 — признак ошибки ввода-вывода (0 — ошибка, 1 — нет ошибки);

•       бит 4 — признак выбора принтера (0 — принтер в автономном режиме, 1 — принтер в режиме подключения);

•       бит 5 — контроль наличия бумаги (0 — бумага вставлена, 1 — нет бумаги);

•       бит 6 — подтверждение приема (0 — подтверждение приема символа, 1 — обычное состояние);

•       бит 7 — признак занятости принтера (0 — принтер занят, 1 — принтер свободен).

Формат байта кода состояния принтера показан на рис. 7.1.

Рис. 7.1. Формат байта кода состояния

Прерывание Int 17h, функция 00h: вывести символ на принтер

Функция предназначена для выполнения побайтного вывода информации. Это основная функция данной группы — она обеспечивает посылку команд и данных на принтер.

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

•           в АН — значение OOh;

•           в AL — код выводимого символа;

•           в DX – номер порта принтера (0 – LPT1, 1 – LPT2, 2 – LPT3).

Прерывание Int 17h, функция 01 h: инициализировать порт

Функция предназначена для выполнения инициализации (сброса) интерфейса принтера. Вызывают данную функцию после обнаружения серьезных сбоев в работе принтера.

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

•           в АН — значение Olh;

•           в DX – номер порта принтера (0 – LPT1,1 – LPT2, 2 – LPT3).

Прерывание Int 17h, функция 02h: получить состояние принтера

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

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

•           в АН — значение 02h;

•           в DX – номер порта принтера (0 – LPT1, 1 – LPT2, 2 – LPT3).

Использование стандартных функций прерывания Int 17h

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

В листинге 7.1 приведены процедуры, предназначенные для работы с принтером, подключенным к первому параллельному порту (LPT1):

•      процедура OutCha rToLPTl осуществляет вывод символа в порт LPT 1 при помощи функций BIOS;

•      процедура OutCommandToLPTl использует подпрограмму OutCharTo- LPT1 для подачи на принтер командной последовательности символов (Esc-последовательности).

Реакция на ошибки, возникающие при обмене данными с принтером, в указанных функциях реализована примитивно: при любой ошибке выдается сообщение о том, что принтер не готов к печати, а затем происходит аварийное завершение работы программы (выход в DOS).

Листинг 7.1. Процедуры для вывода символа и посылки команды на принтер LPT1

DATASEG

PErrTxt

DB 12,27,"Принтер не готов к печати",О ENDS

C0DESEG

k^ckkk’icit’k’jcit’kkkit’if’kic’ic’k’k’jrjc’lt’kit’ifie’ic’it

* ВЫВЕСТИ СИМВОЛ НА ПРИНТЕР * ;* Параметры:*

;* AL – код символа.*

 kk’k’it’k’ic’k’ic’irk’k’kit’k’irk’k’ic’k’irk’ifit’k’frk’ic’ic’ft

PROC OutCharToLPTl near pusha

; Вывести символ на печать

mov АН,О

mov DX, О int 17h test AH.00101001b jnz @PPrintingError popa ret

; ВЫДАТЬ СООБЩЕНИЕ ОБ ОШИБКЕ И ВЫЙТИ ИЗ ПРОГРАММЫ @PPrintingError:

: Вывести сообщение об ошибке MFatalError PErrTxt ENDP OutCharToLPTl

• A А A’ ‘A1* "Jc "A* "A" "Jc "A* "A" "A* "A" "Jc A"A" А* "А* "А" ‘A ‘A"iA A""A "Jc "A-A’ A A’ A"A A "A1 "A* "A" "A* "A" A A

* ПОСЛАТЬ КОМАНДУ НА ПРИНТЕР * ;* Параметры:*

;* DS:SI – указатель на строку команды. * ;* Первый байт строки содержит количество *

20-231

Листинг 7.1 (продолжение)

•* байтов команды, посылаемых на принтер. * ;******************************************

PROC OutCommandToLPTl near pusha eld

; Загрузить счетчик байтов команды в СХ lodsb

хог СХ.СХ

mov CL.AL

@@OutNextByte: lodsb

call OutCharToLPTl loop

@@OutNextByte popa ret

ENDP OutCommandToLPTl ENDS

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

СОВЕТ

В случае если принтер на вашем компьютере подключен к порту LPT2, нужно изменить номер порта в процедуре OutCharToLPTl, то есть перед вызовом прерывания поместить в регистр DX значение 1 вместо 0.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии