Вывод информации на печать

Определение состояния принтера, интерпретация разрядов байта, считываемого из порта состояния и передаваемого в порт управления. Виды прерываний. Возможность формирования пользователем собственных печатных символов. Порядок распечатки файла с диска.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.