Каллисто-2: разработка быстродействующего Форта для МК-161

Каллисто-2 будет написана на SP-Forth! Подробнее см. соответствующую тему В Контакте.

Кусочек исходного кода — чтобы было понятно, как это сейчас выглядит:

0xD0 COP КИП0  0xD1 COP КИП1    0xD2 COP КИП2    0xD3 COP КИП3   0xD4 COP КИП4  0xD5 COP КИП5  0xD6 COP КИП6  0xD7 COP КИП7
0xD8 COP КИП8  0xD9 COP КИП9    0xDA COP КИПА    0xDB COP КИПВ   0xDC COP КИПС  0xDD COP КИПД  0xDE COP КИПЕ  0xDF 2OP РКИП
0xE0 COP Кx=00 0xE1 COP Кx=01   0xE2 COP Кx=02   0xE3 COP Кx=03  0xE4 COP Кx=04 0xE5 COP Кx=05 0xE6 COP Кx=06 0xE7 COP Кx=07
0xE8 COP Кx=08 0xE9 COP Кx=09   0xEA COP Кx=0А   0xEB COP Кx=0В  0xEC COP Кx=0С 0xED COP Кx=0Д 0xEE COP Кx=0Е 0xEF 2OP РКx=0

0xF2 COP РРВ/О
0xF4 3OP РРП
0xF6 3OP РРИП

\ -------------------------
\ Исходный код Каллисто-2

\ Инициализация
Cx
9 5 0 0 РРП 9042    \ Адрес таблицы свёрток
1 0 9 9 П6          \ RI := Начало шитого кода - 1
1 6 П9              \ Занесём в R9 адрес NEXT

A: NEXT
КИП6 ВП 2 КИП6 + П7 \ W := REGW[RI++], считываем CFA в R7
КИП7 РРП 9210       \ Находим по CFA адрес обработчика
П8 КБП8             \ Передаём на него управление

ORG 100             \ Обработчик 000
2 РРП 9010          \ Инициализация графического экрана
1 2 8               \ Код буквы "А"
РРП 9020            \ Вывод символа на графический экран
КГРФ                \ Обновляем индикатор
КБП9                \ NEXT

ORG 200             \ Обработчик 001
РРИП 9029           \ Чтение кода нажатой клавиши
КNOT                \ Проверка на 255
Fx≠0 00             \ Дождёмся чего-нибудь, отличного от 255
КБП9                \ NEXT

Полностью исходный код + результат качать отсюда: http://the-hacker.ru/2016/Callisto2-d4.zip

Черновик 4 выводит на экран букву, ждёт нажатия клавиши и выходит по С/П. Работает NEXT (адресный интерпретатор), но пока нет ни меток, ни имён слов. Использование SP Forth позволяет не только избежать ручной компиляции кода МК-161, но также автоматизировать множество вещей, которые в Каллисто Классик, написанной на MK.EXE, приходилось делать вручную.

Каллисто-2, черновик 5: http://the-hacker.ru/2016/Callisto2-d5.zip

Теперь шитый код генерируется SP-Forth, в полном соответствии с требованиями нового адресного интерпретатора. «Ассемблер» ЯМК вынесен в отдельный список слов. Определения примитивов выглядят весьма красиво:

code w1               \ === Обработчик 000 ===
  2 РРП 9010          \ Инициализация графического экрана
  1 2 9               \ Код буквы "Б"
  РРП 9020            \ Вывод символа на графический экран
  КГРФ                \ Обновляем индикатор
  КБП9                \ NEXT
end-code

Каллисто-2, черновик 6: http://the-hacker.ru/2016/Callisto-d6.zip

Заработали определения высокого уровня, то есть стек возвратов и CALL/EXIT. Производительность не мерил, но должно работать ощутимо быстрей Каллисто Классик.

Также добавлены циклы begin/until и begin/again для примитивов — слов на языке МК-161. Этот типично фортовский приём позволяет обходиться без меток в БП и условных переходах назад.

Каллисто-2, черновик 7: http://the-hacker.ru/2016/Callisto2-d7.zip

Начал писать терминал. Теперь после запуска Каллисто-2 выводит на индикатор нажимаемые клавиши. Раскладка примерно соответствует цифровой клавиатуре Каллисто Классик и пока не переключается в русский и латинский режимы.

