Index: kernel/arch/ia32/src/boot/vesa_prot.inc
===================================================================
--- kernel/arch/ia32/src/boot/vesa_prot.inc	(revision 7dfc120ad2ac14e97b041f8da4a10c117dfa4b1b)
+++ kernel/arch/ia32/src/boot/vesa_prot.inc	(revision 1496f871c444d0770d9415a64dfff04b5a59352f)
@@ -83,10 +83,25 @@
 		# returned back to protected mode
 		
-		mov %esi, KA2PA(vesa_ph_addr)
-		mov %di, KA2PA(vesa_height)
-		shr $16, %edi
-		mov %di, KA2PA(vesa_width)
-		mov %bx, KA2PA(vesa_scanline)
+		mov %ax, KA2PA(vesa_scanline)
+		shr $16, %eax
+		mov %ax, KA2PA(vesa_bpp)
+		
+		mov %bx, KA2PA(vesa_height)
 		shr $16, %ebx
-		mov %bx, KA2PA(vesa_bpp)
+		mov %bx, KA2PA(vesa_width)
+		
+		mov %dl, KA2PA(vesa_green_pos)
+		shr $8, %edx
+		mov %dl, KA2PA(vesa_green_mask)
+		shr $8, %edx
+		mov %dl, KA2PA(vesa_red_pos)
+		shr $8, %edx
+		mov %dl, KA2PA(vesa_red_mask)
+		
+		mov %esi, %edx
+		mov %dl, KA2PA(vesa_blue_pos)
+		shr $8, %edx
+		mov %dl, KA2PA(vesa_blue_mask)
+		
+		mov %edi, KA2PA(vesa_ph_addr)
 #endif
Index: kernel/arch/ia32/src/boot/vesa_real.inc
===================================================================
--- kernel/arch/ia32/src/boot/vesa_real.inc	(revision 7dfc120ad2ac14e97b041f8da4a10c117dfa4b1b)
+++ kernel/arch/ia32/src/boot/vesa_real.inc	(revision 1496f871c444d0770d9415a64dfff04b5a59352f)
@@ -5,20 +5,26 @@
 #define VESA_INFO_SIZE 1024
 
-#define VESA_MODE_ATTRIBUTES_OFFSET 0
-#define VESA_MODE_LIST_PTR_OFFSET 14
-#define VESA_MODE_SCANLINE_OFFSET 16
-#define VESA_MODE_WIDTH_OFFSET 18
-#define VESA_MODE_HEIGHT_OFFSET 20
-#define VESA_MODE_BPP_OFFSET 25
-#define VESA_MODE_PHADDR_OFFSET 40
-
-#define VESA_END_OF_MODES 0xffff
-
-#define VESA_OK 0x4f
-
-#define VESA_GET_INFO 0x4f00
-#define VESA_GET_MODE_INFO 0x4f01
-#define VESA_SET_MODE 0x4f02
-#define VESA_SET_PALETTE 0x4f09
+#define VESA_MODE_ATTRIBUTES_OFFSET  0
+#define VESA_MODE_LIST_PTR_OFFSET    14
+#define VESA_MODE_SCANLINE_OFFSET    16
+#define VESA_MODE_WIDTH_OFFSET       18
+#define VESA_MODE_HEIGHT_OFFSET      20
+#define VESA_MODE_BPP_OFFSET         25
+#define VESA_MODE_RED_MASK_OFFSET    31
+#define VESA_MODE_RED_POS_OFFSET     32
+#define VESA_MODE_GREEN_MASK_OFFSET  33
+#define VESA_MODE_GREEN_POS_OFFSET   34
+#define VESA_MODE_BLUE_MASK_OFFSET   35
+#define VESA_MODE_BLUE_POS_OFFSET    36
+#define VESA_MODE_PHADDR_OFFSET      40
+
+#define VESA_END_OF_MODES  0xffff
+
+#define VESA_OK  0x4f
+
+#define VESA_GET_INFO       0x4f00
+#define VESA_GET_MODE_INFO  0x4f01
+#define VESA_SET_MODE       0x4f02
+#define VESA_SET_PALETTE    0x4f09
 
 .code32
@@ -278,19 +284,40 @@
 		vga_not_set:
 		
-		mov VESA_MODE_PHADDR_OFFSET(%di), %esi
-		mov VESA_MODE_WIDTH_OFFSET(%di), %ax
+		# store mode parameters
+		#  eax = bpp[8] scanline[16]
+		#  ebx = width[16]  height[16]
+		#  edx = red_mask[8] red_pos[8] green_mask[8] green_pos[8]
+		#  esi = blue_mask[8] blue_pos[8]
+		#  edi = linear frame buffer
+		
+		mov VESA_MODE_BPP_OFFSET(%di), %al
+		xor %ah, %ah
 		shl $16, %eax
-		mov VESA_MODE_HEIGHT_OFFSET(%di), %ax
-		mov VESA_MODE_BPP_OFFSET(%di), %bl
-		xor %bh, %bh
+		mov VESA_MODE_SCANLINE_OFFSET(%di), %ax
+		
+		mov VESA_MODE_WIDTH_OFFSET(%di), %bx
 		shl $16, %ebx
-		mov VESA_MODE_SCANLINE_OFFSET(%di), %bx
-		mov %eax, %edi
+		mov VESA_MODE_HEIGHT_OFFSET(%di), %bx
+		
+		mov VESA_MODE_BLUE_MASK_OFFSET(%di), %dl
+		shl $8, %edx
+		mov VESA_MODE_BLUE_POS_OFFSET(%di), %dl
+		mov %edx, %esi
+		
+		mov VESA_MODE_RED_MASK_OFFSET(%di), %dl
+		shl $8, %edx
+		mov VESA_MODE_RED_POS_OFFSET(%di), %dl
+		shl $8, %edx
+		mov VESA_MODE_GREEN_MASK_OFFSET(%di), %dl
+		shl $8, %edx
+		mov VESA_MODE_GREEN_POS_OFFSET(%di), %dl
+		
+		mov VESA_MODE_PHADDR_OFFSET(%di), %edi
 		
 		vesa_leave_real:
 		
-			mov %cr0, %eax
-			or $1, %eax
-			mov %eax, %cr0
+			mov %cr0, %ecx
+			or $1, %ecx
+			mov %ecx, %cr0
 			
 			jmp vesa_leave_real2
Index: kernel/arch/ia32/src/drivers/vesa.c
===================================================================
--- kernel/arch/ia32/src/drivers/vesa.c	(revision 7dfc120ad2ac14e97b041f8da4a10c117dfa4b1b)
+++ kernel/arch/ia32/src/drivers/vesa.c	(revision 1496f871c444d0770d9415a64dfff04b5a59352f)
@@ -57,4 +57,13 @@
 uint16_t vesa_scanline;
 
+uint8_t vesa_red_mask;
+uint8_t vesa_red_pos;
+
+uint8_t vesa_green_mask;
+uint8_t vesa_green_pos;
+
+uint8_t vesa_blue_mask;
+uint8_t vesa_blue_pos;
+
 int vesa_present(void)
 {
@@ -74,5 +83,10 @@
 		break;
 	case 16:
-		visual = VISUAL_RGB_5_6_5;
+		if ((vesa_red_mask == 5) && (vesa_red_pos == 10)
+		    && (vesa_green_mask == 5) && (vesa_green_pos == 5)
+		    && (vesa_blue_mask == 5) && (vesa_blue_pos == 0))
+			visual = VISUAL_RGB_5_5_5;
+		else
+			visual = VISUAL_RGB_5_6_5;
 		break;
 	case 24:
