Калькулятор в стиле Forth

Написав предыдущую статью -- Управление светодиодами по UART, я спросил себя, не попробовать ли мне написать простейшую Форт-систему в качестве эдакой SoC (системы-на-чипе). Надо заметить, что в детстве, изучив язык программирования BASIC и изучая Ассемблер, я спрашивал самого себя: вот если бы процессор понимал P-код языка Basic как машинный код, быстрее бы работал такой компьютер, и если да, то насколько быстрее. Ведь если процессор, понимающий P-код, выполняет P-код быстрее, чем программа-интерпретатор, то процессор, понимающий и вовсе язык программирования BASIC, должен по идее выполнять программу ещё быстрее.

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

Калькулятор в стиле Forth

Этот модуль я назвал VEForth1 (скачать), что расшифровывается как Vanyamba Electronics Forth 1.

За столь помпезным названием скрывается модуль, который посимвольно принимает данные, поступающие на его вход dataIN[7:0], и либо размещает положительные целые числа на стеке, либо выполняет над ними операции сложения и вычитания.

Выглядит это примерно следующим образом:

Диаграмма состояний ввода числа:

Исходный код модуля в 500 с лишним строк кода я из соображений благоразумия решил на этой странице не приводить, а общая блок-схема устройства выглядит следующим образом (скачать BDF):

Блок-схема устройства калькулятора в стиле Форт VEForth1

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

В целом интерактивная сессия выглядит примерно следующим образом:

10 9 - ?

00000001

65536 32768 ?

00032768

6425376 32452376 35247326 32562 ?

00032562

+ + + + ?

74190408

-

Overflow

1 -?

00000000

2 2 + 2 - ?

00000002

1 2 + ,

Error

1 2 +?

00000003

Жирным шрифтом выделен ввод пользователя, обычным шрифтом - вывод от устройства. Управляющий символ '?' выводит на экран значение на вершине стека, управляющие символы '+' и '-' означают соответственно операции сложения и вычитания. Как и полагается Форт-системе, операции производятся не над регистрами, а над данными на стеке.

Весьма фортуозно выглядит то, что между управляющими символами можно не добавлять символов-разделителей, таких как пробел или Enter. Получаются как бы форт-слова +?, -+, что мне как любителю Форта в целом отрадно.

При вводе символа, который устройство не распознаёт, выводится сообщение Error, при попытке вычесть числа с отрицательным результатом или сложить слишком большие числа выдаётся сообщение Overflow.

Модуль ram1 сгенерирован с помощью Megafunction Wizard.

Автор: Андрей Шаройко <vanyamboe@gmail.com>