掌上游戲機開發指南——GBA程序開發入門

 

 

1.GBA簡介

Game Boy Advanced(GBA)是日本任天堂公司於2001年推出的一款32位掌上游戲機。它着重於遊戲機的便攜式,並且以2D遊戲爲主(3D遊戲依然不錯)。GBA有十分高效硬件圖像處理加速,GBA基本上是現在全球公認的最佳的掌上游戲機。

GBA的硬件功能十分多。它的CPU是以RISC爲基礎的32位ARM CPU,主頻是16.78MHz。屏幕最大支持240x160的16位真彩色顯示。在圖形處理方面GBA還另外提供了硬件加速,支持硬件上的圖形旋轉,縮放,alpha混合,face in/out淡入淡出等。

GBA的軟件開發主要是以C語言爲主,程序設計簡單而且十分自由,也正是這一點吸引了許多愛好者在GBA上做東西(不一定是遊戲)。你完全可以把它做成PDA,做成Mp3播放器(它的聲音處理方面能力也不錯哦),做成隨身電影播放齊,做成電子詞典等,只要你有能力設計它的軟件。

不說多了,我們還是主要來看看如何開發GBA的軟件。應該說,你只要會點C語言,就可以進入GBA的開發行列中了。在GBA上寫程序比在電腦上寫程序更簡單。GBA是單總線的設計,也就是說通過簡單的讀寫命令就能完成所有的內部硬件操作。訪問GBA內部的寄存器就猶如訪問一塊內存一樣簡單,而GBA所有的功能都是通過讀寫寄存器而完成的。

2.GBA程序開發準備

GBA開發所需要的東西除了一臺可以用的電腦外,主要就是一個編譯器和一個GBA模擬器。

有了GBA模擬器,你就可以在你的電腦上運行GBA程序了。GBA模擬器應該是到處可以找得到的。我推薦的是VisualBoyAdvance。你可以在www.gbadev.org上下載最新的版本。如果你還想把你的程序弄到GBA機器上玩,那麼除了應該有個GBA外,還應該有個ROM燒錄器。比如EZ-Flash。通過它可以把電腦上的ROM燒錄到GBA卡帶上,然後放到GBA上運行。(總共一個GBA加一個128MB的EZ-Flash大概是1000元人民幣)

GBA程序開發可以用匯編語言和C/C++語言來寫程序,不過彙編語言比較複雜,而且不是我們平常使用8086彙編,而是Arm彙編。任天堂公司可能覺得C++程序運行消耗太大,不推薦C++語言來開發,所以我們都一直將C語言作爲首選。

GBA開發所用的C語言編譯器主要有兩種,一種是免費的gcc,一種是Arm公司提供的ArmSDT。

這裏的gcc當然不是簡單的linux下的gcc,而是Arm Gcc。簡單地說就是把我們平時常見的gcc改造成生成ARM CPU代碼的gcc。你可能會問難道我們要使用linux操作系統了嗎?其實我們還是在windows下做GBA開發,雖然gcc主要是在linux下的東西,但是我們也可以從cygwin(在windows下模擬UNIX的工具)中得到在windows下運行的gcc。你可以根據這個cygwin下的gcc,自己去配置Arm Gcc,也可以直接去下載個配置好了的Arm Gcc。比如DevKitAdv,你可以到http://www.gbadev.org去下載這個軟件。DevKitAdv大概10多MB。有了它,你用不着去找什麼cygwin(200-300MB)和配置什麼Arm Gcc了,DevKitAdv已經幫你做好了一切,你只需安裝它就OK了。

ArmSDT是Arm公司提供的專門爲ARM CPU的開發程序的C語言編譯器。前面說過,GBA是採用32位的ARM CPU,所以這個ArmSDT是可以用來開發GBA程序的。而且由於ArmSDT是ARM公司官方的開發包,所以它的編譯速度和質量上都比免費的gcc要高,但對C語言的支持也不及gcc好(gcc畢竟已經成了C語言編譯器的標準),最關鍵的問題它不是免費的,但是它的免費測試版還是可以用的。你可以到Arm公司的網站去下載ARMSDT2.51. http://www.arm.com

我以DevkitAdv配置的gcc爲主還講解GBA的程序開發。

安裝DevKitAdv很簡單,用WinZip或WinRAR軟件解壓下載文件後,雙擊DKA_Setup.exe,出現下面的對話框,選擇安裝目錄,然後點擊"Install"就進行安裝了。整個DevKitAdv共49MB,應該是十分小的。

