Index: /trunk/src/VBox/Devices/Graphics/BIOS/vbe.c
===================================================================
--- /trunk/src/VBox/Devices/Graphics/BIOS/vbe.c	(revision 33849)
+++ /trunk/src/VBox/Devices/Graphics/BIOS/vbe.c	(revision 33850)
@@ -157,9 +157,21 @@
 vesa_pm_set_display_start:
   cmp  bl, #0x80
-  je   vesa_pm_set_display_start1
+  je   vesa_pm_set_display_start1_wait
   cmp  bl, #0x00
   je   vesa_pm_set_display_start1
   mov  ax, #0x0100
   ret
+vesa_pm_set_display_start1_wait:
+  push edx
+  mov  dx, #0x03da
+wnv_loop_32:
+  in   al, dx
+  test al, #8
+  jnz  wnv_loop_32
+wv_loop_32:
+  in   al, dx
+  test al, #8
+  jz   wv_loop_32
+  pop  edx
 vesa_pm_set_display_start1:
 ; convert offset to (X, Y) coordinate
@@ -263,4 +275,29 @@
 #endif
 
+;; Vertical retrace waiting
+wait_vsync:
+  push ax
+  push dx
+  mov  dx, #0x03da
+wv_loop:
+  in   al, dx
+  test al, #8
+  jz   wv_loop
+  pop  dx
+  pop  ax
+  ret
+
+wait_not_vsync:
+  push ax
+  push dx
+  mov  dx, #0x03da
+wnv_loop:
+  in   al, dx
+  test al, #8
+  jnz  wnv_loop
+  pop  dx
+  pop  ax
+  ret
+
 ; DISPI ioport functions
 
@@ -657,5 +694,10 @@
   mov  dx, # VGAREG_VGA_CRTC_ADDRESS
   mov  ax, #0x0009
-  out  dx, ax
+  out  dx, al
+  mov  dx, # VGAREG_VGA_CRTC_DATA
+  in   al, dx
+  and  al, #0x60    // clear double scan bit and cell height
+  out  dx, al
+  mov  dx, # VGAREG_VGA_CRTC_ADDRESS
   mov  al, #0x17
   out  dx, al
@@ -1608,5 +1650,5 @@
 vbe_biosfn_set_get_display_start:
   cmp  bl, #0x80
-  je   set_display_start
+  je   set_display_start_wait
   cmp  bl, #0x01
   je   get_display_start
@@ -1614,4 +1656,7 @@
   mov  ax, #0x0100
   ret
+set_display_start_wait:
+  call wait_not_vsync
+  call wait_vsync
 set_display_start:
   mov  ax, cx