На этот раз я не спешу и делаю всё, как надо. Ввод реализован с помощью прерываний. Вводимые литеры ставятся в очередь длиной 8 литер. Реализован автоповтор, впервые на «Электронике МК-161».

В метаязыке произошёл переход от 2 РРП 9010 к каллистянскому 2 9010 РРП — есть и другие изменения, которые позволят написать такую крупную программу, как транслятор Каллисто-2.

Каллисто-2, черновик 8: http://the-hacker.ru/2017/Callisto2-d8.zip

Внешне изменений нет — Каллисто-2 отображает нажатые клавиши, как и раньше. Внутри существенные изменения. Например, появился стек данных. Вершина стека теперь всегда хранится в регистре C.

Во многих реализациях Форта подобный трюк повышает быстродействие. В нашем случае выгода не очевидна. Я довольно долго размышлял над этим решением. Что-то станет работать чуть быстрей, что-то чуть медленней. Будет возможность сравнить.

Ассемблер языка МК теперь поддерживает все коды операций МК-161. Он ещё не умеет ссылаться на метки вперёд, но уже позволил реализовать десятки примитивов Каллисто, включая арифметические операции и операции со стеком. Практически каждое определение удалось записать в одну строчку. Вот некоторые из тех определений, где регистр С дал выигрыш и по размеру кода, и по скорости:

code dup ИПС КП3 КБП9 end-code
code 1+ 1 ИПС + ПС КБП9 end-code
code 2+ 2 ИПС + ПС КБП9 end-code
code 10ˣ ИПС F10ˣ ПС КБП9 end-code
code eˣ ИПС Feˣ ПС КБП9 end-code
code lg ИПС Flg ПС КБП9 end-code
code ln ИПС Fln ПС КБП9 end-code
code x² ИПС Fx² ПС КБП9 end-code
code √ ИПС F√ ПС КБП9 end-code

Команды ИП П БП ПП и несколько других стали «умными». Зная, к какому регистру или шагу происходит обращение, они сами выбирают нужный код операции — либо двухшаговой/внутристраничной, либо трёхшаговой/межстраничной команды.

Например РРИП 9000 теперь записывается в ассемблере, как 9000 ИП — ровно также, как в Каллисто. Переходы также стали использовать обратную польскую нотацию. Сперва пишем, куда. Потом пишем БП или Fx=0

При компиляции Каллисто-2 SP Forth выдаёт предупреждения о переопределении ряда слов. Это нормально. В конце-концов, мы и заняты определением слов Каллисто на Форте. Арифметические и другие операции получают новое определение.

Конечно, работы предстоит ещё очень много. Клавиатура и терминальный вывод станут куда умней. Устройство словаря Каллисто-2 пока очень примитивно, многим задумкам реализация только предстоит. Нет стековых диаграмм и другого само-документирования, хотя многое и повторяет Каллисто Классик.

Каллисто-2, черновик 9:
http://the-hacker.ru/2017/Callisto2-d9.zip

Как я уже писал в Контакте, верхние два элемента стека данных Каллисто теперь совпадают с регистрами стека X и Y. Поэтому многие примитивы упрощаются до предела, например:

code 1+ 1 + next; 
code 2+ 2 + next; 
code + + jdrop2 БП; 
code - - jdrop2 БП; 
code × × jdrop2 БП; 
code ÷ ÷ jdrop2 БП; 
code / ÷ К[x] jdrop2 БП;
code min Кmax ↔ jdrop2 БП; 
code max Кmax jdrop2 БП; 
code 10ˣ F10ˣ next; 
code eˣ Feˣ next; 
code lg Flg next; 
code ln Fln next; 
code x² Fx² next; 
code √ F√ next; 
code 1/x F1/x next; 

Также Каллисто-2 теперь состоит из трёх файлов (mkp, mkb и mkd) — все три надо передать в МК-161 или эмулятор, чтобы проверить работоспособность. В файле десятичных данных пока передаются лишь два десятичных регистра (R9 и R16), но это только начало. Больше размер исполняемого кода увеличиваться не будет, ибо уже некуда. Но с тремя файлами придётся смириться. Лучше их сохранять на внутренний диск под одним именем. Тогда они образуют «пакет» и загружать транслятор становится проще и быстрее.

