Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC.doc
Скачиваний:
48
Добавлен:
25.05.2014
Размер:
3.21 Mб
Скачать

Глава 19 Печать

__________________________________________________________________________

Ц е л ь: Описать возможности программ на языке ассемблера для вывода

информации на печатающее устройство (принтер).

ВВЕДЕНИЕ

________________________________________________________________

Вывод на принтер несколько проще операций с экраном и диском. Для

печати существует несколько операций, выполняющихся через DOS INT 21H и

BIOS INT 17H. Команды, посылаемые на принтер, включают коды "конец

страницы", "конец строки" и "возврат каретки".

Принтеры классифицируются по качеству печати. Матричный принтер

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

широкий форматы символов. Более совершенные матричные принтеры

обеспечивают точечную графику, наклонный шрифт, жирную печать и двойную

плотность, а также могут печатать, например, символы игральных карт и

другие алфавитно-цифровые символы. Высококачественные печатающие

устройства ограничены набором символов на сменной "ромашке" или барабане,

но обеспечивают отличное качество печати и большое разнообразие принтеров.

Многие высококачественные принтеры обеспечивают печать 10, 12 или 15

символов на дюйм, а также пропорциональное расположение пробелов,

подчеркивание, теневую и полужирную печать. Лазерные принтеры обладают

преимуществами как для матричной графики, так и для качественной печати

текстов.

Другая классификация печатающих устройств связана с интерфейсами.

Компьютеры IBM PC имеют параллельный интерфейс, позволяющий передавать

одновременно восемь битов из процессора на принтер. Кроме того, существует

последовательный интерфейс, который выполняет побитовую передачу данных.

Многие принтеры имеют буфер памяти, объемом в несколько тысяч байтов.

Принтеры также могут принимать биты контроля на четность (нечетность).

Принтеры должны "понимать" специальные сигналы из процессора, например,

для прогона листа, перевода строки или горизонтальной табуляции. В свою

очередь, процессор должен "понимать" сигналы от принтера, указывающие на

конец бумаги или состояние "занято".

К сожалению многие типы принтеров по разному реагируют на сигналы

процессора и одной из наиболее сложных проблем для программистов -

обеспечить соответствие собственных программ имеющимся печатающим

устройством.

СИМВОЛЫ УПРАВЛЕНИЯ ПЕЧАТЬЮ

________________________________________________________________

Стандартными символами управления печатью являются следующие:

Десятичн. Шест. Назначение

08 08 Возврат на шаг

09 09 Горизонтальная табуляция

10 0A Перевод строки

11 0B Вертикальная табуляция

12 0C Прогон страницы

13 0D Возврат каретки

Г о р и з о н т а л ь н а я т а б у л я ц и я. Горизонтальная

табуляция (шест. 09) возможна только на принтерах, имеющих соответствующее

обеспечение, иначе символы табуляции игнорируются. В последнем случае

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

П е р е в о д с т р о к и. Символ перевода строки (шест.OA)

используется для прогона листа на один интервал. Соответственно для печати

через два интервала используется два символа перевода строки.

П р о г о н с т р а н и ц ы. Установка бумаги после включения

принтера определяет начальную позицию печати страницы. Длина страницы по

умолчанию составляет 11 дюймов. Ни процессор, ни принтер автоматически не

определяют конец страницы. Если ваша программа продолжает печатать после

конца страницы, то произойдет переход через межстраничную перфорацию на на

чало следующей страницы. Для управления страницами необходимо подсчитывать

число напечатанных строк и при достижении максимального значения

(например, 55 строк) выдать код прогона страницы (шест.0C) и, затем,

сбросить счетчик строк в 0 или 1.

В конце печати необходимо выдать символ "перевода строки" или

"прогона страницы" для вывода на печать данные последней строки,

находящиеся в буфере печатающего устройства. Использование последнего

символа "прогон страницы" позволяет установить напечатанный последний лист

в положение для отрыва.

ФУНКЦИИ ПЕЧАТИ В РАСШИРЕННОЙ ВЕРСИИ DOS

________________________________________________________________

В операционной системе DOS 2.0 имеются файловые указатели, которые

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

Для вывода на печатающее устройство используется функция DOS шест.40 и

стандартный файловый номер 04. Следующий пример демонстрирует печать 25

символов из области HEADG:

HEADG DB 'Industrial Bicycle Mfrs', 0DH, 0AH

...

MOV AH,40H ;Запрос печати

MOV BX,04 ;Файловый номер принтера

