파일 시스템은 무엇인가? 왜 필요한가?
파일 시스템은 단지 롬에 파일들을 추가하는 다른 방법이다. 현재 아는 기본적인 간단한 방법은 .c 파일이나 data 디렉토리의 (gif/jpeg 예제를 확인해 보자) 파일들을 사용하여 컴파일시 합치는 것이다. 하지만 사실 또 다른 방법이 있다. 컴파일후 파일을 추가하는 것이다. 이것은 가능하며 몇가지 잇점이 있다.
이 파일들은 램에 저장되지 않을 것이기 때문에 4MB 제한을 초과 할 수 있다. gba 플래쉬 카트 롬에 넣으면 작동 할 수 있을 것이다.
컴파일후 파일을 추가할 수 있기 때문에, end user 도 파일을 추가할 수 있다. 이것은 Mod Player, 이미지 뷰어 같은 다양한 어플리케이션에 사용될 수 있다. nDoS는 아웃룩/썬더버드 연락처 를 저장하고 읽을수 있는 그런 시스템을 사용한다. 그래서 자기 프로젝트를 커스텀화 할수 있는 기회를 end 유저한테 제공한다.

여기에는 몇가지 단점이 있다.
이것은 WMB 와 전에 말한 것처럼 최대 4MB 를 넣는 모든 것에서 작동하지 않는다.
가능한 간단하게 만들었어도 정상적인 방법보다 사용하기 불편하다.

DS를 위한 PAlib 의 파일 시스템은 PAFS로 불리운다. PAFS가 나오기전 유용했던 GBFS도 사용 가능하다.

필요한 파일
예상한 것처럼, 파일 시스템을 구성하고 작동시키기 위해서는 몇개의 파일이 필요하다. PAFS/PAFS 예제에서 찾아 보자. 폴더를 열어보자
PAFS.exe 이것이 중요 파일이다. 롬에 원하는 파일을 추가해 주는 것이다.
PAFS.log 는 단지 PAFS 출력인 텍스트 파일이다. 추가된 파일들, 사이즈 같은 정보다.
PAFS.bat 이것은 중요한 파일로 노트패드에서 열어보면 PAFS PAFS.ds.gba 를 담고있다.
PAFS 는 로딩하기위한 실행파일로 PAFS.exe 이다.
PAFS.ds.gba 는 컴파일 후 추가하고자 하는 파일이므로 플래쉬 카트에 넣는다. 또한 .nds 에도 추가할 수 있다.
파일이 저장된 디렉토리 같은 더 많은 옵션을 추가할 수 있다. 디렉토리명을 주지 않으면(예제처럼) Files 폴더 에서 담겨져 있는 모든 파일을 찾을 것이다.

Files 폴더를 보자. 다양한 텍스트 파일이 있을 것이다. 필요는 없다 하지만 추가된 파일이 작동하는지 체크하기 위한 것이다. 작동한다면 DS(북리더 처럼)상에 이러한 파일들을 읽을수 있을 것이다.
PAlibTools 폴더에 .bat 파일과 PAFS.exe 파일의 복사본이 있을 것이다.

-. 간단한 파일 로딩

PA_InitText(0, 0)// Initialise the text system on the bottom screen
PA_InitText(1, 0)// Initialise the text system on the top screen

PA_OutputText(1, 0, 0, "Loading PAFS...");

 
u32 FileNumber = PA_FSInit(); // Inits PA File System, and returns the number of files
 
PA_OutputText(1, 0, 1, "  Files   : %d    ", FileNumber);

// For each file, we'll draw it's name on the bottom screen...
s32 i;
for (i = 0; i < FileNumber; i++){
PA_OutputText(0, 0, i, "%s.%s   Size : %d, %d", PA_FSFile[i].Name, PA_FSFile[i].Ext, PA_FSFile[i].Length, PA_FSFile[i].FilePos);
}

// Output the first file text on the top screen, just to test...
PA_OutputText(1, 0, 5, "File 0 : %s", PA_PAFSFile(0));
PA_OutputText(1, 0, 7, "File 1 : %s", PA_PAFSFile(1));
PA_OutputText(1, 0, 9, "File 2 : %s", PA_PAFSFile(2));
 
// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}
2개의 텍스트 초기화로 각각의 화면을 시작한다.
u32 FileNumber = PA_FSInit(); PA_FSinit 은 파일 시스템을 시작하는 함수이다. 만일 사용하지 않으면 어떠한 파일도 읽을 수 없다. 정보를 위해 파일시스템을 찾으며 롬을 빠르게 검색한다. 이때 다른 파일들에 대한 정보를 읽는다. 이 함수는 전체 파일 수를 반환한다. 그래서 여기서는 FileNumber 변수에 저장된다.

s32 i;
for (i = 0; i < FileNumber; i++){
PA_OutputText(0, 0, i, "%s.%s   Size : %d, %d", PA_FSFile[i].Name, PA_FSFile[i].Ext, PA_FSFile[i].Length, PA_FSFile[i].FilePos);
}
각각의 파일들에 대해(파일 0 부터 시작해서 FileNumber 파일들을 카운팅하며) 화면에 파일명(확장자없는), 파일 확장자, byte 길이, 파일 시스템에서 위치를 출력한다. 마지막 2가지 정보는 많이 사용하지 않을 것이지만, 파일명과 확장자는 나중에 유용할 것이다.
파일명은 예를들어 배경으로 로딩하고자 하는 특정 파일을 사용자에게 허용한다.
그리고 확장자는 만일 사운드, 텍스트, 이미지 파일이면 같은 방법으로 처리되지 않기를 원하기 때문이다.
본 것처럼 정보를 얻는 것은 간단하다. PA_FSFile 배열 구조체에 담긴다. PA_FSFile[n]는 (n 은 0부터 시작한다) .Name, .Ext, .Length, .FilePos 4개의 변수를 가진다.

마지막으로 (무한루프에는 아무것도 없다) PA_OutputText(1, 0, 5, “File 0 : %s”, PA_PAFSFile(0)); 는 중요한 부분이다.
PA_PAFSFile(File Number) 이것은 주어진 파일 숫자로 실제 파일로 갈수 있는 포인터이다. 파일로 무엇인가를 할려면 이것을 사용해야 한다. 이것은 파일 이름을 대신한다. mollusk.gif 라는 gif를 사용하는 것처럼(gif 예제에서) 여기서는 PAFS에 그 숫자를 주어야 한다.
이 예제에서 텍스트 커맨드에서 포인터를 사용했다. 이유는 텍스프 파일을 추가했기 때문이다. 그래서 화면상에 텍스트를 표시할수 있다. 만일 다른 타입의 파일(음악) 내용을 보여 주려고 했다면 화면상에 어떠한 것도 읽을수 없을 것이다.
코드를 컴파일하고 플래쉬 카트에 롬을 넣기 전에 파일을 추가하는것을 잊지 말기 바란다. 단지 PAFS.bat 를 실행한다. 이것은 PAFS.ds.gba 에 Files 폴더 안의 모든 파일을 추가할 것이다.
디렉토리 구조체(PAFS가 지원하는 디렉토리)를 읽는 방법을 볼 것이다.

