世界を動かす技術を、日本語で。

Nintendo DSプログラミング入門

概要

  • Nintendo DS 向け自作ソフト開発のためのマニュアルの概要
  • Homebrew ムーブメントの背景と法的観点の解説
  • Passthrough デバイスやNoPassなどの技術的仕組みの紹介
  • プログラミング環境構築や基礎的なゲーム制作手法の案内
  • C/C++の基礎知識を前提としたステップバイステップ解説

Nintendo DS Homebrew プログラミングマニュアル 概要と改訂履歴

  • 著者: Jaeden Amero
  • 改訂履歴:
    • 2008年12月: libnds 1.3.1 対応
    • 2008年1月: 複数スプライト、背景、パレット、タッチスクリーン、Slot-1対応 追加
    • 2007年3月: DocBook 形式へ編集改善
    • 2006年10月: VRAM付録、レイアウト更新、誤字修正
    • 2006年9月: サウンド章追加
    • 2006年7月-3月: 誤字修正、コード改善、章の確定

序文

  • Nintendo DS でゲームを遊ぶ楽しさと、自分でゲームを作りたいという動機
  • ゲーム制作のアイデアはあるが、どこから始めればいいか分からない悩み
  • 本マニュアルは Nintendo DSの内部構造 を理解するためのガイド
  • Homebrewコミュニティ への参加を推奨
  • プログラミング競技やコラボレーションの楽しさ

本マニュアルの目的と使用方法

  • Nintendo DS向けプログラミング の基本を解説
    • Homebrewムーブメントの背景
    • Passthroughデバイス やSlot-1/Slot-2デバイスの選択
    • 開発環境構築、背景・スプライト表示、基本的なゲーム制作技法
    • 事例として "Orange Spaceship" ゲーム制作
  • C/C++基礎知識 が前提
    • 構造体、クラス、ヒープ、ループ、ビット演算、論理演算子の理解が必要
    • 推奨学習リソース: cplusplus.comcppreference.com
  • 各章を順番に読み進め、理解しながら自分でもコードを書くことを推奨
  • コード例はグレーバックグラウンドで表示

Nintendo DS Homebrewムーブメントの政治的背景

  • Nintendo DS 登場以来、多くの愛好者が自作ゲーム開発を志望
  • 任天堂公式の開発契約取得は非常に困難
    • 優れたソフトウェアの実績、財務の安定性、公式開発機材の購入資金が必要
    • 多くの開発会社はパブリッシャー経由でゲームをリリース
  • Homebrewムーブメント の台頭
    • 世界中の熱心な愛好者によるハードウェアのリバースエンジニアリング
    • 公式開発キットの代替となる安価な手段の提供
    • 技術的知識や文化の多様性

Homebrewの合法性

  • Homebrewは合法 (以下の場合)
    • 所有するハードウェアのリバースエンジニアリング
    • コピーガード破りやソフトウェアの海賊行為、特許侵害などは違法
    • 商用ソフトと競合するのはほぼ不可能
  • 企業とHomebrewの関係
    • Homebrewによる需要増加やユーザー理解の促進
    • 例: XboxのHomebrewコミュニティからXNA Game StudioやXBLAへ発展
    • 一部企業は海賊行為への悪用を懸念し、Homebrewに否定的
  • Homebrewコミュニティの倫理
    • コピーガード情報は秘匿、海賊行為を強く否定
    • システムの寿命を守るため、違法行為を避ける姿勢

Passthroughデバイスの仕組みと利用方法

  • Passthroughデバイス の目的
    • GBAカートリッジスロット 経由でプログラムを実行
    • NDSカードスロットの暗号化を回避し、合法的にコードを動かす
  • PassMeの動作原理
    • 起動時にNDSカードのヘッダー情報を読み取り、実行アドレスを書き換え
    • GBAカートリッジ内の自作コードを実行
  • Passthroughの歴史
    • DarkFader による初期開発(FPGA→CPLD化)
    • LynxNatrium42 によるオンライン販売
    • 現在は流通終了、利用は稀
  • NoPassの登場
    • 本物のNDSゲームカードを偽装
    • Martin Korth によるBIOSダンプと暗号化解読
    • Passthroughとは異なる技術的手法

