Разработка игр для Брус-16 на DSL

Рекомендуется использовать Python как препроцессор. Исходный код игры размещается в f-строке, что позволяет на этапе компиляции:

  • Вычислять константы.
  • Генерировать повторяющиеся фрагменты кода.
  • Встраивать сгенерированные данные непосредственно в текст программы.

Особенности DSL

  • Переменные: глобальные (на верхнем уровне) и локальные (внутри функций).
  • Функции: определяются ключевым словом def.
  • Управляющие конструкции: if, elif, else, while, return, pass.
  • Операторы:
    • арифметические: +, -, *;
    • побитовые: &, |, ^, <<, >>;
    • сравнения: ==, !=, <, <=, >, >=;
    • присваивания, простые и составные (=, +=, -= и т.п.).
  • Индексация массивов: my_array[index].
  • Глобальные переменные и функции могут быть объявлены в любом порядке.

Отличия от Python

  • Ключевое слово global не используется.
  • Один тип — 16-битные знаковые целые.
  • Косвенные вызовы функций не поддерживаются.
  • Отсутствуют также: цикл for, классы, исключения, импорты и прочие расширенные возможности Python.
  • В текущей версии компилятора не проверяется согласованность return и если возвращаемое значение не используется, его все равно необходимо присвоить переменной, такой как _.

Макросы

  • peek(address): чтение 16-битного слова из памяти данных.
  • poke(address, value): запись 16-битного слова в память данных.
  • wait(): ожидание начала следующего кадра (синхронизация с частотой обновления экрана).
  • shra(x, y): арифметический (знаковый) сдвиг вправо.
  • ltu(x, y): беззнаковое сравнение "меньше чем".
  • set_fp(address): установка указателя фрейма (fp). Функции, в которых вызывается set_fp, не должны использовать локальные переменные.