Каллисто-2 (черновик 9) сперва выводит на экран приглашение, символ "@", после чего отображает по символу на каждую нажатую клавишу.

Брать здесь:
http://the-hacker.ru/2017/Callisto2-d10.zip

Клавиатура становится серьёзней — в Каллисто-2 заработал цифровой режим. Теперь кнопка "3" даёт литеру "3", а последовательное нажатие кнопок "F 3" даёт литеру "#". Разумеется, это совместимо с автоповтором и очередью клавиатуры, важными нововведениями Каллисто-2. Нажав кнопку "F" и удерживая кнопку "3", мы получим автоповтор литеры "#".

Раскладка практически повторяет Каллисто Классик. Небольшие отличия вызваны лучшей продуманностью второй реализации алфавитно-цифровой клавиатуры для «Электроники МК-161». Например, "П" даёт "!", а "F П" даёт "?" — это освободило кнопку "К" для будущих применений.

Литера "|" теперь вводится "F В↑", а литера "↵" переехала на "F ВВОД". Клавиши выбора сейчас дают свои «старшие» коды, а «младшие» коды получаются при использовании префикса "F".

Пока в качестве префиксной клавиши "F" можно использовать любую другую спецкнопку — РУС/ЛАТ и т.п. Но это ненадолго, алфавитные режимы на подходе. Тестовое приложение осталось нетронутым. Хотя драйвер клавиатуры выдаёт правильные коды "Cx" и "F Cx", для редактирования строки их пока никто не использует.

Напомню, что для запуска Каллисто-2 в «Электронику» надо передать три файла — mkp, mkb и mkd.

Каллисто-2, черновик 11: http://the-hacker.ru/2017/Callisto2-d11.zip

Тестовая программа теперь выводит приглашение ">", в остальном без изменений. Зато драйвер клавиатуры завершён. В-основном он повторяет клавиатуру Каллисто Классик, но удалось воплотить две мои древние задумки. В цифровом режиме клавиша "K" работает, как Control — например "K S" вводит ^S, управляющий символ с кодом 19 и графическим изображением «знак паузы».

Также в цифровом режиме комбинация префиксных клавиш "F K" позволяет ввести любой символ по его шестнадцатеричному коду. Например, "F K 1 3" это ещё один способ ввести тот же самый «знак паузы». Клавиши выбора (и они же с клавишей "F") в цифровом и латинском режимах дают одинаковые служебные коды. Это позволит использовать их, например, для перемещения курсора.

Чтобы реализовать всё это богатство, в ассемблере МК-161 введены метки с возможностью ссылок вперёд. Подробней я объяснял эту тему в Контакте. Над метками я ещё немного поработаю напильником, но они уже вполне работоспособны.

Каллисто-2, черновик 13: http://the-hacker.ru/2018/Callisto2-d13.zip

Благодаря поддержке русских фортеров начал переход к ALSO/ONLY, пока на уровне исходного кода. Слова кросс-компилятора теперь растасованы по спискам/словарям. Реализованные примитивы получили картинку стека. Добавлено несколько новых слов. Одно из них, слово TYPE , выводит титульную строку перед приглашением, с номером версии черновика.

Но для юзера изменений мало. По прежнему нажимаемые клавиши выводятся на индикатор, ничего нового. Напоминаю, что для запуска Каллисто-2 надо передать на МК-161 весь пакет полностью, а не только MKP. Компилируется Каллисто-2 с помощь SP-Forth 4.20

Фрагмент исходного кода. После code идёт каллистянское имя, после скобок реализация на языке ПМК:

\ Арифметика
code 1+  ( x -- x+1 )    1 +  next;
code 1-  ( x -- x-1 )    1 -  next;
code 2+  ( x -- x+2 )    2 +  next;
code 2-  ( x -- x-2 )    2 -  next;
code 2×  ( x -- x×2 )    В↑ +  next;
code 2/  ( x -- x/2 )    2 ÷ К[x]  next;
code +   ( y x -- y+x )  +  jdrop2 БП;
code -   ( y x -- y-x )  -  jdrop2 БП;
code ×   ( y x -- y×x )  ×  jdrop2 БП;
code ÷   ( y x -- y÷x )  ÷  jdrop2 БП;
code /   ( y x -- y/x )  ÷ К[x]  jdrop2 БП;

