Терминал на МК-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
File attachments: 
Прикрепленный файлРазмер
Binary Data Исходник терминала (черновик)1.71 KB
Binary Data Сам терминал (черновик)401 байт
Метки публикаций: 
Русский

Комментарии

Хорошо получилось! Все-таки эта "железная брутальность" подкупает - загнал пару чисел в регистр - оно улетело в СОМ- или SPI-порт.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Сам удивился, насколько просто такие вещи пишутся на языке МК. Интересна ещё эта концепция «буфера», позволяющая отправлять и передавать по RS-232C последовательность байт одним пакетом. На Форте это красиво можно оформить.

К сожалению, не удалось быстро подключить мышку и модем. Возможно, там требуются дополнительные сигналы. Википедия пишет, что драйвер мыши поддерживает активный уровень DTR и RTS для питания мыши. Также мыша хочет передавать 7 бит, хотя некоторые вроде дают 8.

Интересная тема, но развивать времени мало. Теперь нужно закодировать "Hello world" для камня так, чтобы её прочёл терминал на второй МК-161. Вроде, там тоже должно быть «загнал пару чисел в регистр». А дальше должно пойти легче. :-)

А если регистровым числам предварительно дать имена, то волшебные числа в программе станут более осмысленными. Есть там препроцессор какой нибудь ?
Например СК38400 ИП РКОМСКОРОСТЬ

Вроде, можно через .EQU

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Да, числам и номерам регистров можно давать имена. Я использовал этот стиль, например, см. исходник Каллисто. Но именно для функциональных регистров он у меня не прижился. Пояснять «магию» в комментариях оказалось удобней.

Дело в том, что все эти переопределения займут место в программе (длинней становится) — к тому же самопальные имена также заучивать придётся. Фирменная нумерация хорошо документирована и на официальном сайте, и в pdf'ках, и на нашей вики. Когда возникает вопрос, какой-нибудь R9071 в справочнике находится быстро — а вот РКОМСКОРОСТЬ немного сложнее.

Кто долго занимается программированием МК-161, те уже привыкли, что R9020 это вывод символа на графический экран, а R9000 установить курсор («Начальные координаты объекта»). А что ещё не запомнил, такой подход помогает выучить — это полезно, поскольку иногда программируешь в дороге без справочников.

Хотя в дорогу можно основное распечатать в каком нибудь карманном формате и подглядывать :-)

Годы назад я перевёл краткую документацию по функциональным регистрам в вид, читаемый МК-161.

В прошивке есть опция просматривать текст на диске без загрузки в память. Так что если держать эту справку на диске, всегда можно подглядывать номера регистров — даже без бумажки.

К тому же почти у всех есть мобильники, которые читают pdf'ки или даже могут загрузить их с Новосибирского сайта.

Как писать программу, если приходится переключаться на просмотр диска ?

На просмотр диска можно переключаться, нажав клавишу ВЫХОД прямо из режима F ПРГ. Всё состояние калькулятора сохраняется. Посмотрев документацию и вернувшись, можно продолжить ввод программы.

Конечно, гораздо удобней обращаться к регистрам, номера которых помнишь наизусть. Да и бумажные руководства помогают. Раньше их можно было купить отдельно, сейчас не знаю как.

Ещё один плюс от использования номеров регистров вместо наименований — проще отлаживать. МК-161 умеет декомпилировать свой код, но все наименования исчезают. Остаются «голые» номера регистров. Если они есть в исходном коде, это существенно упрощает отладку. Например, я смотрю на веб-страничку с comtest.mkl и по Cx РРП 9085 на экране МК-161 сразу выясняю, что нахожусь в районе метки Start.

Дай Бог вместо МК-161 сделаем машинку с нормальным Фортом, не понадобится помнить эти номера. В идеале документацию надо встраивать прямо в машинку. Ну или хотя бы сделать типа ' INITCOMPORT HELPONWORD
Info: Initializes COM port #Number with Speed
Args: ([Speed] [Number] -- )
Если хэлп хранить где нибудь на флэше или SD карте то не страшно даже с гиперссылками на другие слова и примерами использования.

В таком виде HELPONWORD реализовать в Каллисто можно только при считывании подсказки с электронного диска. Но mkt'шки обеспечивают похожий сервис «на борту».

Конечно, удобней всего было бы иметь официальные названия функциональных регистров. "КУРСОР" вместо R9000 — причём так, чтобы это слово "КУРСОР" понималось и компилятором (MK.EXE, MKL2MKP), и встроенной программой МК-161. Человеку запоминать имена удобней, даже если это будет английское CURSOR — но, увы, места внутри камня на такую роскошь может не хватить.

Другое дело Каллисто. Там всё построено на именах. И даже если на каком-то уровне используется регистр, на более высоком он будет скрыт за именами слов, обращающихся к этому регистру: SetCursor, GetCursor, CLS и что только сердце пожелает. :-)

Я в 2013 пытался мышь к rs-232 подключить, но безуспешно, осциллографом посылок не обнаружил, может мыши дохлые попались, кстати, старые мышки требуют ограничения тока СОМ-портов.

Нужен специальный переходник, передающий логическую "1" на DTR и RTS. Можно снять её, например, с сигналов параллельного порта. И придумать, как ловить 7-битные байты от мыши. Хотя есть, говорит гугль, мыши Mouse System, использующие 8-битный протокол. Не знаю, как там с байтом чётности. Вполне возможно, что 7-битный байт мыши можно ловить 8-битным драйвером ЭКВМ, если он сопровождается битом чётности.

И ещё интересная задача — подключить внешнюю клавиатуру через переходник с PS/2 на COM. Для терминальной программы можно вполне себе написать обработчик скан-кодов, там места много ещё осталось в памяти программ.

Жаль, нет времени этим заняться. Мне надо двигаться в сторону порта Каллисто под W77.