	   /******************************************************/
   /******** FICHERO PARA INCLUIR, CON ALGUNOS TIPOS DE RECUADROS *******/
   /********        Y OTRAS FUNCIONES GRAFICAS RELACIONADAS       *******/
	   /******************************************************/

/****************************************************************************/
/*****        Navi Dj. Septiembre 1994.
/*****          Incluir as¡: 
/*****                  #include "cajas.h"
/*****          y llamar a las funciones tal y como se indica junto a ellas.
/***************************************************************************/

#include <conio.h>
#include <stdio.h>
#include <mem.h>
#include <bios.h>

void pon(char carac,char atri)  /* Escribe el caracter carac con el        */
{                               /* atributo de color atrib.                */
 asm {
	MOV     AH,0x09
	MOV     AL,carac
	XOR     BH,BH
	MOV     BL,atri
	MOV     CX,1
	INT     0x10
	}
 }


void cuadro1(char a,char b,char c,char d,char atri)
				/* Traza un cuadro donde a,b y c,d son los */
{                               /* vertices sup. izquierdo e inf. derecho. */
 char i,s;                      /* Atri es el atributo de color.           */

 for(i=b+1;i<d;i++)             /* Dibujo de las lineas horizontales */
   { 
    gotoxy(i,a);
    pon(205,atri);
    gotoxy(i,c);
    pon(205,atri);
    }
 for(i=a;i<c;i++)               /* Dibujo de las lineas verticales */
   {
    gotoxy(b,i);
    pon(186,atri);
    gotoxy(d,i);
    pon(186,atri);
    }
 gotoxy(b,a);               /* Dibujo de las esquinas */
 pon(201,atri);
 gotoxy(d,a);
 pon(187,atri);
 gotoxy(b,c);
 pon(200,atri);
 gotoxy(d,c);
 pon(188,atri);
   /* Aqu¡ se rellena de espacios en blanco el interior del cuadro */
 for(i=b+1;i<d;i++) {
   for(s=a+1;s<c;s++) {
     gotoxy(i,s);
     pon(32,atri);
   }
 }
}

/***************/

void cuadro2(char a,char b,char c,char d,char atri)
				/* Traza un cuadro donde a,b y c,d son los */
{                               /* vertices sup. izquierdo e inf. derecho. */
 char i,s;                      /* Atri es el atributo de color.           */

 for(i=b+1;i<d;i++)             /* Dibujo de las lineas horizontales */
   { 
    gotoxy(i,a);
    pon(223,atri);
    gotoxy(i,c);
    pon(220,atri);
    }
 for(i=a;i<c+1;i++)             /* Dibujo de las lineas verticales */
   {
    gotoxy(b,i);
    pon(219,atri);
    gotoxy(d,i);
    pon(219,atri);
    }
   /* Aqu¡ se rellena de espacios en blanco el interior del cuadro */
 for(i=b+1;i<d;i++) {
   for(s=a+1;s<c;s++) {
     gotoxy(i,s);
     pon(32,atri);
   }
 }
}

/***************/

void cuadro3(char a,char b,char c,char d,char atri)
				/* Traza un cuadro donde a,b y c,d son los */
{                               /* vertices sup. izquierdo e inf. derecho. */
 char i,s;                      /* Atri es el atributo de color.           */

 for(i=b+1;i<d;i++)             /* Dibujo de las lineas horizontales */
   { 
    gotoxy(i,a);
    pon(196,atri);
    gotoxy(i,c);
    pon(196,atri);
    }
 for(i=a;i<c;i++)               /* Dibujo de las lineas verticales */
   {
    gotoxy(b,i);
    pon(179,atri);
    gotoxy(d,i);
    pon(179,atri);
    }
 gotoxy(b,a);               /* Dibujo de las esquinas */
 pon(218,atri);
 gotoxy(d,a);
 pon(191,atri);
 gotoxy(b,c);
 pon(192,atri);
 gotoxy(d,c);
 pon(217,atri);
   /* Aqu¡ se rellena de espacios en blanco el interior del cuadro */
 for(i=b+1;i<d;i++) {
   for(s=a+1;s<c;s++) {
     gotoxy(i,s);
     pon(32,atri);
   }
 }
}

/***************/

void cuadro_titulo(char a,char b,char c,char d,char *tit,char atri1,char atri2,char atri3)
{                               /* Traza un cuadro donde a,b y c,d son los */
 char i,s,p;                    /* vertices sup. izquierdo e inf. derecho. */
				/* Atri1 y atri2 son los atributos para el */
				/* recuadro y el t¡tulo (tit).             */
 for(i=b+1;i<d;i++)
   {                            /* Dibujo de las lineas horizontales */
    gotoxy(i,a);
    pon(205,atri1);
    gotoxy(i,c);
    pon(205,atri1);
    gotoxy(i,a+2);
    pon(205,atri1);
    }
 for(i=a;i<c;i++)               /* Dibujo de las lineas verticales */
   {
    gotoxy(b,i);
    pon(186,atri1);
    gotoxy(d,i);
    pon(186,atri1);
    }
 gotoxy(b,a);               /* Dibujo de las esquinas */
 pon(201,atri1);
 gotoxy(d,a);
 pon(187,atri1);
 gotoxy(b,c);
 pon(200,atri1);
 gotoxy(d,c);
 pon(188,atri1);
 gotoxy(b,a+2);
 pon(204,atri1);
 gotoxy(d,a+2);
 pon(185,atri1);
   /* Aqu¡ se rellena de espacios en blanco el interior del cuadro */
 for(i=b+1;i<d;i++) {
   for(s=a+3;s<c;s++) {
     gotoxy(i,s);
     pon(32,atri1);
   }
 }
 for(i=b+1;i<d;i++)
   {
    gotoxy(i,a+1);
    pon(32,atri1);
    }
 
 s=strlen(tit);                 /* C lculo de la posici¢n para colocar el  */
 p=(((d-b)/2)-(s/2))+b;         /* mensaje.                                */
 gotoxy(p,a+1);
 textcolor(atri2);
 textbackground(atri3);
 cprintf(tit);
}

