161eForth 0.9b

Вышел eForth для «Электроники МК-161», бета-версия 0.9b
Скриншот
Качать отсюда: http://the-hacker.ru/2020/161eforth0.9b.zip

Во-первых, новая накладная клавиатура проверена и стала основной. Обе её разновидности, под печать и эмулятор, в каталоге kbd.

Главное же отличие от 0.8b — за счёт байтовой памяти увеличено быстродействие слова TYPE, аналога оператора PRINT из Бейсика и Питона. Словарь дополнился служебным словом MSG, а оптимизация затронула как высокий, так и низкий уровень вывода строк. Не забудьте загрузить в блокнот новый файл подсказки, я туда добавил описание MSG.

В предыдущих бета-версиях eForth я неплохо экономил байтовую память, разместив все «стандартные сообщения» (корявое название) в памяти программ, где полно свободного места. Слово TYPE, видя строку специального вида, искало там нужное сообщение. Подробности я опубликовал на Хабре, но их смотреть смысла нет, так как весь этот механизм, экономящий память за счёт быстродействия, я только что выкинул.

Заместо этих хитростей теперь используется слово MSG, за токеном которого идёт прямой адрес строки в памяти программ, откуда надо эту строку вывести. Соответственно строки стали именоваться встроенными.

\ Ядро eForth. Ввод-вывод: msg
\ Вывести строку из памяти программ по вшитому адресу.
: msg  ( -- )   8bit U@  8bit 0!      \ разрешить спецсимволы
                R> 1+ DUP 1+ >R       \ считать и пропустить адрес
                U@ NEGATE COUNT TYPE  \ вывести строку
                8bit ! ;              \ восстановить спецсимволы

Исходный код MSG удачно показывает три особенности, которые отечественная архитектура «Электроники МК-161» накладывает на Форт. Во-первых, адрес возврата, который R> считывает со стека возвратов, на единицу меньше, чем тот, куда вернётся управление. Это связано с «прединкрементом» — ещё на советской «Электронике Б3-34» команда КИП6 сперва увеличивала R6, а уже потом считывала нужный регистр.

Во-вторых, 161eForth действительно поддерживает отрицательные адреса. Это новый подход, позволяющий стандартным словам TYPE и COUNT работать с памятью программ ЭКВМ. Проверить знак адреса на «Электронике» можно быстрее, чем «единые адреса» первого Каллисто, поэтому этот подход перспективен для Каллисто-2. Наконец, слово U@ уже должно быть знакомо по Каллисто Классик. Оно побыстрее стандартного @, так как не проверяет считанное из двух байтовых регистров целое на отрицательность. Поэтому я его люблю и часто использую.

При выводе литер (букв, цифр, спецсимволов и т.п.) на экран eForth по прежнему использует ассоциативную таблицу tblCHPUT (подробнее см. 2.2 на Хабре). Раньше её адрес устанавливался при выводе каждой литеры строки. Сейчас он устанавливается один раз, перед выводом строки — а после окончания адрес таблицы восстанавливается на ту, которая нужна адресному интерпретатору.

Учитывая, что теперь TYPE не проверяет при каждом выводе строки, стандартное ли это сообщение, скорость вывода улучшена. Практически весь экранный вывод стал немного быстрее, включая вывод чисел. Минус же в том, что не все встроенные сообщения выводятся с помощью TYPE явно, то есть не все они могут быть перенесены в память программ и заменены на MSG. Три встроенные строки, а это 35 байт (плюс 32 байта тела MSG), сейчас приходится бесхитростно держать в байтовой памяти, как на остальных платформах. Предыдущий подход позволял их полностью вынести в память программ, так как в конечном итоге все эти строки всё равно передаются TYPE.

Чтобы передавать MSG не номер (как раньше), а точный адрес строки в памяти программ, пришлось усложнить кросс-компилятор. То есть во время компиляции еФорта (транслятора) компьютер выполняет больше работы, чтобы потом eForth на калькуляторе (МК-161) работал быстрее. Это правильный подход в духе «образа мышления» Форта — ускорять программы, перенося вычисления на более ранние стадии работы: со времени исполнения на время компиляции, со времени компиляции на время редактирования исходного кода и т.п.

Форт-часть eForth уже достаточно стабильна. Отладки требует консоль — вывод литер на экран, ввод литер и строк с клавиатуры. Что-то из этого (пока не выяснил, что конкретно) иногда портит регистры и приводит к аварийному останову. Сильно бы помогло, будь алфавитная клавиатура и ввод строки уже в прошивке «Электроники». Теоретически можно прицепить к eForth стабильный ввод-вывод прошлого поколения из Каллисто Классик, выпустив релиз уже в апреле. Также в самом eForth уже есть свой (простенький) код для ввода строки. Этот родной (для eForth) код есть и в 161eForth, он используется при работе на МК-161 через последовательный порт. Но пока я верен идее оставить в eForth новую консоль, под которую накладка — использующую прерывания, автоповтор и клавиши редактирования строки, включая копирование и вставку из буфера. Если у вас есть время, можете помочь отловить в ней баги.

Поздравляю всех со 150-летием со дня рождения Ленина! Это важная и круглая дата для страны, в которой я родился. Если есть вопросы по eForth, задавайте. Попробую помочь в нём разобраться. Для начала можете написать на нём «8 ферзей», «счастливые билеты» или другой тест. Всем, даже мне, будет интересно узнать, насколько шустро работает eForth на МК-161.

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