18-25 GND Signal Ground |
_xLPT: | Base выводы 2,3,4,5,6,7,8,9 |
Status (+1) выводы 10,11,12,13,15 |
Control (+2) выводы 1,14,16,17 |
3xLPT: | $3BC $378 $278 |
$3BD $379 $279 |
$2BE $37A $27A |
2xLPT: | $378 $278 |
$379 $279 |
$37A $27A |
1xLPT: | $378 | $379 | $37A |
pas | asm |
Port[$378]:=x | mov al,x mov dx,378h out dx,al |
где x - число типа "byte" (0..255), например при посылки 170 (dec) = 10101010 (bin) на линии d0-d7 единичный сигнал будет присутствовать на выводах d1, d3, d5, d7 (обозначение выводов начинается с d0). Число 170 останется на выводах разъёма до тех пор, пока Вы не перешлёте туда же другое число (это может сделать и другая программа) или не выключите компьютер. Заметьте, что адрес порта в команде задан в шестнадцатиричном (hex) виде, а посылка - в десятиричном (dec). Если вместо команды |
Port[$378]:=170; |
Вы примените |
d:=Port[$378]; |
где d - некоторая переменная, то переменная примет значение последнего посланного в порт байта или, при переходе в режим приёма, значение байта, поданного на порт внешним устройством. |
begin
В переменной d после выполнения программы будет отображено состояние порта. Допустим, переменная вернула значение 126 (dec). В двоичном (bin) виде оно выглядит как 01111110. Младшие (правые) три бита (нулевой, первый и второй) не используются, и почти всегда равны 1, 1 и 0. Третий бит - 1, значит на ERROR высокий уровень. Та же ситуация на SELECT, Paper Empty, ACK и BUSY. |
pas | asm |
Port[$37A]:=x | mov al,x mov dx,37Ah out dx,al |
x - число типа "byte" (0..255). Нулевой бит посылает сигнал на STROBE, первый - на AUTO FEED, второй - на Initiliaze Printer, и четвёртый - на -SELECT INPUT. Принцип записи - тот же, что и по базовому адресу. Нам же очень интересны следующие биты: Пятый бит служит для разрешения/запрещения прерывания от внешнего устройства. Это полезно, если Вы умеете писать обработчики прерываний. Шестой бит служит для перевода линий d0-d7 в режим приёма. Но перед этим необходимо убедиться, что в BIOS в типе порта поставлено SPP/EPP. Вот пример программы, которая считывает бит с линий данных: begin
|
Схема обмена. |
Рассмотрим алгоритм обмена данными между двумя компьютерами
с подтверждением (справедливо для SPP-режима LPT порта). Этот процесс показан в виде диаграммы на рисунке сбоку. Пусть первый компьютер будет передающим, а второй - принимающим. В момент времени t0 (начало передачи) передающий компьютер (передатчик) выставляет данные для передачи (записывает их в порт 378h). Причём в каждом цикле обмена записывается один полубайт в регистр передачи 378h, бит 3 должен быть сброшен (= 0). Таким образом значения битов 0, 1, 2, 3 данного полубайта записываются в биты 0, 1, 2, 4 регистра передачи, а бит 3 регистра передачи равен 0. |
В момент времени t1 передатчик выставляет сигнал готовности (ACK1), который означает, что данные переданы и принимающий компьютер (приёмник) может их считать из приёмного регистра 379h. Чтобы выставить сигнал готовности нужно в бит 3 регистра передачи 378h записать 1.
В момент времени t2 приёмник определяет, что поступил сигнал готовности от передатчика и данные можно считать. Приёмник считывает данные из приёмного регистра (см. ниже) и устанавливает сигнал подтверждения приёма (ACK2). Это нужно для того, чтобы передатчик смог определить, когда можно будет посылать следующие данные. Если этого не сделать, то передатчик может послать данные в тот момент, когда приёмних их ещё не считал и это может привести к сбою передачи или приёма.
В момент времени t3 передатчик получает сигнал подтверждения приёма (ACK2) от приёмника и сбрасывает сигнал готовности (ACK1). Это нужно для того, чтобы приёмник смог сбросить свой сигнал подтверждения (ACK2). Если этого не сделать то цикл обмена будет нарушен, так как в следущем цикле обмена передатчик не будет знать принял ли приёмник данные или нет, если сигнал ACK2 будет всегда установлен.
В момент времени t4 приёмник определяет, что сигнал готовности (ACK1) сброшен и сбрасывает свой сигнал подтверждения приёма (ACK2). Таким образом завершается цикл обмена полубайтом - передатчик снова готов к передачи данных, а приёмник - к приёму.
В следующем цикле посылается другой полубайт - если посылался младший полубайт, то посылается старший и наоборот. В следующем за этим цикле обмена снова посылается младший полубайт и т.д.
При чтении данных из приёмного регистра 379h следует учитывать, что бит 7 приёмного регистра является инверсией бита 4 регистра передачи. Таким образом при чтении данных бит 7 приёмного регистра необходимо инвертировать.
При записи данных в регистр передачи 378h не следует изменять значение бита 3, так как в данном варианте алгоритма обмена он используется для других целей.