这里写自定义目录标题

  • 键盘
  • 键盘的实现
    • 按键动作

通过在前五个部分开发的工作仿真器和界面,仿真系统能够运行基本的测试 ROM,并生成图形输出。模拟器目前无法做的是将按键作为键盘输入,并将它们馈送到被测 ROM;为此,必须模拟键盘对 I/O 寄存器的影响。

键盘

GameBoy 有一个单一的输入方法,一个八键小键盘,可以按下任意数量的键。对于大多数键盘,按键排列在列和行的网格中:这些可以被视为导线,键之间可以形成连接。当其中一列被激活时,连接到该列的任何行也将被激活,并且硬件能够检测活动行以确定当前按下的键。

在 GameBoy 中,键盘网格有两列四行,其优点是所有需要的连接都可以在一个 8 位 I/O 寄存器内完成。

键盘接线

由于所有六条线都与同一个寄存器相关联,因此 GameBoy 读取键盘的过程有点复杂:

  • 将 0x10 或 0x20 写入 JOYP:这将激活列线之一的位 4 或 5;
  • 等待几个周期让行连接传播到 JOYP;
  • 检查 JOYP 的低四位,找出该列的活动行。

键盘的实现

编写代码来模拟键盘按压相对简单,但有两个因素使问题复杂化:允许在读取行之前在网格中设置一列,以及 JavaScript 使用的按键代码。为了容纳两列,仿真必须使用两个值,每个值都包含该列和行之间的交集。另一个需要考虑的因素是键盘的值是相反的:默认情况下,一行处于高电压状态,当它与一列相交时电压降至零。这被 I/O 寄存器解释为行位为 1 表示没有按键按下,0 表示按键按下。

JavaScript 的 keydown和keyup事件可用于确定按键何时被按下或释放;可以通过以下方式将这些绑定到键盘处理程序中。

key.js 源代码

KEY = {_keys: [0x0F,0x0F],_colidx: 0,reset: function() {KEY._keys = [0x0F,0x0F];KEY._colidx = 0;LOG.out('KEY', 'Reset.');},rb: function() {switch(KEY._colidx){case 0x00: return 0x00; break;case 0x10: return KEY._keys[0]; break;case 0x20: return KEY._keys[1]; break;default: return 0x00; break;}},wb: function(v) {KEY._colidx = v&0x30;},keydown: function(e) {switch(e.keyCode){case 39: KEY._keys[1] &= 0xE; break;case 37: KEY._keys[1] &= 0xD; break;case 38: KEY._keys[1] &= 0xB; break;case 40: KEY._keys[1] &= 0x7; break;case 90: KEY._keys[0] &= 0xE; break;case 88: KEY._keys[0] &= 0xD; break;case 32: KEY._keys[0] &= 0xB; break;case 13: KEY._keys[0] &= 0x7; break;}},keyup: function(e) {switch(e.keyCode){case 39: KEY._keys[1] |= 0x1; break;case 37: KEY._keys[1] |= 0x2; break;case 38: KEY._keys[1] |= 0x4; break;case 40: KEY._keys[1] |= 0x8; break;case 90: KEY._keys[0] |= 0x1; break;case 88: KEY._keys[0] |= 0x2; break;case 32: KEY._keys[0] |= 0x5; break;case 13: KEY._keys[0] |= 0x8; break;}}
};

key的功能的接入:

window.onkeydown = KEY.kdown;
window.onkeyup = KEY.kup;

除此之外,必须扩展 MMU 以处理键盘 I/O 寄存器,以及零页处理例程;下面给出了一个例子。

