package devices.NXT;

// C64 font: http://www.dafont.com/commodore-64-pixelized.font?text=D
// Binary to Hexadecimal Converter: 
//   http://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html

public class C64Font {

	static byte[][] fonts =
	{
		/*0: end mark */ 
	            { 0x00, (byte) 0x7e, (byte) 0x42, (byte) 0x42, (byte) 0x42, (byte) 0x42, (byte) 0x7e, 0x00 },
	  
		/*1: A */ { 0x00, (byte) 0xf8, (byte) 0xfc, (byte) 0x16, (byte) 0x16, (byte) 0xfc, (byte) 0xf8, 0x00 },
		/*2: B */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x92, (byte) 0x92, (byte) 0xfe, (byte) 0x6c, 0x00 },
		/* C */ { 0x00, (byte) 0x7c, (byte) 0xfe, (byte) 0x82, (byte) 0x82, (byte) 0xc6, (byte) 0x44, 0x00 },
		/* D */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x82, (byte) 0xc6, (byte) 0x7c, (byte) 0x38, 0x00 },
		/* E */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x92, (byte) 0x92, (byte) 0x82, (byte) 0x82, 0x00 },
		/* F */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x12, (byte) 0x12, (byte) 0x02, (byte) 0x02, 0x00 },
		/* G */ { 0x00, (byte) 0x7c, (byte) 0xfe, (byte) 0x82, (byte) 0x92, (byte) 0xf6, (byte) 0x74, 0x00 },
		/* H */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x10, (byte) 0x10, (byte) 0xfe, (byte) 0xfe, 0x00 },
		
		/* I */ { 0x00, (byte) 0x00, (byte) 0x82, (byte) 0xfe, (byte) 0xfe, (byte) 0x82, (byte) 0x00, 0x00 },		
		/* J */ { 0x00, (byte) 0x40, (byte) 0xc0, (byte) 0x82, (byte) 0xfe, (byte) 0x7e, (byte) 0x02, 0x00 },
		
    /* K */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x38, (byte) 0x6c, (byte) 0xc6, (byte) 0x82, 0x00 },    
    /* L */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, 0x00 },
    
    /* M */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x0c, (byte) 0x18, (byte) 0x0c, (byte) 0xfe, (byte) 0xfe },    
    /* N */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x1c, (byte) 0x38, (byte) 0xfe, (byte) 0xfe, 0x00 },
    
    /* O */ { 0x00, (byte) 0x7c, (byte) 0xfe, (byte) 0x82, (byte) 0x82, (byte) 0xfe, (byte) 0x7c, 0x00 },    
    /* P */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x12, (byte) 0x12, (byte) 0x1e, (byte) 0x0c, 0x00 },
    
    /* Q */ { 0x00, (byte) 0x3c, (byte) 0x7e, (byte) 0x42, (byte) 0xc2, (byte) 0xfe, (byte) 0xbc, 0x00 },
    
    /* R */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x32, (byte) 0x72, (byte) 0xde, (byte) 0x8c, 0x00 },
    
    /* S */ { 0x00, (byte) 0x4c, (byte) 0xde, (byte) 0x92, (byte) 0x92, (byte) 0xf6, (byte) 0x64, 0x00 },
    
    /* T */ { 0x00, (byte) 0x02, (byte) 0x02, (byte) 0xfe, (byte) 0xfe, (byte) 0x02, (byte) 0x02, 0x00 },
    
    /* U */ { 0x00, (byte) 0x7e, (byte) 0xfe, (byte) 0x80, (byte) 0x80, (byte) 0xfe, (byte) 0x7e, 0x00 },
    
    /* V */ { 0x00, (byte) 0x3e, (byte) 0x7e, (byte) 0xc0, (byte) 0xc0, (byte) 0x7e, (byte) 0x3e, 0x00 },
    
    /* W */ { 0x00, (byte) 0xfe, (byte) 0xfe, (byte) 0x60, (byte) 0x30, (byte) 0x60, (byte) 0xfe, (byte) 0xfe },
    
    /* X */ { 0x00, (byte) 0xc6, (byte) 0xee, (byte) 0x38, (byte) 0x38, (byte) 0xee, (byte) 0xc6, 0x00 },
    
    /* Y */ { 0x00, (byte) 0x0e, (byte) 0x1e, (byte) 0xf0, (byte) 0xf0, (byte) 0x1e, (byte) 0x0e, 0x00 },
    
    /*26: Z */ { 0x00, (byte) 0xc2, (byte) 0xe2, (byte) 0xb2, (byte) 0x9a, (byte) 0x8e, (byte) 0x86, 0x00 },
    
    /*27: 0 */ { 0x00, (byte) 0x7c, (byte) 0xfe, (byte) 0x92, (byte) 0x8a, (byte) 0xfe, (byte) 0x7c, 0x00 },
    /*    1 */ { 0x00, (byte) 0x80, (byte) 0x88, (byte) 0xfe, (byte) 0xfe, (byte) 0x80, (byte) 0x80, 0x00 },
    /*    2 */ { 0x00, (byte) 0xc4, (byte) 0xe6, (byte) 0xa2, (byte) 0x92, (byte) 0x9e, (byte) 0x8c, 0x00 },
    /*    3 */ { 0x00, (byte) 0x44, (byte) 0xc6, (byte) 0x92, (byte) 0x92, (byte) 0xfe, (byte) 0x6c, 0x00 },
    /*    4 */ { 0x00, (byte) 0x30, (byte) 0x38, (byte) 0x2c, (byte) 0xfe, (byte) 0xfe, (byte) 0x20, 0x00 },
    /*    5 */ { 0x00, (byte) 0x4e, (byte) 0xce, (byte) 0x8a, (byte) 0x8a, (byte) 0xfa, (byte) 0x72, 0x00 },
    /*    6 */ { 0x00, (byte) 0x7c, (byte) 0xfe, (byte) 0x92, (byte) 0x92, (byte) 0xf6, (byte) 0x64, 0x00 },
    /*    7 */ { 0x00, (byte) 0x02, (byte) 0x02, (byte) 0xf2, (byte) 0xfa, (byte) 0x0e, (byte) 0x06, 0x00 },
    /*    8 */ { 0x00, (byte) 0x6c, (byte) 0xfe, (byte) 0x92, (byte) 0x92, (byte) 0xfe, (byte) 0x6c, 0x00 },
    /*36: 9 */ { 0x00, (byte) 0x4c, (byte) 0xde, (byte) 0x92, (byte) 0x92, (byte) 0xfe, (byte) 0x7c, 0x00 },
    
    /*37: + */ { 0x00, (byte) 0x10, (byte) 0x10, (byte) 0x7c, (byte) 0x7c, (byte) 0x10, (byte) 0x10, 0x00 },
    /*    , */ { 0x00, (byte) 0x00, (byte) 0x80, (byte) 0xe0, (byte) 0x60, (byte) 0x00, (byte) 0x00, 0x00 },
    /*    - */ { 0x00, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, 0x00 },
    /*    . */ { 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x60, (byte) 0x60, (byte) 0x00, (byte) 0x00, 0x00 },
    /*41: / */ { 0x00, (byte) 0x80, (byte) 0xc0, (byte) 0x60, (byte) 0x30, (byte) 0x18, (byte) 0x0c, 0x04 },
    
    /*42 : */ { 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x6c, (byte) 0x6c, (byte) 0x00, (byte) 0x00, 0x00 },  
    /*   ; */ { 0x00, (byte) 0x00, (byte) 0x80, (byte) 0xec, (byte) 0xec, (byte) 0x00, (byte) 0x00, 0x00 },
    /*   < */ { 0x00, (byte) 0x10, (byte) 0x38, (byte) 0x6c, (byte) 0xc6, (byte) 0x82, (byte) 0x82, 0x00 },
    /*   = */ { 0x00, (byte) 0x00, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x00, 0x00 },
    /*46 > */ { 0x00, (byte) 0x82, (byte) 0x82, (byte) 0xc6, (byte) 0x6c, (byte) 0x38, (byte) 0x10, 0x00 },
    /*47 ? */ { 0x00, (byte) 0x04, (byte) 0x06, (byte) 0xa2, (byte) 0xb2, (byte) 0x1e, (byte) 0x0c, 0x00 }, 
    
    /*48 SPACE */ 
              { 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 0x00 } 
    
	};
	
	static final byte SPACE         = 32;
	
	static final byte PLUS          = 43;
	static final byte COMMA         = 44;
	static final byte MINUS         = 45;
	static final byte FULLSTOP      = 46;
	static final byte SLASH         = 47;
	
	static final byte COLON         = 58;
	static final byte SEMICOLON     = 59;
	static final byte LESS_THAN     = 60;
	static final byte EQUALS_SIGN   = 61;
	static final byte GREATER_THAN  = 62;
	static final byte QUESTION_MARK = 63;

	public static byte[] get(char c) 
  {
    if (isDigit(c))
    {
      return fonts[(byte) (c -'0' + 27)];
    }
    else if (isLowerCase(c))
    {
      return fonts[(byte) (c - 'A' - 32 + 1)];
    }
    else if (isUpperCase(c))
    {
      return fonts[(byte) (c - 'A' + 1)];
    }      
    else
    {
      switch (c)
      {
        case PLUS:         return fonts[37];
        case COMMA:        return fonts[38];
        case MINUS:        return fonts[39];
        case FULLSTOP:     return fonts[40];
        case SLASH:        return fonts[41];
        
        case COLON:        return fonts[42];
        case SEMICOLON:    return fonts[43];
        case LESS_THAN:    return fonts[44];
        case EQUALS_SIGN:  return fonts[45];
        case GREATER_THAN: return fonts[46];
        case QUESTION_MARK:return fonts[47];
        
        case SPACE:        return fonts[48];
        
        default:           return fonts[0];
      }
    }
  }
	
	public static boolean isDigit (char c)
	{
	  if (48 <= c && c <= 57)
	    return true;
	  return false;
	}
	
	public static boolean isLowerCase (char c)
  {
    if (97 <= c && c <= 122)
      return true;
    return false;
  }
	
	public static boolean isUpperCase (char c)
  {
    if (65 <= c && c <= 90)
      return true;
    return false;
  }

}
