--- /dev/null
+\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