UzeBox 01: Окружение

Дело было вечером, делать было конечно есть чего, но хотелось чего-то для "отдыха". Для отдыха подойдут игры. И пусть игры будут консольными и чтобы аж пиксели видно. Ну вобщем увидел я UzeBox. =)

Это очень минималистичная и по-своему уникальная консоль основана на микроконтроллере общего назначения - AVR ATmega644. Подробности и детали здесь.

Листая вики проекта я понял, что это именно то, чего я хотел для "отдыха", и сразу захотелось что-нибудь написать под это. Чистый незамутнённый всякими ардуинами С для AVR и весьма хардкорные ограничения по ресурсам (64k флеша и 4k SRAM).

Тут я буду пытаться систематизировать то чему научился сам в максимально доступной форме. Сегодня разберем установку окружения и самый простой hello world.

Я пользуюсь Linux Mint, однако все мои действия будут актуальны и для Ubuntu, и вероятно для свежего debian'а

Для того чтобы собирать и разрабатывать что-либо для uzebox нам понадобится следующий софт

  1. Инструменты для компиляции кода для AVR
  2. Эмулятор uzebox'а и его исходники
  3. Ваша любимая IDE или текстовый редактор
  4. Немного скриптовой магии чтобы всю рутину и тоску взяла на себя машина.

Шаг 1. Ставим из репозитория инструментарий для AVR

sudo apt-get install gcc-avr gdb-avr libsdl1.2-dev avrdude avr-libc build-essential

Шаг 2. Собираем uzebox со всеми его потрохами из исходников

Проект живёт на Github'е, если вы пользуетесь гитом, то достаточно где-нибудь в надёжном месте путь к которому менять не планируете выполнить

git clone https://github.com/uzebox/uzebox.git uzebox

В текущей папке будет создана папка uzebox со всем кодом внутри.

Если по каким-то причинам гит вам не нравится (а зря), то можно зайти по ссылке https://github.com/Uzebox/uzebox и скачать архив репозитория вручную.

Для сборки понадобится ещё dev версия SDL2

sudo apt-get install libsdl2-dev

теперь можно собрать все инструменты и демки

cd /путь/к/папке/uzebox/
make

Помимо официального эмулятора существует сторонний CUseBox. живёт здесь https://github.com/Jubatian/cuzebox В папке uzebox есть папка tools думаю поселить этот эмулятор туда - отличная идея. как и выше клонируем и собираем

cd tools
git clone https://github.com/Jubatian/cuzebox.git cuzebox
cd cuzebox
make

Шаг 3. Пустой проект

С инструментами закончили. Теперь пора делать костяк проекта.

В папке uzebox'а есть папка demos с примерами проектов, почти всех доступных игр и демок для данной консоли.

Во всех проектах довольно простая структура в корне проекта находится основной файл нашей игры. В данном случае это HelloWorld.c.

Файл gameinfo.properties содержит название игры, имя автора, годи жанр.это необходимо для генерации рома.

Папка data в которую складываются *.inc файлы с графикой, звуками, музыкой, картами и прочими ресурсами в виде сишных массивов.

В папке default находится Makefile и там же будет происходить сборка.

За основу я взял проект из demos/tutorial, немного его упростил, у нас же hello world всётаки, и перенастроил для третьего видеорежима (подробнее о видеорежимах - позже).

Теперь немного допилим Makefile. Надо привести верхнюю часть файла к такому виду:

## General Flags
PROJECT = HelloWorld
GAME= HelloWorld
MCU = atmega644
TARGET = $(GAME).elf
CC = avr-gcc
INFO=../gameinfo.properties
UZEBOX_DIR = /path/to/uzebox

EMUL=/tools/cuzebox/cuzebox
#EMUL=/bin/uzem

## Kernel settings
KERNEL_DIR = ${UZEBOX_DIR}/kernel
KERNEL_OPTIONS  = -DVIDEO_MODE=3 -DINTRO_LOGO=0
KERNEL_OPTIONS += -DSCROLLING=0 -DSOUND_MIXER=1 -DMAX_SPRITES=5 -DRAM_TILES_COUNT=12

В PROJECT и GAME укажем название нашего проекта, и самое главное вписать корректный путь к тому месту где у вас хранится uzebox в UZEBOX_DIR

Далее раскоментриуем строку с путём к нужному нам эмулятору, попробуйте оба и выберите какой больше нравится.

После этого добавим в конец файла цель для запуска эмулятора

.PHONY: run
run:
    -${UZEBOX_DIR}${EMUL} ${GAME}.hex

Теперь по команде make run запускается наша игра в эмуляторе. Я для себя дополнительно создал скрипт run.sh для полной перекомпиляции и запуска игры.

#!/bin/bash
cd default && make clean && make && make run

Шаг 4. Hello World

В папку data копируем шрифт 8 на 8 пикселей из demos/tutorial

И наконец-то приступим к коду =) Вот содержимое HelloWorld.c

#include <uzebox.h>
#include <avr/pgmspace.h>

#include "data/font_8x8.pic.inc"

int main(){
    // установка текущей таблицы с тайлами
    SetTileTable(font_tileset);
    // указываем откуда начинается в таблице с тайлами шрифт
    // (по порядку ascii начиная с пробела)
    SetFontTilesIndex(0);
    // очищаем видепамять
    // и автоматически заполняем экран тайлом номер 0
    ClearVram();

    // выводим текст начиная с указанной строки и столбца.
    Print(3, 13, PSTR("HELLO WORLD FROM UZEBOX!"));
    while(1);
}

Сохраняем. запускаем run.sh и радуемся =)

hello

А вот здесь можно взять весь проект uzebox-hello-world.zip