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.