Manejo de modos de video e interrupciones de mouse

August 13, 2007 – 9:55 pm

Este es un ejercicio que realicé para Informática II. En principio solo nos pidieron que utilicemos interrupciones de video para cambiar el modo (de video), yo quise hacerlo un poco más interesante, en el ejemplo que les propongo aquí debajo vamos a utilizar:

 

 

  • Interrupciones de Video.
  • Acceso de Lectura/Escritura a disco.
  • Interrupciones de Mouse.
  • Funciones.
  • Argumentos de Main (osea argumentos por línea de sistema).

El programa inicia el modo de video (640x 480) y permite al usuario utlizar el mouse. El usuario presionando el botón izquierdo del mouse puede dibujar. El programa NO permite borrar. Presionando las teclas del “1″ al “5″ permite cambiar el color del lapiz. Una vez dibujado, el usuario puede guardar el dibujo en el disco presionando “S” (S mayuscula). Luego permite leer el archivo del dibujo. El archivo en el cual se guarda el dibujo no es de ningún formato específico. Solo hace una lectura de cada pixel de la pantalla y lo guarda en la posición adecuada dentro del archivo. El soft requiere el ingreso de la opción por línea de sistema:

 

Sintaxis:

Para guardar un dibujo en el archivo “midibu.dat” debes hacer:
c:\> dibuja.exe -s midibu.dat

Luego para leer el dibujo del archivo “midibu.dat” debes hacer:
c:\> dibuja.exe -r midibu.dat

Aca tienen el Codigo fuente del algoritmo

 

 

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>

#define MODO_TEXTO 0X03
#define MODO_VGA 0X12
#define VERDE 0×0A
#define NEGRO 0×00
#define BLANCO 0×0F
#define ROJO 0X0C
#define PIXEL 307200

void modo(int);
void punto (unsigned int,unsigned int,unsigned char);
void guardar (FILE *);
void mostrar (FILE *);

main (int argc, char *argv[]) {
unsigned int Px,Py,x,y;
unsigned char COLOR_ANT,tecla;
unsigned long cont;

union REGS r;
FILE *fp;

if (argc !=3) {
printf ("\nFaltan argumentos.");
printf ("\nUse : dibuja -[funcion] archivo");
printf ("\n-r muestra en pantalla el archivo");
printf ("\n-s guarda en archivo la imagen al presionar s");
exit (0);
}
if (!strcmp (argv[1],"-r")) {
if ((fp=fopen(argv[2],"rb"))==NULL) {
printf ("\nEl archivo especificado no exite.\n");
exit (0);
}
}

if (!strcmp (argv[1],"-s")) {
if ((fp=fopen(argv[2],"wb"))==NULL) {
printf ("\nNo se pudo crear archivo.\n");
exit (0);
}
}

modo (MODO_VGA);
delay(1500);

//r.x.ax=0×00; // mouse en el centro de la pantalla
//int86(0×33,&amp;r,&amp;r);

while (!kbhit()) {

r.x.ax=0×0b;
int86(0×33,&amp;r,&amp;r);
x += (int)r.x.cx;
y += (int)r.x.dx;
if (x<0) x=0;
if (y<0) y=0;
if (x>639) x=639;
if (y>479) y=479;
r.h.ah=0×0D;
r.x.dx=Px;
r.x.cx=Py;
int86(0×10,&amp;r,&amp;r);
COLOR_ANT=r.h.al;
punto(x,y,ROJO);
r.x.ax=0×03;
int86(0×33,&amp;r,&amp;r);
if(r.x.bx) punto(x,y,BLANCO);

if (((Px != x ) ||( Py != y)) &amp;&amp; !r.x.bx) punto(Px,Py,COLOR_ANT);
Px=x;
Py=y;

}//while
tecla=getch();
if ((tecla==’s’) &amp;&amp; (!strcmp (argv[1],"-s"))) guardar (fp);
else printf ("algo salio mal1,%c ",tecla);

if ((tecla==‘r’) &amp;&amp; (!strcmp (argv[1],"-r"))) mostrar (fp);
else printf ("algo salio mal2,%c", tecla);
getch();
modo (MODO_TEXTO);

}//main

void guardar (FILE *fp) {
unsigned long cont;
union REGS r;

for (cont=0;cont<PIXEL;cont++) {
r.h.ah=0×0D;
r.x.dx=cont;
int86(0×10,&amp;r,&amp;r);
fputc (r.h.al,fp);
}

if (!ferror(fp) &amp;&amp; !fclose(fp)) printf ("\nEl archivo se guardo correctamente");
else printf ("\nError al guardar archivo");
getch();
exit(0);
}

void mostrar (FILE *fp) {
unsigned long cont;
char car;
union REGS r;

car=fgetc(fp);
for (cont=0;cont<PIXEL;cont++) {
r.h.ah=0×0C;
r.x.dx=cont;
int86(0×10,&amp;r,&amp;r);
r.h.al=car;
car=fgetc(fp);
}
exit(0);
}

void punto (unsigned int X,unsigned int Y,unsigned char color)
{
union REGS r;
r.h.ah=0×0C;
r.h.bh=0×00;
r.h.al=color;
r.x.dx=Y;
r.x.cx=X;
int86(0×10,&amp;r,&amp;r);
}

void modo(int MODO)
{
union REGS r;
r.h.ah=0;
r.h.bh=0;
r.h.al=MODO;
int86(0×10,&amp;r,&amp;r);
}
 

  1. 3 Responses to “Manejo de modos de video e interrupciones de mouse”

  2. disculpa pero porque sale error en union REGS r

    By jose on Jun 22, 2008

  3. jose, hace mucho que no pruebo el ejemplo, por lo que sabia estaba andando.. proba bajarte el borland desde http://www.clasespart.com.ar/archivos/tc.zip y proba nuevamente, cualquier cosa decime. saludos

    By Gabriel on Jun 24, 2008

  4. Hola! Jose: Puede ser que estés tratando de compilar con el Borland C++ 5.x y por eso no te reconoce el tipo REGS. Sucede que este tipo de dato es para compiladores Borland de 16 bits (lo probé en Turbo C 3.0 y compiló bien).
    Un Saludo.

    By Adrian on Jul 13, 2008

Post a Comment