И вспомнил, как я его писал. Ещё в школе.
МК-52 -- программируемый советский микрокалькулятор. Он программируется в шестнадцатеричных кодах. Для их ввода можно воспользоваться клавиатурой, на которой написаны разные действия. Это помогает вводить программу и записывать на бумагу. На бумаге пишут, к примеру:
1 2 В↑ + С/П
Это значит, сложить 1+2 и закончить программу.
А в памяти (и встроенном просмотрщике программы) это отображается так:
50 10 0E 02 01 (читать надо справа налево)
МК-85 более крутой, он поддерживает Бейсик. Писать эмулятор на Бейсике извращение ещё то. Нет, место, где хранить программу в кодах -- есть. Вопрос, как её выполнять?
Допустим, в переменной D хранится код очередной операции. И её надо выполнить. Что же делать?
Логика подсказывает простой дедовский способ:
100 IF D=0 THEN ...
101 IF D=1 THEN ...
И тут меня ждала засада. В двух частях:
1. В МК-85М всего 5317 байт (!) памяти. Да, бейсик представляется в байт-коде, т.е. каждое ключевое слово идёт как 1 байт. Но всё равно памяти мало.
2. Скорость выполнения программ будет просто умопомрачительной, т.к. чтобы выбрать правильное действие, надо пробежать в среднем по половине проверок. А работает калькулятор так, что добавка даже 2-3 строчек, выполняющих простые операции -- заметна.
Короче говоря, мне не хватало десятка килобайт и быстродействие хорошо было бы увеличить раз эдак в сто...
Потом я прочитал интересную вещь. Оказывается в Бейсике МК-85 команды GOTO и GOSUB (подпрограмма) могли принимать не только число. Но и переменную. И даже выражение.
Это и был ключ к тому, как всё уместить в 5317 байт.
100 GOSUB D+1000
//...
1000 (действие1):RETURN
1001 (действие2):RETURN
//и так далее для всех ~200 кодов операций