OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / bootpack.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/bootpack.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/bootpack.c
new file mode 100644 (file)
index 0000000..d4ce40b
--- /dev/null
@@ -0,0 +1,274 @@
+\r
+#include "core.h"\r
+\r
+uchar *ACPI_MemoryMap_Type[5] = {\r
+       "  USABLE",\r
+       "RESERVED",\r
+       "    ACPI",\r
+       "ACPI_NVS",\r
+       "UNUSABLE"\r
+};\r
+\r
+System_CommonData systemdata;\r
+\r
+void CHNMain(void)\r
+{\r
+       uint i;\r
+       UI_Timer *c_timer;\r
+       UI_Sheet *taskbar, *desktop;\r
+       UI_Task *mytask;\r
+\r
+       IO_CLI();\r
+\r
+       Initialise_System(&systemdata);\r
+\r
+       IO_STI();\r
+\r
+       mytask = MultiTask_Get_NowTask();\r
+\r
+       systemdata.keyctrltask = MultiTask_Task_Get("SysKeyCtrlTask");\r
+       systemdata.keyctrltask->tss.ldtr = 0;\r
+       systemdata.keyctrltask->tss.iomap = 0x4000;\r
+       systemdata.keyctrltask->tss.eip = (uint)&CHNOS_KeyboardControlTask;\r
+       systemdata.keyctrltask->tss.eflags = 0x00000202;\r
+       systemdata.keyctrltask->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;\r
+       MemoryBlock_Write_Description((void *)(systemdata.keyctrltask->tss.esp - 64 * 1024), "SysKCT-Stack");\r
+       systemdata.keyctrltask->tss.es = 1 * 8;\r
+       systemdata.keyctrltask->tss.cs = 2 * 8;\r
+       systemdata.keyctrltask->tss.ss = 1 * 8;\r
+       systemdata.keyctrltask->tss.ds = 1 * 8;\r
+       systemdata.keyctrltask->tss.fs = 1 * 8;\r
+       systemdata.keyctrltask->tss.gs = 1 * 8;\r
+       systemdata.keyctrltask->tss.cr3 = (uint)ADR_Paging_Directory;\r
+       MultiTask_Task_Run(systemdata.keyctrltask);\r
+\r
+       Mouse_Make_MouseCursor(&systemdata.mouse_cursor, 0, 0, systemdata.bootinfo->scrnx - 1, systemdata.bootinfo->scrny - 1, System_Sheet_Get_Top_Of_Height());\r
+       Mouse_Move_Absolute(&systemdata.mouse_cursor, systemdata.bootinfo->scrnx >> 1, systemdata.bootinfo->scrny >> 1);\r
+\r
+       systemdata.mousectrltask = MultiTask_Task_Get("MouseCtrlTask");\r
+       systemdata.mousectrltask->tss.ldtr = 0;\r
+       systemdata.mousectrltask->tss.iomap = 0x4000;\r
+       systemdata.mousectrltask->tss.eip = (uint)&CHNOS_MouseControlTask;\r
+       systemdata.mousectrltask->tss.eflags = 0x00000202;\r
+       systemdata.mousectrltask->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;\r
+       MemoryBlock_Write_Description((void *)(systemdata.mousectrltask->tss.esp - 64 * 1024), "SysMCT-Stack");\r
+       systemdata.mousectrltask->tss.es = 1 * 8;\r
+       systemdata.mousectrltask->tss.cs = 2 * 8;\r
+       systemdata.mousectrltask->tss.ss = 1 * 8;\r
+       systemdata.mousectrltask->tss.ds = 1 * 8;\r
+       systemdata.mousectrltask->tss.fs = 1 * 8;\r
+       systemdata.mousectrltask->tss.gs = 1 * 8;\r
+       systemdata.mousectrltask->tss.cr3 = (uint)ADR_Paging_Directory;\r
+       MultiTask_Task_Run(systemdata.mousectrltask);\r
+\r
+       desktop = System_Sheet_Get(systemdata.bootinfo->scrnx, systemdata.bootinfo->scrny, 0, 0);\r
+       Sheet_Show(desktop, 0, 0, System_Sheet_Get_Top_Of_Height());\r
+       Sheet_Draw_Fill_Rectangle(desktop, 0x66ff66, 0, 0, desktop->size.x - 1, desktop->size.y - 1);\r
+\r
+       taskbar = System_Sheet_Get(systemdata.bootinfo->scrnx, 32, 0, 0);\r
+       Sheet_Show(taskbar, 0, systemdata.bootinfo->scrny - 32, System_Sheet_Get_Top_Of_Height());\r
+       Sheet_Draw_Fill_Rectangle_Gradation_Vertical(taskbar, 0xffffff, 0x6666ff, 0, 0, taskbar->size.x - 1, taskbar->size.y - 1);\r
+\r
+       c_timer = Timer_Get(&systemdata.sysfifo, 5);\r
+       Timer_Set(c_timer, 50, interval);\r
+       Timer_Run(c_timer);\r
+\r
+       FIFO32_Set_Task(&systemdata.sysfifo, mytask);\r
+\r
+       Console_Create((systemdata.bootinfo->scrnx >> 4), (systemdata.bootinfo->scrny >> 5));\r
+\r
+       for (;;) {\r
+               if(FIFO32_Status(&systemdata.sysfifo) == 0){\r
+                       MultiTask_Task_Sleep(mytask);\r
+               } else{\r
+                       i = FIFO32_Get(&systemdata.sysfifo);\r
+                       if(i < DATA_BYTE){\r
+                               if(i == 5){\r
+\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void CHNOS_KeyboardControlTask(void)\r
+{\r
+       UI_Task *mytask;\r
+       UI_Listener *next, **now, *send;\r
+       UI_KeyInfo kinfo;\r
+       uint i, j;\r
+       uint buf[5];\r
+\r
+       mytask = MultiTask_Get_NowTask();\r
+       next = 0;\r
+       systemdata.keycmd_wait = 0;\r
+\r
+       FIFO32_Set_Task(&systemdata.keyboardfifo, mytask);\r
+\r
+       for (;;) {\r
+               if(FIFO32_Status(&systemdata.keycmdfifo) > 0 && systemdata.keycmd_wait < 0){\r
+                       systemdata.keycmd_wait = FIFO32_Get(&systemdata.keycmdfifo);\r
+                       Keyboard_Controller_Wait_SendReady();\r
+                       IO_Out8(KEYB_DATA, systemdata.keycmd_wait);\r
+               }\r
+               if(FIFO32_Status(&systemdata.keyboardfifo) == 0){\r
+                       MultiTask_Task_Sleep(mytask);\r
+               } else{\r
+                       i = FIFO32_Get(&systemdata.keyboardfifo);\r
+                       if(i < DATA_BYTE){      /*\83^\83X\83N\82Ö\82Ì\83R\83}\83\93\83h*/\r
+                               if(i == 1){     /*\83\8a\83X\83i\81[\93o\98^ FIFO32_Put_Arguments([fifo], 4, 0x01, [DATA_FIFO*], [flags], [offset]); ([0xFFFFFFFF])*/\r
+                                       buf[0] = 0x01;\r
+                                       buf[4] = 0x00;\r
+                                       for(j = 1; j < 5; j++){\r
+                                               buf[j] = FIFO32_Get(&systemdata.keyboardfifo);\r
+                                               if(buf[j] == SIGNAL_ARGUMENTS_END){\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       if(buf[4] == SIGNAL_ARGUMENTS_END){     /*\82·\82×\82Ä\90³\8fí\82É\8eó\90M\82µ\82½\81B*/\r
+                                               for(now = &next; *now != 0; now = &(*now)->next){\r
+\r
+                                               }\r
+                                               *now = MemoryBlock_Allocate_System(sizeof(UI_Listener));\r
+                                               MemoryBlock_Write_Description(*now, "UI_Listener");\r
+                                               (*now)->next = 0;\r
+                                               (*now)->fifo = (DATA_FIFO *)buf[1];\r
+                                               (*now)->flags = buf[2];\r
+                                               (*now)->offset = buf[3];\r
+                                       }\r
+                               }\r
+                       } else if(DATA_BYTE <= i && i < (DATA_BYTE * 2)){       /*\83L\81[\83{\81[\83h\82©\82ç\82Ì\8eó\90M\83f\81[\83^*/\r
+                               Keyboard_Decode(&kinfo, i - DATA_BYTE);\r
+                               if(kinfo.make){\r
+                                       if(kinfo.c != 0){       /*\88ê\94Ê\95\8e\9a*/\r
+                                               for(send = next; send != 0; send = send->next){\r
+                                                       FIFO32_Put(send->fifo, kinfo.c + send->offset);\r
+                                               }\r
+                                               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
+                                                       FIFO32_Put(systemdata.key_focus->fifo, kinfo.c);\r
+                                               }\r
+                                       } else{ /*\93Á\8eê\95\8e\9a*/\r
+\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void CHNOS_MouseControlTask(void)\r
+{\r
+       UI_Task *mytask;\r
+       UI_Sheet *focus;\r
+       DATA_Position2D focus_moveorg;\r
+       uint i;\r
+       int button_before;\r
+       bool key_focus_changed;\r
+       UI_Sheet *key_focus_before;\r
+\r
+       UI_MouseEventArguments e;\r
+\r
+       mytask = MultiTask_Get_NowTask();\r
+       focus = 0;\r
+       button_before = 0;\r
+       key_focus_changed = false;\r
+       key_focus_before = 0;\r
+\r
+       FIFO32_Set_Task(&systemdata.mousefifo, mytask);\r
+\r
+       for (;;) {\r
+               if(FIFO32_Status(&systemdata.mousefifo) == 0){\r
+                       if(focus != 0){\r
+                               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
+                               focus_moveorg.x = systemdata.mouse_cursor.position.x;\r
+                               focus_moveorg.y = systemdata.mouse_cursor.position.y;\r
+                       }\r
+                       MultiTask_Task_Sleep(mytask);\r
+               } else{\r
+                       i = FIFO32_Get(&systemdata.mousefifo);\r
+                       if(i < DATA_BYTE){      /*\83^\83X\83N\82Ö\82Ì\83R\83}\83\93\83h*/\r
+\r
+                       } else if(DATA_BYTE <= i && i < (DATA_BYTE * 2)){       /*\83}\83E\83X\82©\82ç\82Ì\8eó\90M\83f\81[\83^*/\r
+                               if(Mouse_Decode(i - DATA_BYTE) != 0){\r
+                                       Mouse_Move_Relative(&systemdata.mouse_cursor, systemdata.mousedecode.move.x, systemdata.mousedecode.move.y);\r
+                                       if(focus == 0){\r
+                                               if(systemdata.focus != Sheet_Get_From_Position(&sys_sheet_ctrl, systemdata.mouse_cursor.position.x, systemdata.mouse_cursor.position.y)){\r
+                                                       if(systemdata.focus != 0 && systemdata.focus->MouseEventProcedure != 0){\r
+                                                               e.focus = systemdata.focus;\r
+                                                               e.move.x = 0;\r
+                                                               e.move.y = 0;\r
+                                                               e.button = 0;\r
+                                                               e.button_before = (uint)button_before;\r
+                                                               systemdata.focus->MouseEventProcedure(&e);\r
+                                                       }\r
+                                               }\r
+                                               systemdata.focus = Sheet_Get_From_Position(&sys_sheet_ctrl, systemdata.mouse_cursor.position.x, systemdata.mouse_cursor.position.y);\r
+                                       }\r
+                                       if((systemdata.mousedecode.btn & MOUSE_BUTTON_L) != 0 && (button_before & MOUSE_BUTTON_L) == 0){        /*L down*/\r
+                                               if(systemdata.key_focus != systemdata.focus){\r
+                                                       key_focus_changed = true;\r
+                                                       key_focus_before = systemdata.key_focus;\r
+                                               }\r
+                                               systemdata.key_focus = systemdata.focus;\r
+                                               focus = systemdata.focus;\r
+                                               focus_moveorg.x = systemdata.mouse_cursor.position.x;\r
+                                               focus_moveorg.y = systemdata.mouse_cursor.position.y;\r
+                                               if(!focus->mouse_movable){      /*\83}\83E\83X\82É\82æ\82é\88Ú\93®\95s\89Â*/\r
+                                                       focus = 0;\r
+                                               } else{\r
+                                                       Sheet_UpDown(focus, System_Sheet_Get_Top_Of_Height());\r
+                                               }\r
+                                       } else if((systemdata.mousedecode.btn & MOUSE_BUTTON_L) == 0 && (button_before & MOUSE_BUTTON_L) != 0){ /*L up*/\r
+                                               focus = 0;\r
+                                       }\r
+                                       if((systemdata.mousedecode.btn & MOUSE_BUTTON_R) != 0){ /*R*/\r
+\r
+                                       }\r
+                                       if((systemdata.mousedecode.btn & MOUSE_BUTTON_C) != 0){ /*C*/\r
+\r
+                                       }\r
+                                       if(key_focus_changed){\r
+                                               if(key_focus_before != 0 && key_focus_before->fifo != 0 && (key_focus_before->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
+                                                       FIFO32_Put_Arguments(key_focus_before->fifo, 2, SIGNAL_WINDOW_FOCUS_LOST, (uint)key_focus_before);\r
+                                               }\r
+                                               if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0 && (systemdata.key_focus->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
+                                                       FIFO32_Put_Arguments(systemdata.key_focus->fifo, 2, SIGNAL_WINDOW_FOCUS_GET, (uint)systemdata.key_focus);\r
+                                               }\r
+                                               key_focus_changed = false;\r
+                                       }\r
+                                       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
+                                               e.focus = systemdata.focus;\r
+                                               e.move.x = systemdata.mousedecode.move.x;\r
+                                               e.move.y = systemdata.mousedecode.move.y;\r
+                                               e.position_local.x = systemdata.mouse_cursor.position.x - focus->position.x;\r
+                                               e.position_local.y = systemdata.mouse_cursor.position.y - focus->position.y;\r
+                                               e.button = (uint)systemdata.mousedecode.btn;\r
+                                               e.button_before = (uint)button_before;\r
+                                               systemdata.focus->MouseEventProcedure(&e);\r
+                                       }\r
+                                       key_focus_before = systemdata.key_focus;\r
+                                       button_before = systemdata.mousedecode.btn;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void CHNOS_UI_KeyFocus_Change(UI_Sheet *focus_new)\r
+{\r
+       uint eflags;\r
+\r
+       eflags = IO_Load_EFlags();\r
+       IO_CLI();\r
+\r
+       if(systemdata.key_focus != 0 && systemdata.key_focus->fifo != 0 && (systemdata.key_focus->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
+               FIFO32_Put_Arguments(systemdata.key_focus->fifo, 2, SIGNAL_WINDOW_FOCUS_LOST, systemdata.key_focus);\r
+       }\r
+       if(focus_new != 0 && focus_new->fifo != 0 && (focus_new->ksignal_flags & SIGNAL_FLAGS_FOCUSINFO) != 0){\r
+               FIFO32_Put_Arguments(focus_new->fifo, 2, SIGNAL_WINDOW_FOCUS_GET, (uint)focus_new);\r
+       }\r
+       systemdata.key_focus = focus_new;\r
+\r
+       IO_Store_EFlags(eflags);\r
+       return;\r
+}\r