MOV CX,25 ;25 символов

LEA DX,HEADG ;Область вывода

INT 21H ;Вызов DOS

В случае ошибки операция устанавливает флаг CF и возвращает код

ошибки в регистре AX.

ПРОГРАММА: ПОСТРАНИЧНАЯ ПЕЧАТЬ С ЗАГОЛОВКАМИ

________________________________________________________________

__________________________________________________________________________

TITLE PRTNAME (COM) Ввод и печать имен

CODESG SEGMENT PARA PUBLIC 'CODE'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H

BEGIN: JMP SHORT MAIN

; -----------------------------------------------------

NAMEPAR LABEL BYTE ;Список параметров

MAXNLEN DB 20 ; максимальная длина имени

NAMELEN DB ? ; длина введенного имени

NAMEFLD DB 20 DUP(' ') ; введенное имя

;Строка заголовка:

HEADG DB 'List of Employee Names Page '

PAGECTR DB '01',0AH,0AH

FFEED DB 0CH ;Перевод страницы

LFEED DB 0AH ;Перевод строки

LINECTR DB 01

PROMPT DB 'Name? '

; -----------------------------------------------------

MAIN PROC NEAR

CALL Q10CLR ;Очистить экран

CALL M10PAGE ;Установка номера страницы

A2LOOP:

MOV DX,0000 ;Установить курсор в 00,00

CALL Q20CURS

CALL D10INPT ;Ввести имя

CALL Q10CLR

CMP NAMELEN,00 ;Имя введено?

JE A30 ; если нет - выйти,

CALL E10PRNT ; если да - подготовить

; печать

JMP A20LOOP

A30:

MOV CX,01 ;Конец работы:

LEA DX,FFEED ; один символ

CALL P10OUT ; для прогона страницы,

RET ; возврат в DOS

MAIN ENDP

; Ввод имени с клавиатуры:

; -----------------------

D10INPT PROC NEAR

MOV AH,40H ;Функция

MOV BX,01 ; вывода на экран

MOV CX,05 ; 5 символов

LEA DX,PROMPT

INT 21H ;Вызов DOS

MOV AH,0AH ;Функция ввода с клавиатуры

LEA DX,NAMEPAR

INT 21H ;Вызов DOS

RET

D10INPT ENDP

; Подготовка для печати:

; ----------------------

E10PRNT PROC NEAR

CMP LINECTR,60 ;Конец страницы?

JB E20 ; нет - обойти

CALL M10PAGE ; да - печатать заголовок

E20: MOV CH,00

MOV CL,NAMELEN ;Число символов в имени

LEA DX,NAMEFLD ;Адрес имени

CALL P10OUT ;Печатать имя

MOV CX,01 ;Один

LEA DX,LFEED ; перевод строки

CALL P10OUT

INC LINECTR ;Увеличить счетчик строк

E10PRNT ENDP

; Подпрограмма печати заголовка:

; -----------------------------

M10PAGE PROC NEAR

CMP WORD PTR PAGECTR,3130H ;Первая страница?

JE M30 ; да - обойти

MOV CX,01 ;

LEA DX,FFEED ; нет --

CALL P10OUT ; перевести страницу,

MOV LINECTR,03 ; установить счетчик строк

M30:

MOV CX,36 ;Длина заголовка

LEA DX,HEADG ;Адрес заголовка

M40:

CALL P10OUT

INC PAGECTR+1 ;Увеличить счетчик страниц

CMP PAGECTR+1,3AH ;Номер страницы = шест.xx3A?

JNE M50 ; нет - обойти,

MOV PAGECTR+1,30H ; да - перевести в ASCII

INC PAGECTR

M50: RET

M10PAGE ENDP

; Подпрограмма печати:

; -------------------

P10OUT PROC NEAR ;CX и DX установлены

MOV AH,40H ;Функция печати

MOV BX,04 ;Номер устройства

INT 21H ;Вызов DOS

RET

P10OUT ENDP

; Очистка экрана:

; --------------

Q10CLR PROC NEAR

MOV AX,0600H ;Функция прокрутки

MOV BH,60H ;Цвет (07 для ч/б)

MOV CX,0000 ;От 00,00

MOV DX,184FH ; до 24,79

INT 10H ;Вызов BIOS

RET

Q10CLR ENDP

; Установка курсора (строка/столбец):

; ----------------------------------

Q20CURS PROC NEAR ;DX уже установлен

MOV AH,02 ;Функция установки курсора

