assembly - 如何判断电脑是否有组装中的XT/AT键盘?

标签 assembly io operating-system driver nasm

我刚刚完成了我的 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
流行音乐
流行音乐
流行音乐
流行斧
回复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

回复

scan code 0x9e: XT!
扫码 0x9E:XT 键盘中的“A”键中断!
在此先感谢您的帮助。

最佳答案

每当您需要一些关于操作系统编程的建议时,请查看 OSDev wiki 很棒!
这两个页面将帮助您:

  • The PS2 Controller .
  • The PS2 Keyboard .


  • 您不太可能必须使用 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 位。

    简而言之:
  • 您可能正在处理扫描代码转换,而不是(模拟)XT 键盘。
  • 禁用翻译。
  • 显式设置您支持的扫描码集。
  • 关于assembly - 如何判断电脑是否有组装中的XT/AT键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498960/

    相关文章:

    go - 对 byte slice 进行更快的按位与运算

    assembly - 数据如何以字节形式加载到所需的内存字段?

    assembly - 了解 bset 和 bclr

    c - 良好的C字符串库

    regex - Scala 正则表达式被多个空格和换行符分割

    operating-system - 是否有可能创建一个可以运行所有应用程序的操作系统?

    c - 扩展页表有什么用?

    c - 如何在运行时在 Windows 上的 64 位应用程序中设置程序集中的函数参数?

    android - 在 cordova 混合 android 应用程序中写入/读取文件

    sql-server - 使用ErrorFile选项时,同时SQL BULK INSERT生成失败