source: trunk/packages/xen-common/xen-common/tools/ioemu/pc-bios/vgabios.diff @ 34

Last change on this file since 34 was 34, checked in by hartmans, 17 years ago

Add xen and xen-common

File size: 28.0 KB
RevLine 
[34]1Index: Makefile
2===================================================================
3RCS file: /sources/vgabios/vgabios/Makefile,v
4retrieving revision 1.17
5diff -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 > $@
27Index: clext.c
28===================================================================
29RCS file: /sources/vgabios/vgabios/clext.c,v
30retrieving revision 1.10
31diff -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
101Index: vbe.c
102===================================================================
103RCS file: /sources/vgabios/vgabios/vbe.c,v
104retrieving revision 1.48
105diff -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
354Index: vbe.h
355===================================================================
356RCS file: /sources/vgabios/vgabios/vbe.h,v
357retrieving revision 1.24
358diff -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
416Index: vgabios.c
417===================================================================
418RCS file: /sources/vgabios/vgabios/vgabios.c,v
419retrieving revision 1.64
420diff -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 // ============================================================================================
676diff -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+}
Note: See TracBrowser for help on using the repository browser.