/*--------------------------------------------------------------------
 * FICHERO:  ZonPixFi.c
 * OBJETIVO: Definir la funcin Zon_PixelFisico()
 * AUTOR:    Pedro Reina
 * FECHA:    V.14.4.1995
 *------------------------------------------------------------------*/

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

#include "Zona.h"

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

/*--------------------------------------------------------------------
 * FUNCION:  Zon_PixelFisico()
 * OBJETIVO: Dibujar un pixel de la pantalla
 * ENTRADAS: Los valores "x" e "y" del pixel y el color
 * SALIDAS:  SI, ya que debe poder ejecutarse
 * NOTAS:    1. Los valores "x" e "y" se cuentan a partir de 0 desde la
 *              izquierda y desde arriba respectivamente
 *           2. Para ejecutar esta funcin el pixel debe existir
 * EJEMPLO:  Zon_PixelFisico ( 3, 8, ROJO )
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
#pragma warn -aus
logico Zon_PixelFisico (X, Y, Color)
contador X, Y;
octeto   Color;
  {
  char far    * Direccion;
  unsigned char Mascara;
  int           Inutil;

  Direccion = MK_FP ( 0xA000, (int) 80*Y + X/8 );
  Mascara = 0x80 >> X%8;

  Pan_MandaOrden (0x3CE,8,Mascara);
  Pan_MandaOrden (0x3C4,2,0x0F);
  Inutil = *Direccion;
  *Direccion = 0;
  Pan_MandaOrden (0x3C4,2,Color);
  *Direccion = 0xFF;

  Pan_MandaOrden (0x3C4,2,0x0F);
  Pan_MandaOrden (0x3CE,3,0);
  Pan_MandaOrden (0x3CE,8,0xFF);

  return ( SI );
  }
#pragma warn +aus
#endif

#ifdef OLIMPO_QL
logico Zon_PixelFisico (X, Y, Color)
contador X, Y;
octeto   Color;
  {
  memoria Direccion;
  octeto  Mascara;

  Mascara = 0x80 >> X%8;

  X /= 8;
  Direccion = (memoria) (Pan_Comienzo() + 128 * Y + 2 * X);

  switch ( Color )
    {
    case VERDE:
                 *Direccion     |= Mascara;
                 *(Direccion+1) &= ~Mascara;
                 break;
    case ROJO:
                 *Direccion     &= ~Mascara;
                 *(Direccion+1) |= Mascara;
                 break;
    case BLANCO:
                 *Direccion     |= Mascara;
                 *(Direccion+1) |= Mascara;
                 break;
    case NEGRO:
                 *Direccion     &= ~Mascara;
                 *(Direccion+1) &= ~Mascara;
                 break;
    }

  return ( SI );
  }
#endif