まとめ

  • Nintendo DS Homebrew は技術的・法的・文化的に多面的な活動
  • 独自ゲーム開発 やコミュニティ活動を通じてスキル向上
  • 適切な知識・倫理観を持ってHomebrewを楽しむことが重要

Hackerたちの意見

: https://github.com/spicyjpeg/ps1-bare-metal

リンクされてるバージョンも古いよ。ホームページには2024年に更新されたこのガイドのバージョンへのリンクがあるけど、まだ始めるにはあまり良い場所じゃないかも。0: https://www.patater.com/manual-git/

DSのアーキテクチャの概要が知りたいなら、これが素晴らしいよ: https://www.copetti.org/writings/consoles/nintendo-ds/

もし興味がある人がいたら、数年前にオリジナルPlayStationのプログラミングについて、似たような(でもずっと簡素な)リソースを作ったことがあるよ[1]。GPUやジオメトリコプロセッサ、シリアルI/Oハードウェアを、シンプルなCの例を使ってステップバイステップで探っていったんだ。次はオーディオやCD-ROMアクセスをカバーする例を追加する予定だけど、まだその機会がないんだ。

これは、数週間後にPlaystation OneでPalmOS 5を立ち上げる時に役立ちそうだ。ありがとう!

DSは、素のメモリマップを使って完全にプログラムできる、最も進んだゲームコンソールだと思う。つまり、構造体や配列の定義が魔法の固定アドレスに詰まったCヘッダーだけの「SDK」を使う感じで、関数は全くないんだ。値を設定すれば、ハードウェアが動くってわけ。

たぶん?それ以降はライブラリに頼ることが多いけど、最初はちょっとした苦労もあったみたい。N64は、聞いたところによると、ライブラリにかなり依存していて、素の状態でプログラムするのは本当に厳しいらしい(GPUの「マイクロコード」はほぼプログラム可能なシェーダーv0.1みたいな感じ)。ゲームキューブはその点でかなりの改善があったよ。

GBAがこの点では一番いいと思う。DSは二つのコアを扱わなきゃいけなくて、そのためのファームウェアを書いて、コミュニケーションを取らないと何もできないし、実行時にRAMに収まらない追加のコードやアセットを取得するためのカートリッジプロトコル、命令キャッシュやデータキャッシュ、MMU… それにタッチスクリーンやWi-Fiみたいな複雑な周辺機器もあるし。公式ゲームはすべてのコアに同じファームウェアを使っていて、そのコピーはすべてのカートリッジROMに埋め込まれてる。各SDKにはいくつかのホームブリュー用ファームウェアが含まれてるけど、スタンドアロンで使うにはあまりドキュメントが整ってない。確かに、上記のことは完全に不可能ではないけど、特に初心者にとっては、シンプルなデモ(ボタン入力、スプライトを画面上で動かす)を作るのにどれだけのコードが必要かを考えると、DSはSDKなしで始めるにはかなりの量のコードと知識が必要だよ。一方で、GBAなら100行未満のASM/Cで似たようなことができる。

CSのオペレーティングシステムの授業で、アセンブリやコンピュータアーキテクチャを学べたのは本当に感謝してる。NDS用のプログラムを書く課題があって、子供の頃のコンソールが自分たちが書いた低レベルのプログラムを動かすのを見るのは楽しかったな。

それ、めっちゃクールだね!私のCSのカリキュラムには、アセンブリを読んだり書いたりする授業があった(モトローラのチップ用のエミュレーターをターゲットにしてたけど、名前は忘れちゃった)。それはそれで良かったけど、実際のゲームコンソールで動くものを書いてたら、もっとハマってたと思う。結局、低レベル開発のちょっとした味を見ただけで、またJavaでソートアルゴリズムを書くことに戻っちゃったんだ。これは2000年代初頭の話ね。

