Терминал на МК-161: Начало
Начал было работу над прошивкой МК-161… и обнаружил, что у меня нет под рукой терминальной программы. Да и COM-порта нет, только эмулируемый через USB. Но если есть два МК-161, у каждого RS-232C, почему бы один не использовать под терминал? Сказано — сделано.
После нескольких экспериментов получилось не просто написать приёмник и передатчик на входном языке МК-161, но ещё и объединить их в один «терминал». Пока он может выводить любые принятые символы, правда только в одну строчку. Передаёт же корректно он лишь цифры и приветствие "Hello, world!" кнопкой В↑. Причём в обе стороны — что набирается на клавиатуре одного МК-161, отображается на экране соседа и наоборот! МК-161 работает в полудуплексе. Если клавиши нажать одновременно и там, и там, передать ничего не получится.
Оказалось, что для соединения двух МК-161 достаточно присоединить к каждой фирменный «Переходник зарядного устройства для МК-161», между ними включить фирменный «Кабель связи ЭКВМ с ПЭВМ (RS-232, 9m-9f)» и MINI GENDER CHANGER на 9 штырьков папа-папа. Ниже приведена иллюстрация и код программы терминала.
; comtest.mkl (c) Васильев И.В., 2 сентября 2017, Москва ; Терминал последовательного порта (черновик) ; Распространяется под лицензией GNU GPL v3 или выше .charset 1251 .org 0 Cx 1 ppm 9070 ; Разрешение порта 12 ppm 9071 ; Скорость обмена 12: 38400 бит/с Cx ppm 9072 ; Режим обмена 0: восьмибитный 200 ppm 9073 ; Время ожидания при приёме данных 200: 250 мс 1 ppm 9074 ; Режим автоматического приёма после окончания передачи 1: запрещён CLS: 2 ppm 9010 ; Инициализация графического экрана, курсор влево-вверх Start: Cx ppm 9085 ; Обнулим индексный регистр буфера приёма k grph ; Отрисовка графического экрана 1 ppm 9076 ; Приём данных 1: установка разрешения приёма Wait: pprm 9076 px!=0 Receiving ; Регистр разрешения приёма должен обнулиться после завершения приёма pprm 9029 knot fx!=0 Wait ; Чтение кода нажатой кнопки, если нет ждём 13 fans - fx!=0 CLS ; Cx очищает экран Cx ppm 9080 ; Обнулим индексный регистр буфера передачи 14 fans - fx!=0 SendMsg ; В^ шлёт привет 48 fans + ppm 9082 ; Быстро преобразовываем цифры в ASCII и в буфер передачи, автоинкремент 1 goto SendN SendMsg: 15 m0 .numt msg m5 ; Длина и адрес приветствия StoreMsg: rm5 k prgm ppm 9082 krm5 ; Очередной символ в буфер передачи, автоинкремент fl0 StoreMsg 15 SendN: ppm 9077 ; Передача данных SendMore: pprm 9077 px=0 SendMore ; Регистр передачи данных обнуляется после завершения передачи pgoto Start Receiving: pprm 9075 m0 ; Счётчик посылок Print: pprm 9087 ppm 9020 ; Вывод символа из буфера приёма, автоинкремент fl0 Print pgoto Start msg: .text "Hello, world!" ; Полная длина приветствия = 15 .db 13,10 .endp
Прикрепленный файл | Размер |
---|---|
![]() | 1.71 KB |
![]() | 401 байт |
- AtH's blog
- Log in or register to post comments
- Просмотров 6322
Комментарии
Хорошо получилось!
Permalink
Хорошо получилось! Все-таки эта "железная брутальность" подкупает - загнал пару чисел в регистр - оно улетело в СОМ- или SPI-порт.
Спасибо.
Permalink
Сам удивился, насколько просто такие вещи пишутся на языке МК. Интересна ещё эта концепция «буфера», позволяющая отправлять и передавать по RS-232C последовательность байт одним пакетом. На Форте это красиво можно оформить.
К сожалению, не удалось быстро подключить мышку и модем. Возможно, там требуются дополнительные сигналы. Википедия пишет, что драйвер мыши поддерживает активный уровень DTR и RTS для питания мыши. Также мыша хочет передавать 7 бит, хотя некоторые вроде дают 8.
Интересная тема, но развивать времени мало. Теперь нужно закодировать "Hello world" для камня так, чтобы её прочёл терминал на второй МК-161. Вроде, там тоже должно быть «загнал пару чисел в регистр». А дальше должно пойти легче. :-)
Улучшения
Permalink
А если регистровым числам предварительно дать имена, то волшебные числа в программе станут более осмысленными. Есть там препроцессор какой нибудь ?
Например СК38400 ИП РКОМСКОРОСТЬ
Вроде, можно через .EQU
Permalink
Вроде, можно через .EQU
Читаемость исходного текста.
Permalink
Да, числам и номерам регистров можно давать имена. Я использовал этот стиль, например, см. исходник Каллисто. Но именно для функциональных регистров он у меня не прижился. Пояснять «магию» в комментариях оказалось удобней.
Дело в том, что все эти переопределения займут место в программе (длинней становится) — к тому же самопальные имена также заучивать придётся. Фирменная нумерация хорошо документирована и на официальном сайте, и в pdf'ках, и на нашей вики. Когда возникает вопрос, какой-нибудь R9071 в справочнике находится быстро — а вот РКОМСКОРОСТЬ немного сложнее.
Кто долго занимается программированием МК-161, те уже привыкли, что R9020 это вывод символа на графический экран, а R9000 установить курсор («Начальные координаты объекта»). А что ещё не запомнил, такой подход помогает выучить — это полезно, поскольку иногда программируешь в дороге без справочников.
Понятно
Permalink
Хотя в дорогу можно основное распечатать в каком нибудь карманном формате и подглядывать :-)
Есть mkt'шки
Permalink
Годы назад я перевёл краткую документацию по функциональным регистрам в вид, читаемый МК-161.
В прошивке есть опция просматривать текст на диске без загрузки в память. Так что если держать эту справку на диске, всегда можно подглядывать номера регистров — даже без бумажки.
К тому же почти у всех есть мобильники, которые читают pdf'ки или даже могут загрузить их с Новосибирского сайта.
Дык неудобно
Permalink
Как писать программу, если приходится переключаться на просмотр диска ?
Конечно
Permalink
На просмотр диска можно переключаться, нажав клавишу ВЫХОД прямо из режима F ПРГ. Всё состояние калькулятора сохраняется. Посмотрев документацию и вернувшись, можно продолжить ввод программы.
Конечно, гораздо удобней обращаться к регистрам, номера которых помнишь наизусть. Да и бумажные руководства помогают. Раньше их можно было купить отдельно, сейчас не знаю как.
Ещё один плюс от использования номеров регистров вместо наименований — проще отлаживать. МК-161 умеет декомпилировать свой код, но все наименования исчезают. Остаются «голые» номера регистров. Если они есть в исходном коде, это существенно упрощает отладку. Например, я смотрю на веб-страничку с comtest.mkl и по Cx РРП 9085 на экране МК-161 сразу выясняю, что нахожусь в районе метки Start.
Надеюсь мы это исправим
Permalink
Дай Бог вместо МК-161 сделаем машинку с нормальным Фортом, не понадобится помнить эти номера. В идеале документацию надо встраивать прямо в машинку. Ну или хотя бы сделать типа ' INITCOMPORT HELPONWORD
Info: Initializes COM port #Number with Speed
Args: ([Speed] [Number] -- )
Если хэлп хранить где нибудь на флэше или SD карте то не страшно даже с гиперссылками на другие слова и примерами использования.
Встроенный HELP
Permalink
В таком виде HELPONWORD реализовать в Каллисто можно только при считывании подсказки с электронного диска. Но mkt'шки обеспечивают похожий сервис «на борту».
Конечно, удобней всего было бы иметь официальные названия функциональных регистров. "КУРСОР" вместо R9000 — причём так, чтобы это слово "КУРСОР" понималось и компилятором (MK.EXE, MKL2MKP), и встроенной программой МК-161. Человеку запоминать имена удобней, даже если это будет английское CURSOR — но, увы, места внутри камня на такую роскошь может не хватить.
Другое дело Каллисто. Там всё построено на именах. И даже если на каком-то уровне используется регистр, на более высоком он будет скрыт за именами слов, обращающихся к этому регистру: SetCursor, GetCursor, CLS и что только сердце пожелает. :-)
Поворот не туда
Permalink
Тема перенесена на форум.
Мышь
Permalink
Я в 2013 пытался мышь к rs-232 подключить, но безуспешно, осциллографом посылок не обнаружил, может мыши дохлые попались, кстати, старые мышки требуют ограничения тока СОМ-портов.
Сайт
Мышь
Permalink
Нужен специальный переходник, передающий логическую "1" на DTR и RTS. Можно снять её, например, с сигналов параллельного порта. И придумать, как ловить 7-битные байты от мыши. Хотя есть, говорит гугль, мыши Mouse System, использующие 8-битный протокол. Не знаю, как там с байтом чётности. Вполне возможно, что 7-битный байт мыши можно ловить 8-битным драйвером ЭКВМ, если он сопровождается битом чётности.
И ещё интересная задача — подключить внешнюю клавиатуру через переходник с PS/2 на COM. Для терминальной программы можно вполне себе написать обработчик скан-кодов, там места много ещё осталось в памяти программ.
Жаль, нет времени этим заняться. Мне надо двигаться в сторону порта Каллисто под W77.