1,6 → 1,3 |
/* |
*/ |
|
#include <stdlib.h> |
#include <stdio.h> /* for printf */ |
#include <string.h> /* for memset */ |
28,10 → 25,12 |
|
static int vesa_memory,vesa_chiptype; |
static int vesa_is_linear, vesa_logical_width, vesa_bpp, vesa_granularity; |
static int vesa_regs_size, vesa_linear_base, vesa_last_mode_set; |
//static int vesa_regs_size; |
static int vesa_linear_base, vesa_last_mode_set; |
static struct LRMI_regs vesa_r; |
static int vesa_read_write, vesa_read_window, vesa_write_window; |
static void * LRMI_mem1, * LRMI_mem2; |
//static void * LRMI_mem1; |
static void * LRMI_mem2; |
|
static CardSpecs *cardspecs; |
static struct |
44,6 → 43,7 |
|
static void vesa_setpage(int page) |
{ |
|
vesa_r.eax=0x4f05; |
vesa_r.ebx=0; |
vesa_r.edx=page*64/vesa_granularity; |
55,21 → 55,19 |
vesa_r.edx=page*64/vesa_granularity; |
__svgalib_LRMI_int(0x10,&vesa_r); |
}; |
|
} |
|
|
static int __svgalib_vesa_inlinearmode(void) |
{ |
return vesa_is_linear; |
} |
|
|
/* Fill in chipset specific mode information */ |
|
static void vesa_getmodeinfo(int mode, vga_modeinfo *modeinfo) |
{ |
if (IS_IN_STANDARD_VGA_DRIVER(mode)) |
return __svgalib_vga_driverspecs.getmodeinfo(mode, modeinfo); |
if (IS_IN_STANDARD_VGA_DRIVER(mode)) return __svgalib_vga_driverspecs.getmodeinfo(mode, modeinfo); |
|
if(modeinfo->colors==16)return; |
|
94,6 → 92,7 |
vesa_r.eax = 0x4f01; |
vesa_r.ecx = SVGALIB_VESA[mode]; |
vesa_r.es = (unsigned int)vesa_data.mode >> 4; |
vesa_r.ds = (unsigned int)vesa_data.mode >> 4; |
vesa_r.edi = (unsigned int)vesa_data.mode & 0xf; |
|
if (!__svgalib_LRMI_int(0x10, &vesa_r)) { |
101,6 → 100,7 |
return; |
} |
modeinfo->linewidth = vesa_data.mode->bytes_per_scanline; |
|
} |
|
/* Read and save chipset-specific registers */ |
111,11 → 111,12 |
vesa_r.eax=0x4f04; |
vesa_r.ebx=0; |
vesa_r.es=((long)buf)>>4; |
vesa_r.ds=((long)buf)>>4; |
vesa_r.edx=1; |
vesa_r.ecx=__svgalib_VESA_savebitmap; |
__svgalib_LRMI_int(0x10,&vesa_r); |
memcpy(®s[VGA_TOTAL_REGS],buf,vesa_regs_size); |
return vesa_regs_size;*/ |
memcpy(®s[VGA_TOTAL_REGS],buf,vesa_regs_size); */ |
return 0; |
} |
|
/* Set chipset-specific registers */ |
129,6 → 130,7 |
vesa_r.eax=0x4f04; |
vesa_r.ebx=0; |
vesa_r.es=((long)buf)>>4; |
vesa_r.ds=((long)buf)>>4; |
vesa_r.edx=2; |
vesa_r.ecx=__svgalib_VESA_savebitmap; |
__svgalib_LRMI_int(0x10,&vesa_r);*/ |
168,26 → 170,14 |
{ |
vesa_bpp=1; |
vesa_granularity=1; |
if (IS_IN_STANDARD_VGA_DRIVER(mode)) { |
vesa_is_linear=1; |
|
if(__svgalib_vesatext){ |
vesa_r.eax=0x4f02; /* make sure we are in a regular VGA mode before we start */ |
vesa_r.ebx=__svgalib_VESA_textmode; /* without this, if we start in SVGA mode the result might */ |
__svgalib_LRMI_int(0x10,&vesa_r); /* be something weird */ |
}; |
return __svgalib_vga_driverspecs.setmode(mode, prv_mode); |
} |
if (!vesa_modeavailable(mode)) return 1; |
vesa_r.eax=0x4f02; |
vesa_r.ebx=SVGALIB_VESA[mode]|0x8000|(vesa_is_linear*0x4000); |
vesa_last_mode_set=vesa_r.ebx; |
__svgalib_LRMI_int(0x10,&vesa_r); |
|
vesa_data.info = LRMI_mem2 ; |
vesa_data.mode = (struct vbe_mode_info_block *)(vesa_data.info + 1); |
vesa_r.eax = 0x4f01; |
vesa_r.ecx=SVGALIB_VESA[mode]; |
vesa_r.es = (unsigned int)vesa_data.mode >> 4; |
vesa_r.ds = (unsigned int)vesa_data.mode >> 4; |
vesa_r.edi = (unsigned int)vesa_data.mode&0xf; |
__svgalib_LRMI_int(0x10, &vesa_r); |
vesa_logical_width=vesa_data.mode->bytes_per_scanline; |
205,7 → 195,17 |
if ((vesa_data.mode->win_b_attributes&2) == 2) vesa_read_window=1; |
if ((vesa_data.mode->win_b_attributes&4) == 4) vesa_write_window=1; |
} |
|
if (!vesa_modeavailable(mode)) { |
return 1; |
} |
vesa_r.eax=0x4f02; |
vesa_r.ebx=SVGALIB_VESA[mode]|0x8000|(vesa_is_linear*0x4000); |
vesa_last_mode_set=vesa_r.ebx; |
__svgalib_LRMI_int(0x10,&vesa_r); |
|
return 0; |
|
} |
|
|
235,6 → 235,7 |
vesa_data.mode = (struct vbe_mode_info_block *)(vesa_data.info + 1); |
vesa_r.eax = 0x4f00; |
vesa_r.es = (unsigned int)vesa_data.info >> 4; |
vesa_r.ds = (unsigned int)vesa_data.info >> 4; |
vesa_r.edi = 0; |
|
__svgalib_LRMI_free_real(LRMI_mem2,sizeof(void *)); |
290,6 → 291,7 |
static int vesa_linear(int op, int param) |
{ |
if (op==LINEAR_ENABLE) { |
if(vesa_is_linear == 1) return vesa_linear_base; |
vesa_r.eax=0x4f02; |
vesa_r.ebx=vesa_last_mode_set|0x4000; |
__svgalib_LRMI_int(0x10,&vesa_r); |
368,6 → 370,7 |
return 1; |
}; |
#endif |
|
__svgalib_textprog|=1; |
|
/* Get I/O priviledge */ |
387,6 → 390,7 |
vesa_data.mode = (struct vbe_mode_info_block *)(vesa_data.info + 1); |
vesa_r.eax = 0x4f00; |
vesa_r.es = (unsigned int)vesa_data.info >> 4; |
vesa_r.ds = (unsigned int)vesa_data.info >> 4; |
vesa_r.edi = 0; |
|
memcpy(vesa_data.info->vbe_signature, "VBE2", 4); |
412,6 → 416,7 |
vesa_r.eax = 0x4f01; |
vesa_r.ecx = *mode_list; |
vesa_r.es = (unsigned int)vesa_data.mode >> 4; |
vesa_r.ds = (unsigned int)vesa_data.mode >> 4; |
vesa_r.edi = (unsigned int)vesa_data.mode & 0xf; |
|
if((vesa_chiptype>=1)&&(vesa_data.mode->mode_attributes&0x80)) |