]> wirehaze git hosting - BOS.git/blobdiff - kernel/kbd/keyboard.asm

wirehaze git hosting

Update shell.asm
[BOS.git] / kernel / kbd / keyboard.asm
index 282bbe2b3026930f709fae06cc7a1458cb87a976..c2b941369c4f66bc6efd367fa38a288787af0d2c 100755 (executable)
 ;  Variabels   ;\r
 ;--------------;\r
 \r
 ;  Variabels   ;\r
 ;--------------;\r
 \r
-     ;--------------------------------------------------------------------------------;\r
-     ;   _______________________      Keyboard buffer system                          ;\r
-     ;   | | | | | | | | | | | |                                                      ;\r
-     ;   +---------------------+                                                      ;\r
-     ;      |         +----------> kbd_head, here is where we put new scan-codes.     ;\r
-     ;      +--------------------> kbd_tail, where we last read a key. this means     ;\r
-     ;                     that we have 4 new scan-codes to read before we catch up.  ;\r
-     ;--------------------------------------------------------------------------------;\r
-         kbd_buffer      db   '           A 64-byte            '\r
-                         db   '        keyboard buffer         '\r
-         kbd_head        db   1                      ; head must be +1 from tail\r
-         kbd_tail        db   0\r
-\r
-     ;-------------------------------------------------------------------------;\r
-     ; _________________        Flag byte:                                     ;\r
-     ; |1|1|0|0|0|1|1|1|                                                       ;\r
-     ; +---------------+                     1 = True   0 = False              ;\r
-     ;  | | | | | | | +--->  shift key                                         ;\r
-     ;  | | | | | | +----->  ctrl key                                          ;\r
-     ;  | | | | | +------->  alt key                                           ;\r
-     ;  | | | | +--------->  reserved bit                                      ;\r
-     ;  | | | +----------->  reserved bit                                      ;\r
-     ;  | | +------------->  reserved bit                                      ;\r
-     ;  | +--------------->  ctrl + alt + del                                  ;\r
-     ;  +----------------->  key released                                      ;\r
-     ;-------------------------------------------------------------------------;\r
-         kbd_flags       db   0                      ; flag byte\r
-\r
-     ;-------------------------------------------------------------------------;\r
-     ; _________________        LED status byte:                               ;\r
-     ; |0|0|0|0|0|1|1|1|                                                       ;\r
-     ; +---------------+                     1 = True   0 = False              ;\r
-     ;            | | +--->  scroll lock                                       ;\r
-     ;            | +----->  num lock                                          ;\r
-     ;            +------->  caps lock                                         ;\r
-     ;-------------------------------------------------------------------------;\r
-         kbd_status      db   0                      ; LED statusbyte\r
+    ;--------------------------------------------------------------------------------;\r
+    ;   _______________________      Keyboard buffer system                          ;\r
+    ;   | | | | | | | | | | | |                                                      ;\r
+    ;   +---------------------+                                                      ;\r
+    ;      |         +----------> kbd_head, here is where we put new scan-codes.     ;\r
+    ;      +--------------------> kbd_tail, where we last read a key. this means     ;\r
+    ;                     that we have 4 new scan-codes to read before we catch up.  ;\r
+    ;--------------------------------------------------------------------------------;\r
+    kbd_buffer  db  '           A 64-byte            '\r
+                db  '        keyboard buffer         '\r
+    kbd_head    db  1                                 ; head must be +1 from tail\r
+    kbd_tail    db  0\r
+\r
+    ;-------------------------------------------------------------------------;\r
+    ; _________________        Flag byte:                                     ;\r
+    ; |1|1|0|0|0|1|1|1|                                                       ;\r
+    ; +---------------+                     1 = True   0 = False              ;\r
+    ;  | | | | | | | +--->  shift key                                         ;\r
+    ;  | | | | | | +----->  ctrl key                                          ;\r
+    ;  | | | | | +------->  alt key                                           ;\r
+    ;  | | | | +--------->  reserved bit                                      ;\r
+    ;  | | | +----------->  reserved bit                                      ;\r
+    ;  | | +------------->  reserved bit                                      ;\r
+    ;  | +--------------->  ctrl + alt + del                                  ;\r
+    ;  +----------------->  key released                                      ;\r
+    ;-------------------------------------------------------------------------;\r
+    kbd_flags   db  0                                 ; flag byte\r
+\r
+    ;-------------------------------------------------------------------------;\r
+    ; _________________        LED status byte:                               ;\r
+    ; |0|0|0|0|0|1|1|1|                                                       ;\r
+    ; +---------------+                     1 = True   0 = False              ;\r
+    ;            | | +--->  scroll lock                                       ;\r
+    ;            | +----->  num lock                                          ;\r
+    ;            +------->  caps lock                                         ;\r
+    ;-------------------------------------------------------------------------;\r
+    kbd_status  db  0                                 ; LED statusbyte\r
 \r
 \r
 ;----------------------;\r
 ;   Keyboard IRQ       ;\r
 ;----------------------;\r
 keyboard_isr:\r
 \r
 \r
 ;----------------------;\r
 ;   Keyboard IRQ       ;\r
 ;----------------------;\r
 keyboard_isr:\r
