Mirror of CollapseOS
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

102 行
3.1KB

  1. #include "ps2_kbd.h"
  2. void kbd_init(Kbd *kbd, Tristate *TH)
  3. {
  4. kbd->kc = 0;
  5. kbd->breaking = false;
  6. kbd->TH = TH;
  7. }
  8. void kbd_pressshift(Kbd *kbd, bool ispressed)
  9. {
  10. kbd->kc = 0x12; // shift keycode
  11. kbd->breaking = !ispressed;
  12. }
  13. void kbd_presskey(Kbd *kbd, uint8_t key)
  14. {
  15. kbd->kc = 0;
  16. switch (key) {
  17. case '\t': kbd->kc = 0xd; break;
  18. case '`': kbd->kc = 0xe; break;
  19. case 'q': kbd->kc = 0x15; break;
  20. case '1': kbd->kc = 0x16; break;
  21. case 'z': kbd->kc = 0x1a; break;
  22. case 's': kbd->kc = 0x1b; break;
  23. case 'a': kbd->kc = 0x1c; break;
  24. case 'w': kbd->kc = 0x1d; break;
  25. case '2': kbd->kc = 0x1e; break;
  26. case 'c': kbd->kc = 0x21; break;
  27. case 'x': kbd->kc = 0x22; break;
  28. case 'd': kbd->kc = 0x23; break;
  29. case 'e': kbd->kc = 0x24; break;
  30. case '4': kbd->kc = 0x25; break;
  31. case '3': kbd->kc = 0x26; break;
  32. case ' ': kbd->kc = 0x29; break;
  33. case 'v': kbd->kc = 0x2a; break;
  34. case 'f': kbd->kc = 0x2b; break;
  35. case 't': kbd->kc = 0x2c; break;
  36. case 'r': kbd->kc = 0x2d; break;
  37. case '5': kbd->kc = 0x2e; break;
  38. case 'n': kbd->kc = 0x31; break;
  39. case 'b': kbd->kc = 0x32; break;
  40. case 'h': kbd->kc = 0x33; break;
  41. case 'g': kbd->kc = 0x34; break;
  42. case 'y': kbd->kc = 0x35; break;
  43. case '6': kbd->kc = 0x36; break;
  44. case 'm': kbd->kc = 0x3a; break;
  45. case 'j': kbd->kc = 0x3b; break;
  46. case 'u': kbd->kc = 0x3c; break;
  47. case '7': kbd->kc = 0x3d; break;
  48. case '8': kbd->kc = 0x3e; break;
  49. case ',': kbd->kc = 0x41; break;
  50. case 'k': kbd->kc = 0x42; break;
  51. case 'i': kbd->kc = 0x43; break;
  52. case 'o': kbd->kc = 0x44; break;
  53. case '0': kbd->kc = 0x45; break;
  54. case '9': kbd->kc = 0x46; break;
  55. case '.': kbd->kc = 0x49; break;
  56. case '/': kbd->kc = 0x4a; break;
  57. case 'l': kbd->kc = 0x4b; break;
  58. case ';': kbd->kc = 0x4c; break;
  59. case 'p': kbd->kc = 0x4d; break;
  60. case '-': kbd->kc = 0x4e; break;
  61. case '\'': kbd->kc = 0x52; break;
  62. case '[': kbd->kc = 0x54; break;
  63. case '=': kbd->kc = 0x55; break;
  64. case '\r': kbd->kc = 0x5a; break;
  65. case ']': kbd->kc = 0x5b; break;
  66. case '\\': kbd->kc = 0x5d; break;
  67. case '\b': kbd->kc = 0x66; break;
  68. }
  69. }
  70. uint8_t kbd_rd(Kbd *kbd)
  71. {
  72. // There are 3 modes for reading the kbd:
  73. // 1. TH = highz: we're polling the the existence of a KC
  74. // 2. TH = low: return low nibble
  75. // 3. TH = high: return high nibble and reset KC
  76. uint8_t res = 0;
  77. uint8_t tosend = kbd->kc;
  78. if (kbd->breaking) {
  79. tosend = 0xf0;
  80. }
  81. if (*kbd->TH == TRI_HIGHZ) { // polling
  82. if (!kbd->kc) {
  83. res = 0x10; // indicate KC absence;
  84. }
  85. } else if (*kbd->TH == TRI_LOW) { // TH selected
  86. res = tosend & 0xf;
  87. } else {
  88. res = tosend >> 4;
  89. if (kbd->breaking) {
  90. kbd->breaking = false;
  91. } else {
  92. kbd->kc = 0;
  93. }
  94. }
  95. return res;
  96. }