OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / keyboard.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/keyboard.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/keyboard.c
new file mode 100644 (file)
index 0000000..d63c6a3
--- /dev/null
@@ -0,0 +1,116 @@
+\r
+#include "core.h"\r
+\r
+uchar keytable0[0x80] = {\r
+       0  , 0  , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0  , 0  ,\r
+       'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0  , 0  , 'A', 'S', \r
+       'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0  , 0  , ']', 'Z', 'X', 'C', 'V',\r
+       'B', 'N', 'M', ',', '.', '/', 0  , '*', 0  , ' ', 0  , 0  , 0  , 0  , 0  , 0  ,      \r
+       0  , 0  , 0  , 0  , 0  , 0  , 0  , '7', '8', '9', '-', '4', '5', '6', '+', '1',\r
+       '2', '3', '0', '.', 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , \r
+       0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , \r
+       0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  \r
+};\r
+\r
+uchar keytable1[0x80] = {\r
+       0  , 0  , '!',0x22, '#', '$', '%', '&',0x27, '(', ')', '~', '=', '~', 0  , 0  ,\r
+       'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0  , 0  , 'A', 'S', \r
+       'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0  , 0  , '}', 'Z', 'X', 'C', 'V',\r
+       'B', 'N', 'M', '<', '>', '?', 0  , '*', 0  , ' ', 0  , 0  , 0  , 0  , 0  , 0  ,      \r
+       0  , 0  , 0  , 0  , 0  , 0  , 0  , '7', '8', '9', '-', '4', '5', '6', '+', '1',\r
+       '2', '3', '0', '.', 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , \r
+       0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , \r
+       0  , 0  , 0  , '_', 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , 0  , '|', 0  , 0  \r
+};\r
+\r
+uint key_shift = 0, key_leds;\r
+uint offset_data_k;\r
+\r
+void init_keyboard(uint offset)\r
+{\r
+       offset_data_k = offset;\r
+\r
+       wait_KBC_sendready();\r
+       io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);\r
+       wait_KBC_sendready();\r
+       io_out8(KEYB_DATA, KBC_MODE);\r
+\r
+       set_gatedesc(system.io.interrupt.idt + 0x21, (int) asm_inthandler21, 2 * 8, AR_INTGATE32);\r
+       io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0xfd);\r
+\r
+       key_leds = (system.data.info.boot.leds >> 4) & 7;\r
+       fifo32_put(&system.data.fifo.keycmd, KEYCMD_LED);\r
+       fifo32_put(&system.data.fifo.keycmd, key_leds);\r
+\r
+       return;\r
+}\r
+\r
+void inthandler21(int *esp)\r
+{\r
+       int data;\r
+       data = io_in8(KEYB_DATA);\r
+       io_out8(PIC0_OCW2, 0x61);       /* IRQ-01\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92\81B0x60+\94Ô\8d\86\81B*/\r
+       fifo32_put(&system.data.fifo.keyctrl, data + offset_data_k);\r
+       return;\r
+}\r
+\r
+void decode_key(UI_KeyInfo *info, uint data)\r
+{\r
+       if(data == 0xfa){\r
+               system.io.keyboard.cmd_wait = -1;\r
+       } else if(data == 0xfe){\r
+               wait_KBC_sendready();\r
+               io_out8(KEYB_DATA, system.io.keyboard.cmd_wait);\r
+       }\r
+\r
+       if(data >= 0x00 && data <= 0x7f){\r
+               info->make = true;\r
+               if(data == 0x2a) key_shift |= 1;/*LShift on*/\r
+               else if(data == 0x36) key_shift |= 2;/*Rshift on*/\r
+               else if(data == 0x3a) keylock(4);/*CapsLock*/\r
+               else if(data == 0x45) keylock(2);/*NumLock*/\r
+               else if(data == 0x46) keylock(1);/*ScrollLock*/\r
+       } else if(data >= 0x80 && data <= 0xff){\r
+               info->make = false;\r
+               data -= 0x80;\r
+               if(data == 0x2a) key_shift &= ~1;/*LShift off*/\r
+               else if(data == 0x36) key_shift &= ~2;/*Rshift off*/\r
+       }\r
+\r
+       if(key_shift == 0){\r
+               info->c = keytable0[data];\r
+       } else{\r
+               info->c = keytable1[data];\r
+       }\r
+\r
+       if('A' <= info->c && info->c <= 'Z'){\r
+               if(((key_leds & 4) == 0 && key_shift == 0) || ((key_leds & 4) != 0 && key_shift != 0)) info->c += 0x20;\r
+               info->alphabet = true;\r
+       } else {\r
+               info->alphabet = false;\r
+       }\r
+\r
+       info->keycode = data;\r
+       return;\r
+}\r
+\r
+void keylock(uint led)\r
+{\r
+       if(key_leds == (key_leds ^ led)) key_leds &= ~led;\r
+       else key_leds ^= led;\r
+       fifo32_put(&system.data.fifo.keycmd, KEYCMD_LED);\r
+       fifo32_put(&system.data.fifo.keycmd, key_leds);\r
+       return;\r
+}\r
+\r
+void wait_KBC_sendready(void)\r
+{\r
+       /* \83L\81[\83{\81[\83h\83R\83\93\83g\83\8d\81[\83\89\82ª\83f\81[\83^\91\97\90M\89Â\94\\82É\82È\82é\82Ì\82ð\91Ò\82 */\r
+       for (;;) {\r
+               if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) {\r
+                       break;\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r