CHIP-8 介绍及用Rust对CPU进行定义

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 的计数器。

模拟器由CpuDisplayKeypad 组成。

核心 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

[1] archive.org/stream/byte…

猜你喜欢

转载自juejin.im/post/7053445150399266852