#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "registers.h"

/* ----------------------------------------------------- */

int isIreg (char* regName)
{
  regName = checkAlias (regName);
  if (toupper(regName[0]) != 'I')
    return 0;
  int index = atoi (regName+1);
  return (0 <= index < NO_REGS) ? 1 : 0;
}

int isFreg (char* regName)
{
  regName = checkAlias (regName);
  if (toupper(regName[0]) != 'F')
    return 0;
  int index = atoi (regName+1);
  return (0 <= index < NO_REGS) ? 1 : 0;
}

/* ----------------------------------------------------- */

klunkPtr addrReg (char* regName)
{
  regName = checkAlias (regName);
  int index = atoi (regName+1);
  if (!(0 <= index < NO_REGS))
  {
    printf ("invalid register reference!\n");
    return NULL;
  }
  if (toupper(regName[0]) == 'I')
    return &(IREGS[index]);
  else if (toupper(regName[0]) == 'F')
    return &(FREGS[index]);
  else
  {
    printf ("invalid register reference!\n");
    return NULL;
  }
}

/* ----------------------------------------------------- */

void displayIregs (char f)
{
  // show IREGs in hexadecimal or signed integer format
  char fmt = toupper(f);
  if ((fmt != 'H') && (fmt != 'S'))
  {
    printf (" ... invalid display option ([h] or s)!\n");
    return;
  }
  printf ("\nInteger Registers:\n");
  for (int i = 0;i < NO_REGS;++i)
  {
    printf ("I%02d  ",i);
    if (fmt == 'H')
      show_hex (IREGS[i]);
    else
      show_int (IREGS[i]);
    printf ("\n");
  }
  printf ("\n");
}

void displayFregs (void)
{
  // show FREGs in floating point format
  printf ("\nFloating Point Registers:\n");
  for (int i = 0;i < NO_REGS;++i)
  {
    printf ("F%02d  ",i);
    show_flt (FREGS[i]);
    printf ("\n");
  }
  printf ("\n");
}

/* ----------------------------------------------------- */

char* checkAlias (char* regName)
{
  if (strcmp(regName,"IA") == 0)
    return "I0";
  else if (strcmp(regName,"IB") == 0)
    return "I1";
  else if (strcmp(regName,"IC") == 0)
    return "I2";
  else if (strcmp(regName,"ID") == 0)
    return "I3";
  else if (strcmp(regName,"SAR") == 0)
    return "I4";
  else if (strcmp(regName,"DAR") == 0)
    return "I5";
  else if (strcmp(regName,"OR") == 0)
    return "I6";
  else if (strcmp(regName,"IR") == 0)
    return "I7";
  else if (strcmp(regName,"SP") == 0)
    return "I12";
  else if (strcmp(regName,"FP") == 0)
    return "I13";
  else if (strcmp(regName,"RP") == 0)
    return "I14";
  else if (strcmp(regName,"HP") == 0)
    return "I15";
  else if (strcmp(regName,"ZR") == 0)
    return "I11";
  else if (strcmp(regName,"FA") == 0)
    return "F0";
  else if (strcmp(regName,"FB") == 0)
    return "F1";
  else if (strcmp(regName,"FC") == 0)
    return "F2";
  else if (strcmp(regName,"FD") == 0)
    return "F3";
  else
    return regName;
}

/* ----------------------------------------------------- */