MMU.js:键盘输入/输出接口

    rb: function(addr){switch(addr & 0xF000){...case 0xF000:switch(addr & 0x0F00){...// Zero-pagecase 0xF00:if(addr >= 0xFF80){return MMU._zram[addr & 0x7F];}else if(addr >= 0xFF40){// GPU (64 registers)return GPU.rb(addr);}else switch(addr & 0x3F){case 0x00: return KEY.rb();default: return 0;}}}}

使用键盘处理程序后,剩下的问题是按键的处理,以及键盘代码区分被按下的不同键的能力。这可以通过 JavaScript 的event对象来完成;任何通过浏览器运行的事件,例如鼠标单击或按键,都将在被请求时传递给代码,以及描述刚刚发生的事件的对象。在按键的情况下,event对象包含一个字符代码和一个“键扫描”代码,它们都描述了相关的键。

通过Peter-Paul Koch 的测试,已经确定浏览器传递给 JavaScript 代码的字符代码是不可靠的,并且会根据使用的浏览器而变化。所有浏览器都同意的唯一情况是为keyup和keydown事件生成的键扫描代码;在任何浏览器中,按下一个给定的键将产生一个特定的值。

出于此仿真器的目的,键盘代码需要处理八个键:

扫描码 键盘 映射
13 Enter Start
32 Space Select
37 Left arrow Left
38 Up arrow Up
39 Right arrow Right
40 Down arrow Down
88 X B
90 Z A

如上所述,当按键被按下时,相应的位必须被复位,当按键被释放时必须被置位。这可以如下实现。

按键动作

    kdown: function(e){switch(e.keyCode){case 39: KEY._keys[1] &= 0xE; break;case 37: KEY._keys[1] &= 0xD; break;case 38: KEY._keys[1] &= 0xB; break;case 40: KEY._keys[1] &= 0x7; break;case 90: KEY._keys[0] &= 0xE; break;case 88: KEY._keys[0] &= 0xD; break;case 32: KEY._keys[0] &= 0xB; break;case 13: KEY._keys[0] &= 0x7; break;}},kup: function(e){switch(e.keyCode){case 39: KEY._keys[1] |= 0x1; break;case 37: KEY._keys[1] |= 0x2; break;case 38: KEY._keys[1] |= 0x4; break;case 40: KEY._keys[1] |= 0x8; break;case 90: KEY._keys[0] |= 0x1; break;case 88: KEY._keys[0] |= 0x2; break;case 32: KEY._keys[0] |= 0x4; break;case 13: KEY._keys[0] |= 0x8; break;}}

Game boy模拟器(6):输入相关推荐

  1. 【安卓】解决安卓模拟器无法输入中文

    解决:如何在安卓模拟器中输入中文(切换为简体中文后,还无法输入中文,且显示等待下载语言数据包) 目录 1.给安卓模拟器联网 2.在安卓模拟器中设置语言为中文 1.给安卓模拟器联网 参考这个链接,给安卓 ...

  2. iOS模拟器不能输入中文解决

    好多同学的模拟器怎么设置都不能用键盘打出中文,很是忧伤,其实疗伤很简单, 1. Command+K, 在软键盘上通过地球仪选择中文输入法(在应用里让输入框成为第一响应者,也就是引入输入模式),再Com ...

  3. android模拟器如何输入中文,不能输入中文

    更改模拟器语言为中文.模拟器默认是英文的,我们需要设置成中文,这样看着才方便.我们可以通过Android的语言设置达到这个目的.在模拟器的菜单中找到Setting,然后向下滚动找到Language&a ...

  4. Android Studio中模拟器如何输入中文、将模拟器语言设置为中文

    (都是在模拟器的设置中操作) 如果你的模拟器语言是英文的话, 那么我们首先找到Settings 找到System 选择Languages & input 点击Languages 点击Add a ...

  5. 有关Android studio 模拟器中输入中文

    新手接触Android studio时候,碰到了模拟器它系统里不提供中文输入,于是我在自己的电脑里下载好中文输入法的apk,然后移动模拟器中即可下载好,接下来就是和正常手机一样设置输入法了. 效果图: ...

  6. 如何在android模拟器中输入中文

    使用Android模拟器进行应用程序编写联系中,需要输入中文,找了半天,还是没有找到中文输入法,但是Android是支持中文的,也应该有中文输入法.折腾了半天重要找到设置的办法.以下我是在sdk2.2 ...

  7. Android Studio 自带模拟器解决输入中文问题_安装x86的搜狗输入法的APK

    随着Android Studio版本的更新,自带的模拟器的速度已经非常快了.而且低配环境表现要更好.但是唯一诟病的是不能输入中文,在模拟器中自带的输入法中,是没有中文选项的.通常,安装软件,我们都选择 ...

  8. java模拟器键盘输入_Java模拟鼠标和键盘输入

    用途 在电脑(Windows/Mac)上模拟鼠标和键盘输入 Mac运行需要打开相关权限,详见文末说明. 效果图 代码 import java.awt.*; import java.awt.event. ...

  9. android studio怎么输入中文,Android studio 模拟器中输入中文

    [C#] 多线程总结(结合进度条) 线程生命周期(来源 w3cschool) 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况. 就绪状态:当线程准备好运行并等待 CPU 周期时的状况 ...

  10. Android studio 模拟器中只能输入英文 如何输入中文

    由于项目的需要,我需要在Android studio 的模拟器中输入中文,然而让我蛋疼的是模拟器自带的输入只有英文,我在网上寻找解决方法,发现网上说的方法根本不行,可能是网上的方法都是针对早期版本的模 ...

最新文章

  1. 从数仓到数据中台,谈技术选型最优解
  2. 某系统响应时间慢TPS低性能瓶颈调优过程
  3. 在 tensorflow 和numpy 中矩阵的加法
  4. 7月24日 学习笔记
  5. Python 装饰器原理和基本实现
  6. SwiftUI之深入解析如何创建列表展示视图和列表如何导航跳转新页面
  7. java将图片上传数据库_〔技巧实例〕轻松实现将上传图片到数据库
  8. Java的新项目学成在线笔记-day7(一)
  9. 计算机四级网络工程题库,2015计算机四级网络工程师模拟题库(三)附答案
  10. 【代码之路】我和代码的这两年,一路风雨,终见彩虹
  11. 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录V3.0【附下载地址】
  12. 从苏宁电器到卡巴斯基(第二部)第08篇:我在卡巴的日子 VIII
  13. 线性回归:异方差检测及其处理方法
  14. 华为云启动鲲鹏计划,了解更多鲲鹏知识上华为云学院
  15. 青铜器RDM与PTC Windchill协同构建货真价实的PLM解决方案
  16. [项目管理] 项目管理之配置管理
  17. 香港电动方程式大赛3月开跑 体验区可模拟中环驾车
  18. Css3实现背景毛玻璃效果
  19. android 仿美团购物车,Android 美团购物车效果
  20. ksy是谁_sky为什么叫人皇:sky是谁及资料

热门文章

  1. 【操作系统】Oranges学习笔记(五) 第六章 进程
  2. C# winform中对gridcontrol查询的一些操作
  3. vue使用echarts引入离线地图(geo.json)并切换省市(以四川为例)可下钻
  4. 基于Java毕业设计成绩分析系统源码+系统+mysql+lw文档+部署软件
  5. PDF转PPT怎么转?原来这个方法可以免费转
  6. 高效管理工作计划,飞项这款免费软件简单实用又强大
  7. 使用OpenSSH证书认证
  8. 小红书软件,自动文案神器,爆文效率UP
  9. flash与ram的经典理解
  10. 华为云CDN如何提高缓存命中率