La función keep es una llamada a la interrupción 32 del DOS que deja residente el programa en ejecución.Cuando un programa termina normalmente, el DOS libera toda la memoria utilizada y reestablece cualquier vector de interrupción que haya sido modificado.Cuando un programa termina con la llamada a la interrupción 32, en cambio,la memoria especificada al llamar a la función no es liberada y los vectores de interrupción que hayan sido modificados no son reestablecidos.Normalmente, entonces, los programas residentes modifican una interrupción; cada vez que un programa llama a la interrupción se ejecuta la parte del código del programa residente que controla esa interrupción,simulando que ambos programas corren simultáneamente. El programa de ejemplo que te envío ocupa una interrupción que, a mi parecer, los programadores del DOS dejaron a propósito para que uno la modificara: la interrupción de reloj. El reloj emite una interrupción que no hace nada 18,2 veces por segundo. Vamos a modificarla para que escriba una carita que rebote por la pantalla. El número de la interrupción de reloj (CLOK_TIC) es 1CH. #include "dos.h" #define MK_FP(seg,off) (void far *) (((unsigned long)seg<<16) + (unsigned) off) #define CLOCK_TIC 0x1C #define position(x,y) (y+1)*80 + (x+1) void interrupt carita(){ static int counter=0,x=2,y=2,down=1,right=1; static unsigned int buffer=0; unsigned far *screen=MK_FP(0xB800,0); if(counter==1){ disable(); buffer=screen[position(x,y)]; screen[position(x,y)]=(buffer & 0xFF00) + 1; if(x==79) right=0; if(x==1) right=1; if(y==23) down=0; if(y==1) down=1; } if(counter==2){ screen[position(x,y)]=buffer; right ? x++:x--; down ? y++:y--; counter=0; enable(); } counter++; } main(){ setvect(CLOCK_TIC,carita); keep(0,(_SS + (_SP/16) -_psp) +1 ); } Algunas consideraciones.Los manipuladores de interrupción normalmente no pueden llamar a otras interrupciones,por lo que funciones como printf están descartadas. La manera de escribir en la pantalla es colocar los datos directamente en la memoria; la dirección de la memoria de pantalla suele ser B800:000 h.Defino posición para trabajar cómodamente con el arreglo de pantalla, aunque seguramente una matriz de 80x25 también hubiera servido.En la pantalla de texto,los carácteres están representados como enteros, con un byte de atributo y un byte del código ASCII.La idea es imprimir la carita conservando el atributo;se consigue haciendo un AND con un número que tiene puros unos en el primer byte y ceros en el segundo,y sumándole el carácter carita,1.En realidad, la pelota es el 7.Respecto al cálculo de keep,el primer argumento es el código que retornará el programa una vez ejecutado; los programas saludables retornan 0. El segundo es, a mi entender, el largo del programa (segmento de stack + puntero al stack/16 - la dirección del psp + un byte por si las moscas).El cálculo se hace siempre igual, por lo menos para programas compilados en modelo Tiny.Ah,MK_FP existe; en mi compilador está definida erróneamente. Prueba a borrarla.