- •Глава 1 Введение в семейство персональных компьютеров ibm pc
- •Глава 2 Выполнение программ
- •Глава 3 Требования языка ассемблер
- •Глава 4 Ассемблирование и выполнение программ
- •Глава 5 Определение данных
- •Глава 8 Экранные операции I: Основные свойства
- •Глава 9 Экранные операции II: Расширенные возможности
- •Глава 10 Экранные операции III: Цвет и графика
- •Глава 11 Команды обработки строк
- •Глава 12 Арифметические операции I: Обработка двоичных данных
- •Глава 13 Арифметические операции II:
- •Глава 14 Обработка таблиц
- •Глава 15 Дисковая память I: Организация
- •Глава 16 Дисковая память II: Функции базовой версии dos
- •Глава 17 Дисковая память III: Расширенные функции dos
- •Глава 18 Дисковая память IV: Функции bios
- •Глава 19 Печать
- •Глава 20 Макросредства
- •0000 Csig segment para 'Code'
- •0100 Eb 00 begin: jmp short main
- •0102 Main proc near
- •0109 Main endp
- •0109 Cseg ends
- •20.1. Напишите необходимые директивы: а) для подавления всех команд,
- •04Af в регистр cs. Комбинация этих адресов указывает на первую выполняемую
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para 'Code'
- •13D40 плюс 0000. Обратите внимание, что основная программа начинается по
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'code'
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'code'
- •Ibm Personal Computer Linker
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'Code'
- •1. Инициализирующая команда push ds заносит адрес сегмента в стек. Этот
- •010 Clear ,32768!
- •1. Наберите ассемблерную подпрограмму, сохраните ее под именем
- •Ibm Personal Computer Linker
- •Version 2.30 (c) Copyright ibm Corp. 1981, 1985
- •00000H 00011h 00012h codesg code
- •Ibm Personal Computer Basic
- •00 Указатель блока вызывающей программы
Глава 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 так, чтобы распечатываемые
строки также выводились на экран.