OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / console.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/console.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/console.c
new file mode 100644 (file)
index 0000000..245b623
--- /dev/null
@@ -0,0 +1,459 @@
+\r
+#include "core.h"\r
+#include <string.h>\r
+\r
+void console_main(UI_Console *cons)\r
+{      \r
+       int i;\r
+       uint fifobuf[CONSOLE_FIFO_BUF_SIZE];\r
+       uchar s[128];\r
+       uchar cmdline[CONSOLE_CMDLINE_BUF_SIZE];\r
+       uint cmdlines;\r
+       bool cmdline_overflow;\r
+\r
+       cons->cursor_state = true;\r
+       cons->cursor_on = false;\r
+\r
+       cons->prompt.x = 0;\r
+       cons->prompt.y = 0;\r
+\r
+       fifo32_init(&cons->task->fifo, CONSOLE_FIFO_BUF_SIZE, fifobuf, cons->task);\r
+       cons->timer = timer_alloc();\r
+       timer_init(cons->timer, &cons->task->fifo, 1);\r
+       timer_settime(cons->timer, 50);\r
+\r
+       boxfill_win(cons->win, CONSOLE_COLOR_BACKGROUND, 0, 0, cons->win->xsize, cons->win->ysize);\r
+       cons_put_prompt(cons);\r
+\r
+       cons_reset_cmdline(cmdline, &cmdlines, &cmdline_overflow);\r
+\r
+       for(;;){\r
+               io_cli();\r
+               if(fifo32_status(&cons->task->fifo) == 0){\r
+                       task_sleep(cons->task);\r
+                       io_sti();\r
+               } else {\r
+                       i = fifo32_get(&cons->task->fifo);\r
+                       io_sti();\r
+                       if(i == 1){\r
+                               if(cons->cursor_on){\r
+                                       if(cons->cursor_state){\r
+                                               cons->cursor_c = CONSOLE_COLOR_CHAR;\r
+                                               cons->cursor_state = false;\r
+                                       } else{\r
+                                               cons->cursor_c = CONSOLE_COLOR_BACKGROUND;\r
+                                               cons->cursor_state = true;\r
+                                       }\r
+                                       boxfill_win(cons->win, cons->cursor_c, cons->cursor.x, cons->cursor.y, cons->cursor.x + 8, cons->cursor.y +16);\r
+                               }\r
+                               timer_settime(cons->timer, 50);\r
+                       } else if(i == CONSOLE_FIFO_CURSOR_START){\r
+                               cons->cursor_on = true;\r
+                       } else if(i == CONSOLE_FIFO_CURSOR_STOP){\r
+                               cons->cursor_on = false;\r
+                               boxfill_win(cons->win, CONSOLE_COLOR_BACKGROUND, cons->cursor.x, cons->cursor.y, cons->cursor.x + 8, cons->cursor.y +16);\r
+                       } else if(CONSOLE_FIFO_START_KEYB <= i && i <= CONSOLE_FIFO_START_KEYB + DATA_BYTE){\r
+                               i -= CONSOLE_FIFO_START_KEYB;\r
+                               if(i == 0x0e){\r
+                                       putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_BACKGROUND, CONSOLE_COLOR_BACKGROUND, " ");\r
+                                       cons->cursor.x -= 8;\r
+                                       cons_check_newline(cons);\r
+                                       putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_BACKGROUND, CONSOLE_COLOR_BACKGROUND, " ");\r
+                                       if(cmdlines != 0){\r
+                                               cmdlines--;\r
+                                               cmdline[cmdlines] = 0x00;\r
+                                       }\r
+                               } else if(i == 0x0a){\r
+                                       cons_command_start(cons, cmdline, &cmdlines, &cmdline_overflow);\r
+                               } else{\r
+                                       s[0] = (uchar)i;\r
+                                       s[1] = 0x00;\r
+                                       cons_put_str(cons, s);\r
+                                       if(cmdlines >= CONSOLE_CMDLINE_BUF_SIZE){\r
+                                               cmdline_overflow = true;\r
+                                               cmdlines = 0;\r
+                                       }\r
+                                       cmdline[cmdlines] = (uchar)i;\r
+                                       cmdline[cmdlines + 1] = 0x00;\r
+                                       cmdlines++;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void cons_reset_cmdline(uchar *cmdline, uint *cmdlines, bool *cmdline_overflow)\r
+{\r
+       *cmdlines = 0;\r
+       *cmdline_overflow = false;\r
+       cmdline[*cmdlines] = 0x00;\r
+       return;\r
+}\r
+\r
+void cons_command_start(UI_Console *cons, uchar *cmdline, uint *cmdlines, bool *cmdline_overflow)\r
+{\r
+       uchar s[128], t[7];\r
+       uint i;\r
+       UUID uuid;\r
+\r
+       i = 0;\r
+\r
+       if(cmdline[0] != 0x00){\r
+               cons_new_line_no_prompt(cons);\r
+       }\r
+       if(strcmp(cmdline, "mem") == 0){\r
+               cons_command_mem(cons);\r
+       } else if(strcmp(cmdline, "cls") == 0){\r
+               cons->prompt.x = 0;\r
+               cons->prompt.y = 0;\r
+               boxfill_win(cons->win, CONSOLE_COLOR_BACKGROUND, 0, 0, cons->win->xsize, cons->win->ysize);\r
+               cons_reset_cmdline(cmdline, cmdlines, cmdline_overflow);\r
+               cons_put_prompt(cons);\r
+               goto end;\r
+       } else if(strcmp(cmdline, "dir") == 0){\r
+               cons_command_dir(cons);\r
+       } else if(strcmp(cmdline, "reset") == 0){\r
+               reset_cpu();\r
+       } else if(strcmp(cmdline, "uuid") == 0){\r
+               gen_UUID(&uuid);\r
+               sprintf(s, "{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}\r\n", uuid.data[0], uuid.data[1], uuid.data[2], uuid.data[3], uuid.data[4], uuid.data[5], uuid.data[6], uuid.data[7], uuid.data[8], uuid.data[9], uuid.data[10], uuid.data[11], uuid.data[12], uuid.data[13], uuid.data[14], uuid.data[15]);\r
+               cons_put_str(cons, s);\r
+       } else if(strcmp(cmdline, "date") == 0){\r
+               readrtc(t);\r
+               sprintf(s, "%02X%02X.%02X.%02X %02X:%02X:%02X\n", t[6], t[5], t[4], t[3], t[2], t[1], t[0]);\r
+               cons_put_str(cons, s);\r
+       } else if(strcmp(cmdline, "sht") == 0){\r
+               sprintf(s, " console = %d\n top = %d\n top_get = %d\n", cons->win->win->height, system.ui.draw.sht.ctrl.top, sheet_get_topheight());\r
+               cons_put_str(cons, s);\r
+       } else if(strncmp(cmdline, "fdc", 3) == 0){\r
+               cons_command_fdc(cons, cmdline);\r
+       } else if(strncmp(cmdline, "cpuid ", 5) == 0){\r
+               cons_command_cpuid(cons, cmdline);\r
+       } else if(strncmp(cmdline, "systeminfo", 10) == 0){\r
+               cons_command_systeminfo(cons, cmdline);\r
+       } else if(strncmp(cmdline, "type ", 5) == 0){\r
+               cons_command_type(cons, cmdline);\r
+       } else if(cmdline[0] != 0x00){\r
+               for(i = 0; i < 11 && cmdline[i] != 0x00; i++){\r
+                       if(cmdline[i] <= ' ' || cmdline[i] == '.') break;\r
+               }\r
+               cmdline[i] = 0x00;\r
+               if(cons_app_hrb_start(cons, cmdline) == 0xFFFFFFFF){\r
+                       cons_put_str(cons, "Bad Command...\n");\r
+               }\r
+       }\r
+       cons_reset_cmdline(cmdline, cmdlines, cmdline_overflow);\r
+       cons_new_line(cons);\r
+end:\r
+       return;\r
+}\r
+\r
+void cons_command_mem(UI_Console *cons)\r
+{\r
+       uchar s[32];\r
+\r
+       sprintf(s, "ÒÓØ°:%dMB\n", system.io.mem.total >> 20);\r
+       cons_put_str(cons, s);\r
+       sprintf(s, "±·:%dKB\n", sys_memman_free_total() >> 10);\r
+       cons_put_str(cons, s);\r
+       return;\r
+}\r
+\r
+void cons_command_dir(UI_Console *cons)\r
+{\r
+       uchar s[64];\r
+       int i, j;\r
+\r
+       for(i = 0; i < 0xe0; i++){\r
+               if(system.io.file.list[i].name[0] == 0x00) break;\r
+               if(system.io.file.list[i].name[0] != 0xe5){\r
+                       if((system.io.file.list[i].type & 0x18) == 0){\r
+                               sprintf(s, "FILENAME.EXT %7d %04d/%02d/%02d-%02d:%02d:%02d\n", system.io.file.list[i].size, (system.io.file.list[i].date >> 9) + 1980, (system.io.file.list[i].date & 0x01e0) >> 5, system.io.file.list[i].date & 0x001f, system.io.file.list[i].time >> 11, (system.io.file.list[i].time & 0x07e0) >> 5, system.io.file.list[i].time & 0x1f);\r
+                               for(j = 0; j < 8; j++){\r
+                                       s[j] = system.io.file.list[i].name[j];\r
+                               }\r
+                               s[ 9] = system.io.file.list[i].ext[0];\r
+                               s[10] = system.io.file.list[i].ext[1];\r
+                               s[11] = system.io.file.list[i].ext[2];\r
+                               cons_put_str(cons, s);\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void cons_command_fdc(UI_Console *cons, uchar *cmdline)\r
+{\r
+       int i;\r
+\r
+       cons_put_str(cons, "FDCconfig...\n");\r
+       if(cmdline[3] == 0x00){\r
+               i = io_in8(0x03f2);\r
+               if((i & 0x10) != 0) cons_put_str(cons, "FD0 Motor-ON\n");\r
+               else cons_put_str(cons, "FD0 Motor-OFF\n");\r
+               if((i & 0x20) != 0) cons_put_str(cons, "FD1 Motor-ON\n");\r
+               else cons_put_str(cons, "FD1 Motor-OFF\n");\r
+               if((i & 0x40) != 0) cons_put_str(cons, "FD2 Motor-ON\n");\r
+               else cons_put_str(cons, "FD2 Motor-OFF\n");\r
+               if((i & 0x80) != 0) cons_put_str(cons, "FD3 Motor-ON\n");\r
+               else cons_put_str(cons, "FD3 Motor-OFF\n");\r
+       }\r
+       if(cmdline[3] == ' '){\r
+               if(cmdline[4] == '0'){\r
+                       if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'n' && cmdline[8] == 0x00){\r
+                               fdc_motor_on(0);\r
+                       } else if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'f' && cmdline[8] == 'f' && cmdline[9] == 0x00){\r
+                               fdc_motor_off(0);\r
+                       }\r
+               } else if(cmdline[4] == '1'){\r
+                       if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'n' && cmdline[8] == 0x00){\r
+                               fdc_motor_on(1);\r
+                       } else if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'f' && cmdline[8] == 'f' && cmdline[9] == 0x00){\r
+                               fdc_motor_off(1);\r
+                       }\r
+               } else if(cmdline[4] == '2'){\r
+                       if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'n' && cmdline[8] == 0x00){\r
+                               fdc_motor_on(2);\r
+                       } else if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'f' && cmdline[8] == 'f' && cmdline[9] == 0x00){\r
+                               fdc_motor_off(2);\r
+                       }\r
+               } else if(cmdline[4] == '3'){\r
+                       if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'n' && cmdline[8] == 0x00){\r
+                               fdc_motor_on(3);\r
+                       } else if(cmdline[5] == ' ' && cmdline[6] == 'o' && cmdline[7] == 'f' && cmdline[8] == 'f' && cmdline[9] == 0x00){\r
+                               fdc_motor_off(3);\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void cons_command_type(UI_Console *cons, uchar *cmdline)\r
+{\r
+       int i, j;\r
+       uchar s[32];\r
+       uchar *p;\r
+\r
+       j = 0;\r
+       for(i = 5; cmdline[i] != 0x00; i++){\r
+               s[i - 5] = cmdline[i];\r
+               s[i - 4] = 0x00;\r
+       }\r
+       i = search_file(s);\r
+       if(i != 0xFFFFFFFF){\r
+               j = system.io.file.list[i].size;\r
+               p = sys_memman_alloc(j); \r
+               load_file(i, p);\r
+               for(i = 0; i < j; i++){\r
+                       s[0] = p[i];\r
+                       s[1] = 0x00;\r
+                       cons_put_str(cons, s);\r
+               }\r
+               sys_memman_free(p, j);\r
+       } else{\r
+               cons_put_str(cons, "File not found...\n");\r
+       }\r
+       return;\r
+}\r
+\r
+void cons_command_cpuid(UI_Console *cons, uchar *cmdline)\r
+{\r
+       uint i, j;\r
+       bool cpuide;\r
+       uchar s[32];\r
+       uchar idbuf[32];\r
+\r
+       i = io_load_eflags();\r
+       io_store_eflags((i | 0x00200000));\r
+       j = io_load_eflags();   \r
+       if(i != j){\r
+               cpuide = true;\r
+               cons_put_str(cons, "CPUID is Enable.\n");\r
+       } else{\r
+               cpuide = false;\r
+               cons_put_str(cons, "CPUID is Disable.\n");\r
+       }\r
+       io_store_eflags((j & ~0x00200000));\r
+\r
+       idbuf[16] = '\n';\r
+       idbuf[17] = 0x00;\r
+\r
+       if(cpuide){\r
+               if(strcmp((uchar *)(cmdline + 6), "0x00000000") == 0){\r
+                       s[16] = 0x00;\r
+                       cpuid(idbuf, 0x00000000);\r
+                       sprintf(s, "MAX=0x%02X%02X%02X%02X\n", idbuf[0], idbuf[1], idbuf[2], idbuf[3]);\r
+                       cons_put_str(cons, s);\r
+                       cons_put_str(cons, (uchar *)(idbuf + 4));\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void cons_command_systeminfo(UI_Console *cons, uchar *cmdline)\r
+{\r
+       uchar s[64];\r
+\r
+       sprintf(s, "CHNOSProject ver.Beta008\n Compiled at %s %s\n", __DATE__, __TIME__);\r
+       cons_put_str(cons, s);\r
+       return;\r
+}\r
+\r
+uint cons_app_hrb_start(UI_Console *cons, uchar *cmdline)\r
+{\r
+       uint i, j, k;\r
+       uchar *p, *q;\r
+       UI_Task *task = task_now();\r
+       FORMAT_Haribote *head;\r
+\r
+       i = search_file(cmdline);\r
+       if(i == 0xFFFFFFFF){\r
+               strcat(cmdline, ".hrb");\r
+               i = search_file(cmdline);\r
+       }\r
+       if(i != 0xFFFFFFFF){\r
+               j = system.io.file.list[i].size;\r
+               p = sys_memman_alloc(j);\r
+               head = (FORMAT_Haribote *) p;\r
+               load_file(i, p);\r
+               if(j >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00){\r
+                       q = sys_memman_alloc(head->DataSegmentSize);\r
+                       cons->app_ds_base = q;\r
+                       cons->app_cs_base = p;\r
+                       set_segmdesc(system.io.mem.segment.gdt + 1003, j - 1, (int)p, AR_CODE32_ER + AR_APP);\r
+                       set_segmdesc(system.io.mem.segment.gdt + 1004, head->DataSegmentSize - 1, (int)q, AR_DATA32_RW + AR_APP);\r
+                       for(i = 0; i < head->DataSegmentSize; i++){\r
+                               q[head->DefaultESP + i] = p[head->OriginDataSection + i];\r
+                       }\r
+                       start_app(0x1b, 1003 * 8, head->DefaultESP, 1004 * 8, &(task->tss.esp0));\r
+\r
+                       for(k = 0;k < MAX_WINDOWS;k++){\r
+                               if(system.ui.window.ctrl.winfos[k].task == task){\r
+                                       sys_memman_free(system.ui.window.ctrl.winfos[k].buf, system.ui.window.ctrl.winfos[k].winxsize * system.ui.window.ctrl.winfos[k].winysize * (system.data.info.vesa.BitsPerPixel >> 3));\r
+                                       free_window_app(&system.ui.window.ctrl.winfos[k]);      \r
+                               }\r
+                       }\r
+\r
+                       sys_memman_free(q, head->DataSegmentSize);\r
+               } else{\r
+                       cons_put_str(cons, ".hrb̧²ÙÌ«°Ï¯Ä´×°\n");\r
+               }\r
+               sys_memman_free(p, j);\r
+               return i;\r
+       }\r
+       return 0xFFFFFFFF;\r
+}\r
+\r
+void cons_put_str(UI_Console *cons, uchar *str)\r
+{\r
+       int i;\r
+       uchar s[3];\r
+\r
+       for(i = 0; i < 128; i++){\r
+               if(str[i] == 0x00){\r
+                       break;\r
+               } else if(str[i] == '\r'){\r
+\r
+               } else if(str[i] == '\n'){\r
+                       if(cons->cursor.x != 0)cons_new_line_no_prompt(cons);\r
+               } else if(str[i] == '\t'){\r
+                       for(;;){\r
+                               putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_CHAR, CONSOLE_COLOR_BACKGROUND, " ");\r
+                               cons->cursor.x += 8;\r
+                               cons_check_newline(cons);\r
+                               if((cons->cursor.x & 0x1f) == 0 && cons->cursor.x != 0) break;\r
+                       }\r
+               } else{\r
+                       s[0] = str[i];\r
+                       s[1] = 0x00;\r
+                       putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_CHAR, CONSOLE_COLOR_BACKGROUND, s);\r
+                       cons->cursor.x += 8;\r
+                       cons_check_newline(cons);\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void cons_put_char(UI_Console *cons, uchar c)\r
+{\r
+       uchar s[2];\r
+\r
+       s[0] = c;\r
+       s[1] = 0x00;\r
+       cons_put_str(cons, s);\r
+       return;\r
+}\r
+\r
+void cons_put_prompt(UI_Console *cons)\r
+{\r
+       putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_BACKGROUND, CONSOLE_COLOR_BACKGROUND, " ");\r
+       putfonts_win(cons->win, cons->prompt.x, cons->prompt.y, CONSOLE_COLOR_CHAR, CONSOLE_COLOR_BACKGROUND, ">");\r
+       cons->cursor.x = cons->prompt.x + 8;\r
+       cons->cursor.y = cons->prompt.y;\r
+       return;\r
+}\r
+\r
+void cons_new_line(UI_Console *cons)\r
+{\r
+       if(cons->cursor.y <= system.ui.console.org_ysize - 17){\r
+               cons->prompt.y = cons->cursor.y + 16;\r
+               cons_put_prompt(cons);\r
+       } else{\r
+               putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_BACKGROUND, CONSOLE_COLOR_BACKGROUND, " ");\r
+               cons_slide_line(cons);\r
+               cons->prompt.y = (system.ui.console.org_ychars - 1) * 16;\r
+               cons_put_prompt(cons);\r
+       }\r
+       return;\r
+}\r
+\r
+void cons_new_line_no_prompt(UI_Console *cons)\r
+{\r
+       if(cons->cursor.y <= system.ui.console.org_ysize - 17){\r
+               putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_BACKGROUND, CONSOLE_COLOR_BACKGROUND, " ");\r
+               cons->cursor.x = 0;\r
+               cons->cursor.y = cons->cursor.y + 16;\r
+       } else{\r
+               putfonts_win(cons->win, cons->cursor.x, cons->cursor.y, CONSOLE_COLOR_BACKGROUND, CONSOLE_COLOR_BACKGROUND, " ");\r
+               cons_slide_line(cons);\r
+               cons->cursor.x = 0;\r
+       }\r
+       return;\r
+}\r
+\r
+void cons_slide_line(UI_Console *cons)\r
+{\r
+       scrool_win(cons->win);\r
+       refresh_window(cons->win);\r
+       return;\r
+}\r
+\r
+void cons_check_newline(UI_Console *cons)\r
+{\r
+       if(cons->cursor.x <= cons->prompt.x){\r
+               if(cons->cursor.y != cons->prompt.y){\r
+                       if(cons->cursor.x < cons->prompt.x){\r
+                               cons->cursor.y -= 16;\r
+                               cons->cursor.x = system.ui.console.org_xsize - 8;\r
+                       }\r
+               } else{\r
+                       cons->cursor.y = cons->prompt.y;\r
+                       cons->cursor.x = 8;\r
+               }\r
+       } else if(cons->cursor.x >= system.ui.console.org_xsize){\r
+               if(cons->cursor.y <= system.ui.console.org_ysize - 17){\r
+                       cons->cursor.x = 0;\r
+                       cons->cursor.y += 16;\r
+               } else{\r
+                       cons_slide_line(cons);\r
+                       cons->cursor.x = 0;\r
+                       if(cons->prompt.y > 0) cons->prompt.y -= 16;\r
+                       else{\r
+                               cons->prompt.y = 0;\r
+                               cons->prompt.x = 0;\r
+                       }\r
+               }\r
+       } \r
+       return;\r
+}\r