sceIoDread
한번쯤 홈브류를 개발해 본 사람들이라면 알 것이다.
저 함수의 버그를...
저 함수의 버그는 크게 두가지가 있는데,
첫째로, 저 함수를 쓰기 전에 인자로 들어가는 sceIoDirent 구조체를 0으로 초기화해줘야만 한다. 무조건...
그렇지 않으면, PSP가 멈춰버린다. 이 버그를 알아내려고 얼마나 고생을 했던가...
그리고 둘째로, Shift-Jis외의 멀티바이트 케릭터를 지원안한다. 즉, 한글이나 한자 같은 문자를 못읽어 온다.
Ascii나 Shift-Jis이외의 문자셋이 나오면 무조건 0x81 0xA1 [이는 sjis의 '■'에 해당한다] 을 반환한다.
난 내 코드에 문제가 있는 줄 알고, 이리 저리 살펴봐도 특별히 문제는 없었다.
그러던 차에, 때 마침 PSPLink를 알게 되어서 저 함수에 문제가 있다는 걸 알아버렸다.
(외국 포럼을 찾아보니 PSP로 개발하는 대부분의 사람들이 맨 처음에 저 문제에 직면한다고 한다...ㅋㅋㅋ)
첫째 문제는, 그냥 선언하지 않고 포인터로 선언한후, 메모리 할당을 통해 어느정도 해결한듯 보였지만, 이상하게 그 후로도 문제가 발생하게 되어 메모리 초기화까지 해서 간신히 막았다. (구조체를 0으로 memset)
밑에는 관련 코드...
memset(&dirent, 0, sizeof(sceIoDirent));
하지만 진짜 문제는 두번째였으니...
sceIoDread 함수는 레지스터에 인자만 전달하고 바로 시스템 콜로 연결되는데, (syscall 0x209c)
이건 뭐 어떻게 고칠 수가 없다. -_-;;
추가:
메모리스틱은 대부분 FAT 포맷을 따르는데, 디렉토리 엔트리에는 숏네임(8.3 형식)과 롱네임 형식(확장자 포함 최대 255자)이 있다.
긴 파일 이름을 표시하기 위해선 당연히 롱네임 엔트리를 읽어와야 한다.
그런데 이 롱네임 엔트리에는 파일 이름이 "UTF-16LE" 형식으로 저장이 되어 있어서,
각각에 맞는 문자셋으로 변환할 필요가 있다.
그런데 sceIoDread 함수는 Shift-Jis만 지원하는지, 범위에 벗어나는 문자셋은 ■로 반환해버린다.
아마 sceIoioctl 이란 함수를 조작해서 해결해 볼 수도 있을 것 같은데, 일단은 Fat 에 직접 접근해서 해결...
이올린에 북마크하기
