// Demostraci¢n del uso del RATON en SVGA // Jos‚ David Guill‚n // // ßßßßßßßßßßßßßßß // ßFuTuReßViSiOnß // ßßßßßßßßßßßßßßß // ßßÜÜÜÜÜßÜÜÜßßßß // ßß ÛßÛ ßÜßß // ßßÜ ÛßÛ Ûßß // ßßßÜÜÜßßÛÜÜß ßß // // // // Como este fuente esta entero lleno de COMENTARIOS en el SM2.CPP, he // metido solo el c¢digo, si comentarios. // Una de las ventajas de tener de este modo de usar el raton // es que nuestro puntero tiene las dimensiones que nosotros // deseemos, y no estamos limitados a 16x16. // Crearse un puntero de raton es algo un poco pesado. // Lo mejor es mediante un programa de dibujo crearse el puntero // y luego cogerlo del dibujo directamente. ( Yo lo hago con .PCX's ) // Un truquito para dibujar el Puntero del RATON: // 1§ Lo dibujas con caracteres Semi-Gr ficos // 2§ Lo englobas en una matriz de caracteres ( punto, por ejemplos ); // 3§ Reemplazas cada caracter por el n§ de color que deseas que adopte. // ......Û.....................1 // .....Û±Û....................2 . 0 ( Color Invisible ) // ....Û±±±Û...................3 Û C1 // ...Û²±±±±Û..................4 ± C2 // ..Û²²±±±±±Û.................5 ² C3 // .Û²²±±±±±±±Û................6 // .ÛÛÛÛ±±±ÛÛÛÛ.....ÛÛÛÛÛÛÛÛ...7 // ....Û²±±Û.......Û±±±±±±±±Û..8 // ....Û²±±Û......Û±±±ÛÛÛÛ±±±Û.9 // ....Û²±±Û.....Û±±±Û....Û±±±Û- // ....Û²±±Û......Û±±Û....Û±±Û.1 // ...Û²±±±±Û......ÛÛ....Û±±Û..2 // ..Û²±±Û±±±Û..........Û±±Û...3 // .Û²±±Û.Û±±±Û........Û±±Û....4 // Û²±±Û...Û±±±Û......Û±±Û.....5 // ...................Û±±Û.....6 // ....................ÛÛ......7 // ............................8 // ....................ÛÛ......9 // ...................Û±±Û.....- // ....................ÛÛ......1 // 123456789-123456789-12345678 #include #include #include #include #include void InicializaSVGA(void); void PreparaCuadricula256col(void); extern int far _Cdecl Svga256_fdriver[]; int huge DetectVGA256(){ return 2; } #define T 255 #define C1 31 #define C2 4 #define C3 12 #define Ancho_Pantalla 640 #define Largo_Pantalla 640 unsigned char Puntero [ /* 21 * 28 */ ] = { T, T, T, T, T, T, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, T, T, T, T, C1, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, T, T, T, C1, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, T, T, C1, C3, C2, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, T, C1, C3, C3, C2, C2, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, C1, C3, C3, C2, C2, C2, C2, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, C1, C1, C1, C1, C2, C2, C2, C1, C1, C1, C1, T, T, T, T, T, C1, C1, C1, C1, C1, C1, C1, C1, T, T, T , T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, T, T, C1, C2, C2, C2, C2, C2, C2, C2, C2, C1, T, T , T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, T, C1, C2, C2, C2, C1, C1, C1, C1, C2, C2, C2, C1, T , T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, C1, C2, C2, C2, C1, T, T, T, T, C1, C2, C2, C2, C1 , T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, C1, C2, C2, C1, T , T, T, T, C1, C3, C2, C2, C2, C2, C1, T, T, T, T, T, T, C1, C1, T, T, T, T, C1, C2, C2, C1, T, T , T, T, C1, C3, C2, C2, C1, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T , T, C1, C3, C2, C2, C1, T, C1, C2, C2, C2, C1, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T , C1, C3, C2, C2, C1, T, T, T, C1, C2, C2, C2, C1, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, T , T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, T , T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C1, T, T, T, T, T, T , T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T , T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C1, T, T, T, T, T, T , T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, T , T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C1, T, T, T, T, T, T }; char raton = 0; // Indica si hay raton conectado unsigned char *Fondo_Raton;// En esta variable hemos de guardar lo que hab¡a al fondo // antes de pintar el rat¢n para conservarlo cuando lo movamos int X_Mouse, Y_Mouse; // Estas variables se cargan tras // regresar de Anclar_Raton, si // devuelven -1, no se puls¢ el RATON void Inicializa_Raton(int x1, int y1, int x2, int y2); int Anclar_Raton(void); unsigned char Pon_Pixel( unsigned long y, unsigned long x, unsigned char color ); void far *image; void far *Puntero_en_este_momento; void main( void ) { char Resultado; image = (void far *)farmalloc( 50*50 + 10 ); Puntero_en_este_momento = (void far *)farmalloc( 50*50 + 10 ); // Inicializamos el modo SVGA 640*480 256 c. ( VESA ) InicializaSVGA(); getimage( 100, 100, 150, 150, Puntero_en_este_momento ); PreparaCuadricula256col(); Inicializa_Raton( 10, 10, 630, 470); if ( !raton ) { closegraph(); cprintf( " Para este ejemplo se precisa Raton \n\r " ); return; } Resultado = Anclar_Raton(); // Regresamos al modo texto restorecrtmode(); if ( Resultado ) { if ( X_Mouse == Y_Mouse && Y_Mouse == -1 ) cprintf( " Se pulso una tecla, 1§Scan Code: % 3d \n\r", getch() ); else cprintf( " Se pulso un Boton en X: % 3d -- Y: % 3d \n\r", X_Mouse, Y_Mouse ); } else cprintf( " Error Interno de asignacion de memoria \n\r" ); farfree(image); } // los par metros son las cotas para el raton void Inicializa_Raton(int x1, int y1, int x2, int y2) { // Por defecto el raton aparecer  en las coordenadas ( 50, 50 ) int px = 50, py = 50; // Pero si Y_ y X_ tienen unas coordenadas el raton se posiciona alli. if ( Y_Mouse != -1 && X_Mouse != -1 ) { px = X_Mouse; py = Y_Mouse; } union REGS ent, sal; long dir; ent.x.ax = 0; int86(0x33, &ent, &sal); /* averigua si hay rat¢n conectado */ raton = sal.x.ax; /* indica a la variable global el estado del raton */ if(raton!=0) { ent.x.ax = 15; ent.x.cx = 5; ent.x.dx = 11; int86(0x33, &ent, &sal); /* fija la raz¢n mickey/pixel */ ent.x.ax = 7; ent.x.cx = x1; ent.x.dx = x2; int86(0x33, &ent, &sal); /* fija la posici¢n m x. y m¡n. horizontal */ ent.x.ax = 8; ent.x.cx = y1; ent.x.dx = y2; int86(0x33, &ent, &sal); /* fija la posici¢n m x. y m¡n. vertical */ ent.x.ax = 4; ent.x.cx = px; ent.x.dx = py; int86(0x33, &ent, &sal); /* fija la posici¢n del rat¢n */ ent.x.ax = 2; // Como sabes hacer esto, no sirve para nada int86(0x33, &ent, &ent); // por que el raton no se puede mostrar y por // deducion, tan poco ocultar. // Pero " Por si el modo no es SVGA ", lo ocultamos } } // Dado que aun no sabes como modificar una interrupci¢n creo que esta // rutina te dar  una idea mucho mas sencilla de como se gestiona el // raton en SVGA. // De esta funci¢n solo se regresa cuando se pulse una tecla o un Boton. // Devuelve 1 si todo va bien, o 0 si hay un error interno de gesti¢n. int Anclar_Raton(void) { char i=0,j=0; union REGS io; io.x.ax = 3; static int Old_X_Mouse = X_Mouse, Old_Y_Mouse = Y_Mouse; char ok = 0, Draw = 1; if ( ( Fondo_Raton = (char *)malloc( 28*21 ) ) == NULL ) return 0; do{ if( Draw ) { // Antes de dibujar el puntero capturamos lo que hay en ese trozo // de pantalla. // Luego Dibujamos el puntero; /* for( i = 0; i < 21; i++) for( j = 0; j < 28; j++ ) { Fondo_Raton[ i*28 + j ] = getpixel( (j + X_Mouse), (i + Y_Mouse) ); if( Puntero[ i*28 + j ] != 255 ) putpixel( (j + X_Mouse), (i + Y_Mouse), Puntero[ i*28 + j ] ); } */ getimage( (X_Mouse), (Y_Mouse), (X_Mouse)+50, (Y_Mouse)+50, image ); putimage( (X_Mouse), (Y_Mouse), Puntero_en_este_momento, COPY_PUT ); } Draw = 0; // Esperamos a que se mueva el raton / pulse un boton o una tecla do{ // Gestionamos las teclas if ( kbhit() ) { X_Mouse = Y_Mouse = -1; ok = 1; break; // Si no hay teclas, los par metros del RATON habr n cambiado } else { int86(0x33, &io, &io); // lee posici¢n y estados del bot¢n X_Mouse = io.x.cx; Y_Mouse = io.x.dx; // ¨ Se Puls¢ Un BOTON ? // B.Izquierdo B. Derecho if ( (io.x.bx & 1) != 0 || ( (io.x.bx >> 1) & 1 ) != 0 ) { ok = 1; break; } else /* ¨ Se movi¢ el Puntero ? */ if ( X_Mouse != Old_X_Mouse || Y_Mouse != Old_Y_Mouse ) { // Restauramos el contenido de la pantalla /* for( i = 0; i < 21; i++) for( j = 0; j < 28; j++ ) putpixel( ( j + Old_X_Mouse), (i + Old_Y_Mouse), Fondo_Raton[ i*28 + j ] ); */ putimage( (Old_X_Mouse), (Old_Y_Mouse), image, COPY_PUT ); Old_X_Mouse = X_Mouse; Old_Y_Mouse = Y_Mouse; Draw = 1; break; } } }while( 1 ); }while(!ok); // Restauramos el contenido de la pantalla for( i = 0; i < 21; i++) for( j = 0; j < 28; j++ ) putpixel( ( j + Old_X_Mouse), (i + Old_Y_Mouse), Fondo_Raton[ i*28 + j ] ); free( Fondo_Raton ); return 1; } void InicializaSVGA(void) { int Gd = DETECT, Gm; int Drv, errorcode; installuserdriver("Svga256",DetectVGA256); // registerfarbgidriver(Svga256_fdriver); initgraph(&Gd,&Gm,""); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { cprintf("Graphics error: %s\n", grapherrormsg(errorcode)); cprintf("Presione una tecla para finalizar:"); getch(); exit(1); /* return with error code */ } } void PreparaCuadricula256col(void) { int x, y, color = 0; for( y = 0; y < 16; y++ ) for( x = 0; x < 16; x++ ) { setcolor(color); setfillstyle( SOLID_FILL, color ); bar( 40*x, 30*y, 40+40*x+40, 30+30*y); color++; } }