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

    В статье рассматриваются основы разработки программного обеспечения для 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
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 45
    • 0
      Видел вашу статью в песочнице но кармы не хватило на инвайт, а так поздравляю! Пишите много интересных статей ;)
      • 0
        Спасибо.
        Планы уже есть :)
      • +1
        самое главное не рассказали, как это потом в NDS запихивать.
        • +1
          Я пользуюсь флеш-картриджем. Самый простой метод.
        • 0
          ИМХО, PAlib для этих целей подходит гораздо лучше и для освоения понятнее. В нём для создания этой программы необходимо 2 строчки + автоматически присутствует sleep-mode.

          А запустить программу на ДС можно не только с помощью флеш-картриджа, есть и другие способы :)

          Автору удачи и спасибо, буду ждать продолжения.
          • +1
            libNDS всё-таки более низкоуровневая. Люблю быть поближе к железу, чуть было не с ассемблера хотел начать, но поленился :)
            А вообще к PAlib присмотрюсь попристальнее. Спасибо.
            • 0
              Да там и так всё почти на одном уровне, обращение-то сразу к железу идёт…
              Как там с документацией?
              • +1
                Также стоит добавить, что вы правы, используя DeSmuME для проверки — остальные эмуляторы не запускают не подписанные приложения
                • 0
                  Документация очень хорошая.
                  • 0
                    Спасибо, проверим :)
                    • 0
                      Кстати, насчёт не подписанных приложений: на no$gba и ideas тоже нормально работало.
                      Честно говоря первый раз слышу про подписывание для NDS.
                      • 0
                        Перепробовал очень много версий, не запускала ни одна. А подписывание необходимо, если вы хотите запустить приложение не с флешки, а через Download Play.
                        • 0
                          FlashMe решает эту проблему.
                          • 0
                            Забываешь, что для прошивки всё равно нужен картридж :(
                            • 0
                              Первые партии DS'ов и так прошивались. И разве у тебя нет флешки? Прошей один раз, а потом запускай софт по Wi-Fi. Очень удобно для отладки.
            • 0
              Программировал в своё время под GBA, NDS похож конечно же. Но времени на исследование данной платформы всё время нет.
              Можете заодно вообще рассказать максимумы от NDS? К примеру серфинг в нете, проигрывание музыки, набор текста (сохранение, ctrl+c ctrl+v, и тд). В ндс вроде уже стоит какойто софт, (загрузка, меню и тд) можно ли его заменить\модифицировать, или всё происходит также как и в гба? ( есть ром, внутри него хоть ос пиши :)).

              Да и вообще будет ли жива платформа в будущие 2-3 года? ( Думаю нет… максимум этот год).
              Тк я всё еще увлекаюсь ГБА, и вот хочу перейти на что то действительно актуальное и перспективное в игровом сообществе :)
              • +1
                Практически тоже, что и GBA, только помощнее. Может даже работать в режиме GBA на ARM7.
                Из стандартных приложений на NDS только чат по Wi-Fi. На DSi уже поинтересней с этим.
                Есть официальный браузер — Opera. И, конечно, множество всякого homebrew софта, даже Linux есть ;).
                Перспективы у платформы есть: DSi не так давно вышла, в 2011 выйдет 3DS — а они все обратно совместимы с DS (но уже не с GBA).
                • 0
                  DSi несовместима. Отсутствует слот2. Были обещаны скачиваемые игры с GBA из DSi Ware, но пока их нет
                  • 0
                    Так я не говорил про совместимость с GBA. Естественно только с DS.
                • 0
                  Всё это уже давно реализовано как сторонними разработчиками, так и вполне себе официальными. Интернет, музыка, набор текста есть. Софта установленного, на классической ДС, как такового, нет.
                  • 0
                    Я бы так скептически не относился к данной платформе, тем более Nintendoo ее развивает. Посмотрите на количество игр, которые выпускаются под DS. Постоянно приходит рассылка с одного китайского интернет магазина (периодически покупаю игры для PS3) так для DS постоянно релизы в рассылке, чего не скажешь о PS3. Та же картинка на популярном английском интернет магазине — наименований больше чем на PSP.

                    Сдается мне, это только у нас как-то не очень относятся к этой консоли, но в целом российский рынок игр не серьезен вообще.
                    • 0
                      И кстати да, спасибо автору за статью, теперь есть с чего начать — иногда поглядываю на DS ;)
                    • 0
                      По поводу смерти платформы:
                      DS весьма и весьма популярна в мире, но не в России (тут есть и доля участия «Нового диска», который ставит жесткие требования к тем, кто хочет продавать игры Нинтендо в России).
                      Обычно у Нинтенды принято оставлять совместимость с играми консоли прошлого поколения. Поэтому с выходом консоли нового поколения 3DS игры для DS не потеряют актуальность.

                      Вот только хоумбрюшки под DS часто не работают на DSi :(
                    • 0
                      Я в своё время писал IRC клиент для DS'а — ClIRC: clusterrr.com
                      Столько трудов было потрачено, а в итоге им пользуются только иностранные школьники, у которых в школе есть Wi-Fi, но родители не могут купить им нормальный мобильник. Было ещё и много других идей, но вдохновение как-то ушло.
                      • 0
                        Поэтому я тебя пинаю, у меня идеи ещё остались :)
                        Ещё бы шарики допинать
                        • +1
                          Писать IRC клиент в наше время, это нужно действительно большое вдохновение :)
                          • 0
                            По крайней мере я получил удовольствие от процесса. Ну и приз получил :)
                            • 0
                              Базовый irc-клиент, в том числе и в наше время, пишется в пару сотен строк без сторонних либ (только tcp). Вот для XMPP или ICQ клиент писать — тут даже большого вдохновения не хватит.
                          • 0
                            Почему под Nintendo DS? Почему не под PSP или даже хуже — Xbox или PS3?

                            Я не враг Nintendo, просто интересно, почему именно она?
                            • 0
                              Под них хоумбрю только через взлом прошивки можно запустить.
                              • +1
                                Портативность + тачскрин. Когда-то я был бедным студентом и не хотел тратить деньги на коммуникатор. Чем беднее человек, тем более изобретательным и креативным он становится.
                                • +1
                                  Моё мнение, НДС более ближе к игроку, чем та же псп. Тк тут больше вариантов управления и взаимодействия с игрой.
                                  • 0
                                    Предположу, что из перечисленного Вами только на NDS Linux встаёт без нарушения лицензии.
                                    • 0
                                      Неверно. На PS3 Fat тоже можно поставить линукс, хоть убунту.
                                      • 0
                                        Ну на PS3 линукс официальный… был. До тех пор пока не ломанули гипервизор
                                      • 0
                                        Были же посты по настройке тулчейна под псп.
                                        А под пс3 так вообще смысла нет, способы запускать там хоумбрю отсутствуют, как и сторонние тулчейны.
                                      • 0
                                        Я так понимаю эту платформу даже брейкать не нужно, как в случае с PSP?
                                        • 0
                                          насколько мне известно, нужна спец флешка
                                        • +1
                                          торт :)
                                          • 0
                                            А насколько проблематично россиянину стать официальным девелопером под ниндендо?
                                            я слышал что это геморно.

                                            Да и получение дохода не ясно мне. без паблишера нереально продавать свой софт?
                                            • 0
                                              Да не вопрос. Подпольные картриджи на рынке можно продавать =)
                                              А свой там софт или чужой — дело десятое
                                              • 0
                                                Евгений Ваганович Петросян? Здраствуйте!
                                            • 0
                                              А мне всегда было интересно, как и на чём писались игры для NES (Денди).
                                            • НЛО прилетело и опубликовало эту надпись здесь

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое