Programas
Residentes



                Un programa residente es uno que está activo mientras
el DOS lo esté,aún cuando otro programa esté corriendo.Es útil
para,por ejemplo,capturar la entrada desde teclado antes de que
la reciba cualquier otro programa.Mis amigos hackers deben
estar pensando en...
                El modo como funciona un programa residente es
interceptando una interrupción.Muchos programas lo hacen,
pero el DOS borra de la memoria la rutina de manejo de inte-
rrupciones que hayan dejado al terminar el programa.Los
programas residentes no son borrados de la memoria.
Los programas usan una interrupción del DOS,la 32h,para
quedar residentes al terminar
Ejemplo :
/*Programa residente que deja una carita rebotando en pantalla*/
/*Para el TurboC de Borland*/
#include "dos.h"

#define MK_FP(seg,off) (void far *) (((unsigned long)seg<<16) | (off))
#define pos(x,y) y*80 + x
#DEFINE CLOCKTIC 0x1C

void interrupt pelota(void){
int far *pantalla;
static int x=2,y=2,turno=0,anterior,bajar=1,derecha=1;
pantalla=MK_FP(0xB800,0);
if(turno ==0){
/*Salva el contenido de la pantalla*/
anterior=pantalla[pos(x,y)];
/*Escribe el caracter pelota conservando el atributo*/
/*El atributo está en el primer byte.Si se hace un AND
con un número que sólo posee unos en su primer byte,
se conserva el atributo;y luego le sumo 7,el caracter pelota*/
 pantalla[pos(x,y)]=(pantalla[pos(x,y)] & 0xFF00) + 7;
 turno++;
}

else{
 /*El clásico algoritmo de rebote*/
 pantalla[pos(x,y)]=anterior;
 bajar ? y++:y--;
 derecha ? x++:x--;
 if(x == 2) derecha = 1;
 if(x >=77) derecha=0;
 if(y >=22) bajar=0;
 if(y == 2) bajar=1;
 turno--;
}
}
 
 

main(){
setvect(CLOCKTIC,pelota);   /*Establece a pelota como la nueva
                                               función de manejo de la interrupción
                                                de reloj*/
keep(0,(_SS + (_SP/16) -_psp)+1);/*Termina permaneciendo
                                                        residente,retornando 0
                                                        y de tamaño... la fórmula
                                                        es estándar*/

}

Por ahí debo tener una versión en Turbo Pascal.
 
 

Página Anterior