/*
   Module modes
*/


#include <stdio.h>  /* RICK 2004/01/29 */
#include <stdlib.h> /* RICK 2004/01/29 */
#include "Bool.h"
#include "Modes.h"
#include "kernel.h"
#include "Erreur.h"

int get_mode_width(int Mode)
{
_kernel_swi_regs In,Out;

   In.r[0] = Mode;
   In.r[1] = 11;

   (void)_kernel_swi(0x35,&In,&Out);
   return(Out.r[2]+1);
}

int get_mode_height(int Mode)
{
_kernel_swi_regs In,Out;

   In.r[0] = Mode;
   In.r[1] = 12;

   (void)_kernel_swi(0x35,&In,&Out);
   return(Out.r[2]+1);
}

int get_mode_xdpi(int Mode)
{
_kernel_swi_regs In,Out;
new_sprite_mode NewMode;

   *(int *)&NewMode = Mode;

   /* Support for Colour Card */
   if(atoi(getenv("FYEO$ColourCard"))||(atoi(getenv("FYEO$ColourCardForce"))))
   {
     if(Mode == atoi(getenv("FYEO$ColourCard15BPP45x45")))
       return(45);

     if(Mode == atoi(getenv("FYEO$ColourCard15BPP90x45")))
       return(90);

     if(Mode == atoi(getenv("FYEO$ColourCard15BPP90x90")))
       return(90);
   };

   if((NewMode.Type != 0) && (Mode != -1))
     return(NewMode.XDpi);
   else
   {
     In.r[0] = Mode;
     In.r[1] = 4;
     (void)_kernel_swi(0x35,&In,&Out);
     return(180/(1<<Out.r[2]));
   };
}

int get_mode_ydpi(int Mode)
{
_kernel_swi_regs In,Out;
new_sprite_mode NewMode;

   *(int *)&NewMode = Mode;

   /* Support for Colour Card */
   if(atoi(getenv("FYEO$ColourCard"))||(atoi(getenv("FYEO$ColourCardForce"))))
   {
     if(Mode == atoi(getenv("FYEO$ColourCard15BPP45x45")))
       return(45);

     if(Mode == atoi(getenv("FYEO$ColourCard15BPP90x45")))
       return(45);

     if(Mode == atoi(getenv("FYEO$ColourCard15BPP90x90")))
       return(90);
   };

   if((NewMode.Type != 0) && (Mode != -1))
     return(NewMode.YDpi);
   else
   {
     In.r[0] = Mode;
     In.r[1] = 5;
     (void)_kernel_swi(0x35,&In,&Out);
     return(180/(1<<Out.r[2]));
   };
}

int get_mode_bpp(int Mode)
{
_kernel_swi_regs In,Out;

   In.r[0] = Mode;
   In.r[1] = 9;

   (void)_kernel_swi(0x35,&In,&Out);
   return(1<<Out.r[2]);
}

int get_mode_from_specs(int Bpp, int XDpi , int YDpi)
{
new_sprite_mode NewMode;

   if((Bpp == 8)&&(XDpi == 45)&&(YDpi == 45))
      return(13);

   if((Bpp == 8)&&(XDpi == 90)&&(YDpi == 45))
      return(15);

   if((Bpp == 8)&&(XDpi == 90)&&(YDpi == 90))
      return(21);

   /* Support for Colour Card */
   if(atoi(getenv("FYEO$ColourCard"))||(atoi(getenv("FYEO$ColourCardForce"))&&(Bpp==16)))
   {
     if((Bpp == 16)&&(XDpi == 45)&&(YDpi == 45))
       return(atoi(getenv("FYEO$ColourCard15BPP45x45")));

     if((Bpp == 16)&&(XDpi == 90)&&(YDpi == 45))
       return(atoi(getenv("FYEO$ColourCard15BPP90x45")));

     if((Bpp == 16)&&(XDpi == 90)&&(YDpi == 90))
       return(atoi(getenv("FYEO$ColourCard15BPP90x90")));
   }
   else
   {

     if((Bpp == 16)&&(XDpi == 45)&&(YDpi == 45))
     {
        NewMode.New = TRUE;
        NewMode.XDpi = 45;
        NewMode.YDpi = 45;
        NewMode.Type = 5;
        return(*(int *)&NewMode);
     };

     if((Bpp == 16)&&(XDpi == 90)&&(YDpi == 45))
     {
        NewMode.New = TRUE;
        NewMode.XDpi = 90;
        NewMode.YDpi = 45;
        NewMode.Type = 5;
        return(*(int *)&NewMode);
    };

     if((Bpp == 16)&&(XDpi == 90)&&(YDpi == 90))
     {
        NewMode.New = TRUE;
        NewMode.XDpi = 90;
        NewMode.YDpi = 90;
        NewMode.Type = 5;
        return(*(int *)&NewMode);
     };

     if((Bpp == 32)&&(XDpi == 45)&&(YDpi == 45))
     {
        NewMode.New = TRUE;
        NewMode.XDpi = 45;
        NewMode.YDpi = 45;
        NewMode.Type = 6;
        return(*(int *)&NewMode);
     };
   };

   if((Bpp == 32)&&(XDpi == 90)&&(YDpi == 45))
   {
      NewMode.New = TRUE;
      NewMode.XDpi = 90;
      NewMode.YDpi = 45;
      NewMode.Type = 6;
      return(*(int *)&NewMode);
   };

   if((Bpp == 32)&&(XDpi == 90)&&(YDpi == 90))
   {
      NewMode.New = TRUE;
      NewMode.XDpi = 90;
      NewMode.YDpi = 90;
      NewMode.Type = 6;
      return(*(int *)&NewMode);
   };

erreur_interne("Bad parameters to get_mode_from_specs");
return(0);
}

int get_cur_mode(void)
{
_kernel_swi_regs In,Out;

   In.r[0] = 135;
   (void)_kernel_swi(0x06,&In,&Out);
   return(Out.r[2]);
}


