OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / bootpack.c
1 \r
2 #include "core.h"\r
3 \r
4 uchar *ACPI_MemoryMap_Type[5] = {\r
5         "  USABLE",\r
6         "RESERVED",\r
7         "    ACPI",\r
8         "ACPI_NVS",\r
9         "UNUSABLE"\r
10 };\r
11 \r
12 System_CommonData systemdata;\r
13 \r
14 void CHNMain(void)\r
15 {\r
16         uint i;\r
17         UI_Timer *c_timer;\r
18         UI_Sheet *taskbar, *desktop;\r
19         UI_Task *mytask;\r
20 \r
21         IO_CLI();\r
22 \r
23         Initialise_System(&systemdata);\r
24 \r
25         IO_STI();\r
26 \r
27         mytask = MultiTask_Get_NowTask();\r
28 \r
29         systemdata.keyctrltask = MultiTask_Task_Get("SysKeyCtrlTask");\r
30         systemdata.keyctrltask->tss.ldtr = 0;\r
31         systemdata.keyctrltask->tss.iomap = 0x4000;\r
32         systemdata.keyctrltask->tss.eip = (uint)&CHNOS_KeyboardControlTask;\r
33         systemdata.keyctrltask->tss.eflags = 0x00000202;\r
34         systemdata.keyctrltask->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;\r
35         MemoryBlock_Write_Description((void *)(systemdata.keyctrltask->tss.esp - 64 * 1024), "SysKCT-Stack");\r
36         systemdata.keyctrltask->tss.es = 1 * 8;\r
37         systemdata.keyctrltask->tss.cs = 2 * 8;\r
38         systemdata.keyctrltask->tss.ss = 1 * 8;\r
39         systemdata.keyctrltask->tss.ds = 1 * 8;\r
40         systemdata.keyctrltask->tss.fs = 1 * 8;\r
41         systemdata.keyctrltask->tss.gs = 1 * 8;\r
42         systemdata.keyctrltask->tss.cr3 = (uint)ADR_Paging_Directory;\r
43         MultiTask_Task_Run(systemdata.keyctrltask);\r
44 \r
45         Mouse_Make_MouseCursor(&systemdata.mouse_cursor, 0, 0, systemdata.bootinfo->scrnx - 1, systemdata.bootinfo->scrny - 1, System_Sheet_Get_Top_Of_Height());\r
46         Mouse_Move_Absolute(&systemdata.mouse_cursor, systemdata.bootinfo->scrnx >> 1, systemdata.bootinfo->scrny >> 1);\r
47 \r
48         systemdata.mousectrltask = MultiTask_Task_Get("MouseCtrlTask");\r
49         systemdata.mousectrltask->tss.ldtr = 0;\r
50         systemdata.mousectrltask->tss.iomap = 0x4000;\r
51         systemdata.mousectrltask->tss.eip = (uint)&CHNOS_MouseControlTask;\r
52         systemdata.mousectrltask->tss.eflags = 0x00000202;\r
53         systemdata.mousectrltask->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;\r
54         MemoryBlock_Write_Description((void *)(systemdata.mousectrltask->tss.esp - 64 * 1024), "SysMCT-Stack");\r
55         systemdata.mousectrltask->tss.es = 1 * 8;\r
56         systemdata.mousectrltask->tss.cs = 2 * 8;\r
57         systemdata.mousectrltask->tss.ss = 1 * 8;\r
58         systemdata.mousectrltask->tss.ds = 1 * 8;\r
59         systemdata.mousectrltask->tss.fs = 1 * 8;\r
60         systemdata.mousectrltask->tss.gs = 1 * 8;\r
61         systemdata.mousectrltask->tss.cr3 = (uint)ADR_Paging_Directory;\r
62         MultiTask_Task_Run(systemdata.mousectrltask);\r
63 \r
64         desktop = System_Sheet_Get(systemdata.bootinfo->scrnx, systemdata.bootinfo->scrny, 0, 0);\r
65         Sheet_Show(desktop, 0, 0, System_Sheet_Get_Top_Of_Height());\r
66         Sheet_Draw_Fill_Rectangle(desktop, 0x66ff66, 0, 0, desktop->size.x - 1, desktop->size.y - 1);\r
67 \r
68         taskbar = System_Sheet_Get(systemdata.bootinfo->scrnx, 32, 0, 0);\r
69         Sheet_Show(taskbar, 0, systemdata.bootinfo->scrny - 32, System_Sheet_Get_Top_Of_Height());\r
70         Sheet_Draw_Fill_Rectangle_Gradation_Vertical(taskbar, 0xffffff, 0x6666ff, 0, 0, taskbar->size.x - 1, taskbar->size.y - 1);\r
71 \r
72         c_timer = Timer_Get(&systemdata.sysfifo, 5);\r
73         Timer_Set(c_timer, 50, interval);\r
74         Timer_Run(c_timer);\r
75 \r
76         FIFO32_Set_Task(&systemdata.sysfifo, mytask);\r
77 \r
78         Console_Create((systemdata.bootinfo->scrnx >> 4), (systemdata.bootinfo->scrny >> 5));\r
79 \r
80         for (;;) {\r
81                 if(FIFO32_Status(&systemdata.sysfifo) == 0){\r
82                         MultiTask_Task_Sleep(mytask);\r
83                 } else{\r
84                         i = FIFO32_Get(&systemdata.sysfifo);\r
85                         if(i < DATA_BYTE){\r
86                                 if(i == 5){\r
87 \r
88                                 }\r
89                         }\r
90                 }\r
91         }\r
92 }\r
93 \r
94 void CHNOS_KeyboardControlTask(void)\r
95 {\r
96         UI_Task *mytask;\r
97         UI_Listener *next, **now, *send;\r
98         UI_KeyInfo kinfo;\r
99         uint i, j;\r
100         uint buf[5];\r
101 \r
102         mytask = MultiTask_Get_NowTask();\r
103         next = 0;\r
104         systemdata.keycmd_wait = 0;\r
105 \r
106         FIFO32_Set_Task(&systemdata.keyboardfifo, mytask);\r
107 \r
108         for (;;) {\r
109                 if(FIFO32_Status(&systemdata.keycmdfifo) > 0 && systemdata.keycmd_wait < 0){\r
110                         systemdata.keycmd_wait = FIFO32_Get(&systemdata.keycmdfifo);\r
111                         Keyboard_Controller_Wait_SendReady();\r
112                         IO_Out8(KEYB_DATA, systemdata.keycmd_wait);\r
113                 }\r
114                 if(FIFO32_Status(&systemdata.keyboardfifo) == 0){\r
115                         MultiTask_Task_Sleep(mytask);\r
116                 } else{\r
117                         i = FIFO32_Get(&systemdata.keyboardfifo);\r
118                         if(i < DATA_BYTE){      /*\83^\83X\83N\82Ö\82Ì\83R\83}\83\93\83h*/\r
119                                 if(i == 1){     /*\83\8a\83X\83i\81[\93o\98^ FIFO32_Put_Arguments([fifo], 4, 0x01, [DATA_FIFO*], [flags], [offset]); ([0xFFFFFFFF])*/\r
120                                         buf[0] = 0x01;\r
121                                         buf[4] = 0x00;\r
122                                         for(j = 1; j < 5; j++){\r
123                                                 buf[j] = FIFO32_Get(&systemdata.keyboardfifo);\r
124                                                 if(buf[j] == SIGNAL_ARGUMENTS_END){\r
125                                                         break;\r
126                                                 }\r
127                                         }\r
128                                         if(buf[4] == SIGNAL_ARGUMENTS_END){     /*\82·\82×\82Ä\90³\8fí\82É\8eó\90M\82µ\82½\81B*/\r
129                                                 for(now = &next; *now != 0; now = &(*now)->next){\r
130 \r
131                                                 }\r
132                                                 *now = MemoryBlock_Allocate_System(sizeof(UI_Listener));\r
133                                                 MemoryBlock_Write_Description(*now, "UI_Listener");\r
134                                                 (*now)->next = 0;\r
135                                                 (*now)->fifo = (DATA_FIFO *)buf[1];\r
136                                                 (*now)->flags = buf[2];\r
137                                                 (*now)->offset = buf[3];\r
138                                         }\r
139                                 }\r
140                         } else if(DATA_BYTE <= i && i < (DATA_BYTE * 2)){       /*\83L\81[\83{\81[\83h\82©\82ç\82Ì\8eó\90M\83f\81[\83^*/\r
141                                 Keyboard_Decode(&kinfo, i - DATA_BYTE);\r
142                                 if(kinfo.make){\r
143                                         if(kinfo.c != 0){       /*\88ê\94Ê\95\8e\9a*/\r
144                                                 for(send = next; send != 0; send = send->next){\r
145                                                         FIFO32_Put(send->fifo, kinfo.c + send->offset);\r
146                                                 }\r
147                                                 if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0){       /*\83t\83H\81[\83J\83X\82Í\83L\81[\83f\81[\83^\82Ì\8eæ\93¾\82ð\8aó\96]\82µ\82Ä\82¢\82é*/\r
148                                                         FIFO32_Put(systemdata.key_focus->fifo, kinfo.c);\r
149                                                 }\r
150                                         } else{ /*\93Á\8eê\95\8e\9a*/\r
151 \r
152                                         }\r
153                                 }\r
154                         }\r
155                 }\r
156         }\r
157 }\r
158 \r
159 void CHNOS_MouseControlTask(void)\r
160 {\r
161         UI_Task *mytask;\r
162         UI_Sheet *focus;\r
163         DATA_Position2D focus_moveorg;\r
164         uint i;\r
165         int button_before;\r
166         bool key_focus_changed;\r
167         UI_Sheet *key_focus_before;\r
168 \r
169         UI_MouseEventArguments e;\r
170 \r
171         mytask = MultiTask_Get_NowTask();\r
172         focus = 0;\r
173         button_before = 0;\r
174         key_focus_changed = false;\r
175         key_focus_before = 0;\r
176 \r
177         FIFO32_Set_Task(&systemdata.mousefifo, mytask);\r
178 \r
179         for (;;) {\r
180                 if(FIFO32_Status(&systemdata.mousefifo) == 0){\r
181                         if(focus != 0){\r
182                                 Sheet_Slide(focus, focus->position.x + (systemdata.mouse_cursor.position.x - focus_moveorg.x), focus->position.y + (systemdata.mouse_cursor.position.y - focus_moveorg.y));\r
183                                 focus_moveorg.x = systemdata.mouse_cursor.position.x;\r
184                                 focus_moveorg.y = systemdata.mouse_cursor.position.y;\r
185                         }\r
186                         MultiTask_Task_Sleep(mytask);\r
187                 } else{\r
188                         i = FIFO32_Get(&systemdata.mousefifo);\r
189                         if(i < DATA_BYTE){      /*\83^\83X\83N\82Ö\82Ì\83R\83}\83\93\83h*/\r
190 \r
191                         } else if(DATA_BYTE <= i && i < (DATA_BYTE * 2)){       /*\83}\83E\83X\82©\82ç\82Ì\8eó\90M\83f\81[\83^*/\r
192                                 if(Mouse_Decode(i - DATA_BYTE) != 0){\r
193                                         Mouse_Move_Relative(&systemdata.mouse_cursor, systemdata.mousedecode.move.x, systemdata.mousedecode.move.y);\r
194                                         if(focus == 0){\r
195                                                 if(systemdata.focus != Sheet_Get_From_Position(&sys_sheet_ctrl, systemdata.mouse_cursor.position.x, systemdata.mouse_cursor.position.y)){\r
196                                                         if(systemdata.focus != 0 && systemdata.focus->MouseEventProcedure != 0){\r
197                                                                 e.focus = systemdata.focus;\r
198                                                                 e.move.x = 0;\r
199                                                                 e.move.y = 0;\r
200                                                                 e.button = 0;\r
201                                                                 e.button_before = (uint)button_before;\r
202                                                                 systemdata.focus->MouseEventProcedure(&e);\r
203                                                         }\r
204                                                 }\r
205                                                 systemdata.focus = Sheet_Get_From_Position(&sys_sheet_ctrl, systemdata.mouse_cursor.position.x, systemdata.mouse_cursor.position.y);\r
206                                         }\r
207                                         if((systemdata.mousedecode.btn & MOUSE_BUTTON_L) != 0 && (button_before & MOUSE_BUTTON_L) == 0){        /*L down*/\r
208                                                 if(systemdata.key_focus != systemdata.focus){\r
209                                                         key_focus_changed = true;\r
210                                                         key_focus_before = systemdata.key_focus;\r
211                                                 }\r
212                                                 systemdata.key_focus = systemdata.focus;\r
213                                                 focus = systemdata.focus;\r
214                                                 focus_moveorg.x = systemdata.mouse_cursor.position.x;\r
215                                                 focus_moveorg.y = systemdata.mouse_cursor.position.y;\r
216                                                 if(!focus->mouse_movable){      /*\83}\83E\83X\82É\82æ\82é\88Ú\93®\95s\89Â*/\r
217                                                         focus = 0;\r
218                                                 } else{\r
219                                                         Sheet_UpDown(focus, System_Sheet_Get_Top_Of_Height());\r
220                                                 }\r
221                                         } else if((systemdata.mousedecode.btn & MOUSE_BUTTON_L) == 0 && (button_before & MOUSE_BUTTON_L) != 0){ /*L up*/\r
222                                                 focus = 0;\r
223                                         }\r
224                                         if((systemdata.mousedecode.btn & MOUSE_BUTTON_R) != 0){ /*R*/\r
225 \r
226                                         }\r
227                                         if((systemdata.mousedecode.btn & MOUSE_BUTTON_C) != 0){ /*C*/\r
228 \r
229                                         }\r
230                                         if(key_focus_changed){\r
231                                                 if(key_focus_before != 0 && key_focus_before->fifo != 0 && (key_focus_before->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
232                                                         FIFO32_Put_Arguments(key_focus_before->fifo, 2, SIGNAL_WINDOW_FOCUS_LOST, (uint)key_focus_before);\r
233                                                 }\r
234                                                 if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0 && (systemdata.key_focus->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
235                                                         FIFO32_Put_Arguments(systemdata.key_focus->fifo, 2, SIGNAL_WINDOW_FOCUS_GET, (uint)systemdata.key_focus);\r
236                                                 }\r
237                                                 key_focus_changed = false;\r
238                                         }\r
239                                         if(systemdata.focus != 0 && systemdata.focus->MouseEventProcedure != 0){        /*\83t\83H\81[\83J\83X\82Í\83V\81[\83g\82Å\81A\83C\83x\83\93\83g\82Ì\8eæ\93¾\82ð\8aó\96]\82µ\82Ä\82¢\82é*/\r
240                                                 e.focus = systemdata.focus;\r
241                                                 e.move.x = systemdata.mousedecode.move.x;\r
242                                                 e.move.y = systemdata.mousedecode.move.y;\r
243                                                 e.position_local.x = systemdata.mouse_cursor.position.x - focus->position.x;\r
244                                                 e.position_local.y = systemdata.mouse_cursor.position.y - focus->position.y;\r
245                                                 e.button = (uint)systemdata.mousedecode.btn;\r
246                                                 e.button_before = (uint)button_before;\r
247                                                 systemdata.focus->MouseEventProcedure(&e);\r
248                                         }\r
249                                         key_focus_before = systemdata.key_focus;\r
250                                         button_before = systemdata.mousedecode.btn;\r
251                                 }\r
252                         }\r
253                 }\r
254         }\r
255 }\r
256 \r
257 void CHNOS_UI_KeyFocus_Change(UI_Sheet *focus_new)\r
258 {\r
259         uint eflags;\r
260 \r
261         eflags = IO_Load_EFlags();\r
262         IO_CLI();\r
263 \r
264         if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0 && (systemdata.key_focus->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
265                 FIFO32_Put_Arguments(systemdata.key_focus->fifo, 2, SIGNAL_WINDOW_FOCUS_LOST, systemdata.key_focus);\r
266         }\r
267         if(focus_new != 0 && focus_new->fifo != 0 && (focus_new->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
268                 FIFO32_Put_Arguments(focus_new->fifo, 2, SIGNAL_WINDOW_FOCUS_GET, (uint)focus_new);\r
269         }\r
270         systemdata.key_focus = focus_new;\r
271 \r
272         IO_Store_EFlags(eflags);\r
273         return;\r
274 }\r