MOV BH,00 ;Страница № 0

INT 10H ;Вызов BIOS

RET

Q20CURS ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.19.1. Постраничная печать с заголовком.

Программа, приведенная на рис.19.1, аналогична программе на рис.9.1,

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

экран, а на печатающее устройство. Каждая напечатанная страница содержит

заголовок и через двойной интервал список введенных имен в следующем виде:

List of Employee Names Page 01

Clancy Alderson

Ianet Brown

David Christie

...

Программа подсчитывает число напечатанных строк и при достижении

конца страницы выполняет прогон до начала следующей страницы. В программе

имеются процедуры:

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

E10PRNT Выводит имя на печатающее устройство (длина имени берется из

вводного списка параметров); в конце страницы вызывает процедуру

M10PAGE.

M10PAGE Выполняет прогон на новую страницу, печатает заголовок,

сбрасывает счетчик строк и увеличивает счетчик страниц на

единицу.

P100UT Общая подпрограмма для непосредственного вывода на печатающее

устройство.

В начале выполнения необходимо напечатать заголовок, но не делать

перед этим перевод страницы. Поэтому процедура M10PAGE обходит перевод

страницы, если счетчик PAGECTR содержит 01 (начальное значение). Поле

PAGECTR определено как

PAGECTR DB '01'

В начале выполнения необходимо напечатать заголовок, но не делать

перед этим перевод страницы. Поэтому процедура M10PAGE обходит перевод

страницы, если счетчик PAGECTR содержит 01 (начальное значение). Поле

PAGECTR определено как

PAGECTR DB '01'

В результате будет сгенерировано число в ASCII-коде - шест.3031. Процедура

M10PAGE увеличивает счетчик PAGECTR на 1 так, что значение становится

последовательно 3032, 3033 и т.д. Эти значения корректны до 3039, далее

следует 303A, что будет распечатано, как двоеточие (:). Поэтому, если в

правом байте поля PAGECTR появляется шест.3A, то это значение заменяется

на шест.30, а к левому байту прибавляется единица. Таким образом шест.303A

перекодируется в шест.3130, т.е. в 10 в символьном представлении.

Проверка на конец страницы до (но не после) печати имени гарантирует,

что на последней странице будет напечатано по крайней мере одно имя под

заголовком.

ПЕЧАТЬ ASCII-ФАЙЛОВ И ТАБУЛЯЦИЯ

________________________________________________________________

Табуляция, обеспечиваемая, например, видеоадаптерами, заключается в

замене одного символа табуляции (код 09) несколькими пробелами при выводе

так, чтобы следующая позиция была кратна 8. Таким образом, стандартные

позиции табуляции являются 8, 16, 24 и т.д. Многие принтеры, однако,

игнорируют символы табуляции. Поэтому, такая программа, как DOS PRINT,

предназначенная для печати ASCII файлов (например ассемблерных исходных

текстов) проверяет каждый символ, посылаемый на принтер. И, если

обнаруживается символ табуляции, то программа выдает несколько пробелов до

позиции кратной 8.

Программа, приведенная на рис.19.2, выводит на экран запрос на ввод

имени файла и, затем, печатает содержимое указанного файла. Эта программа

в отличие от приведенной на рис.17.3 (вывод файлов на экран) осуществляет

замену выводимых символов табуляции на соответствующее число пробелов. В

результате символ табуляции в позициях от 0 до 7 приводит к переходу на

позицию 8, от 8 до 15 - на 16 и т.д. Команды, реализующие данную логику,

находятся в процедуре G10XFER после метки G60. Рассмотрим три примера

обработки символа табуляции:

Текущая позиция печати: 1 9 21

Двоичное значение: 00000001 00001001 00010101

Очистка трех правых битов: 00000000 00001000 00010000

Прибавление 8: 00001000 00010000 00011000

Новая позиция: 8 16 24

В программе организованы следующие процедуры:

С10PRMP Запрашивает ввод имени файла. Нажатие только клавиши Return

приводит к завершению работы программы.

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

G10XFER Контролирует конец сектора, конец файла, конец области вывода,

символы "перевод строки" и табуляции. Пересылает обычные символы

в область вывода.

P10PRNT Распечатывает выводную строку и очищает область вывода.

R10READ Считывает сектор из дискового файла.

Коды "возврат каретки", "перевод строки" и "прогон страницы"

действительны для любых принтеров. Можно модифицировать программу для

подсчета распечатываемых строк и выполнения прогона страницы (шест.OC) при