Каллисто-2, черновик 14: http://the-hacker.ru/2018/Callisto2-d14.zip

Новая, в сравнении с Классик, концепция курсора. Теперь курсор не выделяет литеру, а расположен между ними. Переделан терминальный вывод, с помощью ассоциативных таблиц МК-161. Вполне возможно, что таким он и войдёт в релиз. Начата реализация обновлённого ACCEPT — но пока там одни строительные леса, управление туда не передаётся.

С точки зрения юзера вводимые клавиши выводятся на индикатор, как раньше. Зато теперь куда больше управляющих символов поддерживается. В режиме NUM комбинация ^L (K–) очищает экран, ^J (K8) переходит на строчку вниз, ^G (K БП) звонок и т.д.

В том же режиме NUM работает FK и две цифры шестнадцатеричного кода символа. Буквы A, B, C, D, E и F это кнопки ШГ влево, В/О, С/П, K, ИП и П — они такие же в режиме ЛАТ. Надо лишь помнить, что С/П я пока не отключал и при нажатии на эту кнопку МК-161 перестаёт выполнять черновик.

Кнопка Выход (она же К стрелка влево) завершает выполнение программы. И да, добавил GPL в архив.

Каллисто-2, черновик 15: http://the-hacker.ru/2018/Callisto2-d15.zip

Сегодня задышал новый ACCEPT

Его ещё надо отлаживать, оптимизировать и дорабатывать. Не все клавиши редактирования работают. Зато символы вставляются в позицию курсора, курсор уже можно гонять влево-вправо. Ввод строки теперь близок к завершению, с автоповтором и другими удобствами улучшенной клавиатуры Каллисто-2.

ACCEPT будет работать через вспомогательное слово (ACCEPT) — которое позволяет редактировать заготовку строки. Это большой шаг к улучшению редактора экранов Каллисто. В Каллисто Классик редактировать экраны на борту было можно, но во входящем в комплект редакторе (другого никто не написал) при любом изменении строки приходилось набивать её заново. Теперь (ACCEPT) позволит вносить нужные изменения с клавиатуры ЭКВМ, не перебивая строку целиком.

В ближайших планах сделать комбинации клавиш для уборки строки в карман (F ↓) и вставки её оттуда (F↑) — как в Лексиконе. Карман отнимет 92 байта драгоценной байтовой памяти, но должен добавить удобств при разработке приложений на борту МК-161.

Каллисто-2, черновик 16: http://the-hacker.ru/2018/Callisto2-d16.zip

Часть ненужного кода закомментировал. Исправил ряд ошибок и провёл первую оптимизацию ACCEPT

Удалось избавиться от R20, весь ACCEPT аккуратно уложился в традиционные советские регистры. Ещё остался баг — при перемещении курсора в конец строки иногда он появляется не там, где нужно. Клавиша «влево» возвращает курсор на место.

Интересно, что пришлось реализовать уникальную языковую конструкцию tails … then для хвостовой рекурсии. Пример использования см. в AccCTL. Но это в языке ПМК. Не факт, что она войдёт в Каллисто.

Каллисто-2, черновик 17: http://the-hacker.ru/2018/Callisto2-d17.zip

Исправление ошибок и оптимизация ACCEPT

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

Каллисто-2, черновик 18: http://the-hacker.ru/2018/Callisto2-d18.zip

Заработал ACCEPT — полностью. Теперь буду оптимизировать, но почти все задумки и хотелки реализованы. Клавиши редактирования строки:
← → Переместить курсор на одну позицию влево / вправо
F← F→ Переместить курсор в начало / конец строки
↑ ↓ Переместить курсор на 8 позиций влево / вправо
Сх (BS) Удалить литеру слева от курсора
F Сх (F BS) Удалить все литеры справа от курсора
F ↓ Очистить строку, забрав её в карман
F ↑ Вставить карман в текущую позицию курсора
ВВОД Завершает редактирование строки

Клавиши редактирования можно комбинировать. Например, F← F Сх удалит всю входную строку, не меняя содержимое кармана.

Карман сохраняется между вызовами ACCEPT и хранит не только литеры, но и позицию курсора. Туда, например, можно занести длинное слово и вставить его несколько раз. Если вам нужно продолжить редактирование строки после её сохранения в карман, используйте комбинацию F↓ F↑

