来客数
NDS開発日記
トップページに戻る

緊急!DSLiteでのFlashMEはDS以上に危険です。
FlashMEをする前にhttp://higurashi.asablo.jp/blog/2006/04/09/321047を読むこと。
これは推奨ではなく強制です。警告解除と書いてありますがコメントを含め隅々まで読みましょう。
また自己責任とは起こった全ての結果について自分で対処することをさします。
非純正品を使いながら任天堂の修理に出すなんてもってのほかです。
過去ログ 2006年02月 03月 05月 07月 12月 
2007年02月 

■2006年02月25日(土)  フレームバッファー
とりあえず今回はフレームバッファーを使ってみようかなぁと
とりあえずサンプルのcomplex2Dにフレームバッファーの説明があったので
大切そうなところだけ。

videoSetMode(MODE_FB1);
これがフレームバッファーモードをセットする命令みたいです。
FB…そのままですね。
これはFB「1」になってますがこれは最初で
uint16* back = VRAM_A;
uint16* front = VRAM_B;
定義してあるから最初にVRAM_Bの内容を映したいからかな。
ダブルバッファにしてあるためでしょう。
ということはダブルバッファにしなくていい場合は
MODE_FB0でVRAM_Aを使えば楽そうですな。
次。

vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_SUB_BG, VRAM_D_SUB_SPRITE);
またややこしいですなぁ。コメントにもややこしいと書いてありますし。
これは今までVramSetBankAとかの拡張版の命令かな。
今回はVRAM_B_LCDとかスプライトとか使うつもりは無いので消してみたら
引数が足りませんってエラーが出てきた。
詳細はあとで調べるとして今回はいつも通り
VramSetBankA()をつかってみたところ問題なかったのでよし。
そのあとはしばらくスプライトとかよくわからないものが続きます。
とりあえずバックバッファはbackとわかっているので
backに値を代入していそうなところを探します。
for(ix = 0; ix < SCREEN_WIDTH; ix++) {
back[ix + SCREEN_WIDTH * (SCREEN_HEIGHT - 1)] = rand()& 0xFFFF;
back[ix + SCREEN_WIDTH * (SCREEN_HEIGHT - 2)] = rand()& 0xFFFF;
}
ふつうに書き込めばいいみたいだ。
back[書き込みたいy座標*SCREEN_WIDTH+書き込みたいx座標]=RGB15(色);
でかけました。

割り込みとかなんだかいろいろ有るけどとりあえずパス。
で、書くだけなら下のプログラムでいけるはず…
と思ったんだけど、上の画面がちらちらしてる。
まるで垂直同期を思いっきり無視したかのよう…っていうか無視しているのだが

なるほど。ここで割り込みが必要になるのか。
swiWaitForVBlank();がそれっぽいですな。
明日試してみよう

下のコードにあるlineとclsは僕が勝手に作った関数です。
線を引く関数と画面を消す関数。
他でも使えそうなので何となく別ファイルにまとめてみた。
ダウンロードは
http://www.mlxt.com/blog/software/ml_graph.h

#include "nds.h"
#include "stdio.h"
#include "nds/arm9/console.h"
#include "ml_graph.h"

static int bak_x, bak_y;

int main(void)
{
int x,y,t;
uint16 keysPressed;

powerON(POWER_ALL);

videoSetMode(MODE_FB0);
vramSetBankA(VRAM_A_LCD);

videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);
vramSetBankC(VRAM_C_SUB_BG);

SUB_BG0_CR = BG_MAP_BASE(31);

BG_PALETTE_SUB[255] = RGB15(31,31,31);

consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);

cls(VRAM_A,RGB15(31,31,31));

while(1) {
x=IPC->touchXpx;
y=IPC->touchYpx;
iprintf("\x1b[2J");
iprintf("(X,Y)=(%d,%d)",x,y);
if (x!=0){
if (bak_x==0){
bak_x=x;
bak_y=y;
}
line (bak_x,bak_y,x,y,VRAM_A,RGB15(0,0,0));
bak_x=x;
bak_y=y;
}else{
bak_x=0;
bak_y=0;
}
for(t=0;t<10000;t++);
t=0;
}
return 0;
}
RSS Trackback(1)

