global kb_init
kb_init:
- push kbintr
- push dword IRQ_TO_INTR(KB_IRQ)
- call set_intr
- add esp, 8
+ set_irq_vector KB_IRQ, kbintr
; enable keyboard interrupt
mov eax, KB_CMD_GET_CMDBYTE
jz .skipread
call read_data
.skipread:
+
+ unmask_irq KB_IRQ
ret
; keyboard interrupt handler
; keystate[keycode] address in ebx
xor ebx, ebx
mov bl, al
+ and bl, 07fh
add ebx, keystate
- ; determine if it's a press or release
- test al, 80h
- jz .press
- ; key release
- mov byte [ebx], 0
- jmp .eoi
-.press: ; key press
- mov byte [ebx], 1
-
+ ; determine if it's a press or release (high bit set on release)
+ rol al, 1
+ and al, 1
+ xor al, 1
+ mov byte [ebx], al
.eoi:
cli
end_of_irq KB_IRQ