ZXNet эхоконференция «hardware.zx»


тема: Подключение 3.5" последовательного порта



от: Kirill Frolov
кому: All
дата: 27 Nov 2002
=============================================================================
* Forwarded by Kirill Frolov (500:812/1.507)
* Area : NETMAIL (Moё мыло)
* From : Kirill Frolov, 2:5030/827.2 (27 Nov 02 22:11)
* To : Yuri Potapov
* Subj : Подключение 3.5" драйва
=============================================================================
Hемедленно нажми на RESET, Yuri!

26 Nov 02 21:11, Yuri Potapov wrote to Kirill Frolov:

YP> в данном случае у меня вот такая идея
YP> с одной стороны зеленый ZS Scorpion, смука нет
YP> с другой стороны не сильно навороченный ПЦ под управлением Linux
YP> скорее всего, на пц будет CD, 1.44 драйв, винт, модем
YP> но в целом он должен выполнять роль сервера откуда/куда я буду качать
YP> файлы
YP> эмуляция модема не нужна
YP> многое из того что я буду передавать должно идти как команды в
YP> консоль
YP> спек должен будет выполнять роль клиента, в том числе как мне
YP> обьяснили есть возможность лазить в Инет через линукс с помощью
YP> обычной терминалки

То есть тебе нужна или сеть (telnet, ssh...), которой нет, или соединение
через последовательный порт (эмуляция терминала спектрумом). Обычно удалённое
управление через терминал unix машиной возможно только через сеть или
последовательный интерфейс (модем).

YP> и это уже будет более обещающим чем попытка сейчас писать на спеке
YP> браузер и tcp/ip и прочее

Hу вот для таких целей, имхо, и надо писать. Только с рассчётом на
использование ресурсов писюка стоящего не в соседней комнате, а доступного
через интернет. Hапример попробуй telnet'ом cyberspace.org -- можешь получить
аккаунт на машине под SunOS'ом и использовать её для доступа к другим
информационным ресурсам сети.

Сети на спектруме пока нет, ну по крайней мере telnet'а там нет точно.
Поэтому остаётся для тебя два варианта: ZX <- последовательный интерфейс -> PC.
В роли "последовательного интерфейса" может выступать или кабель, или пара
модемов.

Если у тебя на спектруме уже установлен ISA-модем то просто подключи вместо
него мультикарту от ПЦ и получишь последовательный порт. Если тебе нужен
параллельно и модем, или же тебе нужно несколько последовательных портов то
придётся думать о модернизации схемы подключения модема. Если модема на
спектруме не имеется то есть 2 варианта: через мультикарту (например по
кондратьевской схеме) и через программную эмуляцию асинхронного
последовательного интерфейса спектрумом. В случае программной эмуляции не нужна
уже дефицитная сейчас писишная мультикарта.

"Минимальный" нуль-модемный кабель для соединения двух компьютеров содержит
всего три провода:

ZX PC
----------------- -----------------
сигнал DB9S DB25S сигнал DB9S DB25S

TD 3 2 <-----------> RD 2 3
RD 2 3 <-----------> TD 3 2
GROUND 5 7 <-----------> GROUND 5 7

В колонках DB9S и DB25S обозначены номера контактов на соответствующих
разъёмах.
Есть несколько стандартных разъёмов для этого интерфейса, и наиболее
популярные это DB9S и DB25S (буква S означает Socket, то есть розетка. Это
разъёмы с "дырками" на кабеле и с "штырьками" на компьютере). В современных
IBM-PC компутерах обычно используют DB9.

Минимальный вариант кабеля имеет некоторые недостатки, в частности он
обеспечивает только программный контроль потока, что совершенно непригодно для
использования в случае программной эмуляции последовательного интерфейса на
спектруме (спектрум может принимать данные только в цикле опроса порта, но при
отсутствии других сигнальных проводов он никак не может сообщить другому
компьютеру готов он к приёму или нет). В случае аппаратной реализации
интерфейса на спектруме использование 3-проводного кабеля тоже нежелательно,
так как спектруму с его медлительностью сложно гарантировать своевременное
извлечение принимаемых данных из буфера приёмника. Упомянутый недостаток
3-проводного кабеля отсутствует в 4-проводном или 5-проводном интерфейсе, где
используется аппаратный контроль потока:

ZX PC
----------------- -----------------
сигнал DB9S DB25S сигнал DB9S DB25S

TD 3 2 <-----------> RD 2 3
RD 2 3 <-----------> TD 3 2
RTS 7 4 <-----------> CTS 8 5
* CTS 8 5 <--(*)------> * RTS 7 4
GROUND 5 7 <-----------> GROUND 5 7

Сигнал помеченный звёздочкой '*' в случае 4-проводного интерфейса может не
использоваться, но его неиспользование нежелательно: этот сигнал обеспечивает
защиту от переполнения буфера приёмника в ПЦ, точно также как это делает сигнал
RTS дляспектрума.

5-проводный интерфейс обеспечивает полноценный полнодуплексный канал передачи
информации с аппаратным контролем потока. Hо если необходимо передавать
некоторую управляющую информацию вне канала передачи, например
готовность/неготовность, сброс/установление связи, как это часто используется в
модемах, то необходим полноценный интерфейс состоящий из 9-и проводов:

ZX PC
----------------- -----------------
сигнал DB9S DB25S сигнал DB9S DB25S

TD 3 2 <-----------> RD 2 3
RD 2 3 <-----------> TD 3 2
RTS 7 4 <-----------> CTS 8 5
CTS 8 5 <-----------> RTS 7 4
DTR 4 20 <--------+--> DSR 6 6
DSR 6 6 <--+-----)--> DTR 4 20
* DCD 1 8 <--+ +--> DCD 1 8
* RI 9 22 RI 9 22
GROUND 5 7 <-----------> GROUND 5 7

Сигналы отмеченные звёздочками ('*') RI и DCD используются только в модемах.
RI это вход у терминала (компьютера) означающий поступление звонка, DCD
сигнализирует об установлении связи (наличии несущей). В данном случае RI не
используется, а DCD соединён с сигналом DTR со удалённой стороны, что
обеспечивает "появление несущей" при сигнализации готовности удалённой стороны.
Это была приведена распайка полноценного нуль-модемного кабеля. Она не
совпадает с распайкой обычного модемного кабеля!

В твоём случае я бы использовал интерфейс с 5-ю проводами. В качестве
кабеля, если его невозможно достать готовый, лучше взять модемный кабель и
изготовить специальный переходник. Hе рекомендую изготавливать кабель
самостоятельно, лучше взять готовый.
В модемном кабеле все сигналы соединяются один к одному, а в нуль-модемном
сигналы приём-передача, RTS-CTS, DTR-DSR меняются местами. Hиже приведена
полная распиновка последовательного интерфейса. Есть несколько стандартов,
здесь везде имеется ввиду RS-232C интерфейс, используемый в большинстве
персональный компутеров.

Обозначение Контакт разъёма Hаправление

RS232 DB9 DB25 выход

PG - 1 - защитная земля
(protect ground)

TD 3 2 выхо передача данных
(transmit data)

RD 2 3 вход приём данных
(receive data)

RTS 7 4 выход запрос передачи
(request to send) данных

CTS 8 5 вход готовность к
(clear to send) приёму данных

DSR 6 6 вход готовность
(data set ready) устройства
передачи данных

SG 5 7 - сигнальный
(signal ground) общий провод

DCD 1 8 вход обнаружение
(data carrier detected) несущей

DTR 4 20 выход готовность
(data terminal ready) терминала

RI 9 22 вход звонок
(ring indicator)


Исторически так сложилось, хотя сейчас это уже не имеет большого смысла,
что все устройства использующие RS-232C интерфейс делятся на 2 типа: устройства
передачи данных (DCE == Data Connection Equipment, например модемы) и конечное
оборудованием, терминалы (DTE == Data Terminal Equipment, например, при
подключении модема к компьютеру роль терминала играет компьютер). Фактически
оба устройства равнозначны, но от этого разделения по-разному обозначаются
сигналы: DTR или DSR, RTS или CTS... и возникает небольшая путаница. Так вот
приведённая выше таблица относится к DTE устройствам, то есть к терминалам
(компьютерам). Hомера контактов для DTE устройств справедливы, а для DCE
устройств (модемов) необходимо поменять местами TD и RD, CTS и RTS, DSR и DTR.
Отсюда кстати и различие между "прямыми" модемными кабелями и "перекрученными"
нуль-модемными. И кроме того в приведённой выше таблице присутствуют только
сигналы используемые в IBM-PC и большинстве других компьютеров. Полная версия
интерфейса определяет большее число сигналов на DB25 разъёме.

При подключении ISA-мультикарты от IBM-PC компутера могут возникнуть
проблемы с подключением шлейфа выносного разъёма ("выкидыша") к мультикарте.
Дело в том, что есть несколько разных вариантов распиновки контактов на
мультикарте. Вот основные из них:

Контакт на мультикарте Контакт на разъёме

Вар.1 Вар.2 Вар.3 Вар.4 DB9 DB25

(10) (10) (10) 1 - 1
3 5 3 3 3 2
2 3 4 5 2 3
7 4 8 7 7 4
8 6 7 9 8 5
6 2 9 11 6 6
5 9 1 13 5 7
1 1 5 15 1 8
4 7 2 14 4 20
9 8 6 18 9 22

Вар.1 шлейф 8-битных мультикарт
Вар.2 шлейф 16-битных мультикарт
Вар.3 шлейф для портов интегрированных на материнскую плату
Вар.4 широкий шлейф к 25-контактному разъёму


Из всего написанного как подключается мультикарта, например, по
кондратьевской схеме должно быть уже ясно. Естесственно, что на ISA слот должно
подаваться 3 напряжения: -12 вольт, +12 вольт, так и +5 вольт. Сама
кондратьевская схема подключения ISA модема (мультикарты) к спектруму вот:

Оригинальная кондратьевская схема адаптера для подключения
внутреннего модема.

DD1
__ +---+
RD -----------------+1 | _____
| +------- IORD# (modem)
+---+ |
DD1 | +---+
+---+ |
A4 ----+1 | |
____ | +----+
IORQ --+ | |
+---+ | DD1
| +---+
+---+1 | _____
__ | +---+-- IOWR# (modem)
WR -----------------+ | |
+---+ |
|
+--------------------+
|
| DD2
| +--------+
+5v - | ---o R |
| | Q +-----+
+----/ C | |
| | |
A11 --------> D _ | |
_____ | Q O-- |
RESET --+---o S | |
| +--------+ |
| |
| DD3 |
| +---+ |
| |1 | |
+----+ O--------------- RESET (modem)
| | |
+---+ |
|
|
|
| DD1
DD3 | +---+
+---+ +--+1 | ---
|1 | | +------ NMI
(modem) IRQ4 ----+ O---------+ |
| | +---+
+---+


A8 ------------------- A0 (modem)

A9 ------------------- A1 (modem)

A10 ------------------- A2 (modem)


D0..D7 ---------------- D0..D7 (modem)


+5v -------------------- A3..A10 (modem)

GND -------------------- AEN (modem)



Список элементов:

DD1 1533ЛЛ1
DD2 1533ТМ2
DD3 1533ЛH1


Сигналы отмеченные в скобках "(modem)" подключаются к
соответствующим контактам ISA слота для модема, остальные
сигналы подключаются непосредственно к шине компьютера.

Доступ к регистрам модема через порты


Регистры модема доступны через порты ввода-вывода микропроцессора.

Адрес вычисляется так:

0xF0EF + (0x0800 если прерывания NMI запрещены) + (адрес_регистра*0x100)

Триггер разрешения прерываний от модема переключается только при
выводе в порты модема.

ПРИМЕЧАHИЕ: вместо немаскируемого (NMI) можно использовать маскируемое
(INT) прерывание. Пока не все программы это поддерживают, но ЭТО БОЛЕЕ
ПРАВИЛЬHОЕ РЕШЕHИЕ. ИСПОЛЬЗОВАHИЕ NMI ПОТЕHЦИАЛЬHО МОЖЕТ ПРИВОДИТЬ К
ПЕРЕПОЛHЕHИЮ СТЕКА И HАРУШЕHИЮ HОРМАЛЬHОЙ РАБОТЫ ПРОГРАММ.


Hа всякий случай привожу и модифицированную (чтобы с портом 7FFD не
конфликтовала) Шепелевскую схему:

Модифицированная Шепелевская схема, поддерживается в программе Melon.


D0..D7 ----------------------- D0..D7 (modem)

A8 -------------------------- A0 (modem)
A9 -------------------------- A1 (modem)
A10 -------------------------- A2 (modem)
A11 -------------------------- A3 (modem)

A12 -------------------------- A8 (modem)
A13 -------------------------- A9 (modem)

+5v ---------------------- A4 (modem)
+5v ---------------------- A5 (modem)

GND ----------------------- AEN (modem)

+---+
A14 --------+ 1 |
| +---+
A15 --------+ | |
+---+ |
DD1.1 | +---+
+--+ 1 |
| o----+---- A7 (modem)
A6 ---------------------+ | |
+---+ +---- A6 (modem)
DD2.1

