CHIP-8[0] 是 Joseph Weisbecker[1] 在 1970 年代中期开发的一种解释性编程语言,目标是让视频游戏能够在具有 CHIP-8 实现的计算机上轻松编程和移植。CHIP-8 虚拟机具有可寻址内存、指令集以及基本输入和输出。
CHIP-8 有 4k 的 RAM,尽管前 512 字节由机器特定的解释器使用。 它有 16 个 8 位寄存器和 1 个 16 位程序寄存器。 它有一个可以存储多达 16 个地址的堆栈,允许支持“调用”操作以及“跳转”。 CPU 支持 35 种不同的操作码(即指令),它们都是 2 字节宽。 对于外围设备,它具有简单的 64 x 32 像素显示屏、基本声音支持和 16 键键盘。
5 个用于非常特定目的的重要寄存器:
登记 | 目的 |
---|---|
程序计数器 (pc) | 正在执行代码的内存中的当前位置。 |
堆栈指针 (sp) | 指向调用当前子例程的地址的指针。 |
索引寄存器 (i) | 通常用于涉及内存的操作的 16 位地址。 |
延迟定时器 (dt) | 一个以 60Hz 的频率倒计时并停止执行直到达到 0 的计数器。 |
声音计时器(st) | 以 60Hz 的频率倒计时并发出哔哔声直到达到 0 的计数器。 |
模拟器由Cpu
,Display
和 Keypad
组成。
核心 CPU
,它被实现为一个结构 struct
。该结构的字段映射到 CHIP-8 架构,包括内存、寄存器、程序计数器等。
pub struct Cpu {
// index register
pub i: u16,
// program counter
pub pc: u16,
// memory
pub memory: [u8; 4096],
// registers
pub v: [u8; 16],
// peripherals
pub keypad: Keypad,
pub display: Display,
// stack
pub stack: [u16; 16],
// stack pointer
pub sp: u8,
// delay timer
pub dt: u8
}
复制代码
CHIP-8 处理器的执行周期非常简单。Cpu
暴露一个公共方法 execute_cycle
从当前内存位置读取一个操作码并对其进行处理。
fn read_word(memory: [u8; 4096], index: u16) -> u16 {
(memory[index as usize] as u16) << 8
| (memory[(index + 1) as usize] as u16)
}
impl Cpu {
pub fn execute_cycle(&mut self) {
let opcode: u16 = read_word(self.memory, self.pc);
self.process_opcode(opcode);
}
fn process_opcode(&mut self, opcode: u16) {
...
}
}
复制代码
参考: [0] en.wikipedia.org/wiki/CHIP-8