2016-05-28 4 views
0

私はちょうど私の16ビットオペレーティングシステムを書き終えましたが、ユーザーが押したキーを知るためにint 0x16を使用しました。今では自分のキーボードドライバを書いていますが、割り込みを使用したくありません。 (私はロングモードに入ることができるように)。私は、ATとXTという2つのスキャンコードがあることに気付きました。 NASM x86アセンブリでコンピュータがどのキーボードを使用するかは、どのようにして決めることができますか?

OSを起動するときにキーを押して、ポート0x60のスキャンコードを使用することをユーザーに求める必要がありますか?
例:キー - ATと0x1eが表示のため0x1cに(作る)(作る)XT
ためのが、Linuxが.......

コンピューターにXT/ATキーボードが組み込まれているかどうかを確認する方法はありますか?

は、私は、次のコードを使用し、仮想ボックスを発見することを行いません。 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キーボードで '' キーのブレイク!

ご協力いただきありがとうございます。

+0

XTキーボードをテストするのはどうですか?それは時代遅れです! – Fifoernik

+0

@FifoernikバーチャルボックスがXTキーボードを使用しているようです – RainingComputers

+1

バーチャルボックスでキーボードを変更できるかどうかを確認します。キーボードは1種類しか扱わないほうがずっと簡単です。 – Fifoernik

答えて

7

OSをプログラミングするアドバイスが必要な時は、OSDevのwikiが素晴らしいです!
これらの2つのページがお手伝いします:


彼らが8042が、8255(PPI)チップを持っていなかったPC-XTで使用されるWHEREので、あなたがXTキーボードに対処する必要があることはほとんどありません。
PPIはポート60h-63hにのみ応答し、使用していると思われる64hは除きます。
this listingを参照してください。


キーボードがコマンドとコントローラの両方が同じデータポートへの書き込みにつながるが、初のダウンキーボードに向かう途中、後者の停止時を作るあなたのOSから、コマンドの間で混乱しないでください。 8042.

3つのスキャンコードセット(set 1,2,3)があるとします。
XTが最初に使用され、2番目のキーボードが現在すべてのキーボードでサポートされています.3番目のキーボードはほとんど使用されません。
キーボードが使用しているスキャンコードセットを確認する必要があります。は、デフォルトで2番目のです。
使用知ら現在のスキャンコードに00Hのペイロードを持つ0F0Hキーボードコマンド(通常キーボードACK 0fah後)。
あなたが01H02Hまたは03Hのペイロードを使用している場合は、使用中に設定されたスキャンコードを設定することができます。

デフォルトで8082がスキャンコードを翻訳することをを用心はコントローラを使用して、この変換を無効にすることはコントローラ設定バイトのクリアビット6に20H60Hコマンド、1を設定されたスキャンコードに2を設定します。短い中のSO


  1. あなたはそうではなく(エミュレート)XTキーボードよりも、スキャンコードの変換を扱っています。
  2. 翻訳を無効にします。
  3. サポートするスキャンコードセットを明示的に設定します。
関連する問題