В статье рассматриваются основы разработки программного обеспечения для 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.
Настраиваем переменные окружения:
Вот вобщем-то всё и настроено.
Теперь пришло время окинуть взглядом графическую подсистему, а заодно напишем простенькую программку, что-то вроде «Hello World!». NDS имеет два графических ядра: основное (main) используется по умолчанию для верхнего экрана и дополнительное (sub) — для нижнего. Каждое из ядер может работать в одном из шести режимов, а основное имеет ещё 2 дополнительных режима для отображения больших изображениий.
Для использования ядра мы должны сначала его включить, задать режим работы и «замапить» память.
Нашей программе потребуется вывод 2D информации, поэтому включаем 2D графическое ядро для основного экрана:
Устанавливаем видеорежим для графического ядра:
Режим фреймбуфера — прямое соответствие видеопамяти пикселям дисплея.
Далее необходимо указать графическому ядру, какую область памяти ему необходимо использовать, потому, что оба графических ядра используют общую видеопамять. Банк А используем в качестве фреймбуфера для верхнего экрана:
На этом инициализация завершена и мы уже можем выводить информацию на экран. Например, заполним экран пикселями случайного цвета.
Вот весь текст программы:
Здесь программа с мэйкфайлом: narod.ru/disk/23987391000/example1.tar.gz.html
Итак, мы только что создали, хоть и примитивную, но исправно работающую программу для Nintendo DS. В следующей статье я планирую рассмотреть работу с тайловой графикой, прерываниями, клавиатурой и сенсорным экраном на примере простенькой игры.
А тут очень хороший цикл уроков на английском: dev-scene.com/NDS/Tutorials
Для начала разберёмся, что же вообще из себя представляет эта игровая консоль. Вот, что нам говорит википедия:
* Процессор: 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