19 #define SC_INDEX 0x3c4
20 #define CRTC_INDEX 0x3d4
21 #define CRTC_DATA 0x3d5
26 /* this comes from Allegro */
27 typedef struct vesa_mode_info
29 unsigned short ModeAttributes;
30 unsigned char WinAAttributes;
31 unsigned char WinBAttributes;
32 unsigned short WinGranularity;
33 unsigned short WinSize;
34 unsigned short WinASegment;
35 unsigned short WinBSegment;
36 unsigned long WinFuncPtr;
37 unsigned short BytesPerScanLine;
38 unsigned short XResolution;
39 unsigned short YResolution;
40 unsigned char XCharSize;
41 unsigned char YCharSize;
42 unsigned char NumberOfPlanes;
43 unsigned char BitsPerPixel;
44 unsigned char NumberOfBanks;
45 unsigned char MemoryModel;
46 unsigned char BankSize;
47 unsigned char NumberOfImagePages;
48 unsigned char Reserved_page;
49 unsigned char RedMaskSize;
50 unsigned char RedMaskPos;
51 unsigned char GreenMaskSize;
52 unsigned char GreenMaskPos;
53 unsigned char BlueMaskSize;
54 unsigned char BlueMaskPos;
55 unsigned char ReservedMaskSize;
56 unsigned char ReservedMaskPos;
57 unsigned char DirectColorModeInfo;
58 unsigned long PhysBasePtr;
59 unsigned long OffScreenMemOffset;
60 unsigned short OffScreenMemSize;
61 unsigned char Reserved[206];
62 } __attribute__ ((packed)) vesa_mode_info;
65 int gr_vesa_checkmode(int mode) {
68 vesa_mode_info *mode_info;
70 if (!(mode_info = dpmi_get_temp_low_buffer( 1024 )))
74 rregs.edi = DPMI_real_offset(mode_info);
75 rregs.es = DPMI_real_segment(mode_info);
76 dpmi_real_int386x( 0x10, &rregs );
77 if (rregs.eax != 0x4f)
78 return 5; /* no vesa */
79 if (!(mode_info->ModeAttributes & 1))
80 return 4; /* unsupported mode */
83 i = mode_info->WinGranularity;
89 return 2; /* incompatible window granularity */
93 int gr_vesa_setmode(int mode) {
96 if ((ret = gr_vesa_checkmode(mode)))
98 asm volatile("int $0x10" : "=a" (ret) : "a" (0x4f02), "b" (mode));
99 return (ret == 0x4f) ? 0 : 4;
102 inline void gr_vesa_setpage(int bank)
106 if (bank != lastbank)
107 asm volatile("int $0x10"
109 : "0" (0x4f05), "b" (0), "d" ((lastbank = bank) << bankshift));
112 void gr_vesa_incpage() {
113 gr_vesa_setpage(lastbank + 1);
116 void gr_vesa_setstart(int col, int row)
120 asm volatile("int $0x10"
121 : "=a" (dummy) : "0" (0x4f07), "b" (0), "c" (col), "d" (row));
124 int gr_vesa_setlogical(int line_width)
129 asm volatile("int $0x10"
130 : "=c" (ret), "=a" (dummy) : "1" (0x4f07), "b" (0), "c" (line_width));
134 void gr_vesa_scanline(int x1, int x2, int y, unsigned char color) {
135 int addr = (y * gr_var_bwidth) + x1;
136 int left = x2 - x1 + 1;
137 gr_vesa_setpage(addr >> 16);
140 if (left > (65536 - addr)) {
141 left -= (65536 - addr);
142 memset(gr_video_memory + addr, color, 65536 - addr);
146 memset(gr_video_memory + addr, color, left);
152 void gr_vesa_pixel(unsigned char color, unsigned int addr) {
153 gr_vesa_setpage(addr >> 16);
154 gr_video_memory[addr & 0xffff] = color;