Programación General > ASM (Ensamblador)

 Cambiar el estado de los LEDs del teclado.

(1/2) > >>

Sporeman:
Hola,

Soy un estudiante de ingeniería eléctrica aficionado a la informática. Hace tiempo que uso Linux, y en este SO hay una utilidad, setleds, para fijar el estado del bloque de mayúsculas, numérico y el scroll.

Quiero hacer algo similar para Windows, con Turbo C y ASM.

De momento, toqueteando la interrupción 16h no he conseguido nada. He rebuscado por Internet, y sí, hay información, pero no hay nada que se ajuste a lo que yo quiero. He bajado el código fuente del programa setleds, y éste fija el estado por llamadas a ioctl (). Yo lo quiero en ASM.

¿Alguien me puede ayudar? No pido que me escribais el código, sólo un poco de ayuda, por que no sé por dónde seguir.  :hitcomp:

Un saludo.

Eternal Idol:
Depura el codigo y fijate que hacen esos IOCTLs.

posman:
Consultando la RBIL, en la direccion de memoria 0040h:0097h (en modo real) indica el estado de los 3 leds (Caps Lock, Num Lock y Scroll Lock). Aunque no se si desde Turbo C se puede acceder a esa parte de la memoria

Consigue la Ralf Brown Interrupr List. Cuando lo descomprimes, debe estar un archivo memory.lst (o archivos .A, .B, etc para unirlos)

Pero aqui esta lo que te menciono:

--- Citar ---MEM 0040h:0097h - KEYBOARD STATUS BYTE 2
Size:   BYTE
SeeAlso: MEM 0040h:0096h,INT 16/AH=11h

Bitfields for keyboard status byte 2:
Bit(s)   Description   (Table M0034)
 7   =1 keyboard transmit error flag
 6   =1 LED update in progress
 5   =1 RESEND received from keyboard
 4   =1 ACK received from keyboard
 3   reserved, must be zero
 2   Caps Lock LED
 1   Num Lock LED
 0   Scroll Lock LED
SeeAlso: #M0033,#M0010
--- Fin de la cita ---

posman:
Para cambiar el estado de los LEDS se utiliza el puerto 60h. Hay que enviar un EDh y despues un byte con el estado que quieres poner


--- Citar ---PORT 0060-006F - KEYBOARD CONTROLLER 804x (8041, 8042) (or PPI (8255) on PC,XT)
Note:   XT uses ports 60h-63h, AT uses ports 60h-64h

0060  RW  KB controller data port or keyboard input buffer (ISA, EISA)
      should only be read from after status port bit0 = 1
      should only be written to if status port bit1 = 0
0060  R-  KeyBoard or KB controller data output buffer (via PPI on XT)
      PC: input from port A of 8255, if bit7 in 61h set (see #P0396)
      get scancodes, special codes (in PC: with bit7 in 61h cleared)
        (see #P0390)
.
.
.
Values for keyboard commands (data also goes to PORT 0060h):
Value   Count   Description
 EDh   double   set/reset mode indicators Caps Num Scrl
      bit 2 = CapsLk, bit 1 = NumLk, bit 0 = ScrlLk
      all other bits must be zero.

--- Fin de la cita ---

Sporeman:
Mandando EDh al puerto 60 cambio el estado de las CAPS, NUM, y SCROLL, pero los LEDs no hacen nada. Por lo menos ya tengo algo hecho, muchas gracias  :beer:

No sé si turbo C me deja acceder directamente a la memoria, supongo que al estar ejecutando la aplicación bajo windows, ésta se cerrará y dirá que ha efectuado una operación no válida.

Ahora viene la pregunta tonta: ¿Como voy a esa dirección? ¿Con un mov? Mis conocimientos de Ensamblador son un poco limitados, sorry  :unsure:

De momento parece que vamos bien.  :good:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa