ZX Spectrum - Проблема с RS232 (последовательный порт)

Недавно я получил ZX Spectrum +3 и пытаюсь заставить RS232 работать со спектром. Я построил кабель (разъем типа "BT" <-> последовательного DB9) после штифта из кабеля (Spectrum кабеля для передачи данных 128 RS232) здесь. Другой конец кабеля подключается к ПК с помощью адаптера USB-Serial. Я использую Moserial в Linux для связи со Spectrum.

Кабель работает, и я могу использовать LLIST для печати программ BASIC через последовательный порт, но я не могу заставить Spectrum надежно читать из последовательного порта - даже при включении аппаратного квитирования (DTR/CTS) в Moserial.

Я написал простую программу на +3 BASIC для вывода полученных символов на экран. Кажется, что первый символ принят нормально, но оставшиеся символы отброшены или повреждены.

Вот пример того, что выводит Spectrum при попытке отправить zx Spectrum со скоростью 300 бод:

z[dot/box character]. VAL$ [box character]MOVE VAL$ VAL$ ?)

(это выглядит VAL$ а также MOVE$ каждый является одним символом в ПЗУ Spectrum)

снимок экрана:https://stackru.com/images/7f1a8ec9344e1fa7fdc35fdd5ba50c6772aed9a1.jpg

И программа BASIC, которая открывает последовательный порт и выводит полученные символы на экран:

10  FORMAT LINE 300
20  FORMAT LPRINT "r"
30  FORMAT LPRINT "e"
40  OPEN #4,"p"
50  PRINT INKEY$#4;
60  GO TO 50

Я обнаружил, что если я отправляю символы один за другим с ПК с достаточно большой задержкой между ними, я могу получить гораздо более надежный вывод от Spectrum. Я тестировал это с разными задержками, и 80 мс работали лучше всего. Я действительно не хочу использовать этот подход в качестве решения - он ужасно медленный, и иногда некоторые символы теряются.

Может ли это быть проблемой самого Спектрума? Или мне что-то не хватает в моей настройке? Что-то просто не кажется правильным, я знаю, что есть программный загрузчик для спектра через последовательный - так что, конечно же, спектр должен иметь возможность принимать последовательный ввод без задержки 80 мс на символ?

5 ответов

ZX Spectrum Interface 1 работает путем дискретизации битов в программном цикле с задержками, так что он может искать стартовый бит, а затем искать другие биты. Регистра сдвига нет. Все это делается программно, они даже не используют прерывания или какой-либо другой фиксированный внешний таймер для генерации задержек скорости передачи данных.

В результате он даже не начинает искать начальный бит, пока не узнает, что вы ищете ввод ... Теперь, когда у вас есть представление о том, что происходит, я почти уверен, что вы уже видели проблему? Если вы отправляете данные слишком быстро, ваша базовая программа даже не успевает вернуться к процедуре приема для поиска начальных битов, и начальные биты будут потеряны, или, что более вероятно, вы собираетесь захватите битовый переход в середине байта и получите тарабарщину ... Итак, вам нужно убедиться, что есть задержка между байтами, и ваш Spectrum готов принять следующий байт, прежде чем вы начнете передачу.

Надеюсь, это поможет, хотя это было давно, но другие сочтут это так ...

Я столкнулся с вашей проблемой, когда пытался сделать то же самое!

Вам необходимо включить квитирование RTS / CTS в вашем приложении linux (ПК), а не DTR / RTS.

Это работает для меня на моем Spectrum+2:

       100 REM ** Receive Test **
 110 REM ** Use RTS/CTS **
 120 CLS
 130 FORMAT "p";9600
 140 OPEN #4,"p"
 150 PRINT INKEY$#4;
 160 GO TO 150

У меня все это работало много лет назад с моим Spectrum и собственным портом rs232 ZX Interface 1, но я написал некоторую программу на C, используя старый компьютер с Windows 386.

У меня все еще есть оборудование и кабели. Фактически, теперь, когда я помню, мне пришлось сделать свой собственный «нуль-модемный» кабель и соединить его с портом RS232 на компьютере с интерфейсом ZX 1 (у меня есть старый ноутбук Sony Vaio с портом RS232).

Я даже смог загрузить TAP-файлы, чтобы играть на реальном спектре. Я откопаю то, что у меня есть, и вернусь к вам.

В zx Spectrum 48k с интерфейсом 1 я должен выбрать, как будет работать rs232. Режим t: текст -> только символы rx и tx в 7-битном режиме b: byte -> rx и tx полный байт (8 бит)

Может, тебе стоит это проверить.

На 48k с интерфейсом 1 FORMAT "b";9600 Затем спектр работает с 8-битными данными на 9600 бод.

В вашем коде я не вижу, как это будет работать.

Мои наилучшие пожелания.

При последовательной связи между современными компьютерами и ZX Spectrum существует несовместимость программного обеспечения. Это можно исправить, но не из Basic. Проблема с RTS/CTS заключается в том, что после того, как Spectrum сигнализирует, что он не может больше получать данные через сигнал CTS: современные микросхемы UART предполагают, что принимающий компьютер все еще может принимать cca. один буфер данных (= до 32 байтов). Но ZX Spectrum имеет только 1-байтовый буфер. Поэтому, когда Spectrum сообщит, что он заполнен, он получит дополнительные 32 байта данных.

По этой причине все, что быстрее 1200 бод, не будет работать на BASIC. Однако ... Я заставил ZX Spectrum надежно работать на 57600 и с исправлением ошибок на 115200. Просто ожидая до 32 байтов после того, как я сигнализирую компьютеру прекратить отправку данных.

Другие вопросы по тегам