zimodem + ZX Spectrum
Chwe
Z и там и там, это явно это неспроста :)
TL;DR
- Прошиваем ESP-12
- Запускаем ZMDMSTUP.BAS
- 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. Модем шлёт без оглядки на то, готов Спек принимать или нет. А так как Спек большую часть времени НЕ готов, то результат соответствующий… Собственно говоря, поэтому настройка и нужна.
Нам нужно будет убедиться, что в модеме настроены следующие вещи:
- Правильные уровни сигналов для RS232 для сборки «C64Net» (на C64 они, зачем-то, инвертированы). Для сборки «Zimodem» это НЕ нужно!
- Сигналы правильно разведены по ногам (для ESP-12 ничего по-умолчанию не подходит).
- Включено RTS/CTS flow control. Ради этого пункта всё и затевается. <<Нельзя просто так взять и включить flow control>> :)
- Немножко оптимизаций для замедления передачи. Самое медленное звено всё равно будет Spectrum, Zimodem на ESP-12 и на 4K baud может, только толку-то…
- Скорость, 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
- похоже, значения регистров 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: компилируйте сами :)↩︎