Nintendo DSは、2010年頃にdevkitProを通じてプログラミングを教えてくれたプラットフォームで、コンピュータの仕組みをたくさん理解できたんだ。あの頃は厳しいエコシステムだったけど、すごくワクワクしたよ。家にはインターネット接続がなかったけど、ドキュメントをダウンロードしていて、コンパイルするのが意外と満足感があった。

昔の#dsdevの皆さん、こんにちは!

古い3DSを持ってるんだけど、スロット1デバイスを含むこの技術は使えるか知ってる人いる?試してみたいんだけど、ファームウェアのアップデートがちょっと気になるんだよね。やっぱりデバイスはそのままの状態が好きだから。

3DSのプログラミングはもっと簡単だよ! * ここを見てね: https://3ds.hacks.guide/ * devkitproのセットアップ: https://devkitpro.org/wiki/Getting_Started * ここから例を始めるのがいいかも: https://github.com/devkitpro/3ds-examples * それから、ビルドしたファイルを転送する必要もなくて、3dslinkでネットワーク越しに起動できるよ: https://github.com/devkitPro/3ds-hbmenu?tab=readme-ov-file#n...

もちろん、3DSでDS(やGBA)のソフトウェアを実行することもできるよ。 > 「ファームウェアのアップデートがちょっと気になる」 3DSを「ハック」すれば、もうシステムアップデートを心配する必要はないよ。システムバージョンが11.14以下なら、やるのも少し簡単だし、11.3以下ならかなり簡単。3DSのホームブリュー開発については、もっと多くのRAMと「ちゃんとした」CPUがあって、現代的なCPUの概念(実際のOS、仮想メモリ、キャッシュ、マルチコア)があるよ。DSやGBAとは違って、3DSには実際のGPU(まあ、プログラム可能なフラグメントシェーダーはないけど)があって、カスタムのOpenGL ESに基づいて設計されてるから、それが分かるよ。citro3dはシムで、状態管理やメモリ割り当て以外は、GPUハードウェアをそのまま露出させてる。全体的に見て、3DSのホームブリュー開発を始めるのは簡単だと思うし、OpenGLに似たAPIに関するスキルも身につくと思う。ちなみに、私はLuma3DSのリードメンテイナーで、libctruのコアメンテイナーでもあり、このガイドで使われているエクスプロイトチェーンの重要な部分を書いたよ。気軽に質問してね。

注意: 2020年以降に生産されたarm32 / ARMv7の組み込みボードはまだ存在するよ(SAM9x60を参照)。ARM9のアセンブリ/コアを維持したいけど、現代のLinux 6.12のサポートも欲しい人向け。任天堂DSは画面、ボタン、音など、すべてが揃ったパッケージだったけど、ARM9コアとARMv7アセンブリが今でも生産されているのを見ると、組み込みプログラミングの長期的な寿命には驚かされるね。

確かに、Armのネーミングは混乱を招くことが多いから、もう少し詳しく説明すると、GBA、NDS、3DSで使われているARM7TDMIプロセッサコアのARMv7とARMv4は、同じ命令セットじゃないんだよね。最近のマイクロコントローラーやSoCには、Armv7やArmv7-Mを実装しているプロセッサコアがあるよ。例えば、SAM9x60はARM926コアを持っていて、Armv5TEJ命令セットを実装してる。これはDSのARM946コアが実装しているARMv5TE命令セットに似てるんだ。前者にはJazelleがあるけど、後者にはないよ。詳しくは、https://en.wikipedia.org/wiki/ARM7#ARM7TDMI と https://onlinedocs.microchip.com/oxy/GUID-B822915F-C375-4172...

ARMv7とARM7は見た目が似てるけど、ARM7はARMv3で、ARM9はARMv4なんだ。似たような名前は本当に誤解を招くよね。

NDS用にちょっとしたスクリーンセーバーを書いたことを覚えてる。それがきっかけでプログラミングにハマったんだよね。