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: Break für 'A' Taste in XT Tastatur!
Vielen Dank im Voraus für die Hilfe.
Warum sollten Sie überhaupt für eine XT-Tastatur testen? Es ist veraltet! – Fifoernik
@Fifoernik Virtuelle Box scheint eine XT-Tastatur zu verwenden – RainingComputers
Ü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