-         push    eax\r
-\r
-     ;-------------------------;\r
-     ;   get the scancode      ;\r
-     ;-------------------------;\r
-         xor     eax, eax\r
-         in      al, 0x60\r
-\r
-     ;------------------------------;\r
-     ;  check if key was released   ;\r
-     ;------------------------------;\r
-         test    al, 0x80\r
-         jz      .key_down\r
-         and     byte [kbd_flags], 01111111b         ; key up..\r
-\r
-         cmp     al, 42+128                          ; left shift up?\r
-         je      .shift_up\r
-         cmp     al, 54+128                          ; right shift up?\r
-         je      .shift_up\r
-\r
-         cmp     al, 29+128                          ; ctrl up?\r
-         je      .ctrl_up\r
-\r
-         cmp     al, 83+128                          ; del up?\r
-         je      .del_up\r
-\r
-         cmp     al, 56+128                          ; alt up?\r
-         je      .alt_up\r
-         jmp     .end\r
-\r
-     ;--------------------;\r
-     ;  it was released   ;\r
-     ;--------------------;\r
-     .shift_up:\r
-         and     byte [kbd_flags], 11111110b\r
-         jmp     .end\r
-\r
-     .del_up:\r
-         jmp     .CAD_off\r
-\r
-     .ctrl_up:\r
-         and     byte [kbd_flags], 11111101b      ; ctrl off.\r
-         jmp     .CAD_off\r
-\r
-     .alt_up:\r
-         and     byte [kbd_flags], 11111011b      ; alt off.\r
-         jmp     .CAD_off\r
-\r
-     .CAD_off:\r
-         test    byte [kbd_flags], 01000000b\r
-         jz      .CAD_is_off\r
-         and     byte [kbd_flags], 10111111b      ; ctrl+alt+del bit off.\r
-     .CAD_is_off:\r
-         jmp     .end\r
-\r
-     ;----------------------------------------------;\r
-     ;  a key was pressed, check for special keys   ;\r
-     ;----------------------------------------------;\r
-     .key_down:\r
-         or      byte [kbd_flags], 10000000b\r
-\r
-     .shift:\r
-         cmp     al, 42\r
-         jnz     .check_rshift\r
-         or      byte [kbd_flags], 00000001b\r
-         jmp     .end\r
-\r
-     .check_rshift:\r
-         cmp     al, 54\r
-         jnz     .check_ctrl\r
-         or      byte [kbd_flags], 00000001b\r
-         jmp     .end\r
-\r
-     .check_ctrl:\r
-         cmp     al, 29\r
-         jnz     .check_alt\r
-         or      byte [kbd_flags], 00000010b\r
-         jmp     .end\r
-\r
-     .check_alt:\r
-         cmp     al, 56\r
-         jnz     .ctrl_alt_del\r
-         or      byte [kbd_flags], 00000100b\r
-         jmp     .end\r
-\r
-     .ctrl_alt_del:\r
-         test    byte [kbd_flags], 00000110b         ; check for ctrl+alt\r
-         jz      .check_caps\r
-         cmp     al, 83                              ; check for delete\r
-         jne     .check_caps\r
-         or      byte [kbd_flags], 01000000b         ; ctrl+alt+del bit on.\r
-\r
-     ;-------------------------------------;\r
-     ;  toggle caps, num and scroll lock   ;\r
-     ;-------------------------------------;\r
-     .check_caps:\r
-         cmp     al, 58\r
-         jnz     .check_num\r
-         xor     byte [kbd_status], 4\r
-         call    update_leds\r
-         jmp     .end\r
-\r
-     .check_num:\r
-         cmp     al, 69\r
-         jnz     .check_scroll\r
-         xor     byte [kbd_status], 2\r
-         call    update_leds\r
-         jmp     .end\r
-\r
-     .check_scroll:\r
-         cmp     al, 70\r
-         jnz     .end\r
-         xor     byte [kbd_status], 1\r
-         call    update_leds\r
-         jmp     .end\r
-\r
-     ;-----------------------------------;\r
-     ;  put the scancode in the buffer   ;\r
-     ;-----------------------------------;\r
-     .end:\r
-         push    eax\r
-         mov     edi, kbd_buffer\r
-         xor     eax, eax\r
-         mov     al, [kbd_head]\r
-         add     edi, eax\r
-         pop     eax\r
-         stosb\r
-         cmp     [kbd_head], 63                      ; if we reach the buffer\r
-         jne     .cont1                              ; end, go back to 0.\r
-         cmp     [kbd_tail], 0\r
-         je      .error\r
-         mov     [kbd_head], 0\r
-         jmp     .quit\r
-     .cont1:\r
-         mov     ah, [kbd_tail]\r
-         mov     al, [kbd_head]\r
-         add     al, 1\r
-         cmp     ah, al\r
-         je      .error\r
-         inc     [kbd_head]\r
-         jmp     .quit\r
-     .error:\r
-         call    beep                                ; pc_speaker.inc\r
-         mov     [kbd_head], 1                       ; fix it as good\r
-         mov     [kbd_tail], 0                       ; as possible.. :S\r
-     .quit:\r
-         mov     al, 0x20\r
-         out     0x20, al\r
-         pop     eax\r
-         ret\r
+        push   eax\r
+\r
+    ;-------------------------;\r
+    ;   get the scancode      ;\r
+    ;-------------------------;\r
+        xor    eax, eax\r
+        in     al, 0x60\r
+\r
+    ;------------------------------;\r
+    ;  check if key was released   ;\r
+    ;------------------------------;\r
+        test   al, 0x80\r
+        jz     .key_down\r
+        and    byte [kbd_flags], 01111111b            ; key up..\r
+\r
+        cmp    al, 42+128                             ; left shift up?\r
+        je     .shift_up\r
+        cmp    al, 54+128                             ; right shift up?\r
+        je     .shift_up\r
+\r
+        cmp    al, 29+128                             ; ctrl up?\r
+        je     .ctrl_up\r
+\r
+        cmp    al, 83+128                             ; del up?\r
+        je     .del_up\r
+\r
+        cmp    al, 56+128                             ; alt up?\r
+        je     .alt_up\r
+        jmp    .end\r
+\r
+    ;--------------------;\r
+    ;  it was released   ;\r
+    ;--------------------;\r
+    .shift_up:\r
+        and    byte [kbd_flags], 11111110b\r
+        jmp    .end\r
+\r
+    .del_up:\r
+        jmp    .CAD_off\r
+\r
+    .ctrl_up:\r
+        and    byte [kbd_flags], 11111101b            ; ctrl off.\r
+        jmp    .CAD_off\r
+\r
+    .alt_up:\r
+        and    byte [kbd_flags], 11111011b            ; alt off.\r
+        jmp    .CAD_off\r
+\r
+    .CAD_off:\r
+        test   byte [kbd_flags], 01000000b\r
+        jz     .CAD_is_off\r
+        and    byte [kbd_flags], 10111111b            ; ctrl+alt+del bit off.\r
+    .CAD_is_off:\r
+        jmp    .end\r
+\r
+    ;----------------------------------------------;\r
+    ;  a key was pressed, check for special keys   ;\r
+    ;----------------------------------------------;\r
+    .key_down:\r
+        or     byte [kbd_flags], 10000000b\r
+\r
+    .shift:\r
+        cmp    al, 42\r
+        jnz    .check_rshift\r
+        or     byte [kbd_flags], 00000001b\r
+        jmp    .end\r
+\r
+    .check_rshift:\r
+        cmp    al, 54\r
+        jnz    .check_ctrl\r
+        or     byte [kbd_flags], 00000001b\r
+        jmp    .end\r
+\r
+    .check_ctrl:\r
+        cmp    al, 29\r
+        jnz    .check_alt\r
+        or     byte [kbd_flags], 00000010b\r
+        jmp    .end\r
+\r
+    .check_alt:\r
+        cmp    al, 56\r
+        jnz    .ctrl_alt_del\r
+        or     byte [kbd_flags], 00000100b\r
+        jmp    .end\r
+\r
+    .ctrl_alt_del:\r
+        test   byte [kbd_flags], 00000110b            ; check for ctrl+alt\r
+        jz     .check_caps\r
+        cmp    al, 83                                 ; check for delete\r
+        jne    .check_caps\r
+        or     byte [kbd_flags], 01000000b            ; ctrl+alt+del bit on.\r
+\r
+    ;-------------------------------------;\r
+    ;  toggle caps, num and scroll lock   ;\r
+    ;-------------------------------------;\r
+    .check_caps:\r
+        cmp    al, 58\r
+        jnz    .check_num\r
+        xor    byte [kbd_status], 4\r
+        call   update_leds\r
+        jmp    .end\r
+\r
+    .check_num:\r
+        cmp    al, 69\r
+        jnz    .check_scroll\r
+        xor    byte [kbd_status], 2\r
+        call   update_leds\r
+        jmp    .end\r
+\r
+    .check_scroll:\r
+        cmp    al, 70\r
+        jnz    .end\r
+        xor    byte [kbd_status], 1\r
+        call   update_leds\r
+        jmp    .end\r
+\r
+    ;-----------------------------------;\r
+    ;  put the scancode in the buffer   ;\r
+    ;-----------------------------------;\r
+    .end:\r
+        push   eax\r
+        mov    edi, kbd_buffer\r
+        xor    eax, eax\r
+        mov    al, [kbd_head]\r
+        add    edi, eax\r
+        pop    eax\r
+        stosb\r
+        cmp    [kbd_head], 63                         ; if we reach the buffer\r
+        jne    .cont1                                 ; end, go back to 0.\r
+        cmp    [kbd_tail], 0\r
+        je     .error\r
+        mov    [kbd_head], 0\r
+        jmp    .quit\r
+    .cont1:\r
+        mov    ah, [kbd_tail]\r
+        mov    al, [kbd_head]\r
+        add    al, 1\r
+        cmp    ah, al\r
+        je     .error\r
+        inc    [kbd_head]\r
+        jmp    .quit\r
+    .error:\r
+        call   beep                                   ; pc_speaker.inc\r
+        mov    [kbd_head], 1                          ; fix it as good\r
+        mov    [kbd_tail], 0                          ; as possible.. :S\r
+    .quit:\r
+        mov    al, 0x20\r
+        out    0x20, al\r
+        pop    eax\r
+        ret\r
 \r
 \r
 \r
 \r
 \r
 \r
