Тем, кому посчастливилось написать свою первую программу на Бейсике в конце восьмидесятых, объём интерпретатора в 16 килобайт кажется вполне естественным. Так было не всегда, известны интерпретаторы объёмом в 8 и 4 килобайта, конечно, с более скромным набором функций. Но в этот раз сделано, казалось бы, невозможное — интерпретатор ужат до 722 байт. Это меньше, чем 768, а значит, его получится поместить не в четыре, а в три микросхемы ПЗУ по 256 байт. Да, были и такие!
А 768 байт — это, между прочим, в 21,(3) раза меньше, чем 16384.
Интерпретатор написан для малопопулярного среди ретрокомпьютерщиков процессора 8008. Для него уже есть интерпретатор Бейсика — SCELBAL, но он 8-килобайтный. Система команд 8008 напоминает систему команд 8080 без половины инструкций. Или систему команд Z80 без 90% инструкций.
Первая версия интерпретатора, в которой уже имелись слова GOTO, INPUT, PRINT, а также был предусмотрен стандартный для интерпретаторов Бейсика способ редактирования программы, заняла 570 байт. Затем список слов был расширен до следующего: FETCH, GOTO, IF, LET, NEW, OUT, PRINT, STOP, VIEW и XECUTE.
Некоторые из них покажутся вам странными. А всё дело в том, что данный интерпретатор распознаёт слова по первой букве. Поэтому INPUT пришлось превратить в FETCH, LIST — в VIEW, а RUN — в XECUTE. А GOSUB и RETURN не предусматривать вообще — тогда бы пришлось выйти за пределы запланированного объёма.
Автор понимает пользователей портативного компьютера MCM/70, также выполненного на 8008, оборудованного двухкассетником и программируемого на языке APL с его однобуквенными командами.
Проект вместе с эмулятором доступен здесь под лицензией MIT. Реального железа на 8008 у автора нет. Также можно скачать ассемблерный исходник и результат компиляции с комментариями отдельно.
Самый простой способ собрать весь проект с GitHub — воспользоваться NETBEANS 8.2, также потребуется SDL2. Для сборки ассемблера необходим макроассемблер AS.
Комментарии (15)
mobi
06.05.2019 09:07+1А что, если вместо первого символа рассматривать что-то вроде
(первый символ << 3) | ((второй символ >> 1) & 07h)
(или еще более простой хэш, не дающий коллизий на известных командах)? До 768 байт место еще есть. А то «XECUTE» вместо «RUN» — это уже какой-то странный BASIC…
we1
06.05.2019 09:25+1А намного увеличится код, если брать не первую букву, а контрольную сумму? Может, если перебрать команды, то окажется, что контрольные суммы комманд (по одному из простейших алгоритмов) будут разными, и получится использовать привычные названия?
assembled
07.05.2019 03:43Сразу вспомнился Forth, его старые реализации различали слова только по первым 3 буквам и длине.
kaleman
06.05.2019 09:55+1А при чем тут МК-85?
tormozedison Автор
06.05.2019 09:56Пример машины со стереотипным для конца восьмидесятых 16-килобайтным Бейсиком.
joker2k1
06.05.2019 20:28+1Если мне не изменяет память, был же на БК язык какой-то встроенный — фокал, там все операторы были однобуквенные )
TheShock
07.05.2019 03:16RUN — в XECUTE
А зачем, если там нету других ключевых слов на R?red_andr
07.05.2019 04:52RETURN
sav1812
07.05.2019 11:30+1RETURN
«А GOSUB и RETURN не предусматривать вообще — тогда бы пришлось выйти за пределы запланированного объёма.»red_andr
07.05.2019 14:54Не знаю, я в исходниках посмотрел, там RETURN есть. Иначе действительно, зачем RUN переименовать?
Telmah
07.05.2019 15:10в последнем коммите добавились CALL (вместо gosub) и RETURN — до этого они были в todo
Sedge
О, МК-85, моя юность. Таблицы расчета стрельбы на военке… Как я гордился своим ноу-хау и как бухтел наш подполковник про молодежь, которая простейшие вычисления в голове уже сделать не в состоянии :)