достижении, например, строки 62.

Некоторые пользователи предпочитают устанавливать символы "прогон

страницы" в ASCII файлах с помощью текстового редактора в конкретных

местах текста, например, в конце ассемблерных процедур. Кроме того, можно

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

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

можно исключить определение и использование области вывода.

__________________________________________________________________________

TITLE PRINASK (COM) Чтение и печать дисковых записей

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H

BEGIN JMP MAIN

; ---------------------------------------------------------

PATHPAR LABEL BYTE ;Список параметров для

MAXLEN DB 32 ; ввода

NAMELEN DB ? ; имени файла

FILENAM DB 32 DUP(' ')

SECTOR DB 512 DUP(' ') ;Область ввода для файла

DISAREA DB 120 DUP(' ') ;Область вывода

COUNT DW 00

ENDCDE DW 00

FFEED DB 0CH

HANDLE DW 0

OPENMSG DB '*** Open error ***'

PROMPT DB 'Name of file? '

; ----------------------------------------------------------

MAIN PROC NEAR ;Основная программа

CALL Q10SCR ;Очистить экран

CALL Q20CURS ;Установить курсор

A10LOOP:

MOV ENDCDE,00 ;Начальная установка

CALL C10PRMP ;Получить имя файла

CMP NAMELEN,00 ;Есть запрос?

JE A90 ; нет - выйти

CALL E10OPEN ;Открыть файл,

; установить DTA

CMP ENDCDE,00 ;Ошибка при открытии?

JNE A80 ; да - повторить запрос

CALL R10READ ;Прочитать первый сектор

CMP ENDCDE,00 ;Конец файла, нет данных?

JE A80 ; да - повторить запрос

CALL G10XPER ;Распечатать сектор

A80:

JMP A10LOOP

A90: RET

MAIN ENDP

; Подпрограмма запроса имени файла:

; --------------------------------

C10PRMP PROC NEAR

MOV AH,40H ;Функция вывода на экран

MOV BX,01

MOV CX,13

LEA DX,PROMPT

INT 21H

MOV AH,0AH ;Функция ввода с клавиатуры

LEA DX,PATHPAR

INT 21H

MOV BL,NAMELEN ;Записать

MOV BH,00 ; 00 в конец

MOV FILENAM[BX],0 ; имени файла

C90 RET

C10PRMP ENDP

; Открытие дискового файла:

; ------------------------

E10OPEN PROC NEAR

MOV AH,3DH ;Функция открытия

MOV AL,00 ;Только чтение

LEA DX,FILENAM

INT 21H

JNC E20 ;Проверить флаг CF

CALL X10ERR ; ошибка, если установлен

RET

E20:

MOV HANDLE,AX ;Сохранить номер файла

MOV AX,2020H

MOV CX,256 ;Очистить пробелами

REP STOSW ; область сектора

RET

E100PEN ENDP

; Подготовка и печать данных:

; --------------------------

G10XFER PROC NEAR

CLD ;Направление слева-направо

LEA SI,SECTOR ;Начальная установка

G20:

LEA DI,DISAREA

MOV COUNT,00

G30:

LEA DX,SECTOR+512

CMP SI,DX ;Конец сектора?

JNE G40

CALL R10READ ; да - читать следующий

CMP ENDCDE,00 ;Конец файла?

JE G80 ; да - выйти

LEA SI,SECTOR

G40:

MOV BX,COUNT

CMP BX,80 ;Конец области вывода?

JB G50 ; нет - обойти

MOV [DI+BX],0D0AH ; да - записать CR/LF

CALL P10PRNT

LEA DI,DISAREA ;Начало области вывода

G50:

LODSB ;Записать [SI] в AL,

; увеличить SI

MOV BX,COUNT

MOV [DI+BX],AL ;Записать символ

INC BX

CMP AL,1AH ;Конец файла?

JE G80 ; да - выйти

CMP AL,0AH ;Конец строки?

JNE G60 ; нет - обойти,

CALL P10PRNT ; да - печатать

JMP G20

G60:

CMP AL,09H ;Символ табуляции?

JNE G70

DEC BX ; да - установить BX:

MOV BYTE PTR [DI+BX],20H ;Заменит TAB на пробел

AND BX,0FFF8H ;Обнулить правые 8 бит

ADD BX,08 ; и прибавить 8

G70:

MOV COUNT,BX

JMP G30

G80: MOV BX,COUNT ;Конец файла

MOV BYTE PTR [DI+BX],0CH ;Прогон страницы

