/*-------------------------------------------*/
/*                                           */
/*    Filename:  hp_modes.include            */
/*                                           */
/*    Contains C source code for routines    */
/*    CheckModes, SetAngleMode, SetBase      */
/*    and SetValidKeys, which are used by    */
/*           the routine hp.c                */
/*                                           */
/*-------------------------------------------*/

CheckModes()
{
  mode_changed = FALSE;

  if ( (inkey >= 19) && (inkey <= 24) )    {
    if ( inkey == 19 ) SetBase( BINARY  );
    if ( inkey == 20 ) SetBase( OCTAL   );
    if ( inkey == 21 ) SetBase( DECIMAL );
    if ( inkey == 22 ) SetBase( HEX     );
    if ( inkey == 23 ) SetBase( FLOAT   );
    if ( inkey == 24 ) SetBase( COMPLEX );
    SetValidKeys();                        }
                                                
  if ( (inkey >= 25) && (inkey <= 27) )          {
    if ( inkey == 25 ) SetAngleMode( DEGREES  );
    if ( inkey == 26 ) SetAngleMode( RADIANS  );
    if ( inkey == 27 ) SetAngleMode( GRADIANS );
    mode_changed = TRUE;                         }
}
/*--------------------------------------------------------*/
SetAngleMode( a )
int a;

{ int k1color, k2color, k3color;
  angmode = a;

  k1color = 2;
  k2color = 2;
  k3color = 2;

  if ( a == DEGREES  ) {  k1color = 3;
                          angfac  = PI / 180.0; }
  if ( a == RADIANS  ) {  k2color = 3;
                          angfac  = 1.0;        }
                      
  if ( a == GRADIANS ) {  k3color = 3;
                          angfac  = PI / 200.0; }

  ymin = 107;
  xmin =  46;
  SetAPen( rp, k1color );
  DrawKey();
  xmin = 102;
  SetAPen( rp, k2color );
  DrawKey();
  xmin = 158;
  SetAPen( rp, k3color );
  DrawKey();

  SetDrMd( rp, JAM1 );
  Move( rp, STARTX, 114 );
  SetAPen( rp, TAN );
  Text( rp, "deg    rad    grd", 17 );

  Move( rp, STARTX, 114 );
  SetAPen( rp, BLACK );
  if ( a == DEGREES  ) Text( rp, "deg              ", 17);
  if ( a == RADIANS  ) Text( rp, "       rad       ", 17);
  if ( a == GRADIANS ) Text( rp, "              grd", 17);

  SetDrMd( rp, JAM2 );

}
/*-------------------------------------------------------------------*/
SetBase( b )
int b;

{ int oldbase;

  if ( b == base ) return(0);
  mode_changed = TRUE;

  ymin = 90;
  xmin = x_field[ base ] - 6;
  SetAPen( rp, BLACK );
  DrawKey();
  Move( rp, x_field[ base ], 97 );
  SetDrMd( rp, JAM1 );
  SetAPen( rp, TAN  );
  Text( rp, x_text[ base ], 3 );

  /*  If we've switched to or from integer mode, clear both stacks */
  if ( ((base-2)*(b-2)) < 0 ) {
     entry_in_progress = FALSE;
     x  = 0.0;
     y  = 0.0;
     z  = 0.0;
     t  = 0.0;
     ix =   0;
     iy =   0;
     iz =   0;
     it =   0; }

  oldbase = base;
  base = b;
  xmin = x_field[ base ] - 6;
  SetAPen( rp, YELLOW );
  DrawKey();
  Move( rp, x_field[ base ], 97 );
  SetAPen( rp, BLACK );
  Text( rp, x_text[ base ], 3 );
  SetDrMd( rp, JAM2 );

  /* Between float and complex, no need to redraw the display */
  if ( (oldbase < 2) && (base < 2) ) return(0);

  /*  Erases display  */
  DrawDisplay();

  base = oldbase;
  if ( (base > 1) && (b > 1) )       {
    if ( entry_in_progress )      {
         entry_in_progress = FALSE;
         PushX();                 }  }
  base = b;

  if ( base < BINARY )
    DisplayFloatXY();
  else
    DisplayIntXY();

}
/*--------------------------------------------------------*/
SetValidKeys()
{ int i;

   for( i =  1; i <= 12; i++ ) key_valid[i] = TRUE;
   for( i = 13; i <= 18; i++ ) key_valid[i] = FALSE;
   for( i = 28; i <= 45; i++ ) key_valid[i] = TRUE;
   key_valid[50] = TRUE;
   key_valid[54] = TRUE;

   if ( base < 2 ) return(0);

   for( i = 13; i <= 18; i++ ) key_valid[i] = TRUE;

   key_valid[28] = FALSE;
   key_valid[29] = FALSE;
   key_valid[30] = FALSE;
   key_valid[33] = FALSE;
   key_valid[34] = FALSE;
   key_valid[35] = FALSE;
   key_valid[36] = FALSE;
   key_valid[43] = FALSE;
   key_valid[44] = FALSE;
   key_valid[45] = FALSE;
   key_valid[50] = FALSE;
   key_valid[54] = FALSE;

   if ( base < 16 ) {
     for( i = 13; i <= 18; i++) key_valid[i] = FALSE; }

   if ( base < 10 ) {
     key_valid[2] = FALSE;
     key_valid[3] = FALSE; }

   if (base <  8 ) {
     key_valid[ 1] = FALSE;
     key_valid[ 5] = FALSE;
     key_valid[ 6] = FALSE;
     key_valid[ 7] = FALSE;
     key_valid[10] = FALSE;
     key_valid[11] = FALSE; }

}
/*--------------------------------------------------------*/
