/*--------------------------------------------------------------------
 * FICHERO:  MemLeeEn.c
 * OBJETIVO: Definir la funcin Mem_LeeEntero()
 * AUTOR:    Pedro Reina
 * FECHA:    J.27.7.1995
 *------------------------------------------------------------------*/

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

#include "Memoria.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Mem_LeeEntero()
 * OBJETIVO: Dar el valor de una posicin de memoria como entero
 * ENTRADAS: La posicin de memoria y el modo de almacenamiento
 * SALIDAS:  El valor
 * EJEMPLO:  Mem_LeeEntero (Memoria+10, MEM_MOTOROLA)
 * ALGORITMO:
 *      Si el modo es el nativo del ordenador, se devuelve el valor natural
 *      Si no, se intercambian los cuatro octetos, se devuelve el valor
 *             natural y se vuelven a intercambiar.
 * NOTA: En el QL (con GC o MP, no en la QXL) se produce un extrao
 *       error al llamar a esta funcin desde el objeto TIFF, y no
 *       funciona bien. Por eso la he escrito tan rara. Si se cambia
 *       de versin en el compilador, conviene volver a interlarlo
 *       por la va normal
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
entero Mem_LeeEntero (Memoria, Modo)
memoria Memoria;
octeto  Modo;
  {
  entero Respuesta;
  
  if ( Modo == MEM_INTEL )
    { Respuesta = * ((entero *)Memoria); }
    
  else
    {
    Mem_Intercambia (Memoria,Memoria+3);
    Mem_Intercambia (Memoria+1,Memoria+2);
    Respuesta = * ((entero *)Memoria);
    Mem_Intercambia (Memoria,Memoria+3);
    Mem_Intercambia (Memoria+1,Memoria+2);
    }
  
  return ( Respuesta );
  }
#endif

#ifdef OLIMPO_QL
entero Mem_LeeEntero (Memoria, Modo)
memoria Memoria;
octeto  Modo;
  {
  entero Respuesta;

  if ( Modo == MEM_MOTOROLA )
    {
    Respuesta = 256L * 256L * 256L * *((octeto *)Memoria)
                 + 256L * 256L * *((octeto *)(Memoria+1))
                 + 256L * *((octeto *)(Memoria+2))
                 + *((octeto *)(Memoria+3));
    }

  else if ( Modo == MEM_INTEL )
    {
    Respuesta = *((octeto *)Memoria)
                + 256L * *((octeto *)(Memoria+1))
                + 256L * 256L * *((octeto *)(Memoria+2))
                + 256L * 256L * 256L * *((octeto *)(Memoria+3));
    }

  return ( Respuesta );
  }
#endif
  