agenda/SM2.CPP
2021-09-03 17:09:36 +02:00

262 lines
7.2 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Demostraci¢n del uso del RATON en SVGA
// Jos David Guilln
//
// ßßßßßßßßßßßßßßß
// ßFuTuReßViSiOnß
// ßßßßßßßßßßßßßßß
// ßßÜÜÜÜÜßÜÜÜßßßß
// ßß ÛßÛ ßÜßß
// ßßÜ ÛßÛ Ûßß
// ßßßÜÜÜßßÛÜÜß ßß
//
//
//
#include <dos.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;
unsigned char *Fondo_Raton;
int X_Mouse, Y_Mouse;
int Anclar_Raton(void);
void Inicializa_Raton(int x1, int y1, int x2, int y2);
unsigned char Pon_Pixel( unsigned long y, unsigned long x, unsigned char color );
void main( void )
{
char Resultado;
InicializaSVGA();
PreparaCuadricula256col();
Inicializa_Raton( 10, 10, 630, 470);
if ( !raton ) 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" );
}
// los par metros son las cotas para el raton
void Inicializa_Raton(int x1, int y1, int x2, int y2)
{
int px = 50, py = 50;
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;
int86(0x33, &ent, &ent);
}
}
// 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,j;
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 )
{
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 ] );
}
}
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 ] );
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);
initgraph(&Gd,&Gm,"");
errorcode = graphresult();
if (errorcode != grOk)
{
cprintf("Graphics error: %s\n", grapherrormsg(errorcode));
cprintf("Presione una tecla para finalizar:");
getch();
exit(1);
}
}
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++;
}
}