Простите, раздел пока не до конца завершен. Пока тут только протокол. ПРОТОКОЛ СВЯЗИ С "АГАТОМ" ВЕРСИЯ 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 должна завершить работу с сообщением об ошибке. |