3 #include <conio.h> /* this is where Open Watcom hides the outp() etc. functions */
13 #include <hw/dos/dos.h>
14 #include <hw/vesa/vesa.h>
16 void printf_video_modeinfo(uint16_t mode,struct vbe_mode_info *mi) {
17 printf("Mode 0x%04x:\n",mode);
18 printf(" Attributes: 0x%04x ",(unsigned int)mi->mode_attributes);
19 if (mi->mode_attributes & VESA_MODE_ATTR_HW_SUPPORTED)
21 if (mi->mode_attributes & VESA_MODE_ATTR_VBE_1X_MOREINFO)
23 if (mi->mode_attributes & VESA_MODE_ATTR_BIOS_TTY)
25 if (mi->mode_attributes & VESA_MODE_ATTR_COLOR_MODE)
27 if (mi->mode_attributes & VESA_MODE_ATTR_GRAPHICS_MODE)
29 if (mi->mode_attributes & VESA_MODE_ATTR_NOT_VGA_COMPATIBLE)
31 if (mi->mode_attributes & VESA_MODE_ATTR_NOT_VGA_COMPATIBLE_WINDOWING)
33 if (mi->mode_attributes & VESA_MODE_ATTR_LINEAR_FRAMEBUFFER_AVAILABLE)
35 if (mi->mode_attributes & VESA_MODE_ATTR_DOUBLESCAN_AVAILABLE)
37 if (mi->mode_attributes & VESA_MODE_ATTR_INTERLACED_AVAILABLE)
39 if (mi->mode_attributes & VESA_MODE_ATTR_HARDWARE_TRIPLE_BUFFER_SUPPORT)
41 if (mi->mode_attributes & VESA_MODE_ATTR_HARDWARE_STEREO_SUPPORT)
43 if (mi->mode_attributes & VESA_MODE_ATTR_DUAL_DISPLAY_START_SUPPORT)
44 printf("DualDisplay ");
46 printf(" Win A Attr=0x%02x seg=0x%04x Win B Attr=0x%02x seg=0x%04x\n",
47 mi->win_a_attributes,mi->win_a_segment,
48 mi->win_b_attributes,mi->win_b_segment);
49 printf(" Window granularity=%uKB size=%uKB function=%04x:%04x bytes/line=%u\n",
50 mi->win_granularity,mi->win_size,
51 (unsigned int)(mi->window_function>>16),
52 (unsigned int)(mi->window_function&0xFFFF),
53 mi->bytes_per_scan_line);
54 printf(" %u x %u (char %u x %u) %u-plane %ubpp. %u banks. Model %u.\n",
55 mi->x_resolution,mi->y_resolution,mi->x_char_size,mi->y_char_size,
56 mi->number_of_planes,mi->bits_per_pixel,mi->number_of_banks,mi->memory_model);
57 printf(" Model is '%s'. Bank size=%uKB. Image pages=%u\n",vbe_memory_model_to_str(mi->memory_model),
58 mi->bank_size,mi->number_of_image_pages);
59 printf(" RGBA (size,pos) R=(%u,%u) G=(%u,%u) B=(%u,%u) A=(%u,%u) DCModeInfo=0x%02X\n",
60 mi->red_mask_size, mi->red_field_position,
61 mi->green_mask_size, mi->green_field_position,
62 mi->blue_mask_size, mi->blue_field_position,
63 mi->reserved_mask_size, mi->reserved_field_position,
64 mi->direct_color_mode_info);
65 printf(" Physical addr: 0x%08lX Linbytes/scan=%u BankPages=%u LinPages=%u\n",(unsigned long)mi->phys_base_ptr,
66 mi->lin_bytes_per_line, mi->bank_number_of_image_pages+1,
67 mi->lin_number_of_image_pages);
68 printf(" Lin RGBA (size,pos) R=(%u,%u) G=(%u,%u) B=(%u,%u) A=(%u,%u) maxpixelclock=%lu\n",
69 mi->lin_red_mask_size, mi->lin_red_field_position,
70 mi->lin_green_mask_size, mi->lin_green_field_position,
71 mi->lin_blue_mask_size, mi->lin_blue_field_position,
72 mi->lin_reserved_mask_size, mi->lin_reserved_field_position,
82 printf("VESA VGA test program\n");
84 printf("VESA BIOS not found\n");
88 printf("VBE INFO:\n");
90 *((uint32_t*)tmp) = vbe_info->signature; tmp[4] = 0;
91 printf(" Signature: '%s'\n",tmp);
93 printf(" Version: %u.%u\n",vbe_info->version >> 8,vbe_info->version & 0xFF);
95 printf(" Capabilities: 0x%08lx\n",(unsigned long)(vbe_info->capabilities));
96 if (vbe_info->capabilities & VBE_CAP_8BIT_DAC)
97 printf(" 8-bit capable DAC\n");
98 if (vbe_info->capabilities & VBE_CAP_NOT_VGA_COMPATIBLE)
99 printf(" Not VGA compatible\n");
100 if (vbe_info->capabilities & VBE_CAP_LARGE_XFER_BLANKING)
101 printf(" Should blank the display during large transfers\n");
103 printf(" Total memory: %luKB\n",(unsigned long)vbe_info->total_memory_64kb * 64UL);
104 printf(" OEM software version: %u.%u\n",vbe_info->oem_software_rev >> 8,vbe_info->oem_software_rev & 0xFF);
106 vbe_copystring(tmp,sizeof(tmp),vbe_info->oem_string_ptr,vbe_info);
107 printf(" OEM string: %08lx '%s'\n",(unsigned long)(vbe_info->oem_string_ptr),tmp);
109 vbe_copystring(tmp,sizeof(tmp),vbe_info->oem_vendor_name_ptr,vbe_info);
110 printf(" OEM vendor: %08lx '%s'\n",(unsigned long)(vbe_info->oem_vendor_name_ptr),tmp);
112 vbe_copystring(tmp,sizeof(tmp),vbe_info->oem_product_name_ptr,vbe_info);
113 printf(" OEM product: %08lx '%s'\n",(unsigned long)(vbe_info->oem_product_name_ptr),tmp);
115 vbe_copystring(tmp,sizeof(tmp),vbe_info->oem_product_rev_ptr,vbe_info);
116 printf(" OEM product revision: %08lx '%s'\n",(unsigned long)(vbe_info->oem_product_rev_ptr),tmp);
118 printf(" Video modes: @%08lx\n",(unsigned long)(vbe_info->video_mode_ptr));
119 if (vbe_info->video_mode_ptr != 0UL) {
120 for (entry=0;entry < 128;entry++) {
121 mode = vbe_read_mode_entry(vbe_info->video_mode_ptr,entry);
122 if (mode == 0xFFFF) break;
123 printf("0x%04x ",mode);
124 if ((entry%10) == 9) printf("\n");
129 if (isatty(1) && isatty(0)) {
130 while (getch() != 13);
133 if (vbe_info->video_mode_ptr != 0UL) {
134 for (entry=0;entry < 128;entry++) {
135 struct vbe_mode_info mi={0};
136 mode = vbe_read_mode_entry(vbe_info->video_mode_ptr,entry);
137 if (mode == 0xFFFF) break;
139 if (vbe_read_mode_info(mode,&mi))
140 printf_video_modeinfo(mode,&mi);
142 printf("Cannot get info on mode 0x%04x\n",mode);
144 if (isatty(1) && isatty(0)) {
145 while ((c=getch()) != 13) {
146 if (c == 27) return 1;
152 /* and the VBE 2.x mode 0x81FF? */
154 struct vbe_mode_info mi={0};
157 if (vbe_read_mode_info(mode,&mi))
158 printf_video_modeinfo(mode,&mi);