【问题标题】:How to detect arrow keys in 16-bit DOS code如何检测 16 位 DOS 代码中的箭头键
【发布时间】:2013-06-01 02:59:58
【问题描述】:

我想用方向键在汇编语言中指示一个形状,我的代码是这样的:

call getkey
cmp al, ...
je direct

我应该在之后输入什么来诊断用户按下哪个箭头键?

【问题讨论】:

  • 在什么 CPU 上?在什么操作系统下?在什么环境下?

标签: assembly dos x86-16 bios


【解决方案1】:

这在 DOS 中对我来说很好用(在 DOSBox 下测试):

[org 0x100]

repeat:
; Get keystroke
mov ah,0
int 0x16
; AH = BIOS scan code
cmp ah,0x48
je up
cmp ah,0x4B
je left
cmp ah,0x4D
je right
cmp ah,0x50
je down
cmp ah,1
jne repeat  ; loop until Esc is pressed

mov ah,0x4c
int 0x21

up:
mov dx,upstring
mov ah,9
int 0x21
jmp repeat

down:
mov dx,downstring
mov ah,9
int 0x21
jmp repeat

left:
mov dx,leftstring
mov ah,9
int 0x21
jmp repeat

right:
mov dx,rightstring
mov ah,9
int 0x21
jmp repeat

upstring db "Up pressed",13,10,'$'
downstring db "Down pressed",13,10,'$'
leftstring db "Left pressed",13,10,'$'
rightstring db "Right pressed",13,10,'$'

如果您不能/不想使用int 0x16(例如,因为您需要非阻塞读取),您可以尝试从端口 0x60 读取。

【讨论】:

    【解决方案2】:

    键盘缓冲区位于段 0,偏移量 1054(41E 十六进制)

    http://webcache.googleusercontent.com/search?hl=en-GB&q=cache:HTLtXndIlCQJ:http://support.microsoft.com/kb/60140%2Bdos+keyboard+buffer+location&gbv=2&ct=clnk

    向下箭头是 0150

    向上箭头是 0148

    左箭头是014B

    右箭头是014D

    【讨论】:

      【解决方案3】:

      考虑al包含键值,将键值与你想要的箭头的ascii值进行比较。 尝试遵循 ascii 值 37(左箭头) 38(向上箭头) 39(右箭头) 40(向下箭头)

      【讨论】:

      • 不幸的是,它不起作用,唯一起作用的数字是 0,问题是所有 4 个箭头键都与 0 一起使用,并且不清楚用户按下了哪个键!
      • DOS 以外的操作系统(这是我最后一次用箭头键做任何事情)可能会做不同的事情,但在那个平台上按下箭头键会导致键缓冲区中有两个字符。第一个是 0。第二个是你想要的。希望这会有所帮助。
      【解决方案4】:

      我记得在 DOS 中使用 16h(或 21h)中断第一次为您提供了 0,然后您必须再次读取密钥才能获得实际代码。功能键和“插入”或“主页”之类的东西也是如此。只有可以映射到 ASCII 的键才能在一次中断调用中直接进入。也许这也适用于这里。

      【讨论】:

        【解决方案5】:

        这取决于您在 getkey 函数中对密钥检测所做的工作。 大多数情况下,如果您进行直接硬件访问,则密钥会以扫描码的形式返回。你应该找scan codes table

        【讨论】:

        • 扫码不起作用,我想我应该使用ascii码但它也不起作用!!!
        猜你喜欢
        • 2012-12-09
        • 2011-05-30
        • 2018-03-27
        • 2015-07-14
        • 2014-09-03
        • 1970-01-01
        • 2016-11-11
        • 2013-02-04
        • 2012-10-21
        相关资源
        最近更新 更多