Ну и несколько советов по клавиатуре. «Стрелки» не работают в русском режиме, на них «висят» русские буквы. Если надо ввести в строку сами «стрелки», нажмите перед ними в режиме NUM кнопку K. Например, литера ↑ вводится комбинацией K↑

Также напоминаю, что кнопка С/П останавливает программу.

Черновик 18 — значительный прогресс в сравнении с Каллисто Классик, где помимо клавиши ВВОД было всего две клавиши редактирования — удалить последний введённый символ (Cx) и очистить всю строку (F Cx).

Каллисто-2, черновик 20: http://the-hacker.ru/2018/Callisto2-d20.zip

Представляю одно из главных нововведений Каллисто-2 — хэш-функцию. Черновик 20 вводит строку с клавиатуры, потом выводит на индикатор её и её хэш.

Именно сравнение имён слов не посимвольно, а по их хэшу позволит Каллисто-2 достичь приемлемого быстродействия уже на «Электронике МК-161». Немного про выбранную хэш-функцию:

  1. Большие и малые буквы не отличаются ни в русском, ни в английском алфавитах. У имён TRUE , True и true хэш одинаков: 56118436.
  2. Хэшируются только три буквы имени — первые два символа и один последний.
  3. Хэш-функция учитывает длину имени. Поэтому АБВГ и АБГ имеют разные хэши 4708 и 4707, несмотря на одинаковые символы в начале и конце.

[quote=AtH]Хэш-функция учитывает длину имени. Поэтому АБВГ и АБГ имеют разные хэши 4708 и 4707, несмотря на одинаковые символы в начале и конце.[/quote]
АБВГ и АББГ будут иметь одинаковый хэш?

Да. Если два имени имеют одинаковую длину, их первые два символа и последний совпадают — хэш-функция даст одинаковые значения. Такова цена быстродействия.

Тем не менее, это существенно лучше MSX BASIC’а, где переменные различались по первым двум символам. Там AB1 и AB2 обращались к одной переменной AB, в Каллисто-2 это три разных слова.

Каллисто-2, черновик 21: http://the-hacker.ru/2018/Callisto2-d21.zip

80 уже реализованных примитивов получили свои «десятичные заголовки», записанные в регистрах ЭКВМ с номерами 100-179. Это важный шаг по направлению к альфа-версии Каллисто-2. Для сравнения — в Каллисто Классик 298 слов.

Два 4-значных числа перед #code это хэш имени, рассчитанный словом HASH на «железной» МК-161. При программировании «на борту» эти хэши МК-161 будет вычислять самостоятельно и незаметно для владельца. Хочется ещё раз поблагодарить разработчиков «Электроники МК-161». Разрабатывать и отлаживать Каллисто, пользуясь настоящим физическим калькулятором — одно удовольствие. Прямо чувствуешь, как на глазах зарождается ПМК мечты.

Поле CFA и соответствующая ему свёртка с адресом обработчика (ещё одно know how Каллисто-2) генерируются автоматически. На прежнем уровне технологий, когда Каллисто писалась на MK.EXE, такие автоматические вычисления во время компиляции транслятора были бы невозможны. Поэтому второе спасибо — разработчикам СПФ.

\ Арифметика
0022 7170 #code 1+  ( x -- x+1 )    1 +   next;
0022 7234 #code 1-  ( x -- x-1 )    1 -   next;
0023 1778 #code 2+  ( x -- x+2 )    2 +   next;
0023 1842 #code 2-  ( x -- x-2 )    2 -   next;
0023 3570 #code 2×  ( x -- x×2 )    В↑ +  next;
0023 1906 #code 2/  ( x -- x/2 )    2 ÷ К[x]  next;
…

\ Примитивы МК-161
0000 4161 #code √    ( p -- x )    F√    next;
0035 2706 #code LN   ( p -- x )    Fln   next;
0035 2482 #code LG   ( p -- x )    Flg   next;
0040 8994 #code X²   ( x -- p )    Fx²   next;
0032 1474 #code Eˣ   ( x -- p )    Feˣ   next;
3273 8755 #code 10ˣ  ( x -- p )    F10ˣ  next;
9330 7267 #code |X|  ( x -- p )    К|x|  next;

