TPV/N_MB.CPP
2021-09-08 21:44:52 +02:00

1208 lines
49 KiB
C++
Raw Permalink Blame History

/**************************************************************************\
|* *|
|* Make_Boton (orientado a objetos) *|
|* *|
|* Descripcion: *|
|* Este es mi viejo proyecto, que espero ver hecho realidad, *|
|* es Make Boton, en objeto. *|
|* *|
|* *|
|* *|
|* *|
|* *|
\**************************************************************************/
#include <alloc.h>
#include <graphics.h>
#include "N_MB.HH"
#define JD_imagesize(int left, int top, int right, int bottom) (( (left > right) ? (left - right + 1) : ( right - left + 1) )*( ( top > bottom) ? ( top - bottom + 1) : (bottom - top + 1) )+4)
/**************************************************************************\
|* *|
|* MBoton *|
|* *|
|* Descripcion: *|
|* Consturctir de clase, inicializa todos los datos necesarios *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
MBoton::MBoton()
{
NSecuencias = 0; // N<> de secuencias
True_Push = OFF; // Pulsado real ( apagado )
}
/**************************************************************************\
|* *|
|* MBoton *|
|* *|
|* Descripcion: *|
|* Desctuctor de clase *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
MBoton::~MBoton()
{
free( NBSecuencia );
farfree( Botones );
}
/**************************************************************************\
|* *|
|* ObtenNumero *|
|* *|
|* Descripcion: *|
|* Obtiene un numero del handle a fichero, y situa en ch el *|
|* <20>ltimo caracter leido *|
|* *|
|* Entradas: handle al fichero, recipiente donde guardar el caracter *|
|* *|
|* Salidas: n<>mero leido del fichero *|
|* *|
\**************************************************************************/
long MBoton::ObtenNumero( FILE *handle, char *ch )
{
long numero;
char signo = 1;
numero = 0;
*ch=fgetc(handle);
while ( *ch != EOL && *ch != EOF && *ch != ',' )
{
if ( *ch >= '0' && *ch <= '9') numero = ( numero*10 + *ch - '0' );
else if ( *ch == '-' ) signo = -1;
*ch = fgetc(handle);
}
return numero * signo;
}
/**************************************************************************\
|* *|
|* CargarObjetos *|
|* *|
|* Descripcion: *|
|* Carga los objetos del fichero, que se pasa como par<61>metro. *|
|* *|
|* Entradas: Fichero donde se encuentran los objetos *|
|* *|
|* Salidas: OK / ERROR *|
|* *|
\**************************************************************************/
int MBoton::CargarObjetos( char *file )
{
FILE *handle;
char ch;
unsigned int temp_num;
int SiZe_BoToN = 0;
int inc_Botones = -1;
// Abrimos el archivo especificado
if ( ( handle == fopen( file, "r" ) ) == NULL )
{
lError = 0x01; Error( lError );
return ERROR;
}
// Liberamos cualquier memoria previa.
if ( Botones != NULL )
farfree ( Botones );
if ( NBSecuencia != NULL )
free ( NBSecuencia );
// Ahora cribamos los datos del fichero, y cargamos en memoria
// todos aquellos que son DINAMICOS
ch=fgetc(handle); //Lee el primer caracter
while (ch!=EOF) //Lee hasta fin de fichero
{
switch ( ch )
{
// Comentarios
case '*':
while (ch!=EOL && ch!=EOF) ch=fgetc(handle);
break;
// N<>mero de secuencias
case '#':
Secuencias = ObtenNumero( handle, &ch );
if (( NBSecuencia = (int *) malloc( sizeof(int)*Secuencias ) ) == NULL)
{
fclose( handle );
lError = 0x05; Error( lError );
return ERROR;
}
break;
//Numero de Botones en la secuencia
case '!':
// Obtenemos la secuencia activa
temp_num = ObtenNumero( handle, &ch );
// N<>mero de botones para esa secuencia
NBSecuencia[ temp_num - 1 ] = ObtenNumero( handle, &ch );
SiZe_BoToN += ( sizeof( struct Make_Boton ) * NBSecuencia[ temp_num - 1 ] );
if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL)
{
fclose( handle );
lError = 0x05; Error( lError );
return ERROR;
}
break;
//C<>lculos del boton
case '$':
inc_Botones++;
Botones[ inc_Botones ]. Left = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Up = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Right = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Down = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Cdf = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Cb1 = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Cb2 = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Ab = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Pb = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Isc = ObtenNumero( handle, &ch );
Botones [inc_Botones]. Sc = ObtenNumero( handle, &ch );
break;
}
if (ch != EOF) ch = fgetc(handle);
}
// Cerramos el fichero
fclose( handle );
return OK;
}
/**************************************************************************\
|* *|
|* ImprimeSecuencia *|
|* *|
|* Descripcion: *|
|* Imprime la secuencia dada, de botones previamente cargados *|
|* *|
|* Entradas: Secuencia a imprimir *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MBoton::ImprimeSecuencia( int Secuencia )
{
int IniSecuencia, i;
IniSecuencia = PrincipioSecuencia( Secuencia - 1 );
for( i = 0; i<NBSecuencia[ Secuencia - 1 ]; i++)
ImprimeBoton( RELLENO, Botones[ IniSecuencia + i ] );
}
/**************************************************************************\
|* *|
|* DespliegaDatos *|
|* *|
|* Descripcion: *|
|* Despliega los datos sobre los botones cargados *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MBoton::DespliegaDatos(void)
{
int i, j, InicioSecuencia;
clrscr();
for ( i = 0; i <= NSecuencias; i++)
{
InicioSecuencia = PrincipioSecuencia( i );
for ( j = 0; j < NBSecuencia[ i ]; j++)
{
printf("!%d,%02d U/L/R/D: %d-%d-%d-%d, C: %d-%d-%d Ab/Pb %d-%d, Isc-Sc %03d%03d\n",
i, j,
Botones[InicioSecuencia+j].Up,
Botones[InicioSecuencia+j].Left,
Botones[InicioSecuencia+j].Right,
Botones[InicioSecuencia+j].Down,
Botones[InicioSecuencia+j].Cdf,
Botones[InicioSecuencia+j].Cb1,
Botones[InicioSecuencia+j].Cb2,
Botones[InicioSecuencia+j].Ab,
Botones[InicioSecuencia+j].Pb,
Botones[InicioSecuencia+j].Isc,
Botones[InicioSecuencia+j].Sc );
}
}
}
/**************************************************************************\
|* *|
|* MuestraEstaticos *|
|* *|
|* Descripcion: *|
|* Muestra los botones est<73>ticos correspondientes al fichero, *|
|* y secuencia dadas. *|
|* *|
|* Entradas: Fichero donde se encuentran los objetos *|
|* Secuencia a mostrar *|
|* *|
|* Salidas: OK / ERROR *|
|* *|
\**************************************************************************/
int MBoton::MuestraEstaticos( char *file, int SecMostrar )
{
FILE *handle;
char ch, buffer[200];
int Font, SizeChar, Horiz, Color;
int secuencia_activa=-1, PosX, PosY;
struct Make_Boton Bot_Static;
if ( ( handle == fopen( file, "r" ) ) == NULL )
{
lError = 0x01; Error( lError );
return ERROR;
}
ch=fgetc(fichero); //Lee el primer caracter
while ( ch != EOF ) //Lee hasta fin de fichero
{
switch ( ch )
{
// Linea con comentario
case '*':
while (ch!=EOL && ch!=EOF) ch=fgetc(fichero);
break;
// Numero de Botones en la secuencia
case '<EFBFBD>':
secuencia_activa = ObtenNumero( handle, &ch );
break;
// C<>lculos del boton estatico
case '&':
if ( secuencia_activa == Sec_st)
{
Bot_Static.Left = ObtenNumero( handle, &ch );
Bot_Static.Up = ObtenNumero( handle, &ch );
Bot_Static.Right = ObtenNumero( handle, &ch );
Bot_Static.Down = ObtenNumero( handle, &ch );
Bot_Static.Cdf = ObtenNumero( handle, &ch );
Bot_Static.Cb1 = ObtenNumero( handle, &ch );
Bot_Static.Cb2 = ObtenNumero( handle, &ch );
Bot_Static.Ab = ObtenNumero( handle, &ch );
if ( Bot_Static.Ab < 0 )
{
Relleno = 0;
Bot_Static.Ab *= -1;
} else {
Relleno = 1;
}
Bot_Static.Pb = ObtenNumero( handle, &ch );
DibujaBoton( Relleno, Bot_Static );
}
break;
//C<>lculos del texto
case '|':
if ( secuencia_activa == Sec_st )
{
PosX = ObtenNumero( handle, &ch );
PosY = ObtenNumero( handle, &ch );
Font = ObtenNumero( handle, &ch );
CharSize = ObtenNumero( handle, &ch );
Horiz = ObtenNumero( handle, &ch );
Color = ObtenNumero( handle, &ch );
buffer[0] = '\0'; numero = 0;
ch=fgetc(fichero);
while ( ch != EOL && ch != EOF && ch != '<EFBFBD>' && numero < 150 )
{
ch = fgetc(fichero);
if( ch != ',')
{
buffer[numero] = ch;
numero++;
}
}
buffer[numero] = '\0';
setcolor( Color );
settextstyle( Font, Horiz, CharSize);
outtextxy( PosX, PosY, buffer);
}
break;
}
if ( ch != EOF ) ch = fgetc(handle);
}
fclose( handle );
return OK;
}
/**************************************************************************\
|* *|
|* PrincipioSecuencia *|
|* *|
|* Descripcion: *|
|* Nos da el comienzo f<>sico de la secuencia deseada *|
|* *|
|* Entradas: Secuencia a obtener su principio *|
|* Salidas: Principio de la secuencia *|
|* *|
\**************************************************************************/
int MBoton::PrincipioSecuencia( int Secuencia )
{
int i, IniSecuencia;
IniSecuencia = 0;
for ( i = 0; i< Secuencia; i++)
IniSecuencia += NBSecuencia[i];
return IniSecuencia;
}
/**************************************************************************\
|* *|
|* ImprimeBoton *|
|* *|
|* Descripcion: *|
|* Muestra por pantalla el boton que se le pasa como par<61>metro *|
|* y lo rellena solo si asi lo indica D_Bord *|
|* *|
|* Entradas: Secuencia a obtener su principio *|
|* Salidas: Principio de la secuencia *|
|* *|
\**************************************************************************/
void MBoton::ImprimeBoton( int D_Bord, Make_Boton Bot_Imp )
{
int puntos[14];
switch( Bot_Imp.Down )
{
// Pulsador Redondo
case -1:
// Angulos inicial y final de cada semi-ciclo
if(Bot_Imp.Pb > 0)
{
puntos[1] = 120; puntos[2] = 300;
} else {
puntos[1] = 60; puntos[2] = 240;
}
// Dibujamos el primer semi-ciclo
setlinestyle( 0, 1, NORM_WIDTH );
setcolor( Bot_Imp.Cb1 );
setfillstyle( SOLID_FILL, Bot_Imp.Cb1 );
for ( puntos[0] = 0; puntos[0] < Bot_Imp.Ab; puntos[0]++ )
arc( Bot_Imp.Left, Bot_Imp.Up, puntos[1]+puntos[0], puntos[2]+puntos[0], Bot_Imp.Right - puntos[0] );
// Dibujamos el segundo semi-ciclo
setcolor( Bot_Imp.Cb2 );
setfillstyle( SOLID_FILL, Bot_Imp.Cb2 );
for ( puntos[0] = 0; puntos[0] < Bot_Imp.Ab; puntos[0]++ )
arc( Bot_Imp.Left, Bot_Imp.Up, puntos[2]+puntos[0], puntos[1]+puntos[0], Bot_Imp.Right - puntos[0] );
// Lo tenemos que rellenar ???
if( D_Bord )
{
setcolor( Bot_Imp.Cdf );
setfillstyle( SOLID_FILL, Bot_Imp.Cdf );
pieslice( Bot_Imp.Left, Bot_Imp.Up, 0, 360, Bot_Imp.Right - Bot_Imp.Ab );
}
// Si el borde es >= 2, dibujamos un circulo negro a su alrededor
if( Bot_Imp.Ab >= 2 )
{
setcolor( NEGRO );
setfillstyle(EMPTY_FILL, Bot_Imp.Cdf);
circle( Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right);
}
break;
default:
// Posicion de los bordes
if ( Bot_Imp.Pb == 2 )
{
puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up;
puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up;
puntos[4] = Bot_Imp.Right; puntos[5] = Bot_Imp.Down;
puntos[6] = Bot_Imp.Right - Bot_Imp.Ab; puntos[7] = Bot_Imp.Down - Bot_Imp.Ab;
puntos[8] = Bot_Imp.Right - Bot_Imp.Ab; puntos[9] = Bot_Imp.Up + Bot_Imp.Ab;
puntos[10] = Bot_Imp.Left + Bot_Imp.Ab; puntos[11] = Bot_Imp.Up + Bot_Imp.Ab;
puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up;
} else {
puntos[0] = Bot_Imp.Left; puntos[1] = Bot_Imp.Up;
puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Up;
puntos[4] = Bot_Imp.Right - Bot_Imp.Ab; puntos[5] = Bot_Imp.Up + Bot_Imp.Ab;
puntos[6] = Bot_Imp.Left + Bot_Imp.Ab; puntos[7] = Bot_Imp.Up + Bot_Imp.Ab;
puntos[8] = Bot_Imp.Left + Bot_Imp.Ab; puntos[9] = Bot_Imp.Down - Bot_Imp.Ab;
puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Down;
puntos[12] = Bot_Imp.Left; puntos[13] = Bot_Imp.Up;
}
// Dibujamos el primer borde
setcolor( Bot_Imp.Cb1 );
setfillstyle( SOLID_FILL, Bot_Imp.Cb1 );
setlinestyle( 0, 1, NORM_WIDTH );
fillpoly( 7, puntos );
if ( Bot_Imp.Pb == 2 )
{
puntos[0] = Bot_Imp.Left + Bot_Imp.Ab; puntos[1] = Bot_Imp.Up + Bot_Imp.Ab;
puntos[2] = Bot_Imp.Left + Bot_Imp.Ab; puntos[3] = Bot_Imp.Down - Bot_Imp.Ab;
puntos[4] = Bot_Imp.Right - Bot_Imp.Ab; puntos[5] = Bot_Imp.Down - Bot_Imp.Ab;
puntos[6] = Bot_Imp.Right; puntos[7] = Bot_Imp.Down;
puntos[8] = Bot_Imp.Left; puntos[9] = Bot_Imp.Down;
puntos[10] = Bot_Imp.Left; puntos[11] = Bot_Imp.Up;
puntos[12] = Bot_Imp.Left + Bot_Imp.Ab; puntos[13] = Bot_Imp.Up + Bot_Imp.Ab;
} else {
puntos[0] = Bot_Imp.Right; puntos[1] = Bot_Imp.Up;
puntos[2] = Bot_Imp.Right; puntos[3] = Bot_Imp.Down;
puntos[4] = Bot_Imp.Left; puntos[5] = Bot_Imp.Down;
puntos[6] = Bot_Imp.Left + Bot_Imp.Ab; puntos[7] = Bot_Imp.Down - Bot_Imp.Ab;
puntos[8] = Bot_Imp.Right - Bot_Imp.Ab; puntos[9] = Bot_Imp.Down - Bot_Imp.Ab;
puntos[10] = Bot_Imp.Right - Bot_Imp.Ab; puntos[11] = Bot_Imp.Up + Bot_Imp.Ab;
puntos[12] = Bot_Imp.Right; puntos[13] = Bot_Imp.Up;
}
// Dibujamos el segundo borde
setcolor( Bot_Imp.Cb2 );
setfillstyle( SOLID_FILL, Bot_Imp.Cb2 );
setlinestyle( 0, 1, NORM_WIDTH );
fillpoly( 7, puntos );
// Hay que rellenarlo???
if( D_Bord )
{
setcolor( Bot_Imp.Cdf );
setfillstyle( SOLID_FILL, Bot_Imp.Cdf );
bar( Bot_Imp.Left+Bot_Imp.Ab+1, Bot_Imp.Up+Bot_Imp.Ab+1, Bot_Imp.Right-Bot_Imp.Ab-1, Bot_Imp.Down-Bot_Imp.Ab-1 );
}
// Se le puede poner un marco negro ???
if( Bot_Imp.Ab >= 2 )
{
setcolor( NEGRO );
setfillstyle( EMPTY_FILL, Bot_Imp.Cdf );
rectangle( Bot_Imp.Left, Bot_Imp.Up, Bot_Imp.Right, Bot_Imp.Down );
}
break;
}
}
/**************************************************************************\
|* *|
|* ImprimeBordes *|
|* *|
|* Descripcion: *|
|* Imprime el Boton #, de la Secuencia #, con los bordes Color *|
|* *|
|* Entradas: Seuencia, Boton, Color *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MBoton::ImprimeBordes( int Secuencia, int Boton, int Color )
{
int IniSecuencia, puntos[14];
unsigned int size;
IniSecuencia = PrincipioSecuencia( Secuencia - 1 );
if( Boton <= 0 || Boton > NBSecuencia[ Secuencia - 1 ] ) return;
Boton--;
// Un Color negativo restaura sus bordes
if( Color < 0 )
{
ImprimeBoton( 0, Botones[ IniSecuencia + Boton ] );
} else {
switch( Botones[ IniSecuencia + Boton ].Down < 0 )
{
case -1:
setlinestyle( 0, 1, NORM_WIDTH );
setcolor( Color );
setfillstyle( SOLID_FILL, Color );
for ( puntos[0] = 0; puntos[0] < Botones[ IniSecuencia + Boton ].Ab; puntos[0]++ )
circle( Botones[ IniSecuencia + Boton ].Left, Botones[ IniSecuencia + Boton ].Up, Botones[ IniSecuencia + Boton ].Right - puntos[0] );
if( Botones[ IniSecuencia + Boton ].Ab >= 2 )
{
setcolor( NEGRO );
setfillstyle( EMPTY_FILL, Botones[ IniSecuencia + Boton ].Cdf );
circle( Botones[ IniSecuencia + Boton].Left, Botones[ IniSecuencia + Boton].Up, Botones[ IniSecuencia + Boton].Right);
}
break;
default:
puntos[0] = Botones[ IniSecuencia + Boton ].Left; puntos[1] = Botones[ IniSecuencia + Boton ].Up;
puntos[2] = Botones[ IniSecuencia + Boton ].Right; puntos[3] = Botones[ IniSecuencia + Boton ].Up;
puntos[4] = Botones[ IniSecuencia + Boton ].Right; puntos[5] = Botones[ IniSecuencia + Boton ].Down;
puntos[6] = Botones[ IniSecuencia + Boton ].Right - Botones[ IniSecuencia + Boton].Ab); puntos[7] = Botones[ IniSecuencia + Boton ].Down - Botones[ IniSecuencia + Boton ].Ab;
puntos[8] = Botones[ IniSecuencia + Boton ].Right - Botones[ IniSecuencia + Boton].Ab); puntos[9] = Botones[ IniSecuencia + Boton ].Up + Botones[ IniSecuencia + Boton ].Ab;
puntos[10] = Botones[ IniSecuencia + Boton ].Left + Botones[ IniSecuencia + Boton].Ab); puntos[11] = Botones[ IniSecuencia + Boton ].Up + Botones[ IniSecuencia + Boton ].Ab;
puntos[12] = Botones[ IniSecuencia + Boton ].Left; puntos[13] = Botones[ IniSecuencia + Boton ].Up;
setcolor( Color );
setfillstyle( SOLID_FILL, Color );
setlinestyle( 0, 1, NORM_WIDTH );
fillpoly( 7, puntos );
puntos[0] = Botones[ IniSecuencia + Boton ].Left + Botones[ IniSecuencia + Boton].Ab; puntos[1] = Botones[ IniSecuencia + Boton ].Up + Botones[ IniSecuencia + Boton ].Ab;
puntos[2] = Botones[ IniSecuencia + Boton ].Left + Botones[ IniSecuencia + Boton].Ab; puntos[3] = Botones[ IniSecuencia + Boton ].Down - Botones[ IniSecuencia + Boton ].Ab;
puntos[4] = Botones[ IniSecuencia + Boton ].Right - Botones[ IniSecuencia + Boton].Ab; puntos[5] = Botones[ IniSecuencia + Boton ].Down - Botones[ IniSecuencia + Boton ].Ab;
puntos[6] = Botones[ IniSecuencia + Boton ].Right; puntos[7] = Botones[ IniSecuencia + Boton ].Down;
puntos[8] = Botones[ IniSecuencia + Boton ].Left; puntos[9] = Botones[ IniSecuencia + Boton ].Down;
puntos[10] = Botones[ IniSecuencia + Boton ].Left; puntos[11] = Botones[ IniSecuencia + Boton ].Up;
puntos[12] = Botones[ IniSecuencia + Boton ].Left + Botones[ IniSecuencia + Boton].Ab; puntos[13] = Botones[ IniSecuencia + Boton ].Up + Botones[ IniSecuencia + Boton ].Ab;
setcolor( Color );
setfillstyle( SOLID_FILL, Color );
setlinestyle( 0, 1, NORM_WIDTH );
fillpoly( 7, puntos );
// El marquito negro
if( Botones[ IniSecuencia + Boton].Ab >= 2 )
{
setcolor( NEGRO );
setfillstyle( EMPTY_FILL, Botones[ IniSecuencia + Boton ].Cdf );
rectangle( Botones[ IniSecuencia + Boton ].Left, Botones[ IniSecuencia + Boton ].Up, Botones[ IniSecuencia + Boton ].Right, Botones[ IniSecuencia + Boton ].Down );
}
break;
}
}
/**************************************************************************\
|* *|
|* CompruebaSecuencia *|
|* *|
|* Descripcion: *|
|* Comprueba donde se pulsa el rat<61>n o si se ha pulsado alguna *|
|* tecla que corresponde a los botones, para presionarlos *|
|* *|
|* *|
|* Entradas: Secuencia a comprobar *|
|* Puntero a la funcion de raton ( NULL == INTERNA ) *|
|* *|
|* /************************************************************\ *|
|* |* *|*|
|* |* UserPointer *|*|
|* |* *|*|
|* |* Descripcion: *|*|
|* |* Puntero a la funcion de control para el raton *|*|
|* |* carga en Xraton, Yraton las coordenadas de <20>l. *|*|
|* |* *|*|
|* |* Entradas: Punteros para guardar Xraton, Yraton *|*|
|* |* Salidas: B.Derech B.Izqu. *|*|
|* |* 0 0 0 *|*|
|* |* 1 1 0 *|*|
|* |* 2 0 1 *|*|
|* |* 3 1 1 *|*|
|* \************************************************************//*|
|* *|
|* Salidas: *|
|* -2 Tecla normal en buffer *|
|* -1 Tecla especial en buffer *|
|* 0 Raton fue pulsado pero no accion<6F> nada *|
|* *|
|* >>0 N<> de boton pulsado (en orden de aparicion en el fichero ) *|
|* *|
\**************************************************************************/
int MBoton::CompruebaSecuencia( int Secuencia, int (far *UserPointer)( int *Xraton, int *Yraton ) )
{
char key, key2;
int i, IniSecuencia;
int Xraton, Yraton;
key2 = 0;
Pulso = 0;
IniSecuencia = PrincipioSecuencia(Secuencia-1);
if (
( (UserPointer == NULL) ? EsperaTeclaRaton( &Xraton, &Yraton ) : UserPointer( &Xraton, &Yraton ) ) == 0
)
{
if ( ( key = getch() ) == 0 ) key2 = getch();
for( i = 0; i < NBSecuencia[ Secuencia - 1 ]; i++ )
if( toupper( key ) == Botones[ IniSecuencia + i ].Isc && key2 == Botones[ IniSecuencia + i ].Sc )
{
DeprimeBoton( ON, Botones[ IniSecuencia + i ] );
delay(50);
DeprimeBoton( OFF, Botones[ IniSecuencia + i ] );
return i+1;
}
if(key==0)
{
ungetch(key2); return (-1);
} else {
ungetch(key); return (-2);
}
}
XRaton = Xraton;
YRaton = Yraton;
for(i = 0; i < NBSecuencia[Secuencia-1]; i++)
if( ( Xraton >= Botones[ IniSecuencia + i ].Left ) && ( Xraton <= Botones[ IniSecuencia + i ].Right ) &&
( Yraton >= Botones[ IniSecuencia + i ].Up ) && ( Yraton <= Botones[ IniSecuencia + i ].Down ) )
{
DeprimeBoton( ON, Botones[ IniSecuencia + i ] );
AnclarRaton();
DeprimeBoton( OFF, Botones[ IniSecuencia + i ] );
return ( i + 1 );
}
return (0);
}
/**************************************************************************\
|* *|
|* ReCompruebaSecuencia *|
|* *|
|* Descripcion: *|
|* Comprueba otra vez la secuencia dada, pero ahora solo tiene *|
|* en cuenta que el raton ya se ha pulsado. *|
|* *|
|* *|
|* Entradas: Secuencia a comprobar *|
|* *|
|* Salidas: *|
|* -2 Tecla normal en buffer *|
|* -1 Tecla especial en buffer *|
|* 0 Raton fue pulsado pero no accion<6F> nada *|
|* *|
|* >>0 N<> de boton pulsado (en orden de aparicion en el fichero ) *|
|* *|
\**************************************************************************/
int MBoton::ReComprueba_Secuencia( int Secuencia )
{
return CompruebaSecuencia( Secuencia, ReCmpPointer );
}
/**************************************************************************\
|* *|
|* ReCmpPointer *|
|* *|
|* Descripcion: *|
|* Funci<63>n que carga sus par<61>metros con la <20>ltima posici<63>n del *|
|* rat<61>n y devuelve, que el rat<61>n fue pulsado. *|
|* *|
|* Entradas: Punteros a donde guardar la pos. del raton *|
|* *|
|* Salidas: *|
|* 2 Raton pulsado ( Boton Izquierdo ) *|
|* *|
\**************************************************************************/
int MBoton::ReCmpPointer( int *Xraton, int *Yraton )
{
*Xraton = XRaton;
*Yraton = YRaton;
return 2;
}
/**************************************************************************\
|* *|
|* DeprimeBoton *|
|* *|
|* Descripcion: *|
|* Deprime o Imprime el boton, segun se le indique. *|
|* *|
|* Entradas: ON/OFF, Boton a tratar *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MBoton::DeprimeBoton( int DepImp, Make_Boton DepBot )
{
unsigned long size;
int SWAP_COLOR;
switch ( Bot_Imp.Down )
{
case -1:
// Deprimir ( Cambiamos los colores del borde )
if ( DepImp == ON )
{
SWAP_COLOR = DepBot.Cb1;
DepBot.Cb1 = DepBot.Cb2;
DepBot.Cb2 = SWAP_COLOR;
}
ImprimeBoton( 0, DepBot );
break;
default:
// Si es Imprimir ( lo imprimo )
if ( DepImp == OFF )
{
if ( FBoton != NULL )
{
putimage( DepBot.Left + DepBot.Ab + 1, DepBot.Up + DepBot.Ab + 1, FBoton, COPY_PUT );
farfree( FBoton );
}
ImprimeBoton( 0, DepBot );
} else {
// Deprimir: <20><> Tengo memoria para deprimir WUAYYY ?
if ( ( FBoton = farmalloc( JD_imagesize( DepBot.Left + Ab + 1, DepBot.Up + Ab + 1, DepBot.Right - Ab - 1, DepBot.Down - Ab - 1 ) ) ) != NULL )
{
ImprimeBoton( 0, DepBot );
getimage( DepBot.Left + Ab + 1, DepBot.Up + Ab + 1, DepBot.Right - Ab - 1, DepBot.Down - Ab - 1, FBoton);
if( DepBot.Pb == 2)
{
putimage( DepBot.Left + 1, DepBot.Up+(Ab*2), FBoton, COPY_PUT);
} else {
putimage( DepBot.Left + (Ab*2), DepBot.Up+(Ab*2), FBoton, COPY_PUT);
}
} else {
SWAP_COLOR = DepBot.Cb1;
DepBot.Cb1 = DepBot.Cb2;
DepBot.Cb2 = SWAP_COLOR;
ImprimeBoton( 0, DepBot );
}
}
break;
}
}
/**************************************************************************\
|* *|
|* Error *|
|* *|
|* Descripcion: *|
|* Carga en cError, el error lError que se pasa como parametro *|
|* *|
|* Entradas: Error a cargar *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MBoton::Error( int lError )
{
switch ( lError )
{
case 0:
strcpy( cError, "No hay ningun error" );
break;
case 1:
strcpy( cError, "Error abriendo el archivo" );
break;
case 5:
strcpy( cError, "No hay memoria" );
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Funciones para el control del rat<61>n ( SOLO -> VGA <- )
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void AnclarRaton( void )
{
union REGS io;
io.ax = 0;
int86(0x33, &io, &io); /* averigua si hay rat<61>n conectado */
if ( io.x.ax == 0 ) return;
io.x.ax = 3;
do {
int86(0x33, &io, &io);
} while( (io.x.bx & 1)==1 || ((io.x.bx >> 1) & 1)==1);
}
int Espera_TeclaRaton(void)
{
char Que;
activa_raton();
union REGS io;
io.x.ax = 3;
do{
int86(0x33, &io, &io); // lee posici<63>n y estados del bot<6F>n
Xraton = io.x.cx;
Yraton = io.x.dx;
} while( (io.x.bx & 1) == 0 && ((io.x.bx >> 1) & 1) == 0 && !MB_TeclaPulsada() );
/////////////////////////////////////////
// RETURN Derecho Izquierdo //
// //
// 0 0 0 //
// 1 1 0 //
// 2 0 1 //
// 3 1 1 //
// //
/////////////////////////////////////////
if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==0 ) Que = 0;
if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==0 ) Que = 1;
if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==1 ) Que = 2;
if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==1 ) Que = 3;
desactiva_raton();
return Que;
}
void inicializa_raton_grafico(int x1, int y1, int x2, int y2)
{
int px = Xraton, py = Yraton;
struct SREGS seg;
union REGS ent, sal;
long dir;
ent.x.ax = 0;
int86(0x33, &ent, &sal); /* averigua si hay rat<61>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<61>n mickey/pixel */
ent.x.ax = 7;
ent.x.cx = x1;
ent.x.dx = x2;
int86(0x33, &ent, &sal); /* fija la posici<63>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<63>n m<>x. y m<>n. vertical */
Carga_Puntero();
if( PunteroRaton != 0 )
{
dir = (long)dir_raton;
ent.x.ax = 9;
ent.x.bx = 0;
ent.x.cx = 0;
ent.x.dx = (int) dir;
seg.es = (int) (dir >> 16);
int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */
}
ent.x.ax = 4;
ent.x.cx = px;
Xraton=ent.x.cx >> 1;
ent.x.dx = py;
Yraton=ent.x.dx;
int86(0x33, &ent, &sal); /* fija la posici<63>n del rat<61>n */
ent.x.ax = 1;
int86(0x33, &ent, &sal); /* muestra el puntero del rat<61>n */
desactiva_raton();
}
}
void activa_raton(void)
{
union REGS ent;
ent.x.ax = 1;
int86(0x33, &ent, &ent);
}
void desactiva_raton(void)
{
union REGS ent;
ent.x.ax = 2;
int86(0x33, &ent, &ent);
}
void Initialize(int GraphDriver, int GraphMode)
{
int errorcode;
/*
if( (errorcode = registerbgifont(SMALL_FONT)) < 0 )
ErrorOccurred(errorcode);
*/
/* report any registration errors */
/* if ( (errorcode = registerbgidriver(EGAVGA_driver) ) < 0)
ErrorOccurred(errorcode);
*/
/* initialize graphics and local variables */
initgraph( &GraphDriver, &GraphMode, "" );
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
ErrorOccurred(errorcode);
}
void ErrorOccurred(int errorcode) {
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
/*
unsigned long JD_imagesize(int left, int top, int right, int bottom)
{
unsigned long X_width, Y_width;
X_width= ( (left > right) ? (left - right + 1) : ( right - left + 1) );
Y_width= ( ( top > bottom) ? ( top - bottom + 1) : (bottom - top + 1) );
return (X_width * Y_width + 4);
};
*/
void Carga_Puntero(void){
struct SREGS seg;
union REGS ent, sal;
long dir;
switch( PunteroRaton ) {
case 0:
break;
case 1:
dir_raton [ 0] = 0x007F; /*<2A> <20> <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1 1 1*/
dir_raton [ 1] = 0x00FF; /*<2A> <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1 1 1 1*/
dir_raton [ 2] = 0x01FF; /*<2A> <20> <20> <20> <20> <20> <20> 1 1 1 1 1 1 1 1 1*/
dir_raton [ 3] = 0x01FF; /*<2A> <20> <20> <20> <20> <20> <20> 1 1 1 1 1 1 1 1 1*/
dir_raton [ 4] = 0x00FF; /*<2A> <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1 1 1 1*/
dir_raton [ 5] = 0x007F; /*<2A> <20> <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1 1 1*/
dir_raton [ 6] = 0x18FF; /*<2A> <20> <20> 1 1 <20> <20> <20> 1 1 1 1 1 1 1 1*/
dir_raton [ 7] = 0x800F; /*1 <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1 1 1 1*/
dir_raton [ 8] = 0x8083; /*1 <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1 1*/
dir_raton [ 9] = 0x8001; /*1 <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1*/
dir_raton [10] = 0xF810; /*1 1 1 1 1 <20> <20> <20> <20> <20> <20> 1 <20> <20> <20> 1*/
dir_raton [11] = 0x8810; /*1 <20> <20> <20> 1 <20> <20> <20> <20> <20> <20> 1 <20> <20> <20> 1*/
dir_raton [12] = 0x8811; /*1 <20> <20> <20> 1 <20> <20> <20> <20> <20> <20> 1 <20> <20> <20> 1*/
dir_raton [13] = 0x8003; /*1 <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1 1*/
dir_raton [14] = 0x8007; /*1 <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1 1 1*/
dir_raton [15] = 0x800F; /*1 <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1 1 1 1*/
dir_raton [16] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [17] = 0x7E00; /*0 <20> <20> <20> <20> <20> <20> 0 0 0 0 0 0 0 0 0*/
dir_raton [18] = 0x7C00; /*0 <20> <20> <20> <20> <20> 0 0 0 0 0 0 0 0 0 0*/
dir_raton [19] = 0x7C00; /*0 <20> <20> <20> <20> <20> 0 0 0 0 0 0 0 0 0 0*/
dir_raton [20] = 0x7E00; /*0 <20> <20> <20> <20> <20> <20> 0 0 0 0 0 0 0 0 0*/
dir_raton [21] = 0x6700; /*0 <20> <20> 0 0 <20> <20> <20> 0 0 0 0 0 0 0 0*/
dir_raton [22] = 0x0200; /*0 0 0 0 0 0 <20> 0 0 0 0 0 0 0 0 0*/
dir_raton [23] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [24] = 0x3E70; /*0 0 <20> <20> <20> <20> <20> 0 0 <20> <20> <20> 0 0 0 0*/
dir_raton [25] = 0x0248; /*0 0 0 0 0 0 <20> 0 0 <20> 0 0 <20> 0 0 0*/
dir_raton [26] = 0x0244; /*0 0 0 0 0 0 <20> 0 0 <20> 0 0 0 <20> 0 0*/
dir_raton [27] = 0x0242; /*0 0 0 0 0 0 <20> 0 0 <20> 0 0 0 <20> 0 0*/
dir_raton [28] = 0x2244; /*0 0 <20> 0 0 0 <20> 0 0 <20> 0 0 0 <20> 0 0*/
dir_raton [29] = 0x2248; /*0 0 <20> 0 0 0 <20> 0 0 <20> 0 0 <20> 0 0 0*/
dir_raton [30] = 0x3E70; /*0 0 <20> <20> <20> <20> <20> 0 0 <20> <20> <20> 0 0 0 0*/
dir_raton [31] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir = (long)dir_raton;
ent.x.ax = 9;
ent.x.bx = 0;
ent.x.cx = 0;
ent.x.dx = (int) dir;
seg.es = (int) (dir >> 16);
int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */
break;
case 2: //<2F> 2 1 0 <20> 2 1 0 <20> 2 1 0 <20> 2 1 0
dir_raton [ 0] = 0xF11F; /*1 1 1 1 <20> <20> <20> 1 <20> <20> <20> 1 1 1 1 1*/
dir_raton [ 1] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [ 2] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [ 3] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [ 4] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [ 5] = 0x0001; /*<2A> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1*/
dir_raton [ 6] = 0x0101; /*<2A> <20> <20> <20> <20> <20> <20> 1 <20> <20> <20> <20> <20> <20> <20> 1*/
dir_raton [ 7] = 0x0271; /*<2A> <20> <20> <20> <20> <20> 1 1 1 <20> <20> <20> <20> <20> <20> 1*/
dir_raton [ 8] = 0x7773; /*1 <20> <20> <20> <20> 1 1 1 1 1 <20> <20> <20> <20> 1 1*/
dir_raton [ 9] = 0x0271; /*<2A> <20> <20> <20> <20> <20> 1 1 1 <20> <20> <20> <20> <20> <20> 1*/
dir_raton [10] = 0x0101; /*<2A> <20> <20> <20> <20> <20> <20> 1 <20> <20> <20> <20> <20> <20> <20> 1*/
dir_raton [11] = 0x0001; /*<2A> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> 1*/
dir_raton [12] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [13] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [14] = 0xF01F; /*1 1 1 1 <20> <20> <20> <20> <20> <20> <20> 1 1 1 1 1*/
dir_raton [15] = 0xF11F; /*1 1 1 1 <20> <20> <20> 1 <20> <20> <20> 1 1 1 1 1*/
//<2F> 2 1 0 <20> 2 1 0 <20> 2 1 0 <20> 2 1 0
dir_raton [16] = 0x0440; /*0 0 0 0 0 <20> 0 0 0 <20> 0 0 0 0 0 0*/
dir_raton [17] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [18] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [19] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [20] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [21] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [22] = 0xFC7E; /*<2A> <20> <20> <20> <20> <20> 0 0 0 <20> <20> <20> <20> <20> <20> 0*/
dir_raton [23] = 0x7C7C; /*0 <20> <20> <20> <20> 0 0 0 0 0 <20> <20> <20> <20> 0 0*/
dir_raton [24] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [25] = 0x7C7C; /*0 <20> <20> <20> <20> 0 0 0 0 0 <20> <20> <20> <20> 0 0*/
dir_raton [26] = 0xFC7E; /*<2A> <20> <20> <20> <20> <20> 0 0 0 <20> <20> <20> <20> <20> <20> 0*/
dir_raton [27] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [28] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [29] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [30] = 0x06C0; /*0 0 0 0 0 <20> <20> 0 <20> <20> 0 0 0 0 0 0*/
dir_raton [31] = 0x0440; /*0 0 0 0 0 <20> 0 0 0 <20> 0 0 0 0 0 0*/
dir = (long)dir_raton;
ent.x.ax = 9;
ent.x.bx = 0;
ent.x.cx = 0;
ent.x.dx = (int) dir;
seg.es = (int) (dir >> 16);
int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */
break;
case 3: //<2F> 2 1 0 <20> 2 1 0 <20> 2 1 0 <20> 2 1 0
dir_raton [ 0] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
dir_raton [ 1] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
dir_raton [ 2] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
dir_raton [ 3] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
dir_raton [ 4] = 0xCFF3; /*1 1 <20> <20> 1 1 1 1 1 1 1 1 <20> <20> 1 1*/
dir_raton [ 5] = 0xC7E3; /*1 1 <20> <20> <20> 1 1 1 1 1 1 <20> <20> <20> 1 1*/
dir_raton [ 6] = 0x03C0; /*<2A> <20> <20> <20> <20> <20> 1 1 1 1 <20> <20> <20> <20> <20> <20>*/
dir_raton [ 7] = 0x0180; /*<2A> <20> <20> <20> <20> <20> <20> 1 1 <20> <20> <20> <20> <20> <20> <20>*/
dir_raton [ 8] = 0x0000; /*<2A> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>*/
dir_raton [ 9] = 0x0180; /*<2A> <20> <20> <20> <20> <20> <20> 1 1 <20> <20> <20> <20> <20> <20> <20>*/
dir_raton [10] = 0x03C0; /*<2A> <20> <20> <20> <20> <20> 1 1 1 1 <20> <20> <20> <20> <20> <20>*/
dir_raton [11] = 0xC7E3; /*1 1 <20> <20> <20> 1 1 1 1 1 1 <20> <20> <20> 1 1*/
dir_raton [12] = 0xCFF3; /*1 1 <20> <20> 1 1 1 1 1 1 1 1 <20> <20> 1 1*/
dir_raton [13] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
dir_raton [14] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
dir_raton [15] = 0xFFFF; /*1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1*/
//<2F> 2 1 0 <20> 2 1 0 <20> 2 1 0 <20> 2 1 0
dir_raton [16] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [17] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [18] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [19] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [20] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [21] = 0x1008; /*0 0 0 <20> 0 0 0 0 0 0 0 0 <20> 0 0 0*/
dir_raton [22] = 0x1818; /*0 0 0 <20> <20> 0 0 0 0 0 0 <20> <20> 0 0 0*/
dir_raton [23] = 0x7C3E; /*0 <20> <20> <20> <20> <20> 0 0 0 0 <20> <20> <20> <20> <20> 0*/
dir_raton [24] = 0x7E7E; /*0 <20> <20> <20> <20> <20> <20> 0 0 <20> <20> <20> <20> <20> <20> 0*/
dir_raton [25] = 0x7C3E; /*0 <20> <20> <20> <20> <20> 0 0 0 0 <20> <20> <20> <20> <20> 0*/
dir_raton [26] = 0x1818; /*0 0 0 <20> <20> 0 0 0 0 0 0 <20> <20> 0 0 0*/
dir_raton [27] = 0x1008; /*0 0 0 <20> 0 0 0 0 0 0 0 0 <20> 0 0 0*/
dir_raton [28] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [29] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [30] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir_raton [31] = 0x0000; /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/
dir = (long)dir_raton;
ent.x.ax = 9;
ent.x.bx = 0;
ent.x.cx = 0;
ent.x.dx = (int) dir;
seg.es = (int) (dir >> 16);
int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */
break;
};
};
/// int MB_TeclaPulsada(void)
/* Esta funci<63>n mira si se ha pulsado una tecla pero SIN llamadas a la BIOS,
de forma que no se inhabilitan las interrupciones en cada llamada, cosa
que bajar<61>a mucho la calidad de reproducci<63>n con el altavoz interno. */
/// {
/// return ( *(unsigned *) MK_FP(0x40,0x1A) != *(unsigned *) MK_FP(0x40,0x1C) );
/// }