@Override
 public boolean onKey(View v, int keyCode, KeyEvent event) {
   KeyModifiers m = new KeyModifiers();
   m.shift = event.isShiftPressed();
   m.alt = event.isAltPressed();
   final char k = TranslateKey(keyCode, m);
   if (k == 0) return false;
   if (event.getAction() == KeyEvent.ACTION_DOWN) Emulator.the.OnKey(k, true, m.shift, m.alt);
   else Emulator.the.OnKey(k, false, false, false);
   return true;
 }
  private final char TranslateKey(final int keyCode, KeyModifiers m) {
    switch (keyCode) {
      case KeyEvent.KEYCODE_DPAD_LEFT:
        return 'l';
      case KeyEvent.KEYCODE_DPAD_RIGHT:
        return 'r';
      case KeyEvent.KEYCODE_DPAD_UP:
        return 'u';
      case KeyEvent.KEYCODE_DPAD_DOWN:
        return 'd';
      case KeyEvent.KEYCODE_DPAD_CENTER:
        return 'f';

      case KeyEvent.KEYCODE_0:
        return '0';
      case KeyEvent.KEYCODE_1:
        return '1';
      case KeyEvent.KEYCODE_2:
        return '2';
      case KeyEvent.KEYCODE_3:
        return '3';
      case KeyEvent.KEYCODE_4:
        return '4';
      case KeyEvent.KEYCODE_5:
        return '5';
      case KeyEvent.KEYCODE_6:
        return '6';
      case KeyEvent.KEYCODE_7:
        return '7';
      case KeyEvent.KEYCODE_8:
        return '8';
      case KeyEvent.KEYCODE_9:
        return '9';

      case KeyEvent.KEYCODE_A:
        return 'A';
      case KeyEvent.KEYCODE_B:
        return 'B';
      case KeyEvent.KEYCODE_C:
        return 'C';
      case KeyEvent.KEYCODE_D:
        return 'D';
      case KeyEvent.KEYCODE_E:
        return 'E';
      case KeyEvent.KEYCODE_F:
        return 'F';
      case KeyEvent.KEYCODE_G:
        return 'G';
      case KeyEvent.KEYCODE_H:
        return 'H';
      case KeyEvent.KEYCODE_I:
        return 'I';
      case KeyEvent.KEYCODE_J:
        return 'J';
      case KeyEvent.KEYCODE_K:
        return 'K';
      case KeyEvent.KEYCODE_L:
        return 'L';
      case KeyEvent.KEYCODE_M:
        return 'M';
      case KeyEvent.KEYCODE_N:
        return 'N';
      case KeyEvent.KEYCODE_O:
        return 'O';
      case KeyEvent.KEYCODE_P:
        return 'P';
      case KeyEvent.KEYCODE_Q:
        return 'Q';
      case KeyEvent.KEYCODE_R:
        return 'R';
      case KeyEvent.KEYCODE_S:
        return 'S';
      case KeyEvent.KEYCODE_T:
        return 'T';
      case KeyEvent.KEYCODE_U:
        return 'U';
      case KeyEvent.KEYCODE_V:
        return 'V';
      case KeyEvent.KEYCODE_W:
        return 'W';
      case KeyEvent.KEYCODE_X:
        return 'X';
      case KeyEvent.KEYCODE_Y:
        return 'Y';
      case KeyEvent.KEYCODE_Z:
        return 'Z';

      case KeyEvent.KEYCODE_ENTER:
        return 'e';
      case KeyEvent.KEYCODE_SPACE:
        return ' ';
      case KeyEvent.KEYCODE_SHIFT_LEFT:
      case KeyEvent.KEYCODE_SHIFT_RIGHT:
        return 'c';
      case KeyEvent.KEYCODE_ALT_LEFT:
      case KeyEvent.KEYCODE_ALT_RIGHT:
        return 's';

        //		case KeyEvent.KEYCODE_MENU:				return 'm';
        //		case KeyEvent.KEYCODE_BACK:				return 'k';
      case KeyEvent.KEYCODE_CALL:
        return 'e';
      case KeyEvent.KEYCODE_CAMERA:
        return ' ';
      case KeyEvent.KEYCODE_DEL:
        m.shift = true;
        return '0';
      case KeyEvent.KEYCODE_COMMA:
        m.alt = true;
        return 'N';
      case KeyEvent.KEYCODE_PERIOD:
        m.alt = true;
        return 'M';
      case KeyEvent.KEYCODE_SLASH:
        m.alt = true;
        return 'V';
      default:
        return 0;
    }
  }