--- /dev/null
+\r
+#include "core.h"\r
+\r
+UI_Console *console_root;\r
+\r
+System_CommonData *sysdata;\r
+\r
+uchar *MIDI_Notes[12] = {\r
+ "C ",\r
+ "C#",\r
+ "D ",\r
+ "D#",\r
+ "E ",\r
+ "F ",\r
+ "F#",\r
+ "G ",\r
+ "G#",\r
+ "A ",\r
+ "A#",\r
+ "B "\r
+};\r
+\r
+ushort ToneTable[12] = {\r
+ 262,\r
+ 277,\r
+ 294,\r
+ 311,\r
+ 330,\r
+ 349,\r
+ 370,\r
+ 392,\r
+ 415,\r
+ 440,\r
+ 466,\r
+ 494\r
+};\r
+\r
+void Initialise_Console(UI_Console *consctrl, System_CommonData *systemdata)\r
+{\r
+ console_root = consctrl;\r
+ console_root->win = 0;\r
+ console_root->input = 0;\r
+ console_root->next = 0;\r
+ console_root->ctimer = 0;\r
+\r
+ sysdata = systemdata;\r
+\r
+ return;\r
+}\r
+\r
+UI_Console *Console_Create(uint xchars, uint ychars)\r
+{\r
+ UI_Console *cons, *end;\r
+ UI_Task *cons_task;\r
+\r
+ cons = MemoryBlock_Allocate_System(sizeof(UI_Console));\r
+ MemoryBlock_Write_Description(cons, "UI_Console");\r
+\r
+ cons->input = InputBox_Initialise(&sys_sheet_ctrl, &sys_mem_ctrl, 0, 0, xchars << 3, ychars << 4, 256, 0xffffff, 0x000000, Sheet_Get_Top_Of_Height(&sys_sheet_ctrl));\r
+ cons->win = Window_Create_User("Console", 0, cons->input->sheet);\r
+\r
+ for(end = console_root; end->next != 0; end = end->next){\r
+\r
+ }\r
+ cons->next = 0;\r
+ end->next = cons;\r
+\r
+ FIFO32_Initialise(&cons->fifo, CONSOLE_FIFO_SIZE);\r
+ Sheet_Set_FIFO(cons->win->client, &cons->fifo, SIGNAL_FLAGS_FOCUSINFO);\r
+\r
+ cons->ctimer = Timer_Get(&cons->fifo, 0x105);\r
+ Timer_Set(cons->ctimer, 50, once);\r
+\r
+ cons_task = MultiTask_Task_Get("ConsoleTask");\r
+ cons_task->tss.ldtr = 0;\r
+ cons_task->tss.iomap = 0x4000;\r
+ cons_task->tss.eip = (uint)&Console_MainTask;\r
+ cons_task->tss.eflags = 0x00000202;\r
+ cons_task->tss.esp = (uint)MemoryBlock_Allocate_System(64 * 1024) + 64 * 1024;\r
+ MemoryBlock_Write_Description((void *)(cons_task->tss.esp - 64 * 1024), "Console-Stack");\r
+ cons_task->tss.es = 1 * 8;\r
+ cons_task->tss.cs = 2 * 8;\r
+ cons_task->tss.ss = 1 * 8;\r
+ cons_task->tss.ds = 1 * 8;\r
+ cons_task->tss.fs = 1 * 8;\r
+ cons_task->tss.gs = 1 * 8;\r
+ cons_task->tss.cr3 = (uint)ADR_Paging_Directory;\r
+ MultiTask_Task_Arguments(cons_task, 1, cons);\r
+ MultiTask_Task_Run(cons_task);\r
+\r
+ FIFO32_Set_Task(&cons->fifo, cons_task);\r
+ Timer_Run(cons->ctimer);\r
+\r
+ CHNOS_UI_KeyFocus_Change(cons->win->client);\r
+\r
+ return cons;\r
+}\r
+\r
+void Console_MainTask(UI_Console *cons)\r
+{\r
+ UI_Task *mytask;\r
+ uint i, j;\r
+ uint buf[3];\r
+ bool clear_screen;\r
+ uchar s[64];\r
+\r
+ mytask = MultiTask_Get_NowTask();\r
+ mytask->cons = cons;\r
+ clear_screen = false;\r
+\r
+ InputBox_Put_Prompt(cons->input);\r
+\r
+ for(;;){\r
+ if(FIFO32_Status(&cons->fifo) == 0){\r
+ MultiTask_Task_Sleep(mytask);\r
+ } else{\r
+ i = FIFO32_Get(&cons->fifo);\r
+ if(i < DATA_BYTE){ /*\83L\81[\83{\81[\83h\95¶\8e\9a\83f\81[\83^*/\r
+ if(i == '\n'){\r
+ InputBox_Set_Record(cons->input, false);\r
+ if(cons->input->input_buf[0] != 0x00){\r
+ InputBox_NewLine_No_Prompt(cons->input);\r
+ }\r
+ if(strcmp(cons->input->input_buf, "cls") == 0){\r
+ InputBox_Clear(cons->input);\r
+ clear_screen = true;\r
+ } else if(strcmp(cons->input->input_buf, "memmap") == 0){\r
+ Console_Command_memmap(cons);\r
+ } else if(strcmp(cons->input->input_buf, "memblock") == 0){\r
+ Console_Command_memblock(cons);\r
+ } else if(strcmp(cons->input->input_buf, "mem") == 0){\r
+ Console_Command_mem(cons);\r
+ } else if(strcmp(cons->input->input_buf, "systeminfo") == 0){\r
+ Console_Command_systeminfo(cons);\r
+ } else if(strcmp(cons->input->input_buf, "task") == 0){\r
+ Console_Command_task(cons);\r
+ } else if(strcmp(cons->input->input_buf, "window") == 0){\r
+ Console_Command_window(cons);\r
+ } else if(strcmp(cons->input->input_buf, "console") == 0){\r
+ Console_Command_console(cons);\r
+ } else if(strncmp(cons->input->input_buf, "type ", 5) == 0){\r
+ Console_Command_type(cons, &cons->input->input_buf[5]);\r
+ } else if(strcmp(cons->input->input_buf, "dir") == 0){\r
+ Console_Command_dir(cons);\r
+ } else if(strcmp(cons->input->input_buf, "gdt") == 0){\r
+ Console_Command_gdt(cons);\r
+ } else if(strcmp(cons->input->input_buf, "test") == 0){\r
+ sprintf(s, "taskaddr:0x%08X\n", mytask);\r
+ InputBox_Put_String(cons->input, s);\r
+ IO_Beep(440, 5000000);\r
+ } else if(strncmp(cons->input->input_buf, "midi ", 5) == 0){\r
+ Console_Command_midi(cons, &cons->input->input_buf[5]);\r
+ } else if(cons->input->input_buf[0] != 0x00){\r
+ Console_Execute(cons);\r
+ }\r
+ InputBox_Set_Record(cons->input, true);\r
+ InputBox_Reset_Input_Buffer(cons->input);\r
+ if(clear_screen){\r
+ InputBox_Put_Prompt(cons->input);\r
+ clear_screen = false;\r
+ } else{\r
+ InputBox_NewLine(cons->input);\r
+ }\r
+ } else{\r
+ InputBox_Put_Character(cons->input, i);\r
+ }\r
+ } else if(i == 0x105){\r
+ InputBox_Change_Cursor_State(cons->input);\r
+ Timer_Run(cons->ctimer);\r
+ } else if(i > SIGNAL_START){\r
+ buf[0] = i;\r
+ for(j = 1; j < 3; j++){\r
+ buf[j] = 0x00;\r
+ }\r
+ for(j = 1; j < 3; j++){\r
+ buf[j] = FIFO32_Get(&cons->fifo);\r
+ if(buf[j] == SIGNAL_ARGUMENTS_END){\r
+ break;\r
+ }\r
+ }\r
+ if(i == SIGNAL_WINDOW_FOCUS_GET){\r
+ if(buf[2] == SIGNAL_ARGUMENTS_END){ /*\82·\82×\82Ä\90³\8fí\82É\8eó\90M\82µ\82½*/\r
+ Timer_Run(cons->ctimer);\r
+ }\r
+ } else if(i == SIGNAL_WINDOW_FOCUS_LOST){\r
+ if(buf[2] == SIGNAL_ARGUMENTS_END){ /*\82·\82×\82Ä\90³\8fí\82É\8eó\90M\82µ\82½*/\r
+ Timer_Cancel(cons->ctimer);\r
+ if(cons->input->cursor_state){ /*\83v\83\8d\83\93\83v\83g\82ª\95\\8e¦\82³\82ê\82Ä\82¢\82½\82ç\8fÁ\82·*/\r
+ InputBox_Change_Cursor_State(cons->input);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+void Console_Command_memmap(UI_Console *cons)\r
+{\r
+ DATA_BootInfo *bootinfo = (DATA_BootInfo *)ADR_BOOTINFO;\r
+ uchar s[64];\r
+ uint i;\r
+\r
+ sprintf(s, "ACPI 0xe820 MemoryMaps:%d\n", bootinfo->ACPI_MemoryMapEntries);\r
+ InputBox_Put_String(cons->input, s);\r
+ for(i = 0; i < bootinfo->ACPI_MemoryMapEntries; i++){\r
+ sprintf(s, "%02d:[0x%08X%08X](0x%08X%08X) %s 0x%08X\n", i, bootinfo->ACPI_MemoryMap[i].Base.high, bootinfo->ACPI_MemoryMap[i].Base.low, bootinfo->ACPI_MemoryMap[i].Length.high, bootinfo->ACPI_MemoryMap[i].Length.low, ACPI_MemoryMap_Type[bootinfo->ACPI_MemoryMap[i].Type], bootinfo->ACPI_MemoryMap[i].Attribute);\r
+ InputBox_Put_String(cons->input, s);\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_memblock(UI_Console *cons)\r
+{\r
+ uint memusing;\r
+ uchar s[64];\r
+ Memory *memblock;\r
+\r
+ memusing = 0;\r
+ sprintf(s, "MemoryBlocks:%d\n", SystemMemory.size);\r
+ InputBox_Put_String(cons->input, s);\r
+ for(memblock = &SystemMemory; memblock->next != 0; memblock = memblock->next){\r
+ sprintf(s, "[0x%08X](%8u Bytes):%s\n", memblock->next->addr, memblock->next->size, memblock->next->description);\r
+ InputBox_Put_String(cons->input, s);\r
+ memusing += memblock->next->size;\r
+ }\r
+ sprintf(s, "MemoryUsing:%u Bytes + (%u Bytes * %u) = %u(%uM)Bytes.", memusing, sizeof(Memory), SystemMemory.size, memusing + (sizeof(Memory) * SystemMemory.size), (memusing + (sizeof(Memory) * SystemMemory.size)) >> 20);\r
+ InputBox_Put_String(cons->input, s);\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_mem(UI_Console *cons)\r
+{\r
+ uint memusing, i;\r
+ uchar s[64];\r
+ Memory *memblock;\r
+\r
+ memusing = 0;\r
+ sprintf(s, "Memory :%uByte:%uMB\n", System_MemoryControl_FullSize(), System_MemoryControl_FullSize() >> 20);\r
+ InputBox_Put_String(cons->input, s);\r
+ sprintf(s, "Free :%uByte:%uMB\n", System_MemoryControl_FreeSize(), System_MemoryControl_FreeSize() >> 20);\r
+ InputBox_Put_String(cons->input, s);\r
+ InputBox_Put_String(cons->input, "Using:\n");\r
+ for(memblock = &SystemMemory; memblock->next != 0; memblock = memblock->next){\r
+ memusing += memblock->next->size;\r
+ }\r
+ sprintf(s, "\tMemoryBlock :%uByte:%uMB\n", memusing + (sizeof(Memory) * SystemMemory.size), (memusing + (sizeof(Memory) * SystemMemory.size)) >> 20);\r
+ InputBox_Put_String(cons->input, s);\r
+ memusing = 1;\r
+ for(i = 0; i < 1024; i++){\r
+ if((ADR_Paging_Directory[i] & PG_PRESENT) != 0){\r
+ memusing++;\r
+ }\r
+ }\r
+ sprintf(s, "\tPageDirectory+Table:%uByte:%uMB\n", i << 12, i >> 8);\r
+ InputBox_Put_String(cons->input, s);\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_systeminfo(UI_Console *cons)\r
+{\r
+ DATA_BootInfo *bootinfo = (DATA_BootInfo *)ADR_BOOTINFO;\r
+ uchar s[64];\r
+\r
+ sprintf(s, "ACPI 0xe820 MemoryMaps:%d\n", bootinfo->ACPI_MemoryMapEntries);\r
+ InputBox_Put_String(cons->input, s);\r
+ sprintf(s, "APM-Version:%X.%X\n", bootinfo->APM_Version >> 8, bootinfo->APM_Version & 0x00FF);\r
+ InputBox_Put_String(cons->input, s);\r
+ sprintf(s, "APM-Flags:0x%04X\n", bootinfo->APM_Flags);\r
+ InputBox_Put_String(cons->input, s);\r
+ sprintf(s, "VESA-Version:%X.%X\n", bootinfo->VESA_Version >> 8, bootinfo->VESA_Version & 0x00FF);\r
+ InputBox_Put_String(cons->input, s);\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_task(UI_Console *cons)\r
+{\r
+ UI_Task *task;\r
+ uchar s[64];\r
+\r
+ for(task = taskctrl->next; task != 0; task = task->next){\r
+ sprintf(s, "0x%04X (%10u):%s\n", task->selector, task->cputime, task->description);\r
+ InputBox_Put_String(cons->input, s);\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_window(UI_Console *cons)\r
+{\r
+ UI_Window *win;\r
+ uchar s[64];\r
+\r
+ for(win = sysdata->windowctrl.next; win != 0; win = win->next){\r
+ sprintf(s, "%s\n", win->title);\r
+ InputBox_Put_String(cons->input, s);\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_console(UI_Console *cons)\r
+{\r
+ DATA_BootInfo *bootinfo = (DATA_BootInfo *)ADR_BOOTINFO;\r
+\r
+ Console_Create((bootinfo->scrnx >> 4), (bootinfo->scrny >> 5));\r
+ return;\r
+}\r
+\r
+void Console_Command_type(UI_Console *cons, const uchar filename[])\r
+{\r
+ IO_File file;\r
+ int n;\r
+ uint i;\r
+\r
+ n = FloppyDisk_Search_File(sysdata->fd_boot, filename);\r
+ if(n != -1){\r
+ n = FloppyDisk_Load_File(sysdata->fd_boot, &file, n);\r
+ if(n != -1){\r
+ for(i = 0; i < file.size; i++){\r
+ InputBox_Put_Character(cons->input, file.data[i]);\r
+ }\r
+ } else{\r
+ InputBox_Put_String(cons->input, "type:File load error.\n");\r
+ }\r
+ File_Free(&file);\r
+ } else{\r
+ InputBox_Put_String(cons->input, "type:File not found.\n");\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_dir(UI_Console *cons)\r
+{\r
+ uint i, j;\r
+ uchar s[64];\r
+\r
+ for(i = 0; i < 224; i++){\r
+ if(sysdata->fd_boot->files[i].name[0] == 0x00){\r
+ break;\r
+ }\r
+ if(sysdata->fd_boot->files[i].name[0] != 0xe5){\r
+ sprintf(s, "FILENAME.EXT %7d %04d/%02d/%02d %02d:%02d:%02d\n", sysdata->fd_boot->files[i].size, (sysdata->fd_boot->files[i].updatedate >> 9) + 1980, (sysdata->fd_boot->files[i].updatedate & 0x01e0) >> 5, sysdata->fd_boot->files[i].updatedate & 0x001f, sysdata->fd_boot->files[i].updatetime >> 11, (sysdata->fd_boot->files[i].updatetime & 0x07e0) >> 5, sysdata->fd_boot->files[i].updatetime & 0x1f);\r
+ for(j = 0; j < 8; j++){\r
+ s[j] = sysdata->fd_boot->files[i].name[j];\r
+ }\r
+ for(j = 9; j < 12; j++){\r
+ s[j] = sysdata->fd_boot->files[i].name[j - 1];\r
+ }\r
+ InputBox_Put_String(cons->input, s);\r
+ }\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+void Console_Command_gdt(UI_Console *cons)\r
+{\r
+ uint i, ar;\r
+ uchar s[64];\r
+\r
+ for(i = 0; i < 8192; i++){\r
+ if(System_SegmentDescriptor_Get_Limit(i) != 0){\r
+ sprintf(s, "0x%04X:[0x%08X](0x%08X) ", i, System_SegmentDescriptor_Get_Base(i), System_SegmentDescriptor_Get_Limit(i));\r
+ InputBox_Put_String(cons->input, s);\r
+ ar = System_SegmentDescriptor_Get_AccessRight(i);\r
+ if((ar & AR_CODE_OR_DATA) != 0){ /*code or data*/\r
+ if((ar & 0x08) != 0){ /*code*/\r
+ InputBox_Put_String(cons->input, "Code Execute");\r
+ if((ar & 0x02) != 0){ /*Read*/\r
+ InputBox_Put_String(cons->input, "/Read ");\r
+ } else{\r
+ InputBox_Put_String(cons->input, " Only ");\r
+ }\r
+ if((ar & 0x04) != 0){ /*Read*/\r
+ InputBox_Put_String(cons->input, "Conforming");\r
+ }\r
+ } else{ /*data*/\r
+ InputBox_Put_String(cons->input, "Data Read");\r
+ if((ar & 0x02) != 0){ /*Read*/\r
+ InputBox_Put_String(cons->input, "/Write ");\r
+ } else{\r
+ InputBox_Put_String(cons->input, " Only ");\r
+ }\r
+ if((ar & 0x04) != 0){ /*Read*/\r
+ InputBox_Put_String(cons->input, "Expand Down");\r
+ }\r
+ }\r
+ } else{ /*SystemDescriptor*/\r
+ if((ar & 0x0f) == 0x02){ /*LDT*/\r
+ InputBox_Put_String(cons->input, "LDT");\r
+ } else if((ar & 0x0f) == 0x05){ /*TaskGate*/\r
+ InputBox_Put_String(cons->input, "TaskGate");\r
+ } else{\r
+ if((ar & 0x07) == 0x01){\r
+ InputBox_Put_String(cons->input, "TSS-Ready");\r
+ } else if((ar & 0x07) == 0x03){\r
+ InputBox_Put_String(cons->input, "TSS-Busy");\r
+ } else if((ar & 0x07) == 0x04){\r
+ InputBox_Put_String(cons->input, "CallGate");\r
+ } else if((ar & 0x07) == 0x06){\r
+ InputBox_Put_String(cons->input, "INTGate");\r
+ } else if((ar & 0x07) == 0x07){\r
+ InputBox_Put_String(cons->input, "TrapGate");\r
+ }\r
+ if((ar & 0x08) != 0){ /*32bit*/\r
+ InputBox_Put_String(cons->input, "(32bit)");\r
+ } else{ /*16bit*/\r
+ InputBox_Put_String(cons->input, "(16bit)");\r
+ }\r
+ }\r
+ }\r
+ InputBox_Put_String(cons->input, "\n");\r
+ }\r
+ }\r
+}\r
+\r
+void Console_Command_midi(UI_Console *cons, const uchar filename[])\r
+{\r
+ IO_File file;\r
+ int n;\r
+ uint p, q, tracksize, r, datalength, delta;\r
+ uchar s[128];\r
+ uint DeltaTimePerQuarterNote, microsTimePerQuarterNote, microsTimePerDeltaTime;\r
+\r
+ DeltaTimePerQuarterNote = 480;\r
+ microsTimePerQuarterNote = 500000;\r
+ microsTimePerDeltaTime = microsTimePerQuarterNote / DeltaTimePerQuarterNote;\r
+ \r
+ n = FloppyDisk_Search_File(sysdata->fd_boot, filename);\r
+ if(n != -1){\r
+ n = FloppyDisk_Load_File(sysdata->fd_boot, &file, n);\r
+ if(n != -1){\r
+ p = 0;\r
+ if(strncmp(&file.data[p + 0], "MThd", 4) == 0){\r
+ p += 4;\r
+ p += 4;\r
+\r
+ sprintf(s, "SMF Format%d ", (file.data[p + 0] << 8) | file.data[p + 1]);\r
+ InputBox_Put_String(cons->input, s);\r
+ p += 2;\r
+\r
+ sprintf(s, "Tracks:%d\n", (file.data[p + 0] << 8) | file.data[p + 1]);\r
+ InputBox_Put_String(cons->input, s);\r
+ p += 2;\r
+\r
+ DeltaTimePerQuarterNote = (file.data[p + 0] << 8) | file.data[p + 1];\r
+ microsTimePerDeltaTime = microsTimePerQuarterNote / DeltaTimePerQuarterNote;\r
+ sprintf(s, "DeltaTime(per quarter note):%d\n", DeltaTimePerQuarterNote);\r
+ InputBox_Put_String(cons->input, s);\r
+ p += 2;\r
+\r
+ for(; p < file.size; ){\r
+ if(strncmp(&file.data[p + 0], "MTrk", 4) == 0){\r
+ InputBox_Put_String(cons->input, "Track:\n");\r
+ p += 4;\r
+\r
+ tracksize = (file.data[p + 0] << 24) | (file.data[p + 1] << 16) | (file.data[p + 2] << 8) | file.data[p + 3];\r
+ sprintf(s, "\tsize:0x%X\n", tracksize);\r
+ InputBox_Put_String(cons->input, s);\r
+ p += 4;\r
+\r
+ for(q = 0; q < tracksize; ){\r
+ delta = Console_Command_midi_Convert_VariableLengthValue(&file.data[p + 0], &q);\r
+ sprintf(s, "\t%8d:", delta);\r
+ InputBox_Put_String(cons->input, s);\r
+\r
+ IO_Wait(microsTimePerDeltaTime * delta);\r
+\r
+ if(file.data[p + q + 0] == 0xff){\r
+ InputBox_Put_String(cons->input, "Meta ");\r
+ q++;\r
+ r = file.data[p + q + 0];\r
+ q++;\r
+ datalength = Console_Command_midi_Convert_VariableLengthValue(&file.data[p + 0], &q);\r
+ if(r == 0x00){ //\83V\81[\83P\83\93\83X\94Ô\8d\86\r
+ sprintf(s, "SequenceNumber size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x01){ //\83e\83L\83X\83g\r
+ sprintf(s, "TEXT size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x02){ //\92\98\8dì\8c \95\\8e¦\r
+ sprintf(s, "Copyright size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x03){ //\83g\83\89\83b\83N\96¼\r
+ sprintf(s, "TrackName size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x04){ //\8ay\8aí\96¼\r
+ sprintf(s, "InstrumentName size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x05){ //\89Ì\8e\8c\r
+ sprintf(s, "Lyrics size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x06){ //\83}\81[\83J\81[\r
+ sprintf(s, "Marker size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x07){ //\83L\83\85\81[\83|\83C\83\93\83g\r
+ sprintf(s, "QueuePoint size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x08){ //\89¹\90F\81i\83v\83\8d\83O\83\89\83\80\81j\96¼\r
+ sprintf(s, "ProgramName size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x09){ //\89¹\8c¹\81i\83f\83o\83C\83X\81j\96¼\r
+ sprintf(s, "DeviceName size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x20){ //MIDI\83`\83\83\83\93\83l\83\8b\83v\83\8a\83t\83B\83b\83N\83X\r
+ sprintf(s, "MIDIChannelPrefix size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x21){ //\83|\81[\83g\8ew\92è\r
+ sprintf(s, "OutPutPort size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x2f){ //End of Track\r
+ sprintf(s, "End of Track size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x51){ //\83e\83\93\83|\90Ý\92è\81i4\95ª\89¹\95\84\82 \82½\82è\82Ì\83}\83C\83N\83\8d\95b\81j\r
+ microsTimePerQuarterNote = (file.data[p + q + 0] << 16) | (file.data[p + q + 1] << 8) | file.data[p + q + 2];\r
+ sprintf(s, "Tempo %dmicrosec per quarter note.\n", datalength);\r
+ microsTimePerDeltaTime = microsTimePerQuarterNote / DeltaTimePerQuarterNote;\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x54){ //SMPTE\83I\83t\83Z\83b\83g\r
+ sprintf(s, "SMPTE_Offset size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x58){ //\94\8f\8eq\82Ì\90Ý\92è\r
+ sprintf(s, "Beat size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x59){ //\92²\82Ì\90Ý\92è\r
+ sprintf(s, "Tone size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else if(r == 0x7f){ //\83V\81[\83P\83\93\83T\93Á\92è\83\81\83^\83C\83x\83\93\83g\r
+ sprintf(s, "SequencerSpecialMetaEvent size:%d\n", datalength);\r
+ InputBox_Put_String(cons->input, s);\r
+ q += datalength;\r
+ } else{\r
+ InputBox_Put_String(cons->input, "midi:Unknown Meta Event.\n");\r
+ break;\r
+ }\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0x80){ //note off\r
+ sprintf(s, "Note:Off ch:%d note:%d%s\n", (file.data[p + q + 0] & 0x0f), (int)(file.data[p + q + 1] / 12) - 1, MIDI_Notes[file.data[p + q + 1] % 12]);\r
+ InputBox_Put_String(cons->input, s);\r
+ PIT_Beep_Off();\r
+ q += 3;\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0x90){ //note on or off\r
+ if(file.data[p + q + 2] == 0x00){ //note off\r
+ sprintf(s, "Note:Off ch:%d note:%d%s\n", (file.data[p + q + 0] & 0x0f), (int)(file.data[p + q + 1] / 12) - 1, MIDI_Notes[file.data[p + q + 1] % 12]);\r
+ PIT_Beep_Off();\r
+ } else{\r
+ sprintf(s, "Note:On ch:%d note:%d%s vel:%d\n", (file.data[p + q + 0] & 0x0f), (int)(file.data[p + q + 1] / 12) - 1, MIDI_Notes[file.data[p + q + 1] % 12], file.data[p + q + 2]);\r
+ PIT_Beep_On();\r
+ Console_Command_midi_Beep_Set_NoteNumber(file.data[p + q + 1]);\r
+ }\r
+ InputBox_Put_String(cons->input, s);\r
+ q += 3;\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0xa0){ //Polyphonic Key Pressure\r
+ q += 3;\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0xb0){ //Control Change\r
+ q += 3;\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0xc0){ //Program Change\r
+ q += 2;\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0xd0){ //Channel Pressure\r
+ q += 2;\r
+ } else if((file.data[p + q + 0] & 0xf0) == 0xe0){ //Pitch Bend\r
+ q += 3;\r
+ } else{\r
+ break;\r
+ }\r
+ }\r
+ PIT_Beep_Off();\r
+ p += tracksize;\r
+ } else{\r
+ InputBox_Put_String(cons->input, "midi:Unknown Track.\n");\r
+ }\r
+ } \r
+ } else{\r
+ InputBox_Put_String(cons->input, "midi:Unknown header.\n");\r
+ }\r
+ } else{\r
+ InputBox_Put_String(cons->input, "midi:File load error.\n");\r
+ }\r
+ File_Free(&file);\r
+ } else{\r
+ InputBox_Put_String(cons->input, "midi:File not found.\n");\r
+ }\r
+\r
+ return;\r
+}\r
+\r
+uint Console_Command_midi_Convert_VariableLengthValue(uchar *base, uint *offset)\r
+{\r
+ uint i, r;\r
+\r
+ r = 0;\r
+\r
+ for(i = 0; i < 4; i++){\r
+ r = r << 7;\r
+ r += (base[*offset + i] & 0x7f);\r
+ if((base[*offset + i] & 0x80) == 0){\r
+ i++;\r
+ break;\r
+ }\r
+ }\r
+\r
+ *offset += i;\r
+\r
+ return r;\r
+}\r
+\r
+void Console_Command_midi_Beep_Set_NoteNumber(uchar n)\r
+{\r
+ uint fq, oct;\r
+\r
+ fq = 0;\r
+ oct = 0;\r
+\r
+ fq = ToneTable[n % 12];\r
+ oct = n / 12;\r
+\r
+ if(n > 71){ //4\83I\83N\83^\81[\83u\82æ\82è\8fã\r
+ oct = oct - 5;\r
+ fq = fq << oct;\r
+ } else if(n < 60){ //4\83I\83N\83^\81[\83u\82æ\82è\89º\r
+ oct = 5 - oct;\r
+ fq = fq >> oct;\r
+ }\r
+\r
+ PIT_Beep_Set(fq);\r
+\r
+ return;\r
+}\r
+\r
+void Console_Execute(UI_Console *cons)\r
+{\r
+ int n;\r
+ uchar *ext, appname[11];\r
+ uint i;\r
+\r
+ ext = 0;\r
+ for(i = 0; cons->input->input_buf[i] != 0x00; i++){\r
+ if(cons->input->input_buf[i] == '.'){\r
+ ext = &cons->input->input_buf[i];\r
+ }\r
+ }\r
+\r
+ n = FloppyDisk_Search_File(sysdata->fd_boot, cons->input->input_buf);\r
+ if(n != -1){\r
+ if(ext != 0){\r
+ if(strcmp(ext, ".chn") == 0){\r
+ Console_Execute_CHNOSProject(cons, n);\r
+ } else if(strcmp(ext, ".hrb") == 0){\r
+ Console_Execute_haribote(cons, n);\r
+ } else{\r
+ InputBox_Put_String(cons->input, "Console:Unknown file type.\n");\r
+ }\r
+ } else{\r
+ InputBox_Put_String(cons->input, "Console:Unknown file type.\n");\r
+ }\r
+ } else{\r
+ if(ext == 0){ /*\83t\83@\83C\83\8b\82ª\91¶\8dÝ\82¹\82¸\81A\82©\82Â\8ag\92£\8eq\82ª\82È\82©\82Á\82½\8fê\8d\87\81A.chn\82Å\82 \82é\82Æ\89¼\92è\82·\82é\81B*/\r
+ sprintf(appname, " .CHN");\r
+ for(i = 0; i < 8; i++){\r
+ if(cons->input->input_buf[i] == 0x00){\r
+ break;\r
+ }\r
+ appname[i] = cons->input->input_buf[i];\r
+ }\r
+ }\r
+ n = FloppyDisk_Search_File(sysdata->fd_boot, appname);\r
+ if(n != -1){\r
+ Console_Execute_CHNOSProject(cons, n);\r
+ } else{\r
+ InputBox_Put_String(cons->input, "Console:No such File or Application.\n");\r
+ }\r
+ }\r
+ return;\r
+}\r
+\r
+void Console_Execute_CHNOSProject(UI_Console *cons, int n)\r
+{\r
+ UI_Task *mytask;\r
+\r
+ mytask = MultiTask_Get_NowTask();\r
+ n = FloppyDisk_Load_File(sysdata->fd_boot, &cons->app_codefile, n);\r
+ if(n != -1){\r
+ cons->app_cs = System_SegmentDescriptor_Set(cons->app_codefile.size - 1, (uint)cons->app_codefile.data, AR_CODE32_ER | AR_USER);\r
+ cons->app_ds = System_SegmentDescriptor_Set(64 * 1024 - 1, (uint)MemoryBlock_Allocate_System(64 * 1024), AR_DATA32_RW | AR_USER);\r
+ if(cons->app_codefile.size >= 8 && strncmp(cons->app_codefile.data + 4, "CHNP", 4) == 0){\r
+ cons->app_codefile.data[0] = 0xe8;\r
+ cons->app_codefile.data[1] = 0x16;\r
+ cons->app_codefile.data[2] = 0x00;\r
+ cons->app_codefile.data[3] = 0x00;\r
+ cons->app_codefile.data[4] = 0x00;\r
+ cons->app_codefile.data[5] = 0xcb;\r
+ }\r
+ APP_Run(0, cons->app_cs << 3, System_SegmentDescriptor_Get_Limit(cons->app_ds) + 1, cons->app_ds << 3, &(mytask->tss.esp0));\r
+ System_SegmentDescriptor_Set_Absolute(cons->app_ds, 0, 0, 0);\r
+ cons->app_ds = 0;\r
+ MemoryBlock_Free((void *)System_SegmentDescriptor_Get_Base(cons->app_ds));\r
+ System_SegmentDescriptor_Set_Absolute(cons->app_cs, 0, 0, 0);\r
+ cons->app_cs = 0;\r
+ } else{\r
+ InputBox_Put_String(cons->input, "Console:Execute.chn:File load error.\n");\r
+ }\r
+ File_Free(&cons->app_codefile);\r
+ return;\r
+}\r
+\r
+void Console_Execute_haribote(UI_Console *cons, int n)\r
+{\r
+ n = FloppyDisk_Load_File(sysdata->fd_boot, &cons->app_codefile, n);\r
+ if(n != -1){\r
+ cons->app_cs = System_SegmentDescriptor_Set(cons->app_codefile.size - 1, (uint)cons->app_codefile.data, AR_CODE32_ER);\r
+ if(cons->app_codefile.size >= 8 && strncmp(cons->app_codefile.data + 4, "Hari", 4) == 0){\r
+ cons->app_codefile.data[0] = 0xe8;\r
+ cons->app_codefile.data[1] = 0x16;\r
+ cons->app_codefile.data[2] = 0x00;\r
+ cons->app_codefile.data[3] = 0x00;\r
+ cons->app_codefile.data[4] = 0x00;\r
+ cons->app_codefile.data[5] = 0xcb;\r
+ }\r
+ FarCall(0, cons->app_cs << 3);\r
+ System_SegmentDescriptor_Set_Absolute(cons->app_cs, 0, 0, 0);\r
+ cons->app_cs = 0;\r
+ } else{\r
+ InputBox_Put_String(cons->input, "Console:Execute.hrb:File load error.\n");\r
+ }\r
+ File_Free(&cons->app_codefile);\r
+ return;\r
+}\r