Pull to refresh

Программирование для Nintendo DS. Первые шаги

Reading time 3 min
Views 6.7K
В статье рассматриваются основы разработки программного обеспечения для Nintendo DS под Linux. Впрочем все используемые инструменты кроссплатформенные и не должно быть больших отличий для других ОС.

Для начала разберёмся, что же вообще из себя представляет эта игровая консоль. Вот, что нам говорит википедия:
* Процессор: ARM946E-S — 67 Мгц, сопроцессор ARM7TDMI — 33 МГц
* Память: 4 МБ, 656 КБ видео памяти, 512КБ памяти для текстур
* Экран: два отдельных ЖК-дисплея, диагональ 77 мм (3 дюйма), разрешение 256х192 пикселей, до 260 тысяч цветов. Расстояние между экранами — примерно 21 мм, что эквивалентно 92 «скрытым» строкам.
* Видеосистема: Поддержка 2D и 3D (T&L, преобразование координат текстур, маппинг текстур, альфа-смешивание, сглаживание, цел-шейдинг и Z-буферизация), теоретически позволяет отрисовывать 120 000 полигонов в сек (однако, имеет ограничение на отрисовку 6144 вершин или 2048 треугольников за один кадр).
* Звук: Стерео, 16-канальный ADPCM/PCM
* Накопители: 1 слот для собственных катриджей Nintendo DS, 2 слот для катриджей Nintendo Gameboy Advance
* Связь: IEEE 802.11 (Wi-Fi), для соединения используется собственный формат Nintendo. Радиус локальной сети от 10 до 30 метров в зависимости от условий.
* Управление: сенсорный экран, встроенный микрофон для голосовой идентификации, A/B/X/Y кнопки, D-Pad, шифты L/R, кнопки Start и Select
* Время работы: 6-10 часов
* Вес: 275 грамм
* Размеры: 148,7 × 84,7 × 28,9 мм

Как мы видим у консоли имеется два процессора: ARM9 и ARM7. Основным для нас является ARM9, именно на нём будут исполняться наши программы. ARM7 обычно используется для обслуживания тачскрина, клавиатуры, микрофона и прочей периферии. Библиотека libNDS включает в себя стандартную программу для ARM7 (default.arm7), которая вполне удовлетворяет потребности в общении со стандартной периферией. Так что на начальном этапе нам не придётся задумываться о работе второго процессора.

Далее настроим среду для кросскомпиляции.
Нам потребуются:
набор средств для разработки под ARM — DevkitARM sourceforge.net/projects/devkitpro/files/devkitARM;
библиотека, упрощающая разработку для Nintendo DS — libNDS sourceforge.net/projects/devkitpro/files/libnds;
а также эмулятор, например DeSmuME — desmume.org/download.
Создаём каталог /opt/devkitpro, в который распаковываем devkitARM и libNDS.
Настраиваем переменные окружения:
export DEVKITPRO=/opt/devkitpro
export DEVKITARM=$DEVKITPRO/devkitARM

Вот вобщем-то всё и настроено.

Теперь пришло время окинуть взглядом графическую подсистему, а заодно напишем простенькую программку, что-то вроде «Hello World!». NDS имеет два графических ядра: основное (main) используется по умолчанию для верхнего экрана и дополнительное (sub) — для нижнего. Каждое из ядер может работать в одном из шести режимов, а основное имеет ещё 2 дополнительных режима для отображения больших изображениий.

Графические режимы видеоконтроллера:
Основное 2D ядро
Mode BG0 BG1 BG2 BG3
Mode 0 Text/3D Text Text Text
Mode 1 Text/3D Text Text Rotation
Mode 2 Text/3D Text Rotation Rotation
Mode 3 Text/3D Text Text Extended
Mode 4 Text/3D Text Rotation Extended
Mode 5 Text/3D Text Extended Extended
Mode 6 3D - Large Bitmap -
Frame Buffer Direct VRAM display as a bitmap
Дополнительное 2D ядро
Mode BG0 BG1 BG2 BG3
Mode 0 Text Text Text Text
Mode 1 Text Text Text Rotation
Mode 2 Text Text Rotation Rotation
Mode 3 Text Text Text Extended
Mode 4 Text Text Rotation Extended
Mode 5 Text Text Extended Extended


Для использования ядра мы должны сначала его включить, задать режим работы и «замапить» память.
Нашей программе потребуется вывод 2D информации, поэтому включаем 2D графическое ядро для основного экрана:
powerOn(POWER_2D_A);

Устанавливаем видеорежим для графического ядра:
videoSetMode(MODE_FB0);
Режим фреймбуфера — прямое соответствие видеопамяти пикселям дисплея.

Далее необходимо указать графическому ядру, какую область памяти ему необходимо использовать, потому, что оба графических ядра используют общую видеопамять. Банк А используем в качестве фреймбуфера для верхнего экрана:
vramSetBankA(VRAM_A_LCD);

На этом инициализация завершена и мы уже можем выводить информацию на экран. Например, заполним экран пикселями случайного цвета.
Вот весь текст программы:
#include <nds.h>
int main()
{
 powerOn(POWER_2D_A); //Включаем основное 2D ядро
 videoSetMode(MODE_FB0);//Включаем режим фреймбуфера
 vramSetBankA(VRAM_A_LCD);//Указываем область памяти
 uint16* buffer;
 while(true){
  buffer = VRAM_A + rand()/(RAND_MAX/SCREEN_WIDTH/SCREEN_HEIGHT); //Случайный адрес в видеопамяти
  *buffer = RGB15(rand()/(RAND_MAX/31),rand()/(RAND_MAX/31),rand()/(RAND_MAX/31)); //Случайный цвет
 }
}


* This source code was highlighted with Source Code Highlighter.

Здесь программа с мэйкфайлом: narod.ru/disk/23987391000/example1.tar.gz.html

Итак, мы только что создали, хоть и примитивную, но исправно работающую программу для Nintendo DS. В следующей статье я планирую рассмотреть работу с тайловой графикой, прерываниями, клавиатурой и сенсорным экраном на примере простенькой игры.

А тут очень хороший цикл уроков на английском: dev-scene.com/NDS/Tutorials
Tags:
Hubs:
+68
Comments 45
Comments Comments 45

Articles