如何确定计算机组装中是否有XT / AT键盘?

时间:2016-05-28 12:25:07

标签: assembly io operating-system driver nasm

我刚刚完成了我的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

scan code 0x9e: XT! 扫描码0x9E:XT键盘中的'A'键断开!

在此先感谢您的帮助。

1 个答案:

答案 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位。

简而言之:

  1. 您可能正在处理扫描代码转换,而不是处理(模拟)XT键盘。
  2. 停用翻译。
  3. 明确设置您支持的扫描代码集。