1 个不稳定版本
使用旧的 Rust 2015
0.0.3 | 2016年11月8日 |
---|
#159 在 仿真器
552 星 & 24 关注者
570KB
13K SLoC
此项目不再开发。
我决定从头开始,修复 Rustation 中的某些架构缺陷。一些代码已从该项目导入,其他部分已彻底重写。新的存储库是 rustation-ng。它现在比这个项目更先进,具有正确的声音支持和更准确的仿真。
两个项目之间一个显著的不同之处在于,rustation-ng 放弃了 GL 渲染器,转而使用线程化的软件渲染器。Rustation 的 GL 渲染器已移植到 C++ 并集成到 Beetle PSX 仿真器中,因此它并未完全消失。
Rustation PlayStation 仿真器
Rust 程序设计语言编写的 PlayStation 仿真器。
此存储库仅包含仿真器核心的源代码。OpenGL 渲染器和 libretro 接口位于 rustation-libretro 存储库中。
此仿真器的重点是编写干净、准确且希望易于理解的代码。没有插件基础设施,仿真器是单块的。
目前性能相当差,但应该足以在现代 CPU 上接近实时运行。
目前只能启动一些游戏。Crash Bandicoot(日版)大部分可玩,尽管我遇到了随机崩溃。一些其他游戏(如 Spyro)在开场或开场之后冻结。
如果您有任何问题,特别是如果代码中的某些内容不清楚或没有适当注释,请毫不犹豫地填写问题。
我还创建了一个 /psx/ 论坛在 8chan,如果您更喜欢非正式地讨论此仿真器和所有与 PlayStation 相关的事情。我们将看看这会变成一个好主意...
当前实现(部分实现)
- CPU
- 基本 GTE 支持(从 mednafen PSX 移植过来)
- 指令缓存
- 中断
- 基本 GPU(没有半透明或掩码位仿真)
- 定时器(不完整)
- DMA
- 调试器
- CDROM 控制器(缺少许多命令)
- 游戏手柄控制器(目前只有数字垫)
待办事项列表
- GPU 中许多内容
- MDEC
- SPU
- 内存卡
- CPU流水线仿真
- 更精确的时间控制
- 许多、许多其他事项...
构建
您需要Rust及其包管理器Cargo,SDL2和PlayStation BIOS。该仿真器主要使用BIOS版本SCPH1001
进行测试,其SHA-1值为10155d8d6e6e832d6ea66db9bc098321fb5e8ebf
。
然后您应该可以使用以下命令构建仿真器:
cargo build --release
别忘了使用--release
标志来开启优化。没有这些优化,生成的二进制文件将会非常慢。
如果构建成功,您可以使用以下命令运行仿真器:
cargo run --release /path/to/SCPH1001.BIN
对于Windows,请查看问题#12。
使用Escape
键退出仿真器,使用Pause/Break
键“中断”到调试器,仿真器将在TCP端口9001
上监听GDB连接。
调试器
为了调试,您需要一个针对mipsel-unknown-elf
的GDB。一旦仿真器运行,按下Pause/Break
键来触发调试器,然后使用以下命令通过GDB连接到它(在gdb命令提示符下):
target remote localhost:9001
GDB可能会抱怨找不到符号或当前函数的边界,但您可以忽略这些。从那时起,您应该可以使用熟悉的GDB命令来调试正在运行的仿真器。
一些示例
# Dump the CPU registers
info registers
# Disassemble 20 instructions around PC
disassemble $pc-40,+80
# Display word at address 0x1f801814 (GPU status)
x/x 0x1f801814
# Add code breakpoint at address 0x00004588
break *0x00004588
# Add write watchpoint at address 0x1f801070 (IRQ ack)
watch *0x1f801070
# Step over a single instruction
stepi
# Continue until a break/watchpoint is reached (or Pause/Break is pressed)
continue
调试支持相当实验性和不稳定,但对于基本的调试需求来说它是可行的。
指南
我还在尝试用LaTeX文档记录仿真器的编写过程,该文档可在psx-guide存储库中找到。它通常落后于实际代码,但我将尽量经常更新它。
资源
我在上面的指南中尽量引用了所有来源,但我主要使用无价的No$ PSX规范以及当我觉得需要作弊时,使用mednafen的源代码。
我还对真实硬件进行了测试,并将它们存储在psx-hardware-tests存储库中。
依赖关系
~1MB
~16K SLoC