2 个版本
0.1.1 | 2023年5月5日 |
---|---|
0.1.0 | 2023年5月5日 |
#129 in 模拟器
73KB
2K SLoC
❇️ tinychip
CHIP-8 是一种解释型编程语言,由 Joseph Weisbecker 开发,在 1802 微处理器上实现。它在 20 世纪 70 年代中期首次用于 COSMAC VIP 和 Telmac 1800 8 位微计算机。 - 维基百科
它支持多种图形 API 和多种解释器实现。我们认为一条指令约等于 1 个周期,所以 500Hz 意味着它每秒执行 500 条指令。
📖 如何构建和运行?
- 安装依赖项
cargo
SDL2
(作为库)
- 编译并安装它
cargo安装 --路径 .
- 运行
tinychip --help
👍 测试过的程序
名称 | 状态 |
---|---|
IBM 标志 | ✅ |
Pong | ✅ |
太空侵略者 | ✅ |
俄罗斯方块 | ✅ |
🖼️ 屏幕截图
Breakout(320x160 - 500Hz)
太空侵略者(320x160 - 500Hz)
IBM 标志(640x320 - 500Hz)
⌨️ 对应的热键
1 | 2 | 3 | 4 |
A | Z | E | R |
Q | S | D | F |
W | X | C | V |
🔗 兼容性
由于机器的不同,一些 CHIP-8 指令的描述可能不同。例如,指令 8xy6
和 8xye
根据文档并不做相同的事情。
在文档中,一般有两种语义用于加载操作(fx55,
fx65
)和位移操作(8xy6,
8xye
)。
语义
要使用原始语义,请使用以下标志
- 加载:
--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