■2006年02月23日(木)  とりあえず
出そうと思っていた両方の画面に文字を出すサンプル。
BG0はメイン用サブ用に二つあるみたいなので
メインサブ両方でBG0を使っても衝突しません。

逆に言えば共有は出来ないので同じものを表示するのは面倒?

http://www.mlxt.com/blog/software/dc.lzh
RSS Trackback(1)

■2006年02月22日(水)  フレームバッファに進む前に
サンプルを見ているとどうも割り込みとかを先に覚えておいた方がいいみたい。
さくっとソースに目を通して解読してみる
が、ソースには結構見ない記号が沢山。

調べてみるとビット演算子らしい。
というわけでわからない記号はここで。
http://www.st.rim.or.jp/~phinloda/cqa/cqa12.html

アセンブラでは良くやることでも記号が変わると新しく見えるねぇ…
当たり前か。

とりあえずサンプルに手を加えてペイントみたいなのを作ってみたり。
割り込みの指定方法が未だよくわからないのでソースは後日

■2006年02月20日(月)  vramSetBankA();
これもそういえばよくわからない。
SetBankって関数だから作画先の指定に使うのかなと思っていろいろ調べてみるが
結局うまくいかない。

とりあえずわかったこと
メイン画面にはvramSetBankA
サブ画面にはvramSetBankC
を使うと言うこと。

整理すれば文字を書くだけなら

videoSetMode(MODE_0_2D | DISPLAY_BG1_ACTIVE); //ビデオモードセット
vramSetBankA(VRAM_A_MAIN_BG); //作画先セット
BG1_CR = BG_MAP_BASE(31); //謎
BG_PALETTE[255] = RGB15(31,0,31); //文字色セット
consoleInitDefault((u16*)SCREEN_BASE_BLOCK(31), (u16*)CHAR_BASE_BLOCK(0), 16); //コンソールモードにする
printf("Hell world"); //文字出力

これだけと。
いや、もう分かり切ったことだけどさ。

謎な部分がどうしてもわからない。
後回しにして明日はフレームバッファーモードに進むことに。

とりあえず今のところの目的は
文字の表示
絵の表示
音の出力
ファイル入出力
以上。

バイト疲れがさっぱりとれず、
超手抜き更新。 ごめん。

■2006年02月18日(土)  DSプログラミング2日目
どうもNDSの映像周りの仕組みがどうも僕にはわからない。
MAPとかTILEとかそれを制御するためのコントロール用のレジスタとか。

いろいろ数字を変えたりして試してみたり
video.hファイルを開いて調べている間に一日たってしまってたり。

おかげでMAPとTILE以外はだいたいわかった。

しかしMAPとTILEがどうしてもわからない。
困ったものだ。

しばらく別のことをやってから戻ろうかな。

2006年02月18日(土) 
バイトが入ったため次の更新は2月20日になります。

■2006年02月16日(木)  DSプログラミング1日目
NDS側の準備もPC側の準備も出来たので
そろそろプログラムを書き始めようかと。

もう一度言いますが私は初心者です。
この講座は今のところは初心者のためのNDSプログラミング講座ではなく、
初心者が書くNDSプログラミング記録です。お間違えの無いように。
と初心者という言葉を盾にするあたり初心者ですなってくどいですか。すみません。

まずNDS開発用に新しいフォルダを作って、そこに
.\devkitPro\examples\nds\templates\combinedにあるファイルを全てコピーして
template.pnprojをダブルクリックで開きます。
Programmers Notepad2が起動すると思うのでとりあえず使いやすいように見た目をカスタマイズ。
僕は下の絵のように変えました。

とりあえず手をつけるのはしばらくはARM9のCPUだけで良さそうなことがわかったので、
ProjectsのところにあるARM9をダブルクリックSourceもダブルクリック、
templete.cもダブルクリックして開きます。

最初はコメントばかりで思ったより少ないコードですね。
文字を表示するだけなら20行程度で出来てしまうみたいです。

