Teclados y terminales
Entrada/Salida Un terminal es un sistema de
Entrada/Salida
Entrada -> Teclado, Ratón, Tableta digitalizadora…
Salida -> Pantalla, Impresora, Plotter…
Tipos de Terminales
Interfaz mapeada a memoria Orientado a carácter Orientado a pixel
Interfaz vía red (serie, ethernet, etc.) Tipo tty Tipo “inteligente”
Teclado, construcción física El teclado es esencialmente una
matriz en cuyos nodos puede cerrarse un contacto eléctrico.
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 pulsaciones0/50º operación-20/-60º almacenaje
Teclado, comunicación El teclado envía el número asociado a
la tecla si un semáforo hardware “ad hoc” se lo permite.
El número se envía bit a bit, en serie. Los bits se acumulan en un registro.
Cuando el registro se llena, se comunica una interrupción al CPI.
Teclado, interfaz (1)
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
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
00H 30.0 0BH 10.9 16H 4.301 26.7 0C 10.0 17 4.002 24.0 0D 9.2 18 3.703 21.8 0E 8.6 19 3.304 20.0 0F 8.0 1A 3.005 18.5 10 7.5 1B 2.706 17.1 11 6.7 1C 2.507 16.0 12 6.0 1D 2.308 15.0 13 5.5 1E 2.109 13.3 14 5.0 1F 2.00A 12.0 15 4.6 20 Res.
AH=0x03; L=0x05; BL=frec; BH=ret.
00H 250 ms01 50002 75003 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 Locales o remotos Pasivos o activos Por interfaz de memoria, puerto serie
o red Textuales o gráficos Modo canónico (a línea con
confirmación) o modo no canónico (o inmediato)
Terminal ANSI
Termcap, terminfo, curses (1) termcap es una base de datos y
librería para acceder a esa base de datos
termcap contiene las descripciones de miles de terminales distintos
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) “curses.h” es una librería UNIX para
definir ventanas, escribir en ellas, leer de teclado, cambiar atributos, etc.
Existe una capa de más alto nivel implementada en “panel.h
”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) En el AT la memoria de video en modo
80x25, color, se corresponde con la dirección física 0xb8000000
Cada carácter se codifica en dos bytes: el carácter en sí y el atributo
El byte de atributos se divide en texto y fondo
Ejemplo de implementación (2) El byte que codifica el carácter indexa
una tabla que se encuentra en ROM 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
Esta tabla puede copiarse a RAM, modificarse y usarse
Ejemplo de implementación (3) El byte de atributos (cada una de sus
partes) indexa una tabla de 16 entradas
Cada una de esas entradas indexa una tabla de 256 entradas
Cada una de esas 256 codifica el trío RVA que especifica el color