【问题标题】:Is it possible to access the keyboard controller's internal make/break code buffer?是否可以访问键盘控制器的内部通断代码缓冲区?
【发布时间】:2018-06-08 08:37:53
【问题描述】:

根据此网页:http://stanislavs.org/helppc/8042.html 键盘控制器维护它自己的内部 16 字节通断代码缓冲区。

“键盘的内部控制器最多可缓冲 16 字节的通断代码信息。这在所有 PC 系统中都很常见,不应与 BIOS 维护的(32 字节)键盘缓冲区相混淆。”

在我的 8086 汇编语言程序(大概比 BIOS 维护的 32 字节缓冲区更新速度更快)中,能够访问此缓冲区对我非常有用。

除了轮询端口 60h 之外,有没有办法从内部缓冲区中提取这些通断代码?

【问题讨论】:

  • 嗯,最简单的方法就是正常读取扫描代码,您不必轮询,您可以使用中断处理程序将代码放入您自己的 RAM 缓冲区中,就像 BIOS 一样.有记录的控制器命令可让您读取 8042 的 RAM,在真正的 8042 上可能会在某处包含缓冲的扫描码,但我不认为究竟在哪里标准化。现代键盘控制器可能无法模拟这一点。
  • 但是把它放在内存的其他地方有什么用呢?您的意思是在不加载不同段的情况下访问扫描代码会更快吗?我同意这一点。我只希望最后一个中断/生成代码作为我程序的输入,这就是我使用端口 60h 的原因,但访问缓冲区会很有用,因为人为错误经常会导致我的程序出现问题。通常我会在放开前一个键之前瞬间敲击一个键,然后用我希望忽略的中断代码覆盖我的程序需要的生成代码。访问缓冲区将使我能够确定丢失的 make 代码。
  • 我已经忽略了与最后接受的 make 代码不对应的中断代码,但我仍然经常遇到与之前遇到的 make 代码对应的无序中断代码。例如,导致我的游戏中精灵的运动意外停止。我应该提到 BIOS 中的 32 字节缓冲区有时会错过瞬间生成代码。我想一个非常高频的中断可以解决这个问题,但我仍然不知道如何对这两个 PIC 进行编程。这几天我一直在利用空闲时间研究它。
  • 你有一个 XY 问题。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem 你真正的问题是游戏中的键盘输入不能正常工作。您提出的解决方案,读取 8042 的缓冲区或使用高频中断,并不是您真正问题的解决方案。当您意识到数百个 MS-DOS 游戏在不执行这些操作的情况下正确处理键盘输入没有问题时,这一点很明显。您的“人为错误”问题是由于您自己的代码中的设计错误,而 BIOS 不会错过瞬间制作代码,除非你让它这样做。
  • 我会问一个问题来解决我的具体问题的根源,但问题会归结为“我如何编写中断?”我不会问这样的问题。我的具体问题是在端口 60h 上出现了一个 make 代码,并且在我的输入检测代码再次执行之前被覆盖。明显的解决方案:快速、高频中断做输入检测。您可以在我自己对我之前的问题的解决方案中看到我输入过程的当前形式。 stackoverflow.com/questions/47786199/…

标签: assembly keyboard x86-16 pc


【解决方案1】:

没有任何记录的方式。我并不是要暗示有一种已知但未记录的方式来做到这一点。我只是不愿意说没有任何未记录的方法。

使用port 工具访问的设备通常维护自己的离散内存和逻辑,因此您不应期望在系统中的其他任何地方看到该内存空间暴露给您。这也有例外;内存区域的 DMA 传输,甚至内存映射到物理地址空间。但是对于键盘,不,你看不到那个记忆。

【讨论】:

  • 是的,我知道它不会映射到系统内存或类似的东西,但我希望有一种方法可以通过与控制器通信从缓冲区请求字节。
  • @Mylifeisabug.: 是的,问一下也无妨,有可能存在某种远程调试接口,但在这种情况下,答案似乎是否定的。跨度>
  • 如果您能找到一些实际控制器的低级文档,值得一看,但请注意,在该级别上适用于另一个的可能不适用于另一个。
  • @MargaretBloom 他试图在没有波兰端口 60 的情况下这样做。0xac 将转储这些字节,但您必须将它们从端口 60 中取出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
相关资源
最近更新 更多