OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / display.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/display.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/display.c
new file mode 100644 (file)
index 0000000..0af1837
--- /dev/null
@@ -0,0 +1,284 @@
+\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