First commit 28/06/1997
This commit is contained in:
commit
637165a9ad
9
README.md
Normal file
9
README.md
Normal file
@ -0,0 +1,9 @@
|
||||
#SMOUSE
|
||||
|
||||
|
||||
*28/06/1997*
|
||||
|
||||
ToDo: wwtcf?
|
||||
|
||||
|
||||

|
339
SMOUSE.CPP
Normal file
339
SMOUSE.CPP
Normal file
@ -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++;
|
||||
}
|
||||
|
||||
}
|
BIN
SMOUSE.EXE
Normal file
BIN
SMOUSE.EXE
Normal file
Binary file not shown.
BIN
SMOUSE.OBJ
Normal file
BIN
SMOUSE.OBJ
Normal file
Binary file not shown.
BIN
SVGA256.BGI
Normal file
BIN
SVGA256.BGI
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user