First commit 28/06/1997

This commit is contained in:
José David Guillén 2021-09-08 21:39:44 +02:00
commit 637165a9ad
5 changed files with 348 additions and 0 deletions

9
README.md Normal file
View File

@ -0,0 +1,9 @@
#SMOUSE
*28/06/1997*
ToDo: wwtcf?
![screenshot](/SMOUSE.png "Screenshot")

339
SMOUSE.CPP Normal file
View File

@ -0,0 +1,339 @@
// Demostraci¢n del uso del RATON en SVGA
// Jos David Guilln
//
// ßßßßßßßßßßßßßßß
// ß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++;
}
}

BIN
SMOUSE.EXE Normal file

Binary file not shown.

BIN
SMOUSE.OBJ Normal file

Binary file not shown.

BIN
SVGA256.BGI Normal file

Binary file not shown.