]> 4ch.mooo.com Git - 16.git/blob - src/lib/doslib/hw/vesa/test.c
added a bunch of things~ and midi stuff~
[16.git] / src / lib / doslib / hw / vesa / test.c
1
2 #include <stdio.h>
3 #include <conio.h> /* this is where Open Watcom hides the outp() etc. functions */
4 #include <stddef.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <assert.h>
9 #include <fcntl.h>
10 #include <math.h>
11 #include <dos.h>
12
13 #include <hw/dos/dos.h>
14 #include <hw/vesa/vesa.h>
15
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)
20                 printf("H/W-SUPP ");
21         if (mi->mode_attributes & VESA_MODE_ATTR_VBE_1X_MOREINFO)
22                 printf("VBE1.Xext ");
23         if (mi->mode_attributes & VESA_MODE_ATTR_BIOS_TTY)
24                 printf("TTY ");
25         if (mi->mode_attributes & VESA_MODE_ATTR_COLOR_MODE)
26                 printf("Color ");
27         if (mi->mode_attributes & VESA_MODE_ATTR_GRAPHICS_MODE)
28                 printf("Graphics ");
29         if (mi->mode_attributes & VESA_MODE_ATTR_NOT_VGA_COMPATIBLE)
30                 printf("!VGA ");
31         if (mi->mode_attributes & VESA_MODE_ATTR_NOT_VGA_COMPATIBLE_WINDOWING)
32                 printf("!Window ");
33         if (mi->mode_attributes & VESA_MODE_ATTR_LINEAR_FRAMEBUFFER_AVAILABLE)
34                 printf("LinFB ");
35         if (mi->mode_attributes & VESA_MODE_ATTR_DOUBLESCAN_AVAILABLE)
36                 printf("Dblscan ");
37         if (mi->mode_attributes & VESA_MODE_ATTR_INTERLACED_AVAILABLE)
38                 printf("Intlace ");
39         if (mi->mode_attributes & VESA_MODE_ATTR_HARDWARE_TRIPLE_BUFFER_SUPPORT)
40                 printf("TripleBuf ");
41         if (mi->mode_attributes & VESA_MODE_ATTR_HARDWARE_STEREO_SUPPORT)
42                 printf("Stereo ");
43         if (mi->mode_attributes & VESA_MODE_ATTR_DUAL_DISPLAY_START_SUPPORT)
44                 printf("DualDisplay ");
45         printf("\n");
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,
73                         mi->max_pixel_clock);
74 }
75
76 int main() {
77         unsigned int entry;
78         uint16_t mode;
79         char tmp[128];
80         int c;
81
82         printf("VESA VGA test program\n");
83         if (!vbe_probe()) {
84                 printf("VESA BIOS not found\n");
85                 return 1;
86         }
87
88         printf("VBE INFO:\n");
89
90         *((uint32_t*)tmp) = vbe_info->signature; tmp[4] = 0;
91         printf("     Signature:              '%s'\n",tmp);
92
93         printf("     Version:                %u.%u\n",vbe_info->version >> 8,vbe_info->version & 0xFF);
94
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");
102
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);
105
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);
108
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);
111
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);
114
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);
117
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");
125                 }
126                 printf("\n");
127         }
128
129         if (isatty(1) && isatty(0)) {
130                 while (getch() != 13);
131         }
132
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;
138
139                         if (vbe_read_mode_info(mode,&mi))
140                                 printf_video_modeinfo(mode,&mi);
141                         else
142                                 printf("Cannot get info on mode 0x%04x\n",mode);
143
144                         if (isatty(1) && isatty(0)) {
145                                 while ((c=getch()) != 13) {
146                                         if (c == 27) return 1;
147                                 }
148                         }
149                 }
150         }
151
152         /* and the VBE 2.x mode 0x81FF? */
153         {
154                 struct vbe_mode_info mi={0};
155
156                 mode = 0x81FF;
157                 if (vbe_read_mode_info(mode,&mi))
158                         printf_video_modeinfo(mode,&mi);
159         }
160
161         return 0;
162 }
163