#homebrew #playstation #no-std

nightly no-std psx

为索尼 PlayStation 1 开发自制软件的库

2 个版本

0.1.6 2022 年 6 月 7 日
0.1.5 2022 年 6 月 4 日
0.1.4 2022 年 5 月 4 日

385嵌入式开发

MIT 许可证

180KB
4K SLoC

psx-sdk-rs

这是一个基本的 SDK,可以在 PlayStation 1 上运行自定义 Rust 代码。它与 Rust nightly 版本 2022-06-03 或更高版本兼容。使用 rustup 按以下方式安装 Rust 工具链。

rustup update nightly
rustup component add rust-src --toolchain nightly

安装 cargo-psx

cargo-psx 是 cargo 的一个可选包装器,它设置了一些常用标志和参数,并将目标 JSON 复制到 crate 的目标目录。基本上,这允许你仅运行 cargo psx run 而不是

RUSTFLAGS="-Ccodegen-units=1                               \
    -Clink-arg=-Tpsexe.ld -Clink-arg=--oformat=binary"     \
    cargo run +psx -Zbuild-std=core                        \
    -Zbuild-std-features=compiler-builtins-mem             \
    --target /path/to/mipsel-sony-psx.json

这需要创建和运行可执行文件所需的最少标志。

要安装

cargo install cargo-psx

要卸载

cargo uninstall cargo-psx

更多选项

cargo psx --help

用法

examples 目录中,有一些已经通过 mednafen、pcsx-redux 和/或 duckstation 中的 SCPH7001 NA BIOS 测试的演示。其他 BIOS 版本/区域可能也有效,但尚未经过测试。要尝试演示,首先请确保已在 examples/$DEMO/.cargo/config.toml 中安装了模拟器,然后从其目录运行 cargo psx run

要在模拟器中手动选择可执行文件,首先使用 cargo psx build 构建项目,然后在 /path/to/crate/target/mipsel-sony-psx/release/ 目录中打开 .exe 文件。要使用 cargo psx run 与其他模拟器,请更改 mipsel-sony-psx 目标的 运行器。要将可执行文件打包成 ISO(例如,用于 CD-ROM 文件系统),请使用 mkpsxiso 或类似工具。

Mednafen

Mednafen 通常与以下 .cargo/config.toml 配置一起使用。获取标准输出可能需要将 psx.dbg_levelmednafen.cfg 中设置至少为 2。在加载 ISO 时似乎没有快速启动(跳过 BIOS)选项,因此 ISO 必须正确授权,因为 BIOS 会验证一些校验和。

[target.mipsel-sony-psx]
runner = "mednafen"

PCSX-Redux

PCSX-Redux 与以下 .cargo/config.toml 配置一起使用。请注意,-loadexe 必须是最后一个选项,因为 cargo psx run 在末尾传递可执行文件名。有关更多命令行选项,请参阅 此页面

[target.mipsel-sony-psx]
runner = ["pcsx-redux", "-stdout", "-run", "-loadexe"]

要从命令行运行 ISO,请使用 pcsx-redux -stdout -run -iso $ISO_FILENAME

DuckStation

DuckStation 用于调试非常有效,但它不与 cargo psx run 一起使用。问题在于命令将相对路径传递给运行器,但 DuckStation 仅接受命令行上的绝对路径。要使用 DuckStation,请使用 cargo psx build 构建项目,然后手动打开可执行文件。要运行 ISO,请使用 duckstation-qt -fastboot /full/path/to/$ISO_FILENAME

程序模板

要创建一个新的程序,只需使用 cargo init 并将 psx = "*"psx = { path = "/path/to/psx/crate" } 添加到 Cargo.toml 中的 [dependencies] 部分。然后替换 src/main.rs 中的以下模板

#![no_std]
#![no_main]

// This can be any import from the `psx` crate
// but there must be at least one.
use psx;

#[no_mangle]
fn main() {
}

no_std 是必需的,用于链接 core 包而不是 std 包。 no_main 通知 rustc 不要假设 程序的入口点。由于在 psx 包中定义的入口点期望调用一个 unmangled function,因此需要在 main 上设置属性。 main 函数不应返回,但返回类型可以是省略的(即 ())或 !

文档

请参阅 docs.rs 以获取文档。要为 psx 的最新版本重新生成文档

cd psx
cargo doc --target mipsel-unknown-linux-gnu

然后在浏览器中打开 target/mipsel-unknown-linux-gnu/doc/psx/index.html

有关 PlayStation 内部结构的文档,请参阅 nocash 规范

测试

使用以下命令运行 psx 包中的测试。

cd psx/
cargo psx test

依赖项