; 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
- 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
; Update the keyboard LED's ;\r
;------------------------------;\r
update_leds:\r
- push ax\r
+ push ax\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
- pop ax\r
- ret\r
+ pop ax\r
+ ret\r
\r
\r
\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
; 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
- 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