첫째날 - 인스톨 및 컴파일링

(2008년 2월부터 튜토리얼의 내용을 기반으로 아래와 같이 작성해 보겠습니다. ^^)

첫째날에는 닌텐도 DS 프로그래밍을 하기 위한 환경 셋팅과정과 컴파일 방법에 대해 소개한다.

아래와 같이 두부분을 포함한다.

  • NDS 프로그래밍을 위한 환경 셋팅 방법 (devkitPro, PAlib, emulatior..)
  • 기본 프로그램인 helloWorld 컴파일 방법

bluelancer 23/01/2008 15:13


인스톨링 (NDS 프로그램밍을 위한 환경 셋팅 요약)

  • 미리 알아야 될 내용
    • 프로그래밍 능력 (C 언어, C++.. 등등)
  • NDS 프로그래밍에 필요한 환경 셋팅
    • 운영체제 : MS 윈도우즈 환경
    • Nintendo DS (Lite)
      • NDSL 홈브루 : Passthrough 디바이스
      • 예) R4 Card + SD Memory(문쉘)
    • NDS 애물레이터

NDS (Lite) 하드웨어 요약

bluelancer.dnip.net_wikiimage_nds.jpg

  • 휴대용 게임기 : NDS 2004년도에 미국, 일본 판매
  • 하드웨어
    • 입출력 장치
      • 두얼 스크린(DS: Dual Screen) : 크기가 256 X 192 화소인 2개의 칼러 LCD 스크린
        • 터치 스크린(아래 화면): 스타일러스나 손가락을 사용하여 터치 입력

bluelancer.dnip.net_wikiimage_stylus.jpg

  • 왼쪽부분: D-패드 (방향키), 작은 파워버튼
    • 오른쪽부분: A, B, X 와 Y 버튼, 작은 선택과 시작 버튼
    • 어깨 부분: L 과 R 버튼
    • 스테레오 스피커 : 가상 서라운드 사운드 제공 (윗화면 양쪽에 위치)
    • 마이크로폰 : 아래화면 위쪽 중간에 위치

bluelancer.dnip.net_wikiimage_ndsl.jpg

  • NDSNDS Lite 비교
    • 더 얇고, 밝고, 가볍게 NDS 다시 디자인
    • 2006년 1월 26일 공표
    • 2007년 12월 까지 전세계적으로 NDSL 4597만개 판매 가장많이히 팔린 비디오 콘솔은??
    • NDSL 무게: 218 g / 7.69 oz (DS 보다 21% 가벼움)
    • NDSL 크기: 133 mm × 73.9 mm × 21.5 mm (DS 보다 42% 줄어듬)
    • 베터리 수명: 3시간 풀 차지후
      • 밝기단계 가장 낮은 경우: 15-19시간 지속
      • 밝기단계 가장 밝은 경우: 5-8시간 지속
    • 화면 밝기 : 4단계 밝기 조절 가능
  • NDS (Lite) 시스템 스펙
    • CPU : 67 MHz ARM9 과 33 MHz ARM7
    • Media : GBA cartridges & Nintendo DS Game Cards
    • System storage : 4 MB RAM
    • Connectivity: Wi-Fi and LAN
      • Speed: 1 Mbps or 2Mbps
      • supports wireless IEEE 802.11 (Wi-Fi) standards (10–30 m, depending on conditions)
      • online with the Nintendo Wi-Fi Connection service

 NDS 하드웨어 앞면

 NDS 하드웨어 뒷면

  • Passthrough 디바이스
    • the pass through의 목적 : the Game Boy Advance (GBA) cartridge slot 혹은 Nintendo DS (NDS) card slot을 통해 NDS 하드웨어 상에서 프로그램을 구동할 수 있도록 하기 위해 필요
      • The Slot-1 port : DS Flash Cartridge

bluelancer.dnip.net_wikiimage_slot1.jpg

  • The Slot-2 port : GBA Flash Cartridge

bluelancer.dnip.net_wikiimage_slot2.jpg

       
 

인스톨링 (NDS 프로그램밍을 위한 환경 셋팅)

 

MS 윈도우즈 환경에서 인스톨

  • devkitARM : devkitPro updater
    • devkitPro가 깔린 같은 위치에 인스톨
    • .Net framework : PAlib를 사용하기 위해서는 .Net framework 인스톨 해야함
    • 현재까지의 PAlib는 devkitARM release 21을 지원하지 않아 release 20 으로 다운그레이드하여 사용하여야만 함
  • 애뮬레이터