上から順にプログラムを追っていくと、
touchPosition touchXY; という命令が。
ただの構造体ですね。
この場合この型は
touchXY.px
touchXY.py
という変数を宣言するみたいです。
名前からしてタッチパッドのx座標とy座標を入れるのに使うみたいです。

videoSetMode(0); //not using the main screen
VideoSetModeというのは下の画面のモードをセットする関数らしいです。
0を入れると下の画面は使わない状態となり真っ白になります。

videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); //sub bg 0 will be used to print text
videoSetModeSubは上の画面のモードをセットする関数らしいです。

MODE_0_2D | DISPLAY_BG0_ACTIVE
というのは画面を2Dモードにセットして
BG0レイヤー(BG0〜BG3まであるもよう)を有効にするという意味ですね。
レイヤーって言うのはフォトショップとかで出てくるあのレイヤーです。
OHPのフィルムを重ねたような感じの。

次、
vramSetBankC(VRAM_C_SUB_BG);
これはいったい何なんでしょう。
今はわからないのでとばすことにします。
ちなみにBankはA〜Iまでありますが、ふつうの画面用として使えそうなのは
A〜Dまでみたい。VRAM_C_SUB_BGのSUBは上の画面だからでしょう。
わかったら追記します。

SUB_BG0_CR = BG_MAP_BASE(31);
これは名前通り、サブ画面のBG0レイヤーのコントロール用みたいです。
なんだか見た目変な感じですがvideo.hを見たところ
SUB_BG0_CRは*(vuint16*)0x04001008として定義されていました。
つまりこの文は0x04001008番地にBG_MAP_BASE(31)で帰ってくる値を代入するってことなのね。
この使い方初めて知った。
BG_MAP_BASE(31)が何を意味するのかわかりませんので放置。

BG_PALETTE_SUB[255] = RGB15(31,31,31);
これはわかった。
サブ画面の255番目パレットのを白にするっていういみですね。
NDSでは色の表現にRGB555を利用しているのでRGB各5bit
つまり0〜31までで指定します。
RGB15()という関数は引数にRGBの色の量を入れると自動で変換してくれる便利な関数です。
文字色は255番目のパレットの色になるそうです。

consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);
この命令を使うとコンソール系の命令 printfやiprintfなどが使えるようになるそうです。
1番目の引数がコンソール系のコマンドが書きこむべきメモリ番地の指定
2番目の引数がフォントの場所。
3番目の引数が色深度です。これは16色と256色から選べるみたいです。

ところで
consoleInitDefault命令の第一引数
(u16*)SCREEN_BASE_BLOCK_SUB(31) …なんかどこかで見た感じだな。

SUB_BG0_CR = BG_MAP_BASE(31);
どういう関係があるんだろう。
調べてみよう。


このあとはtouchReadXY();ぐらいしか新しい命令はありませんね。
touchReadXY()関数はタッチパネルの押されている座標を返してくれる関数です。
値はtouchPosition型で帰ってきます。ということは
一番最初に説明した構造体に入れればいいってことですね。

iprintf()はprintf()関数から浮動小数点を表示する機能を取ったものです。
別にprintf()関数使っても問題なかったです。

というわけで1日目終わり。

どうも会話形式で説明するとわかりにくいので、
主要命令だけ他のページにまとめた方がいいかな。
20060216.png 1024×748 48K

■2006年02月15日(水)  FlashMEの導入方法
おきまりといえばおきまりですが一応。

大切(たいせつ)なこと
 ニンテンドーDSを改造(かいぞう)すると任天堂(にんてんどう)の
 保証(ほしょう)がうけられなくなります。
 改造(かいぞう)は自己責任(じこせきにん)でやりましょう。
 自分(じぶん)で責任(せきにん)をもてないのであればやらないでください。

それから以下の作業を行って起こったいかなる損失に対しても
僕は責任をとりません。


前回(日記参照)はppflashでの書き換えに見事失敗しているので
ppflashよりかは安全路線のSuper card SDとSuperPass2を用いて
ニンテンドーDS(以下NDS)を改造することにしました。
まぁソフト(ファームウェア)を書き換えているだけなので改造って言うかは知りませんが。
ちなみにSupercardのファームウェアはNDS対応版になっているものとして話を進めます。
FlashMEはあらかじめダウンロードしておいてください。
ダウンロードは
http://ds.gcdev.com/dsfirmware/
このページのinstallation file のinstallationのリンクから出来ます。
最初に出てくる健康の警告を失いたくなければその下の
alternate versionをダウンロードしましょう。

僕は元に戻すことは考えていませんし、この方法だとバックアップをとらないため元に戻せません。それからFlashMEをしているとダウンロードプレイに不都合が起きます。
(Wi-Fiは大丈夫みたい。)
あらかじめご了承ください。

書き換えたあとやっぱり開発はやめてFlashMEをアンインストールし
ダウンロードプレイもしたいという人は先ほどのページのまんなからへんにある
You can also uninstall のuninstallにあるファイルをダウンロードして起動し、
画面に出る指示に従ってください。
終わればFlashMEの機能を使うことが出来なくなりますがダウンロードプレイは可能になります。
注意してほしいのはこのアンインストール作業をしても元のファームウェアには戻らないということです。
任天堂の修理に出したら一発でばれるでしょう。

以上、同意できる方のみ次に進みましょう。
ふつうに遊べれば十分という方はやらない方が楽しいNDSライフを楽しめますよ。

手順
1.まずSuperPass2とSupercardを買ってくる。

2.SuperPass2SoftwareV1.0を公式ページからダウンロードしてインストールする(注1

3.書き換え機をパソコンのパラレルポートに刺してUSBもつなげる。
そのあとSuperPass2のスイッチを左側に切り替えて書き換え機に刺す。

4. 2のソフトを起動したあと自分の持っているソフトを一覧から選んで下にある
「PROGRAM」と書いてあるボタンを押してまつ。

5.Succeedとでたら、そのウィンドウに書いてあるPlease Copy Filesのところに書いてある二つのファイルをSDカードにコピーする。場所はSuperPass2SoftwareV1.0をインストールしたところです。
それからFlashMEもコピーしておく(注2

6.SuperPass2を書き換え機からはずしスイッチを戻したあと、さっき選んだソフトのカートリッジをSuperPass2に刺す。

7.ファイルをコピーしたSDカードをSuperCardに刺してNDSに刺す。
NDSのNDS用カートリッジのところは空に。

8.NDSの電源を入れGBAカートリッジを選択。

9.起動したら先ほど入れたgbaファイルを実行したあと電源を切る。

10.SuperPass2を刺して電源を入れる(9の作業から5秒以内に
するとNDSモードでSuperCardが起動する。

11.FlashMEを起動して指示に従う。SL1をショートさせるとでるので、
NDSの電池蓋をはずし、水検出シールの裏にある穴に、導電体のものを刺すと
%が上がるので100%になるまで待つ。
このときに電源が落ちるとNDSが壊れるので電池満タン+電源ケーブル刺しておく。
それから電池が落ちないように注意
ついでに言うとSL1をショートさせるものがはずれると一時停止状態になり
また導電性のものを差し込むと何事もなかったかのように再開されます。

つまり、書き換え中にSL1をショートさせるものを落としてしまっても、
またつなげれば問題はありません。間違っても電源は切らないでください。

12.画面にFirmware flashing completed successfully.
It is safe to turn off your DS.
という感じのメッセージがでたら電源を切っても大丈夫です。

13.後かたづけ。SuperPass2はもう使わないと思うので、箱に戻して
いざというときのため大切に保管しておきましょう。
それからSuperPass2Softwareもアンインストールしてしまいましょう。

以上で改造完了

これからはSuperPass2などを使わなくてもSuperCard SDに.ndsファイルを入れて
選択するだけで問題なくNDS用の自作ソフトやらが動くはずです。

注1
ただいま公式ページが落ちているので検索したところ、
7MC.ORGのダウンロードにミラーされているみたいです。

注2
特にインストールする場所を変えていなければC:\Program Files\SuperPass2\
にあります。

■2006年02月14日(火)  まず開発環境を整える

大切(たいせつ)なこと
 ニンテンドーDSを改造(かいぞう)すると任天堂(にんてんどう)の
 保証(ほしょう)がうけられなくなります。
 改造(かいぞう)は自己責任(じこせきにん)でやりましょう。
 自分(じぶん)で責任(せきにん)をもてないのであればやらないでください。


必要なもの
  ニンテンドーDS
    FlashMEをしていなければPassME(2)が必要
  SupercardやEZFなどのマジコンと呼ばれるもの
  Devkitpro
  開発用PC
  Dualisなどのエミュレータ
  プログラムを書く(書かせる)人間
たぶんこれくらい。

では必要なものを1つずつ確認。
ニンテンドーDS
  これが無くちゃ始まらないでしょう。とか言いながら今回はなしで始めましたが。
  ただ改造済みニンテンドーDSが必要になるのでその辺は後日別ページで

SupercardやEZFなどのマジコン
  秋葉原で5千円から2万円ほどで売ってます。
  僕はSupercardを買いました。理由は安かったから&外部メディアが使えるから。
  実売価格5千円から8千円ぐらいです。店によって結構違ったりするので注意

Devkitpro
  IDE(Integrated Develop Environment)っていうのかな。
  Visual Studio .netみたいな統合開発環境です。
  ソフトウェアの開発を助けてくれるものです。

開発用PC
  性能はそこそこでOK。僕はCeleron1.2GHzのノーパソを使っています。
  エミュレータを使うことを考えるとこの辺が下限かなぁ。
  エミュレータを使わないのであればPentium166MHzでも特に問題は無かったり。

Dualisなどのエミュレータ
  ニンテンドーDSが無くてもプログラムの動作を確認できる便利なソフト。
  いちいち転送が面倒なので中間チェックとかはこれに任せる。
  デバッグ用の情報も出してくれるので手間も省けて一石二鳥

プログラムを書く(書かせる)人間
  人間なので別にあなた自身でなくてもかまいません。
  自分で書くなり誰かを雇うなり押しつけるなりとりあえずプログラムを書く人が必要です。

とりあえずニンテンドーDSは無くてもエミュレータがあれば動作確認は出来るので
まずはPC側の環境から整えることにしました。

まずDevkitproをダウンロードしてインストールします。
ファイルは
http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=160396
僕はとりあえず最新版のdevkitProUpdater-1.2.7.exe をダウンロードしてインストール。

インストールは何も難しいことなく進めますが、そのままだと
PSP用や他の端末用のライブラリ群やサンプルもインストールされてしまうので
嫌ならNDS用以外のチェックをはずいましょう。

ウィザードが終わったら「再起動して」インストールは完了です。
再起動忘れるとmakeが出来ない不具合に見舞われます。

インストールがすんだら試しにサンプルをビルドしてみましょう。
Devkitproをインストールしたフォルダのexample\nds\にある、
allexamples.pnprojを開きます。
そしてそのままToolからmakeと行きたいところですが、
実はサンプルに一カ所間違いがあるので修正してからmakeしてください。

間違いのあるサンプルは右のProjectというところの3D\misc\Env_Mapping\source\main.cppです。
ダブルクリックしてmain.cppを開き75行目あたりにある
vector tex_scale = { 64<<16, -64<<16, 1<<16 };を
GLvector tex_scale = { 64<<16, -64<<16, 1<<16 };
に変更して保存します。

ちなみに個人的にはこのサンプルが一番のお気に入りです。
えぇ、WindowsのDirectXでおなじみのやかんが登場しますw。

makeしたあとは各フォルダに.ndsファイルがあるのでエミュレータなり
実機に転送するなりして楽しんでください。
今日は以上で。
nds20060214.jpg 640×480 86K

■2006年02月13日(月)  NDS開発始めました
NDS開発でいろいろ書いていくつもりのページ。
RSS Trackback(2)


Diary System Provided By Nicky
Site admin夜猫子
admin