-. 디렉토리 사용
파일 시스템에 디렉토리가 있는 것은 유용하지 않다. 하지만 나중에 파일을 읽는데 도움이 될수는 있다. 예를 들어, Files/Music 에 음악을 넣고 Files/Images 에 이미지를 넣을수 있다.
PAFS Folders 예제를 보자. 일반적인 평이한 메인 함수와 WriteFolders 의 2개의 함수가 들어가 있다. PAFS로 사용될 실질적인 함수는 아니다. 하지만 폴더의 정보를 보여주는데 사용된다.
메인 코드에서 WriteFolders(0)는 폴더 숫자 0의 내용(서브폴더와 파일들)을 읽는 함수이다. 얼마나 많은 폴더가 있는지 알수 없다면 PA_FSSys→Nfolders 로 체크해 본다. 이것은 폴더와 서브폴더 모두를 계산해서 알려 줄것이다. 폴더0 은  실제 Files/ 폴더이다.
void WriteFolders(u16 N){ // Recursive function to write the number of folders
 
u16 Nfolder = N;
// Write the folder's name...
PA_OutputText(1, indent, foldery, "%s : %d folders, %d files", PA_FSFolder[Nfolder].Name, PA_FSFolder[Nfolder].NFolders, PA_FSFolder[Nfolder].NFiles);
foldery++;

if (PA_FSFolder[Nfolder].NFolders > 0){ // For every subfolder, check their subfolders
indent+=2; // Indents for the subfolders
s32 k;
for (k = 0; k <  PA_FSFolder[Nfolder].NFolders; k++){ 
// Note : PA_FSFolder[i].FirstFile stores the number of the first file,
//so the files go from
//PA_FSFolder[i].FirstFile to PA_FSFolder[i].FirstFile + PA_FSFolder[i].NFiles
WriteFolders(PA_FSFolder[Nfolder].FirstFolder + k); // Check the subfolders
}
indent -= 2;
}
}
폴더와 서브폴더, 폴더 가 담고있는 것을 보여주기 위해 다른 레벨로 화면상에 출력한다. PA_FSFolder 배열 구조체에 무엇을 포함하고 있는지 이해할 필요가 있다. 이것은 다른 폴더 정보들이 저장된다.
PA_FSFolder[Nfolder].Name 은 폴더명이다.
PA_FSFolder[Nfolder].NFolders 는 포함하고 있는 폴더수 이다.
PA_FSFolder[Nfolder].FirstFolder 는 포함하는 최초 폴더의 수이다. 그래서 만일 3개의 서브 폴더를 가지면 첫 폴더는 숫자 2고, 3개의 서브 폴더는 숫자 2,3,4 를 가진다.
PA_FSFolder[Nfolder].NFiles 는 포함하는 파일 수이다.
PA_FSFolder[Nfolder].FirstFile 은 폴더처럼 첫 파일의 수이다. 그래서 다음 파일을 얻기위해서 1일 더하면 된다.
전에 처럼 컴파일후 PAFS.bat 를 사용해라.

-. 램에서 PAFS
PAFS는 램대신에 롬에 파일을 저장한다. 하지만 강제로 램에 파일을 넣을수 있다. 몇가지 제한이 있는데 첫째 롬에대한 최대 사이즈가 4MB 라는 것과 둘째 유저한테 주고자 하는 메모리가 얼마나 되는지 코드상에 명시해야 한다는 것이다. 만일 충분하게 명시하지 않으면 작동하지 않는다.
PAFS/PAFS_Ram 예제를 확인해 보자.
// Includes
#include <PA9.h>       // Include for PA_Lib
 
 
PA_FSRam(100000)/* This defines the size of the memory you allocate for files at the maximum ... I set it to 100kb, here.
You can use more (like 2 megs, but not much more) or as little as a few KB if you don't need to put much in it...*/

 
 
// Function: main()
int main(int argc, char ** argv)
{
PA_Init();    // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL

PA_InitText(0, 0)// Initialise the text system on the bottom screen
PA_InitText(1, 0)// Initialise the text system on the top screen

PA_OutputText(1, 0, 0, "Loading PAFS...");
 
PAFSStart = (char*)PA_FileSystem; // Tells to use the ram...
u32 FileNumber = PA_FSRamInit(); // Inits PA Ram File System, and returns the number of files
먼저 PA_FSRam(100000); 를 주목해 보자. PAFS 가 얼마나 메모리를 사용할지 알려 주는 것으로 중요하다. 이 예제에서는 100kb 를 허용한 것이다. 이것은 많지 않은 것이다 mod 파일은 더 크기 때문이다.
기본적으로 PAFS는 롬에서 파일을 찾는다. 올바른 위치를 찾기 위해서 램에 명시할 필요가 있다.  
PAFSStart = (char*)PA_FileSystem; 이것이  그것이다. 직관적으로 보이지 않지만 램에서 PAFS 시작한다는 것을 의미한다.
PA_FSRamInit 은 램에서 직접 PAFS가 찾도록 하는 특별한 초기화 이다.
신고
Posted by 버들피리불며

BLOG main image
닌텐도 DS 관련해서 Palib를 소개하고 제가 개발한 홈브류와 다른 개발자의 홈브류를 소개하고자 합니다. NDS 자체 제작(Homebrew)에 관심있는 다른 분들의 길잡이가 되고 싶습니다. by 버들피리불며

공지사항

카테고리

분류 전체보기 (39)
따라하기 (5)
PA_lib 소개 (10)
Homebrew 소개 (7)
나의 Homebrew (15)
기부하기(Donate) (1)
Wii (1)
Total : 104,002
Today : 4 Yesterday : 9