OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / mouse.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/mouse.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/mouse.c
new file mode 100644 (file)
index 0000000..894d95f
--- /dev/null
@@ -0,0 +1,123 @@
+\r
+#include "core.h"\r
+\r
+uint offset_data_m;\r
+\r
+void init_mouse(uint offset)\r
+{\r
+       offset_data_m = offset;\r
+\r
+       system.io.mouse.decode.phase = 0;\r
+       /* \83}\83E\83X\82Ì\8f\89\8aú\89» */\r
+       sendto_mouse(MOUSECMD_ENABLE);\r
+       set_gatedesc(system.io.interrupt.idt + 0x2c, (int) asm_inthandler2c, 2 * 8, AR_INTGATE32);\r
+       io_out8(PIC1_IMR, io_in8(PIC1_IMR) & 0xef);\r
+\r
+       return;\r
+}\r
+\r
+void inthandler2c(int *esp)\r
+{\r
+       int data;\r
+\r
+       data = io_in8(KEYB_DATA);\r
+       io_out8(PIC1_OCW2, 0x64);       /* IRQ-12\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92\81B0x60+\94Ô\8d\86\81B*/\r
+       io_out8(PIC0_OCW2, 0x62);       /*IRQ-2\81i\83X\83\8c\81[\83u\81j\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92m*/\r
+       fifo32_put(&system.data.fifo.mousectrl, data + offset_data_m);\r
+       return;\r
+}\r
+\r
+int decode_mouse(uint data)\r
+{\r
+       switch (system.io.mouse.decode.phase){\r
+               case 0:\r
+                       if(data == 0xfa) system.io.mouse.decode.phase = 4;\r
+                       sendto_mouse(0xf3);\r
+                       sendto_mouse(200);\r
+                       break;\r
+               case 1:\r
+                       if((data & 0xc8) == 0x08) {\r
+                               system.io.mouse.decode.buf[0] = data;\r
+                               system.io.mouse.decode.phase = 2;\r
+                       }\r
+                       break;\r
+               case 2:\r
+                       system.io.mouse.decode.buf[1] = data;\r
+                       system.io.mouse.decode.phase = 3;\r
+                       break;\r
+               case 3:\r
+                       system.io.mouse.decode.buf[2] = data;\r
+                       system.io.mouse.decode.phase = 1;\r
+                       system.io.mouse.decode.btn = system.io.mouse.decode.buf[0];\r
+                       system.io.mouse.decode.x = system.io.mouse.decode.buf[1];\r
+                       system.io.mouse.decode.y = system.io.mouse.decode.buf[2];\r
+                       if((system.io.mouse.decode.buf[0] & 0x10) != 0) system.io.mouse.decode.x |= 0xffffff00;\r
+                       if((system.io.mouse.decode.buf[0] & 0x20) != 0) system.io.mouse.decode.y |= 0xffffff00;\r
+                       system.io.mouse.decode.y = - system.io.mouse.decode.y;\r
+                       return 1;\r
+               case 4:\r
+                       if(data == 0xfa) system.io.mouse.decode.phase = 5;\r
+                       sendto_mouse(0xf3);\r
+                       sendto_mouse(100);\r
+                       break;\r
+               case 5:\r
+                       if(data == 0xfa) system.io.mouse.decode.phase = 6;\r
+                       sendto_mouse(0xf3);\r
+                       sendto_mouse(80);\r
+                       break;\r
+               case 6:\r
+                       if(data == 0xfa) system.io.mouse.decode.phase = 7;\r
+                       sendto_mouse(0xf2);\r
+                       break;\r
+               case 7:\r
+                       if(data == 0xfa) break;\r
+                       if(data == 0x00){\r
+                               system.io.mouse.decode.whinfo = 0x00;\r
+                               system.io.mouse.decode.scrool = 0x00;\r
+                               system.io.mouse.decode.phase = 1;\r
+                       } else {\r
+                               system.io.mouse.decode.whinfo = data;\r
+                               system.io.mouse.decode.phase = 8;\r
+                       }                       \r
+                       break;\r
+               case 8:\r
+                       if((data & 0xc8) == 0x08) {\r
+                               system.io.mouse.decode.buf[0] = data;\r
+                               system.io.mouse.decode.phase = 9;\r
+                               }\r
+                       break;\r
+               case 9:\r
+                       system.io.mouse.decode.buf[1] = data;\r
+                       system.io.mouse.decode.phase = 10;\r
+                       break;\r
+               case 10:\r
+                       system.io.mouse.decode.buf[2] = data;\r
+                       system.io.mouse.decode.btn = system.io.mouse.decode.buf[0];\r
+                       system.io.mouse.decode.x = system.io.mouse.decode.buf[1];\r
+                       system.io.mouse.decode.y = system.io.mouse.decode.buf[2];\r
+                       if((system.io.mouse.decode.buf[0] & 0x10) != 0) system.io.mouse.decode.x |= 0xffffff00;\r
+                       if((system.io.mouse.decode.buf[0] & 0x20) != 0) system.io.mouse.decode.y |= 0xffffff00;\r
+                       system.io.mouse.decode.y = - system.io.mouse.decode.y;\r
+                       system.io.mouse.decode.phase = 11;\r
+                       break;\r
+               case 11:\r
+                       system.io.mouse.decode.phase = 8;\r
+                       system.io.mouse.decode.buf[3] = data;\r
+                       system.io.mouse.decode.scrool = system.io.mouse.decode.buf[3] & 0x0f;\r
+                       if(system.io.mouse.decode.scrool & 0x08) {\r
+                               system.io.mouse.decode.scrool |= 0xfffffff0;\r
+                       }\r
+                       return 1;\r
+       }\r
+       return 0;\r
+}\r
+\r
+void sendto_mouse(uint data)\r
+{\r
+       wait_KBC_sendready();\r
+       io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);\r
+       wait_KBC_sendready();\r
+       io_out8(KEYB_DATA, data);\r
+       return;\r
+}\r
+\r