跳轉到內容

PSP 開發/檔案系統

100% developed
來自華夏公益教科書,開放的書籍,為開放的世界

檔案系統包含許多可以訪問的媒體。有些媒體不應該寫入,因為這可能會導致系統損壞,就像使用核心模式的風險一樣。使用核心模式時,這裡限制的媒體不會被討論,但會說明哪些應該被限制。

路徑約定

[編輯 | 編輯原始碼]

PSP 在路徑方面更像 Unix 系統。一般的路徑約定使用正斜槓 "/" 來分隔協議、目錄和檔案。所有內容都應使用大寫字母,同樣,任何檔案或目錄都會被引用,無論其大小寫 - 它不區分大小寫。這意味著 "BIN" 與 "bIN" 和 "bIn" 相同。將所有內容保持一致並使用大寫字母符合此規則是有意義的,因此最好將檔案和資料夾大寫。

協議決定被引用的媒體。有很多媒體可以被引用。以下是一些安全使用的常用媒體列表。

  • umd0:/ - UMD 光碟
  • ms0:/ - 記憶棒
  • disc0:/ - UMD 光碟

請遠離

  • lflash:/
  • flash0:/
  • flash1:/

記憶棒根目錄

[編輯 | 編輯原始碼]

記憶棒的根目錄是所有資料夾的基礎。在 Windows 中,這通常是你的 C:/ 驅動器。但是,對於 PSP 來說,它是記憶棒。記憶棒在插入電腦時可能會列出任何協議。根據你的 PNP 設定,它可能無法掛載,需要手動掛載。

這是你的記憶棒中包含韌體 6.60 PSP 1000 CFW 的預設資料夾列表。

  • MP_ROOT
    • 100MNV01
    • 101ANV01
  • MUSIC
  • PICTURE
  • PSP
    • COMMON
    • GAME
    • RSSCH
    • SAVEDATA
    • SYSTEM
      • BROWSER
      • INFOBOARD
        • TEMP
          • IMAGE
    • THEME
  • VIDEO

根目錄是第一級資料夾。這些資料夾內部不再是根目錄,而是俗稱 "GAME 資料夾根目錄",指的是 PSP/GAME 資料夾中的所有內容。

PPSSPP 記憶棒

[編輯 | 編輯原始碼]

從 PPSSPP 1.4 開始,對修復進行了改進,使自制軟體更容易測試。將包含專案的資料夾放到 PPSSPP/Memstick/PSP/GAME 中,將導致向 main() 傳遞正確的引數 (ms0:/PSP/GAME/APPLICATION/EBOOT.PBP),而不是 umd0:/。後一種路徑是為了支援 ISO PBP 和 PS1 遊戲。這意味著可以在 PPSSPP 上模擬 UMD,但在真實 PSP 上,必須存在 CFW 或已簽名的 PBP。以下是 PPSSPP 預設資料夾列表,它與 PSP 的初始列表不同。

  • MUSIC
  • VIDEO
  • PICTURE
  • PSP
    • COMMON
    • GAME
    • SAVEDATA
    • SYSTEM

絕對路徑

[編輯 | 編輯原始碼]

絕對路徑包含一個協議,該協議直接透過所有路徑連結到檔案或目錄。絕對連結是最安全的,因為它們指向一個位置,無論當前工作目錄 (CWD) 是什麼。建議在必要時使用絕對路徑。

示例路徑

  • umd0:/FOLDER/file.txt
  • ms0:/PSP/GAME/APPLICATION/EBOOT.PBP
  • ms0:/MUSIC/HomeBySafia.mp3

相對路徑

[編輯 | 編輯原始碼]

相對路徑使用 CWD 並根據它構建路徑。例如,如果當前工作目錄是 ms0:/PSP/GAME/APPLICATION,則相對路徑可以引用 GAME/OTHER_APPLICATION。為此,使用一系列雙點來表示上級目錄,但是,使用此方法不需要使用上級目錄,因為它也是基於 CWD 構建的。這意味著 ms0:/PSP/GAME/APPLICATION 可以是 CWD,並且要引用一個名為 FILES 的內部資料夾,只需要 /FILES。

檔案系統示例路徑 (ms0:/)

  • MUSIC
  • PSP
    • GAME
      • APPLICATION
        • FILES
      • OTHER_APPLICATION
        • FILES
        • DATA

CWD 示例路徑 (ms0:/PSP/GAME/APPLICATION)

  • /FILES
  • ../OTHER_APPLICATION
  • ../OTHER_APPLICATION/FILES
  • ../OTHER_APPLICATION/DATA
  • ../../../MUSIC

路徑拼接

[編輯 | 編輯原始碼]

一個常見的技巧是使用字面拼接策略,它與你 malloc 或 calloc 一些記憶體並執行字串拼接的策略相對應 - 使用動態記憶體。字面拼接不在動態記憶體上,而在自動堆疊上。

避免字面拼接的 Malloc/Calloc

// make some zero terminated literals
const char* abc = "abc";
const char* onetwothree = "123";

// concat them by specifying variable
const char* abc_onetwothree = abc onetwothree;
printf(abc_onetwothree); //> abc123

綜合示例

[編輯 | 編輯原始碼]

絕對路徑是最好的選擇。在 PSP 中修改 CWD 有點麻煩。當檢測 EBOOT.PBP 來自的媒體時,它會更加麻煩。如 Hello World 應用程式 中所述,傳遞給 main() 的引數將告訴你 EBOOT.PBP 的絕對路徑。比對它進行子字串操作並以此為基礎構建更好的方法是使用 路徑拼接。這使得建立絕對路徑變得容易。問題是資料夾名稱取決於使用者是否編輯了名稱。

示例

#define TITLE "APPLICATION"
#define ROOT "ms0:/PSP/GAME/" TITLE "/"

使用這種方法還可以在 PSP_MODULE_INFO() 函式內放置 TITLE 宏。如果模擬 UMD,路徑將是 umd0:/,而不是直接來自記憶棒 (ms0:/)。

當前工作目錄

[編輯 | 編輯原始碼]

PSP 有 當前工作目錄 (CWD) 的概念。這始終是 PBP 檔案的啟動位置。在模擬 UMD 時,CWD 是 EBOOT.PBP 中的根資料夾,即 umd0:/。為了設定 CWD,PSPDEV 提供了 sceIoChdir() 函式。sceIoChdir() 接收一個指向新路徑的 const char*,該路徑將成為 CWD。設定後,無法使用提供的 sceIo* 函式讀取 CWD。此類函式在 unistd.h 中被稱為 getcwd(),在 windows.h 中被稱為 _getcwd()。

工作示例

[編輯 | 編輯原始碼]
  • 沒有工作示例


華夏公益教科書