Xcode project for GBA Development


新規プロジェクトで,空のプロジェクトを作成する。
[New Project 1]


[New Project 2]


その後,ソースファイルや,その他のファイルを管理しやすくするために,グループを作っておく。
[New Project 3]


[New Group 1]


[New Group 2]

ソースファイルグループを作ったら,そこにソースファイルを新規作成する。

main.c (例として,UNIX USER 2003/7 P.92 リスト6 にある西田さん作成のソースを引用。ここから入手可能)
//
// r g b . c
//
// RGB flag drawing program coded with C
//
// May 4, 2003 by Wataru Nishida (http://www.skyfree.org)
//

typedef unsigned short hword;        // Half word

#define VRAM        0x06000000    // VRAM frame buffer start address
#define register(p)    *((hword*) p)    // I/O register handling macro
#define LCD_CTRL    0x04000000    // LCD control
#define   LCD_BG2EN    0x0400        //   Enable BG2
#define   LCD_MODE3    3        //   Video mode 3
#define LCD_WIDTH    240        // 240 dots / horizontal line
#define LCD_HEIGHT    160        // 160 dots / vertical line
#define BGR(r, g, b)    ((b << 10) + (g << 5) + r)

int main() {
  hword* ptr = (hword*) VRAM;        // Use VRAM as a frame buffer
  int i, j;

  // Initialize LCD

  register(LCD_CTRL) = LCD_BG2EN | LCD_MODE3;    // Mode 3: Use BG 2

  // Draw RGB bands

  for (i = 0; i < (LCD_HEIGHT / 3); i++) {
    for (j = 0; j < LCD_WIDTH; j++)
       *(ptr++) = BGR(31, 0, 0);    // Red line
   }

  for (i = 0; i < (LCD_HEIGHT / 3); i++) {
    for (j = 0; j < LCD_WIDTH; j++)
       *(ptr++) = BGR(0, 31, 0);    // Blue line
   }

  for (i = 0; i < (LCD_HEIGHT / 3); i++) {
    for (j = 0; j < LCD_WIDTH; j++)
       *(ptr++) = BGR(0, 0, 31);    // Green line
   }

  // Loop forever

  while (1) ;
 }
 


スタートアップルーチンも新規作成する。

例1: シンプルな例。エミュレータでは動作しない。
crt0.S
.text
    b    main

例2: 割り込みルーチン対応+ROMヘッダ。エミュレータでも動作する。
ただし,上記 main.c では,割り込みハンドラを記述していないので,ハンドラの登録部分はコメントアウトしている(黄色部)。
(UNIX USER 2003/8 P.98 リスト 12相当。西田さんが公開されているソースアーカイブに同 梱)
crt0.S
//
// c r t 0 . S
//
// GBA C runtime startup routine supporting interrupt handlers
//
// June 23, 2003 by Wataru Nishida (http://www.skyfree.org)
//

// Macro definition

#define INT_VECTOR    0x03007FFC    // INT address holder in WRAM

.extern int_handler            // Interrupt handler defined in C

// C runtime startup program

.text

// Cartridge header -- COMMON HEADER FOR ALL PROGRAMS --

    b    start                    // Branch to my entry
    .int    0x51AEFF24, 0x21A29A69, 0x0A82843D    // Nintendo logo
    .int    0xAD09E484, 0x988B2411, 0x217F81C0, 0x19BE52A3
    .int    0x20CE0993, 0x4A4A4610, 0xEC3127F8, 0x33E8C758
    .int    0xBFCEE382, 0x94DFF485, 0xC1094BCE, 0xC08A5694
    .int    0xFCA77213, 0x734D849F, 0x619ACAA3, 0x27A39758
    .int    0x769803FC, 0x61C71D23, 0x56AE0403, 0x008438BF
    .int    0xFD0EA740, 0x03FE52FF, 0xF130956F, 0x85C0FB97
    .int    0x2580D660, 0x03BE63A9, 0xE2384E01, 0xFF34A2F9
    .int    0x44033EBB, 0xCB900078, 0x943A1188, 0x637CC065
    .int    0xAF3CF087, 0x8BE425D6, 0x72AC0A38, 0x07F8D421 
    .ascii    "HappyHacking"                // Game title
    .byte    0, 0, 0, 0                // Game code
    .byte    0, 0                    // Maker code
    .byte    0x96                    // Fixed value
    .byte    0                    // Main unit code
    .byte    0                    // Device type
    .byte    0, 0, 0, 0, 0, 0, 0            // Reserved
    .byte    0                    // ROM version#
    .byte    0x9A                    // Complement
    .byte    0, 0                    // Check sum

// Program starts...

start:
//    ldr    r0, =int_handler    // Tell BIOS to use my "int_handler"
//    ldr    r1, =INT_VECTOR        // through an INT vector address in
//    str    r0, [ r1 ]        // internal work RAM


    bl    main            // Branch and link to main()
loop:
    b    loop            // Loop forever...


その後, 新規ターゲットで,Special Targets - GNU Make Target を選択。
ターゲット名を適当に決める。

ターゲットが追加されたらダブルクリックをして詳細を見てみよう。
[Target Option]


今度は,
[Execute Option]
新規実行可能ファイルで,/usr/local/bin/optusb を選んで,起動オプションに ../GBAのBINファイル名 を指定する。

また,新規グループで,Misc のようなグループを作成し,そこに,Makefile と gnu.ls を作成する。

例:西田さんの Makefile をベースに作成したもの
Makefile (PRODUCT_NAME にプロジェクト名が渡される事を前提)
GCC_BIN = /usr/local/gnu/bin/

AS = $(GCC_BIN)as-arm
LD = $(GCC_BIN)ld-arm
CC = $(GCC_BIN)gcc-arm
OBJCOPY = $(GCC_BIN)objcopy-arm

LIBGCC = `$(GCC_BIN)gcc-arm -print-libgcc-file-name`
CFLAGS = -Wall -fno-omit-frame-pointer -O0

ifeq ($(strip $(PRODUCT_NAME)),)
PRODUCT_NAME:=$(shell basename `pwd`)
endif

TARGET = $(PRODUCT_NAME)
SRCS = main.c
OBJS = ${SRCS:.c=.o}
CRT0 = crt0.o

all: $(TARGET).gba

$(TARGET).gba: $(CRT0) $(OBJS)
        $(LD) -o $(TARGET).out -T gcc.ls $(CRT0) $(OBJS) $(LIBGCC)
        $(OBJCOPY) -O binary $(TARGET).out $(TARGET).gba

clean:
        rm -f *.o *.s $(TARGET).out $(TARGET).gba


gnu.ls
OUTPUT_ARCH(arm)

SECTIONS {
  .text 0x2000000 : { *(.text) }
  .data   : { *(.data) }
  .rodata : { *(.rodata*) }
  .bss    : { *(.bss) }
 }


最後は
[Xcode project sample]
こんな感じになる。

あとは,ビルドや,ビルドと実行(optusb で実行),等が可能。
[Build and Execute]

エミュレータで動作させたい場合には,Boycott Advance を入手し,インストールした上で,新たな実行可能ファイルとして,/usr/bin/open を選ぶ。引数には,-a "Boycott Advance" ../GBAファイル名 にする。
[Execute with Emulator]

エミュレータで実行する場合には,アクティブな実行可能ファイルを上記の実行可能ファイルに切り替えてから実行すればよい。



ただ,毎回これをやるのは大変だ。
そこで,Xcode のプロジェクトテンプレートに,上記プロジェクトのひな形を追加することにする。

プロジェクトテンプレートを作るには,まず,プロジェクト名としてひな形の名前を選び,普通にプロジェクトを作成していく。
例: UUGBA

次にテンプレートフォルダの下に GBASDK のようなテンプレートのカテゴリを示すフォルダを作成し,
出来上がったプロジェクトのフォルダ一式をカテゴリフォルダの下にフォルダごとコピーする。
コピーが終わったら,xcode プロジェクトファイルを編集し,汎用化する。

例:
cd ~/Library/Application Support/Apple/Developer Tools/Project Templates/GBASDK/UUGBA
cd UUGBA.xcode
vi project.pbxproj
ファイルの文字コードは UTF-8 になっているので注意。
(vi だと set enc=utf-8 と set fenc=utf-8 指定を行うとよい)
ファイルを開いたら,プロジェクト名になっているところが数カ所あるので
これをすべて「«PROJECTNAME»」に置き換える(括弧が << や >>ではないところに注意)。

UUGBA.xcode フォルダには,ユーザごとの設定ファイル ユーザ名.pbxuser が存在しているはずだが,これは使われないファイルなので削除しておく。

最後に,テンプレートを使ってプロジェクトを新規作成する際,画面に表示する説明文や,プロジェクト名にあわせてリネームするファイルの設定を記述する ファイルを生成する。

TemplateInfo.plist
{
        FilesToRename = {
        };
        FilesToMacroExpand = (
        );
        Description = "This project builds a GBA application written in C.";
}

上記例では,ファイル名の書き換えについては指定していない。
具体的な指定方法は,標準のテンプレートが参考になるだろう。
/Library/Application Support/Apple/Developer Tools/Project Templates/Tool/Standard Tool/StandardTool.pbproj/TemplateInfo.plist
{
        FilesToRename = {
                "StandardTool.1" = "?PROJECTNAME?.1";
        };
        FilesToMacroExpand = (
                "?PROJECTNAME?.1",
        );
        Description = "This project builds a command-line tool written in C.";
}

(プロジェクトフォルダに存在する man ファイルのひな形である StandatdTool.1 をプロジェクト名.1 にリネームする設定)

最後に,私が作成したプロジェクトテンプレートファイルを紹介する。

ダウンロード

ホームディレクトリで tar zxvf UUGBAtemplate.tar.gz を実行すればインストールされるはず。

残念ながら,「カスタム実行可能ファイル」については,テンプレートでは指定できない(色々試したり調べたりしたが,まだ方法がわかっていない)ため, optusb を使った実行を行うための設定は,プロジェクト作成後,手動で行う必要がある。
ただし,Boycott Advance をインストールした状態で,かつ,最終的に作成される GBA ファイル名の拡張子を .gba にしておけば,Xcode の画面に表示される「プロジェクト名.gba」をダブルクリックすることで Boycott Advance を使って実行されるようだ。



Back to Home

Copyright (C) 2003 by gbcube