0326-Chip8-实现键盘按键

news/2025/12/4 10:08:58/文章来源:https://www.cnblogs.com/jiangbo4444/p/19305404

环境

  • 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

效果

窗口

总结

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

附录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/986475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day08 动态链接库

1. extern "C"指定使用C语言的命名修饰约定防止C++编译器进行名称重整(name mangling)使得导出的函数名在DLL中保持原样便于其他语言(C、C#、VB、Python等)调用对比示例:// C++风格(有名称重整)int _…

0322-Chip8-通过第二个测试

环境Time 2023-07-26 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/ h…

博文推荐——非著名程序员

博文推荐——非著名程序员心烦意乱,可能最近我有点懒 https://mp.weixin.qq.com/s?__biz=MjM5NDkxMTgyNw==&mid=2653058407&idx=1&sn=d217fbb78118f5875661cede720e10fb&chksm=bd56565b8a21df4d2edc…

AI模型评估产品评论中建议的有效性

本文介绍了一种新颖的AI方法,用于自动评估从产品评论中提取出的使用建议的有效性。该方法通过分析其他评论句子对给定建议的支持、反对或中立程度,帮助用户判断建议的可靠性。实验表明,该方法在识别支持与反对关系上…

2025年12月宝宝面霜品牌推荐排行榜单对比与选购指南

一、引言 随着婴幼儿护肤意识不断提升,宝宝面霜成为家长关注的重点消费品。本文面向婴幼儿家长及育儿群体,深入剖析其在选购过程中对产品安全性、保湿舒缓功效及性价比的核心需求。本次评估采用动态分析模型,结合成…

Rust 基础设施团队专访:CI/CD、供应链安全与增长的挑战

本文是对 Rust 项目基础设施团队工程师 Jan David Nose 的专访,深入探讨了 Rust 开发与部署背后的技术栈、CI/CD 管道的规模、应对软件供应链安全挑战的策略,以及项目成功增长带来的基础设施与维护难题。访谈记录 Xa…

2025年靠谱的引风式空冷器TOP品牌厂家排行榜

2025年靠谱的引风式空冷器TOP品牌厂家排行榜行业背景与市场趋势随着全球工业化的持续推进和环保要求的日益严格,空冷器作为高效节能的换热设备,在化工、电力、冶金等行业的应用越来越广泛。引风式空冷器凭借其结构紧…

2025年热门的弹簧机卷簧机/无凸轮弹簧机厂家最新权威推荐排行榜

2025年热门的弹簧机卷簧机/无凸轮弹簧机厂家权威推荐排行榜行业背景与市场趋势随着制造业的智能化转型加速推进,弹簧制造设备行业正迎来新一轮技术革新。2025年,无凸轮弹簧机因其编程灵活、调试便捷、生产效率高等优…

2025年中国金属探测仪生产厂排名:看看哪家实力强值得推荐

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为食品、纺织、化工等领域企业选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:南通市通州区探神金属探测仪器制造厂 推荐指数:★★★…

2025年比较好的线材成型机弹簧机/线材成型机弯线机厂家最新实力排行

2025年比较好的线材成型机弹簧机/线材成型机弯线机厂家实力排行行业背景与市场趋势随着制造业的智能化转型加速推进,线材成型设备作为五金加工、汽车零部件、电子电器、医疗器械等行业的核心生产设备,正迎来新一轮技…

2025年靠谱的极薄缓冲骑马抽/侧帮缓冲骑马抽厂家推荐及选购指南

2025年靠谱的极薄缓冲骑马抽/侧帮缓冲骑马抽厂家推荐及选购指南行业背景与市场趋势随着现代家居设计对空间利用率和美观度的要求不断提高,极薄缓冲骑马抽和侧帮缓冲骑马抽作为高端橱柜五金配件,正逐渐成为市场主流。…

2026年河北石家庄新乐市农村自建房推荐榜,图南建房宝领衔 六家实力公司赋能乡村宜居生活

2026年河北石家庄新乐市农村自建房推荐榜,图南建房宝领衔 六家实力公司赋能乡村宜居生活 一、引言:建房是一辈子的事,选对伙伴比省钱更重要 “去哪找靠谱的农村自建房公司?”——这是新乐市长寿街道、化皮镇、承安…

2025年评价高的大理石抛丸机厂家选购指南与推荐

2025年评价高的大理石抛丸机厂家选购指南与推荐行业背景与市场趋势大理石抛丸机作为石材加工领域的关键设备,近年来随着建筑装饰行业对石材表面处理要求的不断提高而迎来快速发展。2024年全球大理石抛丸机市场规模已达…

【IEEE出版 | EI检索】第五届高性能计算、大数据与通信工程国际学术会议(ICHBC 2025)

第五届高性能计算、大数据与通信工程国际学术会议(ICHBC 2025)将于2025年12月19-21日在广州召开。【西安电子科技大学广州研究院主办,学术氛围浓厚!收录率高!】 第五届高性能计算、大数据与通信工程国际学术会议(IC…

day07 List组件

#include <Windows.h> #include <CommCtrl.h> #include <windowsx.h> #include "resource.h" /** 通用控件 需要捕获notify消息 WM_NOTIFY 消息 当事件发生或控件需要一些信息时,由公共控…

pbootcms如何调用栏目大图(PbootCMS栏目大图调用指南)

PbootCMS提供了内置标签 [sort:pic] 用于获取栏目的大图路径。以下是关键标签的说明:标签名称 功能描述{pboot:sort} 用于指定某个栏目,结合 scode 参数使用[sort:pic] 获取当前栏目的大图路径{sort:tcode} 当前栏目…

2025年浙江十大高考复读学校排名:杨府山高复教师专业水平高

本榜单依托浙江教育主管部门评估数据、真实学子口碑与提分成果,深度筛选十家标杆高复机构,为高复学子及家长提供客观选型依据,助力精准匹配适配的复读伙伴。 TOP1 推荐:温州市瓯海区杨府山文化补习学校 推荐指数…

2025年12月台球加盟品牌排行榜对比:五个品牌深度评测与推荐指南

一、引言 台球运动作为一项兼具休闲娱乐与体育竞技属性的活动,近年来在中国消费市场持续升温。随着无人值守模式和智能科技的应用,台球加盟领域吸引了越来越多创业者及投资者的目光。目标用户主要包括有意进入文体娱…

2025年知名的亮化照明工程/城市夜景照明工程行业精选榜

2025年知名的亮化照明工程/城市夜景照明工程行业精选榜开篇:行业背景与市场趋势随着城市化进程的加速和夜间经济的蓬勃发展,亮化照明工程行业迎来了前所未有的发展机遇。2023-2025年,全球城市夜景照明市场规模预计将…

辛集市农村自建房找谁好?河北石家庄辛集市自建房公司/机构深度评测口碑推荐榜

辛集市农村自建房找谁好?河北石家庄辛集市自建房公司/机构深度评测口碑推荐榜 一、引言:辛集农村自建房的“专业化转型” 在辛集市这片横跨太行山麓平原与低洼平原的冲积土地上,农村自建房的传统印记早已深入人心。…