@@ -211,18 +211,18 @@ keyboard_isr:
 ;  Update the keyboard LED's   ;\r
 ;------------------------------;\r
 update_leds:\r
 ;  Update the keyboard LED's   ;\r
 ;------------------------------;\r
 update_leds:\r
-         push    ax\r
+        push   ax\r
 \r
 \r
-         call    kbd_wait\r
-         mov     al, 0xED\r
-         out     0x60, al\r
-         call    kbd_wait\r
-         mov     al, [kbd_status]\r
-         out     0x60, al\r
-         call    kbd_wait\r
+        call   kbd_wait\r
+        mov    al, 0xED\r
+        out    0x60, al\r
+        call   kbd_wait\r
+        mov    al, [kbd_status]\r
+        out    0x60, al\r
+        call   kbd_wait\r
 \r
 \r
-         pop     ax\r
-         ret\r
+        pop    ax\r
+        ret\r
 \r
 \r
 \r
 \r
 \r
 \r
@@ -230,17 +230,17 @@ update_leds:
 ;  keyboard wait   ;\r
 ;------------------;\r
 kbd_wait:\r
 ;  keyboard wait   ;\r
 ;------------------;\r
 kbd_wait:\r
-         jmp     $+2\r
-         in      al, 0x64\r
-         test    al, 1\r
-         jz      .ok\r
-         jmp     $+2\r
-         in      al, 0x60\r
-         jmp     kbd_wait\r
-     .ok:\r
-         test    al, 2\r
-         jnz     kbd_wait\r
-         ret\r
+        jmp    $+2\r
+        in     al, 0x64\r
+        test   al, 1\r
+        jz     .ok\r
+        jmp    $+2\r
+        in     al, 0x60\r
+        jmp    kbd_wait\r
+    .ok:\r
+        test   al, 2\r
+        jnz    kbd_wait\r
+        ret\r
 \r
 \r
 \r
 \r
 \r
 \r
