我刚刚完成了我的16位操作系统的编写,但我使用了int 0x16来告诉用户按下了哪个键。现在我想编写自己的键盘驱动程序,我不想使用任何中断。 (这样我就可以进入长模式)。我意识到有两个扫描码,AT和XT。
如何确定计算机在NASM x86组件中使用哪个键盘?
当操作系统启动时,我是否应该要求用户按一个键并确定在端口0x60中使用扫描码?
例如:一个键 - 对于AT为0x1c(make),对于XT为0x1e(make)
但linux不这样做.......
我使用了以下代码并发现虚拟框使用XT键盘....
[org 0x2e00] mov bx, 0x1000 mov ds, bx ;The program is loaded at 0x12e00 or 1000:2e00 by the operating system xor ax, ax ;Set AX to zero mov bl, 0x0e ;Set text color loop: ;Main loop in al, 0x60 ;Read all ports and display them mov cx, ax call hex_print ;Print content of the port in hex in al, 0x61 mov cx, ax call hex_print in al, 0x62 mov cx, ax call hex_print in al, 0x63 mov cx, ax call hex_print in al, 0x64 call hex_print call com_cls ;Clear the screen after printing content jmp loop ;Jump to loop ;Print hex values;;;;;;;;;;;;;;;;; hex_print: push ax push cx mov ah, 0x0e mov al, ' ' int 0x10 mov al, '0' int 0x10 mov al, 'x' int 0x10 hex_print_start: mov al, ch and al, 0xf0 call hex_map int 0x10 shl cx, 0x04 mov al, ch and al, 0xf0 call hex_map int 0x10 shl cx, 0x04 mov al, ch and al, 0xf0 call hex_map int 0x10 shl cx, 0x04 mov al, ch and al, 0xf0 call hex_map int 0x10 hex_print_end: pop cx pop ax ret hex_map: cmp al, 0x00 jne zero_end mov al, '0' ret zero_end: cmp al, 0x10 jne one_end mov al, '1' ret one_end: cmp al, 0x20 jne two_end mov al, '2' ret two_end: cmp al, 0x30 jne three_end mov al, '3' ret three_end: cmp al, 0x40 jne four_end mov al, '4' ret four_end: cmp al, 0x50 jne five_end mov al, '5' ret five_end: cmp al, 0x60 jne six_end mov al, '6' ret six_end: cmp al, 0x70 jne seven_end mov al, '7' ret seven_end: cmp al, 0x80 jne eight_end mov al, '8' ret eight_end: cmp al, 0x90 jne nine_end mov al, '9' ret nine_end: cmp al, 0xa0 jne a_end mov al, 'A' ret a_end: cmp al, 0xb0 jne b_end mov al, 'B' ret b_end: cmp al, 0xc0 jne c_end mov al, 'C' ret c_end: cmp al, 0xd0 jne d_end mov al, 'D' ret d_end: cmp al, 0xe0 jne e_end mov al, 'E' ret e_end: cmp al, 0xf0 jne f_end mov al, 'F' ret f_end: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;The "cls" command;;;;;;;;;;;;;;;;;;;;;;;;;;;; com_cls: push ax push bx push cx push dx mov ax, 0x0700 ; function 07, AL=0 means scroll whole window mov bh, 0x00 ; character attribute = black mov cx, 0x0000 ; row = 0, col = 0 mov dx, 0x1e54 ; row = 30 (0x1e), col = 79 (0x4f) int 0x10 ; call BIOS video interrupt mov ah, 0x02 ;function 02, set curser position mov dx, 0x00 int 0x10 pop dx pop cx pop bx pop ax ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret
答案 0 :(得分:8)
每当你需要一些编程操作系统的建议时,看一下OSDev维基很棒! 这两页将帮助您:
您不太可能需要处理 XT 键盘,因为它们在PC-XT中使用时没有8042而是8255(PPI)芯片。 />
并且PPI仅响应端口 60h-63h ,省略了我认为您正在使用的 64h 。
请参阅this listing。
不要在键盘命令和控制器命令之间感到困惑,从您的操作系统转换为写入同一数据端口,但第一次下降键盘,后者停在8042.
考虑有三个扫描代码集(名为第1,2和3组)
XT使用第一个,第二个目前由每个键盘支持,第三个很少使用
因此,您必须检查键盘使用的扫描代码集,默认情况下是第二个
使用键盘命令 0f0h 和 00h 的有效负载来获知当前扫描代码(在通常的键盘 ACK 0fah 之后) )。
如果使用 01h , 02h 或 03h 的有效负载,则可以设置正在使用的扫描代码集。
谨防 8082默认情况下将扫描代码集2转换为扫描代码集1,要禁用此转换,请使用控制器命令 20h 和 60h 清除控制器配置字节的第6位。
简而言之: