尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

0326-Chip8-实现键盘按键

0326-Chip8-实现键盘按键
📅 发布时间:2026/6/18 15:33:18

环境

  • Time 2023-07-27
  • Zig 0.11.0-dev.4191+1bf16b172
  • SLD2 2.28.1

前言

说明

参考资料:

  1. https://en.wikipedia.org/wiki/CHIP-8
  2. https://austinmorlan.com/posts/chip8_emulator/
  3. https://rsj217.github.io/chip8-py/
  4. https://github.com/Timendus/chip8-test-suite

其中最后一个提供了测试的套件,实现的过程中,可以检测哪些指令有问题,帮助很大。

目标

实现按键功能,其中涉及到指令 EX9E、EXA1、FX0A。

keypad.zig

Chip8 只支持 16 个按键,分别是 0x0 到 0xF,可以根据自己的喜好设置映射。

const c = @cImport(@cInclude("SDL.h"));
const std = @import("std");pub const Keypad = struct {buffer: [16]bool = std.mem.zeroes([16]bool),event: c.SDL_Event = undefined,pub fn poll(self: *Keypad) bool {while (c.SDL_PollEvent(&self.event) > 0) {if (self.event.type == c.SDL_QUIT) return false;const flag = if (self.event.type == c.SDL_KEYDOWN) true //else if (self.event.type == c.SDL_KEYUP) false //else continue;self.setBuffer(self.event.key.keysym.sym, flag);}return true;}fn setBuffer(self: *Keypad, code: i32, value: bool) void {switch (code) {c.SDLK_x => self.buffer[0] = value,c.SDLK_1 => self.buffer[1] = value,c.SDLK_2 => self.buffer[2] = value,c.SDLK_3 => self.buffer[3] = value,c.SDLK_q => self.buffer[4] = value,c.SDLK_w => self.buffer[5] = value,c.SDLK_e => self.buffer[6] = value,c.SDLK_a => self.buffer[7] = value,c.SDLK_s => self.buffer[8] = value,c.SDLK_d => self.buffer[9] = value,c.SDLK_z => self.buffer[10] = value,c.SDLK_c => self.buffer[11] = value,c.SDLK_4 => self.buffer[12] = value,c.SDLK_r => self.buffer[13] = value,c.SDLK_f => self.buffer[14] = value,c.SDLK_v => self.buffer[15] = value,else => return,}}
};

memory.zig

其它无关代码已省略,新增检查某个按键是否按下和哪个键被按下的方法。

pub fn isPress(self: *Memory, index: usize) bool {return self.keypad.buffer[index];
}pub fn getPress(self: *Memory) ?u8 {for (self.keypad.buffer, 0..) |code, index| {if (code) return @truncate(index);}return null;
}

0xE

    0xE => {const isPress = memory.isPress(reg[ins.x]);if (ins.nn == 0x9E and isPress) self.next();if (ins.nn == 0xA1 and !isPress) self.next();},

0x0A

codef中的新增检查 0x0A的分支。

        0x0A => if (memory.getPress()) |index| {self.register[ins.x] = index;} else self.back(),fn back(self: *CPU) void {self.pc -= 2;}

main.zig

const std = @import("std");
const chip8 = @import("chip8.zig");pub fn main() !void {// const rom = @embedFile("roms/1-chip8-logo.ch8");// const rom = @embedFile("roms/2-ibm-logo.ch8");// const rom = @embedFile("roms/3-corax+.ch8");// const rom = @embedFile("roms/4-flags.ch8");// const rom = @embedFile("roms/5-quirks.ch8");const rom = @embedFile("roms/6-keypad.ch8");var emulator = chip8.Emulator.new(rom);emulator.run();
}

启动

zig build run

效果

窗口

总结

实现了键盘按键的功能,测试时,需要将输入法调整成英文,不然只有数字生效,字母不生效。

附录

相关新闻

  • 2025年知名的马路标线防锈漆厂家最新热销排行
  • 2025年12月婴儿抚触油品牌推荐排行榜单对比与评测
  • 0320-Chip8-实现基础指令

最新新闻

  • Claude Opus-4.7 实测:视觉语义理解与分步推理协作新范式
  • ATmega329系列MCU选型、硬件设计与中断编程实战指南
  • 2026华南GEO榜单TOP5横向对比 - 热点速览
  • 如何快速掌握Azure Data Studio:面向新手的跨平台数据库管理完整指南
  • 2026兰州物流仓库快速堆积门生产厂 - 精选优质企业推荐官
  • 2026安徽省淮北市中考500分左右怎么办?冲刺高中补充方案最新发布 - 小张zc

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号