Se desea implementar un Screen Saver que funciona de la siguiente forma:
• Si transcurren 30 segundos sin oprimirse ninguna tecla, se blanquea la
pantalla.
• Al oprimir cualquier tecla, la misma se restaura.
Se dispone de un timer que genera una interrupción cada 0.1 ms invocando la rutina
TIMER. Cada vez que se oprime una tecla se genera una interrupción que invoca la
rutina TECLADO.
La pantalla esta mapeada en memoria a partir de la dirección de memoria
PANTALLA. El tamaño de la pantalla es de 80 columnas x 25 filas. Cada carácter en
pantalla esta representado en 16 bits de la siguiente forma:
8 bits 8 bits
A |B
A = Codificación en ASCII del carácter.
B = Atributo.
El atributo normal es 07h. El carácter espacio es 20h.
Mi primer duda es sobre que es el atributo?
Mi segunda duda es para colocar en bx la dirección 0B000:0800,
es correcto hacer esto:
mov es,B000
mov bx, es:[0800].
Comparto el código en alto nivel para ver si es correcta mi idea de como se blanquea la pantalla y como se restaura luego:
short int aux[2000];
int tics=0;
bool tecla = true;
bool restaurar = false;
bool blanquiar = false;
void main(){
//instalo rutinas de interrupción
enable();
while (true){
if (blanquiar){
disable(); int h=0;
for (int i=0; i<25; i++)
for (int j=0 ; j<80;j++){
//guardo el contexto
aux[h] = mem[PANTALLA +80*i +j];
//pongo espacio en blanco 8199=2007h
mem[PANTALLA +80*i +j] = 8199;
h++;
}
enable();
}
if (restaurar){
disable(); int h=0;
for (int i=0; i<25; i++)
for (int j=0 ; j<80;j++){
mem[PANTALLA +80*i +j] =aux[h];
h++;
}
enable();
}
}
}
void TECLADO(){
tecla = true;
}
void TIMER(){
tics++;
if ((blanquiar)&&(tecla)){
tecla = false;
blanquiar = false;
tics=0;
restaurar = true;}
else if ((!tecla)&&(tics>=300000)
blanquiar =true;
}
Agradezco si me pueden contestar las preguntas que hice anteriormente y si es correcto como implemente las rutinas en alto nivel.
Saludos