bluelancer.dnip.net_wikiimage_no_gba.jpg

  • No$GBA : 거의 대부분의 NDS를 애뮬레이터 가능, 3차원 과 Wifi 애뮬레이터 포함
  • Dualis : 홈브루 프로그램 지원, No$GBA보다 정확하지 않음
  • iDeaS : 3차원 및 사운드 지원 가능
  • DeSmuMe : 가장 빠른 애뮬레이터, 확대/회전 및 사운드 지원하지 않음
 

비주얼 C++ 2005 혹은 Express를 이용한 NDS 프로그래밍(PAlib) 컴파일링

  • 환경 변수 추가
    • DKP_HOME : devkit이 인스톨된 위치 (예: C:\devkitPro)

bluelancer.dnip.net_wikiimage_enva.jpg

bluelancer.dnip.net_wikiimage_wizard1.jpg

  • 비주얼 VC++ 2005 Express 버전 : VC8_Express_Setup.js 파일 더블 클릭

bluelancer.dnip.net_wikiimage_wizard2.jpg

  • 비주얼 VC++ 2005 정식 버전 : VC8_Setup.js 파일 더블 클릭 
 

비주얼 C를 이용한 NDS 첫번째 프로젝트 생성 방법

  • PAlib 프로젝트는 긴이름이나 공백을 인식하지 못함
    • 비주얼 스튜디오 프로젝트 생성 위치를 공백이 없이 변경
      • 메뉴위치: Tools =⇒ Options =⇒ Projects and Solution =⇒ General 선택

bluelancer.dnip.net_wikiimage_option.jpg

  • 비주얼 C++ 프로젝트 생성
    • 메뉴위치: File =⇒ New =⇒ New Project 선택

bluelancer.dnip.net_wikiimage_nproject.jpg

  • 위저드에 의해 생성된 파일들은 다음과 같음
    • logo.bmp → DS 로더에서 보여지는 응용프로그램의 로고
    • logo_wifi.bmp → WiFi를 사용할 때 보여지는 로고
    • main.cpp → 메인 프로그램 파일 (NDS 프로그래밍을 하기위해 작성하는 코드 부분)
    • Makefile → 비주얼 스튜디오를 최적화하기 위한 PALib makefile
    • ReadMe.txt → 프로그램 정보

bluelancer.dnip.net_wikiimage_files.jpg

  • NDS 관련 헤더추가
    • Tools → Options → Project & Solutions → VC++ Directories 메뉴 선택 후
    • Include 파일 메뉴 선택
      • <PALib 인스톨 폴더>\include\nds 추가
      • <PALib 인스톨 폴더>\libnds\include 추가
  • 프로젝트 빌드 (단축키 F7)

bluelancer.dnip.net_wikiimage_build.jpg

 

컴파일시 에러가 발생하는 경우 대처 방법

  • 컴파일 에러 발생 1: 형변환 에러가 날 경우

bluelancer.dnip.net_wikiimage_conversion.jpg

  • devkitPro\PAlib\include\nds\arm9\PA_Sound.h 파일에서 발생 =⇒ (u32*) 아래와 같이 추가

bluelancer.dnip.net_wikiimage_err1-1.jpg

bluelancer.dnip.net_wikiimage_err1-2.jpg

  • 컴파일 에러 발생 2: 파일 오픈 에러가 날 경우

bluelancer.dnip.net_wikiimage_open.jpg

  • C:\devkitPro\PAlib\lib\arm7\arm7.bin 파일 오픈 에러 발생
    • arm7.bin 파일을 현재 프로젝트 폴더에 추가

bluelancer.dnip.net_wikiimage_err2.jpg

 

NDS 애뮬레이터 비주얼 스튜디오에서 간편하게 사용하는 방법

  • 비주얼 스튜디오의 외부도구로 애뮬레이터 등록
    • Tools =⇒ External Tools 메뉴 선택
    • 새로운 외부도구로 추가함
      • 제목: No$GBA
      • 명령: NO$GBA.exe 실행파일 선택
      • 인수: (TargetDir)\$(TargetName).nds
    • 초기디렉토리: $(TargetDir)

