C/Visual C - ¿Cómo hacer programas residentes en memoria?

 
Vista:

¿Cómo hacer programas residentes en memoria?

Publicado por Luciano (1 intervención) el 08/07/2000 00:00:00
Hola!
¿Me podrían decir como hacer programas recidentes en memoria con C??
O si me pueden enviar un curso de como hacerlo, mejor.
Muchas gracias :-)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Un ejemplo: Pelota.c

Publicado por Fabián Sierra Carvajal (59 intervenciones) el 12/07/2000 00:00:00
Lo primero que debes tener claro es que "programa residente en memoria" es un concepto exclusivo del DOS; es decir, en Windows no funcionará, salvo en una ventana DOS.

Primero,la teoría. Cuando un programa termina su ejecución, normalmente DOS lo borra de la memoria (permite a otros escribir sobre él). Un programa residente es uno que le solicita al DOS que no lo borre al terminar, mediante un servicio que DOS ofrece a través de una interrupción, y que ciertos compiladores de C ofrecen como una función,keep o dos_keep. Sin embargo, que el programa esté en memoria no significa que esté ejecutándose. (Mal que mal, cuando DOS accedió a su petición,su ejecución terminó.) Los programas residentes normalmente capturan una iterrupción, es decir, reemplazan el código que se ejecuta al ser llamada la interrupción por parte de su propio código. (No es exactamente así; en realidad se modifica la dirección correspondiente de la tabla de manipuladores de interrupción). Para esto también existe un servicio, proporcionado por el DOS, que es enmascarado por los compiladores (algunos) como setvect.
La rutina que manejará la interrupción NO PUEDE CONTENER LLAMADAS A INTERRUPCIONES, por lo que suele trabajar a muy bajo nivel. Para realizar la salida a pantalla, por ejemplo, no puede utilizar printf, pues esta llama a interrupciones.

A continuación, un pequeño programa mío, Pelota.c,
que deja una pelota rebotando en la pantalla. Fue escrito para el compilador TurboC 2.0, de Borland.
/*

Fabián Sierra C. - 1999

Demostración de programa residente en memoria.

Notas:
1-Este es un tema avanz
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

eres el hermano de la cecilia?

Publicado por mauricio (1 intervención) el 06/02/2008 05:53:13
si eres el hermano de la cecilia, escribeme, soy el negro parra

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pelota.c (No alcanzó antes)

Publicado por Fabián Sierra Carvajal (59 intervenciones) el 12/07/2000 00:00:00
A continuación, un pequeño programa mío, Pelota.c,
que deja una pelota rebotando en la pantalla. Fue escrito para el compilador TurboC 2.0, de Borland.
/*

Fabián Sierra C. - 1999

Demostración de programa residente en memoria.

Notas:
1-Este es un tema avanzado de programación para DOS.El resultado
probable de modificar este programa será botar el computador.

2-Es recomendable compilar el programa en modelo Tiny,para que ocupe
menos memoria.

3-Se debe generar el ejecutable del programa con F9, pero no con
Control-F9,es decir, no se debe intentar ejecutarlo desde el entorno
del TurboC,sino desde el DOS puro o bajo Windows.

*/

#include "dos.h"

/*
Esta macro est ya definida en dos.h .Sin embargo, algunas versiones
del TurboC traen una definici¢n incorrecta,por lo que la he redefinido.
De cualquier modo, se encuentra en la ayuda del TurboC.
*/
#define MK_FP(seg,off) (void far *) (((unsigned long)seg<<16) | (off))



/*Uso esta macro para simular una matriz
usando un vector*/

#define pos(x,y) y*80 + x


/*Controlo el tamaño del heap y el stack,
para lograr un ejecutable más pequeño. Esto no
es indispensable*/

extern unsigned _stklen=1024;
extern unsigned _heaplen=1024;


/*Esta será la rutina que será llamada al invocar
la interrupción de reloj*/

void interrupt pelota(void){
int far *pantalla;
static int x=2,y=2,turno=0,anterior,bajar=1,derecha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pelota.C : Final

Publicado por Fabián Sierra Carvajal (59 intervenciones) el 12/07/2000 00:00:00
void interrupt pelota(void){
int far *pantalla;
static int x=2,y=2,turno=0,anterior,bajar=1,derecha=1;

/*Declaro un puntero a la memoria de pantalla*/

pantalla=MK_FP(0xB800,0);
if(turno ==0){
/*Guardo lo que había en la pantalla*/
anterior=pantalla[pos(x,y)];
/*Pongo en la pantalla el carácter 7,
que es una pelota, y conservo el atributo o color*/
pantalla[pos(x,y)]=(pantalla[pos(x,y)] & 0xFF00) + 7;
turno++;
}

else{
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--;
}
}



int main(){
/*En la dirección de memoria H1C, correspondiente
a la interrupción de reloj, pongo mi rutina*/
setvect(0x1C,pelota);

/*Termino permaneciendo residente*/
/*La fórmula es bien enredada. Se hace siempre igual*/
keep(0,(_SS + (_SP/16) -_psp)+1);
}

¡Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pelota.C : Final

Publicado por Blanca (1 intervención) el 26/02/2009 16:36:03
Como le harías para que desde un edificio cayera la pelota y rebotara pero que esta vaya disminuyendo su velocidad hasta quedar estatica.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar