|
Простите, раздел пока не до конца завершен. Пока тут только протокол.
ПРОТОКОЛ СВЯЗИ С "АГАТОМ"
ВЕРСИЯ 2.
О. ВОРОНОВ
3 сигнала (кроме земли):
IBM ¦ N IBM ¦ АГАТ ¦ N АГАТА ¦ НАЗВ. ¦ НАПР.
-------+-------+-------+---------+-------+------
PE ¦ 23 ¦ DATA1 ¦ 3 ¦ DATA ¦ А->I
ACKNLG ¦ 19 ¦ DATA3 ¦ 7 ¦ CLK ¦ A->I
INIT ¦ 26 ¦ BUSY ¦ 21 ¦ ACK ¦ I->A
Gnd ¦ 2 ¦ Gnd ¦ 2 ¦ Gnd1 ¦
Gnd ¦ 18 ¦ Gnd ¦ 14 ¦ Gnd2 ¦
Номера контактов приведены по концам кабеля принтера, кото-
рый вставляется в СМ6337 (СМ6337.06), так что все номера соответ-
ствуют его контактам.
1) АГАТ -> IBM
На входе программы у "Агат"-а адрес начала блока и длина
блока (1-FFFF). Блок передаётся пакетами. В каждом пакете 256
байт данных.
"Агат" передаёт байты по битам, начиная с младшего. Сначала
выставляется на линии CLK и DATA единица (запрещено чтение для
IBM), потом после паузы 0, одновременно с этим бит данных выво-
дится на линию DATA. Опять делается пауза и т.д. После окончания
передачи последнего бита на линии CLK и DATA опять выставляется 1.
В начале пакета на всякий случай передаётся 5 байт 00, по-
том идёт синхропоследовательность A5 38 6E 3D (настройка чтения
IBM идёт по первому байту A5, затем вызывается просто процедура
чтения байта без синхронизации и сравниваются остальные 3 байта с
тем, что должно быть).
Затем идут:
- 1 байт - номер пакета в блоке (1-256, 256 передаётся как
00);
- байт-признак последнего пакета (00 - не последний, FF -
последний);
- длина пакета (1-256, 256 передаётся как 00), может быть не
равной 256 только для последнего пакета;
- 256 байт данных;
- 2 байта контрольной суммы, вычисляемой перед посылкой па-
кета; сумма вычисляется по всем байтам данных (256 или меньше), к
младшему байту ещё прибавляется номер пакета (с переносом, если
надо, в старший байт), потом к старшему байту прибавляется ещё
длина пакета (0-FF).
- в конце - 5 нулевых байт (00 00 00 00 00), которые при
чтении игнорируются;
а потом самое интересное: АГАТ выставляет на линиях CLK,
DATA значения CLK=1, DATA=0 (ожидание подтверждения), и в тече-
ние 8 тактов (когда CLK меняется на 0 и обратно переходит в еди-
ницу) читает значения с IBM-овского сигнала ACK (после установле-
ния CLK в 0). IBM должен держать ACK=1 во время приёма пакета, а
здесь он должен передать (начиная, как обычно, с младшего бита)
один из двух кодов: E6 в случае успешного приёма и D4 в случае
ошибки. Оба эти значения имеют младший бит=0. Если IBM пропусти-
ла синхробайт или часть данных и не успела отследить появление
первой комбинации "ожидание подтверждения" (CLK=1, DATA=0), на
линии останется 1 (по крайней мере в первом бите байта). IBM дол-
жна установить сигнал на линии ACK ещё во время комбинации
(CLK=1, DATA=0).
5 нулевых байт в конце нужны потому, что IBM может пропус-
тить часть бит и опоздать к передаче ответа. Нулевые байты дают
ей резерв времени, чтобы подождать, когда на линиях CLK, DATA
появится комбинация "ожидание подтверждения". IBM ещё должна тра-
тить время на вычисление контрольной суммы, так что это компенси-
рует его.
В самом конце (после чтения байта) "Агат" передаёт ещё 1 ну-
левой байт.
"Агат" передаёт блок, пока не получит сигнал подтверждения
(E6). "Агат" повторяет пакет, если пришёл ответ об ошибке или
неправильный ответ.
IBM принимает пакет; если не сошлась контрольная сумма, она
посылает отрицательный ответ; иначе:
если номер пакета меньше требуемого, посылается
подтверждение;
если номер пакета равен требуемому, он сохраняется в буфере.
IBM должна для надёжности прочитать пакет без ошибок не менее 2-х
раз (между ними может быть сколько угодно ошибочных пакетов), но
передать подтверждение (E6) только для последнего раза, иначе
"Агат" не повторит блок. Если два пакета с сошедшейся контрольной
суммой не совпали, значит, один из них компенсировал ошибку.
Снова читаются 2 (или больше) пакетов.
если номер пакета больше требуемого, мы что-то пропустили
(это почти невозможно без подтверждения), IBM должна завершить
работу с сообщением об ошибке.
|