Посмотрел, спасибо. На TI-84+ доступен ассемблер, что упростило задачу. Мой первый Форт тоже где-то в таком возрасте был написан.

В целом же проект менее серьёзен. Нет плавучки и собственно калькулятора, вокруг которого построена Каллисто. Документация не завершена. Поддержки русского языка нет и вряд ли будет. Входная строка чуть лучше Каллисто Классик, но похуже Каллисто-2. Редактор экранный, но пока не разбивает редактируемый текст на строки.

Каллисто решила две большие вещи. Совместимость «снизу вверх» с языком МК-61, а также выход из «песочницы» МК-161. Для большинства приложений, где быстродействие не критично, разработчикам будет достаточно Каллисто.

Форт для TI-84+ предоставляет быстродействующую, но целочисленную замену TI-BASIC.

Каллисто-2, черновик 23: http://the-hacker.ru/2019/Callisto2-d23.zip

Улучшена формула хэш-функции. Теперь для различения слов используются первые три символа имени, плюс длина. Так было и у Чака Мура, в своё время. Из этого правила два исключения. Если имя начинается с ARC или END — они учитываются, как один символ.

Новая формула позволяет различать слова BLANK и BLOCK — для предыдущей функции это было невозможно. Исключения позволяют отличать arcsin от arccos , а также готовят к реализации CASE

Также я начал реализацию атомов — новейшей концепции Каллисто-2, позволяющей улучшить быстродействие языка. Атом — подпрограмма на языке МК, которой можно дать имя и вызывать из слов, написанных на Каллисто. В шитом коде атом, скорее всего, будет представлен своим адресом в памяти программ. Итого атом будет занимать мало места, а исполняться максимально быстро. За скорость придётся платить. Атому недоступна такая «магия Форта», как параметризация слова через поле данных, а также (возможно) параметры вызова, скомпилированные в шитый код. Поэтому не все слова Каллисто-2 могут быть реализованы, как атомы.

Атом Каллисто-2 близок к примитиву Каллисто Классик, но есть и различия. Например, атом может быть словом высокого уровня, написанным в процедурном коде. Также не любая подпрограмма МК-161 является атомом — атому надо соблюдать ряд регистровых соглашений, чтобы не нарушить работу среды.

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

Каллисто-2, черновик 24: http://the-hacker.ru/2019/Callisto2-d24.zip

Перешёл на новый адресный интерпретатор (АИ) с поддержкой атомов. Он примерно на треть (точно не измерял, подсчитал число инструкций) быстрее Каллисто Классик и занимает меньше места — 29 шагов вместо 48. Основная же выгода в том, что после вызова атома и до возврата из него накладные расходы на интерпретацию 0%. Атомы могут вызывать другие атомы (процедурный код), всё это обрабатывается традиционным ПП … В/О. Никакой ручной возни со стеком возврата, и даже два верхних элемента «бесконечного» стека данных доступны в регистрах X и Y.

Атомы сразу освободили 80 байт дорогой байтовой памяти, по сравнению с предыдущими черновиками — им не требуется поле кода. В шитый код атом компилируются очень просто, своим начальным адресом в памяти программ. При необходимости можно сделать полшага назад — ускорить АИ за счёт байтовой памяти, низведя атомы в привычный статус обработчиков.

АИ Каллисто-2 очень необычен для поклонников Форта (адрес NEXT теперь не используется, я даже закомментировал метку), зато очевиден для любителей ПМК.

«Я терпеть не могу компьютеров, особенно тех, которые что-то мне запрещают. Он думает, что если запретил мне выключать движок, то я так и послушался!» © Михаил Пухов

Новосибирск запретил нам исполнять код из памяти данных — Гарвард, гришь? Хорошо. Я написал короткие подпрограммы на все случаи жизни, а в памяти данных размещаем цепочку адресов этих подпрограмм. Плюс слова Форта, чьи поля данных интерпретируются разнообразными обработчиками.

У программистов Каллисто-2 будет даже CREATE DOES> для создания своих обработчиков — то, что мне не удалось сделать в 2017 (в 1.0 поддерживается только <BUILDS DOES>). Это уже заложено в новый АИ, гениальная отечественная реализация (Москва, 2019) гениальной идеи Чака Мура (Шарлотсвилл, 1971). Разработчику теперь не обязательно знать, что Каллисто запущена поверх Гарварда. :-)

