C/Visual C - ¡ Para algún sabio !

 
Vista:

¡ Para algún sabio !

Publicado por Alejandro Tomé (14 intervenciones) el 18/08/2000 00:00:00
Hola a todos. Alguien me puede explicar las partes del FAR, que es ese hexadecimal y que indica el atributo de texel_struc.
Gracias desde ya.

#define screen (* screen_ptr )
/* Definicion de estructuras del programa para la pantalla */
typedef struct texel_struc {
unsigned char ch; /* Caracter de pantalla */
unsigned char attr; /* attributo de pantalla */
} texel;

typedef texel screen_array[25][80];
screen_array far *screen_ptr = (screen_array far *) 0xB8000000L;

struct texel_struc pantalla[25][80];

void salva_pantalla( void )
{
int x, y;
for ( x = 0 ; x <= 25; x++ )
for ( y = 0 ; y <= 80 ; y++ ){
pantalla[ y ][ x ].ch = screen[y][x].ch;
pantalla[ y ][ x ].attr = screen[y][x].attr;
}
}

void restaura_pantalla( void )
{
int x, y;
for ( x = 0 ; x <= 25; x++ ) {
for ( y = 0 ; y <= 80 ; y++ ) {
screen[ y ][ x ].ch = pantalla[y][x].ch;
screen[ y ][ x ].attr = pantalla[y][x].attr;
}
}

void main()
{
/* lo que se guarda en memoria */
clrscr();
printf("Prueba de\n"); printf("SAVESCREEN");
/* salvo la pantalla en memoria */
salva_pantalla(); getch();
clrscr();printf("Presione una tecla"); getch();
/* restauro la pantalla guarda en memoria */
restaura_pantalla(); getch();
}
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

RE:¡ Para algún sabio !

Publicado por Endos (143 intervenciones) el 18/08/2000 00:00:00
Esto "screen_array far *screen_ptr = (screen_array far *) 0xB8000000L;"
no es otra cosa que un puntero a la memoria de video en modos de texto.
En estos modos se guardan dos bytes por cada caracter: uno por el propio
caracter y otro por su atributo, que no es otra cosa que su color.
Eso es exactamente lo que se guarda o lee en "struct texel_struc".
El video en este modo tiene una resolucion de 80x25 caracteres, de ahi
el tamaño del arreglo de estructuras "texel_struc".
El uso de "far" es necesario en compiladores de 16bits para accesar zonas
de memoria fuera de nuestro actual segmento de memoria.

Saludos,
Endos.
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:¡ Para algún sabio !

Publicado por Alejandro Tomé (14 intervenciones) el 18/08/2000 00:00:00
Gracias por tu respuesta.
Necesito preguntarte una cosa mas.
Si deseo grabar más de 1 pantalla, ¿que sucede? Como apunta a 0xB8000000L, ¿significa que siempre se superpondrán las pantallas y me quedará la última? o estoy equivocado. Si estoy equivocado, ¿debería crear mas punteros FAR para las otras pantallas o como debo hacer?
Desde ya muchas gracias.
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:¡ Para algún sabio !

Publicado por Endos (143 intervenciones) el 18/08/2000 00:00:00
Si deseas grabar mas de una pantalla lo que tendras que hacer es aumentar
el tamaño de los arreglos. Aunque no lo tengo comprobado, lo logico es que
la siguiente pagina empiece justo detras de la ultima linea de la actual, asi
que solo habra que multiplicar el numero de lineas por el numero de paginas
que deseamos usar:

Algo asi como: screen_array[25*NumeroPaginas][80];
Y asi con todos los arreglos que intervengan, leyendo o escribiendo
el numero adecuado de bytes tambien cambiando el tamaño del bucle:

for ( x = 0 ; x <= 25*NumeroPaginas; x++ )

Saludos,
Endos
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