P= K E Y T E S T E R P< By Rombust of Nerve Axis P? ----ooooOOOOoooo---- P8 Alguna vez te habias preguntado como se lee el teclado en assembler? aqui está como hacerlo: move.b $bfec01,d ; 1º leer una registro determinado not.b d4 ; 2º decodificar ror.b #1,d4 ; su contenido d4 ahora contiene el valor de la tecla. Su 7º bit significa si se ha pulsado o se ha soltado. Bit 7 = 0 -> pulsada, bit 7 = 1 -> soltada. Si quieres saber si se ha pulsado la barra espaciadora, compara d4 con $40. Este programa espera a que se introduzca la palabra PEPE. ; ; PEPEWAITER.ASM ; lea $bfec01,a1 ; a1 = $bfec01 Inicio: lea Entrar,a0 ; a0 = la dirección de la etiqueta "Entrar" .bucle move.b (a1),d4 ; usar modo indirecto ahorra unos bytes! not.b d4 ; decodificamos ror.b #1,d4 ; decodificamos move.b (a0)+,d0 ; carga caracter y posición en el siguiente beq .terminar ; si es cero hemos terminado .bucle2 cmp.b d0,d4 ; compararlo con el decodificado bne Inicio ; ¿es distinto? volver a empezar! move.b d4,d5 ; guarda una copia de d4 en d5 move.b d4,d3 ; guarda una copia de d4 en d3 bset #7,d5 ; la de d5 significa tecla soltada .bucle3 move.b (a1),d4 ; leer otro caracter del teclado not.b d4 ; decodificar ror.b #1,d4 ; decodificar cmp.b d4,d3 ; ¿es el mismo que el anterior? beq .bucle3 ; volver a leerlo cmp.b d4,d5 ; ¿es tecla soltada? bne Inicio ; no? muy raro esto! volver a empezar move.b (a0)+,d0 ; carga siguiente caracter y luego incrementa beq .terminar ; si es cero hemos terminado .bucle4 move.b (a1),d4 ; sino leemos otra tecla not.b d4 ; decodifico ror.b #1,d4 ; decodifico cmp.b d4,d5 ; ¿es tecla soltada? beq .bucle4 ; ¿si? volver a leer bra .bucle2 ; ¿no? esperar a que se suelte .terminar move.w #$fff,$dff180 ; hacer un flash de color rts ; termina Entrar: dc.b $19,$12,$19,$12,0 ; PEPE + 0 El programa anterior toma letras de una lista y las compara con las teclas que sa van pulsando en el teclado. No termina hasta que se entran todas y en el orden deseado. Entendido el otro este no necesita ningún comentario. A ver si descubres en que se distinguen... lea $bfec01,a1 Inicio: lea Entrar,a0 .bucle move.b (a1),d4 not.b d4 ror.b #1,d4 move.b (a0)+,d0 beq .terminar .bucle2 cmp.b d4,d0 bne Inicio move.b d0,d1 move.b (a0)+,d0 beq .terminar .bucle3 move.b (a1),d4 not.b d4 ror.b #1,d4 cmp.b d4,d1 beq .bucle3 bra .bucle2 .terminar move.w #$fff,$dff180 rts Entrar: dc.b $23,$16,$36,0 ; FUN Este programa es similar al anterior, excepto en que no espera a que se suelten las teclas. Para que el programa termine es necesario tener pulsadas las tres teclas F - U - N a la vez, sin levantar los dedos de las teclas. Prueba a cambiar esta combinación de teclas con, por ejemplo, CTRL-F, las teclas SHIFT y de caracteres especiales funcionan de la misma manera. Por ejemplo: SHIFT izquierdo y Q resultan en los siguientes valores para d4: $60 (pulsado shift izquierdo) $10 (Q pulsada) $90 (Q soltada) $E0 (soltado shift izquierdo) No se soportan muchas teclas a la vez, según de que teclas se trate pueden usarse 3, 4 o 5. Si solamente se quiere hacer una rutina de tipo "pulsar cualquier tecla para continuar" es suficiente con asegurarse de que el bit 0 de bfec01 es un 1. The key values are: ESCAPE $45 F1 - F10 $50 - $59 DEL $46 '1234567890-=\ $00 - $0D HELP $5F QWERTYUIOP´` $10 - $1B BACK SPACE $41 ASDFGHJKLñ;Ç $20 - $2B TAB $42 ZXCVBNM,.' $31 - $3A CTRL $63 CAPS LOCK $62 TECLADO NUMERICO ()/* $5A - $5D SHIFT IZQUIERDA $60 TECLADO NUMERICO 789 $3D - $3F SHIFT DERECHA $61 TECLADO NUMERICO 456 $2D - $2F ALT IZQUIERDA $64 TECLADO NUMERICO 123 $1D - $1F ALT DERECHA $65 TECLADO NUMERICO 0 $0F AMIGA IZQUIERDA $66 TECLADO NUMERICO . $3C AMIGA DERECHA $67 TECLADO NUMERICO - $4A BARRA ESPACIADORA $40 TECLADO NUMERICO + $5E RETURN $44 TECLADO NUMERICO ENTER $43 CURSOR ARRIBA $4C CURSOR ABAJO $4D CURSOR IZQUIERDA $4F CURSOR DERECHA $4E Otros cÓdigos tienen significado especial: $78 - Pulsado CTRL-AMIGA-AMIGA $fa - Rebose de buffer de teclado end.