+++ /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