装配8086中的键盘输入

时间:2013-02-12 09:44:17

标签: assembly input keyboard x86 x86-16

我正在尝试在程序集8086中创建动画,由键盘控制,使用ctrl并左右移动。

我试着看看如何在8086中从键盘接收输入,而不是如何发现按下的键是ctrl或shift(通常是按下了哪个键)。

非常感谢!

4 个答案:

答案 0 :(得分:1)

你确定你不想使用左右箭头键吗?控制和转移的问题是它们不会“返回”一个键,它们会修改另一个按下的键。这是在键盘中断处理程序(9,IIRC)中处理的,你可以“挂钩”它。我认为查看“Bios数据区”并观察中断处理程序跟踪控制状态和移位键的位置会更容易。在我看来,BDA在40h段。键盘状态标志位于...... 17h和18h?不要把我的话放在那些偏移上,查一查。拉尔夫布朗的中断名单。这一切都假设“8086”意味着,像......古物。 :)

答案 1 :(得分:1)

Bios将密钥存储在16个字母的缓冲区中。这意味着如果操作系统太慢,每当它读取它从缓冲区读取的下一个击键时。

你可以使用int 16h和ah设置为02h来设置al作为缓冲区中的下一个char。但是,如果你正在检查缓冲区的状态(是否有一个键),请看this.它基本上会更深入啊02h

由于您询问箭头键,以下是它们的十六进制代码:

  1. U 0x18
  2. D 0x19
  3. L 0x1B
  4. R 0x1A

答案 2 :(得分:0)

假设您只在BIOS下运行,您可能会发现使用更高级别的BIOS键盘中断更容易 - int 0x16 AH=0x01用于一般击键,而int 0x16 AH=0x02用于ctrl / shift等可能的可能性,虽然有许多其他可能性(包括其他int 0x16命令和-as之前已经建议 - 低级键盘int 0x09和BIOS数据区..我强烈推荐Ralf Brown's Interrupt List - 一个很好的资源!

答案 3 :(得分:-1)

PROC MY_ISR               
 ; MY ISR FOR KEYBOARD   
    PUSH    AX
    PUSH    BX
    PUSH    CX
    PUSH    DX
    PUSH    DI
    PUSH    SI


                        ; READ KEYBOARD SCAN CODE
    IN      AL, 60H

                        ; UPDATE KEYBOARD STATE
    XOR     BH, BH
    MOV     BL, AL
    AND     BL, 7FH     ; BX = SCAN CODE


    CMP BL, ;(insert the scancode of the key)           ; IF CLICK ON S (INDEX 1 IN ARRAY MINI_BUFF)
    JNE CHECK1
    MOV BL,0
    JMP END_CHECK

CHECK1:
    CMP BL, ;(insert the scancode of the key)       ; IF CLICK ON (enter a  (INDEX 0 IN ARRAY MINI_BUFF)
    JNE CHECK2
    MOV BL,1
    JMP END_CHECK



END_CHECK:
    PUSH CX
    MOV CX, 7
    SHR AL, CL              ; AL = 0 IF PRESSED, 1 IF RELEASED
    POP CX
    XOR AL, 1               ; AL = 1 IF PRESSED, 0 IF RELEASED
    MOV     [CS:MINI_BUFF+BX], AL  ; SAVE PRESSED BUTTONS IN ARRAY MINI_BUFF


                                ; SEND EOI TO XT KEYBOARD
    IN      AL, 61H
    MOV     AH, AL
    OR      AL, 80H
    OUT     61H, AL
    MOV     AL, AH
    OUT     61H, AL

                                ; SEND EOI TO MASTER PIC
    MOV     AL, 20H
    OUT     20H, AL

    POP     SI
    POP     DI                       ;
    POP     DX
    POP     CX
    POP     BX
    POP     AX

    IRET
ENDP MY_ISR

这是一个检查键盘输入的中断 http://www.philipstorr.id.au/pcbook/book3/scancode.htm <-链接到扫描码表