'멀티바이트'에 해당되는 글 1건

  1. 2007/09/20 sceIoDread by 키네낵

sceIoDread

Trial & Error 2007/09/20 23:51

sceIoDread

한번쯤 홈브류를 개발해 본 사람들이라면 알 것이다.

저 함수의 버그를...

저 함수의 버그는 크게 두가지가 있는데,

첫째로, 저 함수를 쓰기 전에 인자로 들어가는 sceIoDirent 구조체를 0으로 초기화해줘야만 한다. 무조건...

그렇지 않으면, PSP가 멈춰버린다. 이 버그를 알아내려고 얼마나 고생을 했던가...

그리고 둘째로, Shift-Jis외의 멀티바이트 케릭터를 지원안한다. 즉, 한글이나 한자 같은 문자를 못읽어 온다.

AsciiShift-Jis이외의 문자셋이 나오면 무조건 0x81 0xA1 [이는 sjis의 '■'에 해당한다] 을 반환한다.

난 내 코드에 문제가 있는 줄 알고, 이리 저리 살펴봐도 특별히 문제는 없었다.

그러던 차에, 때 마침 PSPLink를 알게 되어서 저 함수에 문제가 있다는 걸 알아버렸다.
(외국 포럼을 찾아보니 PSP로 개발하는 대부분의 사람들이 맨 처음에 저 문제에 직면한다고 한다...ㅋㅋㅋ)

첫째 문제는, 그냥 선언하지 않고 포인터로 선언한후, 메모리 할당을 통해 어느정도 해결한듯 보였지만, 이상하게 그 후로도 문제가 발생하게 되어 메모리 초기화까지 해서 간신히 막았다. (구조체를 0으로 memset)

밑에는 관련 코드...

sceIoDirent dirent;
memset(&dirent, 0, sizeof(sceIoDirent));

하지만 진짜 문제는 두번째였으니...

sceIoDread 함수는 레지스터에 인자만 전달하고 바로 시스템 콜로 연결되는데, (syscall 0x209c)

이건 뭐 어떻게 고칠 수가 없다. -_-;;

추가:

메모리스틱은 대부분 FAT 포맷을 따르는데, 디렉토리 엔트리에는 숏네임(8.3 형식)과 롱네임 형식(확장자 포함 최대 255자)이 있다.

긴 파일 이름을 표시하기 위해선 당연히 롱네임 엔트리를 읽어와야 한다.

그런데 이 롱네임 엔트리에는 파일 이름이 "UTF-16LE" 형식으로 저장이 되어 있어서,

각각에 맞는 문자셋으로 변환할 필요가 있다.

그런데 sceIoDread 함수는 Shift-Jis만 지원하는지, 범위에 벗어나는 문자셋은 ■로 반환해버린다.

아마 sceIoioctl 이란 함수를 조작해서 해결해 볼 수도 있을 것 같은데, 일단은 Fat 에 직접 접근해서 해결...

Posted by 키네낵