Этот каллистянский трюк нам пригодится, и когда полезем в ПЗУ 8051. Вообще, новый АИ уже просится под напильник (заменить псевдоBCD на честную двоичку, десятичные регистры на РОН) — и в прошивку!

Вот, как знакомо и по ПМКшному теперь выглядят атомы Каллисто:

\ Арифметика
0022 7170 #atom 1+ ( x — x+1 ) 1 + В/О;
0022 7234 #atom 1- ( x — x-1 ) 1 - В/О;
0023 1778 #atom 2+ ( x — x+2 ) 2 + В/О;
0023 1842 #atom 2- ( x — x-2 ) 2 - В/О;
0023 3570 #atom 2× ( x — x×2 ) В↑ + В/О;
0023 1906 #atom 2/ ( x — x/2 ) 2 ÷ К[x] В/О;
0000 1377 #atom + ( y x — y+x ) + jdrop2 БП;
0000 1441 #atom - ( y x — y-x ) - jdrop2 БП;
0000 3169 #atom × ( y x — y×x ) × jdrop2 БП;
0000 3073 #atom ÷ ( y x — y÷x ) ÷ jdrop2 БП;
0000 1505 #atom / ( y x — y/x ) ÷ К[x] jdrop2 БП;
…

\ Атомы МК-161
0000 4161 #atom √ ( p — x ) F√ В/О;
0035 2706 #atom LN ( p — x ) Fln В/О;
0035 2482 #atom LG ( p — x ) Flg В/О;
0040 8994 #atom X² ( x — p ) Fx² В/О;
0032 1474 #atom Eˣ ( x — p ) Feˣ В/О;
3273 8755 #atom 10ˣ ( x — p ) F10ˣ В/О;
9330 7267 #atom |X| ( x — p ) К|x| В/О;
0007 9074 #atom СЧ ( — p ) ↔ КП3 ↔ КСЧ В/О;
0003 2674 #atom ЗН ( x — n ) КЗН В/О;
3139 5811 #atom /-/ ( x — x1 ) /-/ В/О;
3273 3443 #atom 1/X ( x — x1 ) F1/x В/О;
6079 1715 #atom [X] ( x — x1 ) К[x] В/О;
9264 3747 #atom {X} ( x — x1 ) К{x} В/О;

\ Тригонометрия МК-161
5471 2967 #atom RADIANS ( — ) 1 p: SetAng 9045 П Fo В/О;
4544 1767 #atom DEGREES ( — ) 0 SetAng БП; \ Нельзя Cx, т.к. верхушки стеков совпадают
9195 4980 #atom ARCSIN ( x — x1 ) Farcsin В/О;
9188 1444 #atom ARCCOS ( x — x1 ) Farccos В/О;
9195 9523 #atom ARCTG ( x — x1 ) Farctg В/О;
5541 3699 #atom SIN ( x — x1 ) Fsin В/О;
4482 4675 #atom COS ( x — x1 ) Fcos В/О;
0038 9346 #atom TG ( x — x1 ) Ftg В/О;

Каллисто-2, черновик 25: http://the-hacker.ru/2019/Callisto2-d25.zip

Внешне черновик тот же самый. Разве что пара багов исправлена.

Внутри два больших изменения — больше по форме, чем содержанию. Во-первых, я перешёл на общепринятые соглашения Форта для метакомпиляции, разные суровые THERE и C,-T

Старый наивный код мне нравился больше, но по мере роста и усложнения Каллисто формальности помогут избежать ошибок. Это большой шаг к метакомпиляции. Кросс-компилятор почти завершён, но я решил опубликовать этот черновик до важных финальных правок.

Второе изменение заключается в «причёсывании кросс-ассемблера». Обычно в Форте команды ассемблеров оканчиваются запятой. Мне долго удавалось этого избегать. Но раз уж мы держим курс на шустрый процедурный код, придётся как-то отличать в атомах, например, команду ПМК + от каллистянского слова +

