2016-05-28 4 views
0

Ich habe gerade mein 16-Bit-Betriebssystem geschrieben, aber ich habe Int 0x16 benutzt, um zu sagen, welche Taste der Benutzer gedrückt hat. Jetzt möchte ich meinen eigenen Tastaturtreiber schreiben und ich möchte keine Interrupts verwenden. (Damit kann ich den Long-Modus betreten). Ich erkannte, dass es zwei Scan-Codes gibt, das AT und das XT. Wie kann ich feststellen, welche Tastatur der Computer in NASM x86-Assembly verwendet?

Sollte ich den Benutzer bitten, eine Taste zu drücken und beim Starten des Betriebssystems den Scan-Code in Port 0x60 zu bestimmen?
zB: Ein Schlüssel - 0x1c (Schließer) für AT und 0x1e (machen) für XT
Aber Linux das nicht tun .......

Wie kann festgestellt werden, ob der Computer eine XT/AT-Tastatur in der Baugruppe hat?

habe ich den folgenden Code und entdecken virtuelle Box eine XT-Tastatur verwendet ....

 
[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! Scan Code 0x9E: Break für 'A' Taste in XT Tastatur!

Vielen Dank im Voraus für die Hilfe.

+0

Warum sollten Sie überhaupt für eine XT-Tastatur testen? Es ist veraltet! – Fifoernik

+0

@Fifoernik Virtuelle Box scheint eine XT-Tastatur zu verwenden – RainingComputers

+1

Überprüfen Sie, ob VirtualBox Ihnen erlaubt, Tastaturen zu ändern. Es ist so viel einfacher, mit nur einer Art von Tastatur (oder irgendetwas anderem) fertig zu werden. – Fifoernik

Antwort

7

Immer wenn Sie ein paar Tipps zum Programmieren eines Betriebssystems benötigen, werfen Sie einen Blick auf Das OSDev-Wiki ist großartig!
Diese beiden Seiten wird Ihnen helfen:


Es ist unwahrscheinlich, dass Sie mit einer XT Tastatur zu tun haben, weil sie in dem PC-XT, die nicht haben ein 8042 aber einen 8255 (PPI) Chip eingesetzt, wo.
Und der PPI reagiert auf Ports 60h-63h nur, ohne die 64h, die ich denke, Sie verwenden.
Siehe this listing.


Lassen Sie sich nicht verwirrt zwischen Tastatur und Controller Befehle Befehle, von Ihrem OS in Schreibungen in der gleichen Datenport übersetzen beide aber die Premieren ihren Weg bis auf die Tastatur, letztere Anschlag an die 8042.

Berücksichtigen Sie, dass es drei Scan-Code-Sets gibt (benannt Satz 1, 2 und 3).
Die XT verwendet die erste, die zweite wird derzeit von jeder Tastatur unterstützt, die dritte wird selten verwendet.
Sie müssen also überprüfen, welchen Scancode die Tastatur verwendet, Standardmäßig ist es der zweite.
Verwenden Tastaturbefehl0F0h mit einer Nutzlast von 00h zu bekannten dem aktuellen Scan-Code (nach der üblichen Tastatur ACK 0fah).
Wenn Sie eine Nutzlast von 01h verwenden, 02h oder 03h Sie den Scan-Code festgelegt in Gebrauch einstellen.

Beachten Sie, dass die 8082 durch Standard-Scan-Code festgelegt 2 übersetzen in Abtastcode 1 gesetzt, diese Übersetzung deaktivieren Controller-Befehle verwenden20h und 60h Bit 6 der Controller-Konfiguration Byte löschen.


Also kurz gesagt:

  1. Sie sind wahrscheinlich mit einer Scan-Code-Übersetzung zu tun, anstatt mit einer (emulierten) XT Tastatur.
  2. Deaktivieren Sie die Übersetzung.
  3. Legen Sie explizit den Scancode fest, den Sie unterstützen.
Verwandte Themen