CALL P10PRNT ;Печатать последнюю строку

G90: RET

G10XFER ENDP

; Подпрограммы печати:

; -------------------

P10PRNT PROC NEAR

MOV AH,40H ;Функция печати

MOV BX,04

MOV CX,COUNT ;Длина

INC CX

LEA DX,DISAREA

INT 21H

MOV AX,2020H ;Очистить область вывода

MOV CX,60

LEA DI,DISAREA

REP STOSW

RET

P10PRNT ENDP

; Подпрограмма чтения сектора:

; ---------------------------

R10READ PROC NEAR

MOV AH,3FH ;Функция чтения

MOV BX,HANDLE ;Номер файла

MOV CX,512 ;Длина

MOV DX,SECTOR ;Буфер

INT 21H

MOV ENDCDE,AX

RET

R10READ ENDP

; Прокрутка экрана:

; ----------------

Q10SCR PROC NEAR

MOV AX,0600H

MOV BH,1EH ;Установить цвет

MOV CX,0000 ;Прокрутка (сскроллинг)

MOV DX,184FH

INT 10H

RET

Q10SCR ENDP

; Подпрограмма установки курсора:

; ------------------------------

Q20CURS PROC NEAR

MOV AH,02 ;Функция установки

MOV BH,00 ; курсора

MOV DX,00

INT 10H

RET

Q20CURS ENDP

; Вывод сообщения об ошибке:

; -------------------------

X10ERR PROC NEAR

MOV AH,40H ;Функция вывода на экран

MOV BX,01 ;Номер

MOV CX,18 ;Длина

LEA DX,OPENMSG ;Адрес сообщения

INT 1H

MOV NDCDE,01 ;Признак ошибки

RET

X10ERR ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.19.2. Печать ASCII файла.

ПЕЧАТЬ ПОД УПРАВЛЕНИЕМ БАЗОВОЙ DOS

________________________________________________________________

Для печати в базовой версии DOS необходимо установить в регистре AH

код функции 05, а в регистр DL поместить распечатываемый символ и, затем,

выполнить команду INT 21H следующим образом:

MOV AH,05 ;Запрос функции печати

MOV DL,char ;Распечатываемый символ

INT 21H ;Вызов DOS

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

Однако, печать, обычно, предполагает вывод полной или частичной строки

текста и пошаговую обработку области данных, отформатированной по строкам.

Ниже показана программа печати полной строки. Сначала в регистр SI

загружается начальный адрес области HEADG, а в регистр CX - длина этой

области. Цикл, начинающийся по метке P20, выделяет очередной символ из

области HEADG и посылает его на принтер. Так как первый символ области

HEADG - "прогон страницы", а последние два - "перевод строки", то

заголовок печатается в начале новой страницы и после него следует двойной

интервал.

HEADG DB 0CH,'Industrial Bicycle Mfrs',0DH,0AH,0AH

LEA SI,HEADG ;Установка адреса и

MOV CX,27 ; длины заголовка

P20:

MOV AH,05 ;Запрос функции печати

MOV DL,[SI] ;Символ из заголовка

INT 21H ;Вызов DOS

INC SI ;Следующий символ

LOOP P20

Пока принтер не включен, DOS выдает сообщения "Out of paper". После

включения питания программа начинает работать нормально. Для прекращения

печати можно нажать клавиши Ctrl/Break.

СПЕЦИАЛЬНЫЕ КОМАНДЫ ПРИНТЕРА

________________________________________________________________

Выше уже был показан ряд команд, которые являются основными для

большинства печатающих устройств. Кроме того существуют следующие команды:

Десятичн. Шест.

15 0F Включить узкий формат

14 0E Включить широкий формат

18 12 Выключить узкий формат

20 14 Выключить широкий формат

Есть команды, которые распознаются по предшествующему символу Esc

(шест.1B). Некоторые из них в зависимости от печатающего устройства

представлены ниже:

1B 30 Установить плотность 8 строк на дюйм

1B 32 Установить плотность 6 строк на дюйм

1B 45 Включить жирный формат

1B 46 Выключить жирный формат

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

1. Определить команды в области данных. Следующий пример

устанавливает узкий формат, 8 строк на дюйм, затем печатает заголовок

с завершающими командами "возврат каретки" и "перевод строки":

HEADG DB 0FH, 1BH, 30H, 'Title...', 0DH, 0AH

2. Использовать команды с непосредственными данными:

MOV AH,05 ;Запрос функции печати

