0327-Chip8-随机数生成
环境
- Time 2023-07-27
- Zig 0.11.0-dev.4191+1bf16b172
- SLD2 2.28.1
前言
说明
参考资料:
- https://en.wikipedia.org/wiki/CHIP-8
- https://austinmorlan.com/posts/chip8_emulator/
- https://rsj217.github.io/chip8-py/
- https://github.com/Timendus/chip8-test-suite
其中最后一个提供了测试的套件,实现的过程中,可以检测哪些指令有问题,帮助很大。
目标
实现随机数生成,其中 CXNN 指令使用到了随机数。
prng
其它无关代码已省略,新增随机数生成。
pub const CPU = struct {
instruct: Instruct = undefined,
register: [16]u8 = std.mem.zeroes([16]u8),
index: u16 = 0,
pc: u16,
prng: std.rand.DefaultPrng,
pub fn new(entry: u16) CPU {
const seed = @as(u64, @intCast(std.time.timestamp()));
var prng = std.rand.DefaultPrng.init(seed);
return CPU{
.pc = entry,
.prng = prng,
};
}
}
CXNN
0xC => reg[ins.x] = self.prng.random().int(u8) & ins.nn,
chip8.zig
修改了 CPU 的初始化方式。
const cpu = @import("cpu.zig");
const memory = @import("memory.zig");
const screen = @import("screen.zig");
const keypad = @import("keypad.zig");
const ENTRY = 0x200;
const HZ = 500;
const FPS = 60;
pub const Emulator = struct {
cpu: cpu.CPU,
memory: memory.Memory,
screen: screen.Screen,
keypad: keypad.Keypad,
pub fn new(rom: []const u8) Emulator {
return Emulator{
.cpu = cpu.CPU.new(ENTRY),
.memory = memory.Memory.new(rom, ENTRY),
.screen = screen.Screen{},
.keypad = keypad.Keypad{},
};
}
pub fn run(self: *Emulator) void {
self.screen.init();
defer self.screen.deinit();
self.memory.screen = &self.screen;
self.memory.keypad = &self.keypad;
var index: usize = 0;
while (self.keypad.poll()) : (index += 1) {
for (0..(HZ / FPS)) |_|
self.cpu.cycle(&self.memory);
self.screen.update(FPS);
}
}
};
启动
zig build run
效果

总结
实现了 CXNN 指令,包含其中的随机数生成。

浙公网安备 33010602011771号