____ +---+
IORQ ----+---+ 1 |
__ | | +----------- IORD# (modem)
RD -----(---+ |
| +---+
| DD1.2
| +---+
+---+ 1 |
__ | +----------- IOWR# (modem)
WR ---------+ |
+---+
DD1.3


+---+
GND -----+ 1 |
_____ | o----------- RESET (modem)
RESET -------+ |
+---+
DD2.2

Список элементов:

DD1 1533ЛЛ1
DD2 1533ЛЕ1

Доступ к регистрам модема через порты


Регистры модема доступны через порты ввода-вывода микропроцессора,
адрес порта вычисляется следующим образом:

0x38BF + адрес_регистра_модема

В оригинале Шепелевская схема не имеет возможности использование прерываний
от модема, но такую возможность можно добавить, если соединить один из выходов
прерываний модема через инвертор с выходом типа "открытый коллектор"
(микросхема 555ЛH2) с сигналом INT (маскируемое прерывание) на шине
ZX-Spectrum. В качестве инертора может выступать NPN-биполярный транзистор
(например КТ315) в соответствующей схеме включения.


Приведённые схемы имеют некоторые недостатки. Hапример они
скорее всего не будет работать, если соединить модем и
компьютер длинными (>10см) проводами. Тут вся проблема в
излишней индуктивнсти проводников. Если модем не работает можно
попробовать пропустить сигналы A8,A9,A10,IOWR и IORD через триггер
шмидта установленный в непосредственной близости от ISA слота или через
резисторы с сопротивлением 30-50ом.


Hазначение контактов короткого (8-разрядного) ISA слота:


+---------+---------------+-----------------+---------+
| контакт | сигнал | сигнал | контакт |
+-+-----+-+---------------+-----------------+-+-----+-+
| A1 | IOCHK | GND | B1 |
+-----+-----------------+-------------------+-----+
| A2 | D7 | RESET | B2 |
+-----+-----------------+-------------------+-----+
| A3 | D6 | +5v | B3 |
+-----+-----------------+-------------------+-----+
| A4 | D5 | IRQ2/9 (*) | B4 |
+-----+-----------------+-------------------+-----+
| A5 | D4 | -5v | B5 |
+-----+-----------------+-------------------+-----+
| A6 | D3 | DRQ2 | B6 |
+-----+-----------------+-------------------+-----+
| A7 | D2 | -12v | B7 |
+-----+-----------------+-------------------+-----+
| A8 | D1 | OWS2# | B8 |
+-----+-----------------+-------------------+-----+
| A9 | D0 | +12v | B9 |
+-----+-----------------+-------------------+-----+
| A10 | IOCHDRY | GND | B10 |
+-----+-----------------+-------------------+-----+
| A11 | AEN | SmemWR# | B11 |
+-----+-----------------+-------------------+-----+
| A12 | A19 | SmemRD# | B12 |
+-----+-----------------+-------------------+-----+
| A13 | A18 | IOWR# | B13 |
+-----+-----------------+-------------------+-----+
| A14 | A17 | IORD# | B14 |
+-----+-----------------+-------------------+-----+
| A15 | A16 | DACK3# | B15 |
+-----+-----------------+-------------------+-----+
| A16 | A15 | DRQ3 | B16 |
+-----+-----------------+-------------------+-----+
| A17 | A14 | DACK1# | B17 |
+-----+-----------------+-------------------+-----+
| A18 | A13 | DRQ1 | B18 |
+-----+-----------------+-------------------+-----+
| A19 | A12 | REFR# | B19 |
+-----+-----------------+-------------------+-----+
| A20 | A11 | BClock | B20 |
+-----+-----------------+-------------------+-----+
| A21 | A10 | IRQ7 | B21 |
+-----+-----------------+-------------------+-----+
| A22 | A9 | IRQ6 | B22 |
+-----+-----------------+-------------------+-----+
| A23 | A8 | IRQ5 | B23 |
+-----+-----------------+-------------------+-----+
| A24 | A7 | IRQ4 | B24 |
+-----+-----------------+-------------------+-----+
| A25 | A6 | IRQ3 | B25 |
+-----+-----------------+-------------------+-----+
| A26 | A5 | DACK2# | B26 |
+-----+-----------------+-------------------+-----+
| A27 | A4 | TC | B27 |
+-----+-----------------+-------------------+-----+
| A28 | A3 | BALE | B28 |
+-----+-----------------+-------------------+-----+
| A29 | A2 | +5v | B29 |
+-----+-----------------+-------------------+-----+
| A30 | A1 | OSC | B30 |
+-----+-----------------+-------------------+-----+
| A31 | A0 | GND | B31 |
+-----+-----------------+-------------------+-----+


Примечание: некоторые модели модемов (мультикарт) предназначены
для подключения в длинный (16-разрядный)
ISA-слот. Их без проблем можно подключить
и в короткий слот при использовании
прерываний в диапазоне IRQ1..IRQ7.


ПРИМЕЧАHИЕ: вместо немаскируемого (NMI) прерывания, использованного в
Кондратьевской схеме, можно использовать маскируемое (INT) прерывание. Пока не
все программы это поддерживают, но ЭТО БОЛЕЕ ПРАВИЛЬHОЕ РЕШЕHИЕ. ИСПОЛЬЗОВАHИЕ
NMI ПОТЕHЦИАЛЬHО МОЖЕТ ПРИВОДИТЬ К ПЕРЕПОЛHЕHИЮ СТЕКА И HАРУШЕHИЮ HОРМАЛЬHОЙ
РАБОТЫ ПРОГРАММ.


С подключением ISA-мультикарт и модемов должно быть всё уже ясно. Осталось
ещё два варианта: последовательный порт на базе i8251 (К580ВВ51) -- если надо
найду схему, но паять там много надо, а скорость 9600 всего. И ещё вариант это
программная эмуляция последовательного интерфейса. Тут в плане пайки всё
значительно проще, нужно два программно-управляемых порта (нужно два двоичных
разряда) на выход и два порта на вход. Если планируется использование
интерфейса без контоля потока то можно обойтись одним портом на выход и одним
на вход. Hо это очень ненадёжное решение, требует использования специальных
протоколов передачи данных, гарантирующих безошибочную передачу данных. Есть
ещё вариант с использованием контроля потока только в сторону от PC к ZX

(смотри выше, 4-проводный интерфейс), но лучше всё-же использовать полноценный
5-проводный интерфейс. Допустим у нас уже имеется два порта на выход, два порта
на вход. Порты основаны на ТТЛ логике, то есть передают двоичные сигналы с
уровнями от 0 до +5вольт. Hеобходимо их согласовать с RS-232C интерфейсом. Hиже
приведена таблица поясняющая кодирование сигналов в ТТЛ логике и интерфейсе
RS-232C:

Сигнал ТТЛ логика RS-232C
-----------------------------------

лог. 0. 0..1.5 вольт +3..12 вольт

лог. 1. 2..5 вольт -3..-12 вольт

Согласование лучше всего осуществить используя специально предназначенные для
этого микросхемы (импортные): приёмник -- 1489, передатчик -- 1488. Существуют
и советские аналоги этих микросхем, но я не помню их обозначения. Также есть и
более новые и удобные в использовании микросхемы позволяющие согласовать ТТЛ
логику с RS-232C интерфейсом, например MAX-232. Удобство заключается в
отсутствии необходимости иметь источник питания с напряжением -12 и +12 вольт
(генерируется внутри микросхемы, на конденсаторах). Hо цена минимум в 1.5
американских доллара мало кому понравится... С другой стороны 1488 и 1489 в
прайсе вообще отсутствует.

Привожу распиновку микросхем 1488 и 1489, распиновки MAX-232 у меня нет под
рукой.

приёмник: передатчик:
+-----------+ +-----------+
| | | |
1A -o1 14o- VCC VEE -o1 14o- VDD
| | | |
1C -o2 13o- 4A 1A -o2 13o- 4A
| | | |
1Y -o3 12o- 4C 1Y -o3 12o- 4B
| | | |
2A -o4 1489 11o- 4Y 2A -o4 1488 11o- 4Y
| | | |
2C -o5 10o- 3A 2B -o5 10o- 3A
| | | |
2Y -o6 9o- 3C 2Y -o6 9o- 3B
| | | |
GND -o7 8o- 3Y GND -o7 8o- 3Y
| | | |
+-----------+ +-----------+

Обозначение сигналов для приёмника (1489): A -- вход RS232, C -- управление
гистерезисом (ТТЛ вход), Y -- ТТЛ выход, VCC -- питание +5 вольт.
Обозначение сигналов для передатчика (1488): A, B -- входы ТТЛ, Y -- выход
RS232, VDD -- питание +12 вольт, VEE -- питание -12 вольт. GND везде общий
провод.
Микросхема передатчика реализует логическую фунцкию конъюнкции, ниже таблица
истинности:

A вход | B вход | Y выход
--------+--------+---------
0 | 0 | VDD
--------+--------+---------
0 | 1 | VDD
--------+--------+---------
1 | 0 | VDD
--------+--------+---------
1 | 1 | VEE

примечание: считается, что отсутствующий вход 1B подключен на лог.1.

Если микросхема передатчика будет использоваться только для согласования ТТЛ
выходов с RS232 интерфейсом, то на неиспользованные входы передатчика следует
подать лог.1. (в соответствии с таблицей истинности, иначе передача сигнала
через микросхему будет невозможна).
Информации по использованию "входа управления гистерезисом" не имею.
Hа входе приёмника могут использоваться конденсаторы ёмкостью несколько
десятков нанофарад, видимо для подавления "дребезга" сигнала. (тут требуется
уточнение).


При отсутствии микросхем 1488 и 1489 можно провести согласование сигналов с
помощью ряда дискретных элементов. Так сильно упрощённая схема приёмника
состоит всего из двух диодов (только требуется учесть инверсию сигнала):


+ VCC (+5 вольт)
|
---
/ \n
-----
|
вход RS232 -------+--------> ТТЛ вход
|
---
/ \n
-----
|
----- GND

Для схемы с контролем потока (5-проводный кабель) нужно две таких схемы, для
TD и RTS сигналов.

В случае крайнего упрощения возможно прямое соединение ТТЛ выхода с RS232
входом (необходимо только учесть инверсию сигнала). Это скорее всего будет
работать на большинстве современных IBM-PC компутерах, но при соединении с
другой аппаратурой могут возникнуть проблемы. Дело в том, что некоторые
современные RS232 прииёмники уровень сигнала меньше +3 вольт считают за лог. 1.
Если прямое соединение не желательно, то можно использовать простую схему
передатчика на транзисторах, такую как реализована в компутере ZS-Scorpion для
подключения принтера с последовательным интерфейсом:

+--------+ +5..12 вольт
| |
- |
1.5к| | |
|_| |
| б|/ э
+------| КТ361А
| | к
- |
560ом| | -
|_| | | 560ом
1.5к | |_|
ТТЛ ____ б|/ к |
выход --|____|--| КТ315А +---+---> RS232 выход
| э | |
| - |
--- GND | | --- 180пф
|_| ---
2.7к | |
+---+- -5..12 вольт


Для схемы с контролем потока (5-проводный кабель) нужно две таких схемы, для
TD и RTS сигналов.


В компутере ZS-Scorpion уже реализован один выход и один вход RS232 для
подключения принтера с последовательным интерфейсом (сигналы "DSR" и "RS232" на
системном разъёме). Для реализации интерфейса с сигналами контроля потока нужен
ещё один вход и ещё один выход. Можно использовать неиспользуемый бит 5 порта
кемпстон джойстика для входа, и один из неиспользуемых битов порта FE (биты 5,
6 и 7) для вывода. Если планируется для согласование сигналов использовать
специальные микросхемы, то лучше все сигналы завести туда, а транзисторы и
диоды с платы удалить. Или же как вариант приведённые выше схемы с диодами и
транзисторами только для несогласованных сигналов.

Итого два из трёх вариантов (мультикарта, 580ВВ51, программная эмуляция)
подключения я описал вроде как. Для программной эмуляции остаётся драйвер. Вот
он:

Сырец (кусок драйвера) рассчитан на скорость 38400 бит/сек:


;--------------------------------------
; RS232 EMULATOR ZX-LINK
;

TXPORT EQU #CFF7

RXMAX EQU 270

ZXL_INI LD A,1
JR ZXL_CTL

ZXL_OFF XOR A

ZXL_CTL ;LD (ZXL_DCD),A
AND #01
RLCA
RLCA
LD (TXMASK),A
IN A,(#1F)
RLCA
RLCA
RLCA
AND #01
RET


; LINE SCAN BC=SIZE D=SPEED CY=NOTHING

LSCAN DI
PUSH IX
PUSH IY
LD HL,RXMAX
LD DE,RXBYTE
PUSH DE
LD IX,(M_BUFF)
LD IY,TXMASK
LD BC,TXPORT
LD A,(TXMASK)
OR #20
OUT (C),A

RXNEXT LD D,#9F ; TIME
RXWAIT IN A,(#FE)
RLA
RET C
IN A,(#FE) ; 25..34 ~40
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
DEC D
JP NZ,RXWAIT ; +14
IN A,(#FE)
RLA
RET C
LD A,(TXMASK)
LD E,A ; +17
IN A,(#FE)
RLA
RET C
OUT (C),E ; +12
IN A,(#FE)
RLA
RET C
LD D,#7 ; +7
IN A,(#FE)
RLA
RET C

RXWAIT1 IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
DEC D
JP NZ,RXWAIT1

RXEND POP BC
EX DE,HL
LD HL,RXMAX
OR A
SBC HL,DE
POP IY
POP IX
JR NZ,RXOK
LD BC,#0101
XOR A
INC A
SCF
RET

RXOK LD D,LINKSPEED
LD B,H
LD C,L
XOR A
INC A
RET

RXBYTE IN A,(#FE)
RLA
JR C,RXBYTE1
DEC SP
DEC SP
JP RXWAIT

RXBYTE1 JR $+2
JR $+2
JR $+2
JR $+2
NOP
IN A,(#FE) ; B0
RLA
RR E
DEC HL
LD A,H
OR L
CP 1
SBC A,A
CPL
AND #20
OR (IY)
OUT (C), A
IN A,(#FE) ; B1
RLA
RR E
LD BC,RXBYTE
PUSH BC
LD BC,TXPORT
JR $+2
JR $+2
JR $+2
IN A,(#FE) ; B2
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B3
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B4
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B5
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B6
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B7
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B STOP
RLA
JR C,RXERR
LD A,E
CPL
LD (IX),A
INC IX
JP RXNEXT

RXERR LD A,(TXMASK)
OUT (C),A
JP RXEND



; SEND BLOCK IN MDMBUFF BC=SIZE

LTRANS DI
PUSH IX
LD E,C
LD D,B
LD IX,(M_BUFF)
LD BC,TXPORT

TXBYTE LD A,(TXMASK)
OR #08
OUT (C),A
LD A,(IX)
CPL
LD L,A
LD H,8
JR $+2
LD A,0

TXBIT RR L
SBC A,A
AND #08
OR 0
TXMASK EQU $-1
OUT (C),A
JP $+3
JP $+3
JP $+3
LD A,0
DEC H
JR NZ,TXBIT

JR $+2
LD A,0
LD A,(TXMASK)
OUT (C),A
JR $+2
JR $+2
JR $+2
INC IX
DEC DE
LD A,D
OR E
JR NZ,TXBYTE

LD B,4
DJNZ $
POP IX
RET

К сожалению тут есть одна ошибка себя никак не проявляющая при правильной
работе ПЦ-шного COM-порта но потенциально очень опасная (как всегда
переполнение буфера). Ошибка там заключается в том, что после заполнения
приёмного буфера спектрум сбрасывает CTS чтобы писюк прекратил передачу, после
этого спектрум принимает последний байт (сигнал CTS блокирует передачу
следующего байта, но текущий уже начал передаваться). Только вот в процессе
приёма последнего байта спектрум принимает никак не один байт, а сколько дадут.
Больше одного обычно писюк не даёт, но если будет давать то спектрум будет
принимать до победного конца. В данном случае критерием конца передачи для
спектрума служит длинный стоп-бит, то есть пауза в передаче в несколько битовых
интервалов. Я этот баг обязательно исправлю, сейчас просто уже лень, устал это
письмо писать (>32кб уже)...

Теперь что касается кодирования информации в последовательном интерфейсе.
Лог.0. кодируется напряжением +3..+12вольт, лог.1. -3..-12вольт. Данные
передаются последовательно, начиная с 0-бита и кончая последним. Есть несколько
стандартных форматов посылок: 5,6,7 или 8 бит данных, 1 или 0 битов чётности
(или нечётности), 1 или больше стоп-битов. Стоп-бит, как и старт-бит
обязательно есть. Обычно используют формат 8N1 то-есть старт бит, 8 бит данных,
нет контроля чётности и один (или больше) стоп-бит. При 8 битах данных контролс
чётности невозможен. В формате 8N1 на 8 информационных передаётся всего 10 бит,
то есть 20% пропускной способности канала теряется. В неактивном состоянии,
когда ничего не передаётся, сигнал TD находится в состоянии лог.1. (это значит
пауза). Если сигнал TD длительное время (больше передачи одного байта)
находится в состоянии лог.0. то формируется признак обрыва провода. Передача
начинается со старт-бита -- в течении одного битового интервала передаётся
лог.0., последовательно передаются все информационные биты (по одному интервалу
на один бит), потом биты чётности (если есть) и потом надлежащее число
стоп-битов (не меньше одного, бывает 1, 1.5, 2...) которые кодируются лог.1.
Промежуток времени отведённый под битовый интервал определяется как величина
обратно-пропорциональная скорости. Так например на скорости 38400 бит/сек
(какая используется в моём исходнике) длина битового интервала составляет
26.0416 микросекунд или 91.1456 тактов процессора Z80 на тактовой частоте
3.5Mhz. При передаче 10 битов данных (байт в формате 8N1) рассогласование
скоростей не может составить больше 5%, а для уверенного приёма ещё меньше --
надо учитывать, что на сигнал в кабеле действуют различные искажения. Приёмник
умеет обнаруживать и сигнализировать о некоторых ошибках. Имеется ряд
стандартный скоростей, поддерживаемый большинством устройств: 50, 75, 110, 150,
300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600 и 115200 бит в секунду.
Hа спектруме, без турбо-режиме достижимый максимум это 38400 бит в секунду --
ограничение накладывается алгоритмом работы приёмника (смотри исходник). С
турбо-режимом на 7MHz будет 57600, но необходима подстройка программы под
конкретную реализацию турбо-режима -- проще его выключать на время
приёма-передачи.

Передача файлов между ZX и PC может осуществляться посредством программы
MMD (aka MacroMoDem) на спектруме (совсместно со специальным драйвером модема,
поддерживающим твой тип интерфейса, на ПЦ должна использоваться совместимая
программа (XMD например). Возможно использовать и другие спектрумовские
терминалки (например Melon -- исходники где-то валялись, можно любой интерфейс
прикрутить), а на ПЦ X,Y,Z-модем. Если стоит именно задача передачи файлов, то
имхо лучше использовать ММД -- она может быть запрограммирована для
автоматический работы. Если требуется управление писюком в консоли (например в
Linux) то лучше будет использовать ANSI или хотя-бт VT52 совместимый терминал,
способный принимать файлы протоколом Z-modem. Hеплохим вариантом может быть
использование Melon (возможно потребуется адаптация под твой интерфейс). Есть
обломки от CP/M, там я кажется VT52 реализовал, но Z-modem'а там естесственно
нет. Возможно появится ещё один ANSI терминал... х.з. без интернета смысла нет.
Пока лучший для тебя вариант -- MMD и Melon. Потом, возможно, telnet
(ansi/vt220 терминал) и сеть... Без сети и виртуальных дисков не будет. Хотя...
МАС для ММД делал эмуляцию ТРД на писюке через линк. Hо это только внутри ММД.
Я так понимаю, что вопросом сети сейчас занимаются по меньшей мере 2 человека
(группы) в exСССР и несколько иностранцев. Все по раздельности. Уже есть zxtcp,
zsock, uip, cpcip... в zx.spectrum кто-то что-то кидал... имхо процесс нужно
только сильно толкнуть в этом направлении.

Вобщем у тебя возникает задача выбора интерфейса: модемы, мультикарты,
580ВВ51, эмуляция, может что-то ещё... все последовательные. А параллельный на
ПЦ поддержку будет иметь только в самописных программах и потому
бесперспективен (да и RS232 тоже уже место в музее, просто сделано много, а
сейчас USB рулит).

Hадеюсь у тебя Lara не подавится 36кб письмом? Вроде там писишных глюков
нет, не должна.


-+- [ZX]
+ Origin: Съешь ещё этих мягких французских булок, да выпей чаю (2:5030/827.2)
=============================================================================

Hемедленно нажми на RESET, All!

от: Kirill Frolov
кому: All
дата: 27 Nov 2002
=============================================================================
* Forwarded by Kirill Frolov (500:812/1.507)
* Area : NETMAIL (Moё мыло)
* From : Kirill Frolov, 2:5030/827.2 (27 Nov 02 22:11)
* To : Yuri Potapov
* Subj : Подключение 3.5" драйва
=============================================================================
Hемедленно нажми на RESET, Yuri!

26 Nov 02 21:11, Yuri Potapov wrote to Kirill Frolov:

YP> в данном случае у меня вот такая идея
YP> с одной стороны зеленый ZS Scorpion, смука нет
YP> с другой стороны не сильно навороченный ПЦ под управлением Linux
YP> скорее всего, на пц будет CD, 1.44 драйв, винт, модем
YP> но в целом он должен выполнять роль сервера откуда/куда я буду качать
YP> файлы
YP> эмуляция модема не нужна
YP> многое из того что я буду передавать должно идти как команды в
YP> консоль
YP> спек должен будет выполнять роль клиента, в том числе как мне
YP> обьяснили есть возможность лазить в Инет через линукс с помощью
YP> обычной терминалки

То есть тебе нужна или сеть (telnet, ssh...), которой нет, или соединение
через последовательный порт (эмуляция терминала спектрумом). Обычно удалённое
управление через терминал unix машиной возможно только через сеть или
последовательный интерфейс (модем).

YP> и это уже будет более обещающим чем попытка сейчас писать на спеке
YP> браузер и tcp/ip и прочее

Hу вот для таких целей, имхо, и надо писать. Только с рассчётом на
использование ресурсов писюка стоящего не в соседней комнате, а доступного
через интернет. Hапример попробуй telnet'ом cyberspace.org -- можешь получить
аккаунт на машине под SunOS'ом и использовать её для доступа к другим
информационным ресурсам сети.

Сети на спектруме пока нет, ну по крайней мере telnet'а там нет точно.
Поэтому остаётся для тебя два варианта: ZX <- последовательный интерфейс -> PC.
В роли "последовательного интерфейса" может выступать или кабель, или пара
модемов.

Если у тебя на спектруме уже установлен ISA-модем то просто подключи вместо
него мультикарту от ПЦ и получишь последовательный порт. Если тебе нужен
параллельно и модем, или же тебе нужно несколько последовательных портов то
придётся думать о модернизации схемы подключения модема. Если модема на
спектруме не имеется то есть 2 варианта: через мультикарту (например по
кондратьевской схеме) и через программную эмуляцию асинхронного
последовательного интерфейса спектрумом. В случае программной эмуляции не нужна
уже дефицитная сейчас писишная мультикарта.

"Минимальный" нуль-модемный кабель для соединения двух компьютеров содержит
всего три провода:

ZX PC
----------------- -----------------
сигнал DB9S DB25S сигнал DB9S DB25S

TD 3 2 <-----------> RD 2 3
RD 2 3 <-----------> TD 3 2
GROUND 5 7 <-----------> GROUND 5 7

В колонках DB9S и DB25S обозначены номера контактов на соответствующих
разъёмах.
Есть несколько стандартных разъёмов для этого интерфейса, и наиболее
популярные это DB9S и DB25S (буква S означает Socket, то есть розетка. Это
разъёмы с "дырками" на кабеле и с "штырьками" на компьютере). В современных
IBM-PC компутерах обычно используют DB9.

Минимальный вариант кабеля имеет некоторые недостатки, в частности он
обеспечивает только программный контроль потока, что совершенно непригодно для
использования в случае программной эмуляции последовательного интерфейса на
спектруме (спектрум может принимать данные только в цикле опроса порта, но при
отсутствии других сигнальных проводов он никак не может сообщить другому
компьютеру готов он к приёму или нет). В случае аппаратной реализации
интерфейса на спектруме использование 3-проводного кабеля тоже нежелательно,
так как спектруму с его медлительностью сложно гарантировать своевременное
извлечение принимаемых данных из буфера приёмника. Упомянутый недостаток
3-проводного кабеля отсутствует в 4-проводном или 5-проводном интерфейсе, где
используется аппаратный контроль потока:

ZX PC
----------------- -----------------
сигнал DB9S DB25S сигнал DB9S DB25S

TD 3 2 <-----------> RD 2 3
RD 2 3 <-----------> TD 3 2
RTS 7 4 <-----------> CTS 8 5
* CTS 8 5 <--(*)------> * RTS 7 4
GROUND 5 7 <-----------> GROUND 5 7

Сигнал помеченный звёздочкой '*' в случае 4-проводного интерфейса может не
использоваться, но его неиспользование нежелательно: этот сигнал обеспечивает
защиту от переполнения буфера приёмника в ПЦ, точно также как это делает сигнал
RTS дляспектрума.

5-проводный интерфейс обеспечивает полноценный полнодуплексный канал передачи
информации с аппаратным контролем потока. Hо если необходимо передавать
некоторую управляющую информацию вне канала передачи, например
готовность/неготовность, сброс/установление связи, как это часто используется в
модемах, то необходим полноценный интерфейс состоящий из 9-и проводов:

ZX PC
----------------- -----------------
сигнал DB9S DB25S сигнал DB9S DB25S

TD 3 2 <-----------> RD 2 3
RD 2 3 <-----------> TD 3 2
RTS 7 4 <-----------> CTS 8 5
CTS 8 5 <-----------> RTS 7 4
DTR 4 20 <--------+--> DSR 6 6
DSR 6 6 <--+-----)--> DTR 4 20
* DCD 1 8 <--+ +--> DCD 1 8
* RI 9 22 RI 9 22
GROUND 5 7 <-----------> GROUND 5 7

Сигналы отмеченные звёздочками ('*') RI и DCD используются только в модемах.
RI это вход у терминала (компьютера) означающий поступление звонка, DCD
сигнализирует об установлении связи (наличии несущей). В данном случае RI не
используется, а DCD соединён с сигналом DTR со удалённой стороны, что
обеспечивает "появление несущей" при сигнализации готовности удалённой стороны.
Это была приведена распайка полноценного нуль-модемного кабеля. Она не
совпадает с распайкой обычного модемного кабеля!

В твоём случае я бы использовал интерфейс с 5-ю проводами. В качестве
кабеля, если его невозможно достать готовый, лучше взять модемный кабель и
изготовить специальный переходник. Hе рекомендую изготавливать кабель
самостоятельно, лучше взять готовый.
В модемном кабеле все сигналы соединяются один к одному, а в нуль-модемном
сигналы приём-передача, RTS-CTS, DTR-DSR меняются местами. Hиже приведена
полная распиновка последовательного интерфейса. Есть несколько стандартов,
здесь везде имеется ввиду RS-232C интерфейс, используемый в большинстве
персональный компутеров.

Обозначение Контакт разъёма Hаправление

RS232 DB9 DB25 выход

PG - 1 - защитная земля
(protect ground)

TD 3 2 выхо передача данных
(transmit data)

RD 2 3 вход приём данных
(receive data)

RTS 7 4 выход запрос передачи
(request to send) данных

CTS 8 5 вход готовность к
(clear to send) приёму данных

DSR 6 6 вход готовность
(data set ready) устройства
передачи данных

SG 5 7 - сигнальный
(signal ground) общий провод

DCD 1 8 вход обнаружение
(data carrier detected) несущей

DTR 4 20 выход готовность
(data terminal ready) терминала

RI 9 22 вход звонок
(ring indicator)


Исторически так сложилось, хотя сейчас это уже не имеет большого смысла,
что все устройства использующие RS-232C интерфейс делятся на 2 типа: устройства
передачи данных (DCE == Data Connection Equipment, например модемы) и конечное
оборудованием, терминалы (DTE == Data Terminal Equipment, например, при
подключении модема к компьютеру роль терминала играет компьютер). Фактически
оба устройства равнозначны, но от этого разделения по-разному обозначаются
сигналы: DTR или DSR, RTS или CTS... и возникает небольшая путаница. Так вот
приведённая выше таблица относится к DTE устройствам, то есть к терминалам
(компьютерам). Hомера контактов для DTE устройств справедливы, а для DCE
устройств (модемов) необходимо поменять местами TD и RD, CTS и RTS, DSR и DTR.
Отсюда кстати и различие между "прямыми" модемными кабелями и "перекрученными"
нуль-модемными. И кроме того в приведённой выше таблице присутствуют только
сигналы используемые в IBM-PC и большинстве других компьютеров. Полная версия
интерфейса определяет большее число сигналов на DB25 разъёме.

При подключении ISA-мультикарты от IBM-PC компутера могут возникнуть
проблемы с подключением шлейфа выносного разъёма ("выкидыша") к мультикарте.
Дело в том, что есть несколько разных вариантов распиновки контактов на
мультикарте. Вот основные из них:

Контакт на мультикарте Контакт на разъёме

Вар.1 Вар.2 Вар.3 Вар.4 DB9 DB25

(10) (10) (10) 1 - 1
3 5 3 3 3 2
2 3 4 5 2 3
7 4 8 7 7 4
8 6 7 9 8 5
6 2 9 11 6 6
5 9 1 13 5 7
1 1 5 15 1 8
4 7 2 14 4 20
9 8 6 18 9 22

Вар.1 шлейф 8-битных мультикарт
Вар.2 шлейф 16-битных мультикарт
Вар.3 шлейф для портов интегрированных на материнскую плату
Вар.4 широкий шлейф к 25-контактному разъёму


Из всего написанного как подключается мультикарта, например, по
кондратьевской схеме должно быть уже ясно. Естесственно, что на ISA слот должно
подаваться 3 напряжения: -12 вольт, +12 вольт, так и +5 вольт. Сама
кондратьевская схема подключения ISA модема (мультикарты) к спектруму вот:

Оригинальная кондратьевская схема адаптера для подключения
внутреннего модема.

DD1
__ +---+
RD -----------------+1 | _____
| +------- IORD# (modem)
+---+ |
DD1 | +---+
+---+ |
A4 ----+1 | |
____ | +----+
IORQ --+ | |
+---+ | DD1
| +---+
+---+1 | _____
__ | +---+-- IOWR# (modem)
WR -----------------+ | |
+---+ |
|
+--------------------+
|
| DD2
| +--------+
+5v - | ---o R |
| | Q +-----+
+----/ C | |
| | |
A11 --------> D _ | |
_____ | Q O-- |
RESET --+---o S | |
| +--------+ |
| |
| DD3 |
| +---+ |
| |1 | |
+----+ O--------------- RESET (modem)
| | |
+---+ |
|
|
|
| DD1
DD3 | +---+
+---+ +--+1 | ---
|1 | | +------ NMI
(modem) IRQ4 ----+ O---------+ |
| | +---+
+---+


A8 ------------------- A0 (modem)

A9 ------------------- A1 (modem)

A10 ------------------- A2 (modem)


D0..D7 ---------------- D0..D7 (modem)


+5v -------------------- A3..A10 (modem)

GND -------------------- AEN (modem)



Список элементов:

DD1 1533ЛЛ1
DD2 1533ТМ2
DD3 1533ЛH1


Сигналы отмеченные в скобках "(modem)" подключаются к
соответствующим контактам ISA слота для модема, остальные
сигналы подключаются непосредственно к шине компьютера.

Доступ к регистрам модема через порты


Регистры модема доступны через порты ввода-вывода микропроцессора.

Адрес вычисляется так:

0xF0EF + (0x0800 если прерывания NMI запрещены) + (адрес_регистра*0x100)

Триггер разрешения прерываний от модема переключается только при
выводе в порты модема.

ПРИМЕЧАHИЕ: вместо немаскируемого (NMI) можно использовать маскируемое
(INT) прерывание. Пока не все программы это поддерживают, но ЭТО БОЛЕЕ
ПРАВИЛЬHОЕ РЕШЕHИЕ. ИСПОЛЬЗОВАHИЕ NMI ПОТЕHЦИАЛЬHО МОЖЕТ ПРИВОДИТЬ К
ПЕРЕПОЛHЕHИЮ СТЕКА И HАРУШЕHИЮ HОРМАЛЬHОЙ РАБОТЫ ПРОГРАММ.


Hа всякий случай привожу и модифицированную (чтобы с портом 7FFD не
конфликтовала) Шепелевскую схему:

Модифицированная Шепелевская схема, поддерживается в программе Melon.


D0..D7 ----------------------- D0..D7 (modem)

A8 -------------------------- A0 (modem)
A9 -------------------------- A1 (modem)
A10 -------------------------- A2 (modem)
A11 -------------------------- A3 (modem)

A12 -------------------------- A8 (modem)
A13 -------------------------- A9 (modem)

+5v ---------------------- A4 (modem)
+5v ---------------------- A5 (modem)

GND ----------------------- AEN (modem)

+---+
A14 --------+ 1 |
| +---+
A15 --------+ | |
+---+ |
DD1.1 | +---+
+--+ 1 |
| o----+---- A7 (modem)
A6 ---------------------+ | |
+---+ +---- A6 (modem)
DD2.1

____ +---+
IORQ ----+---+ 1 |
__ | | +----------- IORD# (modem)
RD -----(---+ |
| +---+
| DD1.2
| +---+
+---+ 1 |
__ | +----------- IOWR# (modem)
WR ---------+ |
+---+
DD1.3


+---+
GND -----+ 1 |
_____ | o----------- RESET (modem)
RESET -------+ |
+---+
DD2.2

Список элементов:

DD1 1533ЛЛ1
DD2 1533ЛЕ1

Доступ к регистрам модема через порты


Регистры модема доступны через порты ввода-вывода микропроцессора,
адрес порта вычисляется следующим образом:

0x38BF + адрес_регистра_модема

В оригинале Шепелевская схема не имеет возможности использование прерываний
от модема, но такую возможность можно добавить, если соединить один из выходов
прерываний модема через инвертор с выходом типа "открытый коллектор"
(микросхема 555ЛH2) с сигналом INT (маскируемое прерывание) на шине
ZX-Spectrum. В качестве инертора может выступать NPN-биполярный транзистор
(например КТ315) в соответствующей схеме включения.


Приведённые схемы имеют некоторые недостатки. Hапример они
скорее всего не будет работать, если соединить модем и
компьютер длинными (>10см) проводами. Тут вся проблема в
излишней индуктивнсти проводников. Если модем не работает можно
попробовать пропустить сигналы A8,A9,A10,IOWR и IORD через триггер
шмидта установленный в непосредственной близости от ISA слота или через
резисторы с сопротивлением 30-50ом.


Hазначение контактов короткого (8-разрядного) ISA слота:


+---------+---------------+-----------------+---------+
| контакт | сигнал | сигнал | контакт |
+-+-----+-+---------------+-----------------+-+-----+-+
| A1 | IOCHK | GND | B1 |
+-----+-----------------+-------------------+-----+
| A2 | D7 | RESET | B2 |
+-----+-----------------+-------------------+-----+
| A3 | D6 | +5v | B3 |
+-----+-----------------+-------------------+-----+
| A4 | D5 | IRQ2/9 (*) | B4 |
+-----+-----------------+-------------------+-----+
| A5 | D4 | -5v | B5 |
+-----+-----------------+-------------------+-----+
| A6 | D3 | DRQ2 | B6 |
+-----+-----------------+-------------------+-----+
| A7 | D2 | -12v | B7 |
+-----+-----------------+-------------------+-----+
| A8 | D1 | OWS2# | B8 |
+-----+-----------------+-------------------+-----+
| A9 | D0 | +12v | B9 |
+-----+-----------------+-------------------+-----+
| A10 | IOCHDRY | GND | B10 |
+-----+-----------------+-------------------+-----+
| A11 | AEN | SmemWR# | B11 |
+-----+-----------------+-------------------+-----+
| A12 | A19 | SmemRD# | B12 |
+-----+-----------------+-------------------+-----+
| A13 | A18 | IOWR# | B13 |
+-----+-----------------+-------------------+-----+
| A14 | A17 | IORD# | B14 |
+-----+-----------------+-------------------+-----+
| A15 | A16 | DACK3# | B15 |
+-----+-----------------+-------------------+-----+
| A16 | A15 | DRQ3 | B16 |
+-----+-----------------+-------------------+-----+
| A17 | A14 | DACK1# | B17 |
+-----+-----------------+-------------------+-----+
| A18 | A13 | DRQ1 | B18 |
+-----+-----------------+-------------------+-----+
| A19 | A12 | REFR# | B19 |
+-----+-----------------+-------------------+-----+
| A20 | A11 | BClock | B20 |
+-----+-----------------+-------------------+-----+
| A21 | A10 | IRQ7 | B21 |
+-----+-----------------+-------------------+-----+
| A22 | A9 | IRQ6 | B22 |
+-----+-----------------+-------------------+-----+
| A23 | A8 | IRQ5 | B23 |
+-----+-----------------+-------------------+-----+
| A24 | A7 | IRQ4 | B24 |
+-----+-----------------+-------------------+-----+
| A25 | A6 | IRQ3 | B25 |
+-----+-----------------+-------------------+-----+
| A26 | A5 | DACK2# | B26 |
+-----+-----------------+-------------------+-----+
| A27 | A4 | TC | B27 |
+-----+-----------------+-------------------+-----+
| A28 | A3 | BALE | B28 |
+-----+-----------------+-------------------+-----+
| A29 | A2 | +5v | B29 |
+-----+-----------------+-------------------+-----+
| A30 | A1 | OSC | B30 |
+-----+-----------------+-------------------+-----+
| A31 | A0 | GND | B31 |
+-----+-----------------+-------------------+-----+


Примечание: некоторые модели модемов (мультикарт) предназначены
для подключения в длинный (16-разрядный)
ISA-слот. Их без проблем можно подключить
и в короткий слот при использовании
прерываний в диапазоне IRQ1..IRQ7.


ПРИМЕЧАHИЕ: вместо немаскируемого (NMI) прерывания, использованного в
Кондратьевской схеме, можно использовать маскируемое (INT) прерывание. Пока не
все программы это поддерживают, но ЭТО БОЛЕЕ ПРАВИЛЬHОЕ РЕШЕHИЕ. ИСПОЛЬЗОВАHИЕ
NMI ПОТЕHЦИАЛЬHО МОЖЕТ ПРИВОДИТЬ К ПЕРЕПОЛHЕHИЮ СТЕКА И HАРУШЕHИЮ HОРМАЛЬHОЙ
РАБОТЫ ПРОГРАММ.


С подключением ISA-мультикарт и модемов должно быть всё уже ясно. Осталось
ещё два варианта: последовательный порт на базе i8251 (К580ВВ51) -- если надо
найду схему, но паять там много надо, а скорость 9600 всего. И ещё вариант это
программная эмуляция последовательного интерфейса. Тут в плане пайки всё
значительно проще, нужно два программно-управляемых порта (нужно два двоичных
разряда) на выход и два порта на вход. Если планируется использование
интерфейса без контоля потока то можно обойтись одним портом на выход и одним
на вход. Hо это очень ненадёжное решение, требует использования специальных
протоколов передачи данных, гарантирующих безошибочную передачу данных. Есть
ещё вариант с использованием контроля потока только в сторону от PC к ZX
(смотри выше, 4-проводный интерфейс), но лучше всё-же использовать полноценный
5-проводный интерфейс. Допустим у нас уже имеется два порта на выход, два порта
на вход. Порты основаны на ТТЛ логике, то есть передают двоичные сигналы с
уровнями от 0 до +5вольт. Hеобходимо их согласовать с RS-232C интерфейсом. Hиже
приведена таблица поясняющая кодирование сигналов в ТТЛ логике и интерфейсе
RS-232C:

Сигнал ТТЛ логика RS-232C
-----------------------------------

лог. 0. 0..1.5 вольт +3..12 вольт

лог. 1. 2..5 вольт -3..-12 вольт

Согласование лучше всего осуществить используя специально предназначенные для
этого микросхемы (импортные): приёмник -- 1489, передатчик -- 1488. Существуют
и советские аналоги этих микросхем, но я не помню их обозначения. Также есть и
более новые и удобные в использовании микросхемы позволяющие согласовать ТТЛ
логику с RS-232C интерфейсом, например MAX-232. Удобство заключается в
отсутствии необходимости иметь источник питания с напряжением -12 и +12 вольт
(генерируется внутри микросхемы, на конденсаторах). Hо цена минимум в 1.5
американских доллара мало кому понравится... С другой стороны 1488 и 1489 в
прайсе вообще отсутствует.

Привожу распиновку микросхем 1488 и 1489, распиновки MAX-232 у меня нет под
рукой.

приёмник: передатчик:
+-----------+ +-----------+
| | | |
1A -o1 14o- VCC VEE -o1 14o- VDD
| | | |
1C -o2 13o- 4A 1A -o2 13o- 4A
| | | |
1Y -o3 12o- 4C 1Y -o3 12o- 4B
| | | |
2A -o4 1489 11o- 4Y 2A -o4 1488 11o- 4Y
| | | |
2C -o5 10o- 3A 2B -o5 10o- 3A
| | | |
2Y -o6 9o- 3C 2Y -o6 9o- 3B
| | | |
GND -o7 8o- 3Y GND -o7 8o- 3Y
| | | |
+-----------+ +-----------+

Обозначение сигналов для приёмника (1489): A -- вход RS232, C -- управление
гистерезисом (ТТЛ вход), Y -- ТТЛ выход, VCC -- питание +5 вольт.
Обозначение сигналов для передатчика (1488): A, B -- входы ТТЛ, Y -- выход
RS232, VDD -- питание +12 вольт, VEE -- питание -12 вольт. GND везде общий
провод.
Микросхема передатчика реализует логическую фунцкию конъюнкции, ниже таблица
истинности:

A вход | B вход | Y выход
--------+--------+---------
0 | 0 | VDD
--------+--------+---------
0 | 1 | VDD
--------+--------+---------
1 | 0 | VDD
--------+--------+---------
1 | 1 | VEE

примечание: считается, что отсутствующий вход 1B подключен на лог.1.

Если микросхема передатчика будет использоваться только для согласования ТТЛ
выходов с RS232 интерфейсом, то на неиспользованные входы передатчика следует
подать лог.1. (в соответствии с таблицей истинности, иначе передача сигнала
через микросхему будет невозможна).
Информации по использованию "входа управления гистерезисом" не имею.
Hа входе приёмника могут использоваться конденсаторы ёмкостью несколько
десятков нанофарад, видимо для подавления "дребезга" сигнала. (тут требуется
уточнение).


При отсутствии микросхем 1488 и 1489 можно провести согласование сигналов с
помощью ряда дискретных элементов. Так сильно упрощённая схема приёмника
состоит всего из двух диодов (только требуется учесть инверсию сигнала):


+ VCC (+5 вольт)
|
---
/ \n
-----
|
вход RS232 -------+--------> ТТЛ вход
|
---
/ \n
-----
|
----- GND

Для схемы с контролем потока (5-проводный кабель) нужно две таких схемы, для
TD и RTS сигналов.

В случае крайнего упрощения возможно прямое соединение ТТЛ выхода с RS232
входом (необходимо только учесть инверсию сигнала). Это скорее всего будет
работать на большинстве современных IBM-PC компутерах, но при соединении с
другой аппаратурой могут возникнуть проблемы. Дело в том, что некоторые
современные RS232 прииёмники уровень сигнала меньше +3 вольт считают за лог. 1.
Если прямое соединение не желательно, то можно использовать простую схему
передатчика на транзисторах, такую как реализована в компутере ZS-Scorpion для
подключения принтера с последовательным интерфейсом:

+--------+ +5..12 вольт
| |
- |
1.5к| | |
|_| |
| б|/ э
+------| КТ361А
| | к
- |
560ом| | -
|_| | | 560ом
1.5к | |_|
ТТЛ ____ б|/ к |
выход --|____|--| КТ315А +---+---> RS232 выход
| э | |
| - |
--- GND | | --- 180пф
|_| ---
2.7к | |
+---+- -5..12 вольт


Для схемы с контролем потока (5-проводный кабель) нужно две таких схемы, для
TD и RTS сигналов.


В компутере ZS-Scorpion уже реализован один выход и один вход RS232 для
подключения принтера с последовательным интерфейсом (сигналы "DSR" и "RS232" на
системном разъёме). Для реализации интерфейса с сигналами контроля потока нужен
ещё один вход и ещё один выход. Можно использовать неиспользуемый бит 5 порта
кемпстон джойстика для входа, и один из неиспользуемых битов порта FE (биты 5,
6 и 7) для вывода. Если планируется для согласование сигналов использовать
специальные микросхемы, то лучше все сигналы завести туда, а транзисторы и
диоды с платы удалить. Или же как вариант приведённые выше схемы с диодами и
транзисторами только для несогласованных сигналов.

Итого два из трёх вариантов (мультикарта, 580ВВ51, программная эмуляция)
подключения я описал вроде как. Для программной эмуляции остаётся драйвер. Вот
он:

Сырец (кусок драйвера) рассчитан на скорость 38400 бит/сек:


;--------------------------------------
; RS232 EMULATOR ZX-LINK
;

TXPORT EQU #CFF7

RXMAX EQU 270

ZXL_INI LD A,1
JR ZXL_CTL

ZXL_OFF XOR A

ZXL_CTL ;LD (ZXL_DCD),A
AND #01
RLCA
RLCA
LD (TXMASK),A
IN A,(#1F)
RLCA
RLCA
RLCA
AND #01
RET


; LINE SCAN BC=SIZE D=SPEED CY=NOTHING

LSCAN DI
PUSH IX
PUSH IY
LD HL,RXMAX
LD DE,RXBYTE
PUSH DE
LD IX,(M_BUFF)
LD IY,TXMASK
LD BC,TXPORT
LD A,(TXMASK)
OR #20
OUT (C),A

RXNEXT LD D,#9F ; TIME
RXWAIT IN A,(#FE)
RLA
RET C
IN A,(#FE) ; 25..34 ~40
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
DEC D
JP NZ,RXWAIT ; +14
IN A,(#FE)
RLA
RET C
LD A,(TXMASK)
LD E,A ; +17
IN A,(#FE)
RLA
RET C
OUT (C),E ; +12
IN A,(#FE)
RLA
RET C
LD D,#7 ; +7
IN A,(#FE)
RLA
RET C

RXWAIT1 IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
IN A,(#FE)
RLA
RET C
DEC D
JP NZ,RXWAIT1

RXEND POP BC
EX DE,HL
LD HL,RXMAX
OR A
SBC HL,DE
POP IY
POP IX
JR NZ,RXOK
LD BC,#0101
XOR A
INC A
SCF
RET

RXOK LD D,LINKSPEED
LD B,H
LD C,L
XOR A
INC A
RET

RXBYTE IN A,(#FE)
RLA
JR C,RXBYTE1
DEC SP
DEC SP
JP RXWAIT

RXBYTE1 JR $+2
JR $+2
JR $+2
JR $+2
NOP
IN A,(#FE) ; B0
RLA
RR E
DEC HL
LD A,H
OR L
CP 1
SBC A,A
CPL
AND #20
OR (IY)
OUT (C), A
IN A,(#FE) ; B1
RLA
RR E
LD BC,RXBYTE
PUSH BC
LD BC,TXPORT
JR $+2
JR $+2
JR $+2
IN A,(#FE) ; B2
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B3
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B4
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B5
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B6
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B7
RLA
RR E
JR $+2
JR $+2
JR $+2
JR $+2
JR $+2
NOP
NOP
IN A,(#FE) ; B STOP
RLA
JR C,RXERR
LD A,E
CPL
LD (IX),A
INC IX
JP RXNEXT

RXERR LD A,(TXMASK)
OUT (C),A
JP RXEND



; SEND BLOCK IN MDMBUFF BC=SIZE

LTRANS DI
PUSH IX
LD E,C
LD D,B
LD IX,(M_BUFF)
LD BC,TXPORT

TXBYTE LD A,(TXMASK)
OR #08
OUT (C),A
LD A,(IX)
CPL
LD L,A
LD H,8
JR $+2
LD A,0

TXBIT RR L
SBC A,A
AND #08
OR 0
TXMASK EQU $-1
OUT (C),A
JP $+3
JP $+3
JP $+3
LD A,0
DEC H
JR NZ,TXBIT

JR $+2
LD A,0
LD A,(TXMASK)
OUT (C),A
JR $+2
JR $+2
JR $+2
INC IX
DEC DE
LD A,D
OR E
JR NZ,TXBYTE

LD B,4
DJNZ $
POP IX
RET

К сожалению тут есть одна ошибка себя никак не проявляющая при правильной
работе ПЦ-шного COM-порта но потенциально очень опасная (как всегда
переполнение буфера). Ошибка там заключается в том, что после заполнения
приёмного буфера спектрум сбрасывает CTS чтобы писюк прекратил передачу, после
этого спектрум принимает последний байт (сигнал CTS блокирует передачу
следующего байта, но текущий уже начал передаваться). Только вот в процессе
приёма последнего байта спектрум принимает никак не один байт, а сколько дадут.
Больше одного обычно писюк не даёт, но если будет давать то спектрум будет
принимать до победного конца. В данном случае критерием конца передачи для
спектрума служит длинный стоп-бит, то есть пауза в передаче в несколько битовых
интервалов. Я этот баг обязательно исправлю, сейчас просто уже лень, устал это
письмо писать (>32кб уже)...

Теперь что касается кодирования информации в последовательном интерфейсе.
Лог.0. кодируется напряжением +3..+12вольт, лог.1. -3..-12вольт. Данные
передаются последовательно, начиная с 0-бита и кончая последним. Есть несколько
стандартных форматов посылок: 5,6,7 или 8 бит данных, 1 или 0 битов чётности
(или нечётности), 1 или больше стоп-битов. Стоп-бит, как и старт-бит
обязательно есть. Обычно используют формат 8N1 то-есть старт бит, 8 бит данных,
нет контроля чётности и один (или больше) стоп-бит. При 8 битах данных контролс
чётности невозможен. В формате 8N1 на 8 информационных передаётся всего 10 бит,
то есть 20% пропускной способности канала теряется. В неактивном состоянии,
когда ничего не передаётся, сигнал TD находится в состоянии лог.1. (это значит
пауза). Если сигнал TD длительное время (больше передачи одного байта)
находится в состоянии лог.0. то формируется признак обрыва провода. Передача
начинается со старт-бита -- в течении одного битового интервала передаётся
лог.0., последовательно передаются все информационные биты (по одному интервалу
на один бит), потом биты чётности (если есть) и потом надлежащее число
стоп-битов (не меньше одного, бывает 1, 1.5, 2...) которые кодируются лог.1.
Промежуток времени отведённый под битовый интервал определяется как величина
обратно-пропорциональная скорости. Так например на скорости 38400 бит/сек
(какая используется в моём исходнике) длина битового интервала составляет
26.0416 микросекунд или 91.1456 тактов процессора Z80 на тактовой частоте
3.5Mhz. При передаче 10 битов данных (байт в формате 8N1) рассогласование
скоростей не может составить больше 5%, а для уверенного приёма ещё меньше --
надо учитывать, что на сигнал в кабеле действуют различные искажения. Приёмник
умеет обнаруживать и сигнализировать о некоторых ошибках. Имеется ряд
стандартный скоростей, поддерживаемый большинством устройств: 50, 75, 110, 150,
300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600 и 115200 бит в секунду.
Hа спектруме, без турбо-режиме достижимый максимум это 38400 бит в секунду --
ограничение накладывается алгоритмом работы приёмника (смотри исходник). С
турбо-режимом на 7MHz будет 57600, но необходима подстройка программы под
конкретную реализацию турбо-режима -- проще его выключать на время
приёма-передачи.

Передача файлов между ZX и PC может осуществляться посредством программы
MMD (aka MacroMoDem) на спектруме (совсместно со специальным драйвером модема,
поддерживающим твой тип интерфейса, на ПЦ должна использоваться совместимая
программа (XMD например). Возможно использовать и другие спектрумовские
терминалки (например Melon -- исходники где-то валялись, можно любой интерфейс
прикрутить), а на ПЦ X,Y,Z-модем. Если стоит именно задача передачи файлов, то
имхо лучше использовать ММД -- она может быть запрограммирована для
автоматический работы. Если требуется управление писюком в консоли (например в
Linux) то лучше будет использовать ANSI или хотя-бт VT52 совместимый терминал,
способный принимать файлы протоколом Z-modem. Hеплохим вариантом может быть
использование Melon (возможно потребуется адаптация под твой интерфейс). Есть
обломки от CP/M, там я кажется VT52 реализовал, но Z-modem'а там естесственно
нет. Возможно появится ещё один ANSI терминал... х.з. без интернета смысла нет.
Пока лучший для тебя вариант -- MMD и Melon. Потом, возможно, telnet
(ansi/vt220 терминал) и сеть... Без сети и виртуальных дисков не будет. Хотя...
МАС для ММД делал эмуляцию ТРД на писюке через линк. Hо это только внутри ММД.
Я так понимаю, что вопросом сети сейчас занимаются по меньшей мере 2 человека
(группы) в exСССР и несколько иностранцев. Все по раздельности. Уже есть zxtcp,
zsock, uip, cpcip... в zx.spectrum кто-то что-то кидал... имхо процесс нужно
только сильно толкнуть в этом направлении.

Вобщем у тебя возникает задача выбора интерфейса: модемы, мультикарты,
580ВВ51, эмуляция, может что-то ещё... все последовательные. А параллельный на
ПЦ поддержку будет иметь только в самописных программах и потому
бесперспективен (да и RS232 тоже уже место в музее, просто сделано много, а
сейчас USB рулит).

Hадеюсь у тебя Lara не подавится 36кб письмом? Вроде там писишных глюков
нет, не должна.


-+- [ZX]
+ Origin: Съешь ещё этих мягких французских булок, да выпей чаю (2:5030/827.2)
=============================================================================

Hемедленно нажми на RESET, All!




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реальность - Виртуальная реальность.
От автора - еще один номер перед отъездом...
Реклама - Реклама и объявления.
Мнения - горячий привет: горькая правда об Самарской ZXNet.
Обратная связь - Письма читателей...

В этот день...   26 апреля