Калькулятор в стиле Forth
Написав предыдущую статью -- Управление светодиодами по UART, я спросил себя, не попробовать ли мне написать простейшую Форт-систему в качестве эдакой SoC (системы-на-чипе). Надо заметить, что в детстве, изучив язык программирования BASIC и изучая Ассемблер, я спрашивал самого себя: вот если бы процессор понимал P-код языка Basic как машинный код, быстрее бы работал такой компьютер, и если да, то насколько быстрее. Ведь если процессор, понимающий P-код, выполняет P-код быстрее, чем программа-интерпретатор, то процессор, понимающий и вовсе язык программирования BASIC, должен по идее выполнять программу ещё быстрее.
Я считал это своё юношеское рассуждение не более, чем хохмой, пока не познакомился с языком программирования Форт. С тех пор мечта иметь собственный Форт-микропроцессор не оставляла меня. Наконец-то я смогу узнать, насколько сложно её осуществить -- с таким рассуждением я и пришёл к тому, что следует попробовать написать хотя бы калькулятор, выполняющий сложение и вычитание.
Калькулятор в стиле Forth
Этот модуль я назвал VEForth1 (скачать), что расшифровывается как Vanyamba Electronics Forth 1.
За столь помпезным названием скрывается модуль, который посимвольно принимает данные, поступающие на его вход dataIN[7:0], и либо размещает положительные целые числа на стеке, либо выполняет над ними операции сложения и вычитания.
Выглядит это примерно следующим образом:
Диаграмма состояний ввода числа:
Исходный код модуля в 500 с лишним строк кода я из соображений благоразумия решил на этой странице не приводить, а общая блок-схема устройства выглядит следующим образом (скачать BDF):
Работает устройство лично у меня не слишком уверенно, периодически зависая в тех местах, где раньше (когда логических вентилей в нём было в два раза меньше) не зависало, но здесь нужно заметить, что задачу создать оптимальную конструкцию я перед собой не ставил. Тем не менее, когда работает, то это производит приятнейшее впечатление, поскольку отклик системы на ввод быстрее, чем ожидаешь от командного интерпретатора, каковым устройство выглядит внешне.
В целом интерактивная сессия выглядит примерно следующим образом:
�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>