我正在尝试在程序集8086中创建动画,由键盘控制,使用ctrl并左右移动。
我试着看看如何在8086中从键盘接收输入,而不是如何发现按下的键是ctrl或shift(通常是按下了哪个键)。
非常感谢!
答案 0 :(得分:1)
你确定你不想使用左右箭头键吗?控制和转移的问题是它们不会“返回”一个键,它们会修改另一个按下的键。这是在键盘中断处理程序(9,IIRC)中处理的,你可以“挂钩”它。我认为查看“Bios数据区”并观察中断处理程序跟踪控制状态和移位键的位置会更容易。在我看来,BDA在40h段。键盘状态标志位于...... 17h和18h?不要把我的话放在那些偏移上,查一查。拉尔夫布朗的中断名单。这一切都假设“8086”意味着,像......古物。 :)
答案 1 :(得分:1)
Bios将密钥存储在16个字母的缓冲区中。这意味着如果操作系统太慢,每当它读取它从缓冲区读取的下一个击键时。
你可以使用int 16h和ah设置为02h来设置al作为缓冲区中的下一个char。但是,如果你正在检查缓冲区的状态(是否有一个键),请看this.它基本上会更深入啊02h
由于您询问箭头键,以下是它们的十六进制代码:
答案 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 <-链接到扫描码表