AT PS/2 Keyboard controller without using IRQ servicing
lo que hace este codigo es leer el teclado cada vez que se presiona una tecla "keyboard.asm" y los scancodes los regresa en el registro ebx lo unico mal es que al parecer solo es capaz de leer 4 scancodes por lectura de puerto (dos teclas), lo que necesito es una tabla con los scancodes de cada tecla para el teclado PS/2 AT y tambien necesito que sea capaz de leer la cantidad de scancodes maxima que pueden almacenarse en el buffer del teclado...
1 ;cli
2 00000000 B800B8 mov ax,0xB800
3 00000003 8ED8 mov ds,ax
4 00000005 31FF xor di,di
5
6 00000007 B002 mov al,2
7 00000009 E621 out 0x21,al
8
9 $again
10 0000000B 6631DB xor ebx,ebx
11 %include 'keyboard.asm'
12 0000000E E464 <1> in al,0x64
13 00000010 A801 <1> test al,1
14 00000012 742A <1> jz $exit
15 <1>
16 00000014 B4AD <1> mov ah,0xAD
17 00000016 E81A00 <1> call $sendKBD
18 <1>
19 <1> $read
20 00000019 E460 <1> in al,0x60
21 0000001B 66C1E008 <1> shl eax,8
22 0000001F E464 <1> in al,0x64
23 00000021 A801 <1> test al,1
24 00000023 75F4 <1> jnz $read
25 <1>
26 00000025 66C1E808 <1> shr eax,8
27 00000029 6689C3 <1> mov ebx,eax
28 <1>
29 0000002C B4AE <1> mov ah,0xAE
30 0000002E E80200 <1> call $sendKBD
31 00000031 EB0B <1> jmp $exit
32 <1>
33 <1> $sendKBD
34 00000033 E464 <1> in al,0x64
35 00000035 A802 <1> test al,2
36 00000037 75FA <1> jnz $sendKBD
37 00000039 88E0 <1> mov al,ah
38 0000003B E664 <1> out 0x64,al
39 0000003D C3 <1> ret
40 <1>
41 <1> $exit
42 0000003E 66891D mov [di],ebx
43 00000041 83C704 add di,4
44 00000044 81FB0D1C cmp bx,0x1C0D
45 00000048 75C1 jne $again
46
47 0000004A CD20 int 0x20
1 ;cli
2 00000000 B800B8 mov ax,0xB800
3 00000003 8ED8 mov ds,ax
4 00000005 31FF xor di,di
5
6 00000007 B002 mov al,2
7 00000009 E621 out 0x21,al
8
9 $again
10 0000000B 6631DB xor ebx,ebx
11 %include 'keyboard.asm'
12 0000000E E464 <1> in al,0x64
13 00000010 A801 <1> test al,1
14 00000012 742A <1> jz $exit
15 <1>
16 00000014 B4AD <1> mov ah,0xAD
17 00000016 E81A00 <1> call $sendKBD
18 <1>
19 <1> $read
20 00000019 E460 <1> in al,0x60
21 0000001B 66C1E008 <1> shl eax,8
22 0000001F E464 <1> in al,0x64
23 00000021 A801 <1> test al,1
24 00000023 75F4 <1> jnz $read
25 <1>
26 00000025 66C1E808 <1> shr eax,8
27 00000029 6689C3 <1> mov ebx,eax
28 <1>
29 0000002C B4AE <1> mov ah,0xAE
30 0000002E E80200 <1> call $sendKBD
31 00000031 EB0B <1> jmp $exit
32 <1>
33 <1> $sendKBD
34 00000033 E464 <1> in al,0x64
35 00000035 A802 <1> test al,2
36 00000037 75FA <1> jnz $sendKBD
37 00000039 88E0 <1> mov al,ah
38 0000003B E664 <1> out 0x64,al
39 0000003D C3 <1> ret
40 <1>
41 <1> $exit
42 0000003E 66891D mov [di],ebx
43 00000041 83C704 add di,4
44 00000044 81FB0D1C cmp bx,0x1C0D
45 00000048 75C1 jne $again
46
47 0000004A CD20 int 0x20