当前位置: 首页 > news >正文

0326-Chip8-实现键盘按键

环境

  • 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.jsqmd.com/news/60377/

相关文章:

  • day08 动态链接库
  • 0322-Chip8-通过第二个测试
  • 2025年12月婴儿抚触油品牌推荐排行榜单对比与评测
  • 2025年知名的马路标线防锈漆厂家最新热销排行
  • 天津市蓟州区农村自建房找谁好?天津市蓟州区自建房公司/机构深度评测口碑推荐榜
  • 2025年外墙施工爬梯定做厂家权威推荐:碳钢爬梯/屋面检修钢爬梯/建筑爬梯源头厂家精选
  • pbootcms后台如何隐藏会员中心(PbootCMS 后台隐藏会员中心菜单的方法)
  • 0320-Chip8-实现基础指令
  • 在天津市蓟州区老家农村盖房子,靠谱的自建房公司口碑推荐。天津市蓟州区自建房公司/机构权威测评推荐排行榜
  • 上海地标广告位公司哪家专业?核心商圈资源解析
  • 【2025最新版】Wireshark下载安装教程全流程图解:从安装到抓包分析的完整指南
  • 微信公众号编辑器推荐:高效排版,打造吸睛文章
  • 熬夜党救星!2025年12月国货次抛精华推荐,抗老提亮去黄一步到位
  • 2025留学机构排名一览表
  • 2025国内口碑好的留学中介有哪些
  • Pbootcms一级栏目下的二级三级栏目高亮(PbootCMS 一级栏目下的二级、三级栏目高亮实现方法)
  • 2025年铝合金仿古瓦厂家权威推荐榜单:西安睿驰古建为何稳居榜首?
  • 高端定制木门品牌推荐 - 2025年木门十大品牌权威榜单
  • 2025年12月婴儿抚触油品牌推荐排行榜:五款产品全面对比与选购指南
  • 2025年知名的环保胶面墙布/水洗墙布高评价厂家推荐榜
  • 2025比较好的出国留学中介机构有哪些
  • 2025年12月儿童牙膏品牌推荐排行榜:五款产品综合对比与指南
  • VSCODE 插件 rust-analyzer 使用遇到的问题 快捷键查看定义 - 实践
  • 2025北京留学中介哪些机构好
  • 2025年鞋底注塑机直销厂家权威榜单:鞋底注塑圆盘机/鞋底注塑成型机/鞋底圆盘注塑机源头厂家精选
  • 2025年简易单通道智能水肥一体机供货厂家权威推荐榜单:水肥一体化‌/一体式水肥机‌/固液两用水肥机‌源头厂家精选
  • 信创背景下,国产 DevOps 平台如何实现研运数据与办公系统无缝联动
  • 2025年中国带消毒柜集成灶十大品牌综合实力榜
  • 2025年仿古铝瓦厂家综合实力榜单:西安睿驰以创新技术引领古建新风尚
  • 防水涂料公司推荐:2025口碑好的修补防水涂料销售厂家排行榜