5 DATA_FIFO32 *mouse_fifo;
\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
35 IO_MouseControl *Initialize_Mouse(void)
\r
37 IO_MouseControl *mctrl;
\r
43 mctrl = (IO_MouseControl *)System_Memory_Allocate(sizeof(IO_MouseControl));
\r
46 System_GateDescriptor_Set(0x2c, (uint)asm_InterruptHandler2c, 0x02, AR_INTGATE32);
\r
47 ProgrammableInterruptController_InterruptMask_Clear(0x0c);
\r
53 void InterruptHandler2c(uint *esp)
\r
57 data = IO_In8(PORT_KEYDATA);
\r
59 ProgrammableInterruptController_InterruptRequest_Complete(0x0c);
\r
61 if(mouse_fifo != 0){
\r
62 FIFO32_Put(mouse_fifo, data + mouse_data0);
\r
65 if(data == KEYDATA_ACK || data == KEYDATA_RESEND){
\r
72 void Mouse_Set_ReceiveFIFO(DATA_FIFO32 *fifo, uint data0)
\r
74 mouse_data0 = data0;
\r
80 void Mouse_SendCommand(uint cmd)
\r
82 KeyboardController_Wait_SendReady();
\r
83 IO_Out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
\r
87 KeyboardController_Wait_SendReady();
\r
88 IO_Out8(PORT_KEYDATA, cmd);
\r
90 if(mouse_retv == KEYDATA_ACK){
\r
93 if(mouse_retv == KEYDATA_RESEND){
\r
101 UI_MouseCursor *MouseCursor_Initialize(UI_Sheet *parent)
\r
103 UI_MouseCursor *mcursor;
\r
106 if(parent == Null){
\r
110 mcursor = System_Memory_Allocate(sizeof(UI_MouseCursor));
\r
111 mcursor->cursor_sheet = Sheet_Initialize();
\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
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
135 uint MouseCursor_Show(UI_MouseCursor *mcursor)
\r
137 if(mcursor == Null){
\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
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
153 Sheet_Show(mcursor->cursor_sheet, SHEET_MAX_CHILDREN, SHEET_LOCATION_NOCHANGE, SHEET_LOCATION_NOCHANGE);
\r
158 uint MouseCursor_Move_Relative(UI_MouseCursor *mcursor, int rpx, int rpy)
\r
160 if(mcursor == Null){
\r
164 rpx += mcursor->cursor_sheet->location.x;
\r
165 rpy += mcursor->cursor_sheet->location.y;
\r
169 } else if((uint)rpx > mcursor->cursor_sheet->parent->size.x - 1){
\r
170 rpx = mcursor->cursor_sheet->parent->size.x - 1;
\r
175 } else if((uint)rpy > mcursor->cursor_sheet->parent->size.y - 1){
\r
176 rpy = mcursor->cursor_sheet->parent->size.y - 1;
\r
179 Sheet_Slide_Absolute(mcursor->cursor_sheet, rpx, rpy);
\r
184 uint MouseCursor_Move_Absolute(UI_MouseCursor *mcursor, int apx, int apy)
\r
186 if(mcursor == Null){
\r
192 } else if((uint)apx > mcursor->cursor_sheet->parent->size.x - 1){
\r
193 apx = mcursor->cursor_sheet->parent->size.x - 1;
\r
198 } else if((uint)apy > mcursor->cursor_sheet->parent->size.y - 1){
\r
199 apy = mcursor->cursor_sheet->parent->size.y - 1;
\r
202 Sheet_Slide_Absolute(mcursor->cursor_sheet, apx, apy);
\r
207 bool Mouse_Decode(IO_MouseControl *mctrl, uint data)
\r
209 switch(mctrl->decode_phase){
\r
210 //マウス初期化及びスクロールマウス識別
\r
212 Mouse_SendCommand(MOUSECMD_RESET);
\r
213 mctrl->decode_phase++;
\r
216 if(data == KEYDATA_ACK){
\r
217 mctrl->decode_phase++;
\r
221 if(data == KEYDATA_TEST_SUCCEEDED){
\r
222 Mouse_SendCommand(MOUSECMD_SET_SAMPLE_RATE);
\r
223 mctrl->decode_phase++;
\r
227 if(data == KEYDATA_ACK){
\r
228 Mouse_SendCommand(200);
\r
229 mctrl->decode_phase++;
\r
233 if(data == KEYDATA_ACK){
\r
234 Mouse_SendCommand(MOUSECMD_SET_SAMPLE_RATE);
\r
235 mctrl->decode_phase++;
\r
239 if(data == KEYDATA_ACK){
\r
240 Mouse_SendCommand(100);
\r
241 mctrl->decode_phase++;
\r
245 if(data == KEYDATA_ACK){
\r
246 Mouse_SendCommand(MOUSECMD_SET_SAMPLE_RATE);
\r
247 mctrl->decode_phase++;
\r
251 if(data == KEYDATA_ACK){
\r
252 Mouse_SendCommand(80);
\r
253 mctrl->decode_phase++;
\r
257 if(data == KEYDATA_ACK){
\r
258 Mouse_SendCommand(MOUSECMD_GET_DEVICE_ID);
\r
259 mctrl->decode_phase++;
\r
263 if(data == KEYDATA_ACK){
\r
264 mctrl->decode_phase++;
\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
279 if(data == KEYDATA_ACK){
\r
280 mctrl->decode_phase++;
\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
292 mctrl->decode_buf[1] = data;
\r
293 mctrl->decode_phase++;
\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
304 if(mctrl->decode_buf[0] & 0x20){
\r
305 mctrl->move.y |= 0xffffff00;
\r
307 mctrl->move.y = -mctrl->move.y;
\r
311 if(data == KEYDATA_ACK){
\r
312 mctrl->decode_phase++;
\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
324 mctrl->decode_buf[1] = data;
\r
325 mctrl->decode_phase++;
\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
335 if(mctrl->decode_buf[0] & 0x20){
\r
336 mctrl->move.y |= 0xffffff00;
\r
338 mctrl->move.y = -mctrl->move.y;
\r
339 mctrl->decode_phase++;
\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
349 #ifdef CHNOSPROJECT_DEBUG_MOUSE
\r
350 debug("Mouse_Decode:case34:data=0x%02X scroll=%d\n", data, mctrl->scroll);
\r