/*--------------------------------------------------------------------
 * FICHERO:  PanDefin.c
 * OBJETIVO: Definir las funciones Pan_Define() y Pan_Cierra()
 * AUTOR:    Pedro Reina
 * FECHA:    M.15.8.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones privadas PC
 * 
 *   Pan_PonModo()  
 *   Pan_DiModo()  
 *   Pan_DisponibleVGA()  
 *   Pan_CargaTabla()
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "General.h"
#include "Pantalla.def"
#include "Pantalla.h"

#ifdef OLIMPO_PC
#include <conio.h>     /*  _setcursortype()                         */
#include <dos.h>       /*  REGS  int86()  SREGS  int86x()  
                           geninterrupt()  MK_FP()                  */
#endif

#ifdef OLIMPO_QL
#include <qlib.h>      /*  QLRECT  WINDOWDEF  sd_wdef()             */
#endif

/*--------------------------------------------------------------------
 * Definicin de la pantalla del programa
 *------------------------------------------------------------------*/

#ifdef OLIMPO_QL
struct WINDOWDEF _condetails = {   0,  /*  color del borde          */
                                   0,  /*  ancho del borde          */
                                   0,  /*  color del papel          */
                                   7,  /*  color de la tinta        */
                                 512,  /*  ancho en pixels          */
                                 256,  /*  alto en pixels           */
                                   0,  /*  origen x                 */
                                   0   /*  origen y                 */
                                };
#endif

/*--------------------------------------------------------------------
 * Mensaje al final del programa, ninguno
 *------------------------------------------------------------------*/

#ifdef OLIMPO_QL
char *_endmsg = NULO;
#endif

/*--------------------------------------------------------------------
 * Ampliacin de la pila para el QL
 *------------------------------------------------------------------*/

#ifdef OLIMPO_QL
long _stack = 8000;
#endif

/*--------------------------------------------------------------------
 * Variables globales
 *------------------------------------------------------------------*/

octeto Pan_Mod_;                 /*  Modo de pantalla              */

/*--------------------------------------------------------------------
 * Variables globales (usadas por el PC en modo grfico)
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
static int Pan_ModAnt_;          /*  Modo de pantalla al comienzo  */
char far *Pan_TabCar_;           /*  Tabla de caracteres           */
#endif

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
static void   Pan_PonModo();
static int    Pan_DiModo();
static void   Pan_CargaTabla();
static logico Pan_DisponibleVGA();
#endif

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Pan_Define()
 * OBJETIVO: Definir la pantalla principal del programa
 * ENTRADAS: El modo que se va a usar: texto o grfico
 * NOTA:     Se usa una pantalla de 24 filas (de 0 a 23) y
 *           80 columnas (de 0 a 79)
 * EJEMPLO:  Pan_Define ( PAN_TEXTO )
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
void Pan_Define (Tipo)
octeto Tipo;
  {
  if ( Tipo == PAN_GRAFICO && !Pan_DisponibleVGA() )  
    { Tipo = PAN_TEXTO; }

  Pan_ModAnt_ = Pan_DiModo();

  if ( Tipo == PAN_TEXTO )  { Pan_PonModo(3); }
  else
    {
    Pan_Fil_ = Pan_Margen();
    Pan_Col_ = 0;
    Pan_Tin_ = BLANCO;
    Pan_Pap_ = NEGRO;
    Pan_Resal_ = NO;
    Pan_PonModo(0x12);
    Pan_CargaTabla();
    }
  Pan_CursorVisible(SI);
  Pan_Mod_ = Tipo;
  }
#endif

#ifdef OLIMPO_QL
void Pan_Define (Tipo)
octeto Tipo;
  {
  struct QLRECT Bloque;

  Bloque.q_width  = 480;
  Bloque.q_height = 250;
  Bloque.q_x      = Pan_MargenIzquierdo();
  Bloque.q_y      = Pan_MargenSuperior();

  sd_wdef (Pan_Canal(),-1L,0,0,&Bloque);
  Pan_Resalta(NO);
  Pan_CursorVisible(SI);
  Pan_Mod_ = Tipo;
  }
#endif

/*--------------------------------------------------------------Olimpo
 * MACRO:    Pan_Cierra()
 * OBJETIVO: Dejar la pantalla preparada para volver 
 *           al sistema operativo
 * ENTRADAS: Ninguna
 * EJEMPLO:  Pan_Cierra()
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
void Pan_Cierra ()
  {
  Pan_PonModo (Pan_ModAnt_);
  _setcursortype(_NORMALCURSOR);
  }
#endif

#ifdef OLIMPO_QL
void Pan_Cierra ()
  {
  Pan_Papel(NEGRO);
  Pan_CursorVisible(NO);
  Pan_Limpia();
  }
#endif


#ifdef OLIMPO_PC
/*--------------------------------------------------------------------
 * FUNCION:  Pan_PonModo()
 * OBJETIVO: Poner la pantalla en un modo PC determinado
 * ENTRADAS: El modo
 * SALIDAS:  Ninguna
 * EJEMPLO:  Pan_PanModo ( 3 )
 *------------------------------------------------------------------*/
void Pan_PonModo (Modo)
int Modo;
  {
  union REGS r;

  r.h.ah = 0;
  r.h.al = Modo;

  int86 (0x10,&r,&r);
  }
#endif

#ifdef OLIMPO_PC
/*--------------------------------------------------------------------
 * FUNCION:  Pan_DiModo()
 * OBJETIVO: Decir en qu modo de pantalla se encuentra el PC
 * ENTRADAS: Ninguna
 * SALIDAS:  El modo
 * EJEMPLO:  Pan_DiModo()
 *------------------------------------------------------------------*/
int Pan_DiModo ()
  {
  union REGS r;

  r.h.ah = 0x0F;
  int86 (0x10,&r,&r);

  return ( r.h.al );
  }
#endif

#ifdef OLIMPO_PC
/*--------------------------------------------------------------------
 * FUNCION:  Pan_DisponibleVGA()
 * OBJETIVO: Decir si el PC tiene conectada una tarjeta VGA
 * ENTRADAS: Ninguna
 * SALIDAS:  Lgica
 * EJEMPLO:  Pan_DisponibleVGA()
 * NOTA:     Ver "Graphics Programming in C", pgina 113
 *           He hecho algunas adaptaciones, por sencillez y para
 *             evitar ciertos errores
 *           Lo difcil es conseguir que la interrupcin escriba
 *             los 64 octetos en la direccin correcta
 *------------------------------------------------------------------*/
logico Pan_DisponibleVGA()
  {
  union  REGS r;
  struct SREGS inr;
  char   Info[64];

  if ( sizeof(char *) == 2 )
    {
    segread(&inr);
    inr.es = inr.ds;
    }
                               
  r.x.di = (int) Info;
  r.x.ax = 0x1B00;
  r.x.bx = 0;
  int86x(0x10,&r,&r,&inr);

  return ( r.h.al == 0x1B );
  }
#endif

#ifdef OLIMPO_PC
/*--------------------------------------------------------------------
 * FUNCION:  Pan_CargaTabla()
 * OBJETIVO: Leer la posicin de la tabla de caracteres de la ROM
 * ENTRADAS: Ninguna
 * SALIDAS:  La variable global Pan_TabCar_ queda modificada
 * EJEMPLO:  Pan_CargaTabla()
 *------------------------------------------------------------------*/
void Pan_CargaTabla()
  {
  _BH = 6;
  _AH = 0x11;
  _AL = 0x30;
  geninterrupt (0x10);
  Pan_TabCar_ = (char far *) MK_FP (_ES,_BP);
  }
#endif