Это я ещё игнорирую слово + СП-Форта, которое удаётся не выпускать за пределы стандартного словаря. :-) Также я сделал подсчёт и вывод числа реализованных слов. Сейчас Каллисто-2 знает 83 слова, в итоге получится примерно 300. Мы уже приближаемся к альфа-версии. Как только кросс-компилятор будет завершён, можно начать переносить уже готовые слова из Каллисто Классик. Но у меня в планах несколько серьёзных улучшений языка. Пока дорожная карта такая:

  1. Каллисто-2 для МК-161 на языке МК. (в процессе подготовки к альфа-версии)
  2. Ассемблер x86 и Каллисто-2 для DOS — или под более мощный отечественный ПМК, если у кого-нибудь получится такой выпустить.
  3. Метакомпиляция Каллисто-2 под DOS’ом. Мощностей DOS должно хватить, чтобы отбросить ступень СПФ.
  4. Каллисто-2 под W77LE516P (третий форт-ассемблер), если к тому времени будет ясно, как на МК-161 работают клавиатура и индикатор.
  5. Разработка отечественного ПМК, родного железа под Каллисто?

Допустим пока про реализацию под МК-161 (можно дать эмулятор для начала), а в последних разделах как для других платформ это использовать. Доходы от книги направьте на разработку железа под Каллисто :-) Можно над Бумстартере попробовать профинансировать. В подарки выставьте устройства+книгу, в пределах разумной стоимости я бы купил. В принципе я мог бы даже попробовать написать главы про создание системы компьютерной математики (для школы), потребуется хотя бы эмулятор, на котором хватит места и быстродействия языка. eMKatic же вроде может ???

Замечательную книгу по Каллисто написал Миша Рамендик — Руководство, есть в комплекте. Будет готова Каллисто-2, может тоже напишет. Писать книги должны писатели.

Как учитель, я больше работаю над воспитанием последователей, кто сможет развивать систему дальше. С финансированием пока не очень хорошо. На уровне выживания, но чуть-чуть развивать систему удаётся. Перенос eForth’а сам по себе показывает успех идей Каллисто, но он также дал несколько интересных идей для развития.

В целом Каллисто-2 будет меньше выдавать себя за Форт. Кому нужен именно Форт, тем eForth’а достаточно. Каллисто-2 будет гораздо ближе к общеизвестному входному языку «Электроники МК-161», без лишних абстракций и излишних уровней иерархии. Но именно такой входной язык, который нужен. Бесконечный стек, имена подпрограмм и переменных, редактирование исходного текста и компиляция на борту — все эти достижения останутся.

Например, привычные всем П и ИП останутся для прямого обращения к регистрам. Слова @ и ! останутся лишь для двухбайтовых переменных. В Каллисто Классик они использовались также для доступа к десятичным регистрам. Эта проверка номера регистра при каждом обращении к памяти не нужна и только замедляет работу, выкину нафиг.

Трансляцию адресов и «единое адресное пространство» также выкину. Будут прямо те номера регистров и адреса, как их в Новосибирске придумали. Без имитации линейной памяти Форт-систем. Тоже должно ускорить работу. Чтение из памяти программ осуществляет слово ИПРГ, этого достаточно.

По идее хорошо должен подойти CASIO Algebra FX 2.0, там процессор 186, насколько я помню есть Си чуть ли не Borland C++ работает, хотя бы на первых порах пускай будет хоть одно устройство, где Каллисто будет работать на борту быстро ! Сейчас эти машинки очень дёшевы, максимум тыщи 4 за штуку, а возможности у них приличные, и их было выпущено много ! У вас же упоминается X86 реализация. Вообще популярны в мире CASIO Prizm особенно последняя cg50 (говорят их и в Москве охотно берут), там тоже программирование на С/С++ доступно, уже чуть ли не Python реализован, чем Каллисто хуже ? Если выпустим народный девайс, то думаю можно будет договориться о реализации с московским магазином калькуляторов, они даже сами хотели такое финансировать, главное начать ! Если что у меня есть все эти модели, можно будет проверить как будет работать на них хотя бы частичная реализация.

Реализация на x86 не самоцель, а средство достижения метакомпиляции — чтобы Каллисто смогла откомпилировать саму себя. IBM PC с MS-DOS’ом предоставляет достаточно хорошую среду для этого. Объёмы памяти, текстовый редактор и другие средства разработки, всё подходит. При этом IBM PC сейчас эмулируют на всём, что работает.

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

(Удалено)