EFORTH 0.6.1b для МК-161

Справка по R9000Справка по R9065
Сообщество МК-161 в Контакте только что опубликовало новую бета-версию eForth для «Электроники МК-161», грузить по ссылке:
http://the-hacker.ru/2019/161eforth0.6.1b.zip

В среде Форта появилась встроенная подсказка (build-in help) по регистрам функций ЭКВМ, облегчающая программирование вдали от компьютера и Интернета.

Поскольку регистров функций много, текст справки, взятый из программы MK.EXE, объёмный. Было решено хранить его на борту МК-161 в блокноте, пользуясь трюком Чёрной королевы. ASCII-коды четырёх литер последовательно записываются в 12 разрядах мантиссы десятичных чисел, хранящихся в блокноте. Каждая литера записывается в полные три разряда, от 000 до 255.

Эта же кодировка используется, например, в программе «Аудиокнига». Вместе с тем подсказка в блокноте не совместима по формату с другими программами, так как помимо текста содержит числовой индекс для быстрого нахождения запрошенной справки.

Вся справочная система уложилась в 4 слова, из которых саму справку по номеру регистра выдаёт слово HELPR. Второе слово NTYPE похоже на фортовское TYPE. Оно выводит на индикатор строку из блокнота, закодированную в формате Чёрной королевы. Примитив NGET также считывает эту строку, но записывает её в память ЭКВМ (адрес считанной строки может быть немного смещён относительно начала предоставленного буфера). Эти два слова NTYPE и NGET можно использовать в своих приложениях, читающих из блокнота произвольный текст — не обязательно предложенную справку.


: NTYPE ( a l -- ) HERE NGET TYPE ; \ считать строку из блокнота в HERE, отобразить её.

: HELPR ( n -- )
CR ‘R’ EMIT DUP STR TYPE ‘:’ EMIT SPACE \ вывести на новой строчке ‘R’, номер регистра, ‘: ’
9000 - NSPLIT ?DUP \ считать адрес справки по регистру
IF 1000 + NSPLIT DROP NTYPE CR THEN \ вывести справку по разделу
NTYPE ; \ вывести справку по регистру

Последнее новое слово NSPLIT считывает запись из блокнота и разбивает её на три поля, которые HELPR использует для нахождения справки. Оно напоминает слово HEAD@, которое я подробно разобрал на Хабре (раздел 1, «Работа с заголовками»), но содержит обращение к блокноту и длина полей немного другая. Эти и все остальные слова eForth кратко документированы в файле words.txt.


nget ( reg l a -- a1 l ) Считать строку a1 длины l в буфер a, начиная с reg.
nsplit ( reg -- a l n ) Считать поля из блокнота: адрес a, длину l и номер n.

HELPR ( n -- ) Вывести справку по регистру n.
ntype ( a l -- ) Вывести строку длиной l, начиная с записи блокнота a.

При передаче на ЭКВМ файла подсказки EFORTH.MKN длиной в 27 Кбайт (861 группа по 4 записи) рекомендуется установить максимальную скорость (57600 бит/с). Также в процессе разработки был обнаружен странный факт. ЭКВМ довольно последовательно придерживается bcd-кодирования и принципа «старшее по младшему адресу». Но в 4-байтовом заголовке файла MKN использован зарубежный стандарт: двоичное число, «младший байт в начале». На сайте производителя в разделе документации не было уточнений, но исходный текст pmkcom.c помог установить истину.

В дистрибутиве есть исходники двух полезных инструментов для работы со справкой. Программа mkmkn.c считывает текстовый файл справки, пример есть в regs.txt, и создаёт файл блокнота (MKN). Программа typemkn.c считывает справку из файла блокнота MKN, выводя имеющиеся в ней подсказки.

Метки публикаций: