EttinOS/src/KEYCODE.INC

88 lines
1.0 KiB
Plaintext

;Reads a keypress and prints its BIOS keycode.
keycode:
;Read a keypress
mov ah, 0x0
int 0x16
;Store the keycode
mov [.scan], ah
mov [.ascii], al
;Print the prefix
mov si, .prefix
call printstr
;Convert the scancode to a hex string
mov al, [.scan]
mov di, .keycode
call .byte2hex
;Convert the ascii value to a hex string
mov al, [.ascii]
mov di, .keycode
add di, 0x2
call .byte2hex
;Print the keycode
mov si, .keycode
call println
ret
.prefix db "0x", 0x0
.scan db 0x0
.ascii db 0x0
.keycode times 0x5 db 0x0
.byte2hex:
;Store the initial registers in the stack
push si
push ax
push bx
push cx
;Move the byte to AH
mov ah, al
;Set a key for the hex digits
mov si, .key
;Set a counter for the two hex digits
mov cx, 0x2
.loop:
;Read a nibble
rol ax, 0x1
rol ax, 0x1
rol ax, 0x1
rol ax, 0x1
mov bx, ax
;Convert the nibble to a hex digit
and bx, 0xf
mov bl, [si + bx]
;Store the hex digit
mov [di], bl
;Repeat
inc di
dec cx
jnz .loop
;Load the initial registers from the stack
pop cx
pop bx
pop ax
pop si
ret
.key db "0123456789abcdef"