@@ -250,131 +250,131 @@ kbd_wait:
 ;               bh = flag-byte,      bl = led-byte      ;\r
 ;-------------------------------------------------------;\r
 getc:\r
 ;               bh = flag-byte,      bl = led-byte      ;\r
 ;-------------------------------------------------------;\r
 getc:\r
-         push    esi\r
-\r
-     .no_new:\r
-         mov     al, [kbd_head]\r
-         mov     ah, [kbd_tail]\r
-         cmp     ah, 63\r
-         jne     .check2\r
-         cmp     al, 0\r
-         je      .no_new\r
-         mov     [kbd_tail], 0\r
-         jmp     .done_check\r
-     .check2:\r
-         mov     bl, ah\r
-         inc     bl\r
-         cmp     bl, al\r
-         je      .no_new\r
-         inc     [kbd_tail]\r
-     .done_check:\r
-\r
-         mov     esi, kbd_buffer\r
-         movzx   eax, [kbd_tail]\r
-         add     esi, eax\r
-         mov     ah, byte [esi]                      ; ah = scancode\r
-         movzx   esi, byte [esi]                     ; esi = scancode\r
-\r
-     ;------------------;\r
-     ;  some checks..   ;\r
-     ;------------------;\r
-         cmp     ah, 0xFA\r
-         je      .no_new\r
-         cmp     ah, 0xE0\r
-         je      .no_new\r
-         cmp     ah, 0xE1\r
-         je      .no_new\r
-         test    ah, 0x80\r
-         jnz     .no_new\r
-\r
-     ;--------------------------------;\r
-     ;  check for caps, shift & alt   ;\r
-     ;--------------------------------;\r
-         test    [kbd_status], 00000100b\r
-         jnz     .caps\r
-         test    [kbd_flags], 00000001b\r
-         jnz     .shift\r
-\r
-     ;------------------;\r
-     ;  normal keymap   ;\r
-     ;------------------;\r
-         mov     al, [esi+keymap]                    ; scancode + keymap = ascii\r
-         jmp     .end\r
-\r
-     ;--------------------;\r
-     ;  capslock keymap   ;\r
-     ;--------------------;\r
-     .caps:\r
-         test    [kbd_flags], 00000001b\r
-         jnz     .caps_and_shift\r
-\r
-         mov     al, [esi+keymap_caps]\r
-         jmp     .end\r
-\r
-     ;--------------------------;\r
-     ;  caps and shift keymap   ;\r
-     ;--------------------------;\r
-     .caps_and_shift:\r
-         mov     al, [esi+keymap_caps_shift]\r
-         jmp     .end\r
-\r
-     ;-----------------;\r
-     ;  shift keymap   ;\r
-     ;-----------------;\r
-     .shift:\r
-         mov     al, [esi+keymap_shift]\r
-         jmp     .end\r
-\r
-     ;---------------------------;\r
-     ;  set registers and exit   ;\r
-     ;---------------------------;\r
-     .end:\r
-         mov     bl, [kbd_status]\r
-         mov     bh, [kbd_flags]\r
-\r
-         pop     esi\r
-         ret\r
+        push   esi\r
+\r
+    .no_new:\r
+        mov    al, [kbd_head]\r
+        mov    ah, [kbd_tail]\r
+        cmp    ah, 63\r
+        jne    .check2\r
+        cmp    al, 0\r
+        je     .no_new\r
+        mov    [kbd_tail], 0\r
+        jmp    .done_check\r
+    .check2:\r
+        mov    bl, ah\r
+        inc    bl\r
+        cmp    bl, al\r
+        je     .no_new\r
+        inc    [kbd_tail]\r
+    .done_check:\r
+\r
+        mov    esi, kbd_buffer\r
+        movzx  eax, [kbd_tail]\r
+        add    esi, eax\r
+        mov    ah, byte [esi]                         ; ah = scancode\r
+        movzx  esi, byte [esi]                        ; esi = scancode\r
+\r
+    ;------------------;\r
+    ;  some checks..   ;\r
+    ;------------------;\r
+        cmp    ah, 0xFA\r
+        je     .no_new\r
+        cmp    ah, 0xE0\r
+        je     .no_new\r
+        cmp    ah, 0xE1\r
+        je     .no_new\r
+        test   ah, 0x80\r
+        jnz    .no_new\r
+\r
+    ;--------------------------------;\r
+    ;  check for caps, shift & alt   ;\r
+    ;--------------------------------;\r
+        test   [kbd_status], 00000100b\r
+        jnz    .caps\r
+        test   [kbd_flags], 00000001b\r
+        jnz    .shift\r
+\r
+    ;------------------;\r
+    ;  normal keymap   ;\r
+    ;------------------;\r
+        mov    al, [esi+keymap]                       ; scancode + keymap = ascii\r
+        jmp    .end\r
+\r
+    ;--------------------;\r
+    ;  capslock keymap   ;\r
+    ;--------------------;\r
+    .caps:\r
+        test   [kbd_flags], 00000001b\r
+        jnz    .caps_and_shift\r
+\r
+        mov    al, [esi+keymap_caps]\r
+        jmp    .end\r
+\r
+    ;--------------------------;\r
+    ;  caps and shift keymap   ;\r
+    ;--------------------------;\r
+    .caps_and_shift:\r
+        mov    al, [esi+keymap_caps_shift]\r
+        jmp    .end\r
+\r
+    ;-----------------;\r
+    ;  shift keymap   ;\r
+    ;-----------------;\r
+    .shift:\r
+        mov    al, [esi+keymap_shift]\r
+        jmp    .end\r
+\r
+    ;---------------------------;\r
+    ;  set registers and exit   ;\r
+    ;---------------------------;\r
+    .end:\r
+        mov    bl, [kbd_status]\r
+        mov    bh, [kbd_flags]\r
+\r
+        pop    esi\r
+        ret\r
 \r
 \r
 ;------------------------------;\r
 ;  "press any key to..."       ;\r
 ;------------------------------;\r
 wait_key:\r
 \r
 \r
 ;------------------------------;\r
 ;  "press any key to..."       ;\r
 ;------------------------------;\r
 wait_key:\r
