Тем, кому посчастливилось написать свою первую программу на Бейсике в конце восьмидесятых, объём интерпретатора в 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)


  1. Sedge
    06.05.2019 09:01
    +1

    О, МК-85, моя юность. Таблицы расчета стрельбы на военке… Как я гордился своим ноу-хау и как бухтел наш подполковник про молодежь, которая простейшие вычисления в голове уже сделать не в состоянии :)


  1. mobi
    06.05.2019 09:07
    +1

    А что, если вместо первого символа рассматривать что-то вроде
    (первый символ << 3) | ((второй символ >> 1) & 07h)
    (или еще более простой хэш, не дающий коллизий на известных командах)? До 768 байт место еще есть. А то «XECUTE» вместо «RUN» — это уже какой-то странный BASIC…


  1. we1
    06.05.2019 09:25
    +1

    А намного увеличится код, если брать не первую букву, а контрольную сумму? Может, если перебрать команды, то окажется, что контрольные суммы комманд (по одному из простейших алгоритмов) будут разными, и получится использовать привычные названия?


    1. Prototik
      06.05.2019 18:28
      +1

      Контрольную сумму ещё подсчитать надо, а это +ещё несколько байт.


    1. assembled
      07.05.2019 03:43

      Сразу вспомнился Forth, его старые реализации различали слова только по первым 3 буквам и длине.


  1. kaleman
    06.05.2019 09:55
    +1

    А при чем тут МК-85?


    1. tormozedison Автор
      06.05.2019 09:56

      Пример машины со стереотипным для конца восьмидесятых 16-килобайтным Бейсиком.


  1. joker2k1
    06.05.2019 20:28
    +1

    Если мне не изменяет память, был же на БК язык какой-то встроенный — фокал, там все операторы были однобуквенные )


    1. tormozedison Автор
      06.05.2019 21:11

      Да, Фокал в ПЗУ блока МСТД.


    1. igormu
      07.05.2019 09:26
      +1

      Так у него же и BASIC операторы распознавал по двум-трем буквам:
      image


  1. TheShock
    07.05.2019 03:16

    RUN — в XECUTE
    А зачем, если там нету других ключевых слов на R?


    1. red_andr
      07.05.2019 04:52

      RETURN


      1. sav1812
        07.05.2019 11:30
        +1

        RETURN


        «А GOSUB и RETURN не предусматривать вообще — тогда бы пришлось выйти за пределы запланированного объёма.»


        1. red_andr
          07.05.2019 14:54

          Не знаю, я в исходниках посмотрел, там RETURN есть. Иначе действительно, зачем RUN переименовать?


        1. Telmah
          07.05.2019 15:10

          в последнем коммите добавились CALL (вместо gosub) и RETURN — до этого они были в todo