Программирование параллельного порта (LPT).
DOS может работать с тремя параллельными принтерами, именуемыми LPT1, LPT2, LPT3. Каждый принтер имеет по три порта: порт вывода (базовый порт), порт состояния и порт управления. Адреса портов строго не фиксированы. В области данных BIOS по адресам 0040:0008, 0040:000A, 0040:000C содержатся адреса базовых портов для LPT1, LPT2, LPT3 соответственно. Адрес порта состояния - на 1 больше базового, порта управления - еще на 1 больше.
Для обращения к регистрам LPT удобно использовать следующий алгоритм :
/*============== Получение статуса портов ==============*/
# 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;
clrscr ();
/* Проверка состояний */
printf (" Порты LPT1 = %03X, %03X, %03X\n", dataport,statusport,ctrlport );
stat= inportb ( dataport );
printf ("\ n Регистр выходных данных - ");
for ( i =7; i >=0; i --) if ((stat>> i )&1) printf ("1"); else printf ("0");
stat= inportb ( statusport );
printf ("\ n Регистр статуса - ");
for ( i =7; i >=0; i --) if ((stat>> i )&1) printf ("1"); else printf ("0");
stat= inportb ( ctrlport );
printf ("\ n Регистр управления - ");
for ( i =7; i >=0; i --) if ((stat>> i )&1) printf ("1"); else printf ("0");
}
Регистр выходных данных - это тот адрес порта, через который проходит каждый байт данных, посылаемый в принтер.
Регистр статуса сообщает различную информацию о принтере; процессор может постоянно опрашивать его, чтобы распознать момент, когда все в порядке и можно посылать данные. Регистр статуса сообщает также, что произошла ошибка на принтере.
Регистр управления инициализирует адаптер и управляет выводом данных. Он может также подготавливать параллельный порт для операций прерывания, с тем чтобы принтер посылал прерывание к процессору, когда он готов к приему очередного символа, оставляя процессор свободным для других дел.
Значения битов регистров статуса и управления:
Регистр управления:
бит 0 | 0 = нормальная установка, 1 = вызывает вывод байта данных |
1 | 0 = нормальная установка, 1 = автоматический перевод строки после возврата каретки |
2 | 0 = инициализировать порт принтера, 1 = нормальная установка |
3 | 0 = отмена выбора принтера, 1 = нормальная установка |
4 | 0 = прерывание принтера запрещено, 1 = разрешено |
5-7 | не используются |
бит 0-2 | не используются |
3 | 0 = ошибка принтера, 1 = нет ошибки |
4 | 0 = принтер off-line, 1 = принтер on-line |
5 | 0 = бумага вставлена, 1 = нет бумаги |
6 | 0 = принтер подтверждает прием символа, 1 = нормальная установка |
7 | 0 = принтер занят, 1 = принтер свободен |