root / pc-bios / vgabios.diff @ 43057ab1
History | View | Annotate | Download (28 kB)
1 |
Index: Makefile
|
---|---|
2 |
===================================================================
|
3 |
RCS file: /sources/vgabios/vgabios/Makefile,v
|
4 |
retrieving revision 1.17
|
5 |
diff -u -w -r1.17 Makefile
|
6 |
--- Makefile 6 Mar 2005 13:06:47 -0000 1.17
|
7 |
+++ Makefile 14 Jun 2006 00:51:06 -0000
|
8 |
@@ -22,7 +22,7 @@
|
9 |
cirrus-bios: vgabios-cirrus.bin vgabios-cirrus.debug.bin |
10 |
|
11 |
clean: |
12 |
- /bin/rm -f biossums *.o *.s *.ld86 \
|
13 |
+ /bin/rm -f biossums vbetables-gen vbetables.h *.o *.s *.ld86 \
|
14 |
temp.awk.* vgabios*.orig _vgabios_* _vgabios-debug_* core vgabios*.bin vgabios*.txt $(RELEASE).bin *.bak |
15 |
|
16 |
dist-clean: clean |
17 |
@@ -79,3 +79,9 @@
|
18 |
|
19 |
biossums: biossums.c |
20 |
$(CC) -o biossums biossums.c |
21 |
+
|
22 |
+vbetables-gen: vbetables-gen.c
|
23 |
+ $(CC) -o vbetables-gen vbetables-gen.c
|
24 |
+
|
25 |
+vbetables.h: vbetables-gen
|
26 |
+ ./vbetables-gen > $@
|
27 |
Index: clext.c
|
28 |
===================================================================
|
29 |
RCS file: /sources/vgabios/vgabios/clext.c,v
|
30 |
retrieving revision 1.10
|
31 |
diff -u -w -r1.10 clext.c
|
32 |
--- clext.c 25 Mar 2006 10:19:15 -0000 1.10
|
33 |
+++ clext.c 14 Jun 2006 00:51:06 -0000
|
34 |
@@ -544,6 +544,13 @@
|
35 |
cirrus_set_video_mode_extended:
|
36 |
call cirrus_switch_mode |
37 |
pop ax ;; mode |
38 |
+ test al, #0x80
|
39 |
+ jnz cirrus_set_video_mode_extended_1
|
40 |
+ push ax
|
41 |
+ mov ax, #0xffff ; set to 0xff to keep win 2K happy
|
42 |
+ call cirrus_clear_vram
|
43 |
+ pop ax
|
44 |
+cirrus_set_video_mode_extended_1:
|
45 |
and al, #0x7f
|
46 |
|
47 |
push ds |
48 |
@@ -1011,6 +1018,13 @@
|
49 |
jnz cirrus_vesa_02h_3 |
50 |
call cirrus_enable_16k_granularity |
51 |
cirrus_vesa_02h_3:
|
52 |
+ test bx, #0x8000 ;; no clear
|
53 |
+ jnz cirrus_vesa_02h_4
|
54 |
+ push ax
|
55 |
+ xor ax,ax
|
56 |
+ call cirrus_clear_vram
|
57 |
+ pop ax
|
58 |
+cirrus_vesa_02h_4:
|
59 |
pop ax |
60 |
push ds |
61 |
#ifdef CIRRUS_VESA3_PMINFO
|
62 |
@@ -1479,6 +1493,38 @@
|
63 |
pop bx |
64 |
ret |
65 |
|
66 |
+cirrus_clear_vram:
|
67 |
+ pusha
|
68 |
+ push es
|
69 |
+ mov si, ax
|
70 |
+
|
71 |
+ call cirrus_enable_16k_granularity
|
72 |
+ call cirrus_extbios_85h
|
73 |
+ shl al, #2
|
74 |
+ mov bl, al
|
75 |
+ xor ah,ah
|
76 |
+cirrus_clear_vram_1:
|
77 |
+ mov al, #0x09
|
78 |
+ mov dx, #0x3ce
|
79 |
+ out dx, ax
|
80 |
+ push ax
|
81 |
+ mov cx, #0xa000
|
82 |
+ mov es, cx
|
83 |
+ xor di, di
|
84 |
+ mov ax, si
|
85 |
+ mov cx, #8192
|
86 |
+ cld
|
87 |
+ rep
|
88 |
+ stosw
|
89 |
+ pop ax
|
90 |
+ inc ah
|
91 |
+ cmp ah, bl
|
92 |
+ jne cirrus_clear_vram_1
|
93 |
+
|
94 |
+ pop es
|
95 |
+ popa
|
96 |
+ ret
|
97 |
+
|
98 |
cirrus_extbios_handlers:
|
99 |
;; 80h
|
100 |
dw cirrus_extbios_80h |
101 |
Index: vbe.c
|
102 |
===================================================================
|
103 |
RCS file: /sources/vgabios/vgabios/vbe.c,v
|
104 |
retrieving revision 1.48
|
105 |
diff -u -w -r1.48 vbe.c
|
106 |
--- vbe.c 26 Dec 2005 19:50:26 -0000 1.48
|
107 |
+++ vbe.c 14 Jun 2006 00:51:07 -0000
|
108 |
@@ -118,21 +118,114 @@
|
109 |
.word VBE_VESA_MODE_END_OF_LIST |
110 |
#endif
|
111 |
|
112 |
+ .align 2
|
113 |
vesa_pm_start:
|
114 |
dw vesa_pm_set_window - vesa_pm_start |
115 |
- dw vesa_pm_set_display_strt - vesa_pm_start
|
116 |
+ dw vesa_pm_set_display_start - vesa_pm_start
|
117 |
dw vesa_pm_unimplemented - vesa_pm_start |
118 |
- dw 0
|
119 |
+ dw vesa_pm_io_ports_table - vesa_pm_start
|
120 |
+vesa_pm_io_ports_table:
|
121 |
+ dw VBE_DISPI_IOPORT_INDEX
|
122 |
+ dw VBE_DISPI_IOPORT_INDEX + 1
|
123 |
+ dw VBE_DISPI_IOPORT_DATA
|
124 |
+ dw VBE_DISPI_IOPORT_DATA + 1
|
125 |
+ dw 0xffff
|
126 |
+ dw 0xffff
|
127 |
|
128 |
USE32 |
129 |
vesa_pm_set_window:
|
130 |
- mov ax, #0x4f05
|
131 |
- int #0x10
|
132 |
+ cmp bx, #0x00
|
133 |
+ je vesa_pm_set_display_window1
|
134 |
+ mov ax, #0x0100
|
135 |
+ ret
|
136 |
+vesa_pm_set_display_window1:
|
137 |
+ mov ax, dx
|
138 |
+ push dx
|
139 |
+ push ax
|
140 |
+ mov dx, # VBE_DISPI_IOPORT_INDEX
|
141 |
+ mov ax, # VBE_DISPI_INDEX_BANK
|
142 |
+ out dx, ax
|
143 |
+ pop ax
|
144 |
+ mov dx, # VBE_DISPI_IOPORT_DATA
|
145 |
+ out dx, ax
|
146 |
+ pop dx
|
147 |
+ mov ax, #0x004f
|
148 |
ret |
149 |
|
150 |
vesa_pm_set_display_start:
|
151 |
- mov ax, #0x4f07
|
152 |
- int #0x10
|
153 |
+ cmp bl, #0x80
|
154 |
+ je vesa_pm_set_display_start1
|
155 |
+ cmp bl, #0x00
|
156 |
+ je vesa_pm_set_display_start1
|
157 |
+ mov ax, #0x0100
|
158 |
+ ret
|
159 |
+vesa_pm_set_display_start1:
|
160 |
+; convert offset to (X, Y) coordinate
|
161 |
+; (would be simpler to change Bochs VBE API...)
|
162 |
+ push eax
|
163 |
+ push ecx
|
164 |
+ push edx
|
165 |
+ push esi
|
166 |
+ push edi
|
167 |
+ shl edx, #16
|
168 |
+ and ecx, #0xffff
|
169 |
+ or ecx, edx
|
170 |
+ shl ecx, #2
|
171 |
+ mov eax, ecx
|
172 |
+
|
173 |
+ push eax
|
174 |
+ mov dx, # VBE_DISPI_IOPORT_INDEX
|
175 |
+ mov ax, # VBE_DISPI_INDEX_VIRT_WIDTH
|
176 |
+ out dx, ax
|
177 |
+ mov dx, # VBE_DISPI_IOPORT_DATA
|
178 |
+ in ax, dx
|
179 |
+ movzx ecx, ax
|
180 |
+
|
181 |
+ mov dx, # VBE_DISPI_IOPORT_INDEX
|
182 |
+ mov ax, # VBE_DISPI_INDEX_BPP
|
183 |
+ out dx, ax
|
184 |
+ mov dx, # VBE_DISPI_IOPORT_DATA
|
185 |
+ in ax, dx
|
186 |
+ movzx esi, ax
|
187 |
+ pop eax
|
188 |
+
|
189 |
+ add esi, #7
|
190 |
+ shr esi, #3
|
191 |
+ imul ecx, esi
|
192 |
+ xor edx, edx
|
193 |
+ div ecx
|
194 |
+ mov edi, eax
|
195 |
+ mov eax, edx
|
196 |
+ xor edx, edx
|
197 |
+ div esi
|
198 |
+
|
199 |
+ push dx
|
200 |
+ push ax
|
201 |
+ mov dx, # VBE_DISPI_IOPORT_INDEX
|
202 |
+ mov ax, # VBE_DISPI_INDEX_X_OFFSET
|
203 |
+ out dx, ax
|
204 |
+ pop ax
|
205 |
+ mov dx, # VBE_DISPI_IOPORT_DATA
|
206 |
+ out dx, ax
|
207 |
+ pop dx
|
208 |
+
|
209 |
+ mov ax, di
|
210 |
+ push dx
|
211 |
+ push ax
|
212 |
+ mov dx, # VBE_DISPI_IOPORT_INDEX
|
213 |
+ mov ax, # VBE_DISPI_INDEX_Y_OFFSET
|
214 |
+ out dx, ax
|
215 |
+ pop ax
|
216 |
+ mov dx, # VBE_DISPI_IOPORT_DATA
|
217 |
+ out dx, ax
|
218 |
+ pop dx
|
219 |
+
|
220 |
+ pop edi
|
221 |
+ pop esi
|
222 |
+ pop edx
|
223 |
+ pop ecx
|
224 |
+ pop eax
|
225 |
+ mov ax, #0x004f
|
226 |
ret |
227 |
|
228 |
vesa_pm_unimplemented:
|
229 |
@@ -835,6 +928,64 @@
|
230 |
ASM_END |
231 |
|
232 |
|
233 |
+Bit16u vbe_biosfn_read_video_state_size()
|
234 |
+{
|
235 |
+ return 9 * 2;
|
236 |
+}
|
237 |
+
|
238 |
+void vbe_biosfn_save_video_state(ES, BX)
|
239 |
+ Bit16u ES; Bit16u BX;
|
240 |
+{
|
241 |
+ Bit16u enable, i;
|
242 |
+
|
243 |
+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
|
244 |
+ enable = inw(VBE_DISPI_IOPORT_DATA);
|
245 |
+ write_word(ES, BX, enable);
|
246 |
+ BX += 2;
|
247 |
+ if (!(enable & VBE_DISPI_ENABLED))
|
248 |
+ return;
|
249 |
+ for(i = VBE_DISPI_INDEX_XRES; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
|
250 |
+ if (i != VBE_DISPI_INDEX_ENABLE) {
|
251 |
+ outw(VBE_DISPI_IOPORT_INDEX, i);
|
252 |
+ write_word(ES, BX, inw(VBE_DISPI_IOPORT_DATA));
|
253 |
+ BX += 2;
|
254 |
+ }
|
255 |
+ }
|
256 |
+}
|
257 |
+
|
258 |
+
|
259 |
+void vbe_biosfn_restore_video_state(ES, BX)
|
260 |
+ Bit16u ES; Bit16u BX;
|
261 |
+{
|
262 |
+ Bit16u enable, i;
|
263 |
+
|
264 |
+ enable = read_word(ES, BX);
|
265 |
+ BX += 2;
|
266 |
+
|
267 |
+ if (!(enable & VBE_DISPI_ENABLED)) {
|
268 |
+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
|
269 |
+ outw(VBE_DISPI_IOPORT_DATA, enable);
|
270 |
+ } else {
|
271 |
+ outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_XRES);
|
272 |
+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
|
273 |
+ BX += 2;
|
274 |
+ outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_YRES);
|
275 |
+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
|
276 |
+ BX += 2;
|
277 |
+ outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);
|
278 |
+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
|
279 |
+ BX += 2;
|
280 |
+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
|
281 |
+ outw(VBE_DISPI_IOPORT_DATA, enable);
|
282 |
+
|
283 |
+ for(i = VBE_DISPI_INDEX_BANK; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
|
284 |
+ outw(VBE_DISPI_IOPORT_INDEX, i);
|
285 |
+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
|
286 |
+ BX += 2;
|
287 |
+ }
|
288 |
+ }
|
289 |
+}
|
290 |
+
|
291 |
/** Function 04h - Save/Restore State
|
292 |
* |
293 |
* Input: |
294 |
@@ -849,10 +1000,48 @@
|
295 |
* BX = Number of 64-byte blocks to hold the state buffer (if DL=00h) |
296 |
* |
297 |
*/ |
298 |
-void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX)
|
299 |
+void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX)
|
300 |
+Bit16u *AX; Bit16u CX; Bit16u DX; Bit16u ES; Bit16u *BX;
|
301 |
{ |
302 |
-}
|
303 |
+ Bit16u ss=get_SS();
|
304 |
+ Bit16u result, val;
|
305 |
|
306 |
+ result = 0x4f;
|
307 |
+ switch(GET_DL()) {
|
308 |
+ case 0x00:
|
309 |
+ val = biosfn_read_video_state_size2(CX);
|
310 |
+#ifdef DEBUG
|
311 |
+ printf("VGA state size=%x\n", val);
|
312 |
+#endif
|
313 |
+ if (CX & 8)
|
314 |
+ val += vbe_biosfn_read_video_state_size();
|
315 |
+ write_word(ss, BX, val);
|
316 |
+ break;
|
317 |
+ case 0x01:
|
318 |
+ val = read_word(ss, BX);
|
319 |
+ val = biosfn_save_video_state(CX, ES, val);
|
320 |
+#ifdef DEBUG
|
321 |
+ printf("VGA save_state offset=%x\n", val);
|
322 |
+#endif
|
323 |
+ if (CX & 8)
|
324 |
+ vbe_biosfn_save_video_state(ES, val);
|
325 |
+ break;
|
326 |
+ case 0x02:
|
327 |
+ val = read_word(ss, BX);
|
328 |
+ val = biosfn_restore_video_state(CX, ES, val);
|
329 |
+#ifdef DEBUG
|
330 |
+ printf("VGA restore_state offset=%x\n", val);
|
331 |
+#endif
|
332 |
+ if (CX & 8)
|
333 |
+ vbe_biosfn_restore_video_state(ES, val);
|
334 |
+ break;
|
335 |
+ default:
|
336 |
+ // function failed
|
337 |
+ result = 0x100;
|
338 |
+ break;
|
339 |
+ }
|
340 |
+ write_word(ss, AX, result);
|
341 |
+}
|
342 |
|
343 |
/** Function 05h - Display Window Control
|
344 |
* |
345 |
@@ -1090,7 +1279,7 @@
|
346 |
*/ |
347 |
ASM_START |
348 |
vbe_biosfn_return_protected_mode_interface:
|
349 |
- test bx, bx
|
350 |
+ test bl, bl
|
351 |
jnz _fail |
352 |
mov di, #0xc000
|
353 |
mov es, di |
354 |
Index: vbe.h
|
355 |
===================================================================
|
356 |
RCS file: /sources/vgabios/vgabios/vbe.h,v
|
357 |
retrieving revision 1.24
|
358 |
diff -u -w -r1.24 vbe.h
|
359 |
--- vbe.h 9 May 2004 20:31:31 -0000 1.24
|
360 |
+++ vbe.h 14 Jun 2006 00:51:07 -0000
|
361 |
@@ -14,7 +14,7 @@
|
362 |
void vbe_biosfn_return_controller_information(AX, ES, DI);
|
363 |
void vbe_biosfn_return_mode_information(AX, CX, ES, DI);
|
364 |
void vbe_biosfn_set_mode(AX, BX, ES, DI);
|
365 |
-void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX);
|
366 |
+void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX);
|
367 |
void vbe_biosfn_set_get_palette_data(AX);
|
368 |
void vbe_biosfn_return_protected_mode_interface(AX);
|
369 |
|
370 |
@@ -151,6 +151,12 @@
|
371 |
Bit8u Reserved[189];
|
372 |
} ModeInfoBlock; |
373 |
|
374 |
+typedef struct ModeInfoListItem
|
375 |
+{
|
376 |
+ Bit16u mode;
|
377 |
+ ModeInfoBlockCompact info;
|
378 |
+} ModeInfoListItem;
|
379 |
+
|
380 |
// VBE Return Status Info
|
381 |
// AL
|
382 |
#define VBE_RETURN_STATUS_SUPPORTED 0x4F |
383 |
@@ -193,6 +199,10 @@
|
384 |
#define VBE_VESA_MODE_1280X1024X1555 0x119 |
385 |
#define VBE_VESA_MODE_1280X1024X565 0x11A |
386 |
#define VBE_VESA_MODE_1280X1024X888 0x11B |
387 |
+#define VBE_VESA_MODE_1600X1200X8 0x11C
|
388 |
+#define VBE_VESA_MODE_1600X1200X1555 0x11D
|
389 |
+#define VBE_VESA_MODE_1600X1200X565 0x11E
|
390 |
+#define VBE_VESA_MODE_1600X1200X888 0x11F
|
391 |
|
392 |
// BOCHS/PLEX86 'own' mode numbers
|
393 |
#define VBE_OWN_MODE_320X200X8888 0x140 |
394 |
@@ -202,6 +212,12 @@
|
395 |
#define VBE_OWN_MODE_1024X768X8888 0x144 |
396 |
#define VBE_OWN_MODE_1280X1024X8888 0x145 |
397 |
#define VBE_OWN_MODE_320X200X8 0x146 |
398 |
+#define VBE_OWN_MODE_1600X1200X8888 0x147
|
399 |
+#define VBE_OWN_MODE_1152X864X8 0x148
|
400 |
+#define VBE_OWN_MODE_1152X864X1555 0x149
|
401 |
+#define VBE_OWN_MODE_1152X864X565 0x14a
|
402 |
+#define VBE_OWN_MODE_1152X864X888 0x14b
|
403 |
+#define VBE_OWN_MODE_1152X864X8888 0x14c
|
404 |
|
405 |
#define VBE_VESA_MODE_END_OF_LIST 0xFFFF |
406 |
|
407 |
@@ -259,7 +275,7 @@
|
408 |
// like 0xE0000000
|
409 |
|
410 |
|
411 |
- #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 4
|
412 |
+ #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 8
|
413 |
|
414 |
#define VBE_DISPI_BANK_ADDRESS 0xA0000 |
415 |
#define VBE_DISPI_BANK_SIZE_KB 64 |
416 |
Index: vgabios.c
|
417 |
===================================================================
|
418 |
RCS file: /sources/vgabios/vgabios/vgabios.c,v
|
419 |
retrieving revision 1.64
|
420 |
diff -u -w -r1.64 vgabios.c
|
421 |
--- vgabios.c 25 Mar 2006 10:19:16 -0000 1.64
|
422 |
+++ vgabios.c 14 Jun 2006 00:51:07 -0000
|
423 |
@@ -109,8 +109,8 @@
|
424 |
static void biosfn_write_string(); |
425 |
static void biosfn_read_state_info(); |
426 |
static void biosfn_read_video_state_size(); |
427 |
-static void biosfn_save_video_state();
|
428 |
-static void biosfn_restore_video_state();
|
429 |
+static Bit16u biosfn_save_video_state();
|
430 |
+static Bit16u biosfn_restore_video_state();
|
431 |
extern Bit8u video_save_pointer_table[];
|
432 |
|
433 |
// This is for compiling with gcc2 and gcc3
|
434 |
@@ -748,12 +748,7 @@
|
435 |
vbe_biosfn_set_mode(&AX,BX,ES,DI); |
436 |
break;
|
437 |
case 0x04: |
438 |
- //FIXME
|
439 |
-#ifdef DEBUG
|
440 |
- unimplemented();
|
441 |
-#endif
|
442 |
- // function failed
|
443 |
- AX=0x100;
|
444 |
+ vbe_biosfn_save_restore_state(&AX, CX, DX, ES, &BX);
|
445 |
break;
|
446 |
case 0x09: |
447 |
//FIXME
|
448 |
@@ -3138,23 +3133,215 @@
|
449 |
} |
450 |
|
451 |
// --------------------------------------------------------------------------------------------
|
452 |
-static void biosfn_read_video_state_size (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX;
|
453 |
+// --------------------------------------------------------------------------------------------
|
454 |
+static Bit16u biosfn_read_video_state_size2 (CX)
|
455 |
+ Bit16u CX;
|
456 |
{ |
457 |
-#ifdef DEBUG
|
458 |
- unimplemented();
|
459 |
-#endif
|
460 |
+ Bit16u size;
|
461 |
+ size = 0;
|
462 |
+ if (CX & 1) {
|
463 |
+ size += 0x46;
|
464 |
+ }
|
465 |
+ if (CX & 2) {
|
466 |
+ size += (5 + 8 + 5) * 2 + 6;
|
467 |
+ }
|
468 |
+ if (CX & 4) {
|
469 |
+ size += 3 + 256 * 3 + 1;
|
470 |
} |
471 |
-static void biosfn_save_video_state (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX;
|
472 |
+ return size;
|
473 |
+}
|
474 |
+
|
475 |
+static void biosfn_read_video_state_size (CX, BX)
|
476 |
+ Bit16u CX; Bit16u *BX;
|
477 |
{ |
478 |
-#ifdef DEBUG
|
479 |
- unimplemented();
|
480 |
-#endif
|
481 |
+ Bit16u ss=get_SS();
|
482 |
+ write_word(ss, BX, biosfn_read_video_state_size2(CX));
|
483 |
} |
484 |
-static void biosfn_restore_video_state (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX;
|
485 |
+
|
486 |
+static Bit16u biosfn_save_video_state (CX,ES,BX)
|
487 |
+ Bit16u CX;Bit16u ES;Bit16u BX;
|
488 |
{ |
489 |
-#ifdef DEBUG
|
490 |
- unimplemented();
|
491 |
-#endif
|
492 |
+ Bit16u i, v, crtc_addr, ar_index;
|
493 |
+
|
494 |
+ crtc_addr = read_word(BIOSMEM_SEG, BIOSMEM_CRTC_ADDRESS);
|
495 |
+ if (CX & 1) {
|
496 |
+ write_byte(ES, BX, inb(VGAREG_SEQU_ADDRESS)); BX++;
|
497 |
+ write_byte(ES, BX, inb(crtc_addr)); BX++;
|
498 |
+ write_byte(ES, BX, inb(VGAREG_GRDC_ADDRESS)); BX++;
|
499 |
+ inb(VGAREG_ACTL_RESET);
|
500 |
+ ar_index = inb(VGAREG_ACTL_ADDRESS);
|
501 |
+ write_byte(ES, BX, ar_index); BX++;
|
502 |
+ write_byte(ES, BX, inb(VGAREG_READ_FEATURE_CTL)); BX++;
|
503 |
+
|
504 |
+ for(i=1;i<=4;i++){
|
505 |
+ outb(VGAREG_SEQU_ADDRESS, i);
|
506 |
+ write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++;
|
507 |
+ }
|
508 |
+ outb(VGAREG_SEQU_ADDRESS, 0);
|
509 |
+ write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++;
|
510 |
+
|
511 |
+ for(i=0;i<=0x18;i++) {
|
512 |
+ outb(crtc_addr,i);
|
513 |
+ write_byte(ES, BX, inb(crtc_addr+1)); BX++;
|
514 |
+ }
|
515 |
+
|
516 |
+ for(i=0;i<=0x13;i++) {
|
517 |
+ inb(VGAREG_ACTL_RESET);
|
518 |
+ outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));
|
519 |
+ write_byte(ES, BX, inb(VGAREG_ACTL_READ_DATA)); BX++;
|
520 |
+ }
|
521 |
+ inb(VGAREG_ACTL_RESET);
|
522 |
+
|
523 |
+ for(i=0;i<=8;i++) {
|
524 |
+ outb(VGAREG_GRDC_ADDRESS,i);
|
525 |
+ write_byte(ES, BX, inb(VGAREG_GRDC_DATA)); BX++;
|
526 |
+ }
|
527 |
+
|
528 |
+ write_word(ES, BX, crtc_addr); BX+= 2;
|
529 |
+
|
530 |
+ /* XXX: read plane latches */
|
531 |
+ write_byte(ES, BX, 0); BX++;
|
532 |
+ write_byte(ES, BX, 0); BX++;
|
533 |
+ write_byte(ES, BX, 0); BX++;
|
534 |
+ write_byte(ES, BX, 0); BX++;
|
535 |
+ }
|
536 |
+ if (CX & 2) {
|
537 |
+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE)); BX++;
|
538 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)); BX += 2;
|
539 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE)); BX += 2;
|
540 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)); BX += 2;
|
541 |
+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)); BX++;
|
542 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT)); BX += 2;
|
543 |
+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL)); BX++;
|
544 |
+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES)); BX++;
|
545 |
+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)); BX++;
|
546 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE)); BX += 2;
|
547 |
+ for(i=0;i<8;i++) {
|
548 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i));
|
549 |
+ BX += 2;
|
550 |
+ }
|
551 |
+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START)); BX += 2;
|
552 |
+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE)); BX++;
|
553 |
+ /* current font */
|
554 |
+ write_word(ES, BX, read_word(0, 0x1f * 4)); BX += 2;
|
555 |
+ write_word(ES, BX, read_word(0, 0x1f * 4 + 2)); BX += 2;
|
556 |
+ write_word(ES, BX, read_word(0, 0x43 * 4)); BX += 2;
|
557 |
+ write_word(ES, BX, read_word(0, 0x43 * 4 + 2)); BX += 2;
|
558 |
+ }
|
559 |
+ if (CX & 4) {
|
560 |
+ /* XXX: check this */
|
561 |
+ write_byte(ES, BX, inb(VGAREG_DAC_STATE)); BX++; /* read/write mode dac */
|
562 |
+ write_byte(ES, BX, inb(VGAREG_DAC_WRITE_ADDRESS)); BX++; /* pix address */
|
563 |
+ write_byte(ES, BX, inb(VGAREG_PEL_MASK)); BX++;
|
564 |
+ // Set the whole dac always, from 0
|
565 |
+ outb(VGAREG_DAC_WRITE_ADDRESS,0x00);
|
566 |
+ for(i=0;i<256*3;i++) {
|
567 |
+ write_byte(ES, BX, inb(VGAREG_DAC_DATA)); BX++;
|
568 |
+ }
|
569 |
+ write_byte(ES, BX, 0); BX++; /* color select register */
|
570 |
+ }
|
571 |
+ return BX;
|
572 |
+}
|
573 |
+
|
574 |
+static Bit16u biosfn_restore_video_state (CX,ES,BX)
|
575 |
+ Bit16u CX;Bit16u ES;Bit16u BX;
|
576 |
+{
|
577 |
+ Bit16u i, crtc_addr, v, addr1, ar_index;
|
578 |
+
|
579 |
+ if (CX & 1) {
|
580 |
+ // Reset Attribute Ctl flip-flop
|
581 |
+ inb(VGAREG_ACTL_RESET);
|
582 |
+
|
583 |
+ crtc_addr = read_word(ES, BX + 0x40);
|
584 |
+ addr1 = BX;
|
585 |
+ BX += 5;
|
586 |
+
|
587 |
+ for(i=1;i<=4;i++){
|
588 |
+ outb(VGAREG_SEQU_ADDRESS, i);
|
589 |
+ outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++;
|
590 |
+ }
|
591 |
+ outb(VGAREG_SEQU_ADDRESS, 0);
|
592 |
+ outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++;
|
593 |
+
|
594 |
+ // Disable CRTC write protection
|
595 |
+ outw(crtc_addr,0x0011);
|
596 |
+ // Set CRTC regs
|
597 |
+ for(i=0;i<=0x18;i++) {
|
598 |
+ if (i != 0x11) {
|
599 |
+ outb(crtc_addr,i);
|
600 |
+ outb(crtc_addr+1, read_byte(ES, BX));
|
601 |
+ }
|
602 |
+ BX++;
|
603 |
+ }
|
604 |
+ // select crtc base address
|
605 |
+ v = inb(VGAREG_READ_MISC_OUTPUT) & ~0x01;
|
606 |
+ if (crtc_addr = 0x3d4)
|
607 |
+ v |= 0x01;
|
608 |
+ outb(VGAREG_WRITE_MISC_OUTPUT, v);
|
609 |
+
|
610 |
+ // enable write protection if needed
|
611 |
+ outb(crtc_addr, 0x11);
|
612 |
+ outb(crtc_addr+1, read_byte(ES, BX - 0x18 + 0x11));
|
613 |
+
|
614 |
+ // Set Attribute Ctl
|
615 |
+ ar_index = read_byte(ES, addr1 + 0x03);
|
616 |
+ inb(VGAREG_ACTL_RESET);
|
617 |
+ for(i=0;i<=0x13;i++) {
|
618 |
+ outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));
|
619 |
+ outb(VGAREG_ACTL_WRITE_DATA, read_byte(ES, BX)); BX++;
|
620 |
+ }
|
621 |
+ outb(VGAREG_ACTL_ADDRESS, ar_index);
|
622 |
+ inb(VGAREG_ACTL_RESET);
|
623 |
+
|
624 |
+ for(i=0;i<=8;i++) {
|
625 |
+ outb(VGAREG_GRDC_ADDRESS,i);
|
626 |
+ outb(VGAREG_GRDC_DATA, read_byte(ES, BX)); BX++;
|
627 |
+ }
|
628 |
+ BX += 2; /* crtc_addr */
|
629 |
+ BX += 4; /* plane latches */
|
630 |
+
|
631 |
+ outb(VGAREG_SEQU_ADDRESS, read_byte(ES, addr1)); addr1++;
|
632 |
+ outb(crtc_addr, read_byte(ES, addr1)); addr1++;
|
633 |
+ outb(VGAREG_GRDC_ADDRESS, read_byte(ES, addr1)); addr1++;
|
634 |
+ addr1++;
|
635 |
+ outb(crtc_addr - 0x4 + 0xa, read_byte(ES, addr1)); addr1++;
|
636 |
+ }
|
637 |
+ if (CX & 2) {
|
638 |
+ write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE, read_byte(ES, BX)); BX++;
|
639 |
+ write_word(BIOSMEM_SEG,BIOSMEM_NB_COLS, read_word(ES, BX)); BX += 2;
|
640 |
+ write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, read_word(ES, BX)); BX += 2;
|
641 |
+ write_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS, read_word(ES, BX)); BX += 2;
|
642 |
+ write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, read_byte(ES, BX)); BX++;
|
643 |
+ write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, read_word(ES, BX)); BX += 2;
|
644 |
+ write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL, read_byte(ES, BX)); BX++;
|
645 |
+ write_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES, read_byte(ES, BX)); BX++;
|
646 |
+ write_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL, read_byte(ES, BX)); BX++;
|
647 |
+ write_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE, read_word(ES, BX)); BX += 2;
|
648 |
+ for(i=0;i<8;i++) {
|
649 |
+ write_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i, read_word(ES, BX));
|
650 |
+ BX += 2;
|
651 |
+ }
|
652 |
+ write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START, read_word(ES, BX)); BX += 2;
|
653 |
+ write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE, read_byte(ES, BX)); BX++;
|
654 |
+ /* current font */
|
655 |
+ write_word(0, 0x1f * 4, read_word(ES, BX)); BX += 2;
|
656 |
+ write_word(0, 0x1f * 4 + 2, read_word(ES, BX)); BX += 2;
|
657 |
+ write_word(0, 0x43 * 4, read_word(ES, BX)); BX += 2;
|
658 |
+ write_word(0, 0x43 * 4 + 2, read_word(ES, BX)); BX += 2;
|
659 |
+ }
|
660 |
+ if (CX & 4) {
|
661 |
+ BX++;
|
662 |
+ v = read_byte(ES, BX); BX++;
|
663 |
+ outb(VGAREG_PEL_MASK, read_byte(ES, BX)); BX++;
|
664 |
+ // Set the whole dac always, from 0
|
665 |
+ outb(VGAREG_DAC_WRITE_ADDRESS,0x00);
|
666 |
+ for(i=0;i<256*3;i++) {
|
667 |
+ outb(VGAREG_DAC_DATA, read_byte(ES, BX)); BX++;
|
668 |
+ }
|
669 |
+ BX++;
|
670 |
+ outb(VGAREG_DAC_WRITE_ADDRESS, v);
|
671 |
+ }
|
672 |
+ return BX;
|
673 |
} |
674 |
|
675 |
// ============================================================================================
|
676 |
diff -u -w vbetables-gen.c
|
677 |
--- vbetables-gen.c 1970-01-01 01:00:00.000000000 +0100
|
678 |
+++ vbetables-gen.c 2006-06-14 00:52:18.000000000 +0200
|
679 |
@@ -0,0 +1,217 @@
|
680 |
+/* Generate the VGABIOS VBE Tables */
|
681 |
+#include <stdlib.h>
|
682 |
+#include <stdio.h>
|
683 |
+
|
684 |
+typedef struct {
|
685 |
+ int width;
|
686 |
+ int height;
|
687 |
+ int depth;
|
688 |
+ int mode;
|
689 |
+} ModeInfo;
|
690 |
+
|
691 |
+ModeInfo modes[] = {
|
692 |
+ /* standard VESA modes */
|
693 |
+{ 640, 400, 8 , 0x100},
|
694 |
+{ 640, 480, 8 , 0x101},
|
695 |
+{ 800, 600, 4 , 0x102},
|
696 |
+{ 800, 600, 8 , 0x103},
|
697 |
+ //{ 1024, 768, 4 , 0x104},
|
698 |
+{ 1024, 768, 8 , 0x105},
|
699 |
+ //{ 1280, 1024, 4 , 0x106},
|
700 |
+{ 1280, 1024, 8 , 0x107},
|
701 |
+{ 320, 200, 15 , 0x10D},
|
702 |
+{ 320, 200, 16 , 0x10E},
|
703 |
+{ 320, 200, 24 , 0x10F},
|
704 |
+{ 640, 480, 15 , 0x110},
|
705 |
+{ 640, 480, 16 , 0x111},
|
706 |
+{ 640, 480, 24 , 0x112},
|
707 |
+{ 800, 600, 15 , 0x113},
|
708 |
+{ 800, 600, 16 , 0x114},
|
709 |
+{ 800, 600, 24 , 0x115},
|
710 |
+{ 1024, 768, 15 , 0x116},
|
711 |
+{ 1024, 768, 16 , 0x117},
|
712 |
+{ 1024, 768, 24 , 0x118},
|
713 |
+{ 1280, 1024, 15 , 0x119},
|
714 |
+{ 1280, 1024, 16 , 0x11A},
|
715 |
+{ 1280, 1024, 24 , 0x11B},
|
716 |
+{ 1600, 1200, 8 , 0x11C},
|
717 |
+{ 1600, 1200, 15 , 0x11D},
|
718 |
+{ 1600, 1200, 16 , 0x11E},
|
719 |
+{ 1600, 1200, 24 , 0x11F},
|
720 |
+
|
721 |
+ /* BOCHS/PLE, 86 'own' mode numbers */
|
722 |
+{ 320, 200, 32 , 0x140},
|
723 |
+{ 640, 400, 32 , 0x141},
|
724 |
+{ 640, 480, 32 , 0x142},
|
725 |
+{ 800, 600, 32 , 0x143},
|
726 |
+{ 1024, 768, 32 , 0x144},
|
727 |
+{ 1280, 1024, 32 , 0x145},
|
728 |
+{ 320, 200, 8 , 0x146},
|
729 |
+{ 1600, 1200, 32 , 0x147},
|
730 |
+{ 1152, 864, 8 , 0x148},
|
731 |
+{ 1152, 864, 15 , 0x149},
|
732 |
+{ 1152, 864, 16 , 0x14a},
|
733 |
+{ 1152, 864, 24 , 0x14b},
|
734 |
+{ 1152, 864, 32 , 0x14c},
|
735 |
+{ 0, },
|
736 |
+};
|
737 |
+
|
738 |
+int main(int argc, char **argv)
|
739 |
+{
|
740 |
+ const ModeInfo *pm;
|
741 |
+ int pitch, r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos;
|
742 |
+ const char *str;
|
743 |
+
|
744 |
+ printf("/* THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT */\n");
|
745 |
+ printf("static ModeInfoListItem mode_info_list[]=\n");
|
746 |
+ printf("{\n");
|
747 |
+ for(pm = modes; pm->mode != 0; pm++) {
|
748 |
+ printf("{ 0x%04x, /* %dx%dx%d */\n",
|
749 |
+ pm->mode, pm->width, pm->height, pm->depth);
|
750 |
+ printf("{ /*Bit16u ModeAttributes*/ %s,\n",
|
751 |
+ "VBE_MODE_ATTRIBUTE_SUPPORTED | "
|
752 |
+ "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
|
753 |
+ "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
|
754 |
+ "VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | "
|
755 |
+ "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
|
756 |
+
|
757 |
+ printf("/*Bit8u WinAAttributes*/ %s,\n",
|
758 |
+ "VBE_WINDOW_ATTRIBUTE_RELOCATABLE | "
|
759 |
+ "VBE_WINDOW_ATTRIBUTE_READABLE | "
|
760 |
+ "VBE_WINDOW_ATTRIBUTE_WRITEABLE");
|
761 |
+
|
762 |
+ printf("/*Bit8u WinBAttributes*/ %d,\n", 0);
|
763 |
+
|
764 |
+ printf("/*Bit16u WinGranularity*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
|
765 |
+
|
766 |
+ printf("/*Bit16u WinSize*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
|
767 |
+
|
768 |
+ printf("/*Bit16u WinASegment*/ %s,\n", "VGAMEM_GRAPH");
|
769 |
+
|
770 |
+ printf("/*Bit16u WinBSegment*/ 0x%04x,\n", 0);
|
771 |
+
|
772 |
+ printf("/*Bit32u WinFuncPtr*/ %d,\n", 0);
|
773 |
+
|
774 |
+ if (pm->depth == 4)
|
775 |
+ pitch = (pm->width + 7) / 8;
|
776 |
+ else
|
777 |
+ pitch = pm->width * ((pm->depth + 7) / 8);
|
778 |
+ printf("/*Bit16u BytesPerScanLine*/ %d,\n", pitch);
|
779 |
+
|
780 |
+ // Mandatory information for VBE 1.2 and above
|
781 |
+ printf("/*Bit16u XResolution*/ %d,\n", pm->width);
|
782 |
+ printf("/*Bit16u YResolution*/ %d,\n", pm->height);
|
783 |
+ printf("/*Bit8u XCharSize*/ %d,\n", 8);
|
784 |
+ printf("/*Bit8u YCharSize*/ %d,\n", 16);
|
785 |
+ if (pm->depth == 4) {
|
786 |
+ printf("/*Bit8u NumberOfPlanes*/ %d,\n", 4);
|
787 |
+ printf("/*Bit8u BitsPerPixel*/ %d,\n", pm->depth);
|
788 |
+ } else {
|
789 |
+ printf("/*Bit8u NumberOfPlanes*/ %d,\n", 1);
|
790 |
+ printf("/*Bit8u BitsPerPixel*/ %d,\n", pm->depth);
|
791 |
+ }
|
792 |
+ printf("/*Bit8u NumberOfBanks*/ %d,\n",
|
793 |
+ (pm->height * pitch + 65535) / 65536);
|
794 |
+
|
795 |
+ if (pm->depth == 4)
|
796 |
+ str = "VBE_MEMORYMODEL_PLANAR";
|
797 |
+ else if (pm->depth == 8)
|
798 |
+ str = "VBE_MEMORYMODEL_PACKED_PIXEL";
|
799 |
+ else
|
800 |
+ str = "VBE_MEMORYMODEL_DIRECT_COLOR";
|
801 |
+ printf("/*Bit8u MemoryModel*/ %s,\n", str);
|
802 |
+ printf("/*Bit8u BankSize*/ %d,\n", 0);
|
803 |
+ /* XXX: check */
|
804 |
+ printf("/*Bit8u NumberOfImagePages*/ %d,\n", 0);
|
805 |
+ printf("/*Bit8u Reserved_page*/ %d,\n", 0);
|
806 |
+
|
807 |
+ // Direct Color fields (required for direct/6 and YUV/7 memory models)
|
808 |
+ switch(pm->depth) {
|
809 |
+ case 15:
|
810 |
+ r_size = 5;
|
811 |
+ r_pos = 10;
|
812 |
+ g_size = 5;
|
813 |
+ g_pos = 5;
|
814 |
+ b_size = 5;
|
815 |
+ b_pos = 0;
|
816 |
+ a_size = 1;
|
817 |
+ a_pos = 15;
|
818 |
+ break;
|
819 |
+ case 16:
|
820 |
+ r_size = 5;
|
821 |
+ r_pos = 11;
|
822 |
+ g_size = 6;
|
823 |
+ g_pos = 5;
|
824 |
+ b_size = 5;
|
825 |
+ b_pos = 0;
|
826 |
+ a_size = 0;
|
827 |
+ a_pos = 0;
|
828 |
+ break;
|
829 |
+ case 24:
|
830 |
+ r_size = 8;
|
831 |
+ r_pos = 16;
|
832 |
+ g_size = 8;
|
833 |
+ g_pos = 8;
|
834 |
+ b_size = 8;
|
835 |
+ b_pos = 0;
|
836 |
+ a_size = 0;
|
837 |
+ a_pos = 0;
|
838 |
+ break;
|
839 |
+ case 32:
|
840 |
+ r_size = 8;
|
841 |
+ r_pos = 16;
|
842 |
+ g_size = 8;
|
843 |
+ g_pos = 8;
|
844 |
+ b_size = 8;
|
845 |
+ b_pos = 0;
|
846 |
+ a_size = 8;
|
847 |
+ a_pos = 24;
|
848 |
+ break;
|
849 |
+ default:
|
850 |
+ r_size = 0;
|
851 |
+ r_pos = 0;
|
852 |
+ g_size = 0;
|
853 |
+ g_pos = 0;
|
854 |
+ b_size = 0;
|
855 |
+ b_pos = 0;
|
856 |
+ a_size = 0;
|
857 |
+ a_pos = 0;
|
858 |
+ break;
|
859 |
+ }
|
860 |
+
|
861 |
+ printf("/*Bit8u RedMaskSize*/ %d,\n", r_size);
|
862 |
+ printf("/*Bit8u RedFieldPosition*/ %d,\n", r_pos);
|
863 |
+ printf("/*Bit8u GreenMaskSize*/ %d,\n", g_size);
|
864 |
+ printf("/*Bit8u GreenFieldPosition*/ %d,\n", g_pos);
|
865 |
+ printf("/*Bit8u BlueMaskSize*/ %d,\n", b_size);
|
866 |
+ printf("/*Bit8u BlueFieldPosition*/ %d,\n", b_pos);
|
867 |
+ printf("/*Bit8u RsvdMaskSize*/ %d,\n", a_size);
|
868 |
+ printf("/*Bit8u RsvdFieldPosition*/ %d,\n", a_pos);
|
869 |
+ printf("/*Bit8u DirectColorModeInfo*/ %d,\n", 0);
|
870 |
+
|
871 |
+// Mandatory information for VBE 2.0 and above
|
872 |
+ printf("/*Bit32u PhysBasePtr*/ %s,\n",
|
873 |
+ "VBE_DISPI_LFB_PHYSICAL_ADDRESS");
|
874 |
+ printf("/*Bit32u OffScreenMemOffset*/ %d,\n", 0);
|
875 |
+ printf("/*Bit16u OffScreenMemSize*/ %d,\n", 0);
|
876 |
+ // Mandatory information for VBE 3.0 and above
|
877 |
+ printf("/*Bit16u LinBytesPerScanLine*/ %d,\n", pitch);
|
878 |
+ printf("/*Bit8u BnkNumberOfPages*/ %d,\n", 0);
|
879 |
+ printf("/*Bit8u LinNumberOfPages*/ %d,\n", 0);
|
880 |
+ printf("/*Bit8u LinRedMaskSize*/ %d,\n", r_size);
|
881 |
+ printf("/*Bit8u LinRedFieldPosition*/ %d,\n", r_pos);
|
882 |
+ printf("/*Bit8u LinGreenMaskSize*/ %d,\n", g_size);
|
883 |
+ printf("/*Bit8u LinGreenFieldPosition*/ %d,\n", g_pos);
|
884 |
+ printf("/*Bit8u LinBlueMaskSize*/ %d,\n", b_size);
|
885 |
+ printf("/*Bit8u LinBlueFieldPosition*/ %d,\n", b_pos);
|
886 |
+ printf("/*Bit8u LinRsvdMaskSize*/ %d,\n", a_size);
|
887 |
+ printf("/*Bit8u LinRsvdFieldPosition*/ %d,\n", a_pos);
|
888 |
+ printf("/*Bit32u MaxPixelClock*/ %d,\n", 0);
|
889 |
+ printf("} },\n");
|
890 |
+ }
|
891 |
+ printf("{ VBE_VESA_MODE_END_OF_LIST,\n");
|
892 |
+ printf("{ 0,\n");
|
893 |
+ printf("} },\n");
|
894 |
+ printf("};\n");
|
895 |
+ return 0;
|
896 |
+}
|