ニンテンドーDSのプログラミング。 最初のステップ

この記事では、ニンテンドーDS for Linuxのソフトウェア開発の基本について説明します。 ただし、使用されるツールはすべてクロスプラットフォームであり、他のOSに大きな違いはないはずです。

最初に、このゲーム機が何であるかを理解しましょう。 ウィキペディアが伝えていることは次のとおりです。
*プロセッサー:ARM946E-S-67 MHz、コプロセッサーARM7TDMI-33 MHz
*メモリ:4 MB、656 KBビデオメモリ、512 KBテクスチャメモリ
*画面:2つの個別のLCD、対角77 mm(3インチ)、解像度256x192ピクセル、最大26万色。 スクリーン間の距離は約21 mmで、これは92の「隠された」ラインに相当します。
*ビデオシステム:2Dおよび3D(T&L、テクスチャ座標変換、テクスチャマッピング、アルファブレンディング、スムージング、整数シェーディング、Zバッファリング)のサポートにより、理論的には1秒あたり120,000ポリゴンを描画できます(ただし、6144頂点のレンダリングには制限があります1フレームに2048個の三角形)。
*サウンド:ステレオ、16チャンネルADPCM / PCM
*ドライブ:ニンテンドーDSカスタムカートリッジスロット1個、ニンテンドーゲームボーイアドバンスカートリッジスロット2個
*通信:IEEE 802.11(Wi-Fi)、接続に独自の任天堂形式を使用。 条件に応じて、10〜30メートルのLANの半径。
*管理:タッチスクリーン、音声認識用の内蔵マイク、A / B / X / Yボタン、D-Pad、L / R暗号、開始および選択ボタン
*作業時間:6-10時間
*重量:275グラム
*寸法:148.7×84.7×28.9 mm

ご覧のとおり、コンソールにはARM9とARM7の2つのプロセッサがあります。 私たちにとっての主なものはARM9です。プログラムが実行されるのはその上です。 ARM7は一般に、タッチスクリーン、キーボード、マイク、およびその他の周辺機器の保守に使用されます。 libNDSライブラリには、ARM7の標準プログラム(default.arm7)が含まれており、標準周辺機器との通信のニーズを完全に満たします。 そのため、最初の段階では、2番目のプロセッサの動作について考える必要はありません。

次に、クロスコンパイル用の環境を構成します。
必要なもの:
ARM開発キット-DevkitARM sourceforge.net/projects/devkitpro/files/devkitARM ;
ニンテンドー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には2つのグラフィックコアがあります。メイン(メイン)はデフォルトでトップ画面に使用され、追加(サブ)はボトム画面に使用されます。 各コアは6つのモードのいずれかで動作し、メインのコアには大きな画像を表示するための2つの追加モードがあります。

ビデオコントローラーのグラフィックモード:
メイン2Dコア
モードBG0BG1BG2BG3
モード0テキスト/ 3Dテキストテキストテキスト
モード1テキスト/ 3Dテキストテキスト回転
モード2テキスト/ 3Dテキスト回転回転
モード3テキスト/ 3Dテキストテキスト延長
モード4テキスト/ 3Dテキスト回転延長
モード5テキスト/ 3Dテキスト延長延長
モード63D-大きなビットマップ-
フレームバッファビットマップとしての直接VRAM表示
追加の2Dコア
モードBG0BG1BG2BG3
モード0テキストテキストテキストテキスト
モード1テキストテキストテキスト回転
モード2テキストテキスト回転回転
モード3テキストテキストテキスト延長
モード4テキストテキスト回転延長
モード5テキストテキスト延長延長


カーネルを使用するには、まずカーネルをオンにして、動作モードを設定し、メモリを「マップ」する必要があります。
プログラムは2D情報を出力する必要があるため、メイン画面の2Dグラフィックコアをオンにします。
powerOn(POWER_2D_A);

グラフィックコアのビデオモードを設定します。
videoSetMode(MODE_FB0);
フレームバッファモード-ビデオメモリとディスプレイピクセルの直接対応。

次に、両方のグラフィックコアが共有ビデオメモリを使用するため、使用するメモリ領域をグラフィックコアに伝える必要があります。 バンクAをトップ画面のフレームバッファーとして使用します。
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 .

makefileを使用したプログラムは次のとおりです。narod.ru / disk / 23987391000 / example1.tar.gz.html

ですから、私たちは、プリミティブではありますが、ニンテンドーDS向けに適切に機能するプログラムを作成しました。 次の記事では、単純なゲームの例として、タイルグラフィックス、割り込み、キーボード、タッチスクリーンの操作を検討する予定です。

そして、ここに英語の非常に良いレッスンのシリーズがあります: dev-scene.com/NDS/Tutorials

Source: https://habr.com/ru/post/J102666/


All Articles