bluelancer.dnip.net_wikiimage_tool1.jpg

  • 키보드 단축키 만들기
    • Tools =⇒ Options =⇒ Environment =⇒ Keyboard 선택

bluelancer.dnip.net_wikiimage_assign.jpg

  • 도구.외부명령어9 선택 후 Shift+F10 으로 할당

bluelancer.dnip.net_wikiimage_shortcut.jpg 

첫번째 NDS 프로그래밍 (HelloWorld)

  • 템플릿 파일의 메인 소스 코드
// PALib Template Application
// Includes
#include <PA9.h>       // Include for PA_Lib
int main()
{
	PA_Init();    // Initializes PA_Lib
	PA_InitVBL(); // Initializes a standard VBL

	PA_InitText(1, 2);
	PA_OutputSimpleText(1, 1, 2, "Hello World!");

	// Infinite loop to keep the program running
	while (1)
	{
		PA_WaitForVBL();
	}
	return 0;
}

코드 설명

  #include <PA9.h>       // Include for PA_Lib
  • PAlib 라이브러리 헤더를 포함시킴
  int main(int argc, char ** argv)
  • 프로그램 메인 함수
	PA_Init();    // Initializes PA_Lib
	PA_InitVBL(); // Initializes a standard VBL
  • PA_Init() =⇒ PL_Lib 라이브러리 초기화 수행하는 명령어
    • PA_InitVBL() =⇒ 표준 VBL를 초기화를 하는 명령어
      • VBL(Verticle Blanking Interrupt)
    • 초당 60 프레임 (fps: frame per second) 으로 화면을 뿌려주는 작업을 동기화하여 초기화함
      • VBL을 초기화하지 않으면 프로그램이 너무 빨리 수행되가나 전혀 수행되지 않을 수 있음
        • 예) 초당 100000 프레임으로 수행되어 플레이를 할 수 없을 수도 있음
	PA_InitText(1, 2);
	PA_OutputSimpleText(1, 1, 2, "Hello World!");
  • PA_InitText() =⇒ 화면 1(위쪽 화면)에 배경버퍼 2를 사용하여 텍스트 출력을 하도록 초기화
    • 첫번째 인수: 텍스트를 출력할 화면 설정(0 은 아래화면, 1은 윗쪽 화면)
  • 두번째 인수: 텍스트를 쓸 배경 레이어 설정 (4개의 배경레이어 제공)
    • 0은 맨윗쪽 배경레이어, 1은 그다음 레이어, ... , 3은 맨 아래 배경 레이어
  • PA_OutputSimpleText(1, 1, 2, “Hello World!”) =⇒ “Hello World!” 문자열을 윗족화면에 출력
    • 첫번째 인수: 출력 화면 선택 (0-1)
    • 두번째 인수: 문자열을 의 위치 수평(X) 지정 (0 부터 31 타일)
      • 문자의 위치는 8×8 픽셀로 구성된 타일 단위로 지정
    • 세번째 인수: 문자열을 의 위치 수직(Y) 지정 (0 부터 23 타일)
    • 네번째 인수: 출력할 문자열 지정
	// Infinite loop to keep the program running
	while (1)
	{
		PA_WaitForVBL();
	}
  • PA_WaitForVBL() =⇒ 무한 루프를 화면 변환률을 60 fps로 동기화하는 명령문

관련 자료

국내사이트

네이버 카페

================================================================================================

출처 : http://www.palib.info/wiki/doku.php?id=day1ko
지금 졸업작품이... wipi 모바일.. 이쪽 사정상 제안서를 쓰지도 못하게 하여 상용화 기회마져 안주더군요.
그래서 급히 nds devkit 플밍 전향하려고 자료를 찾다가 좋은곳이 있어 올립니다.

ps. 컴파일러 에러가 나는곳이 위의 튜토리얼과 약간 다르게 나와 당황스러웠습니다.
저의 경우.. PA_Draw.h  에서
extern ininle u16 PA_GetBmpWitdh(void *bmpdata)
{
    BMP_Headers *Bmpinfo = (BMP_Headers*)(bmpdata+14);
    return Bmpinfo->Witdh;
}

부분에서 에러가 나길래
함수의 extern ininle u16 PA_GetBmpWitdh(void *bmpdata) 부분을
extern ininle u16 PA_GetBmpWitdh(BMP_Headers *bmpdata)
수정하면서 해결하였습니다.

신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소