OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / display.c
1 \r
2 #include "core.h"\r
3 \r
4 //VBE\82ª\8eg\82¦\82é\82Ì\82Í\81Actrl->display_mode == DISPLAYMODE_VBE_LINEAR\82Ì\8e\9e\82¾\82¯\81B\r
5 \r
6 #define SIGNAL_BIOS_OPERATION_END       0xff\r
7 \r
8 IO_DisplayControl *Initialize_Display(void)\r
9 {\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
11 \r
12         IO_CallBIOSControl *callbiosctrl;\r
13         INFO_VBE_BIOS *info_vbe_bios;\r
14         uint data;\r
15         IO_DisplayControl *ctrl;\r
16         uint i;\r
17         INFO_VBE_VideoMode *info_vbe_vmode;\r
18 \r
19         ctrl = (IO_DisplayControl *)System_Memory_Allocate(sizeof(IO_DisplayControl));\r
20 \r
21         ctrl->bios_signal = System_FIFO32_Initialize(64);\r
22 \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
26 \r
27         for(;;){\r
28                 if(FIFO32_Status(ctrl->bios_signal) == 0){\r
29 \r
30                 } else{\r
31                         data = FIFO32_Get(ctrl->bios_signal);\r
32                         if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
33                                 break;\r
34                         }\r
35                 }\r
36         }\r
37 \r
38         ctrl->vmode = 0x0000;\r
39         ctrl->vmode_index = 0;\r
40         ctrl->bpp = 8;\r
41         ctrl->xsize = VGA08_VRAM_XSIZE;\r
42         ctrl->ysize = VGA08_VRAM_YSIZE;\r
43         ctrl->vram = VGA_VRAM_ADR;\r
44 \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
51 \r
52         //\8e\9f\82É\81AVBE\82ÌBIOS\8fî\95ñ\82ð\93¾\82é\81B\r
53 \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
58 \r
59         for(;;){\r
60                 if(FIFO32_Status(ctrl->bios_signal) == 0){\r
61 \r
62                 } else{\r
63                         data = FIFO32_Get(ctrl->bios_signal);\r
64                         if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
65                                 break;\r
66                         }\r
67                 }\r
68         }\r
69 \r
70         info_vbe_bios = VBE_REALMODE_RETVALUE_ADDRESS;\r
71 \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
81                 } else{\r
82                         ctrl->display_mode = DISPLAYMODE_VBE_WINDOW;\r
83                 }\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
87                 #endif\r
88         } else{\r
89                 ctrl->display_mode = DISPLAYMODE_BIOS;\r
90         }\r
91 \r
92         if(ctrl->display_mode == DISPLAYMODE_VBE_LINEAR){\r
93                 #ifdef CHNOSPROJECT_DEBUG_DISPLAY\r
94                         debug("Display:Getting Video Modes...\n");\r
95                 #endif\r
96                 for(i = 0; ctrl->VBE.vmode_args[i] != 0xffff; i++){\r
97 \r
98                 }\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
104                 #endif\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
111 \r
112                         for(;;){\r
113                                 if(FIFO32_Status(ctrl->bios_signal) == 0){\r
114 \r
115                                 } else{\r
116                                         data = FIFO32_Get(ctrl->bios_signal);\r
117                                         if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
118                                                 break;\r
119                                         }\r
120                                 }\r
121                         }\r
122 \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
135                                         }\r
136                                         if(ctrl->VBE.list_vmode[i].memory_model == 0x06){\r
137                                                 debug(" direct-color");\r
138                                         }\r
139                                         if((ctrl->VBE.list_vmode[i].attribute & (1 << 3)) != 0){\r
140                                                 debug(" color");\r
141                                         } else{\r
142                                                 debug(" monochrome");\r
143                                         }\r
144                                         if((ctrl->VBE.list_vmode[i].attribute & (1 << 4)) != 0){\r
145                                                 debug(" graphic");\r
146                                         } else{\r
147                                                 debug(" text");\r
148                                         }\r
149                                         if((ctrl->VBE.list_vmode[i].attribute & (1 << 7)) != 0){\r
150                                                 debug(" linear-access-supported");\r
151                                         }\r
152                                         debug("\n");\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
154 \r
155                                 #endif\r
156                         } else{\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
161                                 #endif\r
162                         }\r
163                 }\r
164 \r
165 \r
166         }\r
167 \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
172         #endif\r
173 \r
174         return ctrl;\r
175 }\r
176 \r
177 uint Display_VESA_Set_VideoMode(IO_DisplayControl *ctrl, uint index)\r
178 {\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
186 \r
187         IO_CallBIOSControl *callbiosctrl;\r
188         uint data;\r
189 \r
190         callbiosctrl = System_CallBIOS_Get_Controller();\r
191 \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
195                 #endif\r
196                 return 2;\r
197         }\r
198 \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
202                 #endif\r
203                 return 3;\r
204         }\r
205 \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
209                 #endif\r
210                 return 4;\r
211         }\r
212 \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
216                 #endif\r
217                 return 5;\r
218         }\r
219 \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
223                 #endif\r
224                 return 6;\r
225         }\r
226 \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
230 \r
231         for(;;){\r
232                 if(FIFO32_Status(ctrl->bios_signal) == 0){\r
233 \r
234                 } else{\r
235                         data = FIFO32_Get(ctrl->bios_signal);\r
236                         if(data == SIGNAL_BIOS_OPERATION_END || data == SIGNAL_BIOS_OPERATION_END + 1){\r
237                                 break;\r
238                         }\r
239                 }\r
240         }\r
241 \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
253                         }\r
254                         if(ctrl->VBE.list_vmode[index].memory_model == 0x06){\r
255                                 debug(" direct-color");\r
256                         }\r
257                         if((ctrl->VBE.list_vmode[index].attribute & (1 << 3)) != 0){\r
258                                 debug(" color");\r
259                         } else{\r
260                                 debug(" monochrome");\r
261                         }\r
262                         if((ctrl->VBE.list_vmode[index].attribute & (1 << 4)) != 0){\r
263                                 debug(" graphic");\r
264                         } else{\r
265                                 debug(" text");\r
266                         }\r
267                         if((ctrl->VBE.list_vmode[index].attribute & (1 << 7)) != 0){\r
268                                 debug(" linear-access-supported");\r
269                         }\r
270                         debug("\n");\r
271                 #endif\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
276                 return 0;\r
277         }\r
278 \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
281         #endif\r
282 \r
283         return 1;\r
284 }\r