我刚刚完成了我的 16 位操作系统的编写,但我使用 int 0x16 来判断用户按下了哪个键。现在我想编写自己的键盘驱动程序,并且不想使用任何中断。 (这样我就可以进入长模式)。我意识到有两个扫描码,AT 和 XT。
如何确定计算机在 NASM x86 程序集中使用哪种键盘?
当操作系统启动时,我应该要求用户按下一个键并确定使用端口 0x60 中的扫描码吗?
例如:一个键 - 0x1c(make) 代表 AT 和 0x1e(make) 代表 XT
但是linux不会那样做......
我使用以下代码并发现虚拟框使用 XT 键盘....
[组织 0x2e00]
移动 bx, 0x1000
mov ds, bx ;程序被操作系统加载在0x12e00或1000:2e00
xor ax, ax ;将 AX 设置为零
mov bl, 0x0e ;设置文字颜色
loop: ;主循环
in al, 0x60 ;读取所有端口并显示
mov cx, ax
call hex_print ;以十六进制打印端口内容
在 al, 0x61
mov cx, ax
调用 hex_print
在 al, 0x62
mov cx, ax
调用 hex_print
在 al, 0x63
mov cx, ax
调用 hex_print
在 al, 0x64
调用 hex_print
call com_cls ;打印内容后清屏
jmp loop ;跳转到循环
;打印十六进制值;;;;;;;;;;;;;;;;;
十六进制打印:
推斧
推cx
移动啊,0x0e
移动, ' '
整数 0x10
移动,'0'
整数 0x10
移动 al, 'x'
整数 0x10
hex_print_start:
移动, ch
还有 0xf0
调用 hex_map
整数 0x10
shl cx, 0x04
移动, ch
还有 0xf0
调用 hex_map
整数 0x10
shl cx, 0x04
移动, ch
还有 0xf0
调用 hex_map
整数 0x10
shl cx, 0x04
移动, ch
还有 0xf0
调用 hex_map
整数 0x10
hex_print_end:
流行音乐
流行斧
回复
十六进制 map :
cmp al, 0x00
jne zero_end
移动,'0'
回复
零结束:
cmp al, 0x10
jne one_end
移动 al, '1'
回复
一端:
cmp al, 0x20
jne two_end
移动 al, '2'
回复
二结束:
cmp al, 0x30
jne 三端
移动 al, '3'
回复
三结束:
cmp al, 0x40
jnefour_end
移动 '4'
回复
四_结束:
cmp al, 0x50
jne五结束
移动 '5'
回复
五_结束:
cmp al, 0x60
jne Six_end
mov al, '6'
回复
六尾:
cmp al, 0x70
jne Seven_end
mov al, '7'
回复
七结束:
cmp al, 0x80
jne八结束
移动 '8'
回复
八结束:
cmp al, 0x90
jne Nine_end
移动 '9'
回复
九尾:
cmp al, 0xa0
jne a_end
移动, 'A'
回复
a_end:
cmp al, 0xb0
jne b_end
移动 'B'
回复
弯曲:
cmp al, 0xc0
jne c_end
移动,'C'
回复
c_end:
cmp al, 0xd0
jne d_end
移动 'D'
回复
d_end:
cmp al, 0xe0
jne e_end
移动 'E'
回复
e_end:
cmp al, 0xf0
jne f_end
移动, 'F'
回复
f_结束:
回复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;“cls”命令;;;;;;;;;;;;;;;;;;;;;;;;;;
com_cls:
推斧
推bx
推cx
推dx
移动斧头,0x0700; function 07, AL=0 表示滚动整个窗口
移动 bh, 0x00 ;字符属性=黑色
mov cx, 0x0000 ;行 = 0,列 = 0
移动 dx, 0x1e54 ;行 = 30 (0x1e), col = 79 (0x4f)
整数 0x10 ;调用 BIOS 视频中断
mov ah, 0x02 ;function 02, 设置光标位置
移动 dx, 0x00
整数 0x10
流行音乐
流行音乐
流行音乐
流行斧
回复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
回复
扫码 0x9E:XT 键盘中的“A”键中断!
在此先感谢您的帮助。
最佳答案
每当您需要一些关于操作系统编程的建议时,请查看 OSDev wiki 很棒!
这两个页面将帮助您:
您不太可能必须使用 XT 键盘,因为它们用于 PC-XT 中,没有 8042 而是 8255 (PPI) 芯片。
并且 PPI 仅响应端口 60h-63h,而忽略了我认为您正在使用的 64h。
见 this listing .
不要在键盘命令和 Controller 命令之间混淆,从您的操作系统都转换为写入相同的数据端口,但第一个到达键盘,后者在 8042 处停止。
考虑有三个扫描代码集(命名集 1、2 和 3)。
XT使用第一个,第二个目前每个键盘都支持,第三个很少使用。
所以你必须检查键盘使用的是哪个扫描码集,默认情况下它是第二个 .
使用 键盘命令 0f0h 带有 00h 的有效载荷以知道当前的扫描代码(在通常的键盘 ACK 0fah 之后)。
如果您使用 01h、02h 或 03h 的有效负载,您可以设置使用的扫描码集。
当心 8082 默认将扫描代码集 2 转换为扫描代码集 1,要禁用此转换,请使用 Controller 命令 20h 和 60h 清除 Controller 配置字节的第 6 位。
简而言之:
关于assembly - 如何判断电脑是否有组装中的XT/AT键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498960/