Втиснуть Бейсик в 768 байт

Автор оригинала: Paul Robson
  • Перевод

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

Подробнее
Реклама

Комментарии 15

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

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

              +2
              Пример машины со стереотипным для конца восьмидесятых 16-килобайтным Бейсиком.
              +1
              Если мне не изменяет память, был же на БК язык какой-то встроенный — фокал, там все операторы были однобуквенные )
                0
                Да, Фокал в ПЗУ блока МСТД.
                  +1
                  Так у него же и BASIC операторы распознавал по двум-трем буквам:
                  image
                  +1
                  RUN — в XECUTE
                  А зачем, если там нету других ключевых слов на R?
                    0

                    RETURN

                      +2
                      RETURN


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

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

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

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое