Вывод информации на печать
Определение состояния принтера, интерпретация разрядов байта, считываемого из порта состояния и передаваемого в порт управления. Виды прерываний. Возможность формирования пользователем собственных печатных символов. Порядок распечатки файла с диска.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 12.08.2011 |
Размер файла | 30,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
25
Размещено на http://www.allbest.ru/
КОНТРОЛЬНАЯ РАБОТА
ПО ДИСЦИПЛИНЕ «Вычислительные системы, сети и телекоммуникации»
Содержание
- ЗАДАНИЕ 1 Вывод на печать 3
- ЗАДАНИЕ 2 Распечатать файл с диска 22
- СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ 25
- ЗАДАНИЕ 1 Вывод на печать
Принтер является, пожалуй, самым "неудобным" периферийным устройством ПЭВМ. Это "неудобство" заключается в том, что IBM-совместимые машины комплектуются принтерами разных производителей, которые подчас отличаются друг от друга по управлению. В качестве стандарта для IBM-совместимых машин принят принтер Epson. Принтеры других фирм ориентированы на этот стандарт в той или иной степени. Во всяком случае, можно с уверенностью утверждать, что вывод символа на принтер всегда выполняется одинаково. Что же касается управления спецификациями печати, то здесь гарантировать точное совпадение нельзя, к сожалению, не гарантируется и одинаковая установка разрядов байта состояния. Мы в нашем описании и в наших программах ориентируемся на стандарт Epson.
DOS может работать с тремя параллельными принтерами, именуемыми LPT1, LPT2, LPT3. Каждый принтер имеет по три порта: порт вывода (базовый порт), порт состояния и порт управления. Адреса портов строго не фиксированы. В области данных BIOS по адресам 0040:0008, 0040:000A, 0040:000C содержатся адреса базовых портов для LPT1, LPT2, LPT3 соответственно. Адрес порта состояния - на 1 больше базового, порта управления - еще на 1 больше.
Самая первая операция, которую мы рассмотрим для принтера, - определение его состояния. Разряды байта, считываемого из порта состояния принтера, интерпретируются следующим образом:
0 |
- 2 - не используются, обычно установлены в 1; |
|
3 |
- ошибка принтера - нет/есть (0/1); |
|
4 |
- принтер подключен/не подключен (1/0); |
|
5 |
- бумага есть/нет (0/1); |
|
6 |
- принтер выводит очередной символ/готов (0/1); |
|
7 |
- принтер занят/свободен (0/1). |
При возможных расхождениях в интерпретации этого байта для разных принтеров наиболее информативен, по-видимому, бит 3, его установка в 1 говорит о готовности принтера.
Программа примера предлагает проверить байт состояния при некоторых, наиболее вероятных состояниях принтера. Для сравнения программа выдает байт стандарта Epson.
#include <dos.h>
main() {
union REGS rr;
int dataport,statusport,ctrlport; /* Номера портов */
unsigned char stat; /* Байт статуса */
int i;
/* Определение адресов портов принтера */
dataport=peek(0x40,8);
statusport=dataport+1;
ctrlport=statusport+1;
printf("Порты LPT1 = %03X, %03X, %03X\n",
dataport,statusport,ctrlport);
/* Проверка состояний */
printf("\nУстановите: принтер выключен. ");
printf("Нажмите любую клавишу\n");
getch();
stat=inportb(statusport);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((stat>>i)&1) printf("1"); else printf("0");
printf("\nEpson состояние - 11110111\n");
printf("\nУстановите: принтер offline. ");
printf("Нажмите любую клавишу\n");
getch();
stat=inportb(statusport);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((stat>>i)&1) printf("1"); else printf("0");
printf("\nEpson состояние - 01010111\n");
printf("\nУстановите: нет бумаги. ");
printf("Нажмите любую клавишу\n");
getch();
stat=inportb(statusport);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((stat>>i)&1) printf("1"); else printf("0");
printf("\nEpson состояние - 01110111\n");
printf("\nУстановите: принтер готов. ");
printf("Нажмите любую клавишу\n");
getch();
stat=inportb(statusport);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((stat>>i)&1) printf("1"); else printf("0");
printf("\nEpson состояние - 11011111\n");
}
Разряды байта, передаваемого в порт управления, интерпретируются следующим образом:
0 |
- устанавливается в 1 при передаче байта данных (строб вывода); |
|
1 |
- установка его в 1 вызывает автоматический перевод строки после возврата каретки; |
|
2 |
- нормально установлен в 0, устанавливается в 1 при инициализации порта принтера; |
|
3 |
- устанавливается в 1 при выборе принтера; |
|
4 |
- разрешает (1) прерывание принтера, используется только в программе спуллинга печати; |
|
5 - 6 |
- не используются устанавливаются в 0. |
Обычное состояние порта управления - 00001100. Перед началом работы с принтером необходимо инициализировать его порт - на 50 мсек выставить 0 в бите 2 порта управления. Действия при выводе символов на принтер должны быть следующими:
· убедиться в том, что принтер готов к выводу очередного символа (при наличии ошибок - проанализировать их, при занятости принтера - ожидать готовности);
· выдать код выводимого символа в порт вывода;
· на короткое время выставить 1 в разряде 0 порта управления;
· проанализировать состояние принтера.
Эта последовательность действий реализована в программе 8.2. Обратите внимание на то, что последовательность символов, выводимая в этой программе начинается символом с кодом 24, а заканчивается символом с кодом 10. Дело в том, что принтеры Epson (и большинство других) имеют внутренний буфер, в котором накапливаются выдаваемые на принтер коды. Символ с кодом 24 не имеет отображения на печати, это управляющий символ, который вызывает очистку буфера. Символ с кодом 10 вызывает выдачу содержимого буфера на печать и перевод строки. Если исключить последний символ, то при выполнении нашей программы на бумаге ничего не отпечатается, все выданные нами символы останутся в буфере принтера. Если исключить первый символ, то перед нашим выводом на печать могут выйти символы, возможно оставшиеся в буфере принтера от выполнения предыдущей программы.
/*========= Печать символа на принтере =============*/
#include <dos.h>
main() {
int p1,p2,p3,i; /* Номера портов */
unsigned char stat; /* Байт состояния */
/* Символы для печати (10 - перевод строки) */
char a[]={24,'a','b','c','d','e','f','g','h','i','j',10};
/* Опеределение портов */
p1=peek(0x40,8); p2=p1+1; p3=p2+1;
/* Инициализация принтера */
outportb(p3,0x08); delay(50); outportb(p3,0x0c);
/* Проверка состояния */
stat=inport(p2);
if ((stat&0x20)!=0) {
printf("Ошибка принтера. Байт состояния = %02x\n",stat);
exit();
}
for(i=0;i<12;i++) {
/* Ожидание готовности */
while ((stat&0x80)==0) stat=inport(p2);
/* Символ в базовый порт */
outportb(p1,a[i]);
/* Строб */
outportb(p3,0x0d); outportb(p3,0x0c);
/* Проверка состояния */
stat=inport(p2);
if ((stat&0x20)!=0) {
printf("Ошибка принтера. Байт состояния = %02x\n",stat);
exit();
}
}
}
В BIOS принтер обслуживается прерыванием 0x17, имеющим функции:
0 |
- вывод символа; |
|
1 |
- инициализация; |
|
2 |
- чтение состояния. |
Все три функции возвращают состояние принтера в регистре AH.
Программные примеры 1 и 2 аналогичны по выполняемым действиям двум первым, но используют прерывание 0x17.
/*== ПРИМЕР 1 ==*/
/*=========== Получение статуса принтера ============*/
#include <dos.h>
main() {
union REGS rr;
int i;
/* Проверка состояний */
printf("\nУстановите: принтер выключен. ");
printf("Нажмите любую клавишу\n");
getch();
rr.x.dx=0; /* Номер принтера - LPT1 */
rr.h.ah=2; /* Функция 2 */
int86(0x17,&rr,&rr);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((rr.h.ah>>i)&1) printf("1"); else printf("0");
printf("\n\nУстановите: принтер offline. ");
printf("Нажмите любую клавишу\n");
getch();
rr.x.dx=0; rr.h.ah=2; int86(0x17,&rr,&rr);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((rr.h.ah>>i)&1) printf("1"); else printf("0");
printf("\n\nУстановите: нет бумаги. ");
printf("Нажмите любую клавишу\n");
getch();
rr.x.dx=0; rr.h.ah=2; int86(0x17,&rr,&rr);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((rr.h.ah>>i)&1) printf("1"); else printf("0");
printf("\n\nУстановите: принтер готов. ");
printf("Нажмите любую клавишу\n");
getch();
rr.x.dx=0; rr.h.ah=2; int86(0x17,&rr,&rr);
printf("Состояние принтера - ");
for (i=7; i>=0; i--)
if ((rr.h.ah>>i)&1) printf("1"); else printf("0");
}
/*== ПРИМЕР 2 ==*/
/*============ Печать символа на принтере ===========*/
#include <dos.h>
main() {
union REGS rr;
unsigned char stat; /* Байт состояния */
/* Символы для печати */
char a[]={24,'a','b','c','d','e','f','g','h','i','j',10};
int i;
/* Инициализация принтера */
rr.x.dx=0; /* Номер принтера - LPT1 */
rr.h.ah=1; /* Функция 1 */
int86(0x17,&rr,&rr);
stat=rr.h.ah;
/* Проверка состояния */
if ((stat&0x08)!=0) {
printf("Ошибка принтера. Байт состояния = %02x\n",stat);
exit();
}
for(i=0;i<12;i++) {
/* Ожидание готовности */
while ((stat&0x80)==0) {
rr.x.dx=0; /* Номер принтера - LPT1 */
rr.h.ah=2; /* Функция 2 */
int86(0x17,&rr,&rr);
stat=rr.h.ah;
}
/* Вывод символа */
rr.x.dx=0; /* Номер принтера - LPT1 */
rr.h.ah=0; /* Функция 0 */
rr.h.al=a[i];
int86(0x17,&rr,&rr);
/* Проверка состояния */
if ((rr.h.ah&0x08)!=0) {
printf("Ошибка принтера. Байт состояния = %02x\n",stat);
exit();
}
}
}
В DOS имеется функция 5, которая интегрирует в себе операции по управлению, выводу и анализу состояния. Те же действия программируются при помощи функции DOS следующим образом (пример 3):
/*== ПРИМЕР 3 ==*/
/*============= Печать символа на принтере ==========*/
#include <dos.h>
main() {
union REGS rr;
/* Символы для печати */
char a[]={24,'a','b','c','d','e','f','g','h','i ','j',10};
int i;
for(i=0;i<12;i++) {
rr.h.ah=5; /* Функция 5 DOS */
rr.h.dl=a[i];
intdos(&rr,&rr);
}
}
Кроме того, с принтером в DOS связан стандартный файл печати stdprn. Для вывода на принтер можно использовать функцию файлового вывода 0x40, указывая для нее номер файла - 4.
Некоторые коды или последовательности кодов интерпретируются принтером не как коды символов, подлежащих отображению на бумаге, а как управляющие коды. Они используются для выполнения принтером специальных действий и управления спецификациями печати. Наиболее интересный из этих кодов - код 0x1B (27) или Esc. Появление этого кода интерпретируется принтером как начало целой управляющей последовательности. (Esc-последовательности принтера в отличие от клавиатуры и терминала обрабатываются не драйвером ANSI, а аппаратурой принтера). Следующий за Esc код задает тип действия, далее могут следовать еще несколько байт, количество которых зависит от действия. В примере 4 продемонстрированы некоторые режимы печати, устанавливаемые при помощи управляющих кодов и Esc-последовательностей. (Этот и следующие примеры не исчерпывают возможностей управления принтером при помощи управляющих кодов и Esc-последовательностей. Для получения полного представления о них следует обратиться к техническому описанию принтера.) Обратите внимание на последовательность 27, 64, названную в комментариях инициализацией. Не следует путать эту инициализацию с инициализацией порта, о которой шла речь выше. Esc-последовательность инициализации обеспечивает установку всех спецификаций печати в те значения, которые они имеют по умолчанию. Для выдачи управляющих последовательностей (как и печатаемых символов) можно использовать средства BIOS, DOS, а также любые средства, имеющиеся в применяемом языке программирования. Мы в этом и следующих примерах применяем функцию Турбо-Си putc.
/*== ПРИМЕР 4 ==*/
/*========== Управляющие коды режимов печати ========*/
#include <stdio.h>
#define prt(x) putc(x,stdprn);
main() {
/* Инициализация */__ _.prt(27); prt(64);
/* Обычный режим */
fprintf(stdprn,"Default mode\n");
/* Режим двойной ширины */
prt(14);
fprintf(stdprn,"Set double width mode\n");
prt(20);
fprintf(stdprn,"Close double width mode\n");
/* Режим плотной печати */
prt(15);
fprintf(stdprn,"Set empassed mode\n");
prt(18);
fprintf(stdprn,"Close empassed mode\n");
/* Режим подчеркивания */
prt(27); prt(0x2d); prt(1);
fprintf(stdprn,"Set underline mode\n");
prt(27); prt(0x2d); prt(0);
fprintf(stdprn,"Close underline mode\n");
/* Режим двойной жирности */
prt(27); prt(0x45);
fprintf(stdprn,"Set double strike mode\n");
prt(27); prt(0x46);
fprintf(stdprn,"Close double strike mode\n");
/* Режим верхних индексов печати */
prt(27); prt(0x53); prt(0);
fprintf(stdprn,"Set superscript mode\n");
prt(27); prt(0x54);
fprintf(stdprn,"Close superscript mode\n");
/* Режим нижних индексов печати */
prt(27); prt(0x53); prt(1);
fprintf(stdprn,"Set subscript mode\n");
prt(27); prt(0x54);
fprintf(stdprn,"Close subscript mode\n");
}
Отдельный программный пример иллюстрирует интересную возможность формирования пользователем собственных печатных символов. Образы выводимых символов хранятся в ПЗУ принтера, но в принтере есть еще и ОЗУ, в которое могут быть загружены образы, созданные пользователем. Образ формируется на сетке высотой 8 и шириной 11 точек. В памяти образ представляется в двоичном виде, причем один байт описывает один столбец образа. Сформировав двоичный образ символа, следует записать его в ОЗУ, для чего используется Esc-последовательность вида:
· 0x1B, 0x26, 0 - задание действия "загрузка шрифта в ОЗУ";
· <начальный код>, <конечный код> - одной последовательностью можно загрузить в ОЗУ несколько образов, каждому из которых присваивается свой код в ОЗУ;
· <байт описатель> - младший полубайт содержит ширину символа, в старшем 0 в старшем разряде означает, что при печати весь образ сдвигается на 1 точку вниз;
· 11 байт описания образа.
Теперь для печати такого оригинального символа следует переключить принтер на ОЗУ (последовательность 0x1B, 0x25, 1) и выдать на принтер код символа в ОЗУ. Для обратного переключения на ПЗУ выдается последовательность 0x1B, 0x25, 0.
Программа следующего примера использует технику, часто применяемую в драйверах русского текста (образы букв кириллицы необязательно есть в ПЗУ принтера). Программа загружает в ОЗУ принтера образ перевернутой буквы "a" под номером 40 и перехватывает вектор прерывания 0x17. Хотя в main-функции используются для печати функции Турбо-Си, все операции печати сводятся к этому прерыванию. Обработчик прерывания прежде всего анализирует функцию прерывания. Для функций 1 и 2 он вызывает старый обработчик. Для функции 0 (вывод символа) анализируется код символа в регистре AL. Если это код "a", то обработчик переключает принтер на ОЗУ, выводит код 40 и переключает принтер обратно на ПЗУ. Любой другой код обработчик выводит из ПЗУ.
/*== ПРИМЕР5 ==*/
/*============== Загружаемый шрифт ==============*/
#include <dos.h>
#include <stdio.h>
void interrupt (* old17)();
void interrupt h17();
int p1,p2,p3; /* Номера портов принтера */
#define prt(x) putc(x,stdprn)
#define byte unsigned char
/*==== main ====*/
main() {
char *st[]={ /* Текст для печати */
"He's a real Nowhere Man,",
"Sitting in his Nowhere Land,",
"Making all his nowhere plan for nobody." ;
byte esct[]= { /* Esc-последовательность */
27, 38, 0, /* Начало загрузки шрифта */
40, 40, /* Номера начального и конечного кодов */
0x8a, /* Ширина символа - 0a и сдвиг 80 */
/* Образ символа */
32,28,34,42,42,42,42,42,16,0,0 };
int i;
prt(27); prt(64); /* Инициализация принтера */
/* Выдача Esc-последовательности */
for (i=0; i<17; prt(esct[i++]));
p1=peek(0x40,8); p2=p1+1; p3=p2+1; /* Опр.портов */
/* Подключение к вектору 17 */
*old17=getvect(0x17); setvect(0x17,h17);
/* Печать текста */
for(i=0;i<3; fprintf(stdprn,"%s\n",st[i++]));
setvect(0x17,old17); /* Восстановление вектора */
prt(27); prt(64); /* Инициализация принтера */
}
/*==== Обработчик 17-го прерывания ====*/
void interrupt h17() {
if (_AH==0) { /* Вывод символа */
if (_AL=='a') { /* Символ "a" - особая обработка */
/* Esc-послед. переключения на шрифт ОЗУ. */
ownchar(27); ownchar(0x25); ownchar(1);
/* Печать символа ОЗУ с кодом 40 */
ownchar(40);
/* Esc-послед. переключения на шрифт ПЗУ. */
ownchar(27); ownchar(0x25); ownchar(0);
}
else ownchar(_AL); /* Печать символа не "a". */
}
else (*old17)(); /* Старый обработчик */
}
/*==== Печать одного символа ====*/
ownchar(byte f) {
byte stb; /* Байт состояния */
/* Ожидание готовности */
stb=0; while ((stb&0x80)==0) stb=inport(p2);
outportb(p1,f); /* Вывод символа */
outportb(p3,0x0d); outportb(p3,0x0c); /* Строб */
}
Напрашивается мысль о том, что матричный принтер можно заставить выводить на печать не только символы, но и любые изображения, и такая возможность действительно имеется - это использование принтера в графическом режиме. При печати в графическом режиме за один проход каретки печатается строка (полоса) высотой 8 точек. Таким образом, графическое изображение составляется из таких строк-полос. Размер битового образа одной строки в памяти (в байтах) равен ширине строки (в точках). Каждый байт образа описывает один столбик изображения высотой в 8 и шириной в 1 точку (старший разряд байта соответствует верхней точке изображения). Для выдачи образа на печать следует выдать на принтер такую Esc-последовательность:
· первые 3 байта задают переключение принтера в графический режим и всегда одинаковы: 0x1B, 0x2A, 0;
· два следующих байта содержат число n - размер (в байтах) графического образа, причем первым следует младший байт этого числа;
· далее выдается побайтно графический образ, принтер выводит на печать в графическом режиме n выдаваемых ему байт.
В примере 8.8 приведена программа, которая строит изображение на экране, а затем выводит на принтер его твердую копию. Для нас здесь представляет интерес функция prtgraph, обеспечивающая вывод твердой копии (разобраться в функции paint, строящей изображение на экране, читатель сможет, ознакомившись с главой, посвященной видеоадаптеру).
Параметрами функции prtgraph являются экранные координаты левого верхнего и правого нижнего углов того окна экрана, копию которого следует вывести на печать, и код цвета, которым построено изображение. Поскольку изображение будет выводиться построчно, следует обеспечить, чтобы строки на печати располагались плотно, без промежутков между ними, этому удовлетворяет расстояние между строками 25/216 дюйма, которое устанавливается специальной Esc-последовательностью. Определяется ширина окна, размер битового образа будет равен этой ширине, в соответствии с этим выделяется память для размещения битового образа, заодно размер образа заносится в третий и четвертый байты Esc-последовательности установки графического режима. Формирование образа происходит построчно: последовательно считываются (функцией 0x0D прерывания 0x10, см. раздел 9.7) точки первой строки экранного обpаза; x-координата внутри окна опеределяет номер байта печатного образа, y-координата - номер формируемого разряда в этом байте. Если точка на экране имеет заданный цвет, то в соответствующий разряд заносится 1. (Мы считываем образ по строкам, и это соответствует представлению графической информации в видеоадаптере, но вы можете организовать и считывание образа по вертикали.) Когда очередные 8 строк экранного образа будут считаны и преобразованы в образ печати, информация выводится на принтер - вначале заголовок Esc-последовательности, а затем сам образ, после чего начинается формирование следующей строки образа для печати. Поскольку высота заданного окна не обязательно кратна 8, после перебо- ра всех экранных строк может остаться невыведенным на печать образ печатной строки, высота которого менее 8 точек. Этот образ выводится после выхода из цикла.
/*== ПРИМЕР 6 ==*/
/*======== Работа принтера в графическом режиме ========*/
#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <alloc.h>
#define prt(x) putc(x,stdprn);
union REGS rr;
main() {
int col=4; /* Цвет - красный */
paint(col); /* Построение картинки */
getch();
prtgraph(1,1,80,80,col); /* Вывод на принтер */
}
/* Построение картинки (из окружностей) */
paint(int col) {
int x,y,fy,fx,k;
/* Установка графического режима */
rr.x.ax=0x0010; int86(0x10,&rr,&rr);
/* Построение контуров */
for (x=-24; x<=24; x++) {
y=(int)sqrt((double)(576-x*x));
point(x+32,32-y,col); point(x+32,32+y,col);
}
for (x=-12; x<=12; x++) {
y=(int)sqrt((double)(144-x*x));
point(x+20,32+y,col); point(x+44,32-y,col);
}
for (x=-4; x<=4; x++) {
y=(int)sqrt((double)(16-x*x));
point(x+20,32-y,col); point(x+20,32+y,col);
point(x+44,32+y,col); point(x+44,32-y,col);
}
/* Закрашивание */
for (fx=-24; fx<=24; fx++) {
fy=(int)sqrt((double)(576-fx*fx)); x=fx+32;
for (k=0, y=32-fy; y<=32+fy; y++) {
rr.x.dx=y; rr.x.cx=x; rr.h.bh=0;
rr.h.ah=0x0d; int86(0x10,&rr,&rr);
if ((rr.h.al==col)&&((y!=32)||(x==32))) k=1-k;
if (k) point(x,y,col);
}
}
}
/* Вывод одной графической точки */
point(int x, int y, int c) {
rr.x.dx=y; rr.x.cx=x; rr.h.bh=0; rr.h.al=c;
rr.h.ah=0x0c; int86(0x10,&rr,&rr);
}
/*----------------------------------------------------*/
/* Графическая копия экрана.
(x1,y1),(x2,y2) - координаты окна, c - цвет */
prtgraph(int x1, int y1, int x2, int y2, int c) {
char *str; /* Графический образ строки для печати */
char *s;
int strsize; /* Размер образа */
char esc[] = /* Начало Esc-послед.графической печати */
{ 27,42,0,0,0 };
int x,y; /* Экранные координаты */
int bit; /* Счетчик разрядов в образе */
int i;
/* Инициализация принтера */
prt(27); prt(64);
/* Установка расстояния между строк */
prt(27); prt(51); prt(25);
/* Выделение памяти для образа */
strsize=x2-x1+1; str=malloc(strsize);
for (s=str, i=0; i<strsize; i++, s++) *s=0;
/* Запись размера образа в Esc-послед. */
esc[3]=strsize%256; esc[4]=strsize/256;
/* Перебор строк */
for (bit=7, y=y1; y<=y2; y++) {
/* Перебор точек в строке */
for (s=str, x=x1; x<=x2; x++, s++) {
/* Чтение точки */
rr.x.dx=y; rr.x.cx=x; rr.h.bh=0;
rr.h.ah=0x0d; int86(0x10,&rr,&rr);
/* Если цвет точки совпадает -
заносится 1 в соответствующий разряд образа */
if (rr.h.al==c) *s|=(1<<bit);
}
if (--bit<0) {
/* Если сформированы 8 разрядов образа, то:
выводится начало Esc-последовательности, */
for(i=0;i<5;i++) prt(esc[i]);
/* выводится образ и обнуляется, */
for (i=0, s=str; i<strsize; i++,s++) {
prt(*s); *s=0;
}
prt(10); /* перевод строки */
bit=7;
}
}
/* Если не весь образ выведен - вывод остатка */
if (bit<7) {
for (i=0; i<5; i++) prt(esc[i]);
for (i=0, s=str; i<strsize; i++,s++) prt(*s);
prt(10);
}
/* Инициализация принтера */
prt(27); prt(64);
ЗАДАНИЕ 2 Распечатать файл с диска
принтер байт символ печатный
Параллельные порты используются в первую очередь для подключения принтеров, хотя встречаются и другие устройства, например переносные жесткие диски, которые могут подключаться к этим портам. Базовые средства DOS и BIOS для работы с параллельными портами аналогичны соответствующим средствам для работы с последовательными портами: DOS инициализирует стандартное устройство PRN, соответствующее первому порту LPT1, которое может быть переопределено командой MODE, и предоставляет прерывание для вывода в это устройство.
Функция DOS 05h -- Вывод символа в стандартное устройство PRN
Ввод: |
АН = 05h DL = символ |
Кроме того, можно пользоваться функцией записи в файл или устройство, поместив в ВХ число 4, соответствующее устройству PRN. BIOS, в свою очередь, предоставляет базовый набор из трех функций для работы с принтером.
INT 17h, АН = 00 -- Вывести символ в принтер
Ввод: |
АН = 00h AL = символ DX = номер параллельного порта (00 -- LPT1, 01 -- LPT2, 02 -- LPT3) |
|
Вывод: |
АН = состояние принтера: бит 7: принтер не занят бит 6: подтверждение бит 5: нет бумаги бит 4: принтер в состоянии on-line бит 3: ошибка ввода-вывода бит 0: тайм-аут |
INT 17h, АН = 01 -- Выполнить аппаратный сброс принтера
Ввод: |
АН = 01h DX = номер порта (00h -- 02h) |
|
Вывод: |
АН = состояние принтера |
INT 17h, AH = 02 -- Получить состояние принтера
Ввод: |
АН = 02h DX = номер порта (00h - 02h) |
|
Вывод: |
АН = состояние принтера |
Например, чтобы распечатать содержимое экрана на принтере, можно написать такую программу:
; prtscr.asm
; распечатать содержимое экрана на принтере
;
.model tiny
.code
.186 ; для команды push 0B800h
org 100h ; начало СОМ-файла
start:
mov ah,1
mov dx,0 ; порт LPT1
int 17h ; инициализировать принтер,
cmp ah,90h ; если принтер не готов,
jne printer_error ; выдать сообщение об ошибке,
push 0B800h ; иначе:
pop ds ; DS = сегмент видеопамяти в текстовом режиме
xor si,si ; SI = 0
mov cx,80*40 ; CX = число символов на экране
cld ; строковые операции вперед
main_loop:
lodsw ; AL - символ, АН - атрибут, SI = SI + 2
mov ah,0 ; АН - номер функции
int 17h ; вывод символа из AL на принтер
loop main_loop
ret ; закончить программу
printer_error:
mov dx,offset msg ; адрес сообщения об ошибке в DS:DX
mov ah,9
int 21h ; вывод строки на экран
ret
msg db "Принтер на LPT1 находится в состоянии offline или занят$"
end start
Чтобы распечатать экран в текстовом режиме на LPT1, достаточно всего лишь одной команды INT 05h, что в точности эквивалентно нажатию клавиши PrtScr.
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
Бэрри Н. Компьютерные сети. Пер. с англ. - М.: БИНОМ. - 1995. - 400с.
Джамса К., Лалани С., Уикли С. Программирование в WWW для профессионалов. - Минск. - Попурри. - 1997. - 631 с.
Кент П. World Wide Web: Пер. с англ.. - М.: Компьютер. - 1996. - 311 с.
Кулаков Ю.А. Компьютерные сети. - Киев. - 1998. - 384 с.
Компьютерные сети. Принципы, технологии, протоколы/В.Г. Олифер, Н.А. Олифер. - СПб: Питер, 2001. - 672с.
Максимов Н.В., Партыка Т.Л., Попов И.И. Технические средства информатизации: Учебник. - М.: ФОРУМ: ИНФРА-М, 2005. - 576с.: ил. - (Профессиональное образование)
Милославская Н.Г., Толстой А.И. Интрасети: доступ в Internet. Защита: Учеб. пособие для вузов. - М.: ЮНИТИ - ДАНА, 200, 527с.
Колесников Internet: для пользователя. - К.: Издательская группа BHV, 2000.-304с.
Новомлинский Л. Интернет - торговля. Часть 1/ Сети и системы связи. 1998 - №8.
Новомлинский Л. Интернет - торговля. Часть 2/ Сети и системы связи. 1998 - №9.
Пятибратов А.П. Вычислительные машины, сети и телекоммуникации/ Пятибратов А.П., Гудыно Л.П. - М.: Финансы и статистика. - 1998. - 400 с.
Сеть Internet. Применение в науке и бизнесе/ Горностаев Ю.М. и др. - М.: Россия - 1994. - 136 с.
Сеть Internet./ Горностаев Ю.М. и др. - М.: Россия. - 1993. - 88 с.
Сорокин Л. Аукционы в Интернате - будущее электронной коммерции//Мир электронной коммерции. - 2000. - №1.
Информатика: Учебник. - 3-е перераб. изд. / Под ред. проф. Н.В. Макаровой. - М.: Финансы и статистика, 2000. - 768 с.: ил.
Размещено на Allbest.ru
Подобные документы
Исследование приемов управления работой печатающих устройств в MS-DOS. Изучение принципа действия матричного принтера, механизма печати литер, команд, позволяющих осуществить вывод символов на печать. Анализ реализации программных кодов на языке BASIC.
курсовая работа [825,7 K], добавлен 23.06.2011Особенности подключения принтера по интерфейсу Centronics в PC. Назначение его сигналов. Расширения параллельного порта. Оконечные цепи линий интерфейса IEEE 1284. Запись и чтение данных в регистры Control, Status и Data. Внутреннее устройство LPT порта.
реферат [220,7 K], добавлен 28.04.2010Ознакомление с приемами управления работой печатающих устройств в MS-DOS. Формирование новых символов для матричного принтера, разработка команд загрузки символов в оперативную память принтера и программы, реализующей процесс печати заданных символов.
курсовая работа [1,2 M], добавлен 22.06.2011Подсистема управления процессами и потоками вычислительной системы. Формирование новых символов для матричного принтера, разработка команд для загрузки символов в оперативную память принтера и программы, реализующей процесс печати заданных символов.
курсовая работа [201,1 K], добавлен 23.06.2011Приемы управления работой печатающих устройств в MS-DOS. Формирование новых символов для матричного принтера. Разработка команд для их загрузки в оперативную память данного устройства. Подбор программы, реализующей процесс печати заданных символов.
курсовая работа [814,6 K], добавлен 29.06.2011Аппаратное обеспечение компьютера. Процесс обработки информации. Вывод информации на печать. Основные типы принтеров: матричные, струйные, лазерные. Их достоинства и недостатки. Определение объема видеопамяти. Создание программы на алгоритмическом языке.
контрольная работа [109,8 K], добавлен 13.04.2015Распределение оперативной памяти фиксированными, динамическими и перемещаемыми разделами. Распределение с использованием внешней памяти. Принципы рaботы матричного принтера. Проектирование символов и разработка программы, реализующей их вывод на печать.
курсовая работа [241,3 K], добавлен 01.07.2011Процедура ввода исходных данных в программу, вывод результатов работы программы на экран. Принцип организации хранения логически связанных наборов информации в виде файлов. Параметры характеристики файла, способы обращения к нему, соглашения по типу.
реферат [14,5 K], добавлен 06.12.2011Участие регистров ввода-вывода в работе периферийных устройств. Отражение состояния периферийных устройств в состоянии разрядов регистров состояния. Перечень имен и номеров регистров ввода-вывода, управления и состояния микроконтроллеров разных типов.
курсовая работа [171,2 K], добавлен 22.08.2010Создание программы на языке C++, обеспечивающей ввод исходной информации, ее обработку, реализацию алгоритма имитации процесса и выдачу необходимой информации. Разработка имитационной модели очереди с разнотипными заявками (модели работы порта).
курсовая работа [563,8 K], добавлен 13.09.2012