4 //VBE
\82ª
\8eg
\82¦
\82é
\82Ì
\82Í
\81Actrl->display_mode == DISPLAYMODE_VBE_LINEAR
\82Ì
\8e\9e\82¾
\82¯
\81B
\r
6 #define SIGNAL_BIOS_OPERATION_END 0xff
\r
8 IO_DisplayControl *Initialize_Display(void)
\r
10 //
\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
12 IO_CallBIOSControl *callbiosctrl;
\r
13 INFO_VBE_BIOS *info_vbe_bios;
\r
15 IO_DisplayControl *ctrl;
\r
17 INFO_VBE_VideoMode *info_vbe_vmode;
\r
19 ctrl = (IO_DisplayControl *)System_Memory_Allocate(sizeof(IO_DisplayControl));
\r
21 ctrl->bios_signal = System_FIFO32_Initialize(64);
\r
23 callbiosctrl = System_CallBIOS_Get_Controller();
\r
24 callbiosctrl->CallBIOS_Task->tss->eax = 0x0013;
\r
25 System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);
\r
28 if(FIFO32_Status(ctrl->bios_signal) == 0){
\r
31 data = FIFO32_Get(ctrl->bios_signal);
\r
32 if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){
\r
38 ctrl->vmode = 0x0000;
\r
39 ctrl->vmode_index = 0;
\r
41 ctrl->xsize = VGA08_VRAM_XSIZE;
\r
42 ctrl->ysize = VGA08_VRAM_YSIZE;
\r
43 ctrl->vram = VGA_VRAM_ADR;
\r
45 Drawing08_Initialize_Palette();
\r
46 Initialize_Drawing();
\r
47 Error_Set_Enable_Display_TextMode(False);
\r
48 Error_Set_Enable_Display_GraphicMode(True, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);
\r
49 ctrl->vramsheet = Sheet_Initialize();
\r
50 Sheet_SetBuffer(ctrl->vramsheet, ctrl->vram, ctrl->xsize, ctrl->ysize, ctrl->bpp);
\r
52 //
\8e\9f\82É
\81AVBE
\82ÌBIOS
\8fî
\95ñ
\82ð
\93¾
\82é
\81B
\r
54 callbiosctrl->CallBIOS_Task->tss->eax = 0x4f00;
\r
55 callbiosctrl->CallBIOS_Task->tss->es = 0x0000;
\r
56 callbiosctrl->CallBIOS_Task->tss->edi = 0x0e00;
\r
57 System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);
\r
60 if(FIFO32_Status(ctrl->bios_signal) == 0){
\r
63 data = FIFO32_Get(ctrl->bios_signal);
\r
64 if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){
\r
70 info_vbe_bios = VBE_REALMODE_RETVALUE_ADDRESS;
\r
72 if(data == SIGNAL_BIOS_OPERATION_END && (callbiosctrl->retvalue.eax & 0x000000ff) == 0x4f && (callbiosctrl->retvalue.eax & 0x0000ff00) == 0x00){
\r
73 ctrl->VBE.version_minor = info_vbe_bios->ver_minor;
\r
74 ctrl->VBE.version_major = info_vbe_bios->ver_major;
\r
75 ctrl->VBE.vram_supported_size_kb = info_vbe_bios->vram_supported_size_kb;
\r
76 ctrl->VBE.flags = (info_vbe_bios->flags[1] << 8) | info_vbe_bios->flags[0];
\r
77 ctrl->VBE.oem_string = (uchar *)(info_vbe_bios->oem_string_segment << 4 | info_vbe_bios->oem_string_offset);
\r
78 ctrl->VBE.vmode_args = (ushort *)(info_vbe_bios->vmode_args_segment << 4 | info_vbe_bios->vmode_args_offset);
\r
79 if(ctrl->VBE.version_major >= 0x02){
\r
80 ctrl->display_mode = DISPLAYMODE_VBE_LINEAR;
\r
82 ctrl->display_mode = DISPLAYMODE_VBE_WINDOW;
\r
84 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
85 debug("Display:VBE is Enbaled(Version %d.%d).\n", ctrl->VBE.version_major, ctrl->VBE.version_minor);
\r
86 debug("Display:OEM:[%s]\n", ctrl->VBE.oem_string);
\r
89 ctrl->display_mode = DISPLAYMODE_BIOS;
\r
92 if(ctrl->display_mode == DISPLAYMODE_VBE_LINEAR){
\r
93 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
94 debug("Display:Getting Video Modes...\n");
\r
96 for(i = 0; ctrl->VBE.vmode_args[i] != 0xffff; i++){
\r
99 ctrl->VBE.list_vmode_tags = i;
\r
100 ctrl->VBE.list_vmode = (INFO_VBE_VideoModeTag *)System_Memory_Allocate(sizeof(INFO_VBE_VideoModeTag) * ctrl->VBE.list_vmode_tags);
\r
101 info_vbe_vmode = VBE_REALMODE_RETVALUE_ADDRESS;
\r
102 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
103 debug("Display:VBE has %d Video Modes.\n", ctrl->VBE.list_vmode_tags);
\r
105 for(i = 0; i < ctrl->VBE.list_vmode_tags; i++){
\r
106 callbiosctrl->CallBIOS_Task->tss->eax = 0x4f01;
\r
107 callbiosctrl->CallBIOS_Task->tss->es = 0x0000;
\r
108 callbiosctrl->CallBIOS_Task->tss->edi = 0x0e00;
\r
109 callbiosctrl->CallBIOS_Task->tss->ecx = ctrl->VBE.vmode_args[i];
\r
110 System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);
\r
113 if(FIFO32_Status(ctrl->bios_signal) == 0){
\r
116 data = FIFO32_Get(ctrl->bios_signal);
\r
117 if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){
\r
123 if(data == SIGNAL_BIOS_OPERATION_END && (callbiosctrl->retvalue.eax & 0x000000ff) == 0x4f && (callbiosctrl->retvalue.eax & 0x0000ff00) == 0x00){
\r
124 ctrl->VBE.list_vmode[i].mode_number = ctrl->VBE.vmode_args[i];
\r
125 ctrl->VBE.list_vmode[i].xsize = info_vbe_vmode->XResolution;
\r
126 ctrl->VBE.list_vmode[i].ysize = info_vbe_vmode->YResolution;
\r
127 ctrl->VBE.list_vmode[i].bpp = info_vbe_vmode->BitsPerPixel;
\r
128 ctrl->VBE.list_vmode[i].memory_model = info_vbe_vmode->MemoryModel;
\r
129 ctrl->VBE.list_vmode[i].attribute = info_vbe_vmode->ModeAttributes;
\r
130 ctrl->VBE.list_vmode[i].vram = info_vbe_vmode->PhysBasePtr;
\r
131 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
132 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
133 if(ctrl->VBE.list_vmode[i].memory_model == 0x04){
\r
134 debug(" 256-palette");
\r
136 if(ctrl->VBE.list_vmode[i].memory_model == 0x06){
\r
137 debug(" direct-color");
\r
139 if((ctrl->VBE.list_vmode[i].attribute & (1 << 3)) != 0){
\r
142 debug(" monochrome");
\r
144 if((ctrl->VBE.list_vmode[i].attribute & (1 << 4)) != 0){
\r
149 if((ctrl->VBE.list_vmode[i].attribute & (1 << 7)) != 0){
\r
150 debug(" linear-access-supported");
\r
153 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
157 ctrl->VBE.list_vmode[i].mode_number = ctrl->VBE.vmode_args[i];
\r
158 ctrl->VBE.list_vmode[i].vram = (void *)0x00000000;
\r
159 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
160 debug("Display:%d:0x%X Function Failed.\n", i, ctrl->VBE.list_vmode[i].mode_number);
\r
168 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
169 debug("Display:Ctrl:[0x%X]\n", ctrl);
\r
170 debug("Display:ctrl->VBE.list_vmode[0]:[0x%X]\n", &ctrl->VBE.list_vmode[0]);
\r
171 debug("Display:ctrl->bios_signal->buf:[0x%X]\n", ctrl->bios_signal->buf);
\r
177 uint Display_VESA_Set_VideoMode(IO_DisplayControl *ctrl, uint index)
\r
179 //retvalue:0 =
\90Ø
\82è
\91Ö
\82¦
\90¬
\8c÷
\r
180 //retvalue:1 =
\90Ø
\82è
\91Ö
\82¦
\8e¸
\94s(BIOS Call Error)
\r
181 //retvalue:2 =
\90Ø
\82è
\91Ö
\82¦
\8e¸
\94s(VBE
\96³
\8cø version < 2.0)
\r
182 //retvalue:3 =
\90Ø
\82è
\91Ö
\82¦
\8e¸
\94s(Invalid VideoMode Index)
\r
183 //retvalue:4 =
\90Ø
\82è
\91Ö
\82¦
\8e¸
\94s(Linear Mode Not Supported)
\r
184 //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
185 //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
187 IO_CallBIOSControl *callbiosctrl;
\r
190 callbiosctrl = System_CallBIOS_Get_Controller();
\r
192 if(ctrl->display_mode != DISPLAYMODE_VBE_LINEAR){
\r
193 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
194 debug("SetVideo:Error:VBE version < 2.0.\n");
\r
199 if(index >= ctrl->VBE.list_vmode_tags){
\r
200 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
201 debug("SetVideo:Error:Invalid VideoMode Index.\n");
\r
206 if((ctrl->VBE.list_vmode[index].attribute & (1 << 7)) == 0){
\r
207 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
208 debug("SetVideo:Error:This VideoMode is Not Supported Linear Mode.\n");
\r
213 if(!(ctrl->VBE.list_vmode[index].bpp == 8 || ctrl->VBE.list_vmode[index].bpp == 16 || ctrl->VBE.list_vmode[index].bpp == 32)){
\r
214 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
215 debug("SetVideo:Error:This VideoMode's BitsPerPixel is Not Supported in CHNOSProject.\n");
\r
220 if(ctrl->VBE.list_vmode[index].vram == 0x00000000){
\r
221 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
222 debug("SetVideo:Error:This VideoMode has been Marked Invalid(vram==null).\n");
\r
227 callbiosctrl->CallBIOS_Task->tss->eax = 0x4f02;
\r
228 callbiosctrl->CallBIOS_Task->tss->ebx = ctrl->VBE.list_vmode[index].mode_number | VESA_LINEAR_ACCESS;
\r
229 System_CallBIOS_Execute(0x10, ctrl->bios_signal, SIGNAL_BIOS_OPERATION_END);
\r
232 if(FIFO32_Status(ctrl->bios_signal) == 0){
\r
235 data = FIFO32_Get(ctrl->bios_signal);
\r
236 if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){
\r
242 if(data == SIGNAL_BIOS_OPERATION_END && (callbiosctrl->retvalue.eax & 0x000000ff) == 0x4f && (callbiosctrl->retvalue.eax & 0x0000ff00) == 0x00){
\r
243 ctrl->vmode = ctrl->VBE.list_vmode[index].mode_number;
\r
244 ctrl->vmode_index = index;
\r
245 ctrl->bpp = ctrl->VBE.list_vmode[index].bpp;
\r
246 ctrl->xsize = ctrl->VBE.list_vmode[index].xsize;
\r
247 ctrl->ysize = ctrl->VBE.list_vmode[index].ysize;
\r
248 ctrl->vram = ctrl->VBE.list_vmode[index].vram;
\r
249 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
250 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
251 if(ctrl->VBE.list_vmode[index].memory_model == 0x04){
\r
252 debug(" 256-palette");
\r
254 if(ctrl->VBE.list_vmode[index].memory_model == 0x06){
\r
255 debug(" direct-color");
\r
257 if((ctrl->VBE.list_vmode[index].attribute & (1 << 3)) != 0){
\r
260 debug(" monochrome");
\r
262 if((ctrl->VBE.list_vmode[index].attribute & (1 << 4)) != 0){
\r
267 if((ctrl->VBE.list_vmode[index].attribute & (1 << 7)) != 0){
\r
268 debug(" linear-access-supported");
\r
272 Initialize_Drawing();
\r
273 Error_Set_Enable_Display_GraphicMode(True, ctrl->vram, ctrl->xsize, ctrl->ysize >> 4);
\r
274 Sheet_SetBuffer(ctrl->vramsheet, ctrl->vram, ctrl->xsize, ctrl->ysize, ctrl->bpp);
\r
275 System_TaskControlMessage_Send_AllTask(TCM_OFFSET + TCM_INFO_DISPLAY_UPDATE_RESOLUTION);
\r
279 #ifdef CHNOSPROJECT_DEBUG_DISPLAY
\r
280 debug("Display:%d:0x%X Function Failed.\n", index, ctrl->VBE.list_vmode[index].mode_number);
\r