--- /dev/null
+\r
+#include "core.h"\r
+\r
+//VBE\82ª\8eg\82¦\82é\82Ì\82Í\81Actrl->display_mode == DISPLAYMODE_VBE_LINEAR\82Ì\8e\9e\82¾\82¯\81B\r
+\r
+#define SIGNAL_BIOS_OPERATION_END 0xff\r
+\r
+IO_DisplayControl *Initialize_Display(void)\r
+{\r
+ //\8dÅ\8f\89\82É\8c»\8dÝ\82Ì\89æ\96Ê\83\82\81[\83h\82ðVGA320*200-8bit\82É\90Ý\92è\82·\82é\81B(BIOS)\r
+\r
+ IO_CallBIOSControl *callbiosctrl;\r
+ INFO_VBE_BIOS *info_vbe_bios;\r
+ uint data;\r
+ IO_DisplayControl *ctrl;\r
+ uint i;\r
+ INFO_VBE_VideoMode *info_vbe_vmode;\r
+\r
+ ctrl = (IO_DisplayControl *)System_Memory_Allocate(sizeof(IO_DisplayControl));\r
+\r
+ ctrl->bios_signal = System_FIFO32_Initialize(64);\r
+\r
+ callbiosctrl = System_CallBIOS_Get_Controller();\r
+ callbiosctrl->CallBIOS_Task->tss->eax = 0x0013;\r
+ System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);\r
+\r
+ for(;;){\r
+ if(FIFO32_Status(ctrl->bios_signal) == 0){\r
+\r
+ } else{\r
+ data = FIFO32_Get(ctrl->bios_signal);\r
+ if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ ctrl->vmode = 0x0000;\r
+ ctrl->vmode_index = 0;\r
+ ctrl->bpp = 8;\r
+ ctrl->xsize = VGA08_VRAM_XSIZE;\r
+ ctrl->ysize = VGA08_VRAM_YSIZE;\r
+ ctrl->vram = VGA_VRAM_ADR;\r
+\r
+ Drawing08_Initialize_Palette();\r
+ Initialize_Drawing();\r
+ Error_Set_Enable_Display_TextMode(False);\r
+ Error_Set_Enable_Display_GraphicMode(True, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);\r
+ ctrl->vramsheet = Sheet_Initialize();\r
+ Sheet_SetBuffer(ctrl->vramsheet, ctrl->vram, ctrl->xsize, ctrl->ysize, ctrl->bpp);\r
+\r
+ //\8e\9f\82É\81AVBE\82ÌBIOS\8fî\95ñ\82ð\93¾\82é\81B\r
+\r
+ callbiosctrl->CallBIOS_Task->tss->eax = 0x4f00;\r
+ callbiosctrl->CallBIOS_Task->tss->es = 0x0000;\r
+ callbiosctrl->CallBIOS_Task->tss->edi = 0x0e00;\r
+ System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);\r
+\r
+ for(;;){\r
+ if(FIFO32_Status(ctrl->bios_signal) == 0){\r
+\r
+ } else{\r
+ data = FIFO32_Get(ctrl->bios_signal);\r
+ if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ info_vbe_bios = VBE_REALMODE_RETVALUE_ADDRESS;\r
+\r
+ if(data == SIGNAL_BIOS_OPERATION_END && (callbiosctrl->retvalue.eax & 0x000000ff) == 0x4f && (callbiosctrl->retvalue.eax & 0x0000ff00) == 0x00){\r
+ ctrl->VBE.version_minor = info_vbe_bios->ver_minor;\r
+ ctrl->VBE.version_major = info_vbe_bios->ver_major;\r
+ ctrl->VBE.vram_supported_size_kb = info_vbe_bios->vram_supported_size_kb;\r
+ ctrl->VBE.flags = (info_vbe_bios->flags[1] << 8) | info_vbe_bios->flags[0];\r
+ ctrl->VBE.oem_string = (uchar *)(info_vbe_bios->oem_string_segment << 4 | info_vbe_bios->oem_string_offset);\r
+ ctrl->VBE.vmode_args = (ushort *)(info_vbe_bios->vmode_args_segment << 4 | info_vbe_bios->vmode_args_offset);\r
+ if(ctrl->VBE.version_major >= 0x02){\r
+ ctrl->display_mode = DISPLAYMODE_VBE_LINEAR;\r
+ } else{\r
+ ctrl->display_mode = DISPLAYMODE_VBE_WINDOW;\r
+ }\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:VBE is Enbaled(Version %d.%d).\n", ctrl->VBE.version_major, ctrl->VBE.version_minor);\r
+ debug("Display:OEM:[%s]\n", ctrl->VBE.oem_string);\r
+ #endif\r
+ } else{\r
+ ctrl->display_mode = DISPLAYMODE_BIOS;\r
+ }\r
+\r
+ if(ctrl->display_mode == DISPLAYMODE_VBE_LINEAR){\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:Getting Video Modes...\n");\r
+ #endif\r
+ for(i = 0; ctrl->VBE.vmode_args[i] != 0xffff; i++){\r
+\r
+ }\r
+ ctrl->VBE.list_vmode_tags = i;\r
+ ctrl->VBE.list_vmode = (INFO_VBE_VideoModeTag *)System_Memory_Allocate(sizeof(INFO_VBE_VideoModeTag) * ctrl->VBE.list_vmode_tags);\r
+ info_vbe_vmode = VBE_REALMODE_RETVALUE_ADDRESS;\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:VBE has %d Video Modes.\n", ctrl->VBE.list_vmode_tags);\r
+ #endif\r
+ for(i = 0; i < ctrl->VBE.list_vmode_tags; i++){\r
+ callbiosctrl->CallBIOS_Task->tss->eax = 0x4f01;\r
+ callbiosctrl->CallBIOS_Task->tss->es = 0x0000;\r
+ callbiosctrl->CallBIOS_Task->tss->edi = 0x0e00;\r
+ callbiosctrl->CallBIOS_Task->tss->ecx = ctrl->VBE.vmode_args[i];\r
+ System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);\r
+\r
+ for(;;){\r
+ if(FIFO32_Status(ctrl->bios_signal) == 0){\r
+\r
+ } else{\r
+ data = FIFO32_Get(ctrl->bios_signal);\r
+ if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if(data == SIGNAL_BIOS_OPERATION_END && (callbiosctrl->retvalue.eax & 0x000000ff) == 0x4f && (callbiosctrl->retvalue.eax & 0x0000ff00) == 0x00){\r
+ ctrl->VBE.list_vmode[i].mode_number = ctrl->VBE.vmode_args[i];\r
+ ctrl->VBE.list_vmode[i].xsize = info_vbe_vmode->XResolution;\r
+ ctrl->VBE.list_vmode[i].ysize = info_vbe_vmode->YResolution;\r
+ ctrl->VBE.list_vmode[i].bpp = info_vbe_vmode->BitsPerPixel;\r
+ ctrl->VBE.list_vmode[i].memory_model = info_vbe_vmode->MemoryModel;\r
+ ctrl->VBE.list_vmode[i].attribute = info_vbe_vmode->ModeAttributes;\r
+ ctrl->VBE.list_vmode[i].vram = info_vbe_vmode->PhysBasePtr;\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:%d:0x%X (%dx%d-%dbit) [0x%X]\nDisplay:", i, ctrl->VBE.list_vmode[i].mode_number, ctrl->VBE.list_vmode[i].xsize, ctrl->VBE.list_vmode[i].ysize, ctrl->VBE.list_vmode[i].bpp, ctrl->VBE.list_vmode[i].vram);\r
+ if(ctrl->VBE.list_vmode[i].memory_model == 0x04){\r
+ debug(" 256-palette");\r
+ }\r
+ if(ctrl->VBE.list_vmode[i].memory_model == 0x06){\r
+ debug(" direct-color");\r
+ }\r
+ if((ctrl->VBE.list_vmode[i].attribute & (1 << 3)) != 0){\r
+ debug(" color");\r
+ } else{\r
+ debug(" monochrome");\r
+ }\r
+ if((ctrl->VBE.list_vmode[i].attribute & (1 << 4)) != 0){\r
+ debug(" graphic");\r
+ } else{\r
+ debug(" text");\r
+ }\r
+ if((ctrl->VBE.list_vmode[i].attribute & (1 << 7)) != 0){\r
+ debug(" linear-access-supported");\r
+ }\r
+ debug("\n");\r
+ debug("%d:0x%X %dx%d-%dbits\n", 0, ctrl->VBE.list_vmode[0].mode_number, ctrl->VBE.list_vmode[0].xsize, ctrl->VBE.list_vmode[0].ysize, ctrl->VBE.list_vmode[0].bpp);\r
+\r
+ #endif\r
+ } else{\r
+ ctrl->VBE.list_vmode[i].mode_number = ctrl->VBE.vmode_args[i];\r
+ ctrl->VBE.list_vmode[i].vram = (void *)0x00000000;\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:%d:0x%X Function Failed.\n", i, ctrl->VBE.list_vmode[i].mode_number);\r
+ #endif\r
+ }\r
+ }\r
+\r
+\r
+ }\r
+\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:Ctrl:[0x%X]\n", ctrl);\r
+ debug("Display:ctrl->VBE.list_vmode[0]:[0x%X]\n", &ctrl->VBE.list_vmode[0]);\r
+ debug("Display:ctrl->bios_signal->buf:[0x%X]\n", ctrl->bios_signal->buf);\r
+ #endif\r
+\r
+ return ctrl;\r
+}\r
+\r
+uint Display_VESA_Set_VideoMode(IO_DisplayControl *ctrl, uint index)\r
+{\r
+ //retvalue:0 = \90Ø\82è\91Ö\82¦\90¬\8c÷\r
+ //retvalue:1 = \90Ø\82è\91Ö\82¦\8e¸\94s(BIOS Call Error)\r
+ //retvalue:2 = \90Ø\82è\91Ö\82¦\8e¸\94s(VBE\96³\8cø version < 2.0)\r
+ //retvalue:3 = \90Ø\82è\91Ö\82¦\8e¸\94s(Invalid VideoMode Index)\r
+ //retvalue:4 = \90Ø\82è\91Ö\82¦\8e¸\94s(Linear Mode Not Supported)\r
+ //retvalue:5 = \90Ø\82è\91Ö\82¦\8e¸\94s(\83V\83X\83e\83\80(CHNOSProject)\8fã\82Å\96¢\91Î\89\9e\82Ì\83r\83b\83g\90\94\82Ì\82½\82ß)\r
+ //retvalue:6 = \90Ø\82è\91Ö\82¦\8e¸\94s(\83V\83X\83e\83\80(CHNOSProject)\8fã\82Å\96³\8cø\82Æ\83}\81[\83N\82³\82ê\82Ä\82¢\82é(vram == null)\82½\82ß)\r
+\r
+ IO_CallBIOSControl *callbiosctrl;\r
+ uint data;\r
+\r
+ callbiosctrl = System_CallBIOS_Get_Controller();\r
+\r
+ if(ctrl->display_mode != DISPLAYMODE_VBE_LINEAR){\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("SetVideo:Error:VBE version < 2.0.\n");\r
+ #endif\r
+ return 2;\r
+ }\r
+\r
+ if(index >= ctrl->VBE.list_vmode_tags){\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("SetVideo:Error:Invalid VideoMode Index.\n");\r
+ #endif\r
+ return 3;\r
+ }\r
+\r
+ if((ctrl->VBE.list_vmode[index].attribute & (1 << 7)) == 0){\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("SetVideo:Error:This VideoMode is Not Supported Linear Mode.\n");\r
+ #endif\r
+ return 4;\r
+ }\r
+\r
+ if(!(ctrl->VBE.list_vmode[index].bpp == 8 || ctrl->VBE.list_vmode[index].bpp == 16 || ctrl->VBE.list_vmode[index].bpp == 32)){\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("SetVideo:Error:This VideoMode's BitsPerPixel is Not Supported in CHNOSProject.\n");\r
+ #endif\r
+ return 5;\r
+ }\r
+\r
+ if(ctrl->VBE.list_vmode[index].vram == 0x00000000){\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("SetVideo:Error:This VideoMode has been Marked Invalid(vram==null).\n");\r
+ #endif\r
+ return 6;\r
+ }\r
+\r
+ callbiosctrl->CallBIOS_Task->tss->eax = 0x4f02;\r
+ callbiosctrl->CallBIOS_Task->tss->ebx = ctrl->VBE.list_vmode[index].mode_number | VESA_LINEAR_ACCESS;\r
+ System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);\r
+\r
+ for(;;){\r
+ if(FIFO32_Status(ctrl->bios_signal) == 0){\r
+\r
+ } else{\r
+ data = FIFO32_Get(ctrl->bios_signal);\r
+ if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if(data == SIGNAL_BIOS_OPERATION_END && (callbiosctrl->retvalue.eax & 0x000000ff) == 0x4f && (callbiosctrl->retvalue.eax & 0x0000ff00) == 0x00){\r
+ ctrl->vmode = ctrl->VBE.list_vmode[index].mode_number;\r
+ ctrl->vmode_index = index;\r
+ ctrl->bpp = ctrl->VBE.list_vmode[index].bpp;\r
+ ctrl->xsize = ctrl->VBE.list_vmode[index].xsize;\r
+ ctrl->ysize = ctrl->VBE.list_vmode[index].ysize;\r
+ ctrl->vram = ctrl->VBE.list_vmode[index].vram;\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:VBE VideoMode Changed.\nDisplay:%d:0x%X (%dx%d-%dbit) [0x%X]\nDisplay:", index, ctrl->VBE.list_vmode[index].mode_number, ctrl->VBE.list_vmode[index].xsize, ctrl->VBE.list_vmode[index].ysize, ctrl->VBE.list_vmode[index].bpp, ctrl->VBE.list_vmode[index].vram);\r
+ if(ctrl->VBE.list_vmode[index].memory_model == 0x04){\r
+ debug(" 256-palette");\r
+ }\r
+ if(ctrl->VBE.list_vmode[index].memory_model == 0x06){\r
+ debug(" direct-color");\r
+ }\r
+ if((ctrl->VBE.list_vmode[index].attribute & (1 << 3)) != 0){\r
+ debug(" color");\r
+ } else{\r
+ debug(" monochrome");\r
+ }\r
+ if((ctrl->VBE.list_vmode[index].attribute & (1 << 4)) != 0){\r
+ debug(" graphic");\r
+ } else{\r
+ debug(" text");\r
+ }\r
+ if((ctrl->VBE.list_vmode[index].attribute & (1 << 7)) != 0){\r
+ debug(" linear-access-supported");\r
+ }\r
+ debug("\n");\r
+ #endif\r
+ Initialize_Drawing();\r
+ Error_Set_Enable_Display_GraphicMode(True, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);\r
+ Sheet_SetBuffer(ctrl->vramsheet, ctrl->vram, ctrl->xsize, ctrl->ysize, ctrl->bpp);\r
+ System_TaskControlMessage_Send_AllTask(TCM_OFFSET + TCM_INFO_DISPLAY_UPDATE_RESOLUTION);\r
+ return 0;\r
+ }\r
+\r
+ #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
+ debug("Display:%d:0x%X Function Failed.\n", index, ctrl->VBE.list_vmode[index].mode_number);\r
+ #endif\r
+\r
+ return 1;\r
+}\r