PDA

Ver la Versión Completa : Modo de Video en Consola Windows


LordGarfio
04-07-2007, 20:17:08
En Microsoft Visual C++ v6 escribí un pequeño trozo de código para consola Windows la cual me debe permitir cambiar el modo gráfico a 320x200 sin exito, pues, el sistema me muestra la pantalla Azul diciéndome que se ha producido un Fallo de Protección General.... durante la ejecución. :(

El trozo de código que se encarga de tal camio es el siguiente:

( Utilizando la directiva: _asm directive )
xor ah,ah
mov al,0x13h ; Poner el Modo de Video a 320x200 pixeles.
int 10h ; Llamar a la interrucción 0x10 de la Bios.

El trozo de código de arriba funciona perfectamente compilando con el Watcom C++.

¿ Alguien sabe como puedo cambiar el video a 320x200 utilizando la BIOS en una aplicación de consola bajo Windows ?

Saludos.

courtois
05-07-2007, 08:02:48
no puedes ejecutar una interrupción de hardware de esa forma en modo protegido dentro de windows, solo en modo real, de cualquier forma para cambiar las propiedades de la consola debes usar la api de windows checate como funciona SetConsoleTextAttribute

Ñuño Martínez
05-07-2007, 08:58:03
¿ Alguien sabe como puedo cambiar el video a 320x200 utilizando la BIOS en una aplicación de consola bajo Windows ?Como ya ha dicho curtois, no se puede porque la BIOS está protegida al acceso directo. Te recomiendo que, para esos menesteres, utilices Allegro (http://alleg.sf.net) (o Allegro.pas (http://allegro-pas.sf.net)).

LordGarfio
05-07-2007, 18:34:00
Gracias chicos por vuestra ayuda.

Ya veo que no puede hacer una llamada a la Interrupción 0x10h desde el Modo Protegido en Windows, usando el Microsoft Visual C++ :confused:

¿ Qué hace el Watcom C++ entonces ? que no da ningún problema.

Estuve mirando esta página para intentar aclararme: http://www.missl.cs.umd.edu/winint/index1.html

En mi aplicación despues de poner el video en consola a 320x200 pixeles, cargo una gráfico y lo pinto en pantalla escribiendo en la siguiente dirección:

BYTE *memVideo = (BYTE *) 0xA0000;

De todas maneras si se os ocurre algo, aconsejarme. ;)

Saludos.

courtois
06-07-2007, 01:11:29
No se por que me dio la impresión que querias escribir texto en 320x200, pero en fin, por lo que puedo ver, dado que es asm de 16 bits lo que ejecutas asumo que el exe que generas realmente es para ms-dos, cuando ejecutas exe de ms-dos en windows, se activa el subsistema de 16 bits, con una ventana de ms-dos que usa una cpu virtual y media entre el sistema y la aplicacion, asi que es windows y no watcom c++ quien hace que esto funcione, obviamente no funciona con vc++ porque este solo genera exes de consola de 32 bits para windows, y en ese modo una instruccion asi no es permitida, igualmente si compilaras tu aplicación con watcom para que te genere un exe de consola de windows, no funcionaría, ahora, no se para que desees usar cga estando dentro de windows, teniendo muchas opciones para dibujar como la api de windows, opengl o directdraw, y si usas delphi además las clases y métodos del canvas.
saludos :)

Ñuño Martínez
06-07-2007, 08:23:32
Ya veo que estás más perdido que un pulpo en un garaje (creo que tendré que cambiar mi status :D )
Ya veo que no puede hacer una llamada a la Interrupción 0x10h desde el Modo Protegido en Windows, usando el Microsoft Visual C++ :confused:

¿ Qué hace el Watcom C++ entonces ? que no da ningún problema.Hacer no hace nada que no haga MS-Visual C++. Lo que pasa es que, como ha explicado courtois perfectamente, Watcom C++ es un compilador para DOS, que es un sistema operativo total, completa e inequívocamente distinto a MS-Windows, aunque este es capaz de emularlo en ciertas condiciones. Es cierto que Windows utiliza (en principio) el mismo vector de interrupciones que DOS (como también lo hacen OS/2, GNU/Linux para PC, etc., pero no MacOS X, GNU/Linux, BeOS...), pero utilizar interrupciones BIOS en un SO que no sea DOS es incómodo, innecesario y, casi siempre, peligroso.

Si estás interesado en saber el por qué, busca y leete el libro "Sistemas Operativos Modernos" de Andrew S. Tanenbaum. Te prevengo de que es un texto universitario así que preparate.

En mi aplicación despues de poner el video en consola a 320x200 pixeles, cargo una gráfico y lo pinto en pantalla escribiendo en la siguiente dirección:

BYTE *memVideo = (BYTE *) 0xA0000;

De todas maneras si se os ocurre algo, aconsejarme. ;)Me repito: utiliza Allegro (http://alleg.sf.net), no te arrepentirás. Te recomendaría OpenGL (http://www.opengl.org/) pero te veo muy principiante como para eso (No te lo tomes a mal, que yo también fui novato ;) ). Cuando tengas más mundo ya podrás pegarte con OpenGL.

Y si alguien te ofrece DirectX (o DirectDraw), sé valente y di: No, gracias. Que luego la desintoxicación sale cara :p ;) :D

LordGarfio
06-07-2007, 17:38:46
DIOS!, no quiero ver nada del Sr. Andrew S. Tanenbaum, ya tuve bastante con su libro de Redes de Computadores.

Gracias compañeros por vuestras ayudas :)

courtois
08-07-2007, 08:50:50
Y si alguien te ofrece DirectX (o DirectDraw), sé valente y di: No, gracias. Que luego la desintoxicación sale cara jajaja, vamos ñuño, si va de chulada eso, no le saques, mira que hay wrappers para delphi :D