OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / mouse.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/mouse.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/mouse.c
new file mode 100644 (file)
index 0000000..894ab55
--- /dev/null
@@ -0,0 +1,294 @@
+\r
+#include "core.h"\r
+\r
+uint offset_data_m;\r
+DATA_FIFO *sendto_m;\r
+UI_MouseInfo *decode_m;\r
+\r
+uchar mcursor_pattern0[24][24] = {\r
+       ".**.....................",\r
+       "*O**....................",\r
+       "*OO**...................",\r
+       "*OOO**..................",\r
+       "*OOOO**.................",\r
+       "*OOOOO**................",\r
+       "*OOOOOO**...............",\r
+       "*OOOOOOO**..............",\r
+       "*OOOOOOOO**.............",\r
+       "*OOOOOOOOO**............",\r
+       "*OOOOOOOOOO**...........",\r
+       "*OOOOOOOOOOO**..........",\r
+       "*OOOOOOOOOOOO**.........",\r
+       "*OOOOOOOOOOOOO**........",\r
+       "*OOOOOOOOOOOOOO**.......",\r
+       "*OOOOOOOOOOOOOOO**......",\r
+       "*OOOOOOOOOOOOOOOO**.....",\r
+       "*OOOOOO*************....",\r
+       "*OOOOO**................",\r
+       "*OOOO**.................",\r
+       "*OOO**..................",\r
+       "*OO**...................",\r
+       "*O**....................",\r
+       "***.....................",\r
+};\r
+\r
+void Initialise_Mouse(DATA_FIFO *sendto, uint offset, UI_MouseInfo *decode)\r
+{\r
+       sendto_m = sendto;\r
+       offset_data_m = offset;\r
+       decode_m = decode;\r
+Emergency_Out("Mouse Initialise Start");\r
+       decode->phase = 0;\r
+       Mouse_Send_Command(MOUSECMD_RESET);\r
+Emergency_Out("Mouse Send Command");\r
+       System_GateDescriptor_Set(0x2c, (uint)asm_InterruptHandler2c, 0x02, AR_INTGATE32);\r
+       IO_Out8(PIC1_IMR, IO_In8(PIC1_IMR) & 0xef);\r
+Emergency_Out("Mouse Set INT");\r
+\r
+       return;\r
+}\r
+\r
+void InterruptHandler2c(int *esp)\r
+{\r
+       int data;\r
+\r
+       data = IO_In8(KEYB_DATA);\r
+       IO_Out8(PIC1_OCW2, 0x64);\r
+       IO_Out8(PIC0_OCW2, 0x62);\r
+       FIFO32_Put(sendto_m, data + offset_data_m);\r
+       return;\r
+}\r
+\r
+int Mouse_Decode(uint data)\r
+{\r
+       switch (decode_m->phase){\r
+               case 0:\r
+                       if(data == 0xfa){\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 1:\r
+                       if(data == 0xaa){\r
+                               Mouse_Send_Command(MOUSECMD_SET_SAMPLE_RATE);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 2:\r
+                       if(data == 0xfa){\r
+                               Mouse_Send_Command(200);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 3:\r
+                       if(data == 0xfa){\r
+                               Mouse_Send_Command(MOUSECMD_SET_SAMPLE_RATE);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 4:\r
+                       if(data == 0xfa){\r
+                               Mouse_Send_Command(100);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 5:\r
+                       if(data == 0xfa){\r
+                               Mouse_Send_Command(MOUSECMD_SET_SAMPLE_RATE);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 6:\r
+                       if(data == 0xfa){\r
+                               Mouse_Send_Command(80);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 7:\r
+                       if(data == 0xfa){\r
+                               Mouse_Send_Command(MOUSECMD_GET_DEVICE_ID);\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 8:\r
+                       if(data == 0xfa){\r
+                               break;\r
+                       }\r
+                       if(data == 0x00){\r
+                               decode_m->type = threebtn;\r
+                               Mouse_Send_Command(MOUSECMD_ENABLE_DATA_REPORTING);\r
+                               decode_m->phase = 10;\r
+                       } else if(data == 0x03){\r
+                               decode_m->type = threebtn_scroll;\r
+                               Mouse_Send_Command(MOUSECMD_ENABLE_DATA_REPORTING);\r
+                               decode_m->phase = 20;\r
+                       } else{\r
+                               Mouse_Send_Command(MOUSECMD_RESET);\r
+                               decode_m->phase = 0;\r
+                       }\r
+                       break;\r
+\r
+               case 10:\r
+                       if(data == 0xfa){\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 11:\r
+                       if((data & 0xc8) == 0x08) {\r
+                               decode_m->buf[0] = data;\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 12:\r
+                       decode_m->buf[1] = data;\r
+                       decode_m->phase++;\r
+                       break;\r
+               case 13:\r
+                       decode_m->buf[2] = data;\r
+                       decode_m->phase -= 2;\r
+                       decode_m->btn = decode_m->buf[0];\r
+                       decode_m->move.x = decode_m->buf[1];\r
+                       decode_m->move.y = decode_m->buf[2];\r
+                       if(decode_m->buf[0] & 0x10){\r
+                               decode_m->move.x |= 0xffffff00;\r
+                       }\r
+                       if(decode_m->buf[0] & 0x20){\r
+                               decode_m->move.y |= 0xffffff00;\r
+                       }\r
+                       decode_m->move.y = - decode_m->move.y;\r
+                       return 1;\r
+\r
+               case 20:\r
+                       if(data == 0xfa){\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 21:\r
+                       if((data & 0xc8) == 0x08) {\r
+                               decode_m->buf[0] = data;\r
+                               decode_m->phase++;\r
+                       }\r
+                       break;\r
+               case 22:\r
+                       decode_m->buf[1] = data;\r
+                       decode_m->phase++;\r
+                       break;\r
+               case 23:\r
+                       decode_m->buf[2] = data;\r
+                       decode_m->btn = decode_m->buf[0];\r
+                       decode_m->move.x = decode_m->buf[1];\r
+                       decode_m->move.y = decode_m->buf[2];\r
+                       if(decode_m->buf[0] & 0x10){\r
+                               decode_m->move.x |= 0xffffff00;\r
+                       }\r
+                       if(decode_m->buf[0] & 0x20){\r
+                               decode_m->move.y |= 0xffffff00;\r
+                       }\r
+                       decode_m->move.y = - decode_m->move.y;\r
+                       decode_m->phase++;\r
+                       break;\r
+               case 24:\r
+                       decode_m->phase -= 3;\r
+                       decode_m->buf[3] = data;\r
+                       decode_m->scroll = decode_m->buf[3] & 0x0f;\r
+                       if(decode_m->scroll & 0x08) {\r
+                               decode_m->scroll |= 0xfffffff0;\r
+                       }\r
+                       return 1;\r
+       }\r
+       return 0;\r
+}\r
+\r
+void Mouse_Send_Command(uint data)\r
+{\r
+       Keyboard_Controller_Wait_SendReady();\r
+       IO_Out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);\r
+       Keyboard_Controller_Wait_SendReady();\r
+       IO_Out8(KEYB_DATA, data);\r
+       return;\r
+}\r
+\r
+void Mouse_Make_MouseCursor(UI_MouseCursor *cursor, int rangex0, int rangey0, int rangex1, int rangey1, uint height)\r
+{\r
+       cursor->move_range0.x = rangex0;\r
+       cursor->move_range0.y = rangey0;\r
+       cursor->move_range1.x = rangex1;\r
+       cursor->move_range1.y = rangey1;\r
+       cursor->position.x = rangex0;\r
+       cursor->position.y = rangey0;\r
+       cursor->sheet = System_Sheet_Get(24, 24, 0, 0x000000FF);\r
+       Mouse_Draw_MouseCursor(cursor, normal);\r
+       Sheet_Show(cursor->sheet, cursor->position.x, cursor->position.y, height);\r
+       return;\r
+}\r
+\r
+void Mouse_Draw_MouseCursor(UI_MouseCursor *cursor, mcursor_state state)\r
+{\r
+       uint x, y;\r
+       uchar *pattern;\r
+\r
+       pattern = &mcursor_pattern0[0][0];\r
+\r
+       if(state == normal){\r
+               cursor->state = normal;\r
+       } else if(state == wait){\r
+               cursor->state = wait;\r
+       }\r
+\r
+       for (y = 0; y < 24; y++) {\r
+               for (x = 0; x < 24; x++) {\r
+                       if (pattern[y * 24 + x] == '*') {\r
+                               Sheet_Draw_Point(cursor->sheet, 0x000000, x, y);\r
+                       }\r
+                       if (pattern[y * 24 + x] == 'O') {\r
+                               Sheet_Draw_Point(cursor->sheet, 0xFFFFFF, x, y);\r
+                       }\r
+                       if (pattern[y * 24 + x] == '.') {\r
+                               Sheet_Draw_Point(cursor->sheet, 0x0000FF, x, y);\r
+                       }\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void Mouse_Move_Relative(UI_MouseCursor *cursor, int movex, int movey)\r
+{\r
+       cursor->position.x += movex;\r
+       cursor->position.y += movey;\r
+\r
+       if(cursor->position.x < cursor->move_range0.x){\r
+               cursor->position.x = cursor->move_range0.x;\r
+       } else if(cursor->position.x > cursor->move_range1.x){\r
+               cursor->position.x = cursor->move_range1.x;\r
+       }\r
+       if(cursor->position.y < cursor->move_range0.y){\r
+               cursor->position.y = cursor->move_range0.y;\r
+       } else if(cursor->position.y > cursor->move_range1.y){\r
+               cursor->position.y = cursor->move_range1.y;\r
+       }\r
+\r
+       Sheet_Slide(cursor->sheet, cursor->position.x, cursor->position.y);\r
+\r
+       return;\r
+}\r
+\r
+void Mouse_Move_Absolute(UI_MouseCursor *cursor, int px, int py)\r
+{\r
+       cursor->position.x = px;\r
+       cursor->position.y = py;\r
+\r
+       if(cursor->position.x < cursor->move_range0.x){\r
+               cursor->position.x = cursor->move_range0.x;\r
+       } else if(cursor->position.x > cursor->move_range1.x){\r
+               cursor->position.x = cursor->move_range1.x;\r
+       }\r
+       if(cursor->position.y < cursor->move_range0.y){\r
+               cursor->position.y = cursor->move_range0.y;\r
+       } else if(cursor->position.y > cursor->move_range1.y){\r
+               cursor->position.y = cursor->move_range1.y;\r
+       }\r
+\r
+       Sheet_Slide(cursor->sheet, cursor->position.x, cursor->position.y);\r
+\r
+       return;\r
+}\r