zimodem + ZX Spectrum

zimodem + ZX Spectrum


Chwe

Z и там и там, это явно это неспроста :)

TL;DR

  1. Прошиваем ESP-12
  2. Запускаем ZMDMSTUP.BAS
  3. Profit!

Шаг 0: Прошивка

Тут всё непросто.

Тонкость №1: Где взять? Лучше всего собрать самому. Можно взять у меня. Но, а вдруг я следующую версию не соберу? Проще самому собрать, там из критичных моментов только 1M/160k и древние библиотеки.

Тонкость №2: Какую взять/собрать? Там есть два варианта “C64Net” и “Zimodem”. У второго RS232_INVERTED undefined. В принципе, нам не принципиально, но мы возьмём C64Net (его проще собрать) и выводы будем настраивать явно1. Но, если часто планируете сбрасывать/перепрошивать – наверное, чуть-чуть проще будет с Zimodem (#undef RS232_INVERTED). Но, шаг №1 тогда НЕ нужен! Пользоваться будем v3.7.1, на более ранних не проверял, ибо зачем?

Хозяйке на заметку: сбрасываем в «заводские настройки» через AT&F86, с форматированием SPIFFS.

Прошить можно чем угодно, хоть прямо из Arduino IDE. Я пользуюсь esptool.

Настраиваем

Интересно всё сделать прямо на Speccy, что и попробуем.

Zimodem стартует в 1200 no flow control, что приводит к невозможности получения ответов на Speccy. Модем шлёт без оглядки на то, готов Спек принимать или нет. А так как Спек большую часть времени НЕ готов, то результат соответствующий… Собственно говоря, поэтому настройка и нужна.

Нам нужно будет убедиться, что в модеме настроены следующие вещи:

  1. Правильные уровни сигналов для RS232 для сборки «C64Net» (на C64 они, зачем-то, инвертированы). Для сборки «Zimodem» это НЕ нужно!
  2. Сигналы правильно разведены по ногам (для ESP-12 ничего по-умолчанию не подходит).
  3. Включено RTS/CTS flow control. Ради этого пункта всё и затевается. <<Нельзя просто так взять и включить flow control>> :)
  4. Немножко оптимизаций для замедления передачи. Самое медленное звено всё равно будет Spectrum, Zimodem на ESP-12 и на 4K baud может, только толку-то…
  5. Скорость, 9600 максимум, что Speccy может, но всё лучше, чем 1200
Хозяйке на заметку. Не делайте AT&W до того момента, пока не уверены на 200%, что всё работает правильно.

Ниже все шаги расписаны детально, но проще взять ZMDMSTUP.BAS, оно всё сделает само и на Спеке.

RS232

Выставляем все flow control сигналы в Active=LOW (ещё раз, это нужно для сборки «C64Net» и не нужно для сборки «Zimodem»):

ATS46=1S48=1S50=1S52=1S54=1S56=1
DCD – 46, CTS – 48, RTS – 50, RI – 52, DTR – 54, DSR – 56. Да, мы ничего, кроме CTS использовать не будем, но пусть всё будет настроено правильно.

Выводы ESP-12

Назначаем сигналы на правильные выводы ESP-12:

ATS47=5S49=13S51=15S53=12S55=14S57=4
DCD(47) – pin 5, CTS(49) – pin 13, RTS(51) – pin 15, RI(53) – pin 12, DTR(55) – pin 14, DSR(57) – pin 4.

RTS/CTS Flow Control

То, ради чего всё и затевалось. Включаем RTS/CTS, без которых синхронизация со Speccy невозможна:

ATF0
C этого момента Speccy должен правильно получать ответы от Zimodem. Проверьте, например через ATI. Если по прежнему идёт мусор – где-то что-то не настроилось. Сделайте ATZ и начинайте сначала.

Разные всякие улучшения

Добавим задержку в 1ms после посылки каждого символа, чтобы Speccy успевал всё обрабатывать. Без этого работать будет, но буфер (SERFL) практически всегда будет заполнен.

ATS44=1

Скорость!

Переключаемся на 9600:

ATB9600
Переключается сразу, отключаем/перенастраиваем терминал и с этого момента используем 9600.

Сохраняем настройки

Если всё работает как ожидалось и даже на скорости 9600, самое время сохранить настройки:

AT&W

Настройка на «большом» компьютере

Все эти настройки можно сделать заранее. Только, убедитесь, что USB UART умеет использовать RTS/CTS и эти линии правильно подключены.

«WiFi Driver» для MRF

To be continued…

Приложение А.

См. рис. 1. Щютка юмора.

10 PRINT "ZIMODEM SETUP"
20 REM Set up levels to match RS232 reqs
22 .uart -1 -s ATS46=1S48=1S50=1S52=1S54=1S56=1
30 REM Set up ESP-12 pins
32 .uart -1 -s ATS47=5S49=13S51=15S53=12S55=14S57=4
40 REM Add 1ms delay after each char
42 .uart -1 -s ATS44=1
50 REM Switch baud rate and flow control
52 .uart -1 -s ATF0B9600
90 PRINT "Connect at 9600 and do not"
92 PRINT "forget to save settings:"
93 PRINT "    AT&W"
94 GOTO 9999
99 SAVE *"ZMDMSTUP.BAS" LINE 10

  1. похоже, значения регистров 4[68] и 5[0246] зависят от RSR232_INVERTED, а не напрямую задаются параметрами, как описано в документации. Т.е. 0 - default (в смысле как задано при компиляции), а 1 – !default. А какой был default при компиляции знает только тот, кто компилировал (см. «C64Net» и «Zimodem»). В смысле, если скомпилировать с undef RS232_INVERTED, то выполнение пункта №1 приведёт модем в конфигурацию C64. pinModeDecoder(mode, active, inactive, activeDef, inactiveDef) для mode == 0 без затей ставит active = activeDef и inactive = inactiveDef, только фокус в том, что DEFAULT_xxx_HIGH и DEFAULT_xxx_LOW зависят от RS232_INVERTED. Поэтому во фразе «n=0 is default DCD=HIGH=online. n=1 is DCD=LOW=online. n=2 always HIGH. n=3 always LOW.» вместо HIGH/LOW надо читать DEFAULT_xxx_HIGH и DEFAULT_xxx_LOW. TL;DR: компилируйте сами :)↩︎


Report Page