/***************/

void cuadro_msg(char *msg,char atri,char atri2)
				/* Dibuja un cuadro con un mensaje en el  */
{                               /* centro de la pantalla.                 */
				/* El modo debe ser texto en 25x80 y el   */
 char s,i,p,a,b,c,d;            /* mensaje no debe sobrepasar los 80 ca-  */
				/* racteres; de lo contrario saldria mal  */
 s=strlen(msg);
 b=(40-(s/2))-1;
 d=(40+(s/2))+1;
 a=12;
 c=14;
 
 for(i=b+1;i<d;i++)             /* Dibujo de las lineas horizontales */
   {                            
    gotoxy(i,a);
    pon(205,atri);
    gotoxy(i,c);
    pon(205,atri);
    gotoxy(i,a+2);
    pon(205,atri);
    }
 for(i=a;i<c;i++)               /* Dibujo de las lineas verticales */
   {
    gotoxy(b,i);
    pon(186,atri);
    gotoxy(d,i);
    pon(186,atri);
    }
 gotoxy(b,a);               /* Dibujo de las esquinas */
 pon(201,atri);
 gotoxy(d,a);
 pon(187,atri);
 gotoxy(b,c);
 pon(200,atri);
 gotoxy(d,c);
 pon(188,atri);
   /* Aqu¡ se rellena de espacios en blanco el interior del cuadro */
 for(i=b+1;i<d;i++)
   {
    gotoxy(i,a+1);
    pon(32,atri);
    }
 
 p=(((d-b)/2)-(s/2))+b;         /* C lculo de la posici¢n para colocar el  */
 gotoxy(p,a+1);                 /* mensaje.                                */
 textcolor(atri);
 textbackground(atri2);
 cprintf(msg);
}

/***************/

void cuadro_titulo2(char a,char b,char c,char d,char *tit,char atri,char atri2)
{                               /* Traza un cuadro donde a,b y c,d son los */
				/* vertices sup. izquierdo e inf. derecho. */
 char i,s,p;                    /* Atri es el atributo de color.           */

 for(i=b+1;i<d;i++)             /* Dibujo de las lineas horizontales */
   { 
    gotoxy(i,a);
    pon(196,atri);
    gotoxy(i,c);
    pon(196,atri);
    }
 for(i=a;i<c;i++)               /* Dibujo de las lineas verticales */
   {
    gotoxy(b,i);
    pon(179,atri);
    gotoxy(d,i);
    pon(179,atri);
    }
 gotoxy(b,a);               /* Dibujo de las esquinas */
 pon(218,atri);
 gotoxy(d,a);
 pon(191,atri);
 gotoxy(b,c);
 pon(192,atri);
 gotoxy(d,c);
 pon(217,atri);
   /* Aqu¡ se rellena de espacios en blanco el interior del cuadro */
 for(i=b+1;i<d;i++) {
   for(s=a+1;s<c;s++) {
     gotoxy(i,s);
     pon(32,atri);
   }
 }
 s=strlen(tit);                 /* C lculo de la posici¢n para colocar el  */
 p=(((d-b)/2)-(s/2))+b;         /* mensaje.                                */
 gotoxy(p,a);
 textcolor(atri);
 textbackground(atri2);
 cprintf(tit);
}

void guarda_pantalla(unsigned short Pagina)
{
 unsigned int Pos=Pagina*0x1000;
 movedata(0xB800, 0x0000, 0xB800, Pos, 4000);
 }

void restaura_pantalla(unsigned short Pagina)
{
 unsigned int Pos=Pagina*0x1000;
 movedata(0xB800, Pos, 0xB800, 0x0000, 4000);
 }

void scroll_arriba(char a,char b,char c,char d,char atri,char lineas)
{
 asm {
	mov     ah,0x07
	mov     al,lineas
	mov     bh,atri
	mov     ch,a
	mov     cl,b
	mov     dh,c
	mov     dl,d
	int     0x10
	}
 }

void scroll_abajo(char a,char b,char c,char d,char atri,char lineas)
{
 asm {
	mov     ah,0x06
	mov     al,lineas
	mov     bh,atri
	mov     ch,a
	mov     cl,b
	mov     dh,c
	mov     dl,d
	int     0x10
	}
 }

char inversa(char a,char b,char n,char atri)
{
 char i;

 for(i=(160*a)+b;i<=((160*a)+b)+n;i+=2)
  {
   asm {
	  mov   ah,[i+1]
	  not   ah
	  }
   }
 return -atri;
 }

