Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 1496f87 in mainline


Ignore:
Timestamp:
2009-03-18T16:26:01Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master
Children:
eada065e
Parents:
7dfc120a
Message:

properly detect VESA 16 bpp modes with 5:5:5 colors

Location:
kernel/arch/ia32/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/boot/vesa_prot.inc

    r7dfc120a r1496f87  
    8383                # returned back to protected mode
    8484               
    85                 mov %esi, KA2PA(vesa_ph_addr)
    86                 mov %di, KA2PA(vesa_height)
    87                 shr $16, %edi
    88                 mov %di, KA2PA(vesa_width)
    89                 mov %bx, KA2PA(vesa_scanline)
     85                mov %ax, KA2PA(vesa_scanline)
     86                shr $16, %eax
     87                mov %ax, KA2PA(vesa_bpp)
     88               
     89                mov %bx, KA2PA(vesa_height)
    9090                shr $16, %ebx
    91                 mov %bx, KA2PA(vesa_bpp)
     91                mov %bx, KA2PA(vesa_width)
     92               
     93                mov %dl, KA2PA(vesa_green_pos)
     94                shr $8, %edx
     95                mov %dl, KA2PA(vesa_green_mask)
     96                shr $8, %edx
     97                mov %dl, KA2PA(vesa_red_pos)
     98                shr $8, %edx
     99                mov %dl, KA2PA(vesa_red_mask)
     100               
     101                mov %esi, %edx
     102                mov %dl, KA2PA(vesa_blue_pos)
     103                shr $8, %edx
     104                mov %dl, KA2PA(vesa_blue_mask)
     105               
     106                mov %edi, KA2PA(vesa_ph_addr)
    92107#endif
  • kernel/arch/ia32/src/boot/vesa_real.inc

    r7dfc120a r1496f87  
    55#define VESA_INFO_SIZE 1024
    66
    7 #define VESA_MODE_ATTRIBUTES_OFFSET 0
    8 #define VESA_MODE_LIST_PTR_OFFSET 14
    9 #define VESA_MODE_SCANLINE_OFFSET 16
    10 #define VESA_MODE_WIDTH_OFFSET 18
    11 #define VESA_MODE_HEIGHT_OFFSET 20
    12 #define VESA_MODE_BPP_OFFSET 25
    13 #define VESA_MODE_PHADDR_OFFSET 40
    14 
    15 #define VESA_END_OF_MODES 0xffff
    16 
    17 #define VESA_OK 0x4f
    18 
    19 #define VESA_GET_INFO 0x4f00
    20 #define VESA_GET_MODE_INFO 0x4f01
    21 #define VESA_SET_MODE 0x4f02
    22 #define VESA_SET_PALETTE 0x4f09
     7#define VESA_MODE_ATTRIBUTES_OFFSET  0
     8#define VESA_MODE_LIST_PTR_OFFSET    14
     9#define VESA_MODE_SCANLINE_OFFSET    16
     10#define VESA_MODE_WIDTH_OFFSET       18
     11#define VESA_MODE_HEIGHT_OFFSET      20
     12#define VESA_MODE_BPP_OFFSET         25
     13#define VESA_MODE_RED_MASK_OFFSET    31
     14#define VESA_MODE_RED_POS_OFFSET     32
     15#define VESA_MODE_GREEN_MASK_OFFSET  33
     16#define VESA_MODE_GREEN_POS_OFFSET   34
     17#define VESA_MODE_BLUE_MASK_OFFSET   35
     18#define VESA_MODE_BLUE_POS_OFFSET    36
     19#define VESA_MODE_PHADDR_OFFSET      40
     20
     21#define VESA_END_OF_MODES  0xffff
     22
     23#define VESA_OK  0x4f
     24
     25#define VESA_GET_INFO       0x4f00
     26#define VESA_GET_MODE_INFO  0x4f01
     27#define VESA_SET_MODE       0x4f02
     28#define VESA_SET_PALETTE    0x4f09
    2329
    2430.code32
     
    278284                vga_not_set:
    279285               
    280                 mov VESA_MODE_PHADDR_OFFSET(%di), %esi
    281                 mov VESA_MODE_WIDTH_OFFSET(%di), %ax
     286                # store mode parameters
     287                #  eax = bpp[8] scanline[16]
     288                #  ebx = width[16]  height[16]
     289                #  edx = red_mask[8] red_pos[8] green_mask[8] green_pos[8]
     290                #  esi = blue_mask[8] blue_pos[8]
     291                #  edi = linear frame buffer
     292               
     293                mov VESA_MODE_BPP_OFFSET(%di), %al
     294                xor %ah, %ah
    282295                shl $16, %eax
    283                 mov VESA_MODE_HEIGHT_OFFSET(%di), %ax
    284                 mov VESA_MODE_BPP_OFFSET(%di), %bl
    285                 xor %bh, %bh
     296                mov VESA_MODE_SCANLINE_OFFSET(%di), %ax
     297               
     298                mov VESA_MODE_WIDTH_OFFSET(%di), %bx
    286299                shl $16, %ebx
    287                 mov VESA_MODE_SCANLINE_OFFSET(%di), %bx
    288                 mov %eax, %edi
     300                mov VESA_MODE_HEIGHT_OFFSET(%di), %bx
     301               
     302                mov VESA_MODE_BLUE_MASK_OFFSET(%di), %dl
     303                shl $8, %edx
     304                mov VESA_MODE_BLUE_POS_OFFSET(%di), %dl
     305                mov %edx, %esi
     306               
     307                mov VESA_MODE_RED_MASK_OFFSET(%di), %dl
     308                shl $8, %edx
     309                mov VESA_MODE_RED_POS_OFFSET(%di), %dl
     310                shl $8, %edx
     311                mov VESA_MODE_GREEN_MASK_OFFSET(%di), %dl
     312                shl $8, %edx
     313                mov VESA_MODE_GREEN_POS_OFFSET(%di), %dl
     314               
     315                mov VESA_MODE_PHADDR_OFFSET(%di), %edi
    289316               
    290317                vesa_leave_real:
    291318               
    292                         mov %cr0, %eax
    293                         or $1, %eax
    294                         mov %eax, %cr0
     319                        mov %cr0, %ecx
     320                        or $1, %ecx
     321                        mov %ecx, %cr0
    295322                       
    296323                        jmp vesa_leave_real2
  • kernel/arch/ia32/src/drivers/vesa.c

    r7dfc120a r1496f87  
    5757uint16_t vesa_scanline;
    5858
     59uint8_t vesa_red_mask;
     60uint8_t vesa_red_pos;
     61
     62uint8_t vesa_green_mask;
     63uint8_t vesa_green_pos;
     64
     65uint8_t vesa_blue_mask;
     66uint8_t vesa_blue_pos;
     67
    5968int vesa_present(void)
    6069{
     
    7483                break;
    7584        case 16:
    76                 visual = VISUAL_RGB_5_6_5;
     85                if ((vesa_red_mask == 5) && (vesa_red_pos == 10)
     86                    && (vesa_green_mask == 5) && (vesa_green_pos == 5)
     87                    && (vesa_blue_mask == 5) && (vesa_blue_pos == 0))
     88                        visual = VISUAL_RGB_5_5_5;
     89                else
     90                        visual = VISUAL_RGB_5_6_5;
    7791                break;
    7892        case 24:
Note: See TracChangeset for help on using the changeset viewer.