MOV DL,0FH ;Включить узкий формат

INT 21H

Все последующие символы будут печататься в узком формате до тех пор,

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

Приведенные команды не обязательно работают на принтерах любых

моделей. Для проверки возможных команд управления следует ознакомиться с

руководством конкретного печатающего устройства.

ПЕЧАТЬ С ПОМОЩЬЮ BIOS INT 17H

________________________________________________________________

Прерывание BIOS INT 17H обеспечивает три различные операции,

специфицированные содержимым регистра AH:

AH=0: Данная операция выполняет печать одного символа на три принтера

по номерам 0,1 и 2 (стандартное значение - 0).

MOV AH,00 ;Запрос функции печати

MOV AL,char ;Символ, выводимый на печать

MOV DX,00 ;Выбор принтера № 0

INT 17H ;Вызов BIOS

Если операция не может распечатать символ, то в регистре AH

устанавливается значение 01.

AH=1: Инициализация порта печатающего устройства:

MOV AH,01 ;Запрос на инициализацию порта

MOV DX,00 ;Выбор порта № 0

INT 17H ;Вызов BIOS

Данная операция посылает на принтер символ "прогон страницы", поэтому

ее можно использовать для установки положения "верх страницы". Большинство

принтеров выполняют данную установку автоматически при включении.

AH=2: Чтение состояние порта принтера:

MOV AH,02 ;Функция чтения состояния порта

MOV DX,00 ;Выбор порта № 0

INT 17H ;Вызов BIOS

TEST AH,00101001B; Принтер готов?

JNZ errormsg ;Нет - выдать сообщение об ошибке

Назначение функций AH=1 и AH=2 состоит в определении состояния

принтера. В результате выполнения этих функций биты регистра AH могут

устанавливаться в 1:

Бит Причина

7 Не занято

6 Подтверждение от принтера

5 Конец бумаги

4 Выбран

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

0 Таймаут

Если принтер включен, то операция возвращает шест.90 или двоичное

10010000 - принтер "не занят" и "выбран" - это нормальное состояние

готовности. В случае неготовности принтера устанавливаются бит 5 (конец

бумаги или бит 3 (ошибка вывода). Если принтер выключен, то операция

возвращает шест.B0 или двоичное 10110000, указывая на "конец бумаги".

Выполняя программу при выключенном принтере, BIOS не выдает сообщение

автоматически, поэтому предполагается, что программа должна сама проверить

и отреагировать на состояние принтера. Если программа не делает этого, то

единственной индикацией будет мигающий курсор на экране дисплея. Если в

этот момент включить принтер, то некоторые выходные данные могут быть

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

следует проверить состояние порта принтера и, если будет обнаружена

ошибка, то выдать соответствующее сообщение. (Функции DOS выполняют эту

проверку автоматически, хотя их сообщение "Out of paper" относится к

различным состояниям). После включения принтера, вывод сообщений об ошибке

прекращается и принтер начинает нормально работать без потери данных.

В процессе работы принтер может выйти за страницу или быть нечаянно

выключен. Поэтому в программах печати следует предусмотреть проверку

состояния принтера перед каждой попыткой печати.

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

________________________________________________________________

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

принтер и вставьте в него бумагу.

- Для завершении печати используйте символы "перевод строки" и

"прогон страницы" для очистки буфера принтера.

- Функции DOS для печати предусматривают вывод сообщений при

возникновении ошибки принтера. Функции BIOS возвращают только код

состояния. При использовании BIOS INT 17H проверяйте состояние принтера

перед печатью.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

________________________________________________________________

19.1. Напишите программу в расширенной версии DOS для а) прогона

страницы; б) печати вашего имени; в) перевода строки и печати вашего

адреса; г) перевода строки и печати названия вашего города/штата

(республики); д) прогона страницы.

19.2. Переделайте программу из предыдущего вопроса для базовой версии

DOS.

19.3. Закодируйте строку, в которой имеется следующая информация:

возврат каретки, прогон страницы, включение узких букв, заголовок (любое

имя) и выключение узких букв.

19.4. Измените программу из вопроса 19.1 для использования BIOS INT

17H. Обеспечьте проверку состояния принтера.

19.5. Измените программу из вопроса 19.1 так, чтобы пункты б), в), г)

выполнялись по 5 раз.

19.6. Измените программу на рис.19.1 для выполнения в базовой версии

DOS.

19.7. Измените программу на рис.19.2 так, чтобы распечатываемые

строки также выводились на экран.