2 个版本

0.1.1 2023年5月5日
0.1.0 2023年5月5日

#129 in 模拟器

MIT 许可证

73KB
2K SLoC

❇️ tinychip

CHIP-8 是一种解释型编程语言,由 Joseph Weisbecker 开发,在 1802 微处理器上实现。它在 20 世纪 70 年代中期首次用于 COSMAC VIP 和 Telmac 1800 8 位微计算机。 - 维基百科

它支持多种图形 API 和多种解释器实现。我们认为一条指令约等于 1 个周期,所以 500Hz 意味着它每秒执行 500 条指令。

📖 如何构建和运行?

  1. 安装依赖项
    • cargo
    • SDL2(作为库)
  2. 编译并安装它
    • cargo安装 --路径 .
  3. 运行 tinychip --help

👍 测试过的程序

名称 状态
IBM 标志
Pong
太空侵略者
俄罗斯方块

🖼️ 屏幕截图

Breakout(320x160 - 500Hz)

breakout

太空侵略者(320x160 - 500Hz)

space_invaders

IBM 标志(640x320 - 500Hz)

ibm_logo

⌨️ 对应的热键

1 2 3 4
A Z E R
Q S D F
W X C V

🔗 兼容性

由于机器的不同,一些 CHIP-8 指令的描述可能不同。例如,指令 8xy68xye 根据文档并不做相同的事情。

在文档中,一般有两种语义用于加载操作(fx55fx65)和位移操作(8xy68xye)。

语义

要使用原始语义,请使用以下标志

  • 加载:--original-load=true
  • 位移:--original-shift=true
操作码 默认 原始
8xy6 Vx = Vx >> 1, Vf = carry Vx = Vy >> 1, Vf = carry
8xye Vx = Vx << 1, Vf = carry Vx = Vy << 1, Vf = carry
fx55 I = I + x + 1
fx65 I = I + x + 1

游戏

一些我们知道最佳兼容性设置的游戏的描述,GitHub issue

ℹ️ CLI 帮助

USAGE:
    tinychip [OPTIONS] <rom>

FLAGS:
        --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --api <api>                          Graphical API, value(s): sfml, sdl
        --cycles <cycles>                    Cycle(s) per second (Hz)
    -h, --height <height>                    Window height
        --interpreter <interpreter>          Interpreter, value(s): original
        --original-load <original-load>      use the original semantic for fx55, fx65
        --original-shift <original-shift>    use the original semantic for 8xy6, 8xye
    -w, --width <width>                      Window width

ARGS:
    <rom>    Input file

🐋 Docker 演练场

🔨 构建

docker build -t tinychip .

🎉 运行示例

在下面的示例中,我们有

  • X11 作为图形服务器
  • PulseAudio 作为声音服务器
docker run -it \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /dev/dri:/dev/dri \
    -v /dev/snd:/dev/snd \
    -v $PWD/roms:/roms \
    -v /run/user/$(id -u)/pulse/native:/run/user/$(id -u)/pulse/native \
    -e PULSE_SERVER=unix:/run/user/$(id -u)/pulse/native \
    -u $(id -u):$(id -u) \
    tinychip /roms/brick.ch8

✅ 待办事项

名称 状态
500Hz 时钟
基本指令
处理每个命令行参数 ¹
调试功能 ² ⚠️
创建字体
添加蜂鸣声
60Hz 延迟和声音计时器

¹ 命令行参数

  • 时钟(可选)
  • 窗口大小(可选)
  • 图形API(可选)
  • 解释器(可选)
  • 特性(移位和加载)

² 功能

  • 暂停游戏
  • 显示解释器值,如寄存器、程序计数器、按键等
  • 在存储的有限数量的仿真状态之间切换

ℹ️ 文档

运行 cargo doc --open 在浏览器中阅读文档。

依赖项

~19MB
~398K SLoC