; ------------------------
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 проверяйте состояние принтера
перед печатью.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________