Дело было вечером, делать было конечно есть чего, но хотелось чего-то для "отдыха". Для отдыха подойдут игры. И пусть игры будут консольными и чтобы аж пиксели видно. Ну вобщем увидел я UzeBox. =)
Это очень минималистичная и по-своему уникальная консоль основана на микроконтроллере общего назначения - AVR ATmega644. Подробности и детали здесь.
Листая вики проекта я понял, что это именно то, чего я хотел для "отдыха", и сразу захотелось что-нибудь написать под это. Чистый незамутнённый всякими ардуинами С для AVR и весьма хардкорные ограничения по ресурсам (64k флеша и 4k SRAM).
Тут я буду пытаться систематизировать то чему научился сам в максимально доступной форме. Сегодня разберем установку окружения и самый простой hello world.
Я пользуюсь Linux Mint, однако все мои действия будут актуальны и для Ubuntu, и вероятно для свежего debian'а
Для того чтобы собирать и разрабатывать что-либо для uzebox нам понадобится следующий софт
- Инструменты для компиляции кода для AVR
- Эмулятор uzebox'а и его исходники
- Ваша любимая IDE или текстовый редактор
- Немного скриптовой магии чтобы всю рутину и тоску взяла на себя машина.
Шаг 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 и радуемся =)
А вот здесь можно взять весь проект uzebox-hello-world.zip