-         push    eax\r
-         push    ebx\r
-         push    esi\r
-\r
-     .no_new:\r
-         mov     al, [kbd_head]\r
-         mov     ah, [kbd_tail]\r
-         cmp     ah, 63\r
-         jne     .check2\r
-         cmp     al, 0\r
-         je      .no_new\r
-         mov     [kbd_tail], 0\r
-         jmp     .done_check\r
-     .check2:\r
-         mov     bl, ah\r
-         inc     bl\r
-         cmp     bl, al\r
-         je      .no_new\r
-         inc     [kbd_tail]\r
-     .done_check:\r
-\r
-         mov     esi, kbd_buffer\r
-         movzx   eax, [kbd_tail]\r
-         add     esi, eax\r
-         mov     ah, byte [esi]                      ; ah = scancode\r
-         cmp     ah, 0xFA                            ; check for some stuff..\r
-         je      .no_new\r
-         cmp     ah, 0xE0\r
-         je      .no_new\r
-         cmp     ah, 0xE1\r
-         je      .no_new\r
-         test    ah, 0x80\r
-         jnz     .no_new\r
-\r
-         pop     esi\r
-         pop     ebx\r
-         pop     eax\r
-         ret
\ No newline at end of file
+        push   eax\r
+        push   ebx\r
+        push   esi\r
+\r
+    .no_new:\r
+        mov    al, [kbd_head]\r
+        mov    ah, [kbd_tail]\r
+        cmp    ah, 63\r
+        jne    .check2\r
+        cmp    al, 0\r
+        je     .no_new\r
+        mov    [kbd_tail], 0\r
+        jmp    .done_check\r
+    .check2:\r
+        mov    bl, ah\r
+        inc    bl\r
+        cmp    bl, al\r
+        je     .no_new\r
+        inc    [kbd_tail]\r
+    .done_check:\r
+\r
+        mov    esi, kbd_buffer\r
+        movzx  eax, [kbd_tail]\r
+        add    esi, eax\r
+        mov    ah, byte [esi]                         ; ah = scancode\r
+        cmp    ah, 0xFA                               ; check for some stuff..\r
+        je     .no_new\r
+        cmp    ah, 0xE0\r
+        je     .no_new\r
+        cmp    ah, 0xE1\r
+        je     .no_new\r
+        test   ah, 0x80\r
+        jnz    .no_new\r
+\r
+        pop    esi\r
+        pop    ebx\r
+        pop    eax\r
+        ret
\ No newline at end of file