OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / mouse.c
1 \r
2 #include "core.h"\r
3 \r
4 uint mouse_data0;\r
5 DATA_FIFO32 *mouse_fifo;\r
6 uint mouse_retv;\r
7 \r
8 uchar Mouse_Pattern_Standard[24][24] = {\r
9         ".**.....................",\r
10         "*O**....................",\r
11         "*OO**...................",\r
12         "*OOO**..................",\r
13         "*OOOO**.................",\r
14         "*OOOOO**................",\r
15         "*OOOOOO**...............",\r
16         "*OOOOOOO**..............",\r
17         "*OOOOOOOO**.............",\r
18         "*OOOOOOOOO**............",\r
19         "*OOOOOOOOOO**...........",\r
20         "*OOOOOOOOOOO**..........",\r
21         "*OOOOOOOOOOOO**.........",\r
22         "*OOOOOOOOOOOOO**........",\r
23         "*OOOOOOOOOOOOOO**.......",\r
24         "*OOOOOOOOOOOOOOO**......",\r
25         "*OOOOOOOOOOOOOOOO**.....",\r
26         "*OOOOOO************.....",\r
27         "*OOOOO**................",\r
28         "*OOOO**.................",\r
29         "*OOO**..................",\r
30         "*OO**...................",\r
31         "*O**....................",\r
32         "***.....................",\r
33 };\r
34 \r
35 IO_MouseControl *Initialize_Mouse(void)\r
36 {\r
37         IO_MouseControl *mctrl;\r
38 \r
39         mouse_data0 = 0;\r
40         mouse_fifo = Null;\r
41         mouse_retv = 0;\r
42 \r
43         mctrl = (IO_MouseControl *)System_Memory_Allocate(sizeof(IO_MouseControl));\r
44 \r
45         IO_CLI();\r
46         System_GateDescriptor_Set(0x2c, (uint)asm_InterruptHandler2c, 0x02, AR_INTGATE32);\r
47         ProgrammableInterruptController_InterruptMask_Clear(0x0c);\r
48         IO_STI();\r
49 \r
50         return mctrl;\r
51 }\r
52 \r
53 void InterruptHandler2c(uint *esp)\r
54 {\r
55         uint data;\r
56 \r
57         data = IO_In8(PORT_KEYDATA);\r
58 \r
59         ProgrammableInterruptController_InterruptRequest_Complete(0x0c);\r
60 \r
61         if(mouse_fifo != 0){\r
62                 FIFO32_Put(mouse_fifo, data + mouse_data0);\r
63         }\r
64 \r
65         if(data == KEYDATA_ACK || data == KEYDATA_RESEND){\r
66                 mouse_retv = data;\r
67         }\r
68 \r
69         return;\r
70 }\r
71 \r
72 void Mouse_Set_ReceiveFIFO(DATA_FIFO32 *fifo, uint data0)\r
73 {\r
74         mouse_data0 = data0;\r
75         mouse_fifo = fifo;\r
76 \r
77         return; \r
78 }\r
79 \r
80 void Mouse_SendCommand(uint cmd)\r
81 {\r
82         KeyboardController_Wait_SendReady();\r
83         IO_Out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);\r
84 \r
85         for(;;){\r
86                 mouse_retv = 0;\r
87                 KeyboardController_Wait_SendReady();\r
88                 IO_Out8(PORT_KEYDATA, cmd);\r
89                 for(;;){\r
90                         if(mouse_retv == KEYDATA_ACK){\r
91                                 return;\r
92                         }\r
93                         if(mouse_retv == KEYDATA_RESEND){\r
94                                 break;\r
95                         }\r
96                 }\r
97         }\r
98         return;\r
99 }\r
100 \r
101 UI_MouseCursor *MouseCursor_Initialize(UI_Sheet *parent)\r
102 {\r
103         UI_MouseCursor *mcursor;\r
104         uint x, y;\r
105 \r
106         if(parent == Null){\r
107                 return Null;\r
108         }\r
109 \r
110         mcursor = System_Memory_Allocate(sizeof(UI_MouseCursor));\r
111         mcursor->cursor_sheet = Sheet_Initialize();\r
112 \r
113         mcursor->cursors[0] = System_Memory_Allocate(24 * 24 * (8 >> 3));\r
114         for(y = 0; y < 24; y++){\r
115                 for(x = 0; x < 24; x++){\r
116                         if(Mouse_Pattern_Standard[y][x] == '.'){\r
117                                 (mcursor->cursors[0])[y * 24 + x] = RGB_32_To_08(0x00ff00);\r
118                         } else if(Mouse_Pattern_Standard[y][x] == 'O'){\r
119                                 (mcursor->cursors[0])[y * 24 + x] = RGB_32_To_08(0xffffff);\r
120                         } else if(Mouse_Pattern_Standard[y][x] == '*'){\r
121                                 (mcursor->cursors[0])[y * 24 + x] = RGB_32_To_08(0x000000);\r
122                         }\r
123                 }\r
124         }\r
125 \r
126         Sheet_SetBuffer(mcursor->cursor_sheet, mcursor->cursors[0], 24, 24, 8);\r
127         Sheet_SetParent(mcursor->cursor_sheet, parent);\r
128         Sheet_Enable_InvisibleColor(mcursor->cursor_sheet, 0x00ff00);\r
129         Sheet_SetTopmost(mcursor->cursor_sheet, True);\r
130         Sheet_Slide_Absolute(mcursor->cursor_sheet, mcursor->cursor_sheet->parent->size.x >> 1, mcursor->cursor_sheet->parent->size.y >> 1);\r
131 \r
132         return mcursor;\r
133 }\r
134 \r
135 uint MouseCursor_Show(UI_MouseCursor *mcursor)\r
136 {\r
137         if(mcursor == Null){\r
138                 return 1;\r
139         }\r
140 \r
141         if(mcursor->cursor_sheet->location.x < 0){\r
142                 mcursor->cursor_sheet->location.x = 0;\r
143         } else if((uint)mcursor->cursor_sheet->location.x > mcursor->cursor_sheet->parent->size.x - 1){\r
144                 mcursor->cursor_sheet->location.x = mcursor->cursor_sheet->parent->size.x - 1;\r
145         }\r
146 \r
147         if(mcursor->cursor_sheet->location.y < 0){\r
148                 mcursor->cursor_sheet->location.y = 0;\r
149         } else if((uint)mcursor->cursor_sheet->location.y > mcursor->cursor_sheet->parent->size.y - 1){\r
150                 mcursor->cursor_sheet->location.y = mcursor->cursor_sheet->parent->size.y - 1;\r
151         }\r
152 \r
153         Sheet_Show(mcursor->cursor_sheet, SHEET_MAX_CHILDREN, SHEET_LOCATION_NOCHANGE, SHEET_LOCATION_NOCHANGE);\r
154 \r
155         return 0;\r
156 }\r
157 \r
158 uint MouseCursor_Move_Relative(UI_MouseCursor *mcursor, int rpx, int rpy)\r
159 {\r
160         if(mcursor == Null){\r
161                 return 1;\r
162         }\r
163 \r
164         rpx += mcursor->cursor_sheet->location.x;\r
165         rpy += mcursor->cursor_sheet->location.y;\r
166 \r
167         if(rpx < 0){\r
168                 rpx = 0;\r
169         } else if((uint)rpx > mcursor->cursor_sheet->parent->size.x - 1){\r
170                 rpx = mcursor->cursor_sheet->parent->size.x - 1;\r
171         }\r
172 \r
173         if(rpy < 0){\r
174                 rpy = 0;\r
175         } else if((uint)rpy > mcursor->cursor_sheet->parent->size.y - 1){\r
176                 rpy = mcursor->cursor_sheet->parent->size.y - 1;\r
177         }\r
178 \r
179         Sheet_Slide_Absolute(mcursor->cursor_sheet, rpx, rpy);\r
180 \r
181         return 0;\r
182 }\r
183 \r
184 uint MouseCursor_Move_Absolute(UI_MouseCursor *mcursor, int apx, int apy)\r
185 {\r
186         if(mcursor == Null){\r
187                 return 1;\r
188         }\r
189 \r
190         if(apx < 0){\r
191                 apx = 0;\r
192         } else if((uint)apx > mcursor->cursor_sheet->parent->size.x - 1){\r
193                 apx = mcursor->cursor_sheet->parent->size.x - 1;\r
194         }\r
195 \r
196         if(apy < 0){\r
197                 apy = 0;\r
198         } else if((uint)apy > mcursor->cursor_sheet->parent->size.y - 1){\r
199                 apy = mcursor->cursor_sheet->parent->size.y - 1;\r
200         }\r
201 \r
202         Sheet_Slide_Absolute(mcursor->cursor_sheet, apx, apy);\r
203 \r
204         return 0;\r
205 }\r
206 \r
207 bool Mouse_Decode(IO_MouseControl *mctrl, uint data)\r
208 {\r
209         switch(mctrl->decode_phase){\r
210 //マウス初期化及びスクロールマウス識別\r
211                 case 0:\r
212                         Mouse_SendCommand(MOUSECMD_RESET);\r
213                         mctrl->decode_phase++;\r
214                         break;\r
215                 case 1:\r
216                         if(data == KEYDATA_ACK){\r
217                                 mctrl->decode_phase++;\r
218                         }\r
219                         break;\r
220                 case 2:\r
221                         if(data == KEYDATA_TEST_SUCCEEDED){\r
222                                 Mouse_SendCommand(MOUSECMD_SET_SAMPLE_RATE);\r
223                                 mctrl->decode_phase++;\r
224                         }\r
225                         break;\r
226                 case 3:\r
227                         if(data == KEYDATA_ACK){\r
228                                 Mouse_SendCommand(200);\r
229                                 mctrl->decode_phase++;\r
230                         }\r
231                         break;\r
232                 case 4:\r
233                         if(data == KEYDATA_ACK){\r
234                                 Mouse_SendCommand(MOUSECMD_SET_SAMPLE_RATE);\r
235                                 mctrl->decode_phase++;\r
236                         }\r
237                         break;\r
238                 case 5:\r
239                         if(data == KEYDATA_ACK){\r
240                                 Mouse_SendCommand(100);\r
241                                 mctrl->decode_phase++;\r
242                         }\r
243                         break;\r
244                 case 6:\r
245                         if(data == KEYDATA_ACK){\r
246                                 Mouse_SendCommand(MOUSECMD_SET_SAMPLE_RATE);\r
247                                 mctrl->decode_phase++;\r
248                         }\r
249                         break;\r
250                 case 7:\r
251                         if(data == KEYDATA_ACK){\r
252                                 Mouse_SendCommand(80);\r
253                                 mctrl->decode_phase++;\r
254                         }\r
255                         break;\r
256                 case 8:\r
257                         if(data == KEYDATA_ACK){\r
258                                 Mouse_SendCommand(MOUSECMD_GET_DEVICE_ID);\r
259                                 mctrl->decode_phase++;\r
260                         }\r
261                         break;\r
262                 case 9:\r
263                         if(data == KEYDATA_ACK){\r
264                                 mctrl->decode_phase++;\r
265                         }\r
266                         break;\r
267                 case 10:\r
268                         if(data == MOUSE_TYPE_3BUTTON){\r
269                                 mctrl->decode_phase = 20;\r
270                                 Mouse_SendCommand(MOUSECMD_ENABLE_DATA_REPORTING);\r
271                         } else if(data == MOUSE_TYPE_3BUTTON_SCROLL){\r
272                                 mctrl->flags.scroll = True;\r
273                                 mctrl->decode_phase = 30;\r
274                                 Mouse_SendCommand(MOUSECMD_ENABLE_DATA_REPORTING);\r
275                         }\r
276                         break;\r
277 //3ボタンマウス解析\r
278                 case 20:\r
279                         if(data == KEYDATA_ACK){\r
280                                 mctrl->decode_phase++;\r
281                         }\r
282                         break;\r
283                 case 21:\r
284                         //1バイト目が、00XY1CRLの形式になっているかどうかチェック\r
285                         //0xc8=11001000なので、ANDすると必ず00001000になるはずである\r
286                         if((data & 0xc8) == 0x08){      //1バイト目が、00xx1xxxの形式になっているかどうかチェック 0xc8=11001000なので、ANDすると必ず00001000になるはずである\r
287                                 mctrl->decode_buf[0] = data;\r
288                                 mctrl->decode_phase++;\r
289                         }\r
290                         break;\r
291                 case 22:\r
292                         mctrl->decode_buf[1] = data;\r
293                         mctrl->decode_phase++;\r
294                         break;\r
295                 case 23:\r
296                         mctrl->decode_buf[2] = data;\r
297                         mctrl->decode_phase = 21;\r
298                         mctrl->button.button = mctrl->decode_buf[0] & 0x07;\r
299                         mctrl->move.x = mctrl->decode_buf[1];\r
300                         mctrl->move.y = mctrl->decode_buf[2];\r
301                         if(mctrl->decode_buf[0] & 0x10){\r
302                                 mctrl->move.x |= 0xffffff00;\r
303                         }\r
304                         if(mctrl->decode_buf[0] & 0x20){\r
305                                 mctrl->move.y |= 0xffffff00;\r
306                         }\r
307                         mctrl->move.y = -mctrl->move.y;\r
308                         return True;\r
309 //3ボタンスクロールマウス解析\r
310                 case 30:\r
311                         if(data == KEYDATA_ACK){\r
312                                 mctrl->decode_phase++;\r
313                         }\r
314                         break;\r
315                 case 31:\r
316                         //1バイト目が、00XY1CRLの形式になっているかどうかチェック\r
317                         //0xc8=11001000なので、ANDすると必ず00001000になるはずである\r
318                         if((data & 0xc8) == 0x08){      //1バイト目が、00xx1xxxの形式になっているかどうかチェック 0xc8=11001000なので、ANDすると必ず00001000になるはずである\r
319                                 mctrl->decode_buf[0] = data;\r
320                                 mctrl->decode_phase++;\r
321                         }\r
322                         break;\r
323                 case 32:\r
324                         mctrl->decode_buf[1] = data;\r
325                         mctrl->decode_phase++;\r
326                         break;\r
327                 case 33:\r
328                         mctrl->decode_buf[2] = data;\r
329                         mctrl->button.button = mctrl->decode_buf[0] & 0x07;\r
330                         mctrl->move.x = mctrl->decode_buf[1];\r
331                         mctrl->move.y = mctrl->decode_buf[2];\r
332                         if(mctrl->decode_buf[0] & 0x10){\r
333                                 mctrl->move.x |= 0xffffff00;\r
334                         }\r
335                         if(mctrl->decode_buf[0] & 0x20){\r
336                                 mctrl->move.y |= 0xffffff00;\r
337                         }\r
338                         mctrl->move.y = -mctrl->move.y;\r
339                         mctrl->decode_phase++;\r
340                         break;\r
341                 case 34:\r
342                         //はりぼて友の会などの資料には、スクロール情報は下位4バイトだけ有効であると書かれていたが、どうやら8バイト全て有効なようである。\r
343                         mctrl->decode_buf[3] = data;\r
344                         mctrl->decode_phase = 31;\r
345                         mctrl->scroll = mctrl->decode_buf[3];\r
346                         if(mctrl->scroll & 0x80){\r
347                                 mctrl->scroll |= 0xffffff00;\r
348                         }\r
349                         #ifdef CHNOSPROJECT_DEBUG_MOUSE\r
350                                 debug("Mouse_Decode:case34:data=0x%02X scroll=%d\n", data, mctrl->scroll);\r
351                         #endif\r
352                         return True;\r
353         }\r
354 \r
355         return False;\r
356 }\r