FAQ †
コマンドプロンプトでGBFSのワイルドカードが使えません †could not open *.img: Invalid argumentdone! 2015/10/07 時点で起きている現象です。昔のバージョンでは起こりません。 古いサンプルプログラムをコンパイルするとエラーになる †開発環境が変わった為、少々の手直しが必要になります。
何も考えず、make_bin.batをしてみると # converting bg_ascii.bmp # converting bg_keyboard.bmp # converting spr_cur.bmp make[1]: `all' is up to date. # assembling res/bg_ascii.s sh: arm-eabi-as: command not found make[1]: *** [obj/bg_ascii.o] Error 127 make: *** [all] Error 2 続行するには何かキーを押してください . . . arm-eabi-asがないぞと言われます。Makefileの PREFIX = arm-eabi- を PREFIX = arm-none-eabi- に書き換えて再度実行してみます。が・・・ (省略・・・) # Linking test.elf obj/crt0.o: In function `CIDExit': (.init+0x1b4): undefined reference to `__bss_end' obj/crt0.o: In function `CIDExit': (.init+0x1b8): undefined reference to `__sbss_start' obj/crt0.o: In function `CIDExit': (.init+0x1bc): undefined reference to `__sbss_end' obj/crt0.o: In function `CIDExit': (.init+0x1c4): undefined reference to `__data_start' obj/crt0.o: In function `CIDExit': (.init+0x1c8): undefined reference to `__data_end' obj/crt0.o: In function `CIDExit': (.init+0x1d4): undefined reference to `__iwram_end' collect2.exe: error: ld returned 1 exit status make[1]: *** [test.elf] Error 1 make: *** [all] Error 2 続行するには何かキーを押してください . . . 今度はcrt0.s内の名前が定義されてないぞと怒られます。
今のバージョンはアンダーバーを増やしたみたいですね。 あと、古いサンプルコードでは意味もなくs16, u16を多用しています。 特にループ変数などはs32, u32を使用してください。 サンプルプログラムのライセンスはなんですか †libgba(LGPL)を静的リンクしている関係でGPLになります。 僕が作成したコンバータやツール類はNYSLでいいです。 他の作者様の作成されたものは(zipファイルで同封されていても)個別に従ってください。 GBA開発で活気がある掲示板はどこですか †2014年現在どこも活気はありません。過去ログとしては を見てみることをオススメします。 libgbaを元にゲームを作りたいのですが仕組みがわかりません †libgbaにはマニュアルがないので直接ソースコードを読まなくてはなりません。 sourceforgeのdevkitProプロジェクト libgbaにあります。 xxx.mb(xxx.mb.gba)と、xxx.gbaの違いはなんですか †ブートケーブル(MultiBoot)か、カードリッジからの起動の違いです。 それぞれの電源を入れたときの開始番地は0x2000000(ブートケーブル)、 GBA(ARM7TDMI)には割り算や除算命令がないって本当ですか †本当です。devkitARMでは暗黙の了解としてlibgcc.aで計算をしています。 実機でテストしたいのですが機材はどこで入手できますか †マジコン(カードリッジの内容を書き換えるハードウェア)は、 このwikiではhackしていく楽しみを目的としていきたいと思っていますので、 rand関数を使っていると、いつも同じ結果、同じ順番が得られてしまいます †電源投入時のGBAには、乱数に使えるようなメモリ領域がありません。
なおgccに入っているのではなく、メルセンヌ・ツイスタ法を使われることをオススメします。 実機でテストしたいのですが起動中のタイトルロゴでフリーズしてしまいます †GBAは起動時、ROMの内容が正しいかどうかCRCチェックを行っています。 対策としてはgbafixというツールでROMのCRC値を修正してください。 gbafix.exe test.gba -tTest -cTest -m00 -r01 割り込みがうまくいかない †doc.15を参照してください。 日本語の文字列を書くとワーニングになるのだけれど †ConsoleDebug("表示\n"); 例でいうところの「表」(ShiftJIS)コードは、0x95 0x5cです。 この為、「\\n」となるので書き方がおかしくないか警告を出していると思われます。 ConsoleDebug("表\示\n"); GBA開発に関する書籍があれば教えてください †製作途中ですが別ページ(推薦図書)に作りました。 開発で使っているツール類があれば教えてください †
スタック領域はどこにありますか †devkitARM をインストールしたディレクトリから arm-eabi/lib/gba_cart.ld を開いて下さい。 __iwram_start = ORIGIN(iwram); __iwram_top = ORIGIN(iwram) + LENGTH(iwram);; __sp_irq = __iwram_top - 0x100; __sp_usr = __sp_irq - 0x100; __irq_flags = 0x03007ff8; このうち __sp_usr と __sp_irq に、各モードにおけるスタックポインタの指すべきアドレスが割り当てられ、 .iwram __iwram_start (0x03000000) | .bss (不定) | 初期値なしグローバル変数領域 .data (不定) | 初期値ありグローバル変数領域 __iheap_start (不定) | IWRAMヒープ領域 | ユーザースタック領域 __sp_usr (0x03007e00) | IRQスタック領域 __sp_irq (0x03007f00) | __irq_flags (0x03007ff8) | 割り込みフラグ | 割り込みベクタ __iwram_top (0x03007800) 通常は EWRAM にあるヒープ領域 (__eheap_start) を使用するため問題となることはありませんが、 定義したい構造体のサイズにならない †typedef struct { u16 a; u8 b; u16 c; } ST_TEST; この構造体をsizeofで見てみると、6バイトになります。 コンパイラとしてはソースを機械語に落としたときに、そちらの方が効率的にアクセスできるからという理由です。 どうしても意図したサイズにしたい場合、以下のマクロを使用するといいと思います。 #define __PACKED __attribute__ ((__packed__)) typedef struct { u16 a; u8 b; u16 c; } __PACKED ST_TEST; この場合は5バイトになります。 コードは合っているのに、コンパイラがそのとおりに解釈してくれない †コンパイラのオプションにコードの最適化(-0x)を指定しているときに起こる現象です。 u16 flag=0; void wait() { while(flag == 0) { //割り込みにより、処理を抜けます。 } } while文の処理の内容は、コンパイラ側から見れば余計な処理と解釈されてしまい、 こういう時は変数flagにvolatile修飾子をつけることで、 volatile u16 flag=0; 先の例はものすごく簡単なものでしたけれど、実際にはもっと複雑です。 なので、コードに問題がなくて、処理が思うように行かない場合は、 履歴 †
|