8 #define CRTC_INDEX 0x3d4
9 #define CRTC_DATA 0x3d5
14 /* this comes from Allegro */
15 typedef struct vesa_mode_info
17 unsigned short ModeAttributes;
18 unsigned char WinAAttributes;
19 unsigned char WinBAttributes;
20 unsigned short WinGranularity;
21 unsigned short WinSize;
22 unsigned short WinASegment;
23 unsigned short WinBSegment;
24 unsigned long WinFuncPtr;
25 unsigned short BytesPerScanLine;
26 unsigned short XResolution;
27 unsigned short YResolution;
28 unsigned char XCharSize;
29 unsigned char YCharSize;
30 unsigned char NumberOfPlanes;
31 unsigned char BitsPerPixel;
32 unsigned char NumberOfBanks;
33 unsigned char MemoryModel;
34 unsigned char BankSize;
35 unsigned char NumberOfImagePages;
36 unsigned char Reserved_page;
37 unsigned char RedMaskSize;
38 unsigned char RedMaskPos;
39 unsigned char GreenMaskSize;
40 unsigned char GreenMaskPos;
41 unsigned char BlueMaskSize;
42 unsigned char BlueMaskPos;
43 unsigned char ReservedMaskSize;
44 unsigned char ReservedMaskPos;
45 unsigned char DirectColorModeInfo;
46 unsigned long PhysBasePtr;
47 unsigned long OffScreenMemOffset;
48 unsigned short OffScreenMemSize;
49 unsigned char Reserved[206];
50 } __attribute__ ((packed)) vesa_mode_info;
53 int gr_vesa_checkmode(int mode) {
56 vesa_mode_info *mode_info;
58 if (!(mode_info = dpmi_get_temp_low_buffer( 1024 )))
62 rregs.edi = DPMI_real_offset(mode_info);
63 rregs.es = DPMI_real_segment(mode_info);
64 dpmi_real_int386x( 0x10, &rregs );
65 if (rregs.eax != 0x4f)
66 return 5; /* no vesa */
67 if (!(mode_info->ModeAttributes & 1))
68 return 4; /* unsupported mode */
71 i = mode_info->WinGranularity;
77 return 2; /* incompatible window granularity */
81 int gr_vesa_setmode(int mode) {
84 if ((ret = gr_vesa_checkmode(mode)))
86 asm volatile("int $0x10" : "=a" (ret) : "a" (0x4f02), "b" (mode));
87 return (ret == 0x4f) ? 0 : 4;
90 inline void gr_vesa_setpage(int bank) {
92 asm volatile("int $0x10"
93 : : "a" (0x4f05), "b" (0), "d" ((lastbank = bank) << bankshift)
97 void gr_vesa_incpage() {
98 gr_vesa_setpage(lastbank + 1);
101 void gr_vesa_setstart(int col, int row) {
102 asm volatile("int $0x10"
103 : : "a" (0x4f07), "b" (0), "c" (col), "d" (row) : "%eax");
106 int gr_vesa_setlogical(int line_width) {
108 asm volatile("int $0x10"
109 : "=c" (ret) : "a" (0x4f07), "b" (0), "c" (line_width) : "%eax");
113 void gr_vesa_scanline(int x1, int x2, int y, unsigned char color) {
114 int addr = (y * gr_var_bwidth) + x1;
115 int left = x2 - x1 + 1;
116 gr_vesa_setpage(addr >> 16);
119 if (left > (65536 - addr)) {
120 left -= (65536 - addr);
121 memset(gr_video_memory + addr, color, 65536 - addr);
125 memset(gr_video_memory + addr, color, left);
131 void gr_vesa_pixel(unsigned char color, unsigned int addr) {
132 gr_vesa_setpage(addr >> 16);
133 gr_video_memory[addr & 0xffff] = color;