OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / console.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/console.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/console.c
new file mode 100644 (file)
index 0000000..ab8488a
--- /dev/null
@@ -0,0 +1,351 @@
+\r
+#include "core.h"\r
+\r
+UI_Console *Console_Initialize(void)\r
+{\r
+       UI_Console *console;\r
+\r
+       console = (UI_Console *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_CONSOLE);\r
+\r
+       console->task = System_MultiTask_Task_Initialize(0);\r
+       console->task->tss->eip = (uint)&Console_MainTask;\r
+       console->task->tss->cs = SYSTEM_CS << 3;\r
+       console->task->tss->ss = SYSTEM_DS << 3;\r
+       console->task->tss->ds = SYSTEM_DS << 3;\r
+       console->task->tss->esp = (uint)System_Memory_Allocate(1024 * 32) + (1024 * 32);\r
+       MultiTask_Push_Arguments(console->task, 1, console);\r
+\r
+       console->textbox = TextBox_Initialize();\r
+\r
+       console->flags.bit.initialized = True;\r
+\r
+       #ifdef CHNOSPROJECT_DEBUG_CONSOLE\r
+               debug("Console_Initialize:initialized[0x%X]\n", console);\r
+       #endif\r
+\r
+       return console;\r
+}\r
+\r
+uint Console_SetSize(UI_Console *console, uint xchars, uint ychars)\r
+{\r
+       if(console == Null){\r
+               return 1;\r
+       }\r
+\r
+       if(!console->flags.bit.initialized){\r
+               return 2;\r
+       }\r
+\r
+       if(console->flags.bit.configured_size){\r
+               return 3;\r
+       }\r
+\r
+       TextBox_SetBuffer(console->textbox, xchars, ychars, 8, Null);\r
+       System_Sheet_SetParentToVRAM(console->textbox->sheet);\r
+       Sheet_SetMovable(console->textbox->sheet, True);\r
+       Sheet_SetInputFIFO(console->textbox->sheet, console->task->fifo);\r
+\r
+       console->flags.bit.configured_size = True;\r
+\r
+       #ifdef CHNOSPROJECT_DEBUG_CONSOLE\r
+               debug("Console_SetSize:configured[0x%X]\n", console);\r
+       #endif\r
+\r
+       return 0;\r
+}\r
+\r
+uint Console_Run(UI_Console *console)\r
+{\r
+       if(console == Null){\r
+               return 1;\r
+       }\r
+\r
+       if(!console->flags.bit.initialized){\r
+               return 2;\r
+       }\r
+\r
+       if(!console->flags.bit.configured_size){\r
+               return 3;\r
+       }\r
+\r
+       #ifdef CHNOSPROJECT_DEBUG_CONSOLE\r
+               debug("Console_Run:start running[0x%X]\n", console);\r
+       #endif\r
+\r
+       System_MultiTask_Task_Run(console->task);\r
+       return 0;\r
+}\r
+\r
+void Console_MainTask(UI_Console *console)\r
+{\r
+       UI_Task *mytask;\r
+       uint data;\r
+       UI_Timer *ctimer;\r
+       bool key_ignore;\r
+\r
+       data = 0;\r
+\r
+       mytask = System_MultiTask_GetNowTask();\r
+\r
+       #ifdef CHNOSPROJECT_DEBUG\r
+               debug("CMT:ConsoleMainTask[UI_Task=0x%X] Start Running.\n", mytask);\r
+       #endif\r
+\r
+       console->printf_buffer = (uchar *)System_Memory_Allocate(CONSOLE_PRINTF_BUFFER_SIZE);\r
+\r
+       TextBox_Show(console->textbox, SHEET_MAX_CHILDREN, (int)(console->textbox->sheet->parent->size.x >> 1) - (int)(console->textbox->sheet->size.x >> 1), (int)(console->textbox->sheet->parent->size.y >> 1) - (int)(console->textbox->sheet->size.y >> 1));\r
+       if(console->textbox->sheet->location.x < 0){\r
+               Sheet_Slide_Absolute(console->textbox->sheet, 0, SHEET_LOCATION_NOCHANGE);\r
+       }\r
+       if(console->textbox->sheet->location.y < 0){\r
+               Sheet_Slide_Absolute(console->textbox->sheet, SHEET_LOCATION_NOCHANGE, 0);\r
+       }\r
+       TextBox_Put_Character(console->textbox, '>');\r
+       TextBox_SetEnable_RecordInputText(console->textbox, True);\r
+       console->flags.bit.isprompt = True;\r
+\r
+       ctimer = Timer_Initialize();\r
+       Timer_Config(ctimer, 500, mytask->fifo, 1, True);\r
+       Timer_Run(ctimer);\r
+\r
+       console->boot_fd = FloppyDisk_Initialize(ADR_DISKIMG);\r
+\r
+       for(;;){\r
+               if(FIFO32_MyTaskFIFO_Status() == 0){\r
+                       System_MultiTask_Task_Sleep(mytask);\r
+               } else{\r
+                       data = FIFO32_MyTaskFIFO_Get();\r
+                       #ifdef CHNOSPROJECT_DEBUG_CMT\r
+                               debug("CMT:Receive data from FIFO(data:0x%X).\n", data);\r
+                       #endif\r
+                       if(data < INPUTSIGNAL_OFFSET){\r
+                               //\94Ä\97p\97\98\97p\89Â\94\\97Ì\88æ0\r
+                               if(data == 1){\r
+                                       TextBox_Cursor_Blink(console->textbox);\r
+                               }\r
+                       } else if(data < SIGNAL_KEY_OFFSET){\r
+                               data -= INPUTSIGNAL_OFFSET;\r
+                               if(data == INPUTSIGNAL_FOCUS_GOT){\r
+                                       TextBox_SetEnable_CursorBlink(console->textbox, True);\r
+                               } else if(data == INPUTSIGNAL_FOCUS_LOST){\r
+                                       TextBox_SetEnable_CursorBlink(console->textbox, False);\r
+                               }\r
+                               //\93ü\97Í\92Ê\92m\97Ì\88æ\r
+                       } else if(data < SIGNAL_KEY_OFFSET + 0xffff){\r
+                               key_ignore = False;\r
+                               //keyid\92Ê\92m\r
+                               data -= SIGNAL_KEY_OFFSET;\r
+                               if(!(data & KEYID_MASK_BREAK) && (data & KEYID_MASK_EXTENDED)){\r
+                                       if((data & KEYID_MASK_ID) == KEYID_ENTER){\r
+                                               key_ignore = True;\r
+                                               TextBox_SetEnable_RecordInputText(console->textbox, False);\r
+                                               TextBox_Put_Character(console->textbox, '\n');\r
+                                               if(Console_CompareCommandline_n(console, "test", 4)){\r
+                                                       TextBox_Put_String(console->textbox, "Hello, World.\n");\r
+                                                       if(console->textbox->text_buf[4] == ' '){\r
+                                                               Console_printf(console, "value16:0x%X\n", strtol(&console->textbox->text_buf[5], Null, 0));\r
+                                                               Console_printf(console, "value10:%u\n", strtol(&console->textbox->text_buf[5], Null, 0));\r
+                                                       }\r
+                                               } else if(Console_CompareCommandline_s(console, "mem")){\r
+                                                       Console_printf(console, "Total:%10uBytes %5uKB\n", System_Get_PhisycalMemorySize(), System_Get_PhisycalMemorySize() >> 10);\r
+                                                       Console_printf(console, "Free :%10uBytes %5uKB\n", System_Memory_Get_FreeSize(), System_Memory_Get_FreeSize() >> 10);\r
+                                               } else if(Console_CompareCommandline_s(console, "dir")){\r
+                                                       Console_Command_dir(console);\r
+                                               } else if(Console_CompareCommandline_n(console, "pci", 3)){\r
+                                                       Console_Command_pci(console);\r
+                                               } else if(Console_CompareCommandline_n(console, "type", 4)){\r
+                                                       Console_Command_type(console);\r
+                                               } else if(Console_CompareCommandline_n(console, "task", 4)){\r
+                                                       Console_Command_task(console);\r
+                                               } else{\r
+                                                       TextBox_Put_String(console->textbox, "Console:There is no such file or command:");\r
+                                                       TextBox_Put_String(console->textbox, console->textbox->text_buf);\r
+                                               }\r
+                                               TextBox_Put_Character(console->textbox, '\n');\r
+                                               TextBox_Put_Character(console->textbox, '>');\r
+                                               TextBox_SetEnable_RecordInputText(console->textbox, True);\r
+                                       }\r
+                               }\r
+                               if(!key_ignore){\r
+                                       TextBox_Put_Key(console->textbox, data);\r
+                               }\r
+                       } else if(data < TCM_OFFSET){\r
+                               //\94Ä\97p\97\98\97p\89Â\94\\97Ì\88æ1\r
+                       } else{\r
+                               //TCM\97Ì\88æ\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+bool Console_CompareCommandline_s(UI_Console *console, const uchar s[])\r
+{\r
+       return CFunction_CompareStrings(console->textbox->text_buf, s);\r
+}\r
+\r
+bool Console_CompareCommandline_n(UI_Console *console, const uchar s[], unsigned int n)\r
+{\r
+       return CFunction_CompareStrings_n(console->textbox->text_buf, s, n);\r
+}\r
+\r
+uint Console_printf(UI_Console *console, const uchar format[], ...)\r
+{\r
+       CFunction_vsnprintf(console->printf_buffer, CONSOLE_PRINTF_BUFFER_SIZE, format, (uint *)(&format + 1));\r
+       TextBox_Put_String(console->textbox, console->printf_buffer);\r
+       return 0;\r
+}\r
+\r
+uint Console_Command_dir(UI_Console *console)\r
+{\r
+       uint i, j;\r
+       IO_FloppyDisk_DirectoryEntry_UpdateTime rdetime;\r
+       IO_FloppyDisk_DirectoryEntry_UpdateDate rdedate;\r
+       IO_FloppyDisk_DirectoryEntry_Attribute rdeattr;\r
+\r
+       for(i = 0; i < FLOPPYDISK_RDE_ENTRIES; i++){\r
+               if(console->boot_fd->files[i].name[0] == 0x00){\r
+                       break;\r
+               }\r
+               rdeattr.attribute = console->boot_fd->files[i].attribute;\r
+               if(console->boot_fd->files[i].name[0] != 0xe5 && console->boot_fd->files[i].name[0] != 0x05 && !rdeattr.bit.volumelabel && !rdeattr.bit.directory){\r
+                       for(j = 0; j < 8; j++){\r
+                               TextBox_Put_Character(console->textbox, console->boot_fd->files[i].name[j]);\r
+                       }\r
+                       TextBox_Put_Character(console->textbox, '.');\r
+                       for(j = 0; j < 3; j++){\r
+                               TextBox_Put_Character(console->textbox, console->boot_fd->files[i].ext[j]);\r
+                       }\r
+                       Console_printf(console, " %6d", console->boot_fd->files[i].size);\r
+                       rdedate.updatedate = console->boot_fd->files[i].updatedate;\r
+                       Console_printf(console, " %04d/%02d/%02d", rdedate.bit.year + 1980, rdedate.bit.month, rdedate.bit.day);\r
+                       rdetime.updatetime = console->boot_fd->files[i].updatetime;\r
+                       Console_printf(console, " %02d:%02d:%02d\n", rdetime.bit.hour, rdetime.bit.minute, rdetime.bit.second << 1);\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+uint Console_Command_pci(UI_Console *console)\r
+{\r
+       uchar *p;\r
+       uint bus, device, function;\r
+       uint data;\r
+\r
+       TextBox_Put_String(console->textbox, "-<pci information>-\n");\r
+       if(CFunction_String_GetWord(console->textbox->text_buf, &p, 1)){\r
+               if(CFunction_String_GetWord(console->textbox->text_buf, &p, 3)){\r
+                       function = strtol(p, Null, 0);\r
+                       CFunction_String_GetWord(console->textbox->text_buf, &p, 2);\r
+                       device = strtol(p, Null, 0);\r
+                       CFunction_String_GetWord(console->textbox->text_buf, &p, 1);\r
+                       bus = strtol(p, Null, 0);\r
+                       Console_printf(console, "Bus%3d.Device%2d.Function%2d:\n", bus, device, function);\r
+                       if(bus < 256 && device < 32 && function < 8){\r
+                               PCI_ConfigurationRegister_SelectDevice(bus, device, function);\r
+                               data = PCI_ConfigurationRegister_Read32(0x00);\r
+                               if(data == 0xffffffff){\r
+                                       TextBox_Put_String(console->textbox, "Device not exist.\n");\r
+                               } else{\r
+                                       Console_printf(console, "DeviceVendor:%s(0x%04X)\n", PCI_GetDeviceVendor(data & 0xffff), data & 0xffff);\r
+                                       Console_printf(console, "DeviceID    :0x%04X\n", data >> 16);\r
+\r
+                                       data = PCI_ConfigurationRegister_Read32(0x08);\r
+                                       data = CFunction_ExtractBits(data, 8, 31);\r
+                                       Console_printf(console, "ClassCode   :%s(0x%06X)\n", PCI_GetDeviceClass(data), data);\r
+\r
+                                       data = PCI_ConfigurationRegister_Read32(0x0c);\r
+                                       data = CFunction_ExtractBits(data, 16, 22);\r
+                                       Console_printf(console, "DeviceType  :%s(%d)\n", PCI_GetDeviceType(data), data);\r
+                               }\r
+                       } else{\r
+                               TextBox_Put_String(console->textbox, "Invalid Device.\n");\r
+                       }\r
+               }\r
+       } else{\r
+               TextBox_Put_String(console->textbox, "Usage:");\r
+               TextBox_Put_String(console->textbox, "pci <bus> <device> <function>\n\nDevices which exist:\n");\r
+               for(bus = 0; bus < 256; bus++){\r
+                       for(device = 0; device < 32; device++){\r
+                               for(function = 0; function < 8; function++){\r
+                                       PCI_ConfigurationRegister_SelectDevice(bus, device, function);\r
+                                       data = PCI_ConfigurationRegister_Read32(0x00);\r
+                                       if(data != 0xffffffff){\r
+                                               Console_printf(console, "%3d.%2d.%2d, ", bus, device, function);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+uint Console_Command_type(UI_Console *console)\r
+{\r
+       uchar *p;\r
+       IO_File *file;\r
+       uint i;\r
+\r
+       TextBox_Put_String(console->textbox, "-<type>-");\r
+       if(CFunction_String_GetWord(console->textbox->text_buf, &p, 1)){\r
+                       if(FloppyDisk_IsPathExist(console->boot_fd, p)){\r
+                               TextBox_Put_String(console->textbox, ":");\r
+                               TextBox_Put_String(console->textbox, p);\r
+                               TextBox_Put_String(console->textbox, "\n");\r
+                               file = File_Initilaize();\r
+                               if(FloppyDisk_LoadFile(console->boot_fd, file, p) == 0){\r
+                                       for(i = 0; i < file->size; i++){\r
+                                               TextBox_Put_Character(console->textbox, ((uchar *)file->img)[i]);\r
+                                       }\r
+                               } else{\r
+                                       TextBox_Put_String(console->textbox, "type:File load Error.\n");\r
+                               }\r
+                               File_Free(file);\r
+                       } else{\r
+                               TextBox_Put_String(console->textbox, "\ntype:The path is not exist.\n");\r
+                       }\r
+       } else{\r
+               TextBox_Put_String(console->textbox, "\nUsage:");\r
+               TextBox_Put_String(console->textbox, "type filepath\n");\r
+       }\r
+       return 0;\r
+}\r
+\r
+uint Console_Command_task(UI_Console *console)\r
+{\r
+       uint i;\r
+       uchar *p;\r
+       UI_TaskControl *taskctrl;\r
+       UI_Task *search;\r
+\r
+       taskctrl = System_MultiTask_GetController();\r
+\r
+       TextBox_Put_String(console->textbox, "-<task>-\n");\r
+       if(CFunction_String_GetWord(console->textbox->text_buf, &p, 1)){\r
+/*\r
+                       if(FloppyDisk_IsPathExist(console->boot_fd, p)){\r
+                               TextBox_Put_String(console->textbox, ":");\r
+                               TextBox_Put_String(console->textbox, p);\r
+                               TextBox_Put_String(console->textbox, "\n");\r
+                               file = File_Initilaize();\r
+                               if(FloppyDisk_LoadFile(console->boot_fd, file, p) == 0){\r
+                                       for(i = 0; i < file->size; i++){\r
+                                               TextBox_Put_Character(console->textbox, ((uchar *)file->img)[i]);\r
+                                       }\r
+                               } else{\r
+                                       TextBox_Put_String(console->textbox, "type:File load Error.\n");\r
+                               }\r
+                               File_Free(file);\r
+                       } else{\r
+                               TextBox_Put_String(console->textbox, "\ntype:The path is not exist.\n");\r
+                       }\r
+*/\r
+       } else{\r
+               TextBox_Put_String(console->textbox, "Task list:\n");\r
+               for(search = taskctrl->start; search != Null; search = search->next){\r
+                       Console_printf(console, "sel:%02X count:%d\n", search->selector, search->count);\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r