commit 637165a9ad1ccaa20b827d0f25433a7f16f38152 Author: jdg <jd@infdj.com> Date: Wed Sep 8 21:39:44 2021 +0200 First commit 28/06/1997 diff --git a/README.md b/README.md new file mode 100644 index 0000000..64c9bf8 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#SMOUSE + + +*28/06/1997* + +ToDo: wwtcf? + + + diff --git a/SMOUSE.CPP b/SMOUSE.CPP new file mode 100644 index 0000000..e36ea1a --- /dev/null +++ b/SMOUSE.CPP @@ -0,0 +1,339 @@ +// 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 <dos.h> +#include <alloc.h> +#include <conio.h> +#include <stdlib.h> +#include <graphics.h> + +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++; + } + + } diff --git a/SMOUSE.EXE b/SMOUSE.EXE new file mode 100644 index 0000000..586ab2c Binary files /dev/null and b/SMOUSE.EXE differ diff --git a/SMOUSE.OBJ b/SMOUSE.OBJ new file mode 100644 index 0000000..a3c8382 Binary files /dev/null and b/SMOUSE.OBJ differ diff --git a/SVGA256.BGI b/SVGA256.BGI new file mode 100644 index 0000000..2fe11ab Binary files /dev/null and b/SVGA256.BGI differ