編譯器和模擬器都裝好後,下面我們需要一批小工具,主要就是幫我們轉換圖片,聲音等數據。GBA程序編譯後通常都是一個rom文件,圖像和聲音等數據都是包含在主程序裏的。這些工具能把我們電腦上的圖片或聲音文件轉換成一個*.h頭文件,然後包含在主程序裏編譯。關於這種轉換工具也是有許多,我推薦的圖形轉換工具是kaleid_1-2-3,在http://www.gbadev.org上下載,它可以轉換我們平時用的BMP文件。聲音轉換工具是wav2gbac.exe,也是在http://www.gbadev.org下載,它可以轉換我們平時用的WAV文件。

好了,下載完後這兩個小工具後,準備工作就算做完了。

3.第一個GBA程序

現在我們開始我們的第一個GBA程序。在這個程序中我們將在屏幕上顯示一張的圖片。

首先你建立一張240*160大小,256色的bmp圖片,比如這樣:

名字就叫helloworld.bmp.打開剛纔下載的Kaleid_1-2-3程序。選中菜單File中Open,打開這個helloworld.bmp文件,再選中菜單File中Convert and Save.出現對話框:

如圖一樣選擇各項選擇,特別注意的是一定要選擇“BitMap Graphics(Mode 4)”和“Save As C Source”,並且去掉“#include <agbtypes.h>”的選擇。最後單擊“Convert and Save”,保存爲helloworld.h。

圖像數據已經轉換好了,接着我們開始寫代碼。建立個main.c的文件,並把helloworld.h放在一個目錄下。然後在main.c中寫下代碼:

typedef unsigned char u8;

typedef unsigned short u16;

typedef unsigned long u32;

#define REG_DISPCNT *(u16*)0x04000000// 顯示寄存器地址

#define VRAM 0x06000000 // 圖像緩衝區地址

#define PALETTE 0x5000000// 調色板地址

#define MODE_4 0x04 // mode4標誌

#define BG2_ENABLE 0x0400// BG_2標誌

#define SetMode(Mode) REG_DISPCNT=(Mode) // 設置顯示模式的宏定義

#include "helloworld.h" // 包含圖像調色板和數據的頭文件

u16* palette_mem=(u16*)PALETTE; // 系統調色板

u16* video_buffer=(u16*)VRAM; // 圖像緩衝區

void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data);

int main()

{

// 設置屏幕模式,這裏使用MODE_4

SetMode (MODE_4 | BG2_ENABLE);

// helloworld_pal和helloworld_gfx是在"helloworld.h"定義的調色板和圖像數據數組名

Draw((u16*)helloworld_pal,(u16*)helloworld_gfx,palette_mem,video_buffer);

// 死循環

while(1)

{ ;}

}

// MODE_4繪圖函數

void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data)

{

int loop,x,y;

// 寫入目的調色板

for(loop = 0; loop < 256; loop++)

dst_palette[loop] = src_palette[loop];

// 寫入圖像緩衝區

for(x = 0; x < 120; x++)

for(y = 0; y < 160; y++)

dst_data[(y) *120 + (x)]=src_data[(y) *120 + (x)];

}

最後建立一個編譯批處理命令make.bat來幫我們編譯生成目標代碼。

寫入下面的命令到一個新建的make.bat文件裏面

PATH=C:/devkitadv/bin;%PATH%

gcc -lm -o main.elf main.c

objcopy -v -O binary main.elf main.bin

pause

如果你的devkitadv是在D盤,那麼就應該是PATH=D:/devkitadv/bin;%PATH%,我這裏的DevKitAdv是安裝在C盤的。執行make.bat,如果沒有錯誤的話就可以得到編譯出來的main.bin和main.elf. main.bin就是可以運行的GBA的rom.你可以用的模擬器VisualBoyAdvance來打開運行它,或者燒錄到GBA卡帶上運行。

這是在模擬器VisualBoyAdvance中運行的結果。

下面我將一一講解上面的程序

前三行:

typedef unsigned char u8;

typedef unsigned short u16;

typedef unsigned long u32;

定義GBA程序自己的數據類型,因爲這樣我們就很容易知道每個數據在GBA中佔的字節數。

#define REG_DISPCNT *(u16*)0x04000000// 顯示寄存器地址

REG_DISPCNT是設置顯示模式的寄存器.GBA中有mode0-mode5六個顯示模式。我們這個程序的顯示模式是mode4,也就是240x160的8位色(256色)的雙緩衝顯示模式。比如mode3,就是240x160的16位真彩色的單緩衝顯示模式。

#define VRAM 0x06000000// 圖像緩衝區地址

#define PALETTE 0x5000000 // 調色板地址

VRAM就是GBA的顯示內存,簡單地說VRAM中的數據就是屏幕上的圖象。跟我們的平常用的計算機一樣的。PALETTE就是調色板地址,簡單地說就是裝圖像調色板的地方。

#define MODE_4 0x04

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章