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? 
+ 
+ 
+![screenshot](/SMOUSE.png "Screenshot") 
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