Teclados y terminales Entrada/Salida o Un terminal es un sistema de Entrada/Salida o Entrada -> Teclado, Ratón, Tableta digitalizadora… o Salida -> Pantalla, Impresora, Plotter… Tipos de Terminales o Interfaz mapeada a memoria n Orientado a carácter n Orientado a pixel o Interfaz vía red (serie, ethernet, etc.) n Tipo tty n Tipo “inteligente” Teclado, construcción física o El teclado es esencialmente una matriz en cuyos nodos puede cerrarse un contacto eléctrico. o Un procesador integrado en el teclado obtiene un número de 7 bits que depende SÓLO de la posición de la tecla pulsada (no del carácter que tenga dibujado) 25 millones de pulsaciones 0/50º operación -20/-60º almacenaje Teclado, comunicación o El teclado envía el número asociado a la tecla si un semáforo hardware “ad hoc” se lo permite. o El número se envía bit a bit, en serie. Los bits se acumulan en un registro. o Cuando el registro se llena, se comunica una interrupción al CPI. Teclado, interfaz (1) o La interrupción de teclado pasa el control a la rutina de la BIOS o a la rutina de usuario encargado de leer el código o Esta rutina toma el código del puerto 0x60, LO TRADUCE y lo deposita en un “buffer” del S.O. Teclado, interfaz (2) void interrupt TEC(){ /* leer código del puerto 0x60 */ /* traducir código */ /* colocarlo en el “buffer” */ outportb(0x20,0x20); } void interrupt TEC_irq9(){ static char flag=0; char t; t=inportb(0x60); switch (t){ case 42: flag=1; break; /* mayusculas */ case -86: flag=0; break; case 56: flag=2; break; /* alt */ case -72: flag=0; break; case 29: flag=3; break; /* control */ case -99: flag=0; break; default :{ if (t>0){ t=tabla[t][flag]; switch (t){ case 1: { QUIT=1; break; } case 5: { TERM_siguiente(); break; } default:{ TEC_procesar_tecla(t); } } } } } outportb(0x20,0x20); } Teclado, interfaz (3) #include <dos.h> int *p=(int *)MK_FP(0,36); … asm cli; *p=FP_OFF(TEC_irq9); *(p+1)=FP_SEG(TEC_irq9); asm sti; char tabla[117][4]={ 0, 0, 0, 0, 27, 0, 0, 0, 49, 33, 124, 0, 50, 34, 64, 0, 51, 0, 35, 0, 52, 36, 126, 0, 53, 37, 0, 0, 54, 38, 0, 0, 55, 47, 0, 0, 56, 40, 0, 0, 57, 41, 0, 0, 48, 61, 0, 0, 39, 63, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 113, 81, 0, 1, 119, 87, 0, 2, …. t=inportb(0x60); t=tabla[flag][t]; Programación mediante BIOS AH=0x03; L=0x05; BL=frec; BH=ret. 00H 01 02 03 04 05 06 07 08 09 0A 30.0 26.7 24.0 21.8 20.0 18.5 17.1 16.0 15.0 13.3 12.0 0BH 0C 0D 0E 0F 10 11 12 13 14 15 10.9 10.0 9.2 8.6 8.0 7.5 6.7 6.0 5.5 5.0 4.6 16H 17 18 19 1A 1B 1C 1D 1E 1F 20 4.3 4.0 3.7 3.3 3.0 2.7 2.5 2.3 2.1 2.0 Res. 00H 250 ms 01 500 02 750 03 1000 Programación mediante BIOS #include <stdio.h> #include <dos.h> main(){ union REGS pseudo; /* AH|AL */ pseudo.h.al=0x05; /* ------- */ pseudo.h.ah=0x03; /* AX */ pseudo.h.bl=0; pseudo.h.bh=0; int86(0x16,&pseudo,&pseudo); return(0); } Ergonomía Teclado Sholes, 1876 Ergonomía Teclado Dvorak, 1930 Ergonomía Mejor teclado Terminales o Locales o remotos o Pasivos o activos o Por interfaz de memoria, puerto serie o red o Textuales o gráficos o Modo canónico (a línea con confirmación) o modo no canónico (o inmediato) Terminal ANSI Termcap, terminfo, curses (1) o termcap es una base de datos y librería para acceder a esa base de datos o termcap contiene las descripciones de miles de terminales distintos o Estas descripciones incluyen información sobre las capacidades del terminal y forma de activarlas Termcap, terminfo, curses (2) http://www.catb.org/~esr/terminfo/termtypes.master.gz Termcap, terminfo, curses (3) o “curses.h” es una librería UNIX para definir ventanas, escribir en ellas, leer de teclado, cambiar atributos, etc. o Existe una capa de más alto nivel implementada en “panel.h o ”curses.h” es fácil de portar a otros sistemas. Esto permite portar los programas que se apoyen en ella Programación en “curses”, 1 Programación en “curses”, 2 Ejemplo de implementación (1) o En el AT la memoria de video en modo 80x25, color, se corresponde con la dirección física 0xb8000000 o Cada carácter se codifica en dos bytes: el carácter en sí y el atributo o El byte de atributos se divide en texto y fondo Ejemplo de implementación (2) o El byte que codifica el carácter indexa una tabla que se encuentra en ROM o Cada entrada de la tabla es un conjunto de 16 bytes, que forma una matriz de 16*8 bits que codifican el dibujo del carácter asociado o Esta tabla puede copiarse a RAM, modificarse y usarse Ejemplo de implementación (3) o El byte de atributos (cada una de sus partes) indexa una tabla de 16 entradas o Cada una de esas entradas indexa una tabla de 256 entradas o Cada